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

Reply via email to