| OLD | NEW |
| 1 // Copyright 2011 Google Inc. All Rights Reserved. | 1 // Copyright 2011 Google Inc. All Rights Reserved. |
| 2 // | 2 // |
| 3 // Use of this source code is governed by a BSD-style license | 3 // Use of this source code is governed by a BSD-style license |
| 4 // that can be found in the COPYING file in the root of the source | 4 // that can be found in the COPYING file in the root of the source |
| 5 // tree. An additional intellectual property rights grant can be found | 5 // tree. An additional intellectual property rights grant can be found |
| 6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
| 7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
| 8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
| 9 // | 9 // |
| 10 // Speed-critical encoding functions. | 10 // Speed-critical encoding functions. |
| 11 // | 11 // |
| 12 // Author: Skal (pascal.massimino@gmail.com) | 12 // Author: Skal (pascal.massimino@gmail.com) |
| 13 | 13 |
| 14 #include <assert.h> |
| 14 #include <stdlib.h> // for abs() | 15 #include <stdlib.h> // for abs() |
| 16 |
| 15 #include "./dsp.h" | 17 #include "./dsp.h" |
| 16 #include "../enc/vp8enci.h" | 18 #include "../enc/vp8enci.h" |
| 17 | 19 |
| 18 #if defined(__cplusplus) || defined(c_plusplus) | |
| 19 extern "C" { | |
| 20 #endif | |
| 21 | |
| 22 static WEBP_INLINE uint8_t clip_8b(int v) { | 20 static WEBP_INLINE uint8_t clip_8b(int v) { |
| 23 return (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255; | 21 return (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255; |
| 24 } | 22 } |
| 25 | 23 |
| 26 static WEBP_INLINE int clip_max(int v, int max) { | 24 static WEBP_INLINE int clip_max(int v, int max) { |
| 27 return (v > max) ? max : v; | 25 return (v > max) ? max : v; |
| 28 } | 26 } |
| 29 | 27 |
| 30 //------------------------------------------------------------------------------ | 28 //------------------------------------------------------------------------------ |
| 31 // Compute susceptibility based on DCT-coeff histograms: | 29 // Compute susceptibility based on DCT-coeff histograms: |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 out[ 0] = (a0 + a1) >> 3; | 181 out[ 0] = (a0 + a1) >> 3; |
| 184 out[16] = (a3 + a2) >> 3; | 182 out[16] = (a3 + a2) >> 3; |
| 185 out[32] = (a0 - a1) >> 3; | 183 out[32] = (a0 - a1) >> 3; |
| 186 out[48] = (a3 - a2) >> 3; | 184 out[48] = (a3 - a2) >> 3; |
| 187 out += 64; | 185 out += 64; |
| 188 } | 186 } |
| 189 } | 187 } |
| 190 | 188 |
| 191 static void FTransformWHT(const int16_t* in, int16_t* out) { | 189 static void FTransformWHT(const int16_t* in, int16_t* out) { |
| 192 // input is 12b signed | 190 // input is 12b signed |
| 193 int16_t tmp[16]; | 191 int32_t tmp[16]; |
| 194 int i; | 192 int i; |
| 195 for (i = 0; i < 4; ++i, in += 64) { | 193 for (i = 0; i < 4; ++i, in += 64) { |
| 196 const int a0 = (in[0 * 16] + in[2 * 16]); // 13b | 194 const int a0 = (in[0 * 16] + in[2 * 16]); // 13b |
| 197 const int a1 = (in[1 * 16] + in[3 * 16]); | 195 const int a1 = (in[1 * 16] + in[3 * 16]); |
| 198 const int a2 = (in[1 * 16] - in[3 * 16]); | 196 const int a2 = (in[1 * 16] - in[3 * 16]); |
| 199 const int a3 = (in[0 * 16] - in[2 * 16]); | 197 const int a3 = (in[0 * 16] - in[2 * 16]); |
| 200 tmp[0 + i * 4] = a0 + a1; // 14b | 198 tmp[0 + i * 4] = a0 + a1; // 14b |
| 201 tmp[1 + i * 4] = a3 + a2; | 199 tmp[1 + i * 4] = a3 + a2; |
| 202 tmp[2 + i * 4] = a3 - a2; | 200 tmp[2 + i * 4] = a3 - a2; |
| 203 tmp[3 + i * 4] = a0 - a1; | 201 tmp[3 + i * 4] = a0 - a1; |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 in[j] = out[n] * Q; | 643 in[j] = out[n] * Q; |
| 646 if (out[n]) last = n; | 644 if (out[n]) last = n; |
| 647 } else { | 645 } else { |
| 648 out[n] = 0; | 646 out[n] = 0; |
| 649 in[j] = 0; | 647 in[j] = 0; |
| 650 } | 648 } |
| 651 } | 649 } |
| 652 return (last >= 0); | 650 return (last >= 0); |
| 653 } | 651 } |
| 654 | 652 |
| 653 static int QuantizeBlockWHT(int16_t in[16], int16_t out[16], |
| 654 const VP8Matrix* const mtx) { |
| 655 int n, last = -1; |
| 656 for (n = 0; n < 16; ++n) { |
| 657 const int j = kZigzag[n]; |
| 658 const int sign = (in[j] < 0); |
| 659 const int coeff = sign ? -in[j] : in[j]; |
| 660 assert(mtx->sharpen_[j] == 0); |
| 661 if (coeff > mtx->zthresh_[j]) { |
| 662 const int Q = mtx->q_[j]; |
| 663 const int iQ = mtx->iq_[j]; |
| 664 const int B = mtx->bias_[j]; |
| 665 out[n] = QUANTDIV(coeff, iQ, B); |
| 666 if (out[n] > MAX_LEVEL) out[n] = MAX_LEVEL; |
| 667 if (sign) out[n] = -out[n]; |
| 668 in[j] = out[n] * Q; |
| 669 if (out[n]) last = n; |
| 670 } else { |
| 671 out[n] = 0; |
| 672 in[j] = 0; |
| 673 } |
| 674 } |
| 675 return (last >= 0); |
| 676 } |
| 677 |
| 655 //------------------------------------------------------------------------------ | 678 //------------------------------------------------------------------------------ |
| 656 // Block copy | 679 // Block copy |
| 657 | 680 |
| 658 static WEBP_INLINE void Copy(const uint8_t* src, uint8_t* dst, int size) { | 681 static WEBP_INLINE void Copy(const uint8_t* src, uint8_t* dst, int size) { |
| 659 int y; | 682 int y; |
| 660 for (y = 0; y < size; ++y) { | 683 for (y = 0; y < size; ++y) { |
| 661 memcpy(dst, src, size); | 684 memcpy(dst, src, size); |
| 662 src += BPS; | 685 src += BPS; |
| 663 dst += BPS; | 686 dst += BPS; |
| 664 } | 687 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 679 VP8Intra4Preds VP8EncPredLuma4; | 702 VP8Intra4Preds VP8EncPredLuma4; |
| 680 VP8IntraPreds VP8EncPredLuma16; | 703 VP8IntraPreds VP8EncPredLuma16; |
| 681 VP8IntraPreds VP8EncPredChroma8; | 704 VP8IntraPreds VP8EncPredChroma8; |
| 682 VP8Metric VP8SSE16x16; | 705 VP8Metric VP8SSE16x16; |
| 683 VP8Metric VP8SSE8x8; | 706 VP8Metric VP8SSE8x8; |
| 684 VP8Metric VP8SSE16x8; | 707 VP8Metric VP8SSE16x8; |
| 685 VP8Metric VP8SSE4x4; | 708 VP8Metric VP8SSE4x4; |
| 686 VP8WMetric VP8TDisto4x4; | 709 VP8WMetric VP8TDisto4x4; |
| 687 VP8WMetric VP8TDisto16x16; | 710 VP8WMetric VP8TDisto16x16; |
| 688 VP8QuantizeBlock VP8EncQuantizeBlock; | 711 VP8QuantizeBlock VP8EncQuantizeBlock; |
| 712 VP8QuantizeBlockWHT VP8EncQuantizeBlockWHT; |
| 689 VP8BlockCopy VP8Copy4x4; | 713 VP8BlockCopy VP8Copy4x4; |
| 690 | 714 |
| 691 extern void VP8EncDspInitSSE2(void); | 715 extern void VP8EncDspInitSSE2(void); |
| 692 #if defined(WEBP_USE_NEON) | |
| 693 extern void VP8EncDspInitNEON(void); | 716 extern void VP8EncDspInitNEON(void); |
| 694 #endif | |
| 695 | 717 |
| 696 void VP8EncDspInit(void) { | 718 void VP8EncDspInit(void) { |
| 697 InitTables(); | 719 InitTables(); |
| 698 | 720 |
| 699 // default C implementations | 721 // default C implementations |
| 700 VP8CollectHistogram = CollectHistogram; | 722 VP8CollectHistogram = CollectHistogram; |
| 701 VP8ITransform = ITransform; | 723 VP8ITransform = ITransform; |
| 702 VP8FTransform = FTransform; | 724 VP8FTransform = FTransform; |
| 703 VP8ITransformWHT = ITransformWHT; | 725 VP8ITransformWHT = ITransformWHT; |
| 704 VP8FTransformWHT = FTransformWHT; | 726 VP8FTransformWHT = FTransformWHT; |
| 705 VP8EncPredLuma4 = Intra4Preds; | 727 VP8EncPredLuma4 = Intra4Preds; |
| 706 VP8EncPredLuma16 = Intra16Preds; | 728 VP8EncPredLuma16 = Intra16Preds; |
| 707 VP8EncPredChroma8 = IntraChromaPreds; | 729 VP8EncPredChroma8 = IntraChromaPreds; |
| 708 VP8SSE16x16 = SSE16x16; | 730 VP8SSE16x16 = SSE16x16; |
| 709 VP8SSE8x8 = SSE8x8; | 731 VP8SSE8x8 = SSE8x8; |
| 710 VP8SSE16x8 = SSE16x8; | 732 VP8SSE16x8 = SSE16x8; |
| 711 VP8SSE4x4 = SSE4x4; | 733 VP8SSE4x4 = SSE4x4; |
| 712 VP8TDisto4x4 = Disto4x4; | 734 VP8TDisto4x4 = Disto4x4; |
| 713 VP8TDisto16x16 = Disto16x16; | 735 VP8TDisto16x16 = Disto16x16; |
| 714 VP8EncQuantizeBlock = QuantizeBlock; | 736 VP8EncQuantizeBlock = QuantizeBlock; |
| 737 VP8EncQuantizeBlockWHT = QuantizeBlockWHT; |
| 715 VP8Copy4x4 = Copy4x4; | 738 VP8Copy4x4 = Copy4x4; |
| 716 | 739 |
| 717 // If defined, use CPUInfo() to overwrite some pointers with faster versions. | 740 // If defined, use CPUInfo() to overwrite some pointers with faster versions. |
| 718 if (VP8GetCPUInfo) { | 741 if (VP8GetCPUInfo) { |
| 719 #if defined(WEBP_USE_SSE2) | 742 #if defined(WEBP_USE_SSE2) |
| 720 if (VP8GetCPUInfo(kSSE2)) { | 743 if (VP8GetCPUInfo(kSSE2)) { |
| 721 VP8EncDspInitSSE2(); | 744 VP8EncDspInitSSE2(); |
| 722 } | 745 } |
| 723 #elif defined(WEBP_USE_NEON) | 746 #elif defined(WEBP_USE_NEON) |
| 724 if (VP8GetCPUInfo(kNEON)) { | 747 if (VP8GetCPUInfo(kNEON)) { |
| 725 VP8EncDspInitNEON(); | 748 VP8EncDspInitNEON(); |
| 726 } | 749 } |
| 727 #endif | 750 #endif |
| 728 } | 751 } |
| 729 } | 752 } |
| 730 | 753 |
| 731 #if defined(__cplusplus) || defined(c_plusplus) | |
| 732 } // extern "C" | |
| 733 #endif | |
| OLD | NEW |