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
gsmdec.c
Go to the documentation of this file.
1
/*
2
* gsm 06.10 decoder
3
* Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
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
/**
23
* @file
24
* GSM decoder
25
*/
26
27
#include "
libavutil/channel_layout.h
"
28
#include "
avcodec.h
"
29
#include "
get_bits.h
"
30
#include "
internal.h
"
31
#include "
msgsmdec.h
"
32
33
#include "
gsmdec_template.c
"
34
35
static
av_cold
int
gsm_init
(
AVCodecContext
*avctx)
36
{
37
if
(avctx->
codec_tag
== 0x0032 &&
38
avctx->
bit_rate
!= 13000 &&
39
avctx->
bit_rate
!= 17912 &&
40
avctx->
bit_rate
!= 35824 &&
41
avctx->
bit_rate
!= 71656) {
42
av_log
(avctx,
AV_LOG_ERROR
,
"Unsupported audio mode\n"
);
43
return
AVERROR_PATCHWELCOME
;
44
}
45
avctx->
channels
= 1;
46
avctx->
channel_layout
=
AV_CH_LAYOUT_MONO
;
47
if
(!avctx->
sample_rate
)
48
avctx->
sample_rate
= 8000;
49
avctx->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
50
51
switch
(avctx->
codec_id
) {
52
case
AV_CODEC_ID_GSM
:
53
avctx->
frame_size
=
GSM_FRAME_SIZE
;
54
avctx->
block_align
=
GSM_BLOCK_SIZE
;
55
break
;
56
case
AV_CODEC_ID_GSM_MS
:
57
avctx->
frame_size
= 2 *
GSM_FRAME_SIZE
;
58
avctx->
block_align
=
GSM_MS_BLOCK_SIZE
;
59
}
60
61
return
0;
62
}
63
64
static
int
gsm_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
65
int
*got_frame_ptr,
AVPacket
*avpkt)
66
{
67
AVFrame
*
frame
=
data
;
68
int
res
;
69
GetBitContext
gb;
70
const
uint8_t
*
buf
= avpkt->
data
;
71
int
buf_size = avpkt->
size
;
72
int16_t *samples;
73
74
if
(buf_size < avctx->block_align) {
75
av_log
(avctx,
AV_LOG_ERROR
,
"Packet is too small\n"
);
76
return
AVERROR_INVALIDDATA
;
77
}
78
79
/* get output buffer */
80
frame->
nb_samples
= avctx->
frame_size
;
81
if
((res =
ff_get_buffer
(avctx, frame, 0)) < 0)
82
return
res
;
83
samples = (int16_t *)frame->
data
[0];
84
85
switch (avctx->
codec_id
) {
86
case
AV_CODEC_ID_GSM
:
87
init_get_bits
(&gb, buf, buf_size * 8);
88
if
(
get_bits
(&gb, 4) != 0xd)
89
av_log
(avctx,
AV_LOG_WARNING
,
"Missing GSM magic!\n"
);
90
res =
gsm_decode_block
(avctx, samples, &gb);
91
if
(res < 0)
92
return
res
;
93
break
;
94
case
AV_CODEC_ID_GSM_MS
:
95
res =
ff_msgsm_decode_block
(avctx, samples, buf);
96
if
(res < 0)
97
return
res
;
98
}
99
100
*got_frame_ptr = 1;
101
102
return
avctx->
block_align
;
103
}
104
105
static
void
gsm_flush
(
AVCodecContext
*avctx)
106
{
107
GSMContext
*
s
= avctx->
priv_data
;
108
memset(s, 0,
sizeof
(*s));
109
}
110
111
#if CONFIG_GSM_DECODER
112
AVCodec
ff_gsm_decoder = {
113
.
name
=
"gsm"
,
114
.long_name =
NULL_IF_CONFIG_SMALL
(
"GSM"
),
115
.type =
AVMEDIA_TYPE_AUDIO
,
116
.id =
AV_CODEC_ID_GSM
,
117
.priv_data_size =
sizeof
(
GSMContext
),
118
.
init
=
gsm_init
,
119
.
decode
=
gsm_decode_frame
,
120
.
flush
=
gsm_flush
,
121
.capabilities =
CODEC_CAP_DR1
,
122
};
123
#endif
124
#if CONFIG_GSM_MS_DECODER
125
AVCodec
ff_gsm_ms_decoder = {
126
.
name
=
"gsm_ms"
,
127
.long_name =
NULL_IF_CONFIG_SMALL
(
"GSM Microsoft variant"
),
128
.type =
AVMEDIA_TYPE_AUDIO
,
129
.id =
AV_CODEC_ID_GSM_MS
,
130
.priv_data_size =
sizeof
(
GSMContext
),
131
.
init
=
gsm_init
,
132
.
decode
=
gsm_decode_frame
,
133
.
flush
=
gsm_flush
,
134
.capabilities =
CODEC_CAP_DR1
,
135
};
136
#endif
Generated on Sat Jan 25 2014 19:51:47 for FFmpeg by
1.8.2