ext/ffmpeg/gstffmpegdec.c: Implement keyframe syncing.

Original commit message from CVS:
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_init),
(gst_ffmpegdec_open), (gst_ffmpegdec_frame),
(gst_ffmpegdec_handle_event):
Implement keyframe syncing.
This commit is contained in:
Ronald S. Bultje 2005-04-01 10:09:15 +00:00
parent c74a433d1d
commit e65e6b8042
2 changed files with 16 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2005-04-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_init),
(gst_ffmpegdec_open), (gst_ffmpegdec_frame),
(gst_ffmpegdec_handle_event):
Implement keyframe syncing.
2005-03-14 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* ext/ffmpeg/gstffmpeg.c: (plugin_init):

View file

@ -57,6 +57,7 @@ struct _GstFFMpegDec
gint channels, samplerate;
} audio;
} format;
gboolean waiting_for_key;
guint64 next_ts;
/* parsing */
@ -273,6 +274,7 @@ gst_ffmpegdec_init (GstFFMpegDec * ffmpegdec)
ffmpegdec->pcache = NULL;
ffmpegdec->par = NULL;
ffmpegdec->opened = FALSE;
ffmpegdec->waiting_for_key = FALSE;
ffmpegdec->hurry_up = ffmpegdec->lowres = 0;
GST_FLAG_SET (ffmpegdec, GST_ELEMENT_EVENT_AWARE);
@ -413,6 +415,7 @@ gst_ffmpegdec_open (GstFFMpegDec *ffmpegdec)
default:
break;
}
ffmpegdec->waiting_for_key = TRUE;
ffmpegdec->next_ts = 0;
return TRUE;
@ -631,7 +634,10 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
GST_DEBUG_OBJECT (ffmpegdec,
"Decode video: len=%d, have_data=%d", len, have_data);
if (len >= 0 && have_data > 0) {
if (ffmpegdec->waiting_for_key &&
ffmpegdec->picture->pict_type != FF_I_TYPE) {
have_data = 0;
} else if (len >= 0 && have_data > 0) {
/* libavcodec constantly crashes on stupid buffer allocation
* errors inside. This drives me crazy, so we let it allocate
* it's own buffers and copy to our own buffer afterwards... */
@ -639,6 +645,7 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
gint fsize = gst_ffmpeg_avpicture_get_size (ffmpegdec->context->pix_fmt,
ffmpegdec->context->width, ffmpegdec->context->height);
ffmpegdec->waiting_for_key = FALSE;
outbuf = gst_buffer_new_and_alloc (fsize);
/* original ffmpeg code does not handle odd sizes correctly.
@ -812,6 +819,7 @@ gst_ffmpegdec_handle_event (GstFFMpegDec * ffmpegdec, GstEvent * event)
}
if (ffmpegdec->opened) {
avcodec_flush_buffers (ffmpegdec->context);
ffmpegdec->waiting_for_key = TRUE;
}
/* fall-through */
}