[FFmpeg-cvslog] metasound: add last missing modes (8kHz @ 6kbps per channel)

Kostya Shishkov git at videolan.org
Tue Nov 26 12:34:06 CET 2013


ffmpeg | branch: master | Kostya Shishkov <kostya.shishkov at gmail.com> | Mon Nov 18 12:07:14 2013 +0100| [56d061ce9da954560892e3551513d5ecc0439846] | committer: Anton Khirnov

metasound: add last missing modes (8kHz @ 6kbps per channel)

Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=56d061ce9da954560892e3551513d5ecc0439846
---

 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 15e5ac9..c0cb73c 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");



More information about the ffmpeg-cvslog mailing list