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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Interface to libfaac for aac encoding
  3.  * Copyright (c) 2002 Gildas Bazin <gbazin@netcourrier.com>
  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 faacaudio.c
  22.  * Interface to libfaac for aac encoding.
  23.  */
  24. #include "avcodec.h"
  25. #include <faac.h>
  26. typedef struct FaacAudioContext {
  27.     faacEncHandle faac_handle;
  28. } FaacAudioContext;
  29. static int Faac_encode_init(AVCodecContext *avctx)
  30. {
  31.     FaacAudioContext *s = avctx->priv_data;
  32.     faacEncConfigurationPtr faac_cfg;
  33.     unsigned long samples_input, max_bytes_output;
  34.     /* number of channels */
  35.     if (avctx->channels < 1 || avctx->channels > 6)
  36.         return -1;
  37.     s->faac_handle = faacEncOpen(avctx->sample_rate,
  38.                                  avctx->channels,
  39.                                  &samples_input, &max_bytes_output);
  40.     /* check faac version */
  41.     faac_cfg = faacEncGetCurrentConfiguration(s->faac_handle);
  42.     if (faac_cfg->version != FAAC_CFG_VERSION) {
  43. av_log(avctx, AV_LOG_ERROR, "wrong libfaac version (compiled for: %d, using %d)n", FAAC_CFG_VERSION, faac_cfg->version);
  44.         faacEncClose(s->faac_handle);
  45.         return -1;
  46.     }
  47.     /* put the options in the configuration struct */
  48.     faac_cfg->aacObjectType = LOW;
  49.     faac_cfg->mpegVersion = MPEG4;
  50.     faac_cfg->useTns = 0;
  51.     faac_cfg->allowMidside = 1;
  52.     faac_cfg->bitRate = avctx->bit_rate / avctx->channels;
  53.     if(avctx->flags & CODEC_FLAG_QSCALE) {
  54.         faac_cfg->bitRate = 0;
  55.         faac_cfg->quantqual = avctx->global_quality / FF_QP2LAMBDA;
  56.     }
  57.     faac_cfg->outputFormat = 0;
  58.     faac_cfg->inputFormat = FAAC_INPUT_16BIT;
  59.     if (!faacEncSetConfiguration(s->faac_handle, faac_cfg)) {
  60.         av_log(avctx, AV_LOG_ERROR, "libfaac doesn't support this output format!n");
  61.         return -1;
  62.     }
  63.     avctx->frame_size = samples_input / avctx->channels;
  64.     avctx->coded_frame= avcodec_alloc_frame();
  65.     avctx->coded_frame->key_frame= 1;
  66.     /* Set decoder specific info */
  67.     avctx->extradata_size = 0;
  68.     if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) {
  69.         unsigned char *buffer;
  70.         unsigned long decoder_specific_info_size;
  71.         if (!faacEncGetDecoderSpecificInfo(s->faac_handle, &buffer,
  72.                                            &decoder_specific_info_size)) {
  73.             avctx->extradata = buffer;
  74.             avctx->extradata_size = decoder_specific_info_size;
  75.         }
  76.     }
  77.     return 0;
  78. }
  79. int Faac_encode_frame(AVCodecContext *avctx,
  80.                       unsigned char *frame, int buf_size, void *data)
  81. {
  82.     FaacAudioContext *s = avctx->priv_data;
  83.     int bytes_written;
  84.     bytes_written = faacEncEncode(s->faac_handle,
  85.                                   data,
  86.                                   avctx->frame_size * avctx->channels,
  87.                                   frame,
  88.                                   buf_size);
  89.     return bytes_written;
  90. }
  91. int Faac_encode_close(AVCodecContext *avctx)
  92. {
  93.     FaacAudioContext *s = avctx->priv_data;
  94.     av_freep(&avctx->coded_frame);
  95.     //if (avctx->extradata_size) free(avctx->extradata);
  96.     faacEncClose(s->faac_handle);
  97.     return 0;
  98. }
  99. AVCodec faac_encoder = {
  100.     "aac",
  101.     CODEC_TYPE_AUDIO,
  102.     CODEC_ID_AAC,
  103.     sizeof(FaacAudioContext),
  104.     Faac_encode_init,
  105.     Faac_encode_frame,
  106.     Faac_encode_close
  107. };