mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
vc1parse: prepare the stream-format conversion code and add the simplest ones
It prepares the template for stream-format conversion and it implements the following conversion: - sequence-layer-bdu --> bdu - sequence-layer-bdu-frame --> bdu-frame - sequence-layer-frame-layer --> frame-layer Work is done in the pre_push_frame() method. https://bugzilla.gnome.org/show_bug.cgi?id=738526
This commit is contained in:
parent
1d733eacf7
commit
cd500c5a06
1 changed files with 204 additions and 4 deletions
|
@ -1385,6 +1385,7 @@ static GstFlowReturn
|
||||||
gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
||||||
{
|
{
|
||||||
GstVC1Parse *vc1parse = GST_VC1_PARSE (parse);
|
GstVC1Parse *vc1parse = GST_VC1_PARSE (parse);
|
||||||
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
|
|
||||||
if (!vc1parse->sent_codec_tag) {
|
if (!vc1parse->sent_codec_tag) {
|
||||||
GstTagList *taglist;
|
GstTagList *taglist;
|
||||||
|
@ -1405,12 +1406,211 @@ gst_vc1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
||||||
vc1parse->sent_codec_tag = TRUE;
|
vc1parse->sent_codec_tag = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vc1parse->input_stream_format != vc1parse->output_stream_format) {
|
/* Nothing to do here */
|
||||||
GST_WARNING_OBJECT (vc1parse, "stream conversion not implemented yet");
|
if (vc1parse->input_stream_format == vc1parse->output_stream_format)
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
|
switch (vc1parse->output_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
/* We just need to drop sequence-layer buffer */
|
||||||
|
if (frame->flags & GST_BASE_PARSE_FRAME_FLAG_NO_FRAME) {
|
||||||
|
ret = GST_BASE_PARSE_FLOW_DROPPED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
/* We just need to drop sequence-layer buffer */
|
||||||
|
if (frame->flags & GST_BASE_PARSE_FRAME_FLAG_NO_FRAME) {
|
||||||
|
ret = GST_BASE_PARSE_FLOW_DROPPED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
switch (vc1parse->input_stream_format) {
|
||||||
|
case VC1_STREAM_FORMAT_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_BDU_FRAME:
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_RAW_FRAME:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_SEQUENCE_LAYER_FRAME_LAYER:
|
||||||
|
/* We just need to drop sequence-layer buffer */
|
||||||
|
if (frame->flags & GST_BASE_PARSE_FRAME_FLAG_NO_FRAME) {
|
||||||
|
ret = GST_BASE_PARSE_FLOW_DROPPED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_ASF:
|
||||||
|
goto conversion_not_supported;
|
||||||
|
break;
|
||||||
|
case VC1_STREAM_FORMAT_FRAME_LAYER:
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
conversion_not_supported:
|
||||||
|
GST_WARNING_OBJECT (vc1parse, "stream conversion not implemented yet");
|
||||||
|
return GST_FLOW_NOT_NEGOTIATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SMPTE 421M Table 7 */
|
/* SMPTE 421M Table 7 */
|
||||||
|
|
Loading…
Reference in a new issue