mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 02:15:42 +01:00 
			
		
		
		
	unroll the kBands[] indirection to remove a dereference in GetCoeffs()
speed-up is small but visible. Change-Id: Icff546adc3276f3c3d46b147c4a735b5eb8ff22e
This commit is contained in:
		| @@ -494,6 +494,12 @@ static const uint8_t | |||||||
| }; | }; | ||||||
|  |  | ||||||
| // Paragraph 9.9 | // Paragraph 9.9 | ||||||
|  |  | ||||||
|  | static const int kBands[16 + 1] = { | ||||||
|  |   0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, | ||||||
|  |   0  // extra entry as sentinel | ||||||
|  | }; | ||||||
|  |  | ||||||
| void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { | void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { | ||||||
|   VP8Proba* const proba = &dec->proba_; |   VP8Proba* const proba = &dec->proba_; | ||||||
|   int t, b, c, p; |   int t, b, c, p; | ||||||
| @@ -507,6 +513,9 @@ void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     for (b = 0; b < 16 + 1; ++b) { | ||||||
|  |       proba->bands_ptr_[t][b] = &proba->bands_[t][kBands[b]]; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   dec->use_skip_proba_ = VP8Get(br); |   dec->use_skip_proba_ = VP8Get(br); | ||||||
|   if (dec->use_skip_proba_) { |   if (dec->use_skip_proba_) { | ||||||
|   | |||||||
| @@ -371,11 +371,6 @@ int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) { | |||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| // Residual decoding (Paragraph 13.2 / 13.3) | // Residual decoding (Paragraph 13.2 / 13.3) | ||||||
|  |  | ||||||
| static const int kBands[16 + 1] = { |  | ||||||
|   0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, |  | ||||||
|   0  // extra entry as sentinel |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| static const uint8_t kCat3[] = { 173, 148, 140, 0 }; | static const uint8_t kCat3[] = { 173, 148, 140, 0 }; | ||||||
| static const uint8_t kCat4[] = { 176, 155, 140, 135, 0 }; | static const uint8_t kCat4[] = { 176, 155, 140, 135, 0 }; | ||||||
| static const uint8_t kCat5[] = { 180, 157, 141, 134, 130, 0 }; | static const uint8_t kCat5[] = { 180, 157, 141, 134, 130, 0 }; | ||||||
| @@ -419,20 +414,19 @@ static int GetLargeValue(VP8BitReader* const br, const uint8_t* const p) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // Returns the position of the last non-zero coeff plus one | // Returns the position of the last non-zero coeff plus one | ||||||
| static int GetCoeffs(VP8BitReader* const br, const VP8BandProbas* const prob, | static int GetCoeffs(VP8BitReader* const br, const VP8BandProbas* const prob[], | ||||||
|                      int ctx, const quant_t dq, int n, int16_t* out) { |                      int ctx, const quant_t dq, int n, int16_t* out) { | ||||||
|   // n is either 0 or 1 here. kBands[n] is not necessary for extracting '*p'. |   const uint8_t* p = prob[n]->probas_[ctx]; | ||||||
|   const uint8_t* p = prob[n].probas_[ctx]; |  | ||||||
|   for (; n < 16; ++n) { |   for (; n < 16; ++n) { | ||||||
|     if (!VP8GetBit(br, p[0])) { |     if (!VP8GetBit(br, p[0])) { | ||||||
|       return n;  // previous coeff was last non-zero coeff |       return n;  // previous coeff was last non-zero coeff | ||||||
|     } |     } | ||||||
|     while (!VP8GetBit(br, p[1])) {       // sequence of zero coeffs |     while (!VP8GetBit(br, p[1])) {       // sequence of zero coeffs | ||||||
|       p = prob[kBands[++n]].probas_[0]; |       p = prob[++n]->probas_[0]; | ||||||
|       if (n == 16) return 16; |       if (n == 16) return 16; | ||||||
|     } |     } | ||||||
|     {        // non zero coeff |     {        // non zero coeff | ||||||
|       const VP8ProbaArray* const p_ctx = &prob[kBands[n + 1]].probas_[0]; |       const VP8ProbaArray* const p_ctx = &prob[n + 1]->probas_[0]; | ||||||
|       int v; |       int v; | ||||||
|       if (!VP8GetBit(br, p[2])) { |       if (!VP8GetBit(br, p[2])) { | ||||||
|         v = 1; |         v = 1; | ||||||
| @@ -455,8 +449,8 @@ static WEBP_INLINE uint32_t NzCodeBits(uint32_t nz_coeffs, int nz, int dc_nz) { | |||||||
|  |  | ||||||
| static int ParseResiduals(VP8Decoder* const dec, | static int ParseResiduals(VP8Decoder* const dec, | ||||||
|                           VP8MB* const mb, VP8BitReader* const token_br) { |                           VP8MB* const mb, VP8BitReader* const token_br) { | ||||||
|   VP8BandProbas (* const bands)[NUM_BANDS] = dec->proba_.bands_; |   const VP8BandProbas* (* const bands)[16 + 1] = dec->proba_.bands_ptr_; | ||||||
|   const VP8BandProbas* ac_proba; |   const VP8BandProbas* const * ac_proba; | ||||||
|   VP8MBData* const block = dec->mb_data_ + dec->mb_x_; |   VP8MBData* const block = dec->mb_data_ + dec->mb_x_; | ||||||
|   const VP8QuantMatrix* const q = &dec->dqm_[block->segment_]; |   const VP8QuantMatrix* const q = &dec->dqm_[block->segment_]; | ||||||
|   int16_t* dst = block->coeffs_; |   int16_t* dst = block->coeffs_; | ||||||
|   | |||||||
| @@ -141,6 +141,7 @@ typedef struct { | |||||||
|   uint8_t segments_[MB_FEATURE_TREE_PROBS]; |   uint8_t segments_[MB_FEATURE_TREE_PROBS]; | ||||||
|   // Type: 0:Intra16-AC  1:Intra16-DC   2:Chroma   3:Intra4 |   // Type: 0:Intra16-AC  1:Intra16-DC   2:Chroma   3:Intra4 | ||||||
|   VP8BandProbas bands_[NUM_TYPES][NUM_BANDS]; |   VP8BandProbas bands_[NUM_TYPES][NUM_BANDS]; | ||||||
|  |   const VP8BandProbas* bands_ptr_[NUM_TYPES][16 + 1]; | ||||||
| } VP8Proba; | } VP8Proba; | ||||||
|  |  | ||||||
| // Filter parameters | // Filter parameters | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user