Browse Source

avcodec/cbs_av1: fix parsing signed integer values

Reviewed-by: Mark Thompson <sw@jkqxz.net>
Signed-off-by: James Almer <jamrial@gmail.com>
tags/n4.2
James Almer 6 years ago
parent
commit
f0f2832a5c
1 changed files with 9 additions and 21 deletions
  1. +9
    -21
      libavcodec/cbs_av1.c

+ 9
- 21
libavcodec/cbs_av1.c View File

@@ -189,30 +189,26 @@ static int cbs_av1_read_su(CodedBitstreamContext *ctx, GetBitContext *gbc,
int width, const char *name, int width, const char *name,
const int *subscripts, int32_t *write_to) const int *subscripts, int32_t *write_to)
{ {
uint32_t magnitude;
int position, sign;
int position;
int32_t value; int32_t value;


if (ctx->trace_enable) if (ctx->trace_enable)
position = get_bits_count(gbc); position = get_bits_count(gbc);


if (get_bits_left(gbc) < width + 1) {
if (get_bits_left(gbc) < width) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid signed value at " av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid signed value at "
"%s: bitstream ended.\n", name); "%s: bitstream ended.\n", name);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }


magnitude = get_bits(gbc, width);
sign = get_bits1(gbc);
value = sign ? -(int32_t)magnitude : magnitude;
value = get_sbits(gbc, width);


if (ctx->trace_enable) { if (ctx->trace_enable) {
char bits[33]; char bits[33];
int i; int i;
for (i = 0; i < width; i++) for (i = 0; i < width; i++)
bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0';
bits[i] = sign ? '1' : '0';
bits[i + 1] = 0;
bits[i] = value & (1 << (width - i - 1)) ? '1' : '0';
bits[i] = 0;


ff_cbs_trace_syntax_element(ctx, position, ff_cbs_trace_syntax_element(ctx, position,
name, subscripts, bits, value); name, subscripts, bits, value);
@@ -226,29 +222,21 @@ static int cbs_av1_write_su(CodedBitstreamContext *ctx, PutBitContext *pbc,
int width, const char *name, int width, const char *name,
const int *subscripts, int32_t value) const int *subscripts, int32_t value)
{ {
uint32_t magnitude;
int sign;

if (put_bits_left(pbc) < width + 1)
if (put_bits_left(pbc) < width)
return AVERROR(ENOSPC); return AVERROR(ENOSPC);


sign = value < 0;
magnitude = sign ? -value : value;

if (ctx->trace_enable) { if (ctx->trace_enable) {
char bits[33]; char bits[33];
int i; int i;
for (i = 0; i < width; i++) for (i = 0; i < width; i++)
bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0';
bits[i] = sign ? '1' : '0';
bits[i + 1] = 0;
bits[i] = value & (1 << (width - i - 1)) ? '1' : '0';
bits[i] = 0;


ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc), ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
name, subscripts, bits, value); name, subscripts, bits, value);
} }


put_bits(pbc, width, magnitude);
put_bits(pbc, 1, sign);
put_sbits(pbc, width, value);


return 0; return 0;
} }


Loading…
Cancel
Save