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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Interface to libmp3lame for mp3 encoding
  3.  * Copyright (c) 2002 Lennert Buytenhek <buytenh@gnu.org>
  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. /**
  21.  * @file mp3lameaudio.c
  22.  * Interface to libmp3lame for mp3 encoding.
  23.  */
  24. #include "avcodec.h"
  25. #include "mpegaudio.h"
  26. #include <lame/lame.h>
  27. #define BUFFER_SIZE (2*MPA_FRAME_SIZE)
  28. typedef struct Mp3AudioContext {
  29. lame_global_flags *gfp;
  30. int stereo;
  31.         uint8_t buffer[BUFFER_SIZE];
  32.         int buffer_index;
  33. } Mp3AudioContext;
  34. static int MP3lame_encode_init(AVCodecContext *avctx)
  35. {
  36. Mp3AudioContext *s = avctx->priv_data;
  37. if (avctx->channels > 2)
  38. return -1;
  39. s->stereo = avctx->channels > 1 ? 1 : 0;
  40. if ((s->gfp = lame_init()) == NULL)
  41. goto err;
  42. lame_set_in_samplerate(s->gfp, avctx->sample_rate);
  43. lame_set_out_samplerate(s->gfp, avctx->sample_rate);
  44. lame_set_num_channels(s->gfp, avctx->channels);
  45. /* lame 3.91 dies on quality != 5 */
  46. lame_set_quality(s->gfp, 5);
  47. /* lame 3.91 doesn't work in mono */
  48. lame_set_mode(s->gfp, JOINT_STEREO);
  49. lame_set_brate(s->gfp, avctx->bit_rate/1000);
  50.     if(avctx->flags & CODEC_FLAG_QSCALE) {
  51.         lame_set_brate(s->gfp, 0);
  52.         lame_set_VBR(s->gfp, vbr_default);
  53.         lame_set_VBR_q(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA);
  54.     }
  55.         lame_set_bWriteVbrTag(s->gfp,0);
  56. if (lame_init_params(s->gfp) < 0)
  57. goto err_close;
  58. avctx->frame_size = lame_get_framesize(s->gfp);
  59.     
  60.         avctx->coded_frame= avcodec_alloc_frame();
  61.         avctx->coded_frame->key_frame= 1;
  62. return 0;
  63. err_close:
  64. lame_close(s->gfp);
  65. err:
  66. return -1;
  67. }
  68. static const int sSampleRates[3] = {
  69.     44100, 48000,  32000
  70. };
  71. static const int sBitRates[2][3][15] = {
  72.     {   {  0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448},
  73.         {  0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384},
  74.         {  0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320}
  75.     },
  76.     {   {  0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256},
  77.         {  0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160},
  78.         {  0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}
  79.     },
  80. };
  81. static const int sSamplesPerFrame[2][3] =
  82. {
  83.     {  384,     1152,    1152 },
  84.     {  384,     1152,     576 }
  85. };
  86. static const int sBitsPerSlot[3] = {
  87.     32,
  88.     8,
  89.     8
  90. };
  91. static int mp3len(void *data, int *samplesPerFrame, int *sampleRate)
  92. {
  93.     uint8_t *dataTmp = (uint8_t *)data;
  94.     uint32_t header = ( (uint32_t)dataTmp[0] << 24 ) | ( (uint32_t)dataTmp[1] << 16 ) | ( (uint32_t)dataTmp[2] << 8 ) | (uint32_t)dataTmp[3];
  95.     int layerID = 3 - ((header >> 17) & 0x03);
  96.     int bitRateID = ((header >> 12) & 0x0f);
  97.     int sampleRateID = ((header >> 10) & 0x03);
  98.     int bitsPerSlot = sBitsPerSlot[layerID];
  99.     int isPadded = ((header >> 9) & 0x01);
  100.     static int const mode_tab[4]= {2,3,1,0};
  101.     int mode= mode_tab[(header >> 19) & 0x03];
  102.     int mpeg_id= mode>0;
  103.     int temp0, temp1, bitRate;
  104.     if ( (( header >> 21 ) & 0x7ff) != 0x7ff || mode == 3 || layerID==3 || sampleRateID==3) {
  105.         return -1;
  106.     }
  107.     
  108.     if(!samplesPerFrame) samplesPerFrame= &temp0;
  109.     if(!sampleRate     ) sampleRate     = &temp1;
  110. //    *isMono = ((header >>  6) & 0x03) == 0x03;
  111.     *sampleRate = sSampleRates[sampleRateID]>>mode;
  112.     bitRate = sBitRates[mpeg_id][layerID][bitRateID] * 1000;
  113.     *samplesPerFrame = sSamplesPerFrame[mpeg_id][layerID];
  114. //av_log(NULL, AV_LOG_DEBUG, "sr:%d br:%d spf:%d l:%d m:%dn", *sampleRate, bitRate, *samplesPerFrame, layerID, mode);
  115.     
  116.     return *samplesPerFrame * bitRate / (bitsPerSlot * *sampleRate) + isPadded;
  117. }
  118. int MP3lame_encode_frame(AVCodecContext *avctx,
  119.                      unsigned char *frame, int buf_size, void *data)
  120. {
  121. Mp3AudioContext *s = avctx->priv_data;
  122. int len;
  123. int lame_result;
  124. /* lame 3.91 dies on '1-channel interleaved' data */
  125.     if(data){
  126.         if (s->stereo) {
  127.             lame_result = lame_encode_buffer_interleaved(
  128.                 s->gfp, 
  129.                 data,
  130.                 avctx->frame_size, 
  131.                 s->buffer + s->buffer_index, 
  132.                 BUFFER_SIZE - s->buffer_index
  133.                 );
  134.         } else {
  135.             lame_result = lame_encode_buffer(
  136.                 s->gfp, 
  137.                 data, 
  138.                 data, 
  139.                 avctx->frame_size,
  140.                 s->buffer + s->buffer_index, 
  141.                 BUFFER_SIZE - s->buffer_index
  142.                 );
  143.         }
  144.     }else{
  145.         lame_result= lame_encode_flush(
  146.                 s->gfp, 
  147.                 s->buffer + s->buffer_index, 
  148.                 BUFFER_SIZE - s->buffer_index
  149.                 );
  150.     }
  151.     if(lame_result==-1) {
  152.         /* output buffer too small */
  153.         av_log(avctx, AV_LOG_ERROR, "lame: output buffer too small (buffer index: %d, free bytes: %d)n", s->buffer_index, BUFFER_SIZE - s->buffer_index);
  154.         return 0;
  155.     }
  156.     s->buffer_index += lame_result;
  157.     if(s->buffer_index<4)
  158.         return 0;
  159.         len= mp3len(s->buffer, NULL, NULL);
  160. //av_log(avctx, AV_LOG_DEBUG, "in:%d packet-len:%d index:%dn", avctx->frame_size, len, s->buffer_index);
  161.         if(len <= s->buffer_index){
  162.             memcpy(frame, s->buffer, len);
  163.             s->buffer_index -= len;
  164.             memmove(s->buffer, s->buffer+len, s->buffer_index);
  165.             //FIXME fix the audio codec API, so we dont need the memcpy()
  166. /*for(i=0; i<len; i++){
  167.     av_log(avctx, AV_LOG_DEBUG, "%2X ", frame[i]);
  168. }*/
  169.             return len;
  170.         }else
  171.             return 0;
  172. }
  173. int MP3lame_encode_close(AVCodecContext *avctx)
  174. {
  175. Mp3AudioContext *s = avctx->priv_data;
  176.     
  177.         av_freep(&avctx->coded_frame);
  178. lame_close(s->gfp);
  179. return 0;
  180. }
  181. AVCodec mp3lame_encoder = {
  182.     "mp3",
  183.     CODEC_TYPE_AUDIO,
  184.     CODEC_ID_MP3,
  185.     sizeof(Mp3AudioContext),
  186.     MP3lame_encode_init,
  187.     MP3lame_encode_frame,
  188.     MP3lame_encode_close,
  189.     .capabilities= CODEC_CAP_DELAY,
  190. };