videoparsers: av1: Allow av1parse to parse annexb streams
Let's av1 parser do it job event it receives an annexb stream. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8502>
This commit is contained in:
parent
515e241b38
commit
2f81d53efc
@ -86,7 +86,7 @@ GST_DEBUG_CATEGORY (av1_parse_debug);
|
|||||||
|
|
||||||
/* We combine the stream format and the alignment
|
/* We combine the stream format and the alignment
|
||||||
together. When stream format is annexb, the
|
together. When stream format is annexb, the
|
||||||
alignment must be TU. */
|
alignment must be TU or byte. */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GST_AV1_PARSE_ALIGN_ERROR = -1,
|
GST_AV1_PARSE_ALIGN_ERROR = -1,
|
||||||
@ -96,6 +96,7 @@ typedef enum
|
|||||||
GST_AV1_PARSE_ALIGN_FRAME,
|
GST_AV1_PARSE_ALIGN_FRAME,
|
||||||
GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT,
|
GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT,
|
||||||
GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B,
|
GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B,
|
||||||
|
GST_AV1_PARSE_ALIGN_ANNEX_B,
|
||||||
} GstAV1ParseAligment;
|
} GstAV1ParseAligment;
|
||||||
|
|
||||||
struct _GstAV1Parse
|
struct _GstAV1Parse
|
||||||
@ -538,6 +539,7 @@ gst_av1_parse_alignment_to_steam_format_string (GstAV1ParseAligment align)
|
|||||||
case GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT:
|
case GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT:
|
||||||
case GST_AV1_PARSE_ALIGN_FRAME:
|
case GST_AV1_PARSE_ALIGN_FRAME:
|
||||||
return "obu-stream";
|
return "obu-stream";
|
||||||
|
case GST_AV1_PARSE_ALIGN_ANNEX_B:
|
||||||
case GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B:
|
case GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B:
|
||||||
return "annexb";
|
return "annexb";
|
||||||
default:
|
default:
|
||||||
@ -553,6 +555,7 @@ gst_av1_parse_alignment_to_string (GstAV1ParseAligment align)
|
|||||||
{
|
{
|
||||||
switch (align) {
|
switch (align) {
|
||||||
case GST_AV1_PARSE_ALIGN_BYTE:
|
case GST_AV1_PARSE_ALIGN_BYTE:
|
||||||
|
case GST_AV1_PARSE_ALIGN_ANNEX_B:
|
||||||
return "byte";
|
return "byte";
|
||||||
case GST_AV1_PARSE_ALIGN_OBU:
|
case GST_AV1_PARSE_ALIGN_OBU:
|
||||||
return "obu";
|
return "obu";
|
||||||
@ -578,11 +581,12 @@ gst_av1_parse_alignment_from_string (const gchar * align,
|
|||||||
|
|
||||||
if (stream_format) {
|
if (stream_format) {
|
||||||
if (g_strcmp0 (stream_format, "annexb") == 0) {
|
if (g_strcmp0 (stream_format, "annexb") == 0) {
|
||||||
if (align && g_strcmp0 (align, "tu") != 0) {
|
if (align && g_strcmp0 (align, "tu") == 0) {
|
||||||
/* annex b stream must align to TU. */
|
|
||||||
return GST_AV1_PARSE_ALIGN_ERROR;
|
|
||||||
} else {
|
|
||||||
return GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B;
|
return GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B;
|
||||||
|
} else if (align && g_strcmp0 (align, "none") == 0) {
|
||||||
|
return GST_AV1_PARSE_ALIGN_ANNEX_B;
|
||||||
|
} else {
|
||||||
|
return GST_AV1_PARSE_ALIGN_ERROR;
|
||||||
}
|
}
|
||||||
} else if (g_strcmp0 (stream_format, "obu-stream") != 0) {
|
} else if (g_strcmp0 (stream_format, "obu-stream") != 0) {
|
||||||
/* unrecognized */
|
/* unrecognized */
|
||||||
@ -645,6 +649,10 @@ gst_av1_parse_caps_has_alignment (GstCaps * caps, GstAV1ParseAligment alignment)
|
|||||||
cmp_align_str = "tu";
|
cmp_align_str = "tu";
|
||||||
cmp_stream_str = "annexb";
|
cmp_stream_str = "annexb";
|
||||||
break;
|
break;
|
||||||
|
case GST_AV1_PARSE_ALIGN_ANNEX_B:
|
||||||
|
cmp_align_str = "none";
|
||||||
|
cmp_stream_str = "annexb";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -1036,10 +1044,12 @@ gst_av1_parse_set_sink_caps (GstBaseParse * parse, GstCaps * caps)
|
|||||||
|
|
||||||
self->in_align = align;
|
self->in_align = align;
|
||||||
|
|
||||||
if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT)
|
if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT
|
||||||
|
|| self->in_align == GST_AV1_PARSE_ALIGN_ANNEX_B)
|
||||||
self->detect_annex_b = TRUE;
|
self->detect_annex_b = TRUE;
|
||||||
|
|
||||||
if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) {
|
if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B
|
||||||
|
|| self->in_align == GST_AV1_PARSE_ALIGN_ANNEX_B) {
|
||||||
gst_av1_parser_reset (self->parser, TRUE);
|
gst_av1_parser_reset (self->parser, TRUE);
|
||||||
} else {
|
} else {
|
||||||
gst_av1_parser_reset (self->parser, FALSE);
|
gst_av1_parser_reset (self->parser, FALSE);
|
||||||
@ -2195,6 +2205,8 @@ gst_av1_parse_handle_frame (GstBaseParse * parse,
|
|||||||
upstream_caps =
|
upstream_caps =
|
||||||
gst_pad_peer_query_caps (GST_BASE_PARSE_SINK_PAD (self), NULL);
|
gst_pad_peer_query_caps (GST_BASE_PARSE_SINK_PAD (self), NULL);
|
||||||
if (upstream_caps) {
|
if (upstream_caps) {
|
||||||
|
gboolean detect_annex_b = FALSE;
|
||||||
|
|
||||||
if (!gst_caps_is_empty (upstream_caps)
|
if (!gst_caps_is_empty (upstream_caps)
|
||||||
&& !gst_caps_is_any (upstream_caps)) {
|
&& !gst_caps_is_any (upstream_caps)) {
|
||||||
GstAV1ParseAligment align;
|
GstAV1ParseAligment align;
|
||||||
@ -2217,8 +2229,11 @@ gst_av1_parse_handle_frame (GstBaseParse * parse,
|
|||||||
|
|
||||||
gst_caps_unref (upstream_caps);
|
gst_caps_unref (upstream_caps);
|
||||||
|
|
||||||
gst_av1_parser_reset (self->parser,
|
if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B
|
||||||
self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B);
|
|| self->in_align == GST_AV1_PARSE_ALIGN_ANNEX_B)
|
||||||
|
detect_annex_b = TRUE;
|
||||||
|
|
||||||
|
gst_av1_parser_reset (self->parser, detect_annex_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->in_align != GST_AV1_PARSE_ALIGN_NONE) {
|
if (self->in_align != GST_AV1_PARSE_ALIGN_NONE) {
|
||||||
@ -2231,7 +2246,8 @@ gst_av1_parse_handle_frame (GstBaseParse * parse,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT
|
if ((self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT
|
||||||
|
|| self->in_align == GST_AV1_PARSE_ALIGN_ANNEX_B)
|
||||||
&& self->detect_annex_b) {
|
&& self->detect_annex_b) {
|
||||||
/* Only happend at the first time of handle_frame, try to
|
/* Only happend at the first time of handle_frame, try to
|
||||||
recognize the annex b stream format. */
|
recognize the annex b stream format. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user