Revert "h265parser: Skip unused SEI bits differently"

This reverts commit 18b54f8d347030c73d8afbeaf55df57aa5acbb96.
This commit is contained in:
Stéphane Cerveau 2020-02-12 17:37:46 +01:00 committed by GStreamer Merge Bot
parent 5881c1ad2d
commit 98f8bb4e7e

View File

@ -2534,17 +2534,28 @@ error:
return GST_H265_PARSER_ERROR; return GST_H265_PARSER_ERROR;
} }
static gboolean
nal_reader_has_more_data_in_payload (NalReader * nr,
guint32 payload_start_pos_bit, guint32 payloadSize)
{
if (nal_reader_is_byte_aligned (nr) &&
(nal_reader_get_pos (nr) == (payload_start_pos_bit + 8 * payloadSize)))
return FALSE;
return TRUE;
}
static GstH265ParserResult static GstH265ParserResult
gst_h265_parser_parse_sei_message (GstH265Parser * parser, gst_h265_parser_parse_sei_message (GstH265Parser * parser,
guint8 nal_type, NalReader * nr, GstH265SEIMessage * sei) guint8 nal_type, NalReader * nr, GstH265SEIMessage * sei)
{ {
guint32 payloadSizeBytes; guint32 payloadSize;
guint8 payload_type_byte, payload_size_byte; guint8 payload_type_byte, payload_size_byte;
guint32 remaining, payload_size_bits, next; guint remaining, payload_size;
guint32 payload_start_pos_bit;
GstH265ParserResult res = GST_H265_PARSER_OK; GstH265ParserResult res = GST_H265_PARSER_OK;
GST_DEBUG ("parsing \"SEI message\" %u bits available", GST_DEBUG ("parsing \"Sei message\"");
nal_reader_get_remaining (nr));
memset (sei, 0, sizeof (*sei)); memset (sei, 0, sizeof (*sei));
@ -2552,21 +2563,20 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
READ_UINT8 (nr, payload_type_byte, 8); READ_UINT8 (nr, payload_type_byte, 8);
sei->payloadType += payload_type_byte; sei->payloadType += payload_type_byte;
} while (payload_type_byte == 0xff); } while (payload_type_byte == 0xff);
payloadSizeBytes = 0; payloadSize = 0;
do { do {
READ_UINT8 (nr, payload_size_byte, 8); READ_UINT8 (nr, payload_size_byte, 8);
payloadSizeBytes += payload_size_byte; payloadSize += payload_size_byte;
} }
while (payload_size_byte == 0xff); while (payload_size_byte == 0xff);
remaining = nal_reader_get_remaining (nr); remaining = nal_reader_get_remaining (nr);
payload_size_bits = payload_size = payloadSize * 8 < remaining ? payloadSize * 8 : remaining;
payloadSizeBytes * 8 < remaining ? payloadSizeBytes * 8 : remaining;
next = nal_reader_get_pos (nr) + payload_size_bits;
payload_start_pos_bit = nal_reader_get_pos (nr);
GST_DEBUG GST_DEBUG
("SEI message received: payloadType %u, payloadSize = %u bits", ("SEI message received: payloadType %u, payloadSize = %u bytes",
sei->payloadType, payload_size_bits); sei->payloadType, payload_size);
if (nal_type == GST_H265_NAL_PREFIX_SEI) { if (nal_type == GST_H265_NAL_PREFIX_SEI) {
switch (sei->payloadType) { switch (sei->payloadType) {
@ -2582,7 +2592,7 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
break; break;
case GST_H265_SEI_REGISTERED_USER_DATA: case GST_H265_SEI_REGISTERED_USER_DATA:
res = gst_h265_parser_parse_registered_user_data (parser, res = gst_h265_parser_parse_registered_user_data (parser,
&sei->payload.registered_user_data, nr, payloadSizeBytes); &sei->payload.registered_user_data, nr, payloadSize);
break; break;
case GST_H265_SEI_RECOVERY_POINT: case GST_H265_SEI_RECOVERY_POINT:
res = gst_h265_parser_parse_recovery_point (parser, res = gst_h265_parser_parse_recovery_point (parser,
@ -2603,7 +2613,7 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
default: default:
/* Just consume payloadSize bytes, which does not account for /* Just consume payloadSize bytes, which does not account for
emulation prevention bytes */ emulation prevention bytes */
if (!nal_reader_skip_long (nr, payload_size_bits)) if (!nal_reader_skip_long (nr, payload_size))
goto error; goto error;
res = GST_H265_PARSER_OK; res = GST_H265_PARSER_OK;
break; break;
@ -2613,7 +2623,7 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
default: default:
/* Just consume payloadSize bytes, which does not account for /* Just consume payloadSize bytes, which does not account for
emulation prevention bytes */ emulation prevention bytes */
if (!nal_reader_skip_long (nr, payload_size_bits)) if (!nal_reader_skip_long (nr, payload_size))
goto error; goto error;
res = GST_H265_PARSER_OK; res = GST_H265_PARSER_OK;
break; break;
@ -2626,18 +2636,19 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
* it is present, the size will be less than total PayloadSize since the * it is present, the size will be less than total PayloadSize since the
* size of reserved_payload_extension is supposed to be * size of reserved_payload_extension is supposed to be
* 8 * payloadSize - nEarlierBits - nPayloadZeroBits -1 which means the * 8 * payloadSize - nEarlierBits - nPayloadZeroBits -1 which means the
* the current implementation will still skip all unnecessary bits correctly. */ * the current implementation will still skip all unnecessary bits correctly.
* In theory, we can have a more optimized implementation by skipping the
/* Always make sure all the advertised SEI bits * data left in PayLoadSize without out individually checking for each bits,
* were consumed during parsing. This is sufficient to skip to the next * since the totoal size will be always less than payloadSize*/
* byte aligned position after the SEI payload because we start if (nal_reader_has_more_data_in_payload (nr, payload_start_pos_bit,
* at a byte-aligned position and calculate the 'next' position as a payloadSize)) {
* multiple of 8 bits, and this correctly skips any three-byte emulation /* Skip the byte alignment bits */
* bytes encountered without getting confused. */ if (!nal_reader_skip (nr, 1))
if (next > nal_reader_get_pos (nr)) {
GST_LOG ("Skipping %u unused SEI bits", next - nal_reader_get_pos (nr));
if (!nal_reader_skip_long (nr, next - nal_reader_get_pos (nr)))
goto error; goto error;
while (!nal_reader_is_byte_aligned (nr)) {
if (!nal_reader_skip (nr, 1))
goto error;
}
} }
return res; return res;