Small improvements

Original commit message from CVS:
Small improvements
This commit is contained in:
Wim Taymans 2002-12-27 04:04:04 +00:00
parent f5b06f0e6a
commit 769ab2d316
2 changed files with 42 additions and 10 deletions

View File

@ -204,6 +204,7 @@ gst_mpeg2dec_init (GstMpeg2dec *mpeg2dec)
/* initialize the mpeg2dec acceleration */ /* initialize the mpeg2dec acceleration */
mpeg2_accel (MPEG2_ACCEL_DETECT); mpeg2_accel (MPEG2_ACCEL_DETECT);
mpeg2dec->closed = TRUE; mpeg2dec->closed = TRUE;
mpeg2dec->have_fbuf = FALSE;
GST_FLAG_SET (GST_ELEMENT (mpeg2dec), GST_ELEMENT_EVENT_AWARE); GST_FLAG_SET (GST_ELEMENT (mpeg2dec), GST_ELEMENT_EVENT_AWARE);
} }
@ -224,6 +225,7 @@ gst_mpeg2dec_open_decoder (GstMpeg2dec *mpeg2dec)
gst_mpeg2dec_close_decoder (mpeg2dec); gst_mpeg2dec_close_decoder (mpeg2dec);
mpeg2dec->decoder = mpeg2_init (); mpeg2dec->decoder = mpeg2_init ();
mpeg2dec->closed = FALSE; mpeg2dec->closed = FALSE;
mpeg2dec->have_fbuf = FALSE;
} }
static void static void
@ -384,6 +386,26 @@ update_streaminfo (GstMpeg2dec *mpeg2dec)
g_object_notify (G_OBJECT (mpeg2dec), "streaminfo"); g_object_notify (G_OBJECT (mpeg2dec), "streaminfo");
} }
static void
gst_mpeg2dec_flush_decoder (GstMpeg2dec *mpeg2dec)
{
gint state;
if (mpeg2dec->decoder) {
const mpeg2_info_t *info = mpeg2_info (mpeg2dec->decoder);
do {
state = mpeg2_parse (mpeg2dec->decoder);
if (state == STATE_END) {
if (info->discard_fbuf && info->discard_fbuf->id) {
gst_buffer_unref ((GstBuffer *)info->discard_fbuf->id);
}
}
}
while (state != -1);
}
}
static void static void
gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf) gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
{ {
@ -401,9 +423,10 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_DISCONTINUOUS: case GST_EVENT_DISCONTINUOUS:
{ {
GST_DEBUG (GST_CAT_EVENT, "discont\n"); GST_DEBUG (GST_CAT_EVENT, "discont");
mpeg2dec->next_time = 0; mpeg2dec->next_time = 0;
mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE;
gst_mpeg2dec_flush_decoder (mpeg2dec);
gst_pad_event_default (pad, event); gst_pad_event_default (pad, event);
return; return;
} }
@ -458,15 +481,18 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
if (!gst_mpeg2dec_negotiate_format (mpeg2dec)) { if (!gst_mpeg2dec_negotiate_format (mpeg2dec)) {
gst_element_error (GST_ELEMENT (mpeg2dec), "could not negotiate format"); gst_element_error (GST_ELEMENT (mpeg2dec), "could not negotiate format");
return; goto exit;
} }
update_streaminfo (mpeg2dec); update_streaminfo (mpeg2dec);
if (!mpeg2dec->have_fbuf) {
/* alloc 3 buffers */ /* alloc 3 buffers */
gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf)); gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf));
gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf)); gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf));
gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf)); gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf));
mpeg2dec->have_fbuf = TRUE;
}
mpeg2dec->need_sequence = FALSE; mpeg2dec->need_sequence = FALSE;
if (mpeg2dec->pending_event) { if (mpeg2dec->pending_event) {
@ -479,7 +505,6 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
} }
case STATE_SEQUENCE_REPEATED: case STATE_SEQUENCE_REPEATED:
GST_DEBUG (0, "sequence repeated"); GST_DEBUG (0, "sequence repeated");
break;
case STATE_GOP: case STATE_GOP:
break; break;
case STATE_PICTURE: case STATE_PICTURE:
@ -516,6 +541,7 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
case STATE_END: case STATE_END:
{ {
GstBuffer *outbuf = NULL; GstBuffer *outbuf = NULL;
gboolean skip = FALSE;
if (!slice) { if (!slice) {
mpeg2dec->need_sequence = TRUE; mpeg2dec->need_sequence = TRUE;
@ -542,15 +568,18 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
if (picture->flags & PIC_FLAG_PTS) { if (picture->flags & PIC_FLAG_PTS) {
GstClockTime time = MPEGTIME_TO_GSTTIME (picture->pts); GstClockTime time = MPEGTIME_TO_GSTTIME (picture->pts);
GST_DEBUG (0, "picture had pts %lld", time);
GST_BUFFER_TIMESTAMP (outbuf) = time; GST_BUFFER_TIMESTAMP (outbuf) = time;
mpeg2dec->next_time = time; mpeg2dec->next_time = time;
} }
else { else {
GST_DEBUG (0, "picture didn't have pts using %lld", mpeg2dec->next_time);
GST_BUFFER_TIMESTAMP (outbuf) = mpeg2dec->next_time; GST_BUFFER_TIMESTAMP (outbuf) = mpeg2dec->next_time;
} }
mpeg2dec->next_time += (mpeg2dec->frame_period * picture->nb_fields) >> 1; mpeg2dec->next_time += (mpeg2dec->frame_period * picture->nb_fields) >> 1;
GST_DEBUG (0, "picture: %s %s fields:%d off:%lld ts:%lld", GST_DEBUG (0, "picture: %s %s fields:%d off:%lld ts:%lld",
(picture->flags & PIC_FLAG_TOP_FIELD_FIRST ? "tff " : " "), (picture->flags & PIC_FLAG_TOP_FIELD_FIRST ? "tff " : " "),
(picture->flags & PIC_FLAG_PROGRESSIVE_FRAME ? "prog" : " "), (picture->flags & PIC_FLAG_PROGRESSIVE_FRAME ? "prog" : " "),
@ -569,7 +598,8 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
if (picture->flags & PIC_FLAG_SKIP || if (picture->flags & PIC_FLAG_SKIP ||
!GST_PAD_IS_USABLE (mpeg2dec->srcpad) || !GST_PAD_IS_USABLE (mpeg2dec->srcpad) ||
mpeg2dec->discont_state != MPEG2DEC_DISC_NONE || mpeg2dec->discont_state != MPEG2DEC_DISC_NONE ||
mpeg2dec->next_time < mpeg2dec->segment_start) mpeg2dec->next_time < mpeg2dec->segment_start ||
skip)
{ {
gst_buffer_unref (outbuf); gst_buffer_unref (outbuf);
} }
@ -611,6 +641,7 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
} }
} }
} }
exit:
gst_buffer_unref(buf); gst_buffer_unref(buf);
} }
@ -878,7 +909,7 @@ index_seek (GstPad *pad, GstEvent *event)
/* do the seekk */ /* do the seekk */
if (gst_pad_send_event (GST_PAD_PEER (mpeg2dec->sinkpad), seek_event)) { if (gst_pad_send_event (GST_PAD_PEER (mpeg2dec->sinkpad), seek_event)) {
/* seek worked, we're done, loop will exit */ /* seek worked, we're done, loop will exit */
while (mpeg2_parse (mpeg2dec->decoder) != -1); gst_mpeg2dec_flush_decoder (mpeg2dec);
mpeg2dec->segment_start = GST_EVENT_SEEK_OFFSET (event); mpeg2dec->segment_start = GST_EVENT_SEEK_OFFSET (event);
return TRUE; return TRUE;
} }
@ -946,7 +977,7 @@ normal_seek (GstPad *pad, GstEvent *event)
* failed */ * failed */
if (res && flush) { if (res && flush) {
/* if we need to flush, iterate until the buffer is empty */ /* if we need to flush, iterate until the buffer is empty */
while (mpeg2_parse (mpeg2dec->decoder) != -1); gst_mpeg2dec_flush_decoder (mpeg2dec);
} }
return res; return res;

View File

@ -70,6 +70,7 @@ struct _GstMpeg2dec {
mpeg2dec_t *decoder; mpeg2dec_t *decoder;
gboolean closed; gboolean closed;
gboolean have_fbuf;
/* the timestamp of the next frame */ /* the timestamp of the next frame */
DiscontState discont_state; DiscontState discont_state;