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 Mar 8 2015 02:34:54 for FFmpeg by
1.8.2