Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) CMU 1993 Computer Science, Speech Group
  3.  *                        Chengxiang Lu and Alex Hauptmann
  4.  * Copyright (c) 2005 Steve Underwood <steveu at coppice.org>
  5.  * Copyright (c) 2009 Kenan Gillet
  6.  * Copyright (c) 2010 Martin Storsjo
  7.  *
  8.  * This file is part of FFmpeg.
  9.  *
  10.  * FFmpeg is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU Lesser General Public
  12.  * License as published by the Free Software Foundation; either
  13.  * version 2.1 of the License, or (at your option) any later version.
  14.  *
  15.  * FFmpeg is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18.  * Lesser General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU Lesser General Public
  21.  * License along with FFmpeg; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  23.  */
  24.  
  25. /**
  26.  * @file
  27.  * G.722 ADPCM audio decoder
  28.  *
  29.  * This G.722 decoder is a bit-exact implementation of the ITU G.722
  30.  * specification for all three specified bitrates - 64000bps, 56000bps
  31.  * and 48000bps. It passes the ITU tests.
  32.  *
  33.  * @note For the 56000bps and 48000bps bitrates, the lowest 1 or 2 bits
  34.  *       respectively of each byte are ignored.
  35.  */
  36.  
  37. #include "libavutil/channel_layout.h"
  38. #include "libavutil/opt.h"
  39. #include "avcodec.h"
  40. #include "get_bits.h"
  41. #include "g722.h"
  42. #include "internal.h"
  43.  
  44. #define OFFSET(x) offsetof(G722Context, x)
  45. #define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
  46. static const AVOption options[] = {
  47.     { "bits_per_codeword", "Bits per G722 codeword", OFFSET(bits_per_codeword), AV_OPT_TYPE_FLAGS, { .i64 = 8 }, 6, 8, AD },
  48.     { NULL }
  49. };
  50.  
  51. static const AVClass g722_decoder_class = {
  52.     .class_name = "g722 decoder",
  53.     .item_name  = av_default_item_name,
  54.     .option     = options,
  55.     .version    = LIBAVUTIL_VERSION_INT,
  56. };
  57.  
  58. static av_cold int g722_decode_init(AVCodecContext * avctx)
  59. {
  60.     G722Context *c = avctx->priv_data;
  61.  
  62.     avctx->channels       = 1;
  63.     avctx->channel_layout = AV_CH_LAYOUT_MONO;
  64.     avctx->sample_fmt     = AV_SAMPLE_FMT_S16;
  65.  
  66.     c->band[0].scale_factor = 8;
  67.     c->band[1].scale_factor = 2;
  68.     c->prev_samples_pos = 22;
  69.  
  70.     return 0;
  71. }
  72.  
  73. static const int16_t low_inv_quant5[32] = {
  74.      -35,   -35, -2919, -2195, -1765, -1458, -1219, -1023,
  75.     -858,  -714,  -587,  -473,  -370,  -276,  -190,  -110,
  76.     2919,  2195,  1765,  1458,  1219,  1023,   858,   714,
  77.      587,   473,   370,   276,   190,   110,    35,   -35
  78. };
  79.  
  80. static const int16_t *low_inv_quants[3] = { ff_g722_low_inv_quant6,
  81.                                                     low_inv_quant5,
  82.                                             ff_g722_low_inv_quant4 };
  83.  
  84. static int g722_decode_frame(AVCodecContext *avctx, void *data,
  85.                              int *got_frame_ptr, AVPacket *avpkt)
  86. {
  87.     G722Context *c = avctx->priv_data;
  88.     AVFrame *frame = data;
  89.     int16_t *out_buf;
  90.     int j, ret;
  91.     const int skip = 8 - c->bits_per_codeword;
  92.     const int16_t *quantizer_table = low_inv_quants[skip];
  93.     GetBitContext gb;
  94.  
  95.     /* get output buffer */
  96.     frame->nb_samples = avpkt->size * 2;
  97.     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
  98.         return ret;
  99.     out_buf = (int16_t *)frame->data[0];
  100.  
  101.     init_get_bits(&gb, avpkt->data, avpkt->size * 8);
  102.  
  103.     for (j = 0; j < avpkt->size; j++) {
  104.         int ilow, ihigh, rlow, rhigh, dhigh;
  105.         int xout1, xout2;
  106.  
  107.         ihigh = get_bits(&gb, 2);
  108.         ilow = get_bits(&gb, 6 - skip);
  109.         skip_bits(&gb, skip);
  110.  
  111.         rlow = av_clip((c->band[0].scale_factor * quantizer_table[ilow] >> 10)
  112.                       + c->band[0].s_predictor, -16384, 16383);
  113.  
  114.         ff_g722_update_low_predictor(&c->band[0], ilow >> (2 - skip));
  115.  
  116.         dhigh = c->band[1].scale_factor * ff_g722_high_inv_quant[ihigh] >> 10;
  117.         rhigh = av_clip(dhigh + c->band[1].s_predictor, -16384, 16383);
  118.  
  119.         ff_g722_update_high_predictor(&c->band[1], dhigh, ihigh);
  120.  
  121.         c->prev_samples[c->prev_samples_pos++] = rlow + rhigh;
  122.         c->prev_samples[c->prev_samples_pos++] = rlow - rhigh;
  123.         ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24,
  124.                           &xout1, &xout2);
  125.         *out_buf++ = av_clip_int16(xout1 >> 11);
  126.         *out_buf++ = av_clip_int16(xout2 >> 11);
  127.         if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) {
  128.             memmove(c->prev_samples, c->prev_samples + c->prev_samples_pos - 22,
  129.                     22 * sizeof(c->prev_samples[0]));
  130.             c->prev_samples_pos = 22;
  131.         }
  132.     }
  133.  
  134.     *got_frame_ptr = 1;
  135.  
  136.     return avpkt->size;
  137. }
  138.  
  139. AVCodec ff_adpcm_g722_decoder = {
  140.     .name           = "g722",
  141.     .long_name      = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),
  142.     .type           = AVMEDIA_TYPE_AUDIO,
  143.     .id             = AV_CODEC_ID_ADPCM_G722,
  144.     .priv_data_size = sizeof(G722Context),
  145.     .init           = g722_decode_init,
  146.     .decode         = g722_decode_frame,
  147.     .capabilities   = CODEC_CAP_DR1,
  148.     .priv_class     = &g722_decoder_class,
  149. };
  150.