[FFmpeg-cvslog] r25790 - in trunk/libavcodec: mpc.c mpc.h mpc7.c mpc8.c
kostya
subversion
Sun Nov 21 21:42:06 CET 2010
Author: kostya
Date: Sun Nov 21 21:42:06 2010
New Revision: 25790
Log:
Musepack SV8 supports "mono" files (though it still codes them as stereo),
so extend decoder to output only one channel for it.
This fixes issue 2368.
Modified:
trunk/libavcodec/mpc.c
trunk/libavcodec/mpc.h
trunk/libavcodec/mpc7.c
trunk/libavcodec/mpc8.c
Modified: trunk/libavcodec/mpc.c
==============================================================================
--- trunk/libavcodec/mpc.c Sun Nov 21 21:06:22 2010 (r25789)
+++ trunk/libavcodec/mpc.c Sun Nov 21 21:42:06 2010 (r25790)
@@ -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(MPCCont
}
}
- mpc_synth(c, data);
+ mpc_synth(c, data, channels);
}
Modified: trunk/libavcodec/mpc.h
==============================================================================
--- trunk/libavcodec/mpc.h Sun Nov 21 21:06:22 2010 (r25789)
+++ trunk/libavcodec/mpc.h Sun Nov 21 21:42:06 2010 (r25790)
@@ -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 */
Modified: trunk/libavcodec/mpc7.c
==============================================================================
--- trunk/libavcodec/mpc7.c Sun Nov 21 21:06:22 2010 (r25789)
+++ trunk/libavcodec/mpc7.c Sun Nov 21 21:42:06 2010 (r25790)
@@ -260,7 +260,7 @@ static int mpc7_decode_frame(AVCodecCont
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);
Modified: trunk/libavcodec/mpc8.c
==============================================================================
--- trunk/libavcodec/mpc8.c Sun Nov 21 21:06:22 2010 (r25789)
+++ trunk/libavcodec/mpc8.c Sun Nov 21 21:42:06 2010 (r25790)
@@ -99,6 +99,7 @@ static av_cold int mpc8_decode_init(AVCo
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(AVCo
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(AVCodecCont
}
}
- 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;
}
More information about the ffmpeg-cvslog
mailing list