av1parse: Set the "tu" as the default alignment.
The tu(temporal unit) is more widely used than the current alignment. We now change the default alignment to tu. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1468>
This commit is contained in:
parent
cfd69b0467
commit
d334c08b55
@ -485,6 +485,99 @@ gst_av1_parse_alignment_from_string (const gchar * align,
|
|||||||
return GST_AV1_PARSE_ALIGN_NONE;
|
return GST_AV1_PARSE_ALIGN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_av1_parse_caps_has_alignment (GstCaps * caps, GstAV1ParseAligment alignment)
|
||||||
|
{
|
||||||
|
guint i, j, caps_size;
|
||||||
|
const gchar *cmp_align_str = NULL;
|
||||||
|
const gchar *cmp_stream_str = NULL;
|
||||||
|
|
||||||
|
GST_DEBUG ("Try to find alignment %d in caps: %" GST_PTR_FORMAT,
|
||||||
|
alignment, caps);
|
||||||
|
|
||||||
|
caps_size = gst_caps_get_size (caps);
|
||||||
|
if (caps_size == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
switch (alignment) {
|
||||||
|
case GST_AV1_PARSE_ALIGN_BYTE:
|
||||||
|
cmp_align_str = "byte";
|
||||||
|
cmp_stream_str = "obu-stream";
|
||||||
|
break;
|
||||||
|
case GST_AV1_PARSE_ALIGN_OBU:
|
||||||
|
cmp_align_str = "obu";
|
||||||
|
cmp_stream_str = "obu-stream";
|
||||||
|
break;
|
||||||
|
case GST_AV1_PARSE_ALIGN_FRAME:
|
||||||
|
cmp_align_str = "frame";
|
||||||
|
cmp_stream_str = "obu-stream";
|
||||||
|
break;
|
||||||
|
case GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT:
|
||||||
|
cmp_align_str = "tu";
|
||||||
|
cmp_stream_str = "obu-stream";
|
||||||
|
break;
|
||||||
|
case GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B:
|
||||||
|
cmp_align_str = "tu";
|
||||||
|
cmp_stream_str = "annexb";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < caps_size; i++) {
|
||||||
|
GstStructure *s = gst_caps_get_structure (caps, i);
|
||||||
|
const GValue *alignment_value = gst_structure_get_value (s, "alignment");
|
||||||
|
const GValue *stream_value = gst_structure_get_value (s, "stream-format");
|
||||||
|
|
||||||
|
if (!alignment_value || !stream_value)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (G_VALUE_HOLDS_STRING (alignment_value)) {
|
||||||
|
const gchar *align_str = g_value_get_string (alignment_value);
|
||||||
|
|
||||||
|
if (g_strcmp0 (align_str, cmp_align_str) != 0)
|
||||||
|
continue;
|
||||||
|
} else if (GST_VALUE_HOLDS_LIST (alignment_value)) {
|
||||||
|
guint num_values = gst_value_list_get_size (alignment_value);
|
||||||
|
|
||||||
|
for (j = 0; j < num_values; j++) {
|
||||||
|
const GValue *v = gst_value_list_get_value (alignment_value, j);
|
||||||
|
const gchar *align_str = g_value_get_string (v);
|
||||||
|
|
||||||
|
if (g_strcmp0 (align_str, cmp_align_str) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == num_values)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (G_VALUE_HOLDS_STRING (stream_value)) {
|
||||||
|
const gchar *stream_str = g_value_get_string (stream_value);
|
||||||
|
|
||||||
|
if (g_strcmp0 (stream_str, cmp_stream_str) != 0)
|
||||||
|
continue;
|
||||||
|
} else if (GST_VALUE_HOLDS_LIST (stream_value)) {
|
||||||
|
guint num_values = gst_value_list_get_size (stream_value);
|
||||||
|
|
||||||
|
for (j = 0; j < num_values; j++) {
|
||||||
|
const GValue *v = gst_value_list_get_value (stream_value, j);
|
||||||
|
const gchar *stream_str = g_value_get_string (v);
|
||||||
|
|
||||||
|
if (g_strcmp0 (stream_str, cmp_stream_str) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == num_values)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static GstAV1ParseAligment
|
static GstAV1ParseAligment
|
||||||
gst_av1_parse_alignment_from_caps (GstCaps * caps)
|
gst_av1_parse_alignment_from_caps (GstCaps * caps)
|
||||||
{
|
{
|
||||||
@ -632,7 +725,7 @@ static void
|
|||||||
gst_av1_parse_negotiate (GstAV1Parse * self, GstCaps * in_caps)
|
gst_av1_parse_negotiate (GstAV1Parse * self, GstCaps * in_caps)
|
||||||
{
|
{
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstAV1ParseAligment align = self->align;
|
GstAV1ParseAligment align = GST_AV1_PARSE_ALIGN_NONE;
|
||||||
|
|
||||||
caps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (self));
|
caps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (self));
|
||||||
GST_DEBUG_OBJECT (self, "allowed caps: %" GST_PTR_FORMAT, caps);
|
GST_DEBUG_OBJECT (self, "allowed caps: %" GST_PTR_FORMAT, caps);
|
||||||
@ -644,6 +737,13 @@ gst_av1_parse_negotiate (GstAV1Parse * self, GstCaps * in_caps)
|
|||||||
GST_DEBUG_OBJECT (self, "negotiating with caps: %" GST_PTR_FORMAT, caps);
|
GST_DEBUG_OBJECT (self, "negotiating with caps: %" GST_PTR_FORMAT, caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prefer TU as default */
|
||||||
|
if (gst_av1_parse_caps_has_alignment (caps,
|
||||||
|
GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT)) {
|
||||||
|
align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Both upsteam and downstream support, best */
|
/* Both upsteam and downstream support, best */
|
||||||
if (in_caps && caps) {
|
if (in_caps && caps) {
|
||||||
if (gst_caps_can_intersect (in_caps, caps)) {
|
if (gst_caps_can_intersect (in_caps, caps)) {
|
||||||
@ -666,7 +766,7 @@ gst_av1_parse_negotiate (GstAV1Parse * self, GstCaps * in_caps)
|
|||||||
|
|
||||||
/* default */
|
/* default */
|
||||||
if (align == GST_AV1_PARSE_ALIGN_NONE)
|
if (align == GST_AV1_PARSE_ALIGN_NONE)
|
||||||
align = GST_AV1_PARSE_ALIGN_FRAME;
|
align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
self->align = align;
|
self->align = align;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user