1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avcodec/evc_parser: use a GetBitContext to parse entire NALUs

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2023-06-20 11:15:51 -03:00
parent 7fc6c7633e
commit 1bcb8a7338
3 changed files with 13 additions and 63 deletions

View File

@ -21,28 +21,6 @@
#include "evc.h"
#include "evc_parse.h"
// nuh_temporal_id specifies a temporal identifier for the NAL unit
int ff_evc_get_temporal_id(const uint8_t *bits, int bits_size, void *logctx)
{
int temporal_id = 0;
uint16_t t = 0;
if (bits_size < EVC_NALU_HEADER_SIZE) {
av_log(logctx, AV_LOG_ERROR, "Can't read NAL unit header\n");
return 0;
}
// forbidden_zero_bit
if ((bits[0] & 0x80) != 0)
return -1;
t = AV_RB16(bits);
temporal_id = (t >> 6) & 0x0007;
return temporal_id;
}
// @see ISO_IEC_23094-1 (7.3.2.6 Slice layer RBSP syntax)
int ff_evc_parse_slice_header(GetBitContext *gb, EVCParserSliceHeader *sh,
const EVCParamSets *ps, enum EVCNALUnitType nalu_type)

View File

@ -81,25 +81,6 @@ typedef struct EVCParserPoc {
int DocOffset; // the decoding order count of the previous picture
} EVCParserPoc;
static inline int evc_get_nalu_type(const uint8_t *bits, int bits_size, void *logctx)
{
int unit_type_plus1 = 0;
if (bits_size >= EVC_NALU_HEADER_SIZE) {
unsigned char *p = (unsigned char *)bits;
// forbidden_zero_bit
if ((p[0] & 0x80) != 0) {
av_log(logctx, AV_LOG_ERROR, "Invalid NAL unit header\n");
return -1;
}
// nal_unit_type
unit_type_plus1 = (p[0] >> 1) & 0x3F;
}
return unit_type_plus1 - 1;
}
static inline uint32_t evc_read_nal_unit_length(const uint8_t *bits, int bits_size, void *logctx)
{
uint32_t nalu_len = 0;
@ -114,9 +95,6 @@ static inline uint32_t evc_read_nal_unit_length(const uint8_t *bits, int bits_si
return nalu_len;
}
// nuh_temporal_id specifies a temporal identifier for the NAL unit
int ff_evc_get_temporal_id(const uint8_t *bits, int bits_size, void *logctx);
int ff_evc_parse_slice_header(GetBitContext *gb, EVCParserSliceHeader *sh,
const EVCParamSets *ps, enum EVCNALUnitType nalu_type);

View File

@ -71,28 +71,29 @@ static int parse_nal_unit(AVCodecParserContext *s, AVCodecContext *avctx,
return AVERROR_INVALIDDATA;
}
ret = init_get_bits8(&gb, buf, buf_size);
if (ret < 0)
return ret;
// @see ISO_IEC_23094-1_2020, 7.4.2.2 NAL unit header semantic (Table 4 - NAL unit type codes and NAL unit type classes)
// @see enum EVCNALUnitType in evc.h
nalu_type = evc_get_nalu_type(buf, buf_size, avctx);
if (get_bits1(&gb)) {// forbidden_zero_bit
av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit header\n");
return AVERROR_INVALIDDATA;
}
nalu_type = get_bits(&gb, 6) - 1;
if (nalu_type < EVC_NOIDR_NUT || nalu_type > EVC_UNSPEC_NUT62) {
av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit type: (%d)\n", nalu_type);
return AVERROR_INVALIDDATA;
}
tid = ff_evc_get_temporal_id(buf, buf_size, avctx);
if (tid < 0) {
av_log(avctx, AV_LOG_ERROR, "Invalid temporial id: (%d)\n", tid);
return AVERROR_INVALIDDATA;
}
buf += EVC_NALU_HEADER_SIZE;
buf_size -= EVC_NALU_HEADER_SIZE;
tid = get_bits(&gb, 3);
skip_bits(&gb, 5); // nuh_reserved_zero_5bits
skip_bits1(&gb); // nuh_extension_flag
switch (nalu_type) {
case EVC_SPS_NUT:
ret = init_get_bits8(&gb, buf, buf_size);
if (ret < 0)
return ret;
ret = ff_evc_parse_sps(&gb, &ctx->ps);
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "SPS parsing error\n");
@ -100,9 +101,6 @@ static int parse_nal_unit(AVCodecParserContext *s, AVCodecContext *avctx,
}
break;
case EVC_PPS_NUT:
ret = init_get_bits8(&gb, buf, buf_size);
if (ret < 0)
return ret;
ret = ff_evc_parse_pps(&gb, &ctx->ps);
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "PPS parsing error\n");
@ -116,10 +114,6 @@ static int parse_nal_unit(AVCodecParserContext *s, AVCodecContext *avctx,
EVCParserSliceHeader sh;
int bit_depth;
ret = init_get_bits8(&gb, buf, buf_size);
if (ret < 0)
return ret;
ret = ff_evc_parse_slice_header(&gb, &sh, &ctx->ps, nalu_type);
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Slice header parsing error\n");