History

psdec: Factorize iid/icc/ipd/opd parameter bitstream reading.

Originally committed as revision 23652 to svn://svn.ffmpeg.org/ffmpeg/trunk

Alex Converse committed 16 years ago

Commit 1076b0d1 parent 10ed37b1 file · +41 −128Browse files

Unified · Split

libavcodec/ps.c+41−128
@@ -67,139 +67,52 @@ static const int huff_iid[] = { · 66 unmodified lines
67static VLC vlc_ps[10];67static 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 context74 * @param avctx contains the current codec context
73 * @param gb pointer to the input bitstream75 * @param gb pointer to the input bitstream
74 * @param ps pointer to the Parametric Stereo context76 * @param ps pointer to the Parametric Stereo context
77 * @param par pointer to the parameter to be read
75 * @param e envelope to decode78 * @param e envelope to decode
76 * @param dt 1: time delta-coded, 0: frequency delta-coded79 * @param dt 1: time delta-coded, 0: frequency delta-coded
77 */80 */
78static int iid_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int e, int dt)81#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION) \
79{82static 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 } \
104err:107 return 0; \
105 av_log(avctx, AV_LOG_ERROR, "illegal iid\n");108err: \
106 return -1;109 av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \
107}110 return -1; \
108
109/**
110 * Read Inter-Channel Coherence parameters from the bitstream.
111 *
112 * @param avctx contains the current codec context
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 */
118static 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;
141err:
142 av_log(avctx, AV_LOG_ERROR, "illegal icc\n");
143 return -1;
144}111}
145 112
146/**113READ_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant)
147 * Read Inter-channel Phase Difference parameters from the bitstream.114READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U)
148 *115READ_PAR_DATA(ipdopd, 0, 0x07, 0)
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 */
154static 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 */
183static 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
204static int ps_extension(GetBitContext *gb, PSContext *ps, int ps_extension_id)117static int ps_extension(GetBitContext *gb, PSContext *ps, int ps_extension_id)
205{118{
@@ -213,9 +126,9 @@ static int ps_extension(GetBitContext *gb, PSContext *ps, int ps_extension_id) · 7 unmodified lines
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_ps134 skip_bits1(gb); //reserved_ps
@@ -281,7 +194,7 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host, PSContext *ps · 59 unmodified lines
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 } else200 } else
@@ -290,7 +203,7 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host, PSContext *ps · 2 unmodified lines
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 else209 else

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t