On Thu, Nov 21, 2013 at 9:00 PM, Anton Khirnov <[email protected]> wrote: > > On Mon, 18 Nov 2013 15:19:51 +0100, Kostya Shishkov > <[email protected]> wrote: >> On 18 November 2013 12:25, Kostya Shishkov <[email protected]> wrote: >> > Feel free to encourage Anton to implement MetaVoice. >> >> As pointed out on IRC the same patch but without filemode changes. >> From 5f5c7b6f69fe7d8b36af1aa827f218e09221046f Mon Sep 17 00:00:00 2001 >> From: Kostya Shishkov <[email protected]> >> Date: Mon, 18 Nov 2013 12:07:14 +0100 >> Subject: [PATCH] metasound: add last missing modes (8kHz @ 6kbps per channel) >> >> --- >> 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 1e58a2c..88942a0 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 c1809e2..e34fabd 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 39af418..ae16ad0 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 b753fbc..8aa53e5 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 bc0205b..e1b1c7b 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 f6b3942..7601e5b 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 6f4decb..65028a6 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"); >> -- >> 1.7.0.4 > > Looks ok
Looks fine for me too. -Vitor _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
