+2005-11-16 Luca Ognibene <luogni@tin.it>
+
+ * 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 <wingo@pobox.com>
* configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better
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++) {
"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 */
}