Mercurial > libavcodec.hg
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 |