summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/mpc.c14
-rw-r--r--libavcodec/mpc.h2
-rw-r--r--libavcodec/mpc7.c2
-rw-r--r--libavcodec/mpc8.c11
4 files changed, 17 insertions, 12 deletions
diff --git a/libavcodec/mpc.c b/libavcodec/mpc.c
index 30ae591a0f..d9a1fb776a 100644
--- a/libavcodec/mpc.c
+++ b/libavcodec/mpc.c
@@ -42,27 +42,27 @@ void ff_mpc_init(void)
/**
* Process decoded Musepack data and produce PCM
*/
-static void mpc_synth(MPCContext *c, int16_t *out)
+static void mpc_synth(MPCContext *c, int16_t *out, int channels)
{
int dither_state = 0;
int i, ch;
OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE], *samples_ptr;
- for(ch = 0; ch < 2; ch++){
+ for(ch = 0; ch < channels; ch++){
samples_ptr = samples + ch;
for(i = 0; i < SAMPLES_PER_BAND; i++) {
ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]),
ff_mpa_synth_window, &dither_state,
- samples_ptr, 2,
+ samples_ptr, channels,
c->sb_samples[ch][i]);
- samples_ptr += 64;
+ samples_ptr += 32 * channels;
}
}
- for(i = 0; i < MPC_FRAME_SIZE*2; i++)
+ for(i = 0; i < MPC_FRAME_SIZE*channels; i++)
*out++=samples[i];
}
-void ff_mpc_dequantize_and_synth(MPCContext * c, int maxband, void *data)
+void ff_mpc_dequantize_and_synth(MPCContext * c, int maxband, void *data, int channels)
{
int i, j, ch;
Band *bands = c->bands;
@@ -98,5 +98,5 @@ void ff_mpc_dequantize_and_synth(MPCContext * c, int maxband, void *data)
}
}
- mpc_synth(c, data);
+ mpc_synth(c, data, channels);
}
diff --git a/libavcodec/mpc.h b/libavcodec/mpc.h
index 25d1d2ce04..2d9755a593 100644
--- a/libavcodec/mpc.h
+++ b/libavcodec/mpc.h
@@ -72,6 +72,6 @@ typedef struct {
} MPCContext;
void ff_mpc_init(void);
-void ff_mpc_dequantize_and_synth(MPCContext *c, int maxband, void *dst);
+void ff_mpc_dequantize_and_synth(MPCContext *c, int maxband, void *dst, int channels);
#endif /* AVCODEC_MPC_H */
diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c
index c5b8d47c5e..5ac25797bb 100644
--- a/libavcodec/mpc7.c
+++ b/libavcodec/mpc7.c
@@ -260,7 +260,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
for(ch = 0; ch < 2; ch++)
idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
- ff_mpc_dequantize_and_synth(c, mb, data);
+ ff_mpc_dequantize_and_synth(c, mb, data, 2);
av_free(bits);
diff --git a/libavcodec/mpc8.c b/libavcodec/mpc8.c
index 1296f255a4..d8d62edd9c 100644
--- a/libavcodec/mpc8.c
+++ b/libavcodec/mpc8.c
@@ -99,6 +99,7 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
MPCContext *c = avctx->priv_data;
GetBitContext gb;
static int vlc_initialized = 0;
+ int channels;
static VLC_TYPE band_table[542][2];
static VLC_TYPE q1_table[520][2];
@@ -125,7 +126,11 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
skip_bits(&gb, 3);//sample rate
c->maxbands = get_bits(&gb, 5) + 1;
- skip_bits(&gb, 4);//channels
+ channels = get_bits(&gb, 4) + 1;
+ if (channels > 2) {
+ av_log_missing_feature(avctx, "Multichannel MPC SV8", 1);
+ return -1;
+ }
c->MSS = get_bits1(&gb);
c->frames = 1 << (get_bits(&gb, 3) * 2);
@@ -387,14 +392,14 @@ static int mpc8_decode_frame(AVCodecContext * avctx,
}
}
- ff_mpc_dequantize_and_synth(c, maxband, data);
+ ff_mpc_dequantize_and_synth(c, maxband, data, avctx->channels);
c->cur_frame++;
c->last_bits_used = get_bits_count(gb);
if(c->cur_frame >= c->frames)
c->cur_frame = 0;
- *data_size = MPC_FRAME_SIZE * 4;
+ *data_size = MPC_FRAME_SIZE * 2 * avctx->channels;
return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
}