summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/Makefile5
-rw-r--r--libavcodec/allcodecs.c6
-rw-r--r--libavcodec/avcodec.h3
-rw-r--r--libavcodec/libgsm.c95
4 files changed, 109 insertions, 0 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 951eb0c6c4..41b05a88fd 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -291,6 +291,11 @@ endif
EXTRALIBS += -logg
endif
+ifeq ($(CONFIG_LIBGSM),yes)
+OBJS += libgsm.o
+EXTRALIBS += -lgsm
+endif
+
ifeq ($(TARGET_GPROF),yes)
CFLAGS+=-p
LDFLAGS+=-p
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index c6aa6f922a..6e4b6ca0d2 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -186,6 +186,9 @@ void avcodec_register_all(void)
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 @@ void avcodec_register_all(void)
#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
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 7bd3f76966..2b491cff28 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -172,6 +172,7 @@ enum CodecID {
CODEC_ID_SHORTEN,
CODEC_ID_ALAC,
CODEC_ID_WESTWOOD_SND1,
+ CODEC_ID_GSM,
CODEC_ID_OGGTHEORA= 0x16000,
@@ -2021,6 +2022,8 @@ extern AVCodec ws_snd1_decoder;
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) \
diff --git a/libavcodec/libgsm.c b/libavcodec/libgsm.c
new file mode 100644
index 0000000000..c9f137e176
--- /dev/null
+++ b/libavcodec/libgsm.c
@@ -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,
+};