comparison ps.c @ 11887:c432b63b345e libavcodec

psdec: Factorize iid/icc/ipd/opd parameter bitstream reading.
author alexc
date Sat, 19 Jun 2010 23:53:21 +0000
parents 2d81202be6e2
children 747ea58d1ac6
comparison
equal deleted inserted replaced
11886:2d81202be6e2 11887:c432b63b345e
65 }; 65 };
66 66
67 static VLC vlc_ps[10]; 67 static VLC vlc_ps[10];
68 68
69 /** 69 /**
70 * Read Inter-channel Intensity Difference parameters from the bitstream. 70 * Read Inter-channel Intensity Difference/Inter-Channel Coherence/
71 * Inter-channel Phase Difference/Overall Phase Difference parameters from the
72 * bitstream.
71 * 73 *
72 * @param avctx contains the current codec context 74 * @param avctx contains the current codec context
73 * @param gb pointer to the input bitstream 75 * @param gb pointer to the input bitstream
74 * @param ps pointer to the Parametric Stereo context 76 * @param ps pointer to the Parametric Stereo context
77 * @param par pointer to the parameter to be read
75 * @param e envelope to decode 78 * @param e envelope to decode
76 * @param dt 1: time delta-coded, 0: frequency delta-coded 79 * @param dt 1: time delta-coded, 0: frequency delta-coded
77 */ 80 */
78 static int iid_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int e, int dt) 81 #define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION) \
79 { 82 static int PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, \
80 int b; 83 int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \
81 int table_idx = huff_iid[2*dt+ps->iid_quant]; 84 { \
82 VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; 85 int b, num = ps->nr_ ## PAR ## _par; \
83 if (dt) { 86 VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; \
84 int e_prev = e ? e - 1 : ps->num_env_old - 1; 87 if (dt) { \
85 e_prev = FFMAX(e_prev, 0); 88 int e_prev = e ? e - 1 : ps->num_env_old - 1; \
86 for (b = 0; b < ps->nr_iid_par; b++) { 89 e_prev = FFMAX(e_prev, 0); \
87 ps->iid_par[e][b] = ps->iid_par[e_prev][b] + 90 for (b = 0; b < num; b++) { \
88 get_vlc2(gb, vlc_table, 9, 3) - 91 int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
89 huff_offset[table_idx]; 92 if (MASK) val &= MASK; \
90 if (FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant) 93 PAR[e][b] = val; \
91 goto err; 94 if (ERR_CONDITION) \
92 } 95 goto err; \
93 } else { 96 } \
94 int prev = 0; 97 } else { \
95 for (b = 0; b < ps->nr_iid_par; b++) { 98 int val = 0; \
96 prev += get_vlc2(gb, vlc_table, 9, 3) - 99 for (b = 0; b < num; b++) { \
97 huff_offset[table_idx]; 100 val += get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
98 ps->iid_par[e][b] = prev; 101 if (MASK) val &= MASK; \
99 if (FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant) 102 PAR[e][b] = val; \
100 goto err; 103 if (ERR_CONDITION) \
101 } 104 goto err; \
102 } 105 } \
103 return 0; 106 } \
104 err: 107 return 0; \
105 av_log(avctx, AV_LOG_ERROR, "illegal iid\n"); 108 err: \
106 return -1; 109 av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \
107 } 110 return -1; \
108 111 }
109 /** 112
110 * Read Inter-Channel Coherence parameters from the bitstream. 113 READ_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant)
111 * 114 READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U)
112 * @param avctx contains the current codec context 115 READ_PAR_DATA(ipdopd, 0, 0x07, 0)
113 * @param gb pointer to the input bitstream
114 * @param ps pointer to the Parametric Stereo context
115 * @param e envelope to decode
116 * @param dt 1: time delta-coded, 0: frequency delta-coded
117 */
118 static int icc_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int e, int dt)
119 {
120 int b;
121 int table_idx = dt ? huff_icc_dt : huff_icc_df;
122 VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table;
123 if (dt) {
124 int e_prev = e ? e - 1 : ps->num_env_old - 1;
125 e_prev = FFMAX(e_prev, 0);
126 for (b = 0; b < ps->nr_icc_par; b++) {
127 ps->icc_par[e][b] = ps->icc_par[e_prev][b] + get_vlc2(gb, vlc_table, 9, 3) - huff_offset[table_idx];
128 if (ps->icc_par[e][b] > 7U)
129 goto err;
130 }
131 } else {
132 int prev = 0;
133 for (b = 0; b < ps->nr_icc_par; b++) {
134 prev += get_vlc2(gb, vlc_table, 9, 3) - huff_offset[table_idx];
135 ps->icc_par[e][b] = prev;
136 if (ps->icc_par[e][b] > 7U)
137 goto err;
138 }
139 }
140 return 0;
141 err:
142 av_log(avctx, AV_LOG_ERROR, "illegal icc\n");
143 return -1;
144 }
145
146 /**
147 * Read Inter-channel Phase Difference parameters from the bitstream.
148 *
149 * @param gb pointer to the input bitstream
150 * @param ps pointer to the Parametric Stereo context
151 * @param e envelope to decode
152 * @param dt 1: time delta-coded, 0: frequency delta-coded
153 */
154 static void ipd_data(GetBitContext *gb, PSContext *ps, int e, int dt)
155 {
156 int b;
157 int table_idx = dt ? huff_ipd_dt : huff_ipd_df;
158 VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table;
159 if (dt) {
160 int e_prev = e ? e - 1 : ps->num_env_old - 1;
161 e_prev = FFMAX(e_prev, 0);
162 for (b = 0; b < ps->nr_ipdopd_par; b++) {
163 ps->ipd_par[e][b] = (ps->ipd_par[e_prev][b] + get_vlc2(gb, vlc_table, 9, 1)) & 0x07;
164 }
165 } else {
166 int prev = 0;
167 for (b = 0; b < ps->nr_ipdopd_par; b++) {
168 prev += get_vlc2(gb, vlc_table, 9, 3);
169 prev &= 0x07;
170 ps->ipd_par[e][b] = prev;
171 }
172 }
173 }
174
175 /**
176 * Read Overall Phase Difference parameters from the bitstream.
177 *
178 * @param gb pointer to the input bitstream
179 * @param ps pointer to the Parametric Stereo context
180 * @param e envelope to decode
181 * @param dt 1: time delta-coded, 0: frequency delta-coded
182 */
183 static void opd_data(GetBitContext *gb, PSContext *ps, int e, int dt)
184 {
185 int b;
186 int table_idx = dt ? huff_opd_dt : huff_opd_df;
187 VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table;
188 if (dt) {
189 int e_prev = e ? e - 1 : ps->num_env_old - 1;
190 e_prev = FFMAX(e_prev, 0);
191 for (b = 0; b < ps->nr_ipdopd_par; b++) {
192 ps->opd_par[e][b] = (ps->opd_par[e_prev][b] + get_vlc2(gb, vlc_table, 9, 1)) & 0x07;
193 }
194 } else {
195 int prev = 0;
196 for (b = 0; b < ps->nr_ipdopd_par; b++) {
197 prev += get_vlc2(gb, vlc_table, 9, 3);
198 prev &= 0x07;
199 ps->opd_par[e][b] = prev;
200 }
201 }
202 }
203 116
204 static int ps_extension(GetBitContext *gb, PSContext *ps, int ps_extension_id) 117 static int ps_extension(GetBitContext *gb, PSContext *ps, int ps_extension_id)
205 { 118 {
206 int e; 119 int e;
207 int count = get_bits_count(gb); 120 int count = get_bits_count(gb);
211 124
212 ps->enable_ipdopd = get_bits1(gb); 125 ps->enable_ipdopd = get_bits1(gb);
213 if (ps->enable_ipdopd) { 126 if (ps->enable_ipdopd) {
214 for (e = 0; e < ps->num_env; e++) { 127 for (e = 0; e < ps->num_env; e++) {
215 int dt = get_bits1(gb); 128 int dt = get_bits1(gb);
216 ipd_data(gb, ps, e, dt); 129 ipdopd_data(NULL, gb, ps, ps->ipd_par, dt ? huff_ipd_dt : huff_ipd_df, e, dt);
217 dt = get_bits1(gb); 130 dt = get_bits1(gb);
218 opd_data(gb, ps, e, dt); 131 ipdopd_data(NULL, gb, ps, ps->opd_par, dt ? huff_opd_dt : huff_opd_df, e, dt);
219 } 132 }
220 } 133 }
221 skip_bits1(gb); //reserved_ps 134 skip_bits1(gb); //reserved_ps
222 return get_bits_count(gb) - count; 135 return get_bits_count(gb) - count;
223 } 136 }
279 ps->border_position[e] = e * numQMFSlots / ps->num_env - 1; 192 ps->border_position[e] = e * numQMFSlots / ps->num_env - 1;
280 193
281 if (ps->enable_iid) { 194 if (ps->enable_iid) {
282 for (e = 0; e < ps->num_env; e++) { 195 for (e = 0; e < ps->num_env; e++) {
283 int dt = get_bits1(gb); 196 int dt = get_bits1(gb);
284 if (iid_data(avctx, gb, ps, e, dt)) 197 if (iid_data(avctx, gb, ps, ps->iid_par, huff_iid[2*dt+ps->iid_quant], e, dt))
285 goto err; 198 goto err;
286 } 199 }
287 } else 200 } else
288 memset(ps->iid_par, 0, sizeof(ps->iid_par)); 201 memset(ps->iid_par, 0, sizeof(ps->iid_par));
289 202
290 if (ps->enable_icc) 203 if (ps->enable_icc)
291 for (e = 0; e < ps->num_env; e++) { 204 for (e = 0; e < ps->num_env; e++) {
292 int dt = get_bits1(gb); 205 int dt = get_bits1(gb);
293 if (icc_data(avctx, gb, ps, e, dt)) 206 if (icc_data(avctx, gb, ps, ps->icc_par, dt ? huff_icc_dt : huff_icc_df, e, dt))
294 goto err; 207 goto err;
295 } 208 }
296 else 209 else
297 memset(ps->icc_par, 0, sizeof(ps->icc_par)); 210 memset(ps->icc_par, 0, sizeof(ps->icc_par));
298 211