diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2013-07-30 08:55:50 +0200 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2013-07-30 08:55:50 +0200 |
commit | cde4a9b46bc4f6542e8b99b2d9f7a9c92e36f854 (patch) | |
tree | bf322a8cb4c031aa0d6fbf3e2b1d419f9ec94a97 /ext | |
parent | 506fe9d1810310128adfeb65a9cffd014450ac11 (diff) |
Imported Upstream version 1.1.3upstream/1.1.3
Diffstat (limited to 'ext')
-rw-r--r-- | ext/libav/gstavcodecmap.c | 2 | ||||
-rw-r--r-- | ext/libav/gstavdemux.c | 45 | ||||
-rw-r--r-- | ext/libav/gstavviddec.c | 7 |
3 files changed, 50 insertions, 4 deletions
diff --git a/ext/libav/gstavcodecmap.c b/ext/libav/gstavcodecmap.c index 966f544..88d19a0 100644 --- a/ext/libav/gstavcodecmap.c +++ b/ext/libav/gstavcodecmap.c @@ -2453,7 +2453,7 @@ gst_ffmpeg_pixfmt_to_videoformat (enum PixelFormat pixfmt) if (pixtofmttable[i].pixfmt == pixfmt) return pixtofmttable[i].format; - GST_WARNING ("Unknown pixel format %d", pixfmt); + GST_DEBUG ("Unknown pixel format %d", pixfmt); return GST_VIDEO_FORMAT_UNKNOWN; } diff --git a/ext/libav/gstavdemux.c b/ext/libav/gstavdemux.c index 42c0b77..d0df524 100644 --- a/ext/libav/gstavdemux.c +++ b/ext/libav/gstavdemux.c @@ -61,6 +61,9 @@ struct _GstFFMpegDemux /* We need to keep track of our pads, so we do so here. */ GstPad *sinkpad; + gboolean have_group_id; + guint group_id; + AVFormatContext *context; gboolean opened; @@ -264,6 +267,9 @@ gst_ffmpegdemux_init (GstFFMpegDemux * demux) g_rec_mutex_init (&demux->task_lock); gst_task_set_lock (demux->task, &demux->task_lock); + demux->have_group_id = FALSE; + demux->group_id = G_MAXUINT; + demux->opened = FALSE; demux->context = NULL; @@ -809,6 +815,24 @@ gst_ffmpegdemux_src_query (GstPad * pad, GstObject * parent, GstQuery * query) res = TRUE; break; } + case GST_QUERY_SEGMENT:{ + GstFormat format; + gint64 start, stop; + + format = demux->segment.format; + + start = + gst_segment_to_stream_time (&demux->segment, format, + demux->segment.start); + if ((stop = demux->segment.stop) == -1) + stop = demux->segment.duration; + else + stop = gst_segment_to_stream_time (&demux->segment, format, stop); + + gst_query_set_segment (query, demux->segment.rate, format, start, stop); + res = TRUE; + break; + } default: /* FIXME : ADD GST_QUERY_CONVERT */ res = gst_pad_query_default (pad, parent, query); @@ -925,6 +949,7 @@ gst_ffmpegdemux_get_stream (GstFFMpegDemux * demux, AVStream * avstream) const gchar *codec; AVCodecContext *ctx; GstFFStream *stream; + GstEvent *event; gchar *stream_id; ctx = avstream->codec; @@ -1004,7 +1029,23 @@ gst_ffmpegdemux_get_stream (GstFFMpegDemux * demux, AVStream * avstream) stream_id = gst_pad_create_stream_id_printf (pad, GST_ELEMENT_CAST (demux), "%03u", avstream->index); - gst_pad_push_event (pad, gst_event_new_stream_start (stream_id)); + + event = gst_pad_get_sticky_event (demux->sinkpad, GST_EVENT_STREAM_START, 0); + if (event) { + if (gst_event_parse_group_id (event, &demux->group_id)) + demux->have_group_id = TRUE; + else + demux->have_group_id = FALSE; + gst_event_unref (event); + } else if (!demux->have_group_id) { + demux->have_group_id = TRUE; + demux->group_id = gst_util_group_id_next (); + } + event = gst_event_new_stream_start (stream_id); + if (demux->have_group_id) + gst_event_set_group_id (event, demux->group_id); + + gst_pad_push_event (pad, event); g_free (stream_id); GST_INFO_OBJECT (pad, "adding pad with caps %" GST_PTR_FORMAT, caps); @@ -1854,6 +1895,8 @@ gst_ffmpegdemux_change_state (GstElement * element, GstStateChange transition) NULL); g_list_free (demux->cached_events); demux->cached_events = NULL; + demux->have_group_id = FALSE; + demux->group_id = G_MAXUINT; break; default: break; diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c index dc472e4..042c110 100644 --- a/ext/libav/gstavviddec.c +++ b/ext/libav/gstavviddec.c @@ -250,6 +250,7 @@ gst_ffmpegviddec_init (GstFFMpegVidDec * ffmpegdec) /* some ffmpeg data */ ffmpegdec->context = avcodec_alloc_context3 (klass->in_plugin); + ffmpegdec->context->opaque = ffmpegdec; ffmpegdec->picture = avcodec_alloc_frame (); ffmpegdec->opened = FALSE; ffmpegdec->skip_frame = ffmpegdec->lowres = 0; @@ -1057,8 +1058,6 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, *ret = GST_FLOW_OK; - ffmpegdec->context->opaque = ffmpegdec; - /* in case we skip frames */ ffmpegdec->picture->pict_type = -1; @@ -1516,6 +1515,10 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) align.padding_left = edge; align.padding_right = width - GST_VIDEO_INFO_WIDTH (&state->info) - edge; align.padding_bottom = height - GST_VIDEO_INFO_HEIGHT (&state->info) - edge; + + /* add extra padding to match libav buffer allocation sizes */ + align.padding_bottom++; + for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) align.stride_align[i] = (linesize_align[i] > 0 ? linesize_align[i] - 1 : 0); |