Originally committed as revision 23652 to svn://svn.ffmpeg.org/ffmpeg/trunk
Unified · Split
| @@ -67,139 +67,52 @@ static const int huff_iid[] = { · 66 unmodified lines | ||
| 67 | 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 | 74 | * @param avctx contains the current codec context |
| 73 | 75 | * @param gb pointer to the input bitstream |
| 74 | 76 | * @param ps pointer to the Parametric Stereo context |
| 77 | + * @param par pointer to the parameter to be read | |
| 75 | 78 | * @param e envelope to decode |
| 76 | 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) | |
| 79 | −{ | |
| 80 | − int b; | |
| 81 | − int table_idx = huff_iid[2*dt+ps->iid_quant]; | |
| 82 | − VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; | |
| 83 | − if (dt) { | |
| 84 | − int e_prev = e ? e - 1 : ps->num_env_old - 1; | |
| 85 | − e_prev = FFMAX(e_prev, 0); | |
| 86 | − for (b = 0; b < ps->nr_iid_par; b++) { | |
| 87 | − ps->iid_par[e][b] = ps->iid_par[e_prev][b] + | |
| 88 | − get_vlc2(gb, vlc_table, 9, 3) - | |
| 89 | − huff_offset[table_idx]; | |
| 90 | − if (FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant) | |
| 91 | − goto err; | |
| 92 | − } | |
| 93 | − } else { | |
| 94 | − int prev = 0; | |
| 95 | − for (b = 0; b < ps->nr_iid_par; b++) { | |
| 96 | − prev += get_vlc2(gb, vlc_table, 9, 3) - | |
| 97 | − huff_offset[table_idx]; | |
| 98 | − ps->iid_par[e][b] = prev; | |
| 99 | − if (FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant) | |
| 100 | − goto err; | |
| 101 | − } | |
| 102 | − } | |
| 103 | − return 0; | |
| 104 | −err: | |
| 105 | − av_log(avctx, AV_LOG_ERROR, "illegal iid\n"); | |
| 106 | − return -1; | |
| 107 | −} | |
| 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 | − */ | |
| 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; | |
| 81 | +#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION) \ | |
| 82 | +static int PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, \ | |
| 83 | + int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \ | |
| 84 | +{ \ | |
| 85 | + int b, num = ps->nr_ ## PAR ## _par; \ | |
| 86 | + VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; \ | |
| 87 | + if (dt) { \ | |
| 88 | + int e_prev = e ? e - 1 : ps->num_env_old - 1; \ | |
| 89 | + e_prev = FFMAX(e_prev, 0); \ | |
| 90 | + for (b = 0; b < num; b++) { \ | |
| 91 | + int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \ | |
| 92 | + if (MASK) val &= MASK; \ | |
| 93 | + PAR[e][b] = val; \ | |
| 94 | + if (ERR_CONDITION) \ | |
| 95 | + goto err; \ | |
| 96 | + } \ | |
| 97 | + } else { \ | |
| 98 | + int val = 0; \ | |
| 99 | + for (b = 0; b < num; b++) { \ | |
| 100 | + val += get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \ | |
| 101 | + if (MASK) val &= MASK; \ | |
| 102 | + PAR[e][b] = val; \ | |
| 103 | + if (ERR_CONDITION) \ | |
| 104 | + goto err; \ | |
| 105 | + } \ | |
| 106 | + } \ | |
| 107 | + return 0; \ | |
| 108 | +err: \ | |
| 109 | + av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \ | |
| 110 | + return -1; \ | |
| 144 | 111 | } |
| 145 | 112 | |
| 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 | −} | |
| 113 | +READ_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant) | |
| 114 | +READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U) | |
| 115 | +READ_PAR_DATA(ipdopd, 0, 0x07, 0) | |
| 203 | 116 | |
| 204 | 117 | static 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 | 126 | if (ps->enable_ipdopd) { |
| 214 | 127 | for (e = 0; e < ps->num_env; e++) { |
| 215 | 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 | 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 | 134 | 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 | 194 | if (ps->enable_iid) { |
| 282 | 195 | for (e = 0; e < ps->num_env; e++) { |
| 283 | 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 | 198 | goto err; |
| 286 | 199 | } |
| 287 | 200 | } else |
| @@ -290,7 +203,7 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host, PSContext *ps · 2 unmodified lines | ||
| 290 | 203 | if (ps->enable_icc) |
| 291 | 204 | for (e = 0; e < ps->num_env; e++) { |
| 292 | 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 | 207 | goto err; |
| 295 | 208 | } |
| 296 | 209 | else |