summaryrefslogtreecommitdiffstats
path: root/video/decode/vd_lavc.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-03-16 01:34:48 +0100
committerwm4 <wm4@nowhere>2014-03-16 01:38:13 +0100
commitba160f5c8455d984ae51664c1df007e5e6333b5b (patch)
tree768e810eb93b7cce8a2799f0b14094ea34eb4345 /video/decode/vd_lavc.c
parent86689f7bf23dd05b5e6b9e42e43379d52e27c338 (diff)
downloadmpv-ba160f5c8455d984ae51664c1df007e5e6333b5b.tar.bz2
mpv-ba160f5c8455d984ae51664c1df007e5e6333b5b.tar.xz
vd_lavc: ridiculous workaround for Libav 9 compatibility
This "sometimes" crashed when seeking. The fault apparently lies in libavcodec: the decoder returns an unreferenced frame! This is completely insane, but somehow I'm apparently still expected to work this around. As a reaction, I will drop Libav 9 support in the next commit. (While this commit will go into release/0.3.)
Diffstat (limited to 'video/decode/vd_lavc.c')
-rw-r--r--video/decode/vd_lavc.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index eed79e81b1..454251f4ad 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -688,7 +688,16 @@ static struct mp_image *image_from_decoder(struct dec_video *vd)
mp_image_copy_attributes(mpi, &new);
} else if (ctx->do_dr1 && pic->opaque) {
struct FrameBuffer *fb = pic->opaque;
- mp_buffer_ref(fb); // initial reference for mpi
+ // initial reference for mpi
+ if (!new.planes[0] || !mp_buffer_check(fb)) {
+ // Decoder returned an unreferenced buffer! Taking this would just
+ // lead to an eventual double-free. Nothing we can do about this.
+ // So just say "fuck you" in a nice way.
+ MP_FATAL(vd,
+ "Impossible condition detected! This version of Libav/FFmpeg is not\n"
+ "supported anymore. Please update.\n");
+ return NULL;
+ }
mpi = mp_image_new_external_ref(&new, fb, fb_ref, fb_unref,
fb_is_unique, NULL);
} else {
@@ -734,6 +743,8 @@ static int decode(struct dec_video *vd, struct demux_packet *packet,
// Note: potentially resets ctx->pic as it is transferred to mpi
struct mp_image *mpi = image_from_decoder(vd);
+ if (!mpi)
+ return 0;
assert(mpi->planes[0]);
mp_image_set_params(mpi, &params);