annotate wavpack.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 0dce4fe6e6f3
children c110790496ff
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
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
40 enum WP_ID_Flags{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
41 WP_IDF_MASK = 0x1F,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
42 WP_IDF_IGNORE = 0x20,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
43 WP_IDF_ODD = 0x40,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
44 WP_IDF_LONG = 0x80
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
45 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
46
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
47 enum WP_ID{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
48 WP_ID_DUMMY = 0,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
49 WP_ID_ENCINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
50 WP_ID_DECTERMS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
51 WP_ID_DECWEIGHTS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
52 WP_ID_DECSAMPLES,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
53 WP_ID_ENTROPY,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
54 WP_ID_HYBRID,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
55 WP_ID_SHAPING,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
56 WP_ID_FLOATINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
57 WP_ID_INT32INFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
58 WP_ID_DATA,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
59 WP_ID_CORR,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
60 WP_ID_FLT,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
61 WP_ID_CHANINFO
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
62 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
63
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
64 #define MAX_TERMS 16
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
65
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
66 typedef struct Decorr {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
67 int delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
68 int value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
69 int weightA;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
70 int weightB;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
71 int samplesA[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
72 int samplesB[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
73 } Decorr;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
74
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
75 typedef struct WvChannel {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
76 int median[3];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
77 int slow_level, error_limit;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
78 int bitrate_acc, bitrate_delta;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
79 } WvChannel;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
80
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
81 typedef struct WavpackContext {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
82 AVCodecContext *avctx;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
83 int frame_flags;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
84 int stereo, stereo_in;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
85 int joint;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
86 uint32_t CRC;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
87 GetBitContext gb;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
88 int data_size; // in bits
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
89 int samples;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
90 int terms;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
91 Decorr decorr[MAX_TERMS];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
92 int zero, one, zeroes;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
93 int and, or, shift;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
94 int hybrid, hybrid_bitrate;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
95 WvChannel ch[2];
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
96 } WavpackContext;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
97
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
98 // exponent table copied from WavPack source
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
99 static const uint8_t wp_exp2_table [256] = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
100 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
101 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
102 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
103 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
104 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
105 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
106 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
107 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
108 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
109 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
110 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
111 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
112 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
113 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
114 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
115 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
116 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
117
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
118 static const uint8_t wp_log2_table [] = {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
119 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
120 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
121 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
122 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
123 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
124 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
125 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
126 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
127 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
128 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
129 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
130 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
131 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
132 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
133 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
134 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
135 };
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
136
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4021
diff changeset
137 static av_always_inline int wp_exp2(int16_t val)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
138 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
139 int res, neg = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
140
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
141 if(val < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
142 val = -val;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
143 neg = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
144 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
145
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
146 res = wp_exp2_table[val & 0xFF] | 0x100;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
147 val >>= 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
148 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
149 return neg ? -res : res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
150 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
151
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
152 static av_always_inline int wp_log2(int32_t val)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
153 {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
154 int bits;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
155
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
156 if(!val)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
157 return 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
158 if(val == 1)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
159 return 256;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
160 val += val >> 9;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
161 bits = av_log2(val) + 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
162 if(bits < 9)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
163 return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
164 else
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
165 return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
166 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
167
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
168 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
169
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
170 // macros for manipulating median values
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
171 #define GET_MED(n) ((c->median[n] >> 4) + 1)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
172 #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
173 #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
174
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
175 // macros for applying weight
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
176 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
177 if(samples && in){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
178 if((samples ^ in) < 0){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
179 weight -= delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
180 if(weight < -1024) weight = -1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
181 }else{ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
182 weight += delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
183 if(weight > 1024) weight = 1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
184 } \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
185 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
186
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
187
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4021
diff changeset
188 static av_always_inline int get_tail(GetBitContext *gb, int k)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
189 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
190 int p, e, res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
191
4421
41ee67dd4bef Coded residual in WavPack may be > 0xFFFF
kostya
parents: 4364
diff changeset
192 if(k<1)return 0;
41ee67dd4bef Coded residual in WavPack may be > 0xFFFF
kostya
parents: 4364
diff changeset
193 p = av_log2(k);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
194 e = (1 << (p + 1)) - k - 1;
3782
a8b80c80494b Handle case of get_bits(0)
kostya
parents: 3764
diff changeset
195 res = p ? get_bits(gb, p) : 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
196 if(res >= e){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
197 res = (res<<1) - e + get_bits1(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
198 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
199 return res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
200 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
201
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
202 static void update_error_limit(WavpackContext *ctx)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
203 {
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
204 int i, br[2], sl[2];
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
205
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
206 for(i = 0; i <= ctx->stereo_in; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
207 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
208 br[i] = ctx->ch[i].bitrate_acc >> 16;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
209 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
210 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
211 if(ctx->stereo_in && ctx->hybrid_bitrate){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
212 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
213 if(balance > br[0]){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
214 br[1] = br[0] << 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
215 br[0] = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
216 }else if(-balance > br[0]){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
217 br[0] <<= 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
218 br[1] = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
219 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
220 br[1] = br[0] + balance;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
221 br[0] = br[0] - balance;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
222 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
223 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
224 for(i = 0; i <= ctx->stereo_in; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
225 if(ctx->hybrid_bitrate){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
226 if(sl[i] - br[i] > -0x100)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
227 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
228 else
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
229 ctx->ch[i].error_limit = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
230 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
231 ctx->ch[i].error_limit = wp_exp2(br[i]);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
232 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
233 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
234 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
235
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
236 static int wv_get_value(WavpackContext *ctx, GetBitContext *gb, int channel, int *last)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
237 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
238 int t, t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
239 int sign, base, add, ret;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
240 WvChannel *c = &ctx->ch[channel];
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
241
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
242 *last = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
243
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
244 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
245 if(ctx->zeroes){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
246 ctx->zeroes--;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
247 if(ctx->zeroes){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
248 c->slow_level -= LEVEL_DECAY(c->slow_level);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
249 return 0;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
250 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
251 }else{
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
252 t = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
253 if(t >= 2) t = get_bits(gb, t - 1) | (1 << (t-1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
254 ctx->zeroes = t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
255 if(ctx->zeroes){
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
256 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
257 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
258 c->slow_level -= LEVEL_DECAY(c->slow_level);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
259 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
260 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
261 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
262 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
263
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
264 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
265 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
266 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
267 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
268
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
269 if(ctx->zero){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
270 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
271 ctx->zero = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
272 }else{
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
273 t = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
274 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
275 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
276 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
277 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
278 if(t == 16) {
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
279 t2 = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
280 if(t2 < 2) t += t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
281 else t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
282 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
283
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
284 if(ctx->one){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
285 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
286 t = (t>>1) + 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
287 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
288 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
289 t >>= 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
290 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
291 ctx->zero = !ctx->one;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
292 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
293
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
294 if(ctx->hybrid && !channel)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
295 update_error_limit(ctx);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
296
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
297 if(!t){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
298 base = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
299 add = GET_MED(0) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
300 DEC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
301 }else if(t == 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
302 base = GET_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
303 add = GET_MED(1) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
304 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
305 DEC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
306 }else if(t == 2){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
307 base = GET_MED(0) + GET_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
308 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
309 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
310 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
311 DEC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
312 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
313 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
314 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
315 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
316 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
317 INC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
318 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
319 if(!c->error_limit){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
320 ret = base + get_tail(gb, add);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
321 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
322 int mid = (base*2 + add + 1) >> 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
323 while(add > c->error_limit){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
324 if(get_bits1(gb)){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
325 add -= (mid - base);
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
326 base = mid;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
327 }else
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
328 add = mid - base - 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
329 mid = (base*2 + add + 1) >> 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
330 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
331 ret = mid;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
332 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
333 sign = get_bits1(gb);
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
334 if(ctx->hybrid_bitrate)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
335 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
336 return sign ? ~ret : ret;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
337 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
338
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
339 static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
340 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
341 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
342 int last, t;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
343 int A, B, L, L2, R, R2, bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
344 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
345 uint32_t crc = 0xFFFFFFFF;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
346
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
347 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
348 do{
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
349 L = wv_get_value(s, gb, 0, &last);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
350 if(last) break;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
351 R = wv_get_value(s, gb, 1, &last);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
352 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
353 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
354 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
355 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
356 if(t > 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
357 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
358 if(t & 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
359 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
360 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
361 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
362 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
363 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
364 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
365 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
366 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
367 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
368 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
369 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
370 B = s->decorr[i].samplesB[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
371 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
372 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
373 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
374 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
375 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
376 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
377 s->decorr[i].samplesA[j] = L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
378 s->decorr[i].samplesB[j] = R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
379 }else if(t == -1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
380 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
381 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
382 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
383 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
384 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
385 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
386 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
387 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
388 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
389 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
390 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
391
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
392 if(t == -3){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
393 R2 = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
394 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
395 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
396
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
397 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
398 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
399 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
400 s->decorr[i].samplesB[0] = L;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
401 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
402 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
403 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
404 if(s->joint)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
405 L += (R -= (L >> 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
406 crc = (crc * 3 + L) * 3 + R;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
407 bit = (L & s->and) | s->or;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
408 *dst++ = ((L + bit) << s->shift) - bit;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
409 bit = (R & s->and) | s->or;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
410 *dst++ = ((R + bit) << s->shift) - bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
411 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
412 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
413
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
414 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
415 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
416 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
417 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
418 return count * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
419 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
420
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
421 static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
422 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
423 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
424 int last, t;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
425 int A, S, T, bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
426 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
427 uint32_t crc = 0xFFFFFFFF;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
428
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
429 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
430 do{
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
431 T = wv_get_value(s, gb, 0, &last);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
432 S = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
433 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
434 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
435 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
436 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
437 if(t & 1)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
438 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
439 else
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
440 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
441 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
442 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
443 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
444 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
445 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
446 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
447 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
448 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
449 s->decorr[i].samplesA[j] = T = S;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
450 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
451 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
452 crc = crc * 3 + S;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
453 bit = (S & s->and) | s->or;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
454 *dst++ = ((S + bit) << s->shift) - bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
455 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
456 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
457
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
458 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
459 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
460 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
461 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
462 return count;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
463 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
464
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6294
diff changeset
465 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
466 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
467 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
468
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
469 s->avctx = avctx;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
470 s->stereo = (avctx->channels == 2);
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7040
diff changeset
471 avctx->sample_fmt = SAMPLE_FMT_S16;
8174
f11197441364 Add channel layout to several audio decoders I maintain
kostya
parents: 7451
diff changeset
472 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
473
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
474 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
475 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
476
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
477 static int wavpack_decode_frame(AVCodecContext *avctx,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
478 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
479 AVPacket *avpkt)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
480 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
481 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
482 int buf_size = avpkt->size;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
483 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
484 int16_t *samples = data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
485 int samplecount;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
486 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
487 int got_hybrid = 0;
6294
michael
parents: 5941
diff changeset
488 const uint8_t* buf_end = buf + buf_size;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
489 int i, j, id, size, ssize, weights, t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
490
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
491 if (buf_size == 0){
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
492 *data_size = 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
493 return 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
494 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
495
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
496 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
497 memset(s->ch, 0, sizeof(s->ch));
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
498 s->and = s->or = s->shift = 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
499
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
500 s->samples = AV_RL32(buf); buf += 4;
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
501 if(!s->samples){
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
502 *data_size = 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
503 return buf_size;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
504 }
4017
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
505 /* should not happen but who knows */
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
506 if(s->samples * 2 * avctx->channels > *data_size){
4017
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
507 av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc!\n");
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
508 return -1;
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
509 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
510 s->frame_flags = AV_RL32(buf); buf += 4;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
511 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
512 s->joint = s->frame_flags & WV_JOINT_STEREO;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
513 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
514 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
515 s->CRC = AV_RL32(buf); buf += 4;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
516 // parse metadata blocks
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
517 while(buf < buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
518 id = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
519 size = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
520 if(id & WP_IDF_LONG) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
521 size |= (*buf++) << 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
522 size |= (*buf++) << 16;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
523 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
524 size <<= 1; // size is specified in words
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
525 ssize = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
526 if(id & WP_IDF_ODD) size--;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
527 if(size < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
528 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
529 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
530 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
531 if(buf + ssize > buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
532 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
533 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
534 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
535 if(id & WP_IDF_IGNORE){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
536 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
537 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
538 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
539 switch(id & WP_IDF_MASK){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
540 case WP_ID_DECTERMS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
541 s->terms = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
542 if(s->terms > MAX_TERMS){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
543 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
544 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
545 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
546 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
547 for(i = 0; i < s->terms; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
548 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
549 s->decorr[s->terms - i - 1].delta = *buf >> 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
550 buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
551 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
552 got_terms = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
553 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
554 case WP_ID_DECWEIGHTS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
555 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
556 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
557 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
558 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
559 weights = size >> s->stereo_in;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
560 if(weights > MAX_TERMS || weights > s->terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
561 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
562 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
563 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
564 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
565 for(i = 0; i < weights; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
566 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
567 s->decorr[s->terms - i - 1].weightA = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
568 if(s->decorr[s->terms - i - 1].weightA > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
569 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
570 if(s->stereo_in){
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
571 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
572 s->decorr[s->terms - i - 1].weightB = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
573 if(s->decorr[s->terms - i - 1].weightB > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
574 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
575 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
576 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
577 got_weights = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
578 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
579 case WP_ID_DECSAMPLES:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
580 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
581 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
582 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
583 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
584 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
585 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
586 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
587 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
588 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
589 if(s->stereo_in){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
590 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
591 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
592 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
593 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
594 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
595 }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
596 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
597 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
598 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
599 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
600 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
601 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
602 if(s->stereo_in){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
603 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
604 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
605 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
606 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
607 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
608 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
609 got_samples = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
610 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
611 case WP_ID_ENTROPY:
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
612 if(size != 6 * (s->stereo_in + 1)){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
613 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
614 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
615 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
616 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
617 for(j = 0; j <= s->stereo_in; j++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
618 for(i = 0; i < 3; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
619 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
620 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
621 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
622 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
623 got_entropy = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
624 break;
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
625 case WP_ID_HYBRID:
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
626 if(s->hybrid_bitrate){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
627 for(i = 0; i <= s->stereo_in; i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
628 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
629 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
630 size -= 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
631 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
632 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
633 for(i = 0; i < (s->stereo_in + 1); i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
634 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
635 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
636 size -= 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
637 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
638 if(size > 0){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
639 for(i = 0; i < (s->stereo_in + 1); i++){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
640 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
641 buf += 2;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
642 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
643 }else{
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
644 for(i = 0; i < (s->stereo_in + 1); i++)
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
645 s->ch[i].bitrate_delta = 0;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
646 }
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
647 got_hybrid = 1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
648 break;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
649 case WP_ID_INT32INFO:
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
650 if(size != 4 || *buf){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
651 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
652 buf += ssize;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
653 continue;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
654 }
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
655 if(buf[1])
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
656 s->shift = buf[1];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
657 else if(buf[2]){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
658 s->and = s->or = 1;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
659 s->shift = buf[2];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
660 }else if(buf[3]){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
661 s->and = 1;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
662 s->shift = buf[3];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
663 }
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
664 buf += 4;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
665 break;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
666 case WP_ID_DATA:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
667 init_get_bits(&s->gb, buf, size * 8);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
668 s->data_size = size * 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
669 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
670 got_bs = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
671 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
672 default:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
673 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
674 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
675 if(id & WP_IDF_ODD) buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
676 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
677 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
678 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
679 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
680 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
681 if(!got_weights){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
682 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
683 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
684 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
685 if(!got_samples){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
686 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
687 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
688 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
689 if(!got_entropy){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
690 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
691 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
692 }
8607
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
693 if(s->hybrid && !got_hybrid){
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
694 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
695 return -1;
79b1cf27cfea WavPack hybrid mode support
kostya
parents: 8174
diff changeset
696 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
697 if(!got_bs){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
698 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
699 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
700 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
701
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
702 if(s->stereo_in)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
703 samplecount = wv_unpack_stereo(s, &s->gb, samples);
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
704 else{
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
705 samplecount = wv_unpack_mono(s, &s->gb, samples);
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
706 if(s->stereo){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
707 int16_t *dst = samples + samplecount * 2;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
708 int16_t *src = samples + samplecount;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
709 int cnt = samplecount;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
710 while(cnt--){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
711 *--dst = *--src;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
712 *--dst = *src;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
713 }
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
714 samplecount *= 2;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
715 }
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
716 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
717 *data_size = samplecount * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
718
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
719 return buf_size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
720 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
721
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
722 AVCodec wavpack_decoder = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
723 "wavpack",
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
724 CODEC_TYPE_AUDIO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
725 CODEC_ID_WAVPACK,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
726 sizeof(WavpackContext),
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
727 wavpack_decode_init,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
728 NULL,
5941
d030978bcd93 remove some empty close/init functions in avcodec
aurel
parents: 5607
diff changeset
729 NULL,
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
730 wavpack_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
731 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
732 };