1 /*
2 * QCP format (.qcp) demuxer
3 * Copyright (c) 2009 Kenan Gillet
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 * QCP format (.qcp) demuxer
25 * @author Kenan Gillet
26 * @see RFC 3625: "The QCP File Format and Media Types for Speech Data"
27 * http://tools.ietf.org/html/rfc3625
28 */
29
34
37
38 #define QCP_MAX_MODE 4
40 ///< to each mode, -1 if no size.
42
43 /**
44 * Last 15 out of 16 bytes of QCELP-13K GUID, as stored in the file;
45 * the first byte of the GUID can be either 0x41 or 0x42.
46 */
48 0x6d, 0x7f, 0x5e, 0x15, 0xb1, 0xd0, 0x11, 0xba,
49 0x91, 0x00, 0x80, 0x5f, 0xb4, 0xb9, 0x7e
50 };
51
52 /**
53 * EVRC GUID as stored in the file
54 */
56 0x8d, 0xd4, 0x89, 0xe6, 0x76, 0x90, 0xb5, 0x46,
57 0x91, 0xef, 0x73, 0x6a, 0x51, 0x00, 0xce, 0xb4
58 };
59
60 /**
61 * SMV GUID as stored in the file
62 */
64 0x75, 0x2b, 0x7c, 0x8d, 0x97, 0xa7, 0x49, 0xed,
65 0x98, 0x5e, 0xd5, 0x3c, 0x8c, 0xc7, 0x5f, 0x84
66 };
67
68 /**
69 * @param guid contains at least 16 bytes
70 * @return 1 if the guid is a qcelp_13k guid, 0 otherwise
71 */
73 return (guid[0] == 0x41 || guid[0] == 0x42)
75 }
76
78 {
82 return 0;
83 }
84
86 {
91 int i, nb_rates;
92
93 if (!st)
95
97 avio_skip(pb, 4 + 8 + 4 + 1 + 1);
// filesize + "QLCMfmt " + chunk-size + major-version + minor-version
98
105 }
else if (!memcmp(buf,
guid_evrc, 16)) {
107 }
else if (!memcmp(buf,
guid_smv, 16)) {
109 } else {
113 }
114 avio_skip(pb, 2 + 80);
// codec-version + codec-name
116
121
124 nb_rates =
FFMIN(nb_rates, 8);
125 for (i=0; i<nb_rates; i++) {
130 } else
132 }
133 avio_skip(pb, 16 - 2*nb_rates + 20);
// empty entries of rate-map-table + reserved
134
135 return 0;
136 }
137
139 {
142 unsigned int chunk_size,
tag;
143
147
152 continue;
153 }
154
158 }
159
161 if (pkt_size != ret)
163
165 }
167 }
168
171
174 switch (tag) {
175 case MKTAG(
'v',
'r',
'a',
't'):
179 break;
180 case MKTAG(
'd',
'a',
't',
'a'):
182 break;
183
184 default:
186 }
187 }
189 }
190
198 };
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static const uint8_t guid_smv[16]
SMV GUID as stored in the file.
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
static int qcp_read_packet(AVFormatContext *s, AVPacket *pkt)
unsigned int avio_rb32(AVIOContext *s)
uint32_t data_size
size of data chunk
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define AVERROR_EOF
End of file.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
unsigned int avio_rl32(AVIOContext *s)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
uint64_t channel_layout
Audio channel layout.
int avio_r8(AVIOContext *s)
AVCodecContext * codec
Codec context associated with this stream.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
int bit_rate
the average bitrate
audio channel layout utility functions
static int qcp_probe(AVProbeData *pd)
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
static int read_header(FFV1Context *f)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
enum AVMediaType codec_type
static int qcp_read_header(AVFormatContext *s)
int sample_rate
samples per second
AVIOContext * pb
I/O context.
AVInputFormat ff_qcp_demuxer
static const uint8_t guid_evrc[16]
EVRC GUID as stored in the file.
static const uint8_t guid_qcelp_13k_part[15]
Last 15 out of 16 bytes of QCELP-13K GUID, as stored in the file; the first byte of the GUID can be e...
This structure contains the data a format has to probe a file.
unsigned int avio_rl16(AVIOContext *s)
int16_t rates_per_mode[QCP_MAX_MODE+1]
contains the packet size corresponding to each mode, -1 if no size.
int channels
number of audio channels
void * priv_data
Format private data.
static int is_qcelp_13k_guid(const uint8_t *guid)
int avio_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
#define AV_CH_LAYOUT_MONO
#define MKTAG(a, b, c, d)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
This structure stores compressed data.