mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 02:15:42 +01:00 
			
		
		
		
	remove the special casing for res->first in VP8SetResidualCoeffs
if res->first = 1, coeffs[0]=0 because of quant.c:749 and line
added at quant.c:744
So, no need for the extra case.
Going forward, TrellisQuantizeBlock() should also be calling
a variant of VP8SetResidualCoeffs() to set the 'last' field.
also: fixes a warning for win64
    + slight speed-up
Change-Id: Ib24b611f7396d24aeb5b56dc74d5c39160f048f0
			
			
This commit is contained in:
		| @@ -946,14 +946,14 @@ void VP8SetResidualCoeffsSSE2(const int16_t* const coeffs, | |||||||
|   // Get the comparison results as a bitmask, consisting of two times 16 bits: |   // Get the comparison results as a bitmask, consisting of two times 16 bits: | ||||||
|   // two identical bits for each result. Concatenate both bitmasks to get a |   // two identical bits for each result. Concatenate both bitmasks to get a | ||||||
|   // single 32 bit value. Negate the mask to get the position of entries that |   // single 32 bit value. Negate the mask to get the position of entries that | ||||||
|   // are not equal to zero. Finally, mask out least significant bits according |   // are not equal to zero. We don't need to mask out least significant bits | ||||||
|   // to res->first. |   // according to res->first, since coeffs[0] is 0 if res->first > 0 | ||||||
|   const uint32_t mask = |   const uint32_t mask = | ||||||
|       ~(((uint32_t)_mm_movemask_epi8(m1) << 16) | _mm_movemask_epi8(m0)) & |       ~(((uint32_t)_mm_movemask_epi8(m1) << 16) | _mm_movemask_epi8(m0)); | ||||||
|       -(1U << (res->first << 1)); |  | ||||||
|   // The position of the most significant non-zero bit indicates the position of |   // The position of the most significant non-zero bit indicates the position of | ||||||
|   // the last non-zero value. Divide the result by two because __movemask_epi8 |   // the last non-zero value. Divide the result by two because __movemask_epi8 | ||||||
|   // operates on 8 bit values instead of 16 bit values. |   // operates on 8 bit values instead of 16 bit values. | ||||||
|  |   assert(res->first == 0 || coeffs[0] == 0); | ||||||
|   res->last = mask ? (BitsLog2Floor(mask) >> 1) : -1; |   res->last = mask ? (BitsLog2Floor(mask) >> 1) : -1; | ||||||
|   res->coeffs = coeffs; |   res->coeffs = coeffs; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -562,7 +562,8 @@ static void SetResidualCoeffs(const int16_t* const coeffs, | |||||||
|                               VP8Residual* const res) { |                               VP8Residual* const res) { | ||||||
|   int n; |   int n; | ||||||
|   res->last = -1; |   res->last = -1; | ||||||
|   for (n = 15; n >= res->first; --n) { |   assert(res->first == 0 || coeffs[0] == 0); | ||||||
|  |   for (n = 15; n >= 0; --n) { | ||||||
|     if (coeffs[n]) { |     if (coeffs[n]) { | ||||||
|       res->last = n; |       res->last = n; | ||||||
|       break; |       break; | ||||||
|   | |||||||
| @@ -741,13 +741,17 @@ static int ReconstructIntra16(VP8EncIterator* const it, | |||||||
|             TrellisQuantizeBlock(enc, tmp[n], rd->y_ac_levels[n], ctx, 0, |             TrellisQuantizeBlock(enc, tmp[n], rd->y_ac_levels[n], ctx, 0, | ||||||
|                                  &dqm->y1_, dqm->lambda_trellis_i16_); |                                  &dqm->y1_, dqm->lambda_trellis_i16_); | ||||||
|         it->top_nz_[x] = it->left_nz_[y] = non_zero; |         it->top_nz_[x] = it->left_nz_[y] = non_zero; | ||||||
|  |         rd->y_ac_levels[n][0] = 0; | ||||||
|         nz |= non_zero << n; |         nz |= non_zero << n; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } else { |   } else { | ||||||
|     for (n = 0; n < 16; ++n) { |     for (n = 0; n < 16; ++n) { | ||||||
|       tmp[n][0] = 0;  // so that nz is correct below |       // Zero-out the first coeff, so that: a) nz is correct below, and | ||||||
|  |       // b) finding 'last' non-zero coeffs in SetResidualCoeffs() is simplified. | ||||||
|  |       tmp[n][0] = 0; | ||||||
|       nz |= VP8EncQuantizeBlock(tmp[n], rd->y_ac_levels[n], &dqm->y1_) << n; |       nz |= VP8EncQuantizeBlock(tmp[n], rd->y_ac_levels[n], &dqm->y1_) << n; | ||||||
|  |       assert(rd->y_ac_levels[n][0] == 0); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user