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 | 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 | |||
| 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; | ||
| 144 | } | 111 | } |
| 145 | 112 | ||
| 146 | /** | 113 | READ_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. | 114 | READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U) |
| 148 | * | 115 | READ_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 | */ | ||
| 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 | { |
| @@ -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_ps | 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 | 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 |
| @@ -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 | else | 209 | else |