FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
libgsmdec.c
Go to the documentation of this file.
1
/*
2
* Interface to libgsm for GSM decoding
3
* Copyright (c) 2005 Alban Bedel <albeu@free.fr>
4
* Copyright (c) 2006, 2007 Michel Bardiaux <mbardiaux@mediaxim.be>
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
/**
24
* @file
25
* Interface to libgsm for GSM decoding
26
*/
27
28
// The idiosyncrasies of GSM-in-WAV are explained at http://kbs.cs.tu-berlin.de/~jutta/toast.html
29
30
#include "config.h"
31
#if HAVE_GSM_H
32
#include <
gsm.h
>
33
#else
34
#include <gsm/gsm.h>
35
#endif
36
37
#include "
libavutil/channel_layout.h
"
38
#include "
libavutil/common.h
"
39
40
#include "
avcodec.h
"
41
#include "
internal.h
"
42
#include "
gsm.h
"
43
44
typedef
struct
LibGSMDecodeContext
{
45
struct
gsm_state *
state
;
46
}
LibGSMDecodeContext
;
47
48
static
av_cold
int
libgsm_decode_init
(
AVCodecContext
*avctx) {
49
LibGSMDecodeContext
*
s
= avctx->
priv_data
;
50
51
avctx->
channels
= 1;
52
avctx->
channel_layout
=
AV_CH_LAYOUT_MONO
;
53
if
(!avctx->
sample_rate
)
54
avctx->
sample_rate
= 8000;
55
avctx->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
56
57
s->
state
= gsm_create();
58
59
switch
(avctx->
codec_id
) {
60
case
AV_CODEC_ID_GSM
:
61
avctx->
frame_size
=
GSM_FRAME_SIZE
;
62
avctx->
block_align
=
GSM_BLOCK_SIZE
;
63
break
;
64
case
AV_CODEC_ID_GSM_MS
: {
65
int
one = 1;
66
gsm_option(s->
state
, GSM_OPT_WAV49, &one);
67
avctx->
frame_size
= 2 *
GSM_FRAME_SIZE
;
68
avctx->
block_align
=
GSM_MS_BLOCK_SIZE
;
69
}
70
}
71
72
return
0;
73
}
74
75
static
av_cold
int
libgsm_decode_close
(
AVCodecContext
*avctx) {
76
LibGSMDecodeContext
*
s
= avctx->
priv_data
;
77
78
gsm_destroy(s->
state
);
79
s->
state
= NULL;
80
return
0;
81
}
82
83
static
int
libgsm_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
84
int
*got_frame_ptr,
AVPacket
*avpkt)
85
{
86
int
i,
ret
;
87
LibGSMDecodeContext
*
s
= avctx->
priv_data
;
88
AVFrame
*
frame
=
data
;
89
uint8_t
*
buf
= avpkt->
data
;
90
int
buf_size = avpkt->
size
;
91
int16_t *samples;
92
93
if
(buf_size < avctx->block_align) {
94
av_log
(avctx,
AV_LOG_ERROR
,
"Packet is too small\n"
);
95
return
AVERROR_INVALIDDATA
;
96
}
97
98
/* get output buffer */
99
frame->
nb_samples
= avctx->
frame_size
;
100
if
((ret =
ff_get_buffer
(avctx, frame, 0)) < 0)
101
return
ret
;
102
samples = (int16_t *)frame->
data
[0];
103
104
for
(i = 0; i < avctx->
frame_size
/
GSM_FRAME_SIZE
; i++) {
105
if
((ret = gsm_decode(s->
state
, buf, samples)) < 0)
106
return
-1;
107
buf +=
GSM_BLOCK_SIZE
;
108
samples +=
GSM_FRAME_SIZE
;
109
}
110
111
*got_frame_ptr = 1;
112
113
return
avctx->
block_align
;
114
}
115
116
static
void
libgsm_flush
(
AVCodecContext
*avctx) {
117
LibGSMDecodeContext
*
s
= avctx->
priv_data
;
118
int
one = 1;
119
120
gsm_destroy(s->
state
);
121
s->
state
= gsm_create();
122
if
(avctx->
codec_id
==
AV_CODEC_ID_GSM_MS
)
123
gsm_option(s->
state
, GSM_OPT_WAV49, &one);
124
}
125
126
#if CONFIG_LIBGSM_DECODER
127
AVCodec
ff_libgsm_decoder = {
128
.
name
=
"libgsm"
,
129
.long_name =
NULL_IF_CONFIG_SMALL
(
"libgsm GSM"
),
130
.type =
AVMEDIA_TYPE_AUDIO
,
131
.id =
AV_CODEC_ID_GSM
,
132
.priv_data_size =
sizeof
(
LibGSMDecodeContext
),
133
.
init
=
libgsm_decode_init
,
134
.
close
=
libgsm_decode_close
,
135
.
decode
=
libgsm_decode_frame
,
136
.
flush
=
libgsm_flush
,
137
.capabilities =
CODEC_CAP_DR1
,
138
};
139
#endif
140
#if CONFIG_LIBGSM_MS_DECODER
141
AVCodec
ff_libgsm_ms_decoder = {
142
.
name
=
"libgsm_ms"
,
143
.long_name =
NULL_IF_CONFIG_SMALL
(
"libgsm GSM Microsoft variant"
),
144
.type =
AVMEDIA_TYPE_AUDIO
,
145
.id =
AV_CODEC_ID_GSM_MS
,
146
.priv_data_size =
sizeof
(
LibGSMDecodeContext
),
147
.
init
=
libgsm_decode_init
,
148
.
close
=
libgsm_decode_close
,
149
.
decode
=
libgsm_decode_frame
,
150
.
flush
=
libgsm_flush
,
151
.capabilities =
CODEC_CAP_DR1
,
152
};
153
#endif
Generated on Sun Sep 14 2014 18:55:58 for FFmpeg by
1.8.2