diff --git a/ChangeLog b/ChangeLog index 0ceec947f2..e993c6f4a6 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 657b549dfb..ea1409191c 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 65b85e988b..b36ff4827c 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 */ }