mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
av1parse: Improve the logic when to drop the OBU.
When drop some OBU, we need to go on. The current manner will make the data access out range of the buffer mapping. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979>
This commit is contained in:
parent
e8bb0fa062
commit
a9c8aa4788
1 changed files with 9 additions and 15 deletions
|
@ -1191,7 +1191,7 @@ gst_av1_parse_handle_obu_to_obu (GstBaseParse * parse,
|
||||||
|
|
||||||
total_consumed = 0;
|
total_consumed = 0;
|
||||||
again:
|
again:
|
||||||
while (TRUE) {
|
while (total_consumed < map_info.size) {
|
||||||
frame_complete = FALSE;
|
frame_complete = FALSE;
|
||||||
res = gst_av1_parser_identify_one_obu (self->parser,
|
res = gst_av1_parser_identify_one_obu (self->parser,
|
||||||
map_info.data + total_consumed, map_info.size - total_consumed,
|
map_info.data + total_consumed, map_info.size - total_consumed,
|
||||||
|
@ -1202,12 +1202,8 @@ again:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
total_consumed += consumed;
|
total_consumed += consumed;
|
||||||
|
|
||||||
g_assert (total_consumed <= map_info.size);
|
|
||||||
|
|
||||||
if (total_consumed >= map_info.size)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
g_assert (total_consumed <= map_info.size);
|
||||||
|
|
||||||
if (total_consumed) {
|
if (total_consumed) {
|
||||||
/* If we get something, always output it even already met some error.
|
/* If we get something, always output it even already met some error.
|
||||||
|
@ -1255,6 +1251,7 @@ again:
|
||||||
} else if (res == GST_AV1_PARSER_DROP) {
|
} else if (res == GST_AV1_PARSER_DROP) {
|
||||||
GST_DEBUG_OBJECT (parse, "Drop %d data", consumed);
|
GST_DEBUG_OBJECT (parse, "Drop %d data", consumed);
|
||||||
total_consumed += consumed;
|
total_consumed += consumed;
|
||||||
|
res = GST_AV1_PARSER_OK;
|
||||||
goto again;
|
goto again;
|
||||||
} else if (res != GST_AV1_PARSER_OK) {
|
} else if (res != GST_AV1_PARSER_OK) {
|
||||||
GST_ERROR_OBJECT (parse, "Parse obu get unexpect error %d", res);
|
GST_ERROR_OBJECT (parse, "Parse obu get unexpect error %d", res);
|
||||||
|
@ -1295,7 +1292,7 @@ gst_av1_parse_handle_to_small_and_equal_align (GstBaseParse * parse,
|
||||||
total_consumed = 0;
|
total_consumed = 0;
|
||||||
frame_complete = FALSE;
|
frame_complete = FALSE;
|
||||||
again:
|
again:
|
||||||
while (TRUE) {
|
while (total_consumed < map_info.size) {
|
||||||
res = gst_av1_parser_identify_one_obu (self->parser,
|
res = gst_av1_parser_identify_one_obu (self->parser,
|
||||||
map_info.data + total_consumed, map_info.size - total_consumed,
|
map_info.data + total_consumed, map_info.size - total_consumed,
|
||||||
&obu, &consumed);
|
&obu, &consumed);
|
||||||
|
@ -1324,11 +1321,8 @@ again:
|
||||||
|
|
||||||
if (self->align == GST_AV1_PARSE_ALIGN_FRAME && frame_complete)
|
if (self->align == GST_AV1_PARSE_ALIGN_FRAME && frame_complete)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
g_assert (total_consumed <= map_info.size);
|
|
||||||
if (total_consumed >= map_info.size)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
g_assert (total_consumed <= map_info.size);
|
||||||
|
|
||||||
if (res == GST_AV1_PARSER_BITSTREAM_ERROR) {
|
if (res == GST_AV1_PARSER_BITSTREAM_ERROR) {
|
||||||
/* Discard the whole frame */
|
/* Discard the whole frame */
|
||||||
|
@ -1350,6 +1344,7 @@ again:
|
||||||
} else if (res == GST_AV1_PARSER_DROP) {
|
} else if (res == GST_AV1_PARSER_DROP) {
|
||||||
GST_DEBUG_OBJECT (parse, "Drop %d data", consumed);
|
GST_DEBUG_OBJECT (parse, "Drop %d data", consumed);
|
||||||
total_consumed += consumed;
|
total_consumed += consumed;
|
||||||
|
res = GST_AV1_PARSER_OK;
|
||||||
goto again;
|
goto again;
|
||||||
} else if (res != GST_AV1_PARSER_OK) {
|
} else if (res != GST_AV1_PARSER_OK) {
|
||||||
GST_ERROR_OBJECT (parse, "Parse obu get unexpect error %d", res);
|
GST_ERROR_OBJECT (parse, "Parse obu get unexpect error %d", res);
|
||||||
|
@ -1489,6 +1484,7 @@ again:
|
||||||
} else if (res == GST_AV1_PARSER_DROP) {
|
} else if (res == GST_AV1_PARSER_DROP) {
|
||||||
GST_DEBUG_OBJECT (parse, "Drop %d data", consumed);
|
GST_DEBUG_OBJECT (parse, "Drop %d data", consumed);
|
||||||
self->last_parsed_offset += consumed;
|
self->last_parsed_offset += consumed;
|
||||||
|
res = GST_AV1_PARSER_OK;
|
||||||
goto again;
|
goto again;
|
||||||
} else if (res == GST_AV1_PARSER_OK) {
|
} else if (res == GST_AV1_PARSER_OK) {
|
||||||
/* Everything is correct but still not get a frame or tu,
|
/* Everything is correct but still not get a frame or tu,
|
||||||
|
@ -1537,7 +1533,7 @@ gst_av1_parse_detect_alignment (GstBaseParse * parse,
|
||||||
got_frame = FALSE;
|
got_frame = FALSE;
|
||||||
total_consumed = 0;
|
total_consumed = 0;
|
||||||
again:
|
again:
|
||||||
while (TRUE) {
|
while (total_consumed < map_info.size) {
|
||||||
res = gst_av1_parser_identify_one_obu (self->parser,
|
res = gst_av1_parser_identify_one_obu (self->parser,
|
||||||
map_info.data + total_consumed, map_info.size - total_consumed,
|
map_info.data + total_consumed, map_info.size - total_consumed,
|
||||||
&obu, &consumed);
|
&obu, &consumed);
|
||||||
|
@ -1557,9 +1553,6 @@ again:
|
||||||
|
|
||||||
if (got_seq || got_frame)
|
if (got_seq || got_frame)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (total_consumed >= map_info.size)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_av1_parser_reset (self->parser, FALSE);
|
gst_av1_parser_reset (self->parser, FALSE);
|
||||||
|
@ -1576,6 +1569,7 @@ again:
|
||||||
goto out;
|
goto out;
|
||||||
} else if (res == GST_AV1_PARSER_DROP) {
|
} else if (res == GST_AV1_PARSER_DROP) {
|
||||||
total_consumed += consumed;
|
total_consumed += consumed;
|
||||||
|
res = GST_AV1_PARSER_OK;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue