changeset 2729:26bf6f4e9945 libavcodec

libgsm warper by (Alban Bedel: albeu, free fr)
author michael
date Sun, 22 May 2005 23:39:11 +0000
parents 9994e07cd45f
children 5bc8023efdba
files Makefile allcodecs.c avcodec.h libgsm.c
diffstat 4 files changed, 109 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Sat May 21 22:20:26 2005 +0000
+++ b/Makefile	Sun May 22 23:39:11 2005 +0000
@@ -291,6 +291,11 @@
 EXTRALIBS += -logg
 endif
 
+ifeq ($(CONFIG_LIBGSM),yes)
+OBJS += libgsm.o
+EXTRALIBS += -lgsm
+endif
+
 ifeq ($(TARGET_GPROF),yes)
 CFLAGS+=-p
 LDFLAGS+=-p
--- a/allcodecs.c	Sat May 21 22:20:26 2005 +0000
+++ b/allcodecs.c	Sun May 22 23:39:11 2005 +0000
@@ -186,6 +186,9 @@
     register_avcodec(&x264_encoder);
 #endif //CONFIG_X264_ENCODER
 #endif
+#ifdef CONFIG_LIBGSM
+    register_avcodec(&libgsm_encoder);
+#endif //CONFIG_LIBGSM
 #endif /* CONFIG_ENCODERS */
 #ifdef CONFIG_RAWVIDEO_ENCODER
     register_avcodec(&rawvideo_encoder);
@@ -482,6 +485,9 @@
 #ifdef CONFIG_VORBIS_DECODER
     register_avcodec(&vorbis_decoder);
 #endif
+#ifdef CONFIG_LIBGSM
+    register_avcodec(&libgsm_decoder);
+#endif //CONFIG_LIBGSM
 #endif /* CONFIG_DECODERS */
 
 #ifdef AMR_NB
--- a/avcodec.h	Sat May 21 22:20:26 2005 +0000
+++ b/avcodec.h	Sun May 22 23:39:11 2005 +0000
@@ -172,6 +172,7 @@
     CODEC_ID_SHORTEN,
     CODEC_ID_ALAC,
     CODEC_ID_WESTWOOD_SND1,
+    CODEC_ID_GSM,    
     
     CODEC_ID_OGGTHEORA= 0x16000, 
     
@@ -2021,6 +2022,8 @@
 extern AVCodec indeo2_decoder;
 extern AVCodec vorbis_decoder;
 extern AVCodec fraps_decoder;
+extern AVCodec libgsm_encoder;
+extern AVCodec libgsm_decoder;
 
 /* pcm codecs */
 #define PCM_CODEC(id, name) \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsm.c	Sun May 22 23:39:11 2005 +0000
@@ -0,0 +1,95 @@
+/*
+ * 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,
+};