LCOV - code coverage report
Current view: top level - libavcodec - wavpack.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 20 21 95.2 %
Date: 2017-12-11 20:48:03 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*
       2             :  * WavPack decoder/encoder common code
       3             :  * Copyright (c) 2006,2011 Konstantin Shishkov
       4             :  *
       5             :  * This file is part of FFmpeg.
       6             :  *
       7             :  * FFmpeg is free software; you can redistribute it and/or
       8             :  * modify it under the terms of the GNU Lesser General Public
       9             :  * License as published by the Free Software Foundation; either
      10             :  * version 2.1 of the License, or (at your option) any later version.
      11             :  *
      12             :  * FFmpeg is distributed in the hope that it will be useful,
      13             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15             :  * Lesser General Public License for more details.
      16             :  *
      17             :  * You should have received a copy of the GNU Lesser General Public
      18             :  * License along with FFmpeg; if not, write to the Free Software
      19             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      20             :  */
      21             : 
      22             : #ifndef AVCODEC_WAVPACK_H
      23             : #define AVCODEC_WAVPACK_H
      24             : 
      25             : #include "libavutil/common.h"
      26             : 
      27             : #define MAX_TERMS      16
      28             : #define MAX_TERM        8
      29             : 
      30             : #define WV_HEADER_SIZE    32
      31             : 
      32             : #define WV_MONO           0x00000004
      33             : #define WV_JOINT_STEREO   0x00000010
      34             : #define WV_CROSS_DECORR   0x00000020
      35             : #define WV_FLOAT_DATA     0x00000080
      36             : #define WV_INT32_DATA     0x00000100
      37             : #define WV_FALSE_STEREO   0x40000000
      38             : 
      39             : #define WV_HYBRID_MODE    0x00000008
      40             : #define WV_HYBRID_SHAPE   0x00000008
      41             : #define WV_HYBRID_BITRATE 0x00000200
      42             : #define WV_HYBRID_BALANCE 0x00000400
      43             : #define WV_INITIAL_BLOCK  0x00000800
      44             : #define WV_FINAL_BLOCK    0x00001000
      45             : 
      46             : #define WV_MONO_DATA    (WV_MONO | WV_FALSE_STEREO)
      47             : 
      48             : #define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK)
      49             : 
      50             : #define WV_FLT_SHIFT_ONES 0x01
      51             : #define WV_FLT_SHIFT_SAME 0x02
      52             : #define WV_FLT_SHIFT_SENT 0x04
      53             : #define WV_FLT_ZERO_SENT  0x08
      54             : #define WV_FLT_ZERO_SIGN  0x10
      55             : 
      56             : #define WV_MAX_SAMPLES    150000
      57             : 
      58             : enum WP_ID_Flags {
      59             :     WP_IDF_MASK   = 0x3F,
      60             :     WP_IDF_IGNORE = 0x20,
      61             :     WP_IDF_ODD    = 0x40,
      62             :     WP_IDF_LONG   = 0x80
      63             : };
      64             : 
      65             : enum WP_ID {
      66             :     WP_ID_DUMMY = 0,
      67             :     WP_ID_ENCINFO,
      68             :     WP_ID_DECTERMS,
      69             :     WP_ID_DECWEIGHTS,
      70             :     WP_ID_DECSAMPLES,
      71             :     WP_ID_ENTROPY,
      72             :     WP_ID_HYBRID,
      73             :     WP_ID_SHAPING,
      74             :     WP_ID_FLOATINFO,
      75             :     WP_ID_INT32INFO,
      76             :     WP_ID_DATA,
      77             :     WP_ID_CORR,
      78             :     WP_ID_EXTRABITS,
      79             :     WP_ID_CHANINFO,
      80             :     WP_ID_SAMPLE_RATE = 0x27,
      81             : };
      82             : 
      83             : typedef struct Decorr {
      84             :     int delta;
      85             :     int value;
      86             :     int weightA;
      87             :     int weightB;
      88             :     int samplesA[MAX_TERM];
      89             :     int samplesB[MAX_TERM];
      90             :     int sumA;
      91             :     int sumB;
      92             : } Decorr;
      93             : 
      94             : typedef struct WvChannel {
      95             :     int median[3];
      96             :     int slow_level, error_limit;
      97             :     unsigned bitrate_acc, bitrate_delta;
      98             : } WvChannel;
      99             : 
     100             : // macros for manipulating median values
     101             : #define GET_MED(n) ((c->median[n] >> 4) + 1)
     102             : #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> (n)) - 2) / (128 >> (n))) * 2U
     103             : #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> (n))    ) / (128 >> (n))) * 5U
     104             : 
     105             : // macros for applying weight
     106             : #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
     107             :     if ((samples) && (in)) { \
     108             :         if (((samples) ^ (in)) < 0) { \
     109             :             (weight) -= (delta); \
     110             :             if ((weight) < -1024) \
     111             :                 (weight) = -1024; \
     112             :         } else { \
     113             :             (weight) += (delta); \
     114             :             if ((weight) > 1024) \
     115             :                 (weight) = 1024; \
     116             :         } \
     117             :     }
     118             : 
     119             : static const int wv_rates[16] = {
     120             :      6000,  8000,  9600, 11025, 12000, 16000,  22050, 24000,
     121             :     32000, 44100, 48000, 64000, 88200, 96000, 192000,     0
     122             : };
     123             : 
     124             : // exponent table copied from WavPack source
     125             : static const uint8_t wp_exp2_table[256] = {
     126             :     0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
     127             :     0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
     128             :     0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
     129             :     0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
     130             :     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
     131             :     0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
     132             :     0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
     133             :     0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
     134             :     0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
     135             :     0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
     136             :     0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
     137             :     0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
     138             :     0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
     139             :     0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
     140             :     0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
     141             :     0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
     142             : };
     143             : 
     144             : static const uint8_t wp_log2_table [] = {
     145             :     0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
     146             :     0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
     147             :     0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
     148             :     0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
     149             :     0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
     150             :     0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
     151             :     0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
     152             :     0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
     153             :     0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
     154             :     0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
     155             :     0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
     156             :     0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
     157             :     0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
     158             :     0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
     159             :     0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
     160             :     0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
     161             : };
     162             : 
     163    59970729 : static av_always_inline int wp_exp2(int16_t val)
     164             : {
     165    59970729 :     int res, neg = 0;
     166             : 
     167    59970729 :     if (val < 0) {
     168        3822 :         val = -val;
     169        3822 :         neg = 1;
     170             :     }
     171             : 
     172    59970729 :     res   = wp_exp2_table[val & 0xFF] | 0x100;
     173    59970729 :     val >>= 8;
     174    59970729 :     if (val > 31U)
     175           0 :         return INT_MIN;
     176    59970729 :     res   = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
     177    59970729 :     return neg ? -res : res;
     178             : }
     179             : 
     180    59878828 : static av_always_inline int wp_log2(uint32_t val)
     181             : {
     182             :     int bits;
     183             : 
     184    59878828 :     if (!val)
     185     2356777 :         return 0;
     186    57522051 :     if (val == 1)
     187     4010746 :         return 256;
     188    53511305 :     val += val >> 9;
     189    53511305 :     bits = av_log2(val) + 1;
     190    53511305 :     if (bits < 9)
     191    27967183 :         return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
     192             :     else
     193    25544122 :         return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
     194             : }
     195             : 
     196             : #endif /* AVCODEC_WAVPACK_H */

Generated by: LCOV version 1.13