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.

Originally committed as revision 25790 to svn://svn.ffmpeg.org/ffmpeg/trunk
oldabi
Kostya Shishkov 14 years ago
parent 63e8d9760f
commit 7d3829a87a
  1. 14
      libavcodec/mpc.c
  2. 2
      libavcodec/mpc.h
  3. 2
      libavcodec/mpc7.c
  4. 11
      libavcodec/mpc8.c

@ -42,27 +42,27 @@ void ff_mpc_init(void)
/** /**
* Process decoded Musepack data and produce PCM * 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 dither_state = 0;
int i, ch; int i, ch;
OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE], *samples_ptr; 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; samples_ptr = samples + ch;
for(i = 0; i < SAMPLES_PER_BAND; i++) { for(i = 0; i < SAMPLES_PER_BAND; i++) {
ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]), ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]),
ff_mpa_synth_window, &dither_state, ff_mpa_synth_window, &dither_state,
samples_ptr, 2, samples_ptr, channels,
c->sb_samples[ch][i]); 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]; *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; int i, j, ch;
Band *bands = c->bands; 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);
} }

@ -72,6 +72,6 @@ typedef struct {
} MPCContext; } MPCContext;
void ff_mpc_init(void); 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 */ #endif /* AVCODEC_MPC_H */

@ -260,7 +260,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
for(ch = 0; ch < 2; ch++) for(ch = 0; ch < 2; ch++)
idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off); 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); av_free(bits);

@ -99,6 +99,7 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
MPCContext *c = avctx->priv_data; MPCContext *c = avctx->priv_data;
GetBitContext gb; GetBitContext gb;
static int vlc_initialized = 0; static int vlc_initialized = 0;
int channels;
static VLC_TYPE band_table[542][2]; static VLC_TYPE band_table[542][2];
static VLC_TYPE q1_table[520][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 skip_bits(&gb, 3);//sample rate
c->maxbands = get_bits(&gb, 5) + 1; 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->MSS = get_bits1(&gb);
c->frames = 1 << (get_bits(&gb, 3) * 2); 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->cur_frame++;
c->last_bits_used = get_bits_count(gb); c->last_bits_used = get_bits_count(gb);
if(c->cur_frame >= c->frames) if(c->cur_frame >= c->frames)
c->cur_frame = 0; 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; return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
} }

Loading…
Cancel
Save