From e6ada248279a138c329585a3825699d0a3aea4b9 Mon Sep 17 00:00:00 2001 From: Luca Ognibene Date: Wed, 16 Nov 2005 21:48:06 +0000 Subject: [PATCH] ext/ffmpeg/gstffmpegdec.c: Fix some segfaults while seeking. When i have unreffed the buffer in _release_buffer i sho... Original commit message from CVS: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_release_buffer), (gst_ffmpegdec_frame): Fix some segfaults while seeking. When i have unreffed the buffer in _release_buffer i should also set picture->opaque to NULL otherwise sometimes it can be unreffed another time in _frame causing an invalid read/write. --- ChangeLog | 9 +++++++++ common | 2 +- ext/ffmpeg/gstffmpegdec.c | 19 +++++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0ceec94..e993c6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2005-11-16 Luca Ognibene + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_release_buffer), + (gst_ffmpegdec_frame): + Fix some segfaults while seeking. When i have unreffed + the buffer in _release_buffer i should also set picture->opaque to + NULL otherwise sometimes it can be unreffed another time in + _frame causing an invalid read/write. + 2005-11-14 Andy Wingo * configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better diff --git a/common b/common index 657b549..ea14091 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 657b549dfb640a76f3d7ab7676e453c801a83dca +Subproject commit ea1409191cc1e71273b2dbdd94e7ab5fc5a60a51 diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index 65b85e9..b36ff48 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -603,16 +603,19 @@ static void gst_ffmpegdec_release_buffer (AVCodecContext * context, AVFrame * picture) { gint i; - GstBuffer *buf = GST_BUFFER (picture->opaque); + GstBuffer *buf; GstFFMpegDec *ffmpegdec = (GstFFMpegDec *) context->opaque; - - + g_return_if_fail (buf != NULL); g_return_if_fail (picture->type == FF_BUFFER_TYPE_USER); + buf = GST_BUFFER (picture->opaque); + if (buf == ffmpegdec->last_buffer) ffmpegdec->last_buffer = NULL; gst_buffer_unref (buf); + + picture->opaque = NULL; /* zero out the reference in ffmpeg */ for (i = 0; i < 4; i++) { @@ -769,9 +772,13 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec, "Dropping frame for synctime %" GST_TIME_FORMAT ", expected(next_ts) %" GST_TIME_FORMAT, GST_TIME_ARGS (ffmpegdec->synctime), - GST_TIME_ARGS (ffmpegdec->next_ts)); - if (ffmpegdec->last_buffer) - gst_buffer_unref (ffmpegdec->last_buffer); + GST_TIME_ARGS (ffmpegdec->next_ts)); + + if (ffmpegdec->picture->opaque != NULL) { + outbuf = (GstBuffer *) ffmpegdec->picture->opaque; + gst_buffer_unref (outbuf); + } + have_data = 0; /* don´t break here! Timestamps are updated below */ } -- 2.7.4