summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>2010-01-13 09:42:12 -0300
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>2010-01-13 10:35:57 -0300
commiteba1357244181d96ceff7f8e52980b2bd6e99c41 (patch)
treedf793a5fcfa75dcfd0cc51b05a9d305b3f6e8e50
parente15d4c44aa7880d9d8e6b55808cec0d8d9114c4a (diff)
h264parse: Add stream-format to caps
Adds the new stream-format field to h264parse caps Fixes #606662
-rw-r--r--gst/h264parse/gsth264parse.c57
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;