wmadec: use float planar sample format output
This commit is contained in:
parent
977eb7d567
commit
7ebfe5b44a
@ -48,20 +48,6 @@
|
|||||||
static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
|
static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
|
||||||
|
|
||||||
#ifdef TRACE
|
#ifdef TRACE
|
||||||
static void dump_shorts(WMACodecContext *s, const char *name, const short *tab, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
tprintf(s->avctx, "%s[%d]:\n", name, n);
|
|
||||||
for(i=0;i<n;i++) {
|
|
||||||
if ((i & 7) == 0)
|
|
||||||
tprintf(s->avctx, "%4d: ", i);
|
|
||||||
tprintf(s->avctx, " %5d.0", tab[i]);
|
|
||||||
if ((i & 7) == 7)
|
|
||||||
tprintf(s->avctx, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_floats(WMACodecContext *s, const char *name, int prec, const float *tab, int n)
|
static void dump_floats(WMACodecContext *s, const char *name, int prec, const float *tab, int n)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -105,7 +91,7 @@ static int wma_decode_init(AVCodecContext * avctx)
|
|||||||
|
|
||||||
/* init MDCT */
|
/* init MDCT */
|
||||||
for(i = 0; i < s->nb_block_sizes; i++)
|
for(i = 0; i < s->nb_block_sizes; i++)
|
||||||
ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1, 1.0);
|
ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1, 1.0 / 32768.0);
|
||||||
|
|
||||||
if (s->use_noise_coding) {
|
if (s->use_noise_coding) {
|
||||||
init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits),
|
init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits),
|
||||||
@ -121,7 +107,7 @@ static int wma_decode_init(AVCodecContext * avctx)
|
|||||||
wma_lsp_to_curve_init(s, s->frame_len);
|
wma_lsp_to_curve_init(s, s->frame_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
||||||
|
|
||||||
avcodec_get_frame_defaults(&s->frame);
|
avcodec_get_frame_defaults(&s->frame);
|
||||||
avctx->coded_frame = &s->frame;
|
avctx->coded_frame = &s->frame;
|
||||||
@ -762,10 +748,10 @@ next:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* decode a frame of frame_len samples */
|
/* decode a frame of frame_len samples */
|
||||||
static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
|
static int wma_decode_frame(WMACodecContext *s, float **samples,
|
||||||
|
int samples_offset)
|
||||||
{
|
{
|
||||||
int ret, n, ch, incr;
|
int ret, ch;
|
||||||
const float *output[MAX_CHANNELS];
|
|
||||||
|
|
||||||
#ifdef TRACE
|
#ifdef TRACE
|
||||||
tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
|
tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
|
||||||
@ -782,20 +768,19 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert frame to integer */
|
for (ch = 0; ch < s->nb_channels; ch++) {
|
||||||
n = s->frame_len;
|
/* copy current block to output */
|
||||||
incr = s->nb_channels;
|
memcpy(samples[ch] + samples_offset, s->frame_out[ch],
|
||||||
for (ch = 0; ch < MAX_CHANNELS; ch++)
|
s->frame_len * sizeof(*s->frame_out[ch]));
|
||||||
output[ch] = s->frame_out[ch];
|
|
||||||
s->fmt_conv.float_to_int16_interleave(samples, output, n, incr);
|
|
||||||
for (ch = 0; ch < incr; ch++) {
|
|
||||||
/* prepare for next block */
|
/* prepare for next block */
|
||||||
memmove(&s->frame_out[ch][0], &s->frame_out[ch][n], n * sizeof(float));
|
memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
|
||||||
}
|
s->frame_len * sizeof(*s->frame_out[ch]));
|
||||||
|
|
||||||
#ifdef TRACE
|
#ifdef TRACE
|
||||||
dump_shorts(s, "samples", samples, n * s->nb_channels);
|
dump_floats(s, "samples", 6, samples[ch] + samples_offset, s->frame_len);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -807,7 +792,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
|
|||||||
WMACodecContext *s = avctx->priv_data;
|
WMACodecContext *s = avctx->priv_data;
|
||||||
int nb_frames, bit_offset, i, pos, len, ret;
|
int nb_frames, bit_offset, i, pos, len, ret;
|
||||||
uint8_t *q;
|
uint8_t *q;
|
||||||
int16_t *samples;
|
float **samples;
|
||||||
|
int samples_offset;
|
||||||
|
|
||||||
tprintf(avctx, "***decode_superframe:\n");
|
tprintf(avctx, "***decode_superframe:\n");
|
||||||
|
|
||||||
@ -839,7 +825,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
|
|||||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
samples = (int16_t *)s->frame.data[0];
|
samples = (float **)s->frame.extended_data;
|
||||||
|
samples_offset = 0;
|
||||||
|
|
||||||
if (s->use_bit_reservoir) {
|
if (s->use_bit_reservoir) {
|
||||||
bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
|
bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
|
||||||
@ -873,9 +860,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
|
|||||||
skip_bits(&s->gb, s->last_bitoffset);
|
skip_bits(&s->gb, s->last_bitoffset);
|
||||||
/* this frame is stored in the last superframe and in the
|
/* this frame is stored in the last superframe and in the
|
||||||
current one */
|
current one */
|
||||||
if (wma_decode_frame(s, samples) < 0)
|
if (wma_decode_frame(s, samples, samples_offset) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
samples += s->nb_channels * s->frame_len;
|
samples_offset += s->frame_len;
|
||||||
nb_frames--;
|
nb_frames--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -890,9 +877,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
s->reset_block_lengths = 1;
|
s->reset_block_lengths = 1;
|
||||||
for(i=0;i<nb_frames;i++) {
|
for(i=0;i<nb_frames;i++) {
|
||||||
if (wma_decode_frame(s, samples) < 0)
|
if (wma_decode_frame(s, samples, samples_offset) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
samples += s->nb_channels * s->frame_len;
|
samples_offset += s->frame_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we copy the end of the frame in the last frame buffer */
|
/* we copy the end of the frame in the last frame buffer */
|
||||||
@ -908,9 +895,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
|
|||||||
memcpy(s->last_superframe, buf + pos, len);
|
memcpy(s->last_superframe, buf + pos, len);
|
||||||
} else {
|
} else {
|
||||||
/* single frame decode */
|
/* single frame decode */
|
||||||
if (wma_decode_frame(s, samples) < 0)
|
if (wma_decode_frame(s, samples, samples_offset) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
samples += s->nb_channels * s->frame_len;
|
samples_offset += s->frame_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_dlog(s->avctx, "%d %d %d %d outbytes:%td eaten:%d\n",
|
av_dlog(s->avctx, "%d %d %d %d outbytes:%td eaten:%d\n",
|
||||||
@ -946,6 +933,8 @@ AVCodec ff_wmav1_decoder = {
|
|||||||
.flush = flush,
|
.flush = flush,
|
||||||
.capabilities = CODEC_CAP_DR1,
|
.capabilities = CODEC_CAP_DR1,
|
||||||
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
|
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
|
||||||
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
|
||||||
|
AV_SAMPLE_FMT_NONE },
|
||||||
};
|
};
|
||||||
|
|
||||||
AVCodec ff_wmav2_decoder = {
|
AVCodec ff_wmav2_decoder = {
|
||||||
@ -959,4 +948,6 @@ AVCodec ff_wmav2_decoder = {
|
|||||||
.flush = flush,
|
.flush = flush,
|
||||||
.capabilities = CODEC_CAP_DR1,
|
.capabilities = CODEC_CAP_DR1,
|
||||||
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
|
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
|
||||||
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
|
||||||
|
AV_SAMPLE_FMT_NONE },
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user