amr.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:17k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * AMR Audio decoder stub
  3.  * Copyright (c) 2003 the ffmpeg project
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19.  /*
  20.     This code implements amr-nb and amr-wb audio encoder/decoder through external reference
  21.     code from www.3gpp.org. The licence of the code from 3gpp is unclear so you
  22.     have to download the code separately. Two versions exists: One fixed-point
  23.     and one with floats. For some reason the float-encoder is significant faster
  24.     atleast on a P4 1.5GHz (0.9s instead of 9.9s on a 30s audio clip at MR102).
  25.     Both float and fixed point is supported for amr-nb, but only float for
  26.     amr-wb.
  27.     
  28.     --AMR-NB--
  29.     The fixed-point (TS26.073) can be downloaded from:
  30.     http://www.3gpp.org/ftp/Specs/archive/26_series/26.073/26073-510.zip
  31.     Extract the soure into ffmpeg/libavcodec/amr
  32.     To use the fixed version run "./configure" with "--enable-amr_nb-fixed"
  33.     
  34.     The float version (default) can be downloaded from:
  35.     http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip
  36.     Extract the soure into ffmpeg/libavcodec/amr_float
  37.     The specification for amr-nb can be found in TS 26.071
  38.     (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other
  39.     info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm
  40.     
  41.     --AMR-WB--
  42.     The reference code can be downloaded from:
  43.     http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip
  44.     It should be extracted to "libavcodec/amrwb_float". Enable it with
  45.     "--enable-amr_wb".
  46.     
  47.     The specification for amr-wb can be downloaded from:
  48.     http://www.3gpp.org/ftp/Specs/archive/26_series/26.171/26171-500.zip
  49.     
  50.     If someone want to use the fixed point version it can be downloaded
  51.     from: http://www.3gpp.org/ftp/Specs/archive/26_series/26.173/26173-571.zip
  52.  
  53.  */
  54. #include "avcodec.h"
  55. #ifdef AMR_NB_FIXED
  56. #define MMS_IO
  57. #include "amr/sp_dec.h"
  58. #include "amr/d_homing.h"
  59. #include "amr/typedef.h"
  60. #include "amr/sp_enc.h"
  61. #include "amr/sid_sync.h"
  62. #include "amr/e_homing.h"
  63. #else
  64. #include "amr_float/interf_dec.h"
  65. #include "amr_float/interf_enc.h"
  66. #endif
  67. /* Common code for fixed and float version*/
  68. typedef struct AMR_bitrates
  69. {
  70.     int startrate;
  71.     int stoprate;
  72.     enum Mode mode;
  73.     
  74. } AMR_bitrates;
  75. /* Match desired bitrate with closest one*/
  76. static enum Mode getBitrateMode(int bitrate)
  77. {
  78.     /* Adjusted so that all bitrates can be used from commandline where
  79.        only a multiple of 1000 can be specified*/
  80.     AMR_bitrates rates[]={ {0,4999,MR475}, //4
  81.                            {5000,5899,MR515},//5
  82.                            {5900,6699,MR59},//6
  83.                            {6700,7000,MR67},//7
  84.                            {7001,7949,MR74},//8
  85.                            {7950,9999,MR795},//9
  86.                            {10000,11999,MR102},//10
  87.                            {12000,64000,MR122},//12
  88.                            
  89.                          };
  90.     int i;
  91.     for(i=0;i<8;i++)
  92.     {
  93.         if(rates[i].startrate<=bitrate && rates[i].stoprate>=bitrate)
  94.         {
  95.             return(rates[i].mode);
  96.         }
  97.     }
  98.     /*Return highest possible*/
  99.     return(MR122);
  100. }
  101. #ifdef AMR_NB_FIXED
  102. /* fixed point version*/
  103. /* frame size in serial bitstream file (frame type + serial stream + flags) */
  104. #define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5)
  105. typedef struct AMRContext {
  106.     int frameCount;
  107.     Speech_Decode_FrameState *speech_decoder_state;
  108.     enum RXFrameType rx_type;
  109.     enum Mode mode;
  110.     Word16 reset_flag;
  111.     Word16 reset_flag_old;
  112.     enum Mode enc_bitrate;
  113.     Speech_Encode_FrameState *enstate;
  114.     sid_syncState *sidstate;
  115.     enum TXFrameType tx_frametype;
  116.     
  117. } AMRContext;
  118. static int amr_nb_decode_init(AVCodecContext * avctx)
  119. {
  120.     AMRContext *s = avctx->priv_data;
  121.     s->frameCount=0;
  122.     s->speech_decoder_state=NULL;
  123.     s->rx_type = (enum RXFrameType)0;
  124.     s->mode= (enum Mode)0;
  125.     s->reset_flag=0;
  126.     s->reset_flag_old=1;
  127.     
  128.     if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder"))
  129.     {
  130.         av_log(avctx, AV_LOG_ERROR, "Speech_Decode_Frame_init errorn");
  131.         return -1;
  132.     }
  133.     return 0;
  134. }
  135. static int amr_nb_encode_init(AVCodecContext * avctx)
  136. {
  137.     AMRContext *s = avctx->priv_data;
  138.     s->frameCount=0;
  139.     s->speech_decoder_state=NULL;
  140.     s->rx_type = (enum RXFrameType)0;
  141.     s->mode= (enum Mode)0;
  142.     s->reset_flag=0;
  143.     s->reset_flag_old=1;
  144.     
  145.     if(avctx->sample_rate!=8000)
  146.     {
  147.         if(avctx->debug)
  148.         {
  149.             av_log(avctx, AV_LOG_DEBUG, "Only 8000Hz sample rate supportedn");
  150.         }
  151.         return -1;
  152.     }
  153.     if(avctx->channels!=1)
  154.     {
  155.         if(avctx->debug)
  156.         {
  157.             av_log(avctx, AV_LOG_DEBUG, "Only mono supportedn");
  158.         }
  159.         return -1;
  160.     }
  161.     avctx->frame_size=160;
  162.     avctx->coded_frame= avcodec_alloc_frame();
  163.     if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate))
  164.     {
  165.         if(avctx->debug)
  166.         {
  167.             av_log(avctx, AV_LOG_DEBUG, "Speech_Encode_Frame_init errorn");
  168.         }
  169.         return -1;
  170.     }
  171.     s->enc_bitrate=getBitrateMode(avctx->bit_rate);
  172.     return 0;
  173. }
  174. static int amr_nb_encode_close(AVCodecContext * avctx)
  175. {
  176.     AMRContext *s = avctx->priv_data;
  177.     Speech_Encode_Frame_exit(&s->enstate);
  178.     sid_sync_exit (&s->sidstate);
  179.     av_freep(&avctx->coded_frame);
  180.     return 0;
  181. }
  182. static int amr_nb_decode_close(AVCodecContext * avctx)
  183. {
  184.     AMRContext *s = avctx->priv_data;
  185.     Speech_Decode_Frame_exit(&s->speech_decoder_state);
  186.     return 0;
  187. }
  188. static int amr_nb_decode_frame(AVCodecContext * avctx,
  189.             void *data, int *data_size,
  190.             uint8_t * buf, int buf_size)
  191. {
  192.     AMRContext *s = avctx->priv_data;
  193.     uint8_t*amrData=buf;
  194.     int offset=0;
  195.     UWord8 toc, q, ft;
  196.     
  197.     Word16 serial[SERIAL_FRAMESIZE];   /* coded bits */
  198.     Word16 *synth;
  199.     UWord8 *packed_bits;
  200.     static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
  201.     int i;
  202.     //printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!n",*data_size,buf,buf_size,s->frameCount);
  203.     synth=data;
  204. //    while(offset<buf_size)
  205.     {
  206.         toc=amrData[offset];
  207.         /* read rest of the frame based on ToC byte */
  208.         q  = (toc >> 2) & 0x01;
  209.         ft = (toc >> 3) & 0x0F;
  210.         //printf("offset=%d, packet_size=%d amrData= 0x%X %X %X %Xn",offset,packed_size[ft],amrData[offset],amrData[offset+1],amrData[offset+2],amrData[offset+3]);
  211.         offset++;
  212.         packed_bits=amrData+offset;
  213.         offset+=packed_size[ft];
  214.         //Unsort and unpack bits
  215.         s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]);
  216.         //We have a new frame
  217.         s->frameCount++;
  218.         if (s->rx_type == RX_NO_DATA) 
  219.         {
  220.             s->mode = s->speech_decoder_state->prev_mode;
  221.         }
  222.         else {
  223.             s->speech_decoder_state->prev_mode = s->mode;
  224.         }
  225.         
  226.         /* if homed: check if this frame is another homing frame */
  227.         if (s->reset_flag_old == 1)
  228.         {
  229.             /* only check until end of first subframe */
  230.             s->reset_flag = decoder_homing_frame_test_first(&serial[1], s->mode);
  231.         }
  232.         /* produce encoder homing frame if homed & input=decoder homing frame */
  233.         if ((s->reset_flag != 0) && (s->reset_flag_old != 0))
  234.         {
  235.             for (i = 0; i < L_FRAME; i++)
  236.             {
  237.                 synth[i] = EHF_MASK;
  238.             }
  239.         }
  240.         else
  241.         {     
  242.             /* decode frame */
  243.             Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth);
  244.         }
  245.         //Each AMR-frame results in 160 16-bit samples
  246.         *data_size+=160*2;
  247.         synth+=160;
  248.         
  249.         /* if not homed: check whether current frame is a homing frame */
  250.         if (s->reset_flag_old == 0)
  251.         {
  252.             /* check whole frame */
  253.             s->reset_flag = decoder_homing_frame_test(&serial[1], s->mode);
  254.         }
  255.         /* reset decoder if current frame is a homing frame */
  256.         if (s->reset_flag != 0)
  257.         {
  258.             Speech_Decode_Frame_reset(s->speech_decoder_state);
  259.         }
  260.         s->reset_flag_old = s->reset_flag;
  261.         
  262.     }
  263.     return offset;
  264. }
  265. static int amr_nb_encode_frame(AVCodecContext *avctx,
  266.     unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
  267. {
  268.     short serial_data[250] = {0};
  269.     AMRContext *s = avctx->priv_data;
  270.     int written;
  271.    
  272.     s->reset_flag = encoder_homing_frame_test(data);
  273.     
  274.     Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode); 
  275.     
  276.     /* add frame type and mode */
  277.     sid_sync (s->sidstate, s->mode, &s->tx_frametype);
  278.     
  279.     written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame);
  280.     
  281.     if (s->reset_flag != 0)
  282.     {
  283.         Speech_Encode_Frame_reset(s->enstate);
  284.         sid_sync_reset(s->sidstate);
  285.     }
  286.     return written;
  287. }
  288. #else /* Float point version*/
  289. typedef struct AMRContext {
  290.     int frameCount;
  291.     void * decState;
  292.     int *enstate;
  293.     enum Mode enc_bitrate;
  294. } AMRContext;
  295. static int amr_nb_decode_init(AVCodecContext * avctx)
  296. {
  297.     AMRContext *s = avctx->priv_data;
  298.     s->frameCount=0;
  299.     s->decState=Decoder_Interface_init();
  300.     if(!s->decState)
  301.     {
  302.         av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init errorrn");
  303.         return -1;
  304.     }
  305.     return 0;
  306. }
  307. static int amr_nb_encode_init(AVCodecContext * avctx)
  308. {
  309.     AMRContext *s = avctx->priv_data;
  310.     s->frameCount=0;
  311.     
  312.     if(avctx->sample_rate!=8000)
  313.     {
  314.         if(avctx->debug)
  315.         {
  316.             av_log(avctx, AV_LOG_DEBUG, "Only 8000Hz sample rate supportedn");
  317.         }
  318.         return -1;
  319.     }
  320.     if(avctx->channels!=1)
  321.     {
  322.         if(avctx->debug)
  323.         {
  324.             av_log(avctx, AV_LOG_DEBUG, "Only mono supportedn");
  325.         }
  326.         return -1;
  327.     }
  328.     avctx->frame_size=160;
  329.     avctx->coded_frame= avcodec_alloc_frame();
  330.     s->enstate=Encoder_Interface_init(0);
  331.     if(!s->enstate)
  332.     {
  333.         if(avctx->debug)
  334.         {
  335.             av_log(avctx, AV_LOG_DEBUG, "Encoder_Interface_init errorn");
  336.         }
  337.         return -1;
  338.     }
  339.     s->enc_bitrate=getBitrateMode(avctx->bit_rate);
  340.     return 0;
  341. }
  342. static int amr_nb_decode_close(AVCodecContext * avctx)
  343. {
  344.     AMRContext *s = avctx->priv_data;
  345.     Decoder_Interface_exit(s->decState);
  346.     return 0;
  347. }
  348. static int amr_nb_encode_close(AVCodecContext * avctx)
  349. {
  350.     AMRContext *s = avctx->priv_data;
  351.     Encoder_Interface_exit(s->enstate);
  352.     av_freep(&avctx->coded_frame);
  353.     return 0;
  354. }
  355. static int amr_nb_decode_frame(AVCodecContext * avctx,
  356.             void *data, int *data_size,
  357.             uint8_t * buf, int buf_size)
  358. {
  359.     AMRContext *s = (AMRContext*)avctx->priv_data;
  360.     uint8_t*amrData=buf;
  361.     static short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
  362.     enum Mode dec_mode;
  363.     int packet_size;
  364.     /* av_log(NULL,AV_LOG_DEBUG,"amr_decode_frame buf=%p buf_size=%d frameCount=%d!!n",buf,buf_size,s->frameCount); */
  365.     
  366.     if(buf_size==0) {
  367.         /* nothing to do */
  368.         return 0;
  369.     }
  370.     dec_mode = (buf[0] >> 3) & 0x000F;
  371.     packet_size = block_size[dec_mode]+1;
  372.     if(packet_size > buf_size) {
  373.         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)n", buf_size, packet_size);
  374.         return -1;
  375.     }
  376.     
  377.     s->frameCount++;
  378.     /* av_log(NULL,AV_LOG_DEBUG,"packet_size=%d amrData= 0x%X %X %X %Xn",packet_size,amrData[0],amrData[1],amrData[2],amrData[3]); */
  379.     /* call decoder */
  380.     Decoder_Interface_Decode(s->decState, amrData, data, 0);
  381.     *data_size=160*2;
  382.    
  383.     return packet_size;
  384. }
  385. static int amr_nb_encode_frame(AVCodecContext *avctx,
  386.     unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
  387. {
  388.     AMRContext *s = (AMRContext*)avctx->priv_data;
  389.     int written;
  390.     written = Encoder_Interface_Encode(s->enstate, 
  391.         s->enc_bitrate, 
  392.         data, 
  393.         frame, 
  394.         0);
  395.     /* av_log(NULL,AV_LOG_DEBUG,"amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02xn",written, s->enc_bitrate, frame[0] ); */
  396.     return written;
  397. }
  398. #endif
  399. AVCodec amr_nb_decoder =
  400. {
  401.     "amr_nb",
  402.     CODEC_TYPE_AUDIO,
  403.     CODEC_ID_AMR_NB,
  404.     sizeof(AMRContext),
  405.     amr_nb_decode_init,
  406.     NULL,
  407.     amr_nb_decode_close,
  408.     amr_nb_decode_frame,
  409. };
  410. AVCodec amr_nb_encoder =
  411. {
  412.     "amr_nb",
  413.     CODEC_TYPE_AUDIO,
  414.     CODEC_ID_AMR_NB,
  415.     sizeof(AMRContext),
  416.     amr_nb_encode_init,
  417.     amr_nb_encode_frame,
  418.     amr_nb_encode_close,
  419.     NULL,
  420. };
  421. /* -----------AMR wideband ------------*/
  422. #ifdef AMR_WB
  423. #ifdef _TYPEDEF_H
  424. //To avoid duplicate typedefs from typdef in amr-nb
  425. #define typedef_h
  426. #endif
  427. #include "amrwb_float/enc_if.h"
  428. #include "amrwb_float/dec_if.h"
  429. /* Common code for fixed and float version*/
  430. typedef struct AMRWB_bitrates
  431. {
  432.     int startrate;
  433.     int stoprate;
  434.     int mode;
  435.     
  436. } AMRWB_bitrates;
  437. static int getWBBitrateMode(int bitrate)
  438. {
  439.     /* Adjusted so that all bitrates can be used from commandline where
  440.        only a multiple of 1000 can be specified*/
  441.     AMRWB_bitrates rates[]={ {0,7999,0}, //6.6kHz
  442.                            {8000,9999,1},//8.85
  443.                            {10000,13000,2},//12.65
  444.                            {13001,14999,3},//14.25
  445.                            {15000,17000,4},//15.85
  446.                            {17001,18000,5},//18.25
  447.                            {18001,22000,6},//19.85
  448.                            {22001,23000,7},//23.05
  449.                            {23001,24000,8},//23.85
  450.                            
  451.                          };
  452.     int i;
  453.     for(i=0;i<9;i++)
  454.     {
  455.         if(rates[i].startrate<=bitrate && rates[i].stoprate>=bitrate)
  456.         {
  457.             return(rates[i].mode);
  458.         }
  459.     }
  460.     /*Return highest possible*/
  461.     return(8);
  462. }
  463. typedef struct AMRWBContext {
  464.     int frameCount;
  465.     void *state;
  466.     int mode;
  467.     Word16 allow_dtx;
  468. } AMRWBContext;
  469. static int amr_wb_encode_init(AVCodecContext * avctx)
  470. {
  471.     AMRWBContext *s = (AMRWBContext*)avctx->priv_data;
  472.     s->frameCount=0;
  473.     
  474.     if(avctx->sample_rate!=16000)
  475.     {
  476.         if(avctx->debug)
  477.         {
  478.             av_log(avctx, AV_LOG_DEBUG, "Only 16000Hz sample rate supportedn");
  479.         }
  480.         return -1;
  481.     }
  482.     if(avctx->channels!=1)
  483.     {
  484.         if(avctx->debug)
  485.         {
  486.             av_log(avctx, AV_LOG_DEBUG, "Only mono supportedn");
  487.         }
  488.         return -1;
  489.     }
  490.     avctx->frame_size=320;
  491.     avctx->coded_frame= avcodec_alloc_frame();
  492.     s->state = E_IF_init();
  493.     s->mode=getWBBitrateMode(avctx->bit_rate);
  494.     s->allow_dtx=0;
  495.     return 0;
  496. }
  497. static int amr_wb_encode_close(AVCodecContext * avctx)
  498. {
  499.     AMRWBContext *s = (AMRWBContext*) avctx->priv_data;
  500.     E_IF_exit(s->state);
  501.     av_freep(&avctx->coded_frame);
  502.     s->frameCount++;
  503.     return 0;
  504. }
  505. static int amr_wb_encode_frame(AVCodecContext *avctx,
  506.     unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
  507. {
  508.     AMRWBContext *s = (AMRWBContext*) avctx->priv_data;
  509.     int size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx);
  510.     return size;
  511. }
  512. static int amr_wb_decode_init(AVCodecContext * avctx)
  513. {
  514.     AMRWBContext *s = (AMRWBContext *)avctx->priv_data;
  515.     s->frameCount=0;
  516.     s->state = D_IF_init();
  517.     return 0;
  518. }
  519. extern const UWord8 block_size[];
  520. static int amr_wb_decode_frame(AVCodecContext * avctx,
  521.             void *data, int *data_size,
  522.             uint8_t * buf, int buf_size)
  523. {
  524.     AMRWBContext *s = (AMRWBContext*)avctx->priv_data;
  525.     uint8_t*amrData=buf;
  526.     int mode;
  527.     int packet_size;
  528.     if(buf_size==0) {
  529.         /* nothing to do */
  530.         return 0;
  531.     }
  532.     mode = (amrData[0] >> 3) & 0x000F;
  533.     packet_size = block_size[mode];
  534.     if(packet_size > buf_size) {
  535.         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)n", buf_size, packet_size+1);
  536.         return -1;
  537.     }
  538.     
  539.     s->frameCount++;
  540.     D_IF_decode( s->state, amrData, data, _good_frame);
  541.     *data_size=320*2;
  542.     return packet_size;
  543. }
  544. static int amr_wb_decode_close(AVCodecContext * avctx)
  545. {
  546.     AMRWBContext *s = (AMRWBContext *)avctx->priv_data;
  547.     D_IF_exit(s->state);
  548.     return 0;
  549. }
  550. AVCodec amr_wb_decoder =
  551. {
  552.     "amr_wb",
  553.     CODEC_TYPE_AUDIO,
  554.     CODEC_ID_AMR_WB,
  555.     sizeof(AMRWBContext),
  556.     amr_wb_decode_init,
  557.     NULL,
  558.     amr_wb_decode_close,
  559.     amr_wb_decode_frame,
  560. };
  561. AVCodec amr_wb_encoder =
  562. {
  563.     "amr_wb",
  564.     CODEC_TYPE_AUDIO,
  565.     CODEC_ID_AMR_WB,
  566.     sizeof(AMRWBContext),
  567.     amr_wb_encode_init,
  568.     amr_wb_encode_frame,
  569.     amr_wb_encode_close,
  570.     NULL,
  571. };
  572. #endif //AMR_WB