diff options
author | Thiago Santos <thiago.sousa.santos@collabora.co.uk> | 2010-01-13 09:42:12 -0300 |
---|---|---|
committer | Thiago Santos <thiago.sousa.santos@collabora.co.uk> | 2010-01-13 10:35:57 -0300 |
commit | eba1357244181d96ceff7f8e52980b2bd6e99c41 (patch) | |
tree | df793a5fcfa75dcfd0cc51b05a9d305b3f6e8e50 /gst/h264parse | |
parent | e15d4c44aa7880d9d8e6b55808cec0d8d9114c4a (diff) |
h264parse: Add stream-format to caps
Adds the new stream-format field to h264parse caps
Fixes #606662
Diffstat (limited to 'gst/h264parse')
-rw-r--r-- | gst/h264parse/gsth264parse.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gst/h264parse/gsth264parse.c b/gst/h264parse/gsth264parse.c index 12553f855..404fb63b3 100644 --- a/gst/h264parse/gsth264parse.c +++ b/gst/h264parse/gsth264parse.c @@ -1164,6 +1164,18 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) return buf; } +static guint +gst_h264_parse_parse_stream_format (GstH264Parse * h264parse, + const gchar * stream_format) +{ + if (strcmp (stream_format, "avc-sample") == 0) { + return GST_H264_PARSE_FORMAT_SAMPLE; + } else if (strcmp (stream_format, "byte-stream") == 0) { + return GST_H264_PARSE_FORMAT_BYTE; + } + return GST_H264_PARSE_FORMAT_INPUT; /* this means we don't know */ +} + static gboolean gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) { @@ -1171,6 +1183,7 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) GstCaps *src_caps = NULL; GstStructure *structure; gboolean modified = FALSE; + const gchar *stream_format; /* current PPS dictates which SPS to use */ if (h264parse->pps && h264parse->pps->sps_id < MAX_SPS_COUNT) { @@ -1227,6 +1240,50 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) } structure = gst_caps_get_structure (src_caps, 0); + + /* we replace the stream-format on caps if needed */ + stream_format = gst_structure_get_string (structure, "stream-format"); + if (stream_format) { + guint input_format; + guint output_format; + + input_format = gst_h264_parse_parse_stream_format (h264parse, + stream_format); + output_format = h264parse->format; + + if (output_format == GST_H264_PARSE_FORMAT_INPUT) { + if (h264parse->packetized) { + output_format = GST_H264_PARSE_FORMAT_SAMPLE; + } else { + output_format = GST_H264_PARSE_FORMAT_BYTE; + } + } + + if (input_format != output_format) { + /* we need to replace it */ + stream_format = NULL; + } + } + + /* we need to add a new stream-format */ + if (stream_format == NULL) { + gst_structure_remove_field (structure, "stream-format"); + if (h264parse->format == GST_H264_PARSE_FORMAT_SAMPLE) { + stream_format = "avc-sample"; + } else if (h264parse->format == GST_H264_PARSE_FORMAT_BYTE) { + stream_format = "byte-stream"; + } else { + if (h264parse->packetized) { + stream_format = "avc-sample"; + } else { + stream_format = "byte-stream"; + } + } + gst_structure_set (structure, "stream-format", G_TYPE_STRING, stream_format, + NULL); + modified = TRUE; + } + /* transforming to non-bytestream needs to make codec-data */ if (h264parse->format == GST_H264_PARSE_FORMAT_SAMPLE) { GstBuffer *buf; |