From 56d061ce9da954560892e3551513d5ecc0439846 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Mon, 18 Nov 2013 12:07:14 +0100 Subject: [PATCH] metasound: add last missing modes (8kHz @ 6kbps per channel) Signed-off-by: Anton Khirnov --- Changelog | 2 +- doc/general.texi | 1 - libavcodec/metasound.c | 9 ++++++++- libavcodec/metasound_data.c | 18 ++++++++++++++++++ libavcodec/twinvq.c | 2 +- libavcodec/twinvq.h | 2 ++ libavcodec/twinvqdec.c | 1 + 7 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Changelog b/Changelog index 15e5ac9591..c0cb73ca72 100644 --- a/Changelog +++ b/Changelog @@ -32,7 +32,7 @@ version 10: the -noaccurate_seek option. - avconv -t option can now be used for inputs, to limit the duration of data read from an input file -- incomplete Voxware MetaSound decoder +- Voxware MetaSound decoder - WebP decoder - Error Resilient AAC syntax (ER AAC LC) decoding - Low Delay AAC (ER AAC LD) decoding diff --git a/doc/general.texi b/doc/general.texi index c1809e2eb8..e34fabdff1 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -827,7 +827,6 @@ following image formats are supported: @item Vorbis @tab E @tab X @tab A native but very primitive encoder exists. @item Voxware MetaSound @tab @tab X - @tab imperfect and incomplete support @item WavPack @tab E @tab X @tab supported through external library libwavpack @item Westwood Audio (SND1) @tab @tab X diff --git a/libavcodec/metasound.c b/libavcodec/metasound.c index 39af4189c5..ae16ad0dad 100644 --- a/libavcodec/metasound.c +++ b/libavcodec/metasound.c @@ -187,7 +187,7 @@ static int metasound_read_bitstream(AVCodecContext *avctx, TwinVQContext *tctx, sub = mtab->fmode[bits->ftype].sub; - if (bits->ftype != TWINVQ_FT_SHORT) + if (bits->ftype != TWINVQ_FT_SHORT && !tctx->is_6kbps) get_bits(&gb, 2); read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype); @@ -307,6 +307,12 @@ static av_cold int metasound_decode_init(AVCodecContext *avctx) ibps = avctx->bit_rate / (1000 * avctx->channels); switch ((avctx->channels << 16) + (isampf << 8) + ibps) { + case (1 << 16) + ( 8 << 8) + 6: + tctx->mtab = &ff_metasound_mode0806; + break; + case (2 << 16) + ( 8 << 8) + 6: + tctx->mtab = &ff_metasound_mode0806s; + break; case (1 << 16) + ( 8 << 8) + 8: tctx->mtab = &ff_metasound_mode0808; break; @@ -362,6 +368,7 @@ static av_cold int metasound_decode_init(AVCodecContext *avctx) tctx->decode_ppc = decode_ppc; tctx->frame_size = avctx->bit_rate * tctx->mtab->size / avctx->sample_rate; + tctx->is_6kbps = ibps == 6; return ff_twinvq_decode_init(avctx); } diff --git a/libavcodec/metasound_data.c b/libavcodec/metasound_data.c index b753fbcd2f..8aa53e556c 100644 --- a/libavcodec/metasound_data.c +++ b/libavcodec/metasound_data.c @@ -15190,6 +15190,24 @@ static const uint16_t bark_tab_s44_128[] = { 1, 2, 1, 2, 3, 4, 6, 10, 23, 76 }; +const TwinVQModeTab ff_metasound_mode0806 = { + { + { 8, bark_tab_s8_64, 10, fcb8s, 1, 5, cb0806ss0, cb0806ss1, 27 }, + { 2, bark_tab_m8_256, 20, fcb8m, 2, 5, cb0806sm0, cb0806sm1, 22 }, + { 1, bark_tab_l8_512, 30, fcb8l, 3, 6, cb0806sl0, cb0806sl1, 24 } + }, + 512, 12, lsp8, 1, 5, 3, 3, shape8, 8, 28, 20, 6, 200 +}; + +const TwinVQModeTab ff_metasound_mode0806s = { + { + { 8, bark_tab_s8s_64, 10, fcb8ss, 1, 5, cb0806ss0, cb0806ss1, 27 }, + { 2, bark_tab_m8s_256, 20, fcb8sm, 2, 5, cb0806sm0, cb0806sm1, 22 }, + { 1, bark_tab_l8s_512, 30, fcb8sl, 3, 6, cb0806sl0, cb0806sl1, 24 } + }, + 512, 12, lsp8s, 1, 5, 3, 3, shape8s, 8, 28, 20, 6, 200 +}; + const TwinVQModeTab ff_metasound_mode0808 = { { { 8, bark_tab_s8_64, 10, fcb8s, 1, 5, cb0808s0, cb0808s1, 18 }, diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c index bc0205bc55..e1b1c7bb64 100644 --- a/libavcodec/twinvq.c +++ b/libavcodec/twinvq.c @@ -706,7 +706,7 @@ static av_cold void init_bitstream_params(TwinVQContext *tctx) TWINVQ_WINDOW_TYPE_BITS + mtab->fmode[i].sub * (bse_bits[i] + n_ch * TWINVQ_SUB_GAIN_BITS); - if (tctx->codec == TWINVQ_CODEC_METASOUND) { + if (tctx->codec == TWINVQ_CODEC_METASOUND && !tctx->is_6kbps) { bsize_no_main_cb[1] += 2; bsize_no_main_cb[2] += 2; } diff --git a/libavcodec/twinvq.h b/libavcodec/twinvq.h index f6b3942ff2..7601e5ba53 100644 --- a/libavcodec/twinvq.h +++ b/libavcodec/twinvq.h @@ -141,6 +141,8 @@ typedef struct TwinVQContext { const TwinVQModeTab *mtab; + int is_6kbps; + // history float lsp_hist[2][20]; ///< LSP coefficients of the last frame float bark_hist[3][2][40]; ///< BSE coefficients of last frame diff --git a/libavcodec/twinvqdec.c b/libavcodec/twinvqdec.c index 6f4decb939..65028a6640 100644 --- a/libavcodec/twinvqdec.c +++ b/libavcodec/twinvqdec.c @@ -402,6 +402,7 @@ static av_cold int twinvq_decode_init(AVCodecContext *avctx) tctx->decode_ppc = decode_ppc; tctx->frame_size = avctx->bit_rate * tctx->mtab->size / avctx->sample_rate + 8; + tctx->is_6kbps = 0; if (avctx->block_align && avctx->block_align * 8 / tctx->frame_size > 1) { av_log(avctx, AV_LOG_ERROR, "VQF TwinVQ should have only one frame per packet\n");