1 /*
2 * raw ADTS AAC demuxer
3 * Copyright (c) 2008 Michael Niedermayer <michaelni@gmx.at>
4 * Copyright (c) 2009 Robert Swain ( rob opendot cl )
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
30
31 #define ADTS_HEADER_SIZE 7
32
34 {
35 int max_frames = 0, first_frames = 0;
41
42 buf = buf0;
43
44 for (; buf <
end; buf = buf2 + 1) {
46
47 for (frames = 0; buf2 <
end; frames++) {
49 if ((header & 0xFFF6) != 0xFFF0) {
50 if (buf != buf0) {
51 // Found something that isn't an ADTS header, starting
52 // from a position other than the start of the buffer.
53 // Discard the count we've accumulated so far since it
54 // probably was a false positive.
55 frames = 0;
56 }
57 break;
58 }
59 fsize = (
AV_RB32(buf2 + 3) >> 13) & 0x1FFF;
60 if (fsize < 7)
61 break;
62 fsize =
FFMIN(fsize, end - buf2);
64 }
65 max_frames =
FFMAX(max_frames, frames);
66 if (buf == buf0)
68 }
69
70 if (first_frames >= 3)
72 else if (max_frames > 100)
74 else if (max_frames >= 3)
76 else if (first_frames >= 1)
77 return 1;
78 else
79 return 0;
80 }
81
83 {
86
88 if (!st)
90
94
101 }
102
103 // skip data until the first ADTS frame is found
107 if ((state >> 4) != 0xFFF)
108 continue;
110 break;
111 }
112 if ((state >> 4) != 0xFFF)
114
115 // LCM of all possible ADTS sample rates
117
118 return 0;
119 }
120
122 {
126 int ret;
127
129 if (ret < 0) {
131 return ret;
132 }
133
138
139 if (metadata) {
143 }
144
149
150 return ret;
151 }
152
154 {
156
157 // Parse all the ID3 headers between frames
158 while (1) {
162 continue;
163 }
164 }
165 break;
166 }
167
168 if (ret < 0)
169 return ret;
170
174 }
175
179 }
180
185 }
186
188 if (ret < 0)
190
191 return ret;
192 }
193
201 .extensions = "aac",
202 .mime_type = "audio/aac,audio/aacp,audio/x-aac",
204 };
int64_t probesize
Maximum size of the data read from input for determining the input container format.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
void ff_id3v1_read(AVFormatContext *s)
Read an ID3v1 tag.
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
int event_flags
Flags for the user to detect events happening on the file.
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
#define ID3v2_HEADER_SIZE
static av_cold int end(AVCodecContext *avctx)
enum AVStreamParseType need_parsing
int ff_id3v2_parse_priv_dict(AVDictionary **metadata, ID3v2ExtraMeta **extra_meta)
Parse PRIV tags into a dictionary.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static const uint8_t header[24]
AVDictionary * metadata
Metadata that applies to the whole file.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
enum AVMediaType codec_type
General type of the encoded data.
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta)
Free memory allocated parsing special (non-text) metadata.
int64_t ff_ape_parse_tag(AVFormatContext *s)
Read and parse an APE tag.
int avio_r8(AVIOContext *s)
int buf_size
Size of buf except extra allocated bytes.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
static void error(const char *err)
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
AVIOContext * pb
I/O context.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
This structure contains the data a format has to probe a file.
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
struct AVInputFormat * iformat
The input container format.
void ff_id3v2_read_dict(AVIOContext *pb, AVDictionary **metadata, const char *magic, ID3v2ExtraMeta **extra_meta)
Read an ID3v2 tag into specified dictionary and retrieve supported extra metadata.
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key, ignoring the suffix of the found key string.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int avio_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
static int64_t fsize(FILE *f)
This structure stores compressed data.