From f2c5900c6ddb0e8a44b641bbac4ab7aa7bde03a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Zanelli?= Date: Tue, 30 Sep 2014 15:28:55 +0200 Subject: [PATCH] vc1parse: add some simple stream-format conversion It add the support of following stream-format conversion: - bdu --> sequence-layer-bdu - bdu-frame --> sequence-layer-bdu-frame - frame-layer --> sequence-layer-frame-layer For these conversion, the only requirements is to push a sequence-layer buffer prior to data. https://bugzilla.gnome.org/show_bug.cgi?id=738526 --- gst/videoparsers/gstvc1parse.c | 47 +++++++++++++++++++++++++++++++++- gst/videoparsers/gstvc1parse.h | 4 +++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/gst/videoparsers/gstvc1parse.c b/gst/videoparsers/gstvc1parse.c index 3e982038cf..07386edaeb 100644 --- a/gst/videoparsers/gstvc1parse.c +++ b/gst/videoparsers/gstvc1parse.c @@ -1381,6 +1381,19 @@ done: return ret; } +static GstFlowReturn +gst_vc1_parse_push_sequence_layer (GstVC1Parse * vc1parse) +{ + GstBuffer *seq_layer; + + if ((seq_layer = vc1parse->seq_layer_buffer)) + gst_buffer_ref (seq_layer); + else + seq_layer = gst_vc1_parse_make_sequence_layer (vc1parse); + + return gst_pad_push (GST_BASE_PARSE_SRC_PAD (vc1parse), seq_layer); +} + static GstFlowReturn gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { @@ -1470,6 +1483,16 @@ gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU: switch (vc1parse->input_stream_format) { case VC1_STREAM_FORMAT_BDU: + /* We just need to send the sequence-layer first */ + if (!vc1parse->seq_layer_sent) { + ret = gst_vc1_parse_push_sequence_layer (vc1parse); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (vc1parse, "push sequence layer failed"); + break; + } + vc1parse->seq_layer_sent = TRUE; + } + break; case VC1_STREAM_FORMAT_BDU_FRAME: goto conversion_not_supported; break; @@ -1492,7 +1515,19 @@ gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME: switch (vc1parse->input_stream_format) { case VC1_STREAM_FORMAT_BDU: + goto conversion_not_supported; + break; case VC1_STREAM_FORMAT_BDU_FRAME: + /* We just need to send the sequence-layer first */ + if (!vc1parse->seq_layer_sent) { + ret = gst_vc1_parse_push_sequence_layer (vc1parse); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (vc1parse, "push sequence layer failed"); + break; + } + vc1parse->seq_layer_sent = TRUE; + } + break; case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU: goto conversion_not_supported; break; @@ -1546,9 +1581,19 @@ gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) g_assert_not_reached (); break; case VC1_STREAM_FORMAT_ASF: - case VC1_STREAM_FORMAT_FRAME_LAYER: goto conversion_not_supported; break; + case VC1_STREAM_FORMAT_FRAME_LAYER: + /* We just need to send the sequence-layer first */ + if (!vc1parse->seq_layer_sent) { + ret = gst_vc1_parse_push_sequence_layer (vc1parse); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (vc1parse, "push sequence layer failed"); + break; + } + vc1parse->seq_layer_sent = TRUE; + } + break; default: g_assert_not_reached (); break; diff --git a/gst/videoparsers/gstvc1parse.h b/gst/videoparsers/gstvc1parse.h index 3b49f51bbf..8a248aa237 100644 --- a/gst/videoparsers/gstvc1parse.h +++ b/gst/videoparsers/gstvc1parse.h @@ -107,6 +107,10 @@ struct _GstVC1Parse * valid if the GstBaseParseFrame has the * GST_BASE_PARSE_FRAME_FLAG_PARSING flag */ GstVC1StartCode startcode; + + /* TRUE if we have already sent the sequence-layer, + * use for stream-format conversion */ + gboolean seq_layer_sent; }; struct _GstVC1ParseClass