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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Interface to libgsm for gsm encoding/decoding
  3.  * Copyright (c) 2005 Alban Bedel <albeu@free.fr>
  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 libgsm.c
  22.  * Interface to libgsm for gsm encoding/decoding
  23.  */
  24. #include "avcodec.h"
  25. #include <gsm.h>
  26. // gsm.h miss some essential constants
  27. #define GSM_BLOCK_SIZE 33
  28. #define GSM_FRAME_SIZE 160
  29. static int libgsm_init(AVCodecContext *avctx) {
  30.     if (avctx->channels > 1 || avctx->sample_rate != 8000)
  31.         return -1;
  32.     avctx->frame_size = GSM_FRAME_SIZE;
  33.     avctx->block_align = GSM_BLOCK_SIZE;
  34.     avctx->priv_data = gsm_create();
  35.     
  36.     avctx->coded_frame= avcodec_alloc_frame();
  37.     avctx->coded_frame->key_frame= 1;
  38.     
  39.     return 0;
  40. }
  41. static int libgsm_close(AVCodecContext *avctx) {
  42.     gsm_destroy(avctx->priv_data);
  43.     avctx->priv_data = NULL;
  44.     return 0;
  45. }
  46. static int libgsm_encode_frame(AVCodecContext *avctx,
  47.                                unsigned char *frame, int buf_size, void *data) {
  48.     // we need a full block
  49.     if(buf_size < GSM_BLOCK_SIZE) return 0;
  50.     gsm_encode(avctx->priv_data,data,frame);
  51.     return GSM_BLOCK_SIZE;
  52. }
  53. AVCodec libgsm_encoder = {
  54.     "gsm",
  55.     CODEC_TYPE_AUDIO,
  56.     CODEC_ID_GSM,
  57.     0,
  58.     libgsm_init,
  59.     libgsm_encode_frame,
  60.     libgsm_close,
  61. };
  62. static int libgsm_decode_frame(AVCodecContext *avctx,
  63.                                void *data, int *data_size,
  64.                                uint8_t *buf, int buf_size) {
  65.     if(buf_size < GSM_BLOCK_SIZE) return 0;
  66.     if(gsm_decode(avctx->priv_data,buf,data)) return -1;
  67.     *data_size = GSM_FRAME_SIZE*2;
  68.     return GSM_BLOCK_SIZE;
  69. }
  70. AVCodec libgsm_decoder = {
  71.     "gsm",
  72.     CODEC_TYPE_AUDIO,
  73.     CODEC_ID_GSM,
  74.     0,
  75.     libgsm_init,
  76.     NULL,
  77.     libgsm_close,
  78.     libgsm_decode_frame,
  79. };