3 * Copyright (c) 2011 Justin Ruggles
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "libavutil/channel_layout.h"
23 #include "libavutil/mathematics.h"
24 #include "libavutil/opt.h"
28 #define GSM_BLOCK_SIZE 33
29 #define GSM_BLOCK_SAMPLES 160
30 #define GSM_SAMPLE_RATE 8000
37 static int gsm_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
41 size
= GSM_BLOCK_SIZE
;
43 pkt
->pos
= avio_tell(s
->pb
);
44 pkt
->stream_index
= 0;
46 ret
= av_get_packet(s
->pb
, pkt
, size
);
47 if (ret
< GSM_BLOCK_SIZE
) {
49 return ret
< 0 ? ret
: AVERROR(EIO
);
52 pkt
->pts
= pkt
->pos
/ GSM_BLOCK_SIZE
;
57 static int gsm_read_header(AVFormatContext
*s
)
59 GSMDemuxerContext
*c
= s
->priv_data
;
60 AVStream
*st
= avformat_new_stream(s
, NULL
);
62 return AVERROR(ENOMEM
);
64 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
65 st
->codec
->codec_id
= s
->iformat
->raw_codec_id
;
66 st
->codec
->channels
= 1;
67 st
->codec
->channel_layout
= AV_CH_LAYOUT_MONO
;
68 st
->codec
->sample_rate
= c
->sample_rate
;
69 st
->codec
->bit_rate
= GSM_BLOCK_SIZE
* 8 * c
->sample_rate
/ GSM_BLOCK_SAMPLES
;
71 avpriv_set_pts_info(st
, 64, GSM_BLOCK_SAMPLES
, GSM_SAMPLE_RATE
);
76 static const AVOption options
[] = {
77 { "sample_rate", "", offsetof(GSMDemuxerContext
, sample_rate
),
78 AV_OPT_TYPE_INT
, {.i64
= GSM_SAMPLE_RATE
}, 1, INT_MAX
/ GSM_BLOCK_SIZE
,
79 AV_OPT_FLAG_DECODING_PARAM
},
83 static const AVClass gsm_class
= {
84 .class_name
= "gsm demuxer",
85 .item_name
= av_default_item_name
,
87 .version
= LIBAVUTIL_VERSION_INT
,
90 AVInputFormat ff_gsm_demuxer
= {
92 .long_name
= NULL_IF_CONFIG_SMALL("raw GSM"),
93 .priv_data_size
= sizeof(GSMDemuxerContext
),
94 .read_header
= gsm_read_header
,
95 .read_packet
= gsm_read_packet
,
96 .flags
= AVFMT_GENERIC_INDEX
,
98 .raw_codec_id
= AV_CODEC_ID_GSM
,
99 .priv_class
= &gsm_class
,