00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #include "libavutil/lfg.h"
00029 #include "avcodec.h"
00030 #include "get_bits.h"
00031 #include "dsputil.h"
00032 #include "mpegaudiodsp.h"
00033 #include "libavutil/audioconvert.h"
00034
00035 #include "mpc.h"
00036 #include "mpc7data.h"
00037
00038 #define BANDS 32
00039 #define SAMPLES_PER_BAND 36
00040 #define MPC_FRAME_SIZE (BANDS * SAMPLES_PER_BAND)
00041
00042 static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2];
00043
00044 static const uint16_t quant_offsets[MPC7_QUANT_VLC_TABLES*2 + 1] =
00045 {
00046 0, 512, 1024, 1536, 2052, 2564, 3076, 3588, 4100, 4612, 5124,
00047 5636, 6164, 6676, 7224
00048 };
00049
00050
00051 static av_cold int mpc7_decode_init(AVCodecContext * avctx)
00052 {
00053 int i, j;
00054 MPCContext *c = avctx->priv_data;
00055 GetBitContext gb;
00056 LOCAL_ALIGNED_16(uint8_t, buf, [16]);
00057 static int vlc_initialized = 0;
00058
00059 static VLC_TYPE scfi_table[1 << MPC7_SCFI_BITS][2];
00060 static VLC_TYPE dscf_table[1 << MPC7_DSCF_BITS][2];
00061 static VLC_TYPE hdr_table[1 << MPC7_HDR_BITS][2];
00062 static VLC_TYPE quant_tables[7224][2];
00063
00064
00065 if (avctx->channels != 2) {
00066 av_log_ask_for_sample(avctx, "Unsupported number of channels: %d\n",
00067 avctx->channels);
00068 return AVERROR_PATCHWELCOME;
00069 }
00070
00071 if(avctx->extradata_size < 16){
00072 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
00073 return -1;
00074 }
00075 memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
00076 av_lfg_init(&c->rnd, 0xDEADBEEF);
00077 ff_dsputil_init(&c->dsp, avctx);
00078 ff_mpadsp_init(&c->mpadsp);
00079 c->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)avctx->extradata, 4);
00080 ff_mpc_init();
00081 init_get_bits(&gb, buf, 128);
00082
00083 c->IS = get_bits1(&gb);
00084 c->MSS = get_bits1(&gb);
00085 c->maxbands = get_bits(&gb, 6);
00086 if(c->maxbands >= BANDS){
00087 av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->maxbands);
00088 return -1;
00089 }
00090 skip_bits_long(&gb, 88);
00091 c->gapless = get_bits1(&gb);
00092 c->lastframelen = get_bits(&gb, 11);
00093 av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n",
00094 c->IS, c->MSS, c->gapless, c->lastframelen, c->maxbands);
00095 c->frames_to_skip = 0;
00096
00097 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
00098 avctx->channel_layout = AV_CH_LAYOUT_STEREO;
00099
00100 if(vlc_initialized) return 0;
00101 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n");
00102 scfi_vlc.table = scfi_table;
00103 scfi_vlc.table_allocated = 1 << MPC7_SCFI_BITS;
00104 if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE,
00105 &mpc7_scfi[1], 2, 1,
00106 &mpc7_scfi[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
00107 av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n");
00108 return -1;
00109 }
00110 dscf_vlc.table = dscf_table;
00111 dscf_vlc.table_allocated = 1 << MPC7_DSCF_BITS;
00112 if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE,
00113 &mpc7_dscf[1], 2, 1,
00114 &mpc7_dscf[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
00115 av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n");
00116 return -1;
00117 }
00118 hdr_vlc.table = hdr_table;
00119 hdr_vlc.table_allocated = 1 << MPC7_HDR_BITS;
00120 if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE,
00121 &mpc7_hdr[1], 2, 1,
00122 &mpc7_hdr[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
00123 av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n");
00124 return -1;
00125 }
00126 for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){
00127 for(j = 0; j < 2; j++){
00128 quant_vlc[i][j].table = &quant_tables[quant_offsets[i*2 + j]];
00129 quant_vlc[i][j].table_allocated = quant_offsets[i*2 + j + 1] - quant_offsets[i*2 + j];
00130 if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i],
00131 &mpc7_quant_vlc[i][j][1], 4, 2,
00132 &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_NEW_STATIC)){
00133 av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j);
00134 return -1;
00135 }
00136 }
00137 }
00138 vlc_initialized = 1;
00139
00140 avcodec_get_frame_defaults(&c->frame);
00141 avctx->coded_frame = &c->frame;
00142
00143 return 0;
00144 }
00145
00149 static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst)
00150 {
00151 int i, i1, t;
00152 switch(idx){
00153 case -1:
00154 for(i = 0; i < SAMPLES_PER_BAND; i++){
00155 *dst++ = (av_lfg_get(&c->rnd) & 0x3FC) - 510;
00156 }
00157 break;
00158 case 1:
00159 i1 = get_bits1(gb);
00160 for(i = 0; i < SAMPLES_PER_BAND/3; i++){
00161 t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2);
00162 *dst++ = mpc7_idx30[t];
00163 *dst++ = mpc7_idx31[t];
00164 *dst++ = mpc7_idx32[t];
00165 }
00166 break;
00167 case 2:
00168 i1 = get_bits1(gb);
00169 for(i = 0; i < SAMPLES_PER_BAND/2; i++){
00170 t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2);
00171 *dst++ = mpc7_idx50[t];
00172 *dst++ = mpc7_idx51[t];
00173 }
00174 break;
00175 case 3: case 4: case 5: case 6: case 7:
00176 i1 = get_bits1(gb);
00177 for(i = 0; i < SAMPLES_PER_BAND; i++)
00178 *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1];
00179 break;
00180 case 8: case 9: case 10: case 11: case 12:
00181 case 13: case 14: case 15: case 16: case 17:
00182 t = (1 << (idx - 2)) - 1;
00183 for(i = 0; i < SAMPLES_PER_BAND; i++)
00184 *dst++ = get_bits(gb, idx - 1) - t;
00185 break;
00186 default:
00187 return;
00188 }
00189 }
00190
00191 static int get_scale_idx(GetBitContext *gb, int ref)
00192 {
00193 int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
00194 if (t == 8)
00195 return get_bits(gb, 6);
00196 return ref + t;
00197 }
00198
00199 static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
00200 int *got_frame_ptr, AVPacket *avpkt)
00201 {
00202 const uint8_t *buf = avpkt->data;
00203 int buf_size;
00204 MPCContext *c = avctx->priv_data;
00205 GetBitContext gb;
00206 int i, ch;
00207 int mb = -1;
00208 Band *bands = c->bands;
00209 int off, ret, last_frame, skip;
00210 int bits_used, bits_avail;
00211
00212 memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));
00213
00214 buf_size = avpkt->size & ~3;
00215 if (buf_size <= 0) {
00216 av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",
00217 avpkt->size);
00218 return AVERROR_INVALIDDATA;
00219 }
00220 if (buf_size != avpkt->size) {
00221 av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
00222 "extra bytes at the end will be skipped.\n");
00223 }
00224
00225 skip = buf[0];
00226 last_frame = buf[1];
00227 buf += 4;
00228 buf_size -= 4;
00229
00230
00231 c->frame.nb_samples = MPC_FRAME_SIZE;
00232 if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) {
00233 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00234 return ret;
00235 }
00236
00237 av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);
00238 if (!c->bits)
00239 return AVERROR(ENOMEM);
00240 c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)buf, buf_size >> 2);
00241 init_get_bits(&gb, c->bits, buf_size * 8);
00242 skip_bits_long(&gb, skip);
00243
00244
00245 for(i = 0; i <= c->maxbands; i++){
00246 for(ch = 0; ch < 2; ch++){
00247 int t = 4;
00248 if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;
00249 if(t == 4) bands[i].res[ch] = get_bits(&gb, 4);
00250 else bands[i].res[ch] = bands[i-1].res[ch] + t;
00251 if (bands[i].res[ch] < -1 || bands[i].res[ch] > 17) {
00252 av_log(avctx, AV_LOG_ERROR, "subband index invalid\n");
00253 return AVERROR_INVALIDDATA;
00254 }
00255 }
00256
00257 if(bands[i].res[0] || bands[i].res[1]){
00258 mb = i;
00259 if(c->MSS) bands[i].msf = get_bits1(&gb);
00260 }
00261 }
00262
00263 for(i = 0; i <= mb; i++)
00264 for(ch = 0; ch < 2; ch++)
00265 if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);
00266
00267 for(i = 0; i <= mb; i++){
00268 for(ch = 0; ch < 2; ch++){
00269 if(bands[i].res[ch]){
00270 bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];
00271 bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]);
00272 switch(bands[i].scfi[ch]){
00273 case 0:
00274 bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
00275 bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
00276 break;
00277 case 1:
00278 bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
00279 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];
00280 break;
00281 case 2:
00282 bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
00283 bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
00284 break;
00285 case 3:
00286 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
00287 break;
00288 }
00289 c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];
00290 }
00291 }
00292 }
00293
00294 memset(c->Q, 0, sizeof(c->Q));
00295 off = 0;
00296 for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)
00297 for(ch = 0; ch < 2; ch++)
00298 idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
00299
00300 ff_mpc_dequantize_and_synth(c, mb, c->frame.data[0], 2);
00301 if(last_frame)
00302 c->frame.nb_samples = c->lastframelen;
00303
00304 bits_used = get_bits_count(&gb);
00305 bits_avail = buf_size * 8;
00306 if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {
00307 av_log(avctx, AV_LOG_ERROR, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
00308 return -1;
00309 }
00310 if(c->frames_to_skip){
00311 c->frames_to_skip--;
00312 *got_frame_ptr = 0;
00313 return avpkt->size;
00314 }
00315
00316 *got_frame_ptr = 1;
00317 *(AVFrame *)data = c->frame;
00318
00319 return avpkt->size;
00320 }
00321
00322 static void mpc7_decode_flush(AVCodecContext *avctx)
00323 {
00324 MPCContext *c = avctx->priv_data;
00325
00326 memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
00327 c->frames_to_skip = 32;
00328 }
00329
00330 static av_cold int mpc7_decode_close(AVCodecContext *avctx)
00331 {
00332 MPCContext *c = avctx->priv_data;
00333 av_freep(&c->bits);
00334 c->buf_size = 0;
00335 return 0;
00336 }
00337
00338 AVCodec ff_mpc7_decoder = {
00339 .name = "mpc7",
00340 .type = AVMEDIA_TYPE_AUDIO,
00341 .id = CODEC_ID_MUSEPACK7,
00342 .priv_data_size = sizeof(MPCContext),
00343 .init = mpc7_decode_init,
00344 .close = mpc7_decode_close,
00345 .decode = mpc7_decode_frame,
00346 .flush = mpc7_decode_flush,
00347 .capabilities = CODEC_CAP_DR1,
00348 .long_name = NULL_IF_CONFIG_SMALL("Musepack SV7"),
00349 };