summaryrefslogtreecommitdiffstats
path: root/contrib/ffmpeg/A07-cbs-av1-sint-parse.patch
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ffmpeg/A07-cbs-av1-sint-parse.patch')
-rw-r--r--contrib/ffmpeg/A07-cbs-av1-sint-parse.patch89
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
+