summaryrefslogtreecommitdiff
path: root/gst/videoparsers/gstmpegvideoparse.c
diff options
context:
space:
mode:
authorEdward Hervey <edward@collabora.com>2012-12-23 01:54:52 +0100
committerEdward Hervey <edward@collabora.com>2013-03-31 19:04:12 +0200
commit2296296a51450c2db5581a09b9707a95fa149153 (patch)
treecf1ff3941bf4ef399d8e35c6b0542caa2b0f2b1e /gst/videoparsers/gstmpegvideoparse.c
parent14e7e78b7a67e57fcf77a7e13047394437ceae4d (diff)
downloadgstreamer-plugins-bad-2296296a51450c2db5581a09b9707a95fa149153.tar.gz
mpegvideoparse: Only add meta if downstream needs it
It's not perfect, because in the cases where upstream doesn't initiate an allocation query, we won't know.
Diffstat (limited to 'gst/videoparsers/gstmpegvideoparse.c')
-rw-r--r--gst/videoparsers/gstmpegvideoparse.c70
1 files changed, 49 insertions, 21 deletions
diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c
index f9a9c4464..19c122185 100644
--- a/gst/videoparsers/gstmpegvideoparse.c
+++ b/gst/videoparsers/gstmpegvideoparse.c
@@ -76,6 +76,8 @@ static GstCaps *gst_mpegv_parse_get_caps (GstBaseParse * parse,
GstCaps * filter);
static GstFlowReturn gst_mpegv_parse_pre_push_frame (GstBaseParse * parse,
GstBaseParseFrame * frame);
+static gboolean gst_mpegv_parse_sink_query (GstBaseParse * parse,
+ GstQuery * query);
static void gst_mpegv_parse_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -165,6 +167,7 @@ gst_mpegv_parse_class_init (GstMpegvParseClass * klass)
parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_mpegv_parse_get_caps);
parse_class->pre_push_frame =
GST_DEBUG_FUNCPTR (gst_mpegv_parse_pre_push_frame);
+ parse_class->sink_query = GST_DEBUG_FUNCPTR (gst_mpegv_parse_sink_query);
}
static void
@@ -197,6 +200,7 @@ gst_mpegv_parse_reset (GstMpegvParse * mpvparse)
mpvparse->profile = 0;
mpvparse->update_caps = TRUE;
mpvparse->send_codec_tag = TRUE;
+ mpvparse->send_mpeg_meta = TRUE;
gst_buffer_replace (&mpvparse->config, NULL);
memset (&mpvparse->sequencehdr, 0, sizeof (mpvparse->sequencehdr));
@@ -213,6 +217,26 @@ gst_mpegv_parse_reset (GstMpegvParse * mpvparse)
}
static gboolean
+gst_mpegv_parse_sink_query (GstBaseParse * parse, GstQuery * query)
+{
+ gboolean res;
+ GstMpegvParse *mpvparse = GST_MPEGVIDEO_PARSE (parse);
+
+ res = GST_BASE_PARSE_CLASS (parent_class)->sink_query (parse, query);
+
+ if (res && GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION) {
+ mpvparse->send_mpeg_meta =
+ gst_query_find_allocation_meta (query, GST_MPEG_VIDEO_META_API_TYPE,
+ NULL);
+
+ GST_DEBUG_OBJECT (parse, "Downstream can handle GstMpegVideo GstMeta : %d",
+ mpvparse->send_mpeg_meta);
+ }
+
+ return res;
+}
+
+static gboolean
gst_mpegv_parse_start (GstBaseParse * parse)
{
GstMpegvParse *mpvparse = GST_MPEGVIDEO_PARSE (parse);
@@ -340,6 +364,8 @@ gst_mpegv_parse_process_config (GstMpegvParse * mpvparse, GstBuffer * buf,
return TRUE;
}
+/* FIXME : Move these functions to libgstcodecparser for usage by
+ * more elements/code */
#ifndef GST_DISABLE_GST_DEBUG
static const gchar *
picture_start_code_name (guint8 psc)
@@ -405,6 +431,7 @@ parse_packet_extension (GstMpegvParse * mpvparse, GstBuffer * buf, guint off)
gst_buffer_map (buf, &map, GST_MAP_READ);
+ /* FIXME : WE ARE ASSUMING IT IS A *PICTURE* EXTENSION */
if (gst_mpeg_video_parse_picture_extension (&mpvparse->picext, map.data,
map.size, off)) {
mpvparse->frame_repeat_count = 1;
@@ -866,28 +893,29 @@ gst_mpegv_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
/* usual clipping applies */
frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP;
- if (mpvparse->seqhdr_updated)
- seq_hdr = &mpvparse->sequencehdr;
- if (mpvparse->seqext_updated)
- seq_ext = &mpvparse->sequenceext;
- if (mpvparse->seqdispext_updated)
- disp_ext = &mpvparse->sequencedispext;
- if (mpvparse->picext_updated)
- pic_ext = &mpvparse->picext;
- if (mpvparse->quantmatrext_updated)
- quant_ext = &mpvparse->quantmatrext;
- pic_hdr = &mpvparse->pichdr;
-
- GST_DEBUG_OBJECT (mpvparse,
- "Adding GstMpegVideoMeta (slice_count:%d, slice_offset:%d)",
- mpvparse->slice_count, mpvparse->slice_offset);
- meta =
- gst_buffer_add_mpeg_video_meta (frame->
- out_buffer ? frame->out_buffer : frame->buffer, seq_hdr, seq_ext,
- disp_ext, pic_hdr, pic_ext, quant_ext);
- meta->num_slices = mpvparse->slice_count;
- meta->slice_offset = mpvparse->slice_offset;
+ if (mpvparse->send_mpeg_meta) {
+ if (mpvparse->seqhdr_updated)
+ seq_hdr = &mpvparse->sequencehdr;
+ if (mpvparse->seqext_updated)
+ seq_ext = &mpvparse->sequenceext;
+ if (mpvparse->seqdispext_updated)
+ disp_ext = &mpvparse->sequencedispext;
+ if (mpvparse->picext_updated)
+ pic_ext = &mpvparse->picext;
+ if (mpvparse->quantmatrext_updated)
+ quant_ext = &mpvparse->quantmatrext;
+ pic_hdr = &mpvparse->pichdr;
+ GST_DEBUG_OBJECT (mpvparse,
+ "Adding GstMpegVideoMeta (slice_count:%d, slice_offset:%d)",
+ mpvparse->slice_count, mpvparse->slice_offset);
+ meta =
+ gst_buffer_add_mpeg_video_meta (frame->out_buffer ? frame->
+ out_buffer : frame->buffer, seq_hdr, seq_ext, disp_ext, pic_hdr,
+ pic_ext, quant_ext);
+ meta->num_slices = mpvparse->slice_count;
+ meta->slice_offset = mpvparse->slice_offset;
+ }
return GST_FLOW_OK;
}