Filter:   InfoImg
download libgsm.c
Language: C
Copyright: (c) 2005 Alban Bedel
LOC: 52
Project Info
FFMpeg
Server: MPlayerHQ
Type: cvs
...f\ffmpeg\ffmpeg\libavcodec\
   .cvsignore
   4xm.c
   8bps.c
   a52dec.c
   aasc.c
   ac3.h
   ac3dec.c
   ac3enc.c
   ac3tab.h
   adpcm.c
   adx.c
   alac.c
   allcodecs.c
   amr.c
   apiexample.c
   asv1.c
   avcodec.h
   beosthread.c
   bitstream.c
   bitstream.h
   bmp.c
   cabac.c
   cabac.h
   cinepak.c
   cljr.c
   cook.c
   cookdata.h
   cyuv.c
   dct-test.c
   dpcm.c
   dsputil.c
   dsputil.h
   dtsdec.c
   dv.c
   dvbsub.c
   dvbsubdec.c
   dvdata.h
   dvdsub.c
   dvdsubenc.c
   error_resilience.c
   eval.c
   faac.c
   faad.c
   faandct.c
   faandct.h
   fdctref.c
   fft-test.c
   fft.c
   ffv1.c
   flac.c
   flicvideo.c
   fraps.c
   g726.c
   golomb.c
   golomb.h
   h261.c
   h261data.h
   h263.c
   h263data.h
   h263dec.c
   h264.c
   h264data.h
   h264idct.c
   huffyuv.c
   idcinvideo.c
   imgconvert.c
   imgconvert_template.h
   imgresample.c
   indeo2.c
   indeo2data.h
   indeo3.c
   indeo3data.h
   interplayvideo.c
   jfdctfst.c
   jfdctint.c
   jpeg_ls.c
   jrevdct.c
   lcl.c
   libgsm.c
   loco.c
   mace.c
   mdct.c
   mdec.c
   mem.c
   mjpeg.c
   motion_est.c
   motion_est_template.c
   motion_test.c
   mp3lameaudio.c
   mpeg12.c
   mpeg12data.h
   mpeg4data.h
   mpegaudio.c
   mpegaudio.h
   mpegaudiodec.c
   mpegaudiodectab.h
   mpegaudiotab.h
   mpegvideo.c
   mpegvideo.h
   msmpeg4.c
   msmpeg4data.h
   msrle.c
   msvideo1.c
   oggtheora.c
   oggvorbis.c
   opt.c
   opt.h
   parser.c
   pcm.c
   png.c
   pnm.c
   pthread.c
   qdm2.c
   qdm2data.h
   qdrw.c
   qpeg.c
   qtrle.c
   ra144.c
   ra144.h
   ra288.c
   ra288.h
   rangecoder.c
   rangecoder.h
   ratecontrol.c
   raw.c
   resample.c
   resample2.c
   roqvideo.c
   rpza.c
   rv10.c
   shorten.c
   simple_idct.c
   simple_idct.h
   smc.c
   snow.c
   sonic.c
   sp5x.h
   svq1.c
   svq1_cb.h
   svq1_vlc.h
   svq3.c
   truemotion1.c
   truemotion1data.h
   truemotion2.c
   tscc.c
   ulti.c
   ulti_cb.h
   utils.c
   vc9.c
   vc9data.h
   vcr1.c
   vmdav.c
   vorbis.c
   vorbis.h
   vp3.c
   vp3data.h
   vp3dsp.c
   vqavideo.c
   w32thread.c
   wmadata.h
   wmadec.c
   wmv2.c
   wnv1.c
   ws-snd1.c
   x264.c
   xan.c
   xl.c
   xvidff.c
   xvmcvideo.c

/*
 * Interface to libgsm for gsm encoding/decoding
 * Copyright (c) 2005 Alban Bedel <albeu@free.fr>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/**
 * @file libgsm.c
 * Interface to libgsm for gsm encoding/decoding
 */

#include "avcodec.h"
#include <gsm.h>

// gsm.h miss some essential constants
#define GSM_BLOCK_SIZE 33
#define GSM_FRAME_SIZE 160

static int libgsm_init(AVCodecContext *avctx) {
    if (avctx->channels > 1 || avctx->sample_rate != 8000)
        return -1;

    avctx->frame_size = GSM_FRAME_SIZE;
    avctx->block_align = GSM_BLOCK_SIZE;

    avctx->priv_data = gsm_create();

    avctx->coded_frame= avcodec_alloc_frame();
    avctx->coded_frame->key_frame= 1;

    return 0;
}

static int libgsm_close(AVCodecContext *avctx) {
    gsm_destroy(avctx->priv_data);
    avctx->priv_data = NULL;
    return 0;
}

static int libgsm_encode_frame(AVCodecContext *avctx,
                               unsigned char *frame, int buf_size, void *data) {
    // we need a full block
    if(buf_size < GSM_BLOCK_SIZE) return 0;

    gsm_encode(avctx->priv_data,data,frame);

    return GSM_BLOCK_SIZE;
}


AVCodec libgsm_encoder = {
    "gsm",
    CODEC_TYPE_AUDIO,
    CODEC_ID_GSM,
    0,
    libgsm_init,
    libgsm_encode_frame,
    libgsm_close,
};

static int libgsm_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
                               uint8_t *buf, int buf_size) {

    if(buf_size < GSM_BLOCK_SIZE) return 0;

    if(gsm_decode(avctx->priv_data,buf,data)) return -1;

    *data_size = GSM_FRAME_SIZE*2;
    return GSM_BLOCK_SIZE;
}

AVCodec libgsm_decoder = {
    "gsm",
    CODEC_TYPE_AUDIO,
    CODEC_ID_GSM,
    0,
    libgsm_init,
    NULL,
    libgsm_close,
    libgsm_decode_frame,
};