annotate wavpack.c @ 10952:ea8f891d997d libavcodec

H264 DXVA2 implementation It allows VLD H264 decoding using DXVA2 (GPU assisted decoding API under VISTA and Windows 7). It is implemented by using AVHWAccel API. It has been tested successfully for some time in VLC using an nvidia card on Windows 7. To compile it, you need to have the system header dxva2api.h (either from microsoft or using http://downloads.videolan.org/pub/videolan/testing/contrib/dxva2api.h) The generated libavcodec.dll does not depend directly on any new lib as the necessary objects are given by the application using FFmpeg.
author fenrir
date Wed, 20 Jan 2010 18:54:51 +0000
parents 95f3daa991a2
children dfeaae916502
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
1 /*
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
2 * WavPack lossless audio decoder
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
16 *
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
20 */
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
21 #define ALT_BITSTREAM_READER_LE
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
22 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
23 #include "get_bits.h"
5605
d92fa6e5fc8c move get_unary() to its own file
aurel
parents: 5539
diff changeset
24 #include "unary.h"
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
25
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
26 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8607
diff changeset
27 * @file libavcodec/wavpack.c
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
28 * WavPack lossless audio decoder
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
29 */
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
30
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
31 #define WV_MONO 0x00000004
5538
33a32de3c1bc Rename flag for consistency with the next commit
kostya
parents: 5510
diff changeset
32 #define WV_JOINT_STEREO 0x00000010
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
33 #define WV_FALSE_STEREO 0x40000000
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
34
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
35 #define WV_HYBRID_MODE 0x00000008
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
36 #define WV_HYBRID_SHAPE 0x00000008
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
37 #define WV_HYBRID_BITRATE 0x00000200
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
38 #define WV_HYBRID_BALANCE 0x00000400
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
39
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
40 #define WV_FLT_SHIFT_ONES 0x01
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
41 #define WV_FLT_SHIFT_SAME 0x02
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
42 #define WV_FLT_SHIFT_SENT 0x04
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
43 #define WV_FLT_ZERO_SENT 0x08
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
44 #define WV_FLT_ZERO_SIGN 0x10
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
45
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
46 enum WP_ID_Flags{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
47 WP_IDF_MASK = 0x1F,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
48 WP_IDF_IGNORE = 0x20,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
49 WP_IDF_ODD = 0x40,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
50 WP_IDF_LONG = 0x80
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
51 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
52
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
53 enum WP_ID{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
54 WP_ID_DUMMY = 0,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
55 WP_ID_ENCINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
56 WP_ID_DECTERMS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
57 WP_ID_DECWEIGHTS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
58 WP_ID_DECSAMPLES,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
59 WP_ID_ENTROPY,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
60 WP_ID_HYBRID,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
61 WP_ID_SHAPING,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
62 WP_ID_FLOATINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
63 WP_ID_INT32INFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
64 WP_ID_DATA,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
65 WP_ID_CORR,
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
66 WP_ID_EXTRABITS,
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
67 WP_ID_CHANINFO
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
68 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
69
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
70 #define MAX_TERMS 16
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
71
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
72 typedef struct Decorr {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
73 int delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
74 int value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
75 int weightA;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
76 int weightB;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
77 int samplesA[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
78 int samplesB[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
79 } Decorr;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
80
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
81 typedef struct WvChannel {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
82 int median[3];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
83 int slow_level, error_limit;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
84 int bitrate_acc, bitrate_delta;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
85 } WvChannel;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
86
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
87 typedef struct WavpackContext {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
88 AVCodecContext *avctx;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
89 int frame_flags;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
90 int stereo, stereo_in;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
91 int joint;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
92 uint32_t CRC;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
93 GetBitContext gb;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
94 int got_extra_bits;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
95 uint32_t crc_extra_bits;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
96 GetBitContext gb_extra_bits;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
97 int data_size; // in bits
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
98 int samples;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
99 int terms;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
100 Decorr decorr[MAX_TERMS];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
101 int zero, one, zeroes;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
102 int extra_bits;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
103 int and, or, shift;
9542
c110790496ff Shift 9-15 bit samples to use full 16-bit range.
kostya
parents: 9428
diff changeset
104 int post_shift;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
105 int hybrid, hybrid_bitrate;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
106 int float_flag;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
107 int float_shift;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
108 int float_max_exp;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
109 WvChannel ch[2];
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
110 } WavpackContext;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
111
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
112 // exponent table copied from WavPack source
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
113 static const uint8_t wp_exp2_table [256] = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
114 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
115 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
116 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
117 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
118 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
119 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
120 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
121 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
122 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
123 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
124 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
125 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
126 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
127 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
128 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
129 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
130 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
131
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
132 static const uint8_t wp_log2_table [] = {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
133 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
134 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
135 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
136 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
137 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
138 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
139 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
140 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
141 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
142 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
143 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
144 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
145 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
146 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
147 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
148 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
149 };
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
150
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4021
diff changeset
151 static av_always_inline int wp_exp2(int16_t val)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
152 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
153 int res, neg = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
154
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
155 if(val < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
156 val = -val;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
157 neg = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
158 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
159
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
160 res = wp_exp2_table[val & 0xFF] | 0x100;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
161 val >>= 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
162 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
163 return neg ? -res : res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
164 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
165
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
166 static av_always_inline int wp_log2(int32_t val)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
167 {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
168 int bits;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
169
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
170 if(!val)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
171 return 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
172 if(val == 1)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
173 return 256;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
174 val += val >> 9;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
175 bits = av_log2(val) + 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
176 if(bits < 9)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
177 return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
178 else
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
179 return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
180 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
181
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
182 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
183
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
184 // macros for manipulating median values
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
185 #define GET_MED(n) ((c->median[n] >> 4) + 1)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
186 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128>>n) - 2) / (128>>n)) * 2
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
187 #define INC_MED(n) c->median[n] += ((c->median[n] + (128>>n)) / (128>>n)) * 5
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
188
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
189 // macros for applying weight
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
190 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
191 if(samples && in){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
192 if((samples ^ in) < 0){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
193 weight -= delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
194 if(weight < -1024) weight = -1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
195 }else{ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
196 weight += delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
197 if(weight > 1024) weight = 1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
198 } \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
199 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
200
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
201
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4021
diff changeset
202 static av_always_inline int get_tail(GetBitContext *gb, int k)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
203 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
204 int p, e, res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
205
4421
41ee67dd4bef Coded residual in WavPack may be > 0xFFFF
kostya
parents: 4364
diff changeset
206 if(k<1)return 0;
41ee67dd4bef Coded residual in WavPack may be > 0xFFFF
kostya
parents: 4364
diff changeset
207 p = av_log2(k);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
208 e = (1 << (p + 1)) - k - 1;
3782
a8b80c80494b Handle case of get_bits(0)
kostya
parents: 3764
diff changeset
209 res = p ? get_bits(gb, p) : 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
210 if(res >= e){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
211 res = (res<<1) - e + get_bits1(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
212 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
213 return res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
214 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
215
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
216 static void update_error_limit(WavpackContext *ctx)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
217 {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
218 int i, br[2], sl[2];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
219
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
220 for(i = 0; i <= ctx->stereo_in; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
221 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
222 br[i] = ctx->ch[i].bitrate_acc >> 16;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
223 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
224 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
225 if(ctx->stereo_in && ctx->hybrid_bitrate){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
226 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
227 if(balance > br[0]){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
228 br[1] = br[0] << 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
229 br[0] = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
230 }else if(-balance > br[0]){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
231 br[0] <<= 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
232 br[1] = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
233 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
234 br[1] = br[0] + balance;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
235 br[0] = br[0] - balance;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
236 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
237 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
238 for(i = 0; i <= ctx->stereo_in; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
239 if(ctx->hybrid_bitrate){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
240 if(sl[i] - br[i] > -0x100)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
241 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
242 else
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
243 ctx->ch[i].error_limit = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
244 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
245 ctx->ch[i].error_limit = wp_exp2(br[i]);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
246 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
247 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
248 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
249
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
250 static int wv_get_value(WavpackContext *ctx, GetBitContext *gb, int channel, int *last)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
251 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
252 int t, t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
253 int sign, base, add, ret;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
254 WvChannel *c = &ctx->ch[channel];
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
255
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
256 *last = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
257
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
258 if((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) && !ctx->zero && !ctx->one){
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
259 if(ctx->zeroes){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
260 ctx->zeroes--;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
261 if(ctx->zeroes){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
262 c->slow_level -= LEVEL_DECAY(c->slow_level);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
263 return 0;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
264 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
265 }else{
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
266 t = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
267 if(t >= 2) t = get_bits(gb, t - 1) | (1 << (t-1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
268 ctx->zeroes = t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
269 if(ctx->zeroes){
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
270 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
271 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
272 c->slow_level -= LEVEL_DECAY(c->slow_level);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
273 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
274 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
275 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
276 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
277
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
278 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
279 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
280 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
281 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
282
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
283 if(ctx->zero){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
284 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
285 ctx->zero = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
286 }else{
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
287 t = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
288 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
289 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
290 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
291 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
292 if(t == 16) {
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
293 t2 = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
294 if(t2 < 2) t += t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
295 else t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
296 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
297
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
298 if(ctx->one){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
299 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
300 t = (t>>1) + 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
301 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
302 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
303 t >>= 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
304 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
305 ctx->zero = !ctx->one;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
306 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
307
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
308 if(ctx->hybrid && !channel)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
309 update_error_limit(ctx);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
310
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
311 if(!t){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
312 base = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
313 add = GET_MED(0) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
314 DEC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
315 }else if(t == 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
316 base = GET_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
317 add = GET_MED(1) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
318 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
319 DEC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
320 }else if(t == 2){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
321 base = GET_MED(0) + GET_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
322 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
323 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
324 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
325 DEC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
326 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
327 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
328 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
329 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
330 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
331 INC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
332 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
333 if(!c->error_limit){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
334 ret = base + get_tail(gb, add);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
335 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
336 int mid = (base*2 + add + 1) >> 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
337 while(add > c->error_limit){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
338 if(get_bits1(gb)){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
339 add -= (mid - base);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
340 base = mid;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
341 }else
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
342 add = mid - base - 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
343 mid = (base*2 + add + 1) >> 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
344 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
345 ret = mid;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
346 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
347 sign = get_bits1(gb);
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
348 if(ctx->hybrid_bitrate)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
349 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
350 return sign ? ~ret : ret;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
351 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
352
9597
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
353 static inline int wv_get_value_integer(WavpackContext *s, uint32_t *crc, int S)
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
354 {
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
355 int bit;
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
356
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
357 if(s->extra_bits){
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
358 S <<= s->extra_bits;
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
359
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
360 if(s->got_extra_bits){
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
361 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
362 *crc = *crc * 9 + (S&0xffff) * 3 + ((unsigned)S>>16);
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
363 }
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
364 }
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
365 bit = (S & s->and) | s->or;
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
366 return (((S + bit) << s->shift) - bit) << s->post_shift;
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
367 }
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
368
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
369 static float wv_get_value_float(WavpackContext *s, uint32_t *crc, int S)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
370 {
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
371 union {
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
372 float f;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
373 uint32_t u;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
374 } value;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
375
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
376 int sign;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
377 int exp = s->float_max_exp;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
378
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
379 if(s->got_extra_bits){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
380 const int max_bits = 1 + 23 + 8 + 1;
10535
95f3daa991a2 Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents: 10180
diff changeset
381 const int left_bits = get_bits_left(&s->gb_extra_bits);
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
382
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
383 if(left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
384 return 0.0;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
385 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
386
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
387 if(S){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
388 S <<= s->float_shift;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
389 sign = S < 0;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
390 if(sign)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
391 S = -S;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
392 if(S >= 0x1000000){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
393 if(s->got_extra_bits && get_bits1(&s->gb_extra_bits)){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
394 S = get_bits(&s->gb_extra_bits, 23);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
395 }else{
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
396 S = 0;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
397 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
398 exp = 255;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
399 }else if(exp){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
400 int shift = 23 - av_log2(S);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
401 exp = s->float_max_exp;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
402 if(exp <= shift){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
403 shift = --exp;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
404 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
405 exp -= shift;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
406
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
407 if(shift){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
408 S <<= shift;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
409 if((s->float_flag & WV_FLT_SHIFT_ONES) ||
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
410 (s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SAME) && get_bits1(&s->gb_extra_bits)) ){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
411 S |= (1 << shift) - 1;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
412 } else if(s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SENT)){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
413 S |= get_bits(&s->gb_extra_bits, shift);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
414 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
415 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
416 }else{
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
417 exp = s->float_max_exp;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
418 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
419 S &= 0x7fffff;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
420 }else{
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
421 sign = 0;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
422 exp = 0;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
423 if(s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
424 if(get_bits1(&s->gb_extra_bits)){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
425 S = get_bits(&s->gb_extra_bits, 23);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
426 if(s->float_max_exp >= 25)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
427 exp = get_bits(&s->gb_extra_bits, 8);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
428 sign = get_bits1(&s->gb_extra_bits);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
429 }else{
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
430 if(s->float_flag & WV_FLT_ZERO_SIGN)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
431 sign = get_bits1(&s->gb_extra_bits);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
432 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
433 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
434 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
435
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
436 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
437
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
438 value.u = (sign << 31) | (exp << 23) | S;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
439 return value.f;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
440 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
441
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
442 static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *dst, const int type)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
443 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
444 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
445 int last, t;
9597
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
446 int A, B, L, L2, R, R2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
447 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
448 uint32_t crc = 0xFFFFFFFF;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
449 uint32_t crc_extra_bits = 0xFFFFFFFF;
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
450 int16_t *dst16 = dst;
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
451 int32_t *dst32 = dst;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
452 float *dstfl = dst;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
453
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
454 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
455 do{
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
456 L = wv_get_value(s, gb, 0, &last);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
457 if(last) break;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
458 R = wv_get_value(s, gb, 1, &last);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
459 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
460 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
461 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
462 if(t > 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
463 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
464 if(t & 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
465 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
466 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
467 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
468 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
469 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
470 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
471 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
472 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
473 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
474 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
475 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
476 B = s->decorr[i].samplesB[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
477 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
478 }
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
479 if(type != SAMPLE_FMT_S16){
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
480 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
481 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
482 }else{
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
483 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
484 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
485 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
486 if(A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
487 if(B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
488 s->decorr[i].samplesA[j] = L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
489 s->decorr[i].samplesB[j] = R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
490 }else if(t == -1){
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
491 if(type != SAMPLE_FMT_S16)
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
492 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
493 else
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
494 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
495 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
496 L = L2;
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
497 if(type != SAMPLE_FMT_S16)
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
498 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
499 else
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
500 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
501 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
502 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
503 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
504 }else{
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
505 if(type != SAMPLE_FMT_S16)
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
506 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
507 else
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
508 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
509 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
510 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
511
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
512 if(t == -3){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
513 R2 = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
514 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
515 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
516
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
517 if(type != SAMPLE_FMT_S16)
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
518 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
519 else
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
520 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
521 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
522 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
523 s->decorr[i].samplesB[0] = L;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
524 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
525 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
526 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
527 if(s->joint)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
528 L += (R -= (L >> 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
529 crc = (crc * 3 + L) * 3 + R;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
530
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
531 if(type == SAMPLE_FMT_FLT){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
532 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
533 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
534 } else if(type == SAMPLE_FMT_S32){
9597
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
535 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
536 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
537 } else {
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
538 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
539 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
540 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
541 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
542 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
543
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
544 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
545 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
546 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
547 }
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
548 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
549 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
550 return -1;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
551 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
552 return count * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
553 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
554
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
555 static inline int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, void *dst, const int type)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
556 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
557 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
558 int last, t;
9597
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
559 int A, S, T;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
560 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
561 uint32_t crc = 0xFFFFFFFF;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
562 uint32_t crc_extra_bits = 0xFFFFFFFF;
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
563 int16_t *dst16 = dst;
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
564 int32_t *dst32 = dst;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
565 float *dstfl = dst;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
566
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
567 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
568 do{
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
569 T = wv_get_value(s, gb, 0, &last);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
570 S = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
571 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
572 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
573 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
574 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
575 if(t & 1)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
576 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
577 else
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
578 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
579 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
580 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
581 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
582 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
583 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
584 }
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
585 if(type != SAMPLE_FMT_S16)
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
586 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
587 else
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
588 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
589 if(A && T) s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
590 s->decorr[i].samplesA[j] = T = S;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
591 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
592 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
593 crc = crc * 3 + S;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
594
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
595 if(type == SAMPLE_FMT_FLT)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
596 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, S);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
597 else if(type == SAMPLE_FMT_S32)
9597
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
598 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, S);
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
599 else
9597
b60289b3e29a Factorize out integer sample value decoding for WavPack.
kostya
parents: 9592
diff changeset
600 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, S);
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
601 count++;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
602 }while(!last && count < s->samples);
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
603
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
604 if(crc != s->CRC){
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
605 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
606 return -1;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
607 }
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
608 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
609 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
610 return -1;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
611 }
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
612 return count;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
613 }
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
614
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6294
diff changeset
615 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
616 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
617 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
618
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
619 s->avctx = avctx;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
620 s->stereo = (avctx->channels == 2);
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
621 if(avctx->bits_per_coded_sample <= 16)
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
622 avctx->sample_fmt = SAMPLE_FMT_S16;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
623 else
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
624 avctx->sample_fmt = SAMPLE_FMT_S32;
8174
f11197441364 Add channel layout to several audio decoders I maintain
kostya
parents: 7451
diff changeset
625 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
626
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
627 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
628 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
629
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
630 static int wavpack_decode_frame(AVCodecContext *avctx,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
631 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
632 AVPacket *avpkt)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
633 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
634 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
635 int buf_size = avpkt->size;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
636 WavpackContext *s = avctx->priv_data;
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
637 void *samples = data;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
638 int samplecount;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
639 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0, got_float = 0;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
640 int got_hybrid = 0;
6294
michael
parents: 5941
diff changeset
641 const uint8_t* buf_end = buf + buf_size;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
642 int i, j, id, size, ssize, weights, t;
9566
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
643 int bpp;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
644
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
645 if (buf_size == 0){
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
646 *data_size = 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
647 return 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
648 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
649
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
650 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
651 memset(s->ch, 0, sizeof(s->ch));
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
652 s->extra_bits = 0;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
653 s->and = s->or = s->shift = 0;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
654 s->got_extra_bits = 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
655
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
656 s->samples = AV_RL32(buf); buf += 4;
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
657 if(!s->samples){
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
658 *data_size = 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
659 return buf_size;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
660 }
9566
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
661 s->frame_flags = AV_RL32(buf); buf += 4;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
662 if(s->frame_flags&0x80){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
663 bpp = sizeof(float);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
664 avctx->sample_fmt = SAMPLE_FMT_FLT;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
665 } else if((s->frame_flags&0x03) <= 1){
9566
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
666 bpp = 2;
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
667 avctx->sample_fmt = SAMPLE_FMT_S16;
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
668 } else {
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
669 bpp = 4;
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
670 avctx->sample_fmt = SAMPLE_FMT_S32;
4017
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
671 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
672 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
673 s->joint = s->frame_flags & WV_JOINT_STEREO;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
674 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
675 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
676 s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f);
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
677 s->CRC = AV_RL32(buf); buf += 4;
9566
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
678
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
679 /* should not happen but who knows */
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
680 if(s->samples * bpp * avctx->channels > *data_size){
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
681 av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc!\n");
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
682 return -1;
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
683 }
9a3fddd31092 Correctly update output sample format in wavpack decoder.
kostya
parents: 9549
diff changeset
684
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
685 // parse metadata blocks
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
686 while(buf < buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
687 id = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
688 size = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
689 if(id & WP_IDF_LONG) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
690 size |= (*buf++) << 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
691 size |= (*buf++) << 16;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
692 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
693 size <<= 1; // size is specified in words
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
694 ssize = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
695 if(id & WP_IDF_ODD) size--;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
696 if(size < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
697 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
698 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
699 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
700 if(buf + ssize > buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
701 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
702 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
703 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
704 if(id & WP_IDF_IGNORE){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
705 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
706 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
707 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
708 switch(id & WP_IDF_MASK){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
709 case WP_ID_DECTERMS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
710 s->terms = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
711 if(s->terms > MAX_TERMS){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
712 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
713 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
714 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
715 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
716 for(i = 0; i < s->terms; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
717 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
718 s->decorr[s->terms - i - 1].delta = *buf >> 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
719 buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
720 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
721 got_terms = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
722 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
723 case WP_ID_DECWEIGHTS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
724 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
725 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
726 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
727 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
728 weights = size >> s->stereo_in;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
729 if(weights > MAX_TERMS || weights > s->terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
730 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
731 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
732 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
733 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
734 for(i = 0; i < weights; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
735 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
736 s->decorr[s->terms - i - 1].weightA = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
737 if(s->decorr[s->terms - i - 1].weightA > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
738 s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
739 if(s->stereo_in){
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
740 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
741 s->decorr[s->terms - i - 1].weightB = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
742 if(s->decorr[s->terms - i - 1].weightB > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
743 s->decorr[s->terms - i - 1].weightB += (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
744 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
745 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
746 got_weights = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
747 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
748 case WP_ID_DECSAMPLES:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
749 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
750 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
751 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
752 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
753 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
754 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
755 if(s->decorr[i].value > 8){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
756 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
757 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
758 if(s->stereo_in){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
759 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
760 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
761 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
762 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
763 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
764 }else if(s->decorr[i].value < 0){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
765 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
766 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
767 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
768 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
769 for(j = 0; j < s->decorr[i].value; j++){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
770 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
771 if(s->stereo_in){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
772 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
773 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
774 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
775 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
776 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
777 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
778 got_samples = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
779 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
780 case WP_ID_ENTROPY:
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
781 if(size != 6 * (s->stereo_in + 1)){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
782 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * (s->stereo_in + 1), size);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
783 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
784 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
785 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
786 for(j = 0; j <= s->stereo_in; j++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
787 for(i = 0; i < 3; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
788 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
789 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
790 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
791 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
792 got_entropy = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
793 break;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
794 case WP_ID_HYBRID:
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
795 if(s->hybrid_bitrate){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
796 for(i = 0; i <= s->stereo_in; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
797 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
798 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
799 size -= 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
800 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
801 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
802 for(i = 0; i < (s->stereo_in + 1); i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
803 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
804 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
805 size -= 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
806 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
807 if(size > 0){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
808 for(i = 0; i < (s->stereo_in + 1); i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
809 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
810 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
811 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
812 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
813 for(i = 0; i < (s->stereo_in + 1); i++)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
814 s->ch[i].bitrate_delta = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
815 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
816 got_hybrid = 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
817 break;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
818 case WP_ID_INT32INFO:
9544
e5afd314bd14 Handle WavPack INT32INFO chunks with nonzero post shift
kostya
parents: 9543
diff changeset
819 if(size != 4){
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
820 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
821 buf += ssize;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
822 continue;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
823 }
9544
e5afd314bd14 Handle WavPack INT32INFO chunks with nonzero post shift
kostya
parents: 9543
diff changeset
824 if(buf[0])
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
825 s->extra_bits = buf[0];
9544
e5afd314bd14 Handle WavPack INT32INFO chunks with nonzero post shift
kostya
parents: 9543
diff changeset
826 else if(buf[1])
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
827 s->shift = buf[1];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
828 else if(buf[2]){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
829 s->and = s->or = 1;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
830 s->shift = buf[2];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
831 }else if(buf[3]){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
832 s->and = 1;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
833 s->shift = buf[3];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
834 }
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
835 buf += 4;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
836 break;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
837 case WP_ID_FLOATINFO:
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
838 if(size != 4){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
839 av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
840 buf += ssize;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
841 continue;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
842 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
843 s->float_flag = buf[0];
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
844 s->float_shift = buf[1];
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
845 s->float_max_exp = buf[2];
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
846 buf += 4;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
847 got_float = 1;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
848 break;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
849 case WP_ID_DATA:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
850 init_get_bits(&s->gb, buf, size * 8);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
851 s->data_size = size * 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
852 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
853 got_bs = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
854 break;
9589
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
855 case WP_ID_EXTRABITS:
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
856 if(size <= 4){
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
857 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size);
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
858 buf += size;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
859 continue;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
860 }
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
861 init_get_bits(&s->gb_extra_bits, buf, size * 8);
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
862 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
863 buf += size;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
864 s->got_extra_bits = 1;
3f7496cd7cab Decode extended bitstream for high-precision WavPack files.
kostya
parents: 9566
diff changeset
865 break;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
866 default:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
867 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
868 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
869 if(id & WP_IDF_ODD) buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
870 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
871 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
872 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
873 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
874 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
875 if(!got_weights){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
876 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
877 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
878 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
879 if(!got_samples){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
880 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
881 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
882 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
883 if(!got_entropy){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
884 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
885 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
886 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
887 if(s->hybrid && !got_hybrid){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
888 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
889 return -1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
890 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
891 if(!got_bs){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
892 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
893 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
894 }
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
895 if(!got_float && avctx->sample_fmt == SAMPLE_FMT_FLT){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
896 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
897 return -1;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
898 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
899 if(s->got_extra_bits && avctx->sample_fmt != SAMPLE_FMT_FLT){
10535
95f3daa991a2 Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents: 10180
diff changeset
900 const int size = get_bits_left(&s->gb_extra_bits);
9592
05661d19f6d2 Check whether extra bits block has enough data.
kostya
parents: 9590
diff changeset
901 const int wanted = s->samples * s->extra_bits << s->stereo_in;
05661d19f6d2 Check whether extra bits block has enough data.
kostya
parents: 9590
diff changeset
902 if(size < wanted){
05661d19f6d2 Check whether extra bits block has enough data.
kostya
parents: 9590
diff changeset
903 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
05661d19f6d2 Check whether extra bits block has enough data.
kostya
parents: 9590
diff changeset
904 s->got_extra_bits = 0;
05661d19f6d2 Check whether extra bits block has enough data.
kostya
parents: 9590
diff changeset
905 }
05661d19f6d2 Check whether extra bits block has enough data.
kostya
parents: 9590
diff changeset
906 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
907
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
908 if(s->stereo_in){
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
909 if(avctx->sample_fmt == SAMPLE_FMT_S16)
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
910 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_S16);
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
911 else if(avctx->sample_fmt == SAMPLE_FMT_S32)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
912 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_S32);
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
913 else
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
914 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_FLT);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
915
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
916 }else{
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
917 if(avctx->sample_fmt == SAMPLE_FMT_S16)
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
918 samplecount = wv_unpack_mono(s, &s->gb, samples, SAMPLE_FMT_S16);
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
919 else if(avctx->sample_fmt == SAMPLE_FMT_S32)
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
920 samplecount = wv_unpack_mono(s, &s->gb, samples, SAMPLE_FMT_S32);
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
921 else
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
922 samplecount = wv_unpack_mono(s, &s->gb, samples, SAMPLE_FMT_FLT);
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
923
9609
71c0f08bd41d Prepare WavPack decoder to support floating point output.
kostya
parents: 9597
diff changeset
924 if(s->stereo && avctx->sample_fmt == SAMPLE_FMT_S16){
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
925 int16_t *dst = (int16_t*)samples + samplecount * 2;
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
926 int16_t *src = (int16_t*)samples + samplecount;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
927 int cnt = samplecount;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
928 while(cnt--){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
929 *--dst = *--src;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
930 *--dst = *src;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
931 }
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
932 samplecount *= 2;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
933 }else if(s->stereo && avctx->sample_fmt == SAMPLE_FMT_S32){
9549
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
934 int32_t *dst = (int32_t*)samples + samplecount * 2;
7a51c0815b28 Merge decoding functions for all bitdepths in WavPack decoder
kostya
parents: 9544
diff changeset
935 int32_t *src = (int32_t*)samples + samplecount;
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
936 int cnt = samplecount;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
937 while(cnt--){
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
938 *--dst = *--src;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
939 *--dst = *src;
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
940 }
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
941 samplecount *= 2;
9610
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
942 }else if(s->stereo){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
943 float *dst = (float*)samples + samplecount * 2;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
944 float *src = (float*)samples + samplecount;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
945 int cnt = samplecount;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
946 while(cnt--){
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
947 *--dst = *--src;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
948 *--dst = *src;
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
949 }
ad0e96494f1e Add floating point audio decoding to WavPack decoder.
kostya
parents: 9609
diff changeset
950 samplecount *= 2;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
951 }
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
952 }
9543
a00e7601b584 Add functions for decoding >16 bits WavPack files.
kostya
parents: 9542
diff changeset
953 *data_size = samplecount * bpp;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
954
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
955 return buf_size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
956 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
957
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
958 AVCodec wavpack_decoder = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
959 "wavpack",
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
960 CODEC_TYPE_AUDIO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
961 CODEC_ID_WAVPACK,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
962 sizeof(WavpackContext),
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
963 wavpack_decode_init,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
964 NULL,
5941
d030978bcd93 remove some empty close/init functions in avcodec
aurel
parents: 5607
diff changeset
965 NULL,
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
966 wavpack_decode_frame,
10180
a514a601bf26 Add CODEC_CAP_SUBFRAMES for codecs that output multiple subframes
faust3
parents: 9610
diff changeset
967 .capabilities = CODEC_CAP_SUBFRAMES,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
968 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
969 };