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:
parent
7fc6c7633e
commit
1bcb8a7338
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user