Mercurial > libavcodec.hg
annotate alsdec.c @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
| author | michael |
|---|---|
| date | Thu, 28 Jan 2010 01:24:25 +0000 |
| parents | 61bf5a551856 |
| children | 327019a2d156 |
| rev | line source |
|---|---|
| 10522 | 1 /* |
| 2 * MPEG-4 ALS decoder | |
| 3 * Copyright (c) 2009 Thilo Borgmann <thilo.borgmann _at_ googlemail.com> | |
| 4 * | |
| 5 * This file is part of FFmpeg. | |
| 6 * | |
| 7 * FFmpeg is free software; you can redistribute it and/or | |
| 8 * modify it under the terms of the GNU Lesser General Public | |
| 9 * License as published by the Free Software Foundation; either | |
| 10 * version 2.1 of the License, or (at your option) any later version. | |
| 11 * | |
| 12 * FFmpeg is distributed in the hope that it will be useful, | |
| 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 15 * Lesser General Public License for more details. | |
| 16 * | |
| 17 * You should have received a copy of the GNU Lesser General Public | |
| 18 * License along with FFmpeg; if not, write to the Free Software | |
| 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 */ | |
| 21 | |
| 22 /** | |
| 23 * @file libavcodec/alsdec.c | |
| 24 * MPEG-4 ALS decoder | |
| 25 * @author Thilo Borgmann <thilo.borgmann _at_ googlemail.com> | |
| 26 */ | |
| 27 | |
| 28 | |
| 29 //#define DEBUG | |
| 30 | |
| 31 | |
| 32 #include "avcodec.h" | |
| 33 #include "get_bits.h" | |
| 34 #include "unary.h" | |
| 35 #include "mpeg4audio.h" | |
| 36 #include "bytestream.h" | |
| 37 | |
|
10531
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
38 #include <stdint.h> |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
39 |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
40 /** Rice parameters and corresponding index offsets for decoding the |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
41 * indices of scaled PARCOR values. The table choosen is set globally |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
42 * by the encoder and stored in ALSSpecificConfig. |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
43 */ |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
44 static const int8_t parcor_rice_table[3][20][2] = { |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
45 { {-52, 4}, {-29, 5}, {-31, 4}, { 19, 4}, {-16, 4}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
46 { 12, 3}, { -7, 3}, { 9, 3}, { -5, 3}, { 6, 3}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
47 { -4, 3}, { 3, 3}, { -3, 2}, { 3, 2}, { -2, 2}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
48 { 3, 2}, { -1, 2}, { 2, 2}, { -1, 2}, { 2, 2} }, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
49 { {-58, 3}, {-42, 4}, {-46, 4}, { 37, 5}, {-36, 4}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
50 { 29, 4}, {-29, 4}, { 25, 4}, {-23, 4}, { 20, 4}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
51 {-17, 4}, { 16, 4}, {-12, 4}, { 12, 3}, {-10, 4}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
52 { 7, 3}, { -4, 4}, { 3, 3}, { -1, 3}, { 1, 3} }, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
53 { {-59, 3}, {-45, 5}, {-50, 4}, { 38, 4}, {-39, 4}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
54 { 32, 4}, {-30, 4}, { 25, 3}, {-23, 3}, { 20, 3}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
55 {-20, 3}, { 16, 3}, {-13, 3}, { 10, 3}, { -7, 3}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
56 { 3, 3}, { 0, 3}, { -1, 3}, { 2, 3}, { -1, 2} } |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
57 }; |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
58 |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
59 |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
60 /** Scaled PARCOR values used for the first two PARCOR coefficients. |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
61 * To be indexed by the Rice coded indices. |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
62 * Generated by: parcor_scaled_values[i] = 32 + ((i * (i+1)) << 7) - (1 << 20) |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
63 * Actual values are divided by 32 in order to be stored in 16 bits. |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
64 */ |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
65 static const int16_t parcor_scaled_values[] = { |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
66 -1048544 / 32, -1048288 / 32, -1047776 / 32, -1047008 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
67 -1045984 / 32, -1044704 / 32, -1043168 / 32, -1041376 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
68 -1039328 / 32, -1037024 / 32, -1034464 / 32, -1031648 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
69 -1028576 / 32, -1025248 / 32, -1021664 / 32, -1017824 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
70 -1013728 / 32, -1009376 / 32, -1004768 / 32, -999904 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
71 -994784 / 32, -989408 / 32, -983776 / 32, -977888 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
72 -971744 / 32, -965344 / 32, -958688 / 32, -951776 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
73 -944608 / 32, -937184 / 32, -929504 / 32, -921568 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
74 -913376 / 32, -904928 / 32, -896224 / 32, -887264 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
75 -878048 / 32, -868576 / 32, -858848 / 32, -848864 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
76 -838624 / 32, -828128 / 32, -817376 / 32, -806368 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
77 -795104 / 32, -783584 / 32, -771808 / 32, -759776 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
78 -747488 / 32, -734944 / 32, -722144 / 32, -709088 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
79 -695776 / 32, -682208 / 32, -668384 / 32, -654304 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
80 -639968 / 32, -625376 / 32, -610528 / 32, -595424 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
81 -580064 / 32, -564448 / 32, -548576 / 32, -532448 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
82 -516064 / 32, -499424 / 32, -482528 / 32, -465376 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
83 -447968 / 32, -430304 / 32, -412384 / 32, -394208 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
84 -375776 / 32, -357088 / 32, -338144 / 32, -318944 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
85 -299488 / 32, -279776 / 32, -259808 / 32, -239584 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
86 -219104 / 32, -198368 / 32, -177376 / 32, -156128 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
87 -134624 / 32, -112864 / 32, -90848 / 32, -68576 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
88 -46048 / 32, -23264 / 32, -224 / 32, 23072 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
89 46624 / 32, 70432 / 32, 94496 / 32, 118816 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
90 143392 / 32, 168224 / 32, 193312 / 32, 218656 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
91 244256 / 32, 270112 / 32, 296224 / 32, 322592 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
92 349216 / 32, 376096 / 32, 403232 / 32, 430624 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
93 458272 / 32, 486176 / 32, 514336 / 32, 542752 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
94 571424 / 32, 600352 / 32, 629536 / 32, 658976 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
95 688672 / 32, 718624 / 32, 748832 / 32, 779296 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
96 810016 / 32, 840992 / 32, 872224 / 32, 903712 / 32, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
97 935456 / 32, 967456 / 32, 999712 / 32, 1032224 / 32 |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
98 }; |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
99 |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
100 |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
101 /** Gain values of p(0) for long-term prediction. |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
102 * To be indexed by the Rice coded indices. |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
103 */ |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
104 static const uint8_t ltp_gain_values [4][4] = { |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
105 { 0, 8, 16, 24}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
106 {32, 40, 48, 56}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
107 {64, 70, 76, 82}, |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
108 {88, 92, 96, 100} |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
109 }; |
|
142645a57180
Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents:
10530
diff
changeset
|
110 |
| 10522 | 111 |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
112 /** Inter-channel weighting factors for multi-channel correlation. |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
113 * To be indexed by the Rice coded indices. |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
114 */ |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
115 static const int16_t mcc_weightings[] = { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
116 204, 192, 179, 166, 153, 140, 128, 115, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
117 102, 89, 76, 64, 51, 38, 25, 12, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
118 0, -12, -25, -38, -51, -64, -76, -89, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
119 -102, -115, -128, -140, -153, -166, -179, -192 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
120 }; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
121 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
122 |
| 10522 | 123 enum RA_Flag { |
| 124 RA_FLAG_NONE, | |
| 125 RA_FLAG_FRAMES, | |
| 126 RA_FLAG_HEADER | |
| 127 }; | |
| 128 | |
| 129 | |
| 130 typedef struct { | |
| 131 uint32_t samples; ///< number of samples, 0xFFFFFFFF if unknown | |
| 132 int resolution; ///< 000 = 8-bit; 001 = 16-bit; 010 = 24-bit; 011 = 32-bit | |
| 133 int floating; ///< 1 = IEEE 32-bit floating-point, 0 = integer | |
| 134 int frame_length; ///< frame length for each frame (last frame may differ) | |
| 135 int ra_distance; ///< distance between RA frames (in frames, 0...255) | |
| 136 enum RA_Flag ra_flag; ///< indicates where the size of ra units is stored | |
| 137 int adapt_order; ///< adaptive order: 1 = on, 0 = off | |
| 138 int coef_table; ///< table index of Rice code parameters | |
| 139 int long_term_prediction; ///< long term prediction (LTP): 1 = on, 0 = off | |
| 140 int max_order; ///< maximum prediction order (0..1023) | |
| 141 int block_switching; ///< number of block switching levels | |
| 142 int bgmc; ///< "Block Gilbert-Moore Code": 1 = on, 0 = off (Rice coding only) | |
| 143 int sb_part; ///< sub-block partition | |
| 144 int joint_stereo; ///< joint stereo: 1 = on, 0 = off | |
| 145 int mc_coding; ///< extended inter-channel coding (multi channel coding): 1 = on, 0 = off | |
| 146 int chan_config; ///< indicates that a chan_config_info field is present | |
| 147 int chan_sort; ///< channel rearrangement: 1 = on, 0 = off | |
| 148 int rlslms; ///< use "Recursive Least Square-Least Mean Square" predictor: 1 = on, 0 = off | |
| 149 int chan_config_info; ///< mapping of channels to loudspeaker locations. Unused until setting channel configuration is implemented. | |
| 150 int *chan_pos; ///< original channel positions | |
| 151 uint32_t header_size; ///< header size of original audio file in bytes, provided for debugging | |
| 152 uint32_t trailer_size; ///< trailer size of original audio file in bytes, provided for debugging | |
| 153 } ALSSpecificConfig; | |
| 154 | |
| 155 | |
| 156 typedef struct { | |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
157 int stop_flag; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
158 int master_channel; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
159 int time_diff_flag; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
160 int time_diff_sign; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
161 int time_diff_index; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
162 int weighting[6]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
163 } ALSChannelData; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
164 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
165 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
166 typedef struct { |
| 10522 | 167 AVCodecContext *avctx; |
| 168 ALSSpecificConfig sconf; | |
| 169 GetBitContext gb; | |
| 170 unsigned int cur_frame_length; ///< length of the current frame to decode | |
| 171 unsigned int frame_id; ///< the frame ID / number of the current frame | |
| 172 unsigned int js_switch; ///< if true, joint-stereo decoding is enforced | |
| 173 unsigned int num_blocks; ///< number of blocks used in the current frame | |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
174 int ltp_lag_length; ///< number of bits used for ltp lag value |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
175 int *use_ltp; ///< contains use_ltp flags for all channels |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
176 int *ltp_lag; ///< contains ltp lag values for all channels |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
177 int **ltp_gain; ///< gain values for ltp 5-tap filter for a channel |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
178 int *ltp_gain_buffer; ///< contains all gain values for ltp 5-tap filter |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
179 int32_t **quant_cof; ///< quantized parcor coefficients for a channel |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
180 int32_t *quant_cof_buffer; ///< contains all quantized parcor coefficients |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
181 int32_t **lpc_cof; ///< coefficients of the direct form prediction filter for a channel |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
182 int32_t *lpc_cof_buffer; ///< contains all coefficients of the direct form prediction filter |
|
10860
c9fb5b89e47a
Replace variable length array with an allocated buffer
thilo.borgmann
parents:
10823
diff
changeset
|
183 int32_t *lpc_cof_reversed_buffer; ///< temporary buffer to set up a reversed versio of lpc_cof_buffer |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
184 ALSChannelData **chan_data; ///< channel data for multi-channel correlation |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
185 ALSChannelData *chan_data_buffer; ///< contains channel data for all channels |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
186 int *reverted_channels; ///< stores a flag for each reverted channel |
| 10522 | 187 int32_t *prev_raw_samples; ///< contains unshifted raw samples from the previous block |
| 188 int32_t **raw_samples; ///< decoded raw samples for each channel | |
| 189 int32_t *raw_buffer; ///< contains all decoded raw samples including carryover samples | |
| 190 } ALSDecContext; | |
| 191 | |
| 192 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
193 typedef struct { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
194 unsigned int block_length; ///< number of samples within the block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
195 unsigned int ra_block; ///< if true, this is a random access block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
196 int const_block; ///< if true, this is a constant value block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
197 int32_t const_val; ///< the sample value of a constant block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
198 int js_blocks; ///< true if this block contains a difference signal |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
199 unsigned int shift_lsbs; ///< shift of values for this block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
200 unsigned int opt_order; ///< prediction order of this block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
201 int store_prev_samples;///< if true, carryover samples have to be stored |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
202 int *use_ltp; ///< if true, long-term prediction is used |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
203 int *ltp_lag; ///< lag value for long-term prediction |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
204 int *ltp_gain; ///< gain values for ltp 5-tap filter |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
205 int32_t *quant_cof; ///< quantized parcor coefficients |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
206 int32_t *lpc_cof; ///< coefficients of the direct form prediction |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
207 int32_t *raw_samples; ///< decoded raw samples / residuals for this block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
208 int32_t *prev_raw_samples; ///< contains unshifted raw samples from the previous block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
209 int32_t *raw_other; ///< decoded raw samples of the other channel of a channel pair |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
210 } ALSBlockData; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
211 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
212 |
| 10522 | 213 static av_cold void dprint_specific_config(ALSDecContext *ctx) |
| 214 { | |
| 215 #ifdef DEBUG | |
| 216 AVCodecContext *avctx = ctx->avctx; | |
| 217 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 218 | |
| 219 dprintf(avctx, "resolution = %i\n", sconf->resolution); | |
| 220 dprintf(avctx, "floating = %i\n", sconf->floating); | |
| 221 dprintf(avctx, "frame_length = %i\n", sconf->frame_length); | |
| 222 dprintf(avctx, "ra_distance = %i\n", sconf->ra_distance); | |
| 223 dprintf(avctx, "ra_flag = %i\n", sconf->ra_flag); | |
| 224 dprintf(avctx, "adapt_order = %i\n", sconf->adapt_order); | |
| 225 dprintf(avctx, "coef_table = %i\n", sconf->coef_table); | |
| 226 dprintf(avctx, "long_term_prediction = %i\n", sconf->long_term_prediction); | |
| 227 dprintf(avctx, "max_order = %i\n", sconf->max_order); | |
| 228 dprintf(avctx, "block_switching = %i\n", sconf->block_switching); | |
| 229 dprintf(avctx, "bgmc = %i\n", sconf->bgmc); | |
| 230 dprintf(avctx, "sb_part = %i\n", sconf->sb_part); | |
| 231 dprintf(avctx, "joint_stereo = %i\n", sconf->joint_stereo); | |
| 232 dprintf(avctx, "mc_coding = %i\n", sconf->mc_coding); | |
| 233 dprintf(avctx, "chan_config = %i\n", sconf->chan_config); | |
| 234 dprintf(avctx, "chan_sort = %i\n", sconf->chan_sort); | |
| 235 dprintf(avctx, "RLSLMS = %i\n", sconf->rlslms); | |
| 236 dprintf(avctx, "chan_config_info = %i\n", sconf->chan_config_info); | |
| 237 dprintf(avctx, "header_size = %i\n", sconf->header_size); | |
| 238 dprintf(avctx, "trailer_size = %i\n", sconf->trailer_size); | |
| 239 #endif | |
| 240 } | |
| 241 | |
| 242 | |
| 243 /** Reads an ALSSpecificConfig from a buffer into the output struct. | |
| 244 */ | |
| 245 static av_cold int read_specific_config(ALSDecContext *ctx) | |
| 246 { | |
| 247 GetBitContext gb; | |
| 248 uint64_t ht_size; | |
| 249 int i, config_offset, crc_enabled; | |
| 250 MPEG4AudioConfig m4ac; | |
| 251 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 252 AVCodecContext *avctx = ctx->avctx; | |
| 253 uint32_t als_id; | |
| 254 | |
| 255 init_get_bits(&gb, avctx->extradata, avctx->extradata_size * 8); | |
| 256 | |
| 257 config_offset = ff_mpeg4audio_get_config(&m4ac, avctx->extradata, | |
| 258 avctx->extradata_size); | |
| 259 | |
| 260 if (config_offset < 0) | |
| 261 return -1; | |
| 262 | |
| 263 skip_bits_long(&gb, config_offset); | |
| 264 | |
| 265 if (get_bits_left(&gb) < (30 << 3)) | |
| 266 return -1; | |
| 267 | |
| 268 // read the fixed items | |
| 269 als_id = get_bits_long(&gb, 32); | |
| 270 avctx->sample_rate = m4ac.sample_rate; | |
| 271 skip_bits_long(&gb, 32); // sample rate already known | |
| 272 sconf->samples = get_bits_long(&gb, 32); | |
| 273 avctx->channels = m4ac.channels; | |
| 274 skip_bits(&gb, 16); // number of channels already knwon | |
| 275 skip_bits(&gb, 3); // skip file_type | |
| 276 sconf->resolution = get_bits(&gb, 3); | |
| 277 sconf->floating = get_bits1(&gb); | |
| 278 skip_bits1(&gb); // skip msb_first | |
| 279 sconf->frame_length = get_bits(&gb, 16) + 1; | |
| 280 sconf->ra_distance = get_bits(&gb, 8); | |
| 281 sconf->ra_flag = get_bits(&gb, 2); | |
| 282 sconf->adapt_order = get_bits1(&gb); | |
| 283 sconf->coef_table = get_bits(&gb, 2); | |
| 284 sconf->long_term_prediction = get_bits1(&gb); | |
| 285 sconf->max_order = get_bits(&gb, 10); | |
| 286 sconf->block_switching = get_bits(&gb, 2); | |
| 287 sconf->bgmc = get_bits1(&gb); | |
| 288 sconf->sb_part = get_bits1(&gb); | |
| 289 sconf->joint_stereo = get_bits1(&gb); | |
| 290 sconf->mc_coding = get_bits1(&gb); | |
| 291 sconf->chan_config = get_bits1(&gb); | |
| 292 sconf->chan_sort = get_bits1(&gb); | |
| 293 crc_enabled = get_bits1(&gb); | |
| 294 sconf->rlslms = get_bits1(&gb); | |
| 295 skip_bits(&gb, 5); // skip 5 reserved bits | |
| 296 skip_bits1(&gb); // skip aux_data_enabled | |
| 297 | |
| 298 | |
| 299 // check for ALSSpecificConfig struct | |
| 300 if (als_id != MKBETAG('A','L','S','\0')) | |
| 301 return -1; | |
| 302 | |
| 303 ctx->cur_frame_length = sconf->frame_length; | |
| 304 | |
| 305 // read channel config | |
| 306 if (sconf->chan_config) | |
| 307 sconf->chan_config_info = get_bits(&gb, 16); | |
| 308 // TODO: use this to set avctx->channel_layout | |
| 309 | |
| 310 | |
| 311 // read channel sorting | |
| 312 if (sconf->chan_sort && avctx->channels > 1) { | |
| 313 int chan_pos_bits = av_ceil_log2(avctx->channels); | |
| 314 int bits_needed = avctx->channels * chan_pos_bits + 7; | |
| 315 if (get_bits_left(&gb) < bits_needed) | |
| 316 return -1; | |
| 317 | |
| 318 if (!(sconf->chan_pos = av_malloc(avctx->channels * sizeof(*sconf->chan_pos)))) | |
| 319 return AVERROR(ENOMEM); | |
| 320 | |
| 321 for (i = 0; i < avctx->channels; i++) | |
| 322 sconf->chan_pos[i] = get_bits(&gb, chan_pos_bits); | |
| 323 | |
| 324 align_get_bits(&gb); | |
| 325 // TODO: use this to actually do channel sorting | |
| 326 } else { | |
| 327 sconf->chan_sort = 0; | |
| 328 } | |
| 329 | |
| 330 | |
| 331 // read fixed header and trailer sizes, | |
| 332 // if size = 0xFFFFFFFF then there is no data field! | |
| 333 if (get_bits_left(&gb) < 64) | |
| 334 return -1; | |
| 335 | |
| 336 sconf->header_size = get_bits_long(&gb, 32); | |
| 337 sconf->trailer_size = get_bits_long(&gb, 32); | |
| 338 if (sconf->header_size == 0xFFFFFFFF) | |
| 339 sconf->header_size = 0; | |
| 340 if (sconf->trailer_size == 0xFFFFFFFF) | |
| 341 sconf->trailer_size = 0; | |
| 342 | |
| 343 ht_size = ((int64_t)(sconf->header_size) + (int64_t)(sconf->trailer_size)) << 3; | |
| 344 | |
| 345 | |
| 346 // skip the header and trailer data | |
| 347 if (get_bits_left(&gb) < ht_size) | |
| 348 return -1; | |
| 349 | |
| 350 if (ht_size > INT32_MAX) | |
| 351 return -1; | |
| 352 | |
| 353 skip_bits_long(&gb, ht_size); | |
| 354 | |
| 355 | |
| 356 // skip the crc data | |
| 357 if (crc_enabled) { | |
| 358 if (get_bits_left(&gb) < 32) | |
| 359 return -1; | |
| 360 | |
| 361 skip_bits_long(&gb, 32); | |
| 362 } | |
| 363 | |
| 364 | |
| 365 // no need to read the rest of ALSSpecificConfig (ra_unit_size & aux data) | |
| 366 | |
| 367 dprint_specific_config(ctx); | |
| 368 | |
| 369 return 0; | |
| 370 } | |
| 371 | |
| 372 | |
| 373 /** Checks the ALSSpecificConfig for unsupported features. | |
| 374 */ | |
| 375 static int check_specific_config(ALSDecContext *ctx) | |
| 376 { | |
| 377 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 378 int error = 0; | |
| 379 | |
| 380 // report unsupported feature and set error value | |
| 381 #define MISSING_ERR(cond, str, errval) \ | |
| 382 { \ | |
| 383 if (cond) { \ | |
| 384 av_log_missing_feature(ctx->avctx, str, 0); \ | |
| 385 error = errval; \ | |
| 386 } \ | |
| 387 } | |
| 388 | |
| 389 MISSING_ERR(sconf->floating, "Floating point decoding", -1); | |
| 390 MISSING_ERR(sconf->bgmc, "BGMC entropy decoding", -1); | |
| 391 MISSING_ERR(sconf->rlslms, "Adaptive RLS-LMS prediction", -1); | |
| 392 MISSING_ERR(sconf->chan_sort, "Channel sorting", 0); | |
| 393 | |
| 394 return error; | |
| 395 } | |
| 396 | |
| 397 | |
| 398 /** Parses the bs_info field to extract the block partitioning used in | |
| 399 * block switching mode, refer to ISO/IEC 14496-3, section 11.6.2. | |
| 400 */ | |
| 401 static void parse_bs_info(const uint32_t bs_info, unsigned int n, | |
| 402 unsigned int div, unsigned int **div_blocks, | |
| 403 unsigned int *num_blocks) | |
| 404 { | |
| 405 if (n < 31 && ((bs_info << n) & 0x40000000)) { | |
| 406 // if the level is valid and the investigated bit n is set | |
| 407 // then recursively check both children at bits (2n+1) and (2n+2) | |
| 408 n *= 2; | |
| 409 div += 1; | |
| 410 parse_bs_info(bs_info, n + 1, div, div_blocks, num_blocks); | |
| 411 parse_bs_info(bs_info, n + 2, div, div_blocks, num_blocks); | |
| 412 } else { | |
| 413 // else the bit is not set or the last level has been reached | |
| 414 // (bit implicitly not set) | |
| 415 **div_blocks = div; | |
| 416 (*div_blocks)++; | |
| 417 (*num_blocks)++; | |
| 418 } | |
| 419 } | |
| 420 | |
| 421 | |
| 422 /** Reads and decodes a Rice codeword. | |
| 423 */ | |
| 424 static int32_t decode_rice(GetBitContext *gb, unsigned int k) | |
| 425 { | |
|
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
10531
diff
changeset
|
426 int max = get_bits_left(gb) - k; |
| 10522 | 427 int q = get_unary(gb, 0, max); |
| 428 int r = k ? get_bits1(gb) : !(q & 1); | |
| 429 | |
| 430 if (k > 1) { | |
| 431 q <<= (k - 1); | |
| 432 q += get_bits_long(gb, k - 1); | |
| 433 } else if (!k) { | |
| 434 q >>= 1; | |
| 435 } | |
| 436 return r ? q : ~q; | |
| 437 } | |
| 438 | |
| 439 | |
| 440 /** Converts PARCOR coefficient k to direct filter coefficient. | |
| 441 */ | |
| 442 static void parcor_to_lpc(unsigned int k, const int32_t *par, int32_t *cof) | |
| 443 { | |
| 444 int i, j; | |
| 445 | |
| 446 for (i = 0, j = k - 1; i < j; i++, j--) { | |
| 447 int tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20); | |
| 448 cof[j] += ((MUL64(par[k], cof[i]) + (1 << 19)) >> 20); | |
| 449 cof[i] += tmp1; | |
| 450 } | |
| 451 if (i == j) | |
| 452 cof[i] += ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20); | |
| 453 | |
| 454 cof[k] = par[k]; | |
| 455 } | |
| 456 | |
| 457 | |
| 458 /** Reads block switching field if necessary and sets actual block sizes. | |
| 459 * Also assures that the block sizes of the last frame correspond to the | |
| 460 * actual number of samples. | |
| 461 */ | |
| 462 static void get_block_sizes(ALSDecContext *ctx, unsigned int *div_blocks, | |
| 463 uint32_t *bs_info) | |
| 464 { | |
| 465 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 466 GetBitContext *gb = &ctx->gb; | |
| 467 unsigned int *ptr_div_blocks = div_blocks; | |
| 468 unsigned int b; | |
| 469 | |
| 470 if (sconf->block_switching) { | |
| 471 unsigned int bs_info_len = 1 << (sconf->block_switching + 2); | |
| 472 *bs_info = get_bits_long(gb, bs_info_len); | |
| 473 *bs_info <<= (32 - bs_info_len); | |
| 474 } | |
| 475 | |
| 476 ctx->num_blocks = 0; | |
| 477 parse_bs_info(*bs_info, 0, 0, &ptr_div_blocks, &ctx->num_blocks); | |
| 478 | |
| 479 // The last frame may have an overdetermined block structure given in | |
| 480 // the bitstream. In that case the defined block structure would need | |
| 481 // more samples than available to be consistent. | |
| 482 // The block structure is actually used but the block sizes are adapted | |
| 483 // to fit the actual number of available samples. | |
| 484 // Example: 5 samples, 2nd level block sizes: 2 2 2 2. | |
| 485 // This results in the actual block sizes: 2 2 1 0. | |
| 486 // This is not specified in 14496-3 but actually done by the reference | |
| 487 // codec RM22 revision 2. | |
| 488 // This appears to happen in case of an odd number of samples in the last | |
| 489 // frame which is actually not allowed by the block length switching part | |
| 490 // of 14496-3. | |
| 491 // The ALS conformance files feature an odd number of samples in the last | |
| 492 // frame. | |
| 493 | |
| 494 for (b = 0; b < ctx->num_blocks; b++) | |
| 495 div_blocks[b] = ctx->sconf.frame_length >> div_blocks[b]; | |
| 496 | |
| 497 if (ctx->cur_frame_length != ctx->sconf.frame_length) { | |
| 498 unsigned int remaining = ctx->cur_frame_length; | |
| 499 | |
| 500 for (b = 0; b < ctx->num_blocks; b++) { | |
| 501 if (remaining < div_blocks[b]) { | |
| 502 div_blocks[b] = remaining; | |
| 503 ctx->num_blocks = b + 1; | |
| 504 break; | |
| 505 } | |
| 506 | |
| 507 remaining -= div_blocks[b]; | |
| 508 } | |
| 509 } | |
| 510 } | |
| 511 | |
| 512 | |
| 513 /** Reads the block data for a constant block | |
| 514 */ | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
515 static void read_const_block_data(ALSDecContext *ctx, ALSBlockData *bd) |
| 10522 | 516 { |
| 517 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 518 AVCodecContext *avctx = ctx->avctx; | |
| 519 GetBitContext *gb = &ctx->gb; | |
| 520 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
521 bd->const_val = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
522 bd->const_block = get_bits1(gb); // 1 = constant value, 0 = zero block (silence) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
523 bd->js_blocks = get_bits1(gb); |
| 10522 | 524 |
| 525 // skip 5 reserved bits | |
| 526 skip_bits(gb, 5); | |
| 527 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
528 if (bd->const_block) { |
| 10522 | 529 unsigned int const_val_bits = sconf->floating ? 24 : avctx->bits_per_raw_sample; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
530 bd->const_val = get_sbits_long(gb, const_val_bits); |
| 10522 | 531 } |
| 532 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
533 // ensure constant block decoding by reusing this field |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
534 bd->const_block = 1; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
535 } |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
536 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
537 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
538 /** Decodes the block data for a constant block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
539 */ |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
540 static void decode_const_block_data(ALSDecContext *ctx, ALSBlockData *bd) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
541 { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
542 int smp = bd->block_length; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
543 int32_t val = bd->const_val; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
544 int32_t *dst = bd->raw_samples; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
545 |
| 10522 | 546 // write raw samples into buffer |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
547 for (; smp; smp--) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
548 *dst++ = val; |
| 10522 | 549 } |
| 550 | |
| 551 | |
| 552 /** Reads the block data for a non-constant block | |
| 553 */ | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
554 static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd) |
| 10522 | 555 { |
| 556 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 557 AVCodecContext *avctx = ctx->avctx; | |
| 558 GetBitContext *gb = &ctx->gb; | |
| 559 unsigned int k; | |
| 560 unsigned int s[8]; | |
| 561 unsigned int sub_blocks, log2_sub_blocks, sb_length; | |
| 562 unsigned int start = 0; | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
563 unsigned int opt_order; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
564 int sb; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
565 int32_t *quant_cof = bd->quant_cof; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
566 |
| 10522 | 567 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
568 // ensure variable block decoding by reusing this field |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
569 bd->const_block = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
570 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
571 bd->opt_order = 1; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
572 bd->js_blocks = get_bits1(gb); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
573 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
574 opt_order = bd->opt_order; |
| 10522 | 575 |
| 576 // determine the number of subblocks for entropy decoding | |
| 577 if (!sconf->bgmc && !sconf->sb_part) { | |
| 578 log2_sub_blocks = 0; | |
| 579 } else { | |
| 580 if (sconf->bgmc && sconf->sb_part) | |
| 581 log2_sub_blocks = get_bits(gb, 2); | |
| 582 else | |
| 583 log2_sub_blocks = 2 * get_bits1(gb); | |
| 584 } | |
| 585 | |
| 586 sub_blocks = 1 << log2_sub_blocks; | |
| 587 | |
| 588 // do not continue in case of a damaged stream since | |
| 589 // block_length must be evenly divisible by sub_blocks | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
590 if (bd->block_length & (sub_blocks - 1)) { |
| 10522 | 591 av_log(avctx, AV_LOG_WARNING, |
| 592 "Block length is not evenly divisible by the number of subblocks.\n"); | |
| 593 return -1; | |
| 594 } | |
| 595 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
596 sb_length = bd->block_length >> log2_sub_blocks; |
| 10522 | 597 |
| 598 | |
| 599 if (sconf->bgmc) { | |
| 600 // TODO: BGMC mode | |
| 601 } else { | |
| 602 s[0] = get_bits(gb, 4 + (sconf->resolution > 1)); | |
| 603 for (k = 1; k < sub_blocks; k++) | |
| 604 s[k] = s[k - 1] + decode_rice(gb, 0); | |
| 605 } | |
| 606 | |
| 607 if (get_bits1(gb)) | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
608 bd->shift_lsbs = get_bits(gb, 4) + 1; |
| 10522 | 609 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
610 bd->store_prev_samples = (bd->js_blocks && bd->raw_other) || bd->shift_lsbs; |
| 10522 | 611 |
| 612 | |
| 613 if (!sconf->rlslms) { | |
| 614 if (sconf->adapt_order) { | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
615 int opt_order_length = av_ceil_log2(av_clip((bd->block_length >> 3) - 1, |
| 10522 | 616 2, sconf->max_order + 1)); |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
617 bd->opt_order = get_bits(gb, opt_order_length); |
| 10522 | 618 } else { |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
619 bd->opt_order = sconf->max_order; |
| 10522 | 620 } |
| 621 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
622 opt_order = bd->opt_order; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
623 |
| 10522 | 624 if (opt_order) { |
| 625 int add_base; | |
| 626 | |
| 627 if (sconf->coef_table == 3) { | |
| 628 add_base = 0x7F; | |
| 629 | |
| 630 // read coefficient 0 | |
| 631 quant_cof[0] = 32 * parcor_scaled_values[get_bits(gb, 7)]; | |
| 632 | |
| 633 // read coefficient 1 | |
| 634 if (opt_order > 1) | |
| 635 quant_cof[1] = -32 * parcor_scaled_values[get_bits(gb, 7)]; | |
| 636 | |
| 637 // read coefficients 2 to opt_order | |
| 638 for (k = 2; k < opt_order; k++) | |
| 639 quant_cof[k] = get_bits(gb, 7); | |
| 640 } else { | |
| 641 int k_max; | |
| 642 add_base = 1; | |
| 643 | |
| 644 // read coefficient 0 to 19 | |
| 645 k_max = FFMIN(opt_order, 20); | |
| 646 for (k = 0; k < k_max; k++) { | |
| 647 int rice_param = parcor_rice_table[sconf->coef_table][k][1]; | |
| 648 int offset = parcor_rice_table[sconf->coef_table][k][0]; | |
| 649 quant_cof[k] = decode_rice(gb, rice_param) + offset; | |
| 650 } | |
| 651 | |
| 652 // read coefficients 20 to 126 | |
| 653 k_max = FFMIN(opt_order, 127); | |
| 654 for (; k < k_max; k++) | |
| 655 quant_cof[k] = decode_rice(gb, 2) + (k & 1); | |
| 656 | |
| 657 // read coefficients 127 to opt_order | |
| 658 for (; k < opt_order; k++) | |
| 659 quant_cof[k] = decode_rice(gb, 1); | |
| 660 | |
| 661 quant_cof[0] = 32 * parcor_scaled_values[quant_cof[0] + 64]; | |
| 662 | |
| 663 if (opt_order > 1) | |
| 664 quant_cof[1] = -32 * parcor_scaled_values[quant_cof[1] + 64]; | |
| 665 } | |
| 666 | |
| 667 for (k = 2; k < opt_order; k++) | |
| 668 quant_cof[k] = (quant_cof[k] << 14) + (add_base << 13); | |
| 669 } | |
| 670 } | |
| 671 | |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
672 // read LTP gain and lag values |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
673 if (sconf->long_term_prediction) { |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
674 *bd->use_ltp = get_bits1(gb); |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
675 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
676 if (*bd->use_ltp) { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
677 bd->ltp_gain[0] = decode_rice(gb, 1) << 3; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
678 bd->ltp_gain[1] = decode_rice(gb, 2) << 3; |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
679 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
680 bd->ltp_gain[2] = ltp_gain_values[get_unary(gb, 0, 4)][get_bits(gb, 2)]; |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
681 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
682 bd->ltp_gain[3] = decode_rice(gb, 2) << 3; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
683 bd->ltp_gain[4] = decode_rice(gb, 1) << 3; |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
684 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
685 *bd->ltp_lag = get_bits(gb, ctx->ltp_lag_length); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
686 *bd->ltp_lag += FFMAX(4, opt_order + 1); |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
687 } |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
688 } |
| 10522 | 689 |
| 690 // read first value and residuals in case of a random access block | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
691 if (bd->ra_block) { |
| 10522 | 692 if (opt_order) |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
693 bd->raw_samples[0] = decode_rice(gb, avctx->bits_per_raw_sample - 4); |
| 10522 | 694 if (opt_order > 1) |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
695 bd->raw_samples[1] = decode_rice(gb, s[0] + 3); |
| 10522 | 696 if (opt_order > 2) |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
697 bd->raw_samples[2] = decode_rice(gb, s[0] + 1); |
| 10522 | 698 |
| 699 start = FFMIN(opt_order, 3); | |
| 700 } | |
| 701 | |
| 702 // read all residuals | |
| 703 if (sconf->bgmc) { | |
| 704 // TODO: BGMC mode | |
| 705 } else { | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
706 int32_t *current_res = bd->raw_samples + start; |
| 10522 | 707 |
| 708 for (sb = 0; sb < sub_blocks; sb++, start = 0) | |
| 709 for (; start < sb_length; start++) | |
| 710 *current_res++ = decode_rice(gb, s[sb]); | |
| 711 } | |
| 712 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
713 if (!sconf->mc_coding || ctx->js_switch) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
714 align_get_bits(gb); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
715 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
716 return 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
717 } |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
718 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
719 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
720 /** Decodes the block data for a non-constant block |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
721 */ |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
722 static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
723 { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
724 ALSSpecificConfig *sconf = &ctx->sconf; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
725 unsigned int block_length = bd->block_length; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
726 unsigned int smp = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
727 unsigned int k; |
|
10823
d87e8f2c5c91
Change local variable type from unsigned int to int in order to
thilo.borgmann
parents:
10802
diff
changeset
|
728 int opt_order = bd->opt_order; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
729 int sb; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
730 int64_t y; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
731 int32_t *quant_cof = bd->quant_cof; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
732 int32_t *lpc_cof = bd->lpc_cof; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
733 int32_t *raw_samples = bd->raw_samples; |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
734 int32_t *raw_samples_end = bd->raw_samples + bd->block_length; |
|
10860
c9fb5b89e47a
Replace variable length array with an allocated buffer
thilo.borgmann
parents:
10823
diff
changeset
|
735 int32_t *lpc_cof_reversed = ctx->lpc_cof_reversed_buffer; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
736 |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
737 // reverse long-term prediction |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
738 if (*bd->use_ltp) { |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
739 int ltp_smp; |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
740 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
741 for (ltp_smp = FFMAX(*bd->ltp_lag - 2, 0); ltp_smp < block_length; ltp_smp++) { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
742 int center = ltp_smp - *bd->ltp_lag; |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
743 int begin = FFMAX(0, center - 2); |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
744 int end = center + 3; |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
745 int tab = 5 - (end - begin); |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
746 int base; |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
747 |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
748 y = 1 << 6; |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
749 |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
750 for (base = begin; base < end; base++, tab++) |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
751 y += MUL64(bd->ltp_gain[tab], raw_samples[base]); |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
752 |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
753 raw_samples[ltp_smp] += y >> 7; |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
754 } |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
755 } |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
756 |
| 10522 | 757 // reconstruct all samples from residuals |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
758 if (bd->ra_block) { |
| 10522 | 759 for (smp = 0; smp < opt_order; smp++) { |
| 760 y = 1 << 19; | |
| 761 | |
| 762 for (sb = 0; sb < smp; sb++) | |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
763 y += MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]); |
| 10522 | 764 |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
765 *raw_samples++ -= y >> 20; |
| 10522 | 766 parcor_to_lpc(smp, quant_cof, lpc_cof); |
| 767 } | |
| 768 } else { | |
| 769 for (k = 0; k < opt_order; k++) | |
| 770 parcor_to_lpc(k, quant_cof, lpc_cof); | |
| 771 | |
| 772 // store previous samples in case that they have to be altered | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
773 if (bd->store_prev_samples) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
774 memcpy(bd->prev_raw_samples, raw_samples - sconf->max_order, |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
775 sizeof(*bd->prev_raw_samples) * sconf->max_order); |
| 10522 | 776 |
| 777 // reconstruct difference signal for prediction (joint-stereo) | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
778 if (bd->js_blocks && bd->raw_other) { |
| 10522 | 779 int32_t *left, *right; |
| 780 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
781 if (bd->raw_other > raw_samples) { // D = R - L |
| 10522 | 782 left = raw_samples; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
783 right = bd->raw_other; |
| 10522 | 784 } else { // D = R - L |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
785 left = bd->raw_other; |
| 10522 | 786 right = raw_samples; |
| 787 } | |
| 788 | |
| 789 for (sb = -1; sb >= -sconf->max_order; sb--) | |
| 790 raw_samples[sb] = right[sb] - left[sb]; | |
| 791 } | |
| 792 | |
| 793 // reconstruct shifted signal | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
794 if (bd->shift_lsbs) |
| 10522 | 795 for (sb = -1; sb >= -sconf->max_order; sb--) |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
796 raw_samples[sb] >>= bd->shift_lsbs; |
| 10522 | 797 } |
| 798 | |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
799 // reverse linear prediction coefficients for efficiency |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
800 lpc_cof = lpc_cof + opt_order; |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
801 |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
802 for (sb = 0; sb < opt_order; sb++) |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
803 lpc_cof_reversed[sb] = lpc_cof[-(sb + 1)]; |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
804 |
| 10522 | 805 // reconstruct raw samples |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
806 raw_samples = bd->raw_samples + smp; |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
807 lpc_cof = lpc_cof_reversed + opt_order; |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
808 |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
809 for (; raw_samples < raw_samples_end; raw_samples++) { |
| 10522 | 810 y = 1 << 19; |
| 811 | |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
812 for (sb = -opt_order; sb < 0; sb++) |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
813 y += MUL64(lpc_cof[sb], raw_samples[sb]); |
| 10522 | 814 |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
815 *raw_samples -= y >> 20; |
| 10522 | 816 } |
| 817 | |
|
10800
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
818 raw_samples = bd->raw_samples; |
|
67e430033b14
Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents:
10774
diff
changeset
|
819 |
| 10522 | 820 // restore previous samples in case that they have been altered |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
821 if (bd->store_prev_samples) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
822 memcpy(raw_samples - sconf->max_order, bd->prev_raw_samples, |
| 10522 | 823 sizeof(*raw_samples) * sconf->max_order); |
| 824 | |
| 825 return 0; | |
| 826 } | |
| 827 | |
| 828 | |
| 829 /** Reads the block data. | |
| 830 */ | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
831 static int read_block(ALSDecContext *ctx, ALSBlockData *bd) |
| 10522 | 832 { |
| 833 GetBitContext *gb = &ctx->gb; | |
| 834 | |
| 835 // read block type flag and read the samples accordingly | |
| 836 if (get_bits1(gb)) { | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
837 if (read_var_block_data(ctx, bd)) |
| 10522 | 838 return -1; |
| 839 } else { | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
840 read_const_block_data(ctx, bd); |
| 10522 | 841 } |
| 842 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
843 return 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
844 } |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
845 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
846 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
847 /** Decodes the block data. |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
848 */ |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
849 static int decode_block(ALSDecContext *ctx, ALSBlockData *bd) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
850 { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
851 unsigned int smp; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
852 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
853 // read block type flag and read the samples accordingly |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
854 if (bd->const_block) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
855 decode_const_block_data(ctx, bd); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
856 else if (decode_var_block_data(ctx, bd)) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
857 return -1; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
858 |
| 10522 | 859 // TODO: read RLSLMS extension data |
| 860 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
861 if (bd->shift_lsbs) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
862 for (smp = 0; smp < bd->block_length; smp++) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
863 bd->raw_samples[smp] <<= bd->shift_lsbs; |
| 10522 | 864 |
| 865 return 0; | |
| 866 } | |
| 867 | |
| 868 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
869 /** Reads and decodes block data successively. |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
870 */ |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
871 static int read_decode_block(ALSDecContext *ctx, ALSBlockData *bd) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
872 { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
873 int ret; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
874 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
875 ret = read_block(ctx, bd); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
876 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
877 if (ret) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
878 return ret; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
879 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
880 ret = decode_block(ctx, bd); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
881 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
882 return ret; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
883 } |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
884 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
885 |
| 10522 | 886 /** Computes the number of samples left to decode for the current frame and |
| 887 * sets these samples to zero. | |
| 888 */ | |
| 889 static void zero_remaining(unsigned int b, unsigned int b_max, | |
| 890 const unsigned int *div_blocks, int32_t *buf) | |
| 891 { | |
| 892 unsigned int count = 0; | |
| 893 | |
| 894 while (b < b_max) | |
| 895 count += div_blocks[b]; | |
| 896 | |
| 10523 | 897 if (count) |
| 10524 | 898 memset(buf, 0, sizeof(*buf) * count); |
| 10522 | 899 } |
| 900 | |
| 901 | |
| 902 /** Decodes blocks independently. | |
| 903 */ | |
| 904 static int decode_blocks_ind(ALSDecContext *ctx, unsigned int ra_frame, | |
| 905 unsigned int c, const unsigned int *div_blocks, | |
| 906 unsigned int *js_blocks) | |
| 907 { | |
| 908 unsigned int b; | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
909 ALSBlockData bd; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
910 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
911 memset(&bd, 0, sizeof(ALSBlockData)); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
912 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
913 bd.ra_block = ra_frame; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
914 bd.use_ltp = ctx->use_ltp; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
915 bd.ltp_lag = ctx->ltp_lag; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
916 bd.ltp_gain = ctx->ltp_gain[0]; |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
917 bd.quant_cof = ctx->quant_cof[0]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
918 bd.lpc_cof = ctx->lpc_cof[0]; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
919 bd.prev_raw_samples = ctx->prev_raw_samples; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
920 bd.raw_samples = ctx->raw_samples[c]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
921 |
| 10522 | 922 |
| 923 for (b = 0; b < ctx->num_blocks; b++) { | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
924 bd.shift_lsbs = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
925 bd.block_length = div_blocks[b]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
926 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
927 if (read_decode_block(ctx, &bd)) { |
| 10522 | 928 // damaged block, write zero for the rest of the frame |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
929 zero_remaining(b, ctx->num_blocks, div_blocks, bd.raw_samples); |
| 10522 | 930 return -1; |
| 931 } | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
932 bd.raw_samples += div_blocks[b]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
933 bd.ra_block = 0; |
| 10522 | 934 } |
| 935 | |
| 936 return 0; | |
| 937 } | |
| 938 | |
| 939 | |
| 940 /** Decodes blocks dependently. | |
| 941 */ | |
| 942 static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame, | |
| 943 unsigned int c, const unsigned int *div_blocks, | |
| 944 unsigned int *js_blocks) | |
| 945 { | |
| 946 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 947 unsigned int offset = 0; | |
| 948 unsigned int b; | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
949 ALSBlockData bd[2]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
950 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
951 memset(bd, 0, 2 * sizeof(ALSBlockData)); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
952 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
953 bd[0].ra_block = ra_frame; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
954 bd[0].use_ltp = ctx->use_ltp; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
955 bd[0].ltp_lag = ctx->ltp_lag; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
956 bd[0].ltp_gain = ctx->ltp_gain[0]; |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
957 bd[0].quant_cof = ctx->quant_cof[0]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
958 bd[0].lpc_cof = ctx->lpc_cof[0]; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
959 bd[0].prev_raw_samples = ctx->prev_raw_samples; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
960 bd[0].js_blocks = *js_blocks; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
961 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
962 bd[1].ra_block = ra_frame; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
963 bd[1].use_ltp = ctx->use_ltp; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
964 bd[1].ltp_lag = ctx->ltp_lag; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
965 bd[1].ltp_gain = ctx->ltp_gain[0]; |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
966 bd[1].quant_cof = ctx->quant_cof[0]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
967 bd[1].lpc_cof = ctx->lpc_cof[0]; |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
968 bd[1].prev_raw_samples = ctx->prev_raw_samples; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
969 bd[1].js_blocks = *(js_blocks + 1); |
| 10522 | 970 |
| 971 // decode all blocks | |
| 972 for (b = 0; b < ctx->num_blocks; b++) { | |
| 973 unsigned int s; | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
974 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
975 bd[0].shift_lsbs = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
976 bd[1].shift_lsbs = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
977 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
978 bd[0].block_length = div_blocks[b]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
979 bd[1].block_length = div_blocks[b]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
980 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
981 bd[0].raw_samples = ctx->raw_samples[c ] + offset; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
982 bd[1].raw_samples = ctx->raw_samples[c + 1] + offset; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
983 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
984 bd[0].raw_other = bd[1].raw_samples; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
985 bd[1].raw_other = bd[0].raw_samples; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
986 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
987 if(read_decode_block(ctx, &bd[0]) || read_decode_block(ctx, &bd[1])) { |
| 10522 | 988 // damaged block, write zero for the rest of the frame |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
989 zero_remaining(b, ctx->num_blocks, div_blocks, bd[0].raw_samples); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
990 zero_remaining(b, ctx->num_blocks, div_blocks, bd[1].raw_samples); |
| 10522 | 991 return -1; |
| 992 } | |
| 993 | |
| 994 // reconstruct joint-stereo blocks | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
995 if (bd[0].js_blocks) { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
996 if (bd[1].js_blocks) |
| 10522 | 997 av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel pair!\n"); |
| 998 | |
| 999 for (s = 0; s < div_blocks[b]; s++) | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1000 bd[0].raw_samples[s] = bd[1].raw_samples[s] - bd[0].raw_samples[s]; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1001 } else if (bd[1].js_blocks) { |
| 10522 | 1002 for (s = 0; s < div_blocks[b]; s++) |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1003 bd[1].raw_samples[s] = bd[1].raw_samples[s] + bd[0].raw_samples[s]; |
| 10522 | 1004 } |
| 1005 | |
| 1006 offset += div_blocks[b]; | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1007 bd[0].ra_block = 0; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1008 bd[1].ra_block = 0; |
| 10522 | 1009 } |
| 1010 | |
| 1011 // store carryover raw samples, | |
| 1012 // the others channel raw samples are stored by the calling function. | |
| 1013 memmove(ctx->raw_samples[c] - sconf->max_order, | |
| 1014 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length, | |
| 1015 sizeof(*ctx->raw_samples[c]) * sconf->max_order); | |
| 1016 | |
| 1017 return 0; | |
| 1018 } | |
| 1019 | |
| 1020 | |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1021 /** Reads the channel data. |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1022 */ |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1023 static int read_channel_data(ALSDecContext *ctx, ALSChannelData *cd, int c) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1024 { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1025 GetBitContext *gb = &ctx->gb; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1026 ALSChannelData *current = cd; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1027 unsigned int channels = ctx->avctx->channels; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1028 int entries = 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1029 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1030 while (entries < channels && !(current->stop_flag = get_bits1(gb))) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1031 current->master_channel = get_bits_long(gb, av_ceil_log2(channels)); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1032 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1033 if (current->master_channel >= channels) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1034 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid master channel!\n"); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1035 return -1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1036 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1037 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1038 if (current->master_channel != c) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1039 current->time_diff_flag = get_bits1(gb); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1040 current->weighting[0] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1041 current->weighting[1] = mcc_weightings[av_clip(decode_rice(gb, 2) + 14, 0, 32)]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1042 current->weighting[2] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1043 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1044 if (current->time_diff_flag) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1045 current->weighting[3] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1046 current->weighting[4] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1047 current->weighting[5] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1048 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1049 current->time_diff_sign = get_bits1(gb); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1050 current->time_diff_index = get_bits(gb, ctx->ltp_lag_length - 3) + 3; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1051 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1052 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1053 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1054 current++; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1055 entries++; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1056 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1057 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1058 if (entries == channels) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1059 av_log(ctx->avctx, AV_LOG_ERROR, "Damaged channel data!\n"); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1060 return -1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1061 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1062 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1063 align_get_bits(gb); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1064 return 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1065 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1066 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1067 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1068 /** Recursively reverts the inter-channel correlation for a block. |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1069 */ |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1070 static int revert_channel_correlation(ALSDecContext *ctx, ALSBlockData *bd, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1071 ALSChannelData **cd, int *reverted, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1072 unsigned int offset, int c) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1073 { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1074 ALSChannelData *ch = cd[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1075 unsigned int dep = 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1076 unsigned int channels = ctx->avctx->channels; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1077 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1078 if (reverted[c]) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1079 return 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1080 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1081 reverted[c] = 1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1082 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1083 while (dep < channels && !ch[dep].stop_flag) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1084 revert_channel_correlation(ctx, bd, cd, reverted, offset, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1085 ch[dep].master_channel); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1086 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1087 dep++; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1088 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1089 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1090 if (dep == channels) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1091 av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel correlation!\n"); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1092 return -1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1093 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1094 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1095 bd->use_ltp = ctx->use_ltp + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1096 bd->ltp_lag = ctx->ltp_lag + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1097 bd->ltp_gain = ctx->ltp_gain[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1098 bd->lpc_cof = ctx->lpc_cof[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1099 bd->quant_cof = ctx->quant_cof[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1100 bd->raw_samples = ctx->raw_samples[c] + offset; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1101 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1102 dep = 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1103 while (!ch[dep].stop_flag) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1104 unsigned int smp; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1105 unsigned int begin = 1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1106 unsigned int end = bd->block_length - 1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1107 int64_t y; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1108 int32_t *master = ctx->raw_samples[ch[dep].master_channel] + offset; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1109 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1110 if (ch[dep].time_diff_flag) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1111 int t = ch[dep].time_diff_index; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1112 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1113 if (ch[dep].time_diff_sign) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1114 t = -t; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1115 begin -= t; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1116 } else { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1117 end -= t; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1118 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1119 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1120 for (smp = begin; smp < end; smp++) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1121 y = (1 << 6) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1122 MUL64(ch[dep].weighting[0], master[smp - 1 ]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1123 MUL64(ch[dep].weighting[1], master[smp ]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1124 MUL64(ch[dep].weighting[2], master[smp + 1 ]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1125 MUL64(ch[dep].weighting[3], master[smp - 1 + t]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1126 MUL64(ch[dep].weighting[4], master[smp + t]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1127 MUL64(ch[dep].weighting[5], master[smp + 1 + t]); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1128 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1129 bd->raw_samples[smp] += y >> 7; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1130 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1131 } else { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1132 for (smp = begin; smp < end; smp++) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1133 y = (1 << 6) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1134 MUL64(ch[dep].weighting[0], master[smp - 1]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1135 MUL64(ch[dep].weighting[1], master[smp ]) + |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1136 MUL64(ch[dep].weighting[2], master[smp + 1]); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1137 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1138 bd->raw_samples[smp] += y >> 7; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1139 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1140 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1141 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1142 dep++; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1143 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1144 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1145 return 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1146 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1147 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1148 |
| 10522 | 1149 /** Reads the frame data. |
| 1150 */ | |
| 1151 static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame) | |
| 1152 { | |
| 1153 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 1154 AVCodecContext *avctx = ctx->avctx; | |
| 1155 GetBitContext *gb = &ctx->gb; | |
| 1156 unsigned int div_blocks[32]; ///< block sizes. | |
| 1157 unsigned int c; | |
| 1158 unsigned int js_blocks[2]; | |
| 1159 | |
| 1160 uint32_t bs_info = 0; | |
| 1161 | |
| 1162 // skip the size of the ra unit if present in the frame | |
| 1163 if (sconf->ra_flag == RA_FLAG_FRAMES && ra_frame) | |
| 1164 skip_bits_long(gb, 32); | |
| 1165 | |
| 1166 if (sconf->mc_coding && sconf->joint_stereo) { | |
| 1167 ctx->js_switch = get_bits1(gb); | |
| 1168 align_get_bits(gb); | |
| 1169 } | |
| 1170 | |
| 1171 if (!sconf->mc_coding || ctx->js_switch) { | |
| 1172 int independent_bs = !sconf->joint_stereo; | |
| 1173 | |
| 1174 for (c = 0; c < avctx->channels; c++) { | |
| 1175 js_blocks[0] = 0; | |
| 1176 js_blocks[1] = 0; | |
| 1177 | |
| 1178 get_block_sizes(ctx, div_blocks, &bs_info); | |
| 1179 | |
| 1180 // if joint_stereo and block_switching is set, independent decoding | |
| 1181 // is signaled via the first bit of bs_info | |
| 1182 if (sconf->joint_stereo && sconf->block_switching) | |
| 1183 if (bs_info >> 31) | |
| 1184 independent_bs = 2; | |
| 1185 | |
| 1186 // if this is the last channel, it has to be decoded independently | |
| 1187 if (c == avctx->channels - 1) | |
| 1188 independent_bs = 1; | |
| 1189 | |
| 1190 if (independent_bs) { | |
| 1191 if (decode_blocks_ind(ctx, ra_frame, c, div_blocks, js_blocks)) | |
| 1192 return -1; | |
| 1193 | |
| 1194 independent_bs--; | |
| 1195 } else { | |
| 1196 if (decode_blocks(ctx, ra_frame, c, div_blocks, js_blocks)) | |
| 1197 return -1; | |
| 1198 | |
| 1199 c++; | |
| 1200 } | |
| 1201 | |
| 1202 // store carryover raw samples | |
| 1203 memmove(ctx->raw_samples[c] - sconf->max_order, | |
| 1204 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length, | |
| 1205 sizeof(*ctx->raw_samples[c]) * sconf->max_order); | |
| 1206 } | |
| 1207 } else { // multi-channel coding | |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1208 ALSBlockData bd; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1209 int b; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1210 int *reverted_channels = ctx->reverted_channels; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1211 unsigned int offset = 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1212 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1213 for (c = 0; c < avctx->channels; c++) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1214 if (ctx->chan_data[c] < ctx->chan_data_buffer) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1215 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid channel data!\n"); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1216 return -1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1217 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1218 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1219 memset(&bd, 0, sizeof(ALSBlockData)); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1220 memset(reverted_channels, 0, sizeof(*reverted_channels) * avctx->channels); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1221 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1222 bd.ra_block = ra_frame; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1223 bd.prev_raw_samples = ctx->prev_raw_samples; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1224 |
| 10522 | 1225 get_block_sizes(ctx, div_blocks, &bs_info); |
| 1226 | |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1227 for (b = 0; b < ctx->num_blocks; b++) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1228 bd.shift_lsbs = 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1229 bd.block_length = div_blocks[b]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1230 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1231 for (c = 0; c < avctx->channels; c++) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1232 bd.use_ltp = ctx->use_ltp + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1233 bd.ltp_lag = ctx->ltp_lag + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1234 bd.ltp_gain = ctx->ltp_gain[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1235 bd.lpc_cof = ctx->lpc_cof[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1236 bd.quant_cof = ctx->quant_cof[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1237 bd.raw_samples = ctx->raw_samples[c] + offset; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1238 bd.raw_other = NULL; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1239 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1240 read_block(ctx, &bd); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1241 if (read_channel_data(ctx, ctx->chan_data[c], c)) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1242 return -1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1243 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1244 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1245 for (c = 0; c < avctx->channels; c++) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1246 if (revert_channel_correlation(ctx, &bd, ctx->chan_data, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1247 reverted_channels, offset, c)) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1248 return -1; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1249 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1250 for (c = 0; c < avctx->channels; c++) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1251 bd.use_ltp = ctx->use_ltp + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1252 bd.ltp_lag = ctx->ltp_lag + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1253 bd.ltp_gain = ctx->ltp_gain[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1254 bd.lpc_cof = ctx->lpc_cof[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1255 bd.quant_cof = ctx->quant_cof[c]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1256 bd.raw_samples = ctx->raw_samples[c] + offset; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1257 decode_block(ctx, &bd); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1258 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1259 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1260 memset(reverted_channels, 0, avctx->channels * sizeof(*reverted_channels)); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1261 offset += div_blocks[b]; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1262 bd.ra_block = 0; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1263 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1264 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1265 // store carryover raw samples |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1266 for (c = 0; c < avctx->channels; c++) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1267 memmove(ctx->raw_samples[c] - sconf->max_order, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1268 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length, |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1269 sizeof(*ctx->raw_samples[c]) * sconf->max_order); |
| 10522 | 1270 } |
| 1271 | |
| 1272 // TODO: read_diff_float_data | |
| 1273 | |
| 1274 return 0; | |
| 1275 } | |
| 1276 | |
| 1277 | |
| 1278 /** Decodes an ALS frame. | |
| 1279 */ | |
| 1280 static int decode_frame(AVCodecContext *avctx, | |
| 1281 void *data, int *data_size, | |
| 1282 AVPacket *avpkt) | |
| 1283 { | |
| 1284 ALSDecContext *ctx = avctx->priv_data; | |
| 1285 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 1286 const uint8_t *buffer = avpkt->data; | |
| 1287 int buffer_size = avpkt->size; | |
| 1288 int invalid_frame, size; | |
| 1289 unsigned int c, sample, ra_frame, bytes_read, shift; | |
| 1290 | |
| 1291 init_get_bits(&ctx->gb, buffer, buffer_size * 8); | |
| 1292 | |
| 1293 // In the case that the distance between random access frames is set to zero | |
| 1294 // (sconf->ra_distance == 0) no frame is treated as a random access frame. | |
| 1295 // For the first frame, if prediction is used, all samples used from the | |
| 1296 // previous frame are assumed to be zero. | |
| 1297 ra_frame = sconf->ra_distance && !(ctx->frame_id % sconf->ra_distance); | |
| 1298 | |
| 1299 // the last frame to decode might have a different length | |
| 1300 if (sconf->samples != 0xFFFFFFFF) | |
| 1301 ctx->cur_frame_length = FFMIN(sconf->samples - ctx->frame_id * (uint64_t) sconf->frame_length, | |
| 1302 sconf->frame_length); | |
| 1303 else | |
| 1304 ctx->cur_frame_length = sconf->frame_length; | |
| 1305 | |
| 1306 // decode the frame data | |
| 1307 if ((invalid_frame = read_frame_data(ctx, ra_frame) < 0)) | |
| 1308 av_log(ctx->avctx, AV_LOG_WARNING, | |
| 1309 "Reading frame data failed. Skipping RA unit.\n"); | |
| 1310 | |
| 1311 ctx->frame_id++; | |
| 1312 | |
| 1313 // check for size of decoded data | |
| 1314 size = ctx->cur_frame_length * avctx->channels * | |
| 1315 (av_get_bits_per_sample_format(avctx->sample_fmt) >> 3); | |
| 1316 | |
| 1317 if (size > *data_size) { | |
| 1318 av_log(avctx, AV_LOG_ERROR, "Decoded data exceeds buffer size.\n"); | |
| 1319 return -1; | |
| 1320 } | |
| 1321 | |
| 1322 *data_size = size; | |
| 1323 | |
| 1324 // transform decoded frame into output format | |
| 1325 #define INTERLEAVE_OUTPUT(bps) \ | |
| 1326 { \ | |
| 1327 int##bps##_t *dest = (int##bps##_t*) data; \ | |
| 1328 shift = bps - ctx->avctx->bits_per_raw_sample; \ | |
| 1329 for (sample = 0; sample < ctx->cur_frame_length; sample++) \ | |
| 1330 for (c = 0; c < avctx->channels; c++) \ | |
| 1331 *dest++ = ctx->raw_samples[c][sample] << shift; \ | |
| 1332 } | |
| 1333 | |
| 1334 if (ctx->avctx->bits_per_raw_sample <= 16) { | |
| 1335 INTERLEAVE_OUTPUT(16) | |
| 1336 } else { | |
| 1337 INTERLEAVE_OUTPUT(32) | |
| 1338 } | |
| 1339 | |
| 1340 bytes_read = invalid_frame ? buffer_size : | |
| 1341 (get_bits_count(&ctx->gb) + 7) >> 3; | |
| 1342 | |
| 1343 return bytes_read; | |
| 1344 } | |
| 1345 | |
| 1346 | |
| 1347 /** Uninitializes the ALS decoder. | |
| 1348 */ | |
| 1349 static av_cold int decode_end(AVCodecContext *avctx) | |
| 1350 { | |
| 1351 ALSDecContext *ctx = avctx->priv_data; | |
| 1352 | |
| 1353 av_freep(&ctx->sconf.chan_pos); | |
| 1354 | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1355 av_freep(&ctx->use_ltp); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1356 av_freep(&ctx->ltp_lag); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1357 av_freep(&ctx->ltp_gain); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1358 av_freep(&ctx->ltp_gain_buffer); |
| 10522 | 1359 av_freep(&ctx->quant_cof); |
| 1360 av_freep(&ctx->lpc_cof); | |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1361 av_freep(&ctx->quant_cof_buffer); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1362 av_freep(&ctx->lpc_cof_buffer); |
|
10860
c9fb5b89e47a
Replace variable length array with an allocated buffer
thilo.borgmann
parents:
10823
diff
changeset
|
1363 av_freep(&ctx->lpc_cof_reversed_buffer); |
| 10522 | 1364 av_freep(&ctx->prev_raw_samples); |
| 1365 av_freep(&ctx->raw_samples); | |
| 1366 av_freep(&ctx->raw_buffer); | |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1367 av_freep(&ctx->chan_data); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1368 av_freep(&ctx->chan_data_buffer); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1369 av_freep(&ctx->reverted_channels); |
| 10522 | 1370 |
| 1371 return 0; | |
| 1372 } | |
| 1373 | |
| 1374 | |
| 1375 /** Initializes the ALS decoder. | |
| 1376 */ | |
| 1377 static av_cold int decode_init(AVCodecContext *avctx) | |
| 1378 { | |
| 1379 unsigned int c; | |
| 1380 unsigned int channel_size; | |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1381 int num_buffers; |
| 10522 | 1382 ALSDecContext *ctx = avctx->priv_data; |
| 1383 ALSSpecificConfig *sconf = &ctx->sconf; | |
| 1384 ctx->avctx = avctx; | |
| 1385 | |
| 1386 if (!avctx->extradata) { | |
| 1387 av_log(avctx, AV_LOG_ERROR, "Missing required ALS extradata.\n"); | |
| 1388 return -1; | |
| 1389 } | |
| 1390 | |
| 1391 if (read_specific_config(ctx)) { | |
| 1392 av_log(avctx, AV_LOG_ERROR, "Reading ALSSpecificConfig failed.\n"); | |
| 1393 decode_end(avctx); | |
| 1394 return -1; | |
| 1395 } | |
| 1396 | |
| 1397 if (check_specific_config(ctx)) { | |
| 1398 decode_end(avctx); | |
| 1399 return -1; | |
| 1400 } | |
| 1401 | |
| 1402 if (sconf->floating) { | |
| 1403 avctx->sample_fmt = SAMPLE_FMT_FLT; | |
| 1404 avctx->bits_per_raw_sample = 32; | |
| 1405 } else { | |
| 1406 avctx->sample_fmt = sconf->resolution > 1 | |
| 1407 ? SAMPLE_FMT_S32 : SAMPLE_FMT_S16; | |
| 1408 avctx->bits_per_raw_sample = (sconf->resolution + 1) * 8; | |
| 1409 } | |
| 1410 | |
|
10530
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
1411 // set lag value for long-term prediction |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
1412 ctx->ltp_lag_length = 8 + (avctx->sample_rate >= 96000) + |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
1413 (avctx->sample_rate >= 192000); |
|
d428e57f14c6
Add long-term prediction to the ALS decoder.
thilo.borgmann
parents:
10524
diff
changeset
|
1414 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1415 // allocate quantized parcor coefficient buffer |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1416 num_buffers = sconf->mc_coding ? avctx->channels : 1; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1417 |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1418 ctx->quant_cof = av_malloc(sizeof(*ctx->quant_cof) * num_buffers); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1419 ctx->lpc_cof = av_malloc(sizeof(*ctx->lpc_cof) * num_buffers); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1420 ctx->quant_cof_buffer = av_malloc(sizeof(*ctx->quant_cof_buffer) * |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1421 num_buffers * sconf->max_order); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1422 ctx->lpc_cof_buffer = av_malloc(sizeof(*ctx->lpc_cof_buffer) * |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1423 num_buffers * sconf->max_order); |
|
10860
c9fb5b89e47a
Replace variable length array with an allocated buffer
thilo.borgmann
parents:
10823
diff
changeset
|
1424 ctx->lpc_cof_reversed_buffer = av_malloc(sizeof(*ctx->lpc_cof_buffer) * |
|
c9fb5b89e47a
Replace variable length array with an allocated buffer
thilo.borgmann
parents:
10823
diff
changeset
|
1425 sconf->max_order); |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1426 |
| 10861 | 1427 if (!ctx->quant_cof || !ctx->lpc_cof || |
| 1428 !ctx->quant_cof_buffer || !ctx->lpc_cof_buffer || | |
|
10860
c9fb5b89e47a
Replace variable length array with an allocated buffer
thilo.borgmann
parents:
10823
diff
changeset
|
1429 !ctx->lpc_cof_reversed_buffer) { |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1430 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1431 return AVERROR(ENOMEM); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1432 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1433 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1434 // assign quantized parcor coefficient buffers |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1435 for (c = 0; c < num_buffers; c++) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1436 ctx->quant_cof[c] = ctx->quant_cof_buffer + c * sconf->max_order; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1437 ctx->lpc_cof[c] = ctx->lpc_cof_buffer + c * sconf->max_order; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1438 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1439 |
|
10681
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1440 // allocate and assign lag and gain data buffer for ltp mode |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1441 ctx->use_ltp = av_mallocz(sizeof(*ctx->use_ltp) * num_buffers); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1442 ctx->ltp_lag = av_malloc (sizeof(*ctx->ltp_lag) * num_buffers); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1443 ctx->ltp_gain = av_malloc (sizeof(*ctx->ltp_gain) * num_buffers); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1444 ctx->ltp_gain_buffer = av_malloc (sizeof(*ctx->ltp_gain_buffer) * |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1445 num_buffers * 5); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1446 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1447 if (!ctx->use_ltp || !ctx->ltp_lag || |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1448 !ctx->ltp_gain || !ctx->ltp_gain_buffer) { |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1449 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1450 decode_end(avctx); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1451 return AVERROR(ENOMEM); |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1452 } |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1453 |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1454 for (c = 0; c < num_buffers; c++) |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1455 ctx->ltp_gain[c] = ctx->ltp_gain_buffer + c * 5; |
|
997692df50c1
Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents:
10535
diff
changeset
|
1456 |
|
10802
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1457 // allocate and assign channel data buffer for mcc mode |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1458 if (sconf->mc_coding) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1459 ctx->chan_data_buffer = av_malloc(sizeof(*ctx->chan_data_buffer) * |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1460 num_buffers); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1461 ctx->chan_data = av_malloc(sizeof(ALSChannelData) * |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1462 num_buffers); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1463 ctx->reverted_channels = av_malloc(sizeof(*ctx->reverted_channels) * |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1464 num_buffers); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1465 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1466 if (!ctx->chan_data_buffer || !ctx->chan_data || !ctx->reverted_channels) { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1467 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1468 decode_end(avctx); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1469 return AVERROR(ENOMEM); |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1470 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1471 |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1472 for (c = 0; c < num_buffers; c++) |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1473 ctx->chan_data[c] = ctx->chan_data_buffer + c; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1474 } else { |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1475 ctx->chan_data = NULL; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1476 ctx->chan_data_buffer = NULL; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1477 ctx->reverted_channels = NULL; |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1478 } |
|
4f614b69b4e5
Add multi-channel correlation support for ALS.
thilo.borgmann
parents:
10800
diff
changeset
|
1479 |
| 10522 | 1480 avctx->frame_size = sconf->frame_length; |
| 1481 channel_size = sconf->frame_length + sconf->max_order; | |
| 1482 | |
| 1483 ctx->prev_raw_samples = av_malloc (sizeof(*ctx->prev_raw_samples) * sconf->max_order); | |
| 1484 ctx->raw_buffer = av_mallocz(sizeof(*ctx-> raw_buffer) * avctx->channels * channel_size); | |
| 1485 ctx->raw_samples = av_malloc (sizeof(*ctx-> raw_samples) * avctx->channels); | |
| 1486 | |
| 1487 // allocate previous raw sample buffer | |
| 1488 if (!ctx->prev_raw_samples || !ctx->raw_buffer|| !ctx->raw_samples) { | |
| 1489 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | |
| 1490 decode_end(avctx); | |
| 1491 return AVERROR(ENOMEM); | |
| 1492 } | |
| 1493 | |
| 1494 // assign raw samples buffers | |
| 1495 ctx->raw_samples[0] = ctx->raw_buffer + sconf->max_order; | |
| 1496 for (c = 1; c < avctx->channels; c++) | |
| 1497 ctx->raw_samples[c] = ctx->raw_samples[c - 1] + channel_size; | |
| 1498 | |
| 1499 return 0; | |
| 1500 } | |
| 1501 | |
| 1502 | |
| 1503 /** Flushes (resets) the frame ID after seeking. | |
| 1504 */ | |
| 1505 static av_cold void flush(AVCodecContext *avctx) | |
| 1506 { | |
| 1507 ALSDecContext *ctx = avctx->priv_data; | |
| 1508 | |
| 1509 ctx->frame_id = 0; | |
| 1510 } | |
| 1511 | |
| 1512 | |
| 1513 AVCodec als_decoder = { | |
| 1514 "als", | |
| 1515 CODEC_TYPE_AUDIO, | |
| 1516 CODEC_ID_MP4ALS, | |
| 1517 sizeof(ALSDecContext), | |
| 1518 decode_init, | |
| 1519 NULL, | |
| 1520 decode_end, | |
| 1521 decode_frame, | |
| 1522 .flush = flush, | |
| 1523 .capabilities = CODEC_CAP_SUBFRAMES, | |
| 1524 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 Audio Lossless Coding (ALS)"), | |
| 1525 }; | |
| 1526 |
