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
libgsmenc.c
Go to the documentation of this file.
1
/*
2
* Interface to libgsm for GSM encoding
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 encoding
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/common.h
"
38
39
#include "
avcodec.h
"
40
#include "
internal.h
"
41
#include "
gsm.h
"
42
43
static
av_cold
int
libgsm_encode_close
(
AVCodecContext
*avctx) {
44
gsm_destroy(avctx->
priv_data
);
45
avctx->
priv_data
= NULL;
46
return
0;
47
}
48
49
static
av_cold
int
libgsm_encode_init
(
AVCodecContext
*avctx) {
50
if
(avctx->
channels
> 1) {
51
av_log
(avctx,
AV_LOG_ERROR
,
"Mono required for GSM, got %d channels\n"
,
52
avctx->
channels
);
53
return
-1;
54
}
55
56
if
(avctx->
sample_rate
!= 8000) {
57
av_log
(avctx,
AV_LOG_ERROR
,
"Sample rate 8000Hz required for GSM, got %dHz\n"
,
58
avctx->
sample_rate
);
59
if
(avctx->
strict_std_compliance
>
FF_COMPLIANCE_UNOFFICIAL
)
60
return
-1;
61
}
62
if
(avctx->
bit_rate
!= 13000
/* Official */
&&
63
avctx->
bit_rate
!= 13200
/* Very common */
&&
64
avctx->
bit_rate
!= 0
/* Unknown; a.o. mov does not set bitrate when decoding */
) {
65
av_log
(avctx,
AV_LOG_ERROR
,
"Bitrate 13000bps required for GSM, got %dbps\n"
,
66
avctx->
bit_rate
);
67
if
(avctx->
strict_std_compliance
>
FF_COMPLIANCE_UNOFFICIAL
)
68
return
-1;
69
}
70
71
avctx->
priv_data
= gsm_create();
72
if
(!avctx->
priv_data
)
73
goto
error;
74
75
switch
(avctx->
codec_id
) {
76
case
AV_CODEC_ID_GSM
:
77
avctx->
frame_size
=
GSM_FRAME_SIZE
;
78
avctx->
block_align
=
GSM_BLOCK_SIZE
;
79
break
;
80
case
AV_CODEC_ID_GSM_MS
: {
81
int
one = 1;
82
gsm_option(avctx->
priv_data
, GSM_OPT_WAV49, &one);
83
avctx->
frame_size
= 2*
GSM_FRAME_SIZE
;
84
avctx->
block_align
=
GSM_MS_BLOCK_SIZE
;
85
}
86
}
87
88
return
0;
89
error:
90
libgsm_encode_close
(avctx);
91
return
-1;
92
}
93
94
static
int
libgsm_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*avpkt,
95
const
AVFrame
*
frame
,
int
*got_packet_ptr)
96
{
97
int
ret
;
98
gsm_signal *samples = (gsm_signal *)frame->
data
[0];
99
struct
gsm_state *
state
= avctx->
priv_data
;
100
101
if
((ret =
ff_alloc_packet2
(avctx, avpkt, avctx->
block_align
)) < 0)
102
return
ret;
103
104
switch
(avctx->
codec_id
) {
105
case
AV_CODEC_ID_GSM
:
106
gsm_encode(
state
, samples, avpkt->
data
);
107
break
;
108
case
AV_CODEC_ID_GSM_MS
:
109
gsm_encode(
state
, samples, avpkt->
data
);
110
gsm_encode(
state
, samples +
GSM_FRAME_SIZE
, avpkt->
data
+ 32);
111
}
112
113
*got_packet_ptr = 1;
114
return
0;
115
}
116
117
118
#if CONFIG_LIBGSM_ENCODER
119
AVCodec
ff_libgsm_encoder = {
120
.
name
=
"libgsm"
,
121
.long_name =
NULL_IF_CONFIG_SMALL
(
"libgsm GSM"
),
122
.type =
AVMEDIA_TYPE_AUDIO
,
123
.id =
AV_CODEC_ID_GSM
,
124
.init =
libgsm_encode_init
,
125
.encode2 =
libgsm_encode_frame
,
126
.close =
libgsm_encode_close
,
127
.sample_fmts = (
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_S16
,
128
AV_SAMPLE_FMT_NONE
},
129
};
130
#endif
131
#if CONFIG_LIBGSM_MS_ENCODER
132
AVCodec
ff_libgsm_ms_encoder = {
133
.
name
=
"libgsm_ms"
,
134
.long_name =
NULL_IF_CONFIG_SMALL
(
"libgsm GSM Microsoft variant"
),
135
.type =
AVMEDIA_TYPE_AUDIO
,
136
.id =
AV_CODEC_ID_GSM_MS
,
137
.init =
libgsm_encode_init
,
138
.encode2 =
libgsm_encode_frame
,
139
.close =
libgsm_encode_close
,
140
.sample_fmts = (
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_S16
,
141
AV_SAMPLE_FMT_NONE
},
142
};
143
#endif
Generated on Fri Dec 5 2014 04:41:57 for FFmpeg by
1.8.2