]> git.sesse.net Git - ffmpeg/blob - libavformat/aacdec.c
move ADTS AAC demuxer to its own file
[ffmpeg] / libavformat / aacdec.c
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
23 #include "libavutil/intreadwrite.h"
24 #include "avformat.h"
25 #include "raw.h"
26 #include "id3v2.h"
27 #include "id3v1.h"
28
29
30 static int adts_aac_probe(AVProbeData *p)
31 {
32     int max_frames = 0, first_frames = 0;
33     int fsize, frames;
34     uint8_t *buf0 = p->buf;
35     uint8_t *buf2;
36     uint8_t *buf;
37     uint8_t *end = buf0 + p->buf_size - 7;
38
39     if (ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC)) {
40         buf0 += ff_id3v2_tag_len(buf0);
41     }
42     buf = buf0;
43
44     for(; buf < end; buf= buf2+1) {
45         buf2 = buf;
46
47         for(frames = 0; buf2 < end; frames++) {
48             uint32_t header = AV_RB16(buf2);
49             if((header&0xFFF6) != 0xFFF0)
50                 break;
51             fsize = (AV_RB32(buf2+3)>>13) & 0x8FFF;
52             if(fsize < 7)
53                 break;
54             buf2 += fsize;
55         }
56         max_frames = FFMAX(max_frames, frames);
57         if(buf == buf0)
58             first_frames= frames;
59     }
60     if   (first_frames>=3) return AVPROBE_SCORE_MAX/2+1;
61     else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
62     else if(max_frames>=3) return AVPROBE_SCORE_MAX/4;
63     else if(max_frames>=1) return 1;
64     else                   return 0;
65 }
66
67 static int adts_aac_read_header(AVFormatContext *s,
68                                 AVFormatParameters *ap)
69 {
70     AVStream *st;
71
72     st = av_new_stream(s, 0);
73     if (!st)
74         return AVERROR(ENOMEM);
75
76     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
77     st->codec->codec_id = s->iformat->value;
78     st->need_parsing = AVSTREAM_PARSE_FULL;
79
80     ff_id3v1_read(s);
81     ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
82
83     return 0;
84 }
85
86 AVInputFormat aac_demuxer = {
87     "aac",
88     NULL_IF_CONFIG_SMALL("raw ADTS AAC"),
89     0,
90     adts_aac_probe,
91     adts_aac_read_header,
92     ff_raw_read_partial_packet,
93     .flags= AVFMT_GENERIC_INDEX,
94     .extensions = "aac",
95     .value = CODEC_ID_AAC,
96 };