From a1f15814be0eb9921a6b5bb102354df7eeb936b2 Mon Sep 17 00:00:00 2001 From: John Koleszar Date: Tue, 27 Nov 2012 11:16:15 -0800 Subject: Clamp decoded feature data Not all segment feature data elements are full-range powers of two, so there are values that can be encoded that are invalid. Add a new function to clamp values to the maximum allowed. Change-Id: Ie47cb80ef2d54292e6b8db9f699c57214a915bc4 --- vp9/encoder/vp9_bitstream.c | 12 ++++++------ vp9/encoder/vp9_boolhuff.c | 11 ++++++++++- vp9/encoder/vp9_boolhuff.h | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) (limited to 'vp9/encoder') diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index ae8a7c616..73c116766 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -1911,19 +1911,19 @@ void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest, // Encode the relevant feature data if (Data < 0) { Data = - Data; - vp9_write_literal(&header_bc, Data, - vp9_seg_feature_data_bits(j)); + vp9_encode_unsigned_max(&header_bc, Data, + vp9_seg_feature_data_max(j)); vp9_write_bit(&header_bc, 1); } else { - vp9_write_literal(&header_bc, Data, - vp9_seg_feature_data_bits(j)); + vp9_encode_unsigned_max(&header_bc, Data, + vp9_seg_feature_data_max(j)); vp9_write_bit(&header_bc, 0); } } // Unsigned data element so no sign bit needed else - vp9_write_literal(&header_bc, Data, - vp9_seg_feature_data_bits(j)); + vp9_encode_unsigned_max(&header_bc, Data, + vp9_seg_feature_data_max(j)); } else vp9_write_bit(&header_bc, 0); } diff --git a/vp9/encoder/vp9_boolhuff.c b/vp9/encoder/vp9_boolhuff.c index 7619dfadf..2689ab601 100644 --- a/vp9/encoder/vp9_boolhuff.c +++ b/vp9/encoder/vp9_boolhuff.c @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ - +#include #include "vp9_boolhuff.h" #if defined(SECTIONBITS_OUTPUT) @@ -64,6 +64,15 @@ void vp9_encode_value(BOOL_CODER *br, int data, int bits) { encode_bool(br, (1 & (data >> bit)), 0x80); } +void vp9_encode_unsigned_max(BOOL_CODER *br, int data, int max) { + assert(data <= max); + while (max) { + encode_bool(br, data & 1, 128); + data >>= 1; + max >>= 1; + } +} + int vp9_recenter_nonneg(int v, int m) { if (v > (m << 1)) return v; else if (v >= m) return ((v - m) << 1); diff --git a/vp9/encoder/vp9_boolhuff.h b/vp9/encoder/vp9_boolhuff.h index 2fad86b2e..1958a41e1 100644 --- a/vp9/encoder/vp9_boolhuff.h +++ b/vp9/encoder/vp9_boolhuff.h @@ -37,6 +37,7 @@ typedef struct { extern void vp9_start_encode(BOOL_CODER *bc, unsigned char *buffer); extern void vp9_encode_value(BOOL_CODER *br, int data, int bits); +extern void vp9_encode_unsigned_max(BOOL_CODER *br, int data, int max); extern void vp9_stop_encode(BOOL_CODER *bc); extern const unsigned int vp9_prob_cost[256]; -- cgit v1.2.3