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
libilbc.c
Go to the documentation of this file.
1
/*
2
* iLBC decoder/encoder stub
3
* Copyright (c) 2012 Martin Storsjo
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include <ilbc.h>
23
24
#include "
libavutil/channel_layout.h
"
25
#include "
libavutil/common.h
"
26
#include "
libavutil/opt.h
"
27
#include "
avcodec.h
"
28
#include "
internal.h
"
29
30
static
int
get_mode
(
AVCodecContext
*avctx)
31
{
32
if
(avctx->
block_align
== 38)
33
return
20;
34
else
if
(avctx->
block_align
== 50)
35
return
30;
36
else
if
(avctx->
bit_rate
> 0)
37
return
avctx->
bit_rate
<= 14000 ? 30 : 20;
38
else
39
return
-1;
40
}
41
42
typedef
struct
ILBCDecContext
{
43
const
AVClass
*
class
;
44
iLBC_Dec_Inst_t
decoder
;
45
int
enhance
;
46
}
ILBCDecContext
;
47
48
static
const
AVOption
ilbc_dec_options
[] = {
49
{
"enhance"
,
"Enhance the decoded audio (adds delay)"
, offsetof(
ILBCDecContext
, enhance),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
AV_OPT_FLAG_AUDIO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
},
50
{
NULL
}
51
};
52
53
static
const
AVClass
ilbc_dec_class
= {
54
.
class_name
=
"libilbc"
,
55
.item_name =
av_default_item_name
,
56
.option =
ilbc_dec_options
,
57
.version =
LIBAVUTIL_VERSION_INT
,
58
};
59
60
static
av_cold
int
ilbc_decode_init
(
AVCodecContext
*avctx)
61
{
62
ILBCDecContext
*
s
= avctx->
priv_data
;
63
int
mode
;
64
65
if
((mode =
get_mode
(avctx)) < 0) {
66
av_log
(avctx,
AV_LOG_ERROR
,
"iLBC frame mode not indicated\n"
);
67
return
AVERROR
(EINVAL);
68
}
69
70
WebRtcIlbcfix_InitDecode(&s->
decoder
, mode, s->
enhance
);
71
72
avctx->
channels
= 1;
73
avctx->
channel_layout
=
AV_CH_LAYOUT_MONO
;
74
avctx->
sample_rate
= 8000;
75
avctx->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
76
77
return
0;
78
}
79
80
static
int
ilbc_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
81
int
*got_frame_ptr,
AVPacket
*avpkt)
82
{
83
const
uint8_t
*
buf
= avpkt->
data
;
84
int
buf_size = avpkt->
size
;
85
ILBCDecContext
*
s
= avctx->
priv_data
;
86
AVFrame
*
frame
=
data
;
87
int
ret
;
88
89
if
(s->
decoder
.no_of_bytes > buf_size) {
90
av_log
(avctx,
AV_LOG_ERROR
,
"iLBC frame too short (%u, should be %u)\n"
,
91
buf_size, s->
decoder
.no_of_bytes);
92
return
AVERROR_INVALIDDATA
;
93
}
94
95
frame->
nb_samples
= s->
decoder
.blockl;
96
if
((ret =
ff_get_buffer
(avctx, frame, 0)) < 0)
97
return
ret
;
98
99
WebRtcIlbcfix_DecodeImpl((int16_t *) frame->
data
[0], (
const
uint16_t *) buf, &s->
decoder
, 1);
100
101
*got_frame_ptr = 1;
102
103
return
s->
decoder
.no_of_bytes;
104
}
105
106
AVCodec
ff_libilbc_decoder
= {
107
.
name
=
"libilbc"
,
108
.long_name =
NULL_IF_CONFIG_SMALL
(
"iLBC (Internet Low Bitrate Codec)"
),
109
.type =
AVMEDIA_TYPE_AUDIO
,
110
.id =
AV_CODEC_ID_ILBC
,
111
.priv_data_size =
sizeof
(
ILBCDecContext
),
112
.
init
=
ilbc_decode_init
,
113
.
decode
=
ilbc_decode_frame
,
114
.capabilities =
CODEC_CAP_DR1
,
115
.priv_class = &ilbc_dec_class,
116
};
117
118
typedef
struct
ILBCEncContext
{
119
const
AVClass
*
class
;
120
iLBC_Enc_Inst_t
encoder
;
121
int
mode
;
122
}
ILBCEncContext
;
123
124
static
const
AVOption
ilbc_enc_options
[] = {
125
{
"mode"
,
"iLBC mode (20 or 30 ms frames)"
, offsetof(
ILBCEncContext
,
mode
),
AV_OPT_TYPE_INT
, { .i64 = 20 }, 20, 30,
AV_OPT_FLAG_AUDIO_PARAM
|
AV_OPT_FLAG_ENCODING_PARAM
},
126
{
NULL
}
127
};
128
129
static
const
AVClass
ilbc_enc_class
= {
130
.
class_name
=
"libilbc"
,
131
.item_name =
av_default_item_name
,
132
.option =
ilbc_enc_options
,
133
.version =
LIBAVUTIL_VERSION_INT
,
134
};
135
136
static
av_cold
int
ilbc_encode_init
(
AVCodecContext
*avctx)
137
{
138
ILBCEncContext
*
s
= avctx->
priv_data
;
139
int
mode
;
140
141
if
(avctx->
sample_rate
!= 8000) {
142
av_log
(avctx,
AV_LOG_ERROR
,
"Only 8000Hz sample rate supported\n"
);
143
return
AVERROR
(EINVAL);
144
}
145
146
if
(avctx->
channels
!= 1) {
147
av_log
(avctx,
AV_LOG_ERROR
,
"Only mono supported\n"
);
148
return
AVERROR
(EINVAL);
149
}
150
151
if
((mode =
get_mode
(avctx)) > 0)
152
s->
mode
=
mode
;
153
else
154
s->
mode
= s->
mode
!= 30 ? 20 : 30;
155
WebRtcIlbcfix_InitEncode(&s->
encoder
, s->
mode
);
156
157
avctx->
block_align
= s->
encoder
.no_of_bytes;
158
avctx->
frame_size
= s->
encoder
.blockl;
159
160
return
0;
161
}
162
163
static
int
ilbc_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*avpkt,
164
const
AVFrame
*
frame
,
int
*got_packet_ptr)
165
{
166
ILBCEncContext
*
s
= avctx->
priv_data
;
167
int
ret
;
168
169
if
((ret =
ff_alloc_packet2
(avctx, avpkt, 50)) < 0)
170
return
ret
;
171
172
WebRtcIlbcfix_EncodeImpl((uint16_t *) avpkt->
data
, (
const
int16_t *) frame->
data
[0], &s->
encoder
);
173
174
avpkt->
size
= s->
encoder
.no_of_bytes;
175
*got_packet_ptr = 1;
176
return
0;
177
}
178
179
static
const
AVCodecDefault
ilbc_encode_defaults
[] = {
180
{
"b"
,
"0"
},
181
{
NULL
}
182
};
183
184
AVCodec
ff_libilbc_encoder
= {
185
.
name
=
"libilbc"
,
186
.long_name =
NULL_IF_CONFIG_SMALL
(
"iLBC (Internet Low Bitrate Codec)"
),
187
.type =
AVMEDIA_TYPE_AUDIO
,
188
.id =
AV_CODEC_ID_ILBC
,
189
.priv_data_size =
sizeof
(
ILBCEncContext
),
190
.
init
=
ilbc_encode_init
,
191
.encode2 =
ilbc_encode_frame
,
192
.
sample_fmts
= (
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_S16
,
193
AV_SAMPLE_FMT_NONE
},
194
.defaults =
ilbc_encode_defaults
,
195
.priv_class = &
ilbc_enc_class
,
196
};
Generated on Sun Mar 8 2015 02:34:54 for FFmpeg by
1.8.2