mirror of
https://github.com/mpv-player/mpv
synced 2025-01-18 04:51:52 +00:00
av_log: add tons of warnings against mismatched ffmpeg/libav libraries
Print a warning if a library has mismatched compile time and link time versions. Refuse to work if the compile time and link time versions are a mix of ffmpeg and libav. We print an error message and call exit(). Since we'd randomly crash anyway, I think this is ok. This doesn't catch the case if you e.g. use a ffmpeg libavcodec and a libav libavformat, which would of course just crash as quickly, but I think this checks enough already.
This commit is contained in:
parent
476a4a378a
commit
2868fbea3f
@ -208,14 +208,36 @@ void print_libav_versions(struct mp_log *log, int v)
|
|||||||
|
|
||||||
mp_msg(log, v, "%s library versions:\n", LIB_PREFIX);
|
mp_msg(log, v, "%s library versions:\n", LIB_PREFIX);
|
||||||
|
|
||||||
|
bool mismatch = false;
|
||||||
|
bool broken = false;
|
||||||
for (int n = 0; n < MP_ARRAY_SIZE(libs); n++) {
|
for (int n = 0; n < MP_ARRAY_SIZE(libs); n++) {
|
||||||
const struct lib *l = &libs[n];
|
const struct lib *l = &libs[n];
|
||||||
mp_msg(log, v, " %-15s %d.%d.%d", l->name, V(l->buildv));
|
mp_msg(log, v, " %-15s %d.%d.%d", l->name, V(l->buildv));
|
||||||
if (l->buildv != l->runv) {
|
if (l->buildv != l->runv) {
|
||||||
mp_msg(log, v, " (runtime %d.%d.%d)", V(l->runv));
|
mp_msg(log, v, " (runtime %d.%d.%d)", V(l->runv));
|
||||||
|
mismatch = true;
|
||||||
|
broken |= ((l->buildv & 255) >= 100) != ((l->runv & 255) >= 100);
|
||||||
}
|
}
|
||||||
mp_msg(log, v, "\n");
|
mp_msg(log, v, "\n");
|
||||||
}
|
}
|
||||||
|
// This just won't work. It's 100% broken.
|
||||||
|
if (broken) {
|
||||||
|
mp_fatal(log, "mpv was compiled and linked against a mixture of Libav "
|
||||||
|
"and FFmpeg versions. This won't work and will most likely "
|
||||||
|
"crash at some point. Exiting.\n");
|
||||||
|
exit(42);
|
||||||
|
}
|
||||||
|
// We don't "really" support mismatched libraries, but if you like to
|
||||||
|
// suffer, you're free to enjoy the terrible aspects of dynamic linking.
|
||||||
|
// In particular, we don't use all these crazy accessors ffmpeg wants us
|
||||||
|
// to use in order to be ABI compatible after Libav merges - because that
|
||||||
|
// would make our code incompatible to Libav. It's madness.
|
||||||
|
if (mismatch) {
|
||||||
|
mp_warn(log, "Warning: mpv was compiled against a different version of "
|
||||||
|
"%s than the shared\nlibrary it is linked against. This can "
|
||||||
|
"expose subtle ABI compatibility issues\nand can lead to "
|
||||||
|
"misbehavior and crashes.\n", LIB_PREFIX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef V
|
#undef V
|
||||||
|
Loading…
Reference in New Issue
Block a user