Small improvements
Original commit message from CVS: Small improvements
This commit is contained in:
parent
f5b06f0e6a
commit
769ab2d316
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user