diff options
Diffstat (limited to 'contrib/ffmpeg/A07-cbs-av1-sint-parse.patch')
-rw-r--r-- | contrib/ffmpeg/A07-cbs-av1-sint-parse.patch | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/contrib/ffmpeg/A07-cbs-av1-sint-parse.patch b/contrib/ffmpeg/A07-cbs-av1-sint-parse.patch new file mode 100644 index 000000000..ce09f2503 --- /dev/null +++ b/contrib/ffmpeg/A07-cbs-av1-sint-parse.patch @@ -0,0 +1,89 @@ +From a9e9303f26597b2a166374cd46b00adc0401e634 Mon Sep 17 00:00:00 2001 +From: James Almer <[email protected]> +Date: Sat, 10 Nov 2018 22:52:12 -0300 +Subject: [PATCH] avcodec/cbs_av1: fix parsing signed integer values + +Reviewed-by: Mark Thompson <[email protected]> +Signed-off-by: James Almer <[email protected]> +(cherry picked from commit f0f2832a5ce93bad9b1d29f99df6bda2380fc41c) +--- + libavcodec/cbs_av1.c | 30 +++++++++--------------------- + 1 file changed, 9 insertions(+), 21 deletions(-) + +diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c +index ff32a6f..ed5211b 100644 +--- a/libavcodec/cbs_av1.c ++++ b/libavcodec/cbs_av1.c +@@ -189,30 +189,26 @@ static int cbs_av1_read_su(CodedBitstreamContext *ctx, GetBitContext *gbc, + int width, const char *name, + const int *subscripts, int32_t *write_to) + { +- uint32_t magnitude; +- int position, sign; ++ int position; + int32_t value; + + if (ctx->trace_enable) + 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 " + "%s: bitstream ended.\n", name); + 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) { + char bits[33]; + int 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, + name, subscripts, bits, value); +@@ -226,29 +222,21 @@ static int cbs_av1_write_su(CodedBitstreamContext *ctx, PutBitContext *pbc, + int width, const char *name, + 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); + +- sign = value < 0; +- magnitude = sign ? -value : value; +- + if (ctx->trace_enable) { + char bits[33]; + int 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), + name, subscripts, bits, value); + } + +- put_bits(pbc, width, magnitude); +- put_bits(pbc, 1, sign); ++ put_sbits(pbc, width, value); + + return 0; + } +-- +1.9.1 + |