diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-12-10 01:32:37 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-12-10 01:32:37 +0100 |
commit | b7d8484f272b7a5a2ed9db76d5182dbd6e3e6992 (patch) | |
tree | bcccbc78b279cd208a485fac81998118a415926e /libavcodec | |
parent | 78ac7ee97040a2e9a69b81f82a89edd779e124bb (diff) | |
parent | b8f3ab8e6a7ce3627764da53b809628c828d4047 (diff) | |
download | ffmpeg-b7d8484f272b7a5a2ed9db76d5182dbd6e3e6992.tar.gz |
Merge commit 'b8f3ab8e6a7ce3627764da53b809628c828d4047'
* commit 'b8f3ab8e6a7ce3627764da53b809628c828d4047':
ac3dec: output planar float only
svq3: make slice type value unsigned to match svq3_get_ue_golomb return type
configure: Have protocols select network code instead of depending on it
Conflicts:
libavcodec/svq3.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ac3dec.c | 32 | ||||
-rw-r--r-- | libavcodec/ac3dec.h | 1 | ||||
-rw-r--r-- | libavcodec/svq3.c | 7 |
3 files changed, 10 insertions, 30 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 66f8a4d5d9..064e60d33e 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -172,14 +172,7 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx) ff_fmt_convert_init(&s->fmt_conv, avctx); av_lfg_init(&s->dith_state, 0); - /* set scale value for float to int16 conversion */ - if (avctx->request_sample_fmt == AV_SAMPLE_FMT_FLT) { - s->mul_bias = 1.0f; - avctx->sample_fmt = AV_SAMPLE_FMT_FLT; - } else { - s->mul_bias = 32767.0f; - avctx->sample_fmt = AV_SAMPLE_FMT_S16; - } + avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; /* allow downmixing to stereo or mono */ if (avctx->channels > 0 && avctx->request_channels > 0 && @@ -1206,7 +1199,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) /* apply scaling to coefficients (headroom, dynrng) */ for (ch = 1; ch <= s->channels; ch++) { - float gain = s->mul_bias / 4194304.0f; + float gain = 1.0 / 4194304.0f; if (s->channel_mode == AC3_CHMODE_DUALMONO) { gain *= s->dynamic_range[2 - ch]; } else { @@ -1268,8 +1261,6 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; AC3DecodeContext *s = avctx->priv_data; - float *out_samples_flt; - int16_t *out_samples_s16; int blk, ch, err, ret; const uint8_t *channel_map; const float *output[AC3_MAX_CHANNELS]; @@ -1383,8 +1374,6 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } - out_samples_flt = (float *)s->frame.data[0]; - out_samples_s16 = (int16_t *)s->frame.data[0]; /* decode the audio blocks */ channel_map = ff_ac3_dec_channel_map[s->output_mode & ~AC3_OUTPUT_LFEON][s->lfe_on]; @@ -1395,15 +1384,8 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, av_log(avctx, AV_LOG_ERROR, "error decoding the audio block\n"); err = 1; } - if (avctx->sample_fmt == AV_SAMPLE_FMT_FLT) { - s->fmt_conv.float_interleave(out_samples_flt, output, 256, - s->out_channels); - out_samples_flt += 256 * s->out_channels; - } else { - s->fmt_conv.float_to_int16_interleave(out_samples_s16, output, 256, - s->out_channels); - out_samples_s16 += 256 * s->out_channels; - } + for (ch = 0; ch < s->out_channels; ch++) + memcpy(s->frame.data[ch] + blk * 1024, output[ch], 1024); } s->frame.decode_error_flags = err ? FF_DECODE_ERROR_INVALID_BITSTREAM : 0; @@ -1457,8 +1439,7 @@ AVCodec ff_ac3_decoder = { .decode = ac3_decode_frame, .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), - .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, - AV_SAMPLE_FMT_S16, + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .priv_class = &ac3_decoder_class, }; @@ -1481,8 +1462,7 @@ AVCodec ff_eac3_decoder = { .decode = ac3_decode_frame, .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"), - .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, - AV_SAMPLE_FMT_S16, + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .priv_class = &eac3_decoder_class, }; diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h index c3a43bf5cf..ee27727dce 100644 --- a/libavcodec/ac3dec.h +++ b/libavcodec/ac3dec.h @@ -201,7 +201,6 @@ typedef struct AC3DecodeContext { DSPContext dsp; ///< for optimization AC3DSPContext ac3dsp; FmtConvertContext fmt_conv; ///< optimized conversion functions - float mul_bias; ///< scaling for float_to_int16 conversion ///@} ///@name Aligned arrays diff --git a/libavcodec/svq3.c b/libavcodec/svq3.c index 45b96e4a30..5a2fcff808 100644 --- a/libavcodec/svq3.c +++ b/libavcodec/svq3.c @@ -756,6 +756,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) MpegEncContext *s = &h->s; const int mb_xy = h->mb_xy; int i, header; + unsigned slice_id; header = get_bits(&s->gb, 8); @@ -790,12 +791,12 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) skip_bits_long(&s->gb, 0); } - if ((i = svq3_get_ue_golomb(&s->gb)) >= 3U) { - av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i); + if ((slice_id = svq3_get_ue_golomb(&s->gb)) >= 3) { + av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", slice_id); return -1; } - h->slice_type = golomb_to_pict_type[i]; + h->slice_type = golomb_to_pict_type[slice_id]; if ((header & 0x9F) == 2) { i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1)); |