aboutsummaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2013-07-30 08:55:50 +0200
committerSebastian Dröge <slomo@circular-chaos.org>2013-07-30 08:55:50 +0200
commitcde4a9b46bc4f6542e8b99b2d9f7a9c92e36f854 (patch)
treebf322a8cb4c031aa0d6fbf3e2b1d419f9ec94a97 /ext
parent506fe9d1810310128adfeb65a9cffd014450ac11 (diff)
Imported Upstream version 1.1.3upstream/1.1.3
Diffstat (limited to 'ext')
-rw-r--r--ext/libav/gstavcodecmap.c2
-rw-r--r--ext/libav/gstavdemux.c45
-rw-r--r--ext/libav/gstavviddec.c7
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);