Skip to content

Commit

Permalink
move ADTS AAC demuxer to its own file
Browse files Browse the repository at this point in the history
Originally committed as revision 24967 to svn://svn.ffmpeg.org/ffmpeg/trunk
  • Loading branch information
aurelj committed Aug 29, 2010
1 parent ef4a934 commit 49824cb
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 74 deletions.
2 changes: 1 addition & 1 deletion libavformat/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ OBJS = allformats.o \

# muxers/demuxers
OBJS-$(CONFIG_A64_MUXER) += a64.o
OBJS-$(CONFIG_AAC_DEMUXER) += raw.o id3v1.o id3v2.o
OBJS-$(CONFIG_AAC_DEMUXER) += aacdec.o id3v1.o id3v2.o
OBJS-$(CONFIG_AC3_DEMUXER) += raw.o
OBJS-$(CONFIG_AC3_MUXER) += raw.o
OBJS-$(CONFIG_ADTS_MUXER) += adtsenc.o
Expand Down
96 changes: 96 additions & 0 deletions libavformat/aacdec.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* raw ADTS AAC demuxer
* Copyright (c) 2008 Michael Niedermayer <[email protected]>
* Copyright (c) 2009 Robert Swain ( rob opendot cl )
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "libavutil/intreadwrite.h"
#include "avformat.h"
#include "raw.h"
#include "id3v2.h"
#include "id3v1.h"


static int adts_aac_probe(AVProbeData *p)
{
int max_frames = 0, first_frames = 0;
int fsize, frames;
uint8_t *buf0 = p->buf;
uint8_t *buf2;
uint8_t *buf;
uint8_t *end = buf0 + p->buf_size - 7;

if (ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC)) {
buf0 += ff_id3v2_tag_len(buf0);
}
buf = buf0;

for(; buf < end; buf= buf2+1) {
buf2 = buf;

for(frames = 0; buf2 < end; frames++) {
uint32_t header = AV_RB16(buf2);
if((header&0xFFF6) != 0xFFF0)
break;
fsize = (AV_RB32(buf2+3)>>13) & 0x8FFF;
if(fsize < 7)
break;
buf2 += fsize;
}
max_frames = FFMAX(max_frames, frames);
if(buf == buf0)
first_frames= frames;
}
if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1;
else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
else if(max_frames>=3) return AVPROBE_SCORE_MAX/4;
else if(max_frames>=1) return 1;
else return 0;
}

static int adts_aac_read_header(AVFormatContext *s,
AVFormatParameters *ap)
{
AVStream *st;

st = av_new_stream(s, 0);
if (!st)
return AVERROR(ENOMEM);

st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
st->codec->codec_id = s->iformat->value;
st->need_parsing = AVSTREAM_PARSE_FULL;

ff_id3v1_read(s);
ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);

return 0;
}

AVInputFormat aac_demuxer = {
"aac",
NULL_IF_CONFIG_SMALL("raw ADTS AAC"),
0,
adts_aac_probe,
adts_aac_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "aac",
.value = CODEC_ID_AAC,
};
73 changes: 0 additions & 73 deletions libavformat/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -662,81 +662,8 @@ static int eac3_probe(AVProbeData *p)
}
#endif

#if CONFIG_AAC_DEMUXER
static int adts_aac_probe(AVProbeData *p)
{
int max_frames = 0, first_frames = 0;
int fsize, frames;
uint8_t *buf0 = p->buf;
uint8_t *buf2;
uint8_t *buf;
uint8_t *end = buf0 + p->buf_size - 7;

if (ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC)) {
buf0 += ff_id3v2_tag_len(buf0);
}
buf = buf0;

for(; buf < end; buf= buf2+1) {
buf2 = buf;

for(frames = 0; buf2 < end; frames++) {
uint32_t header = AV_RB16(buf2);
if((header&0xFFF6) != 0xFFF0)
break;
fsize = (AV_RB32(buf2+3)>>13) & 0x8FFF;
if(fsize < 7)
break;
buf2 += fsize;
}
max_frames = FFMAX(max_frames, frames);
if(buf == buf0)
first_frames= frames;
}
if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1;
else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
else if(max_frames>=3) return AVPROBE_SCORE_MAX/4;
else if(max_frames>=1) return 1;
else return 0;
}

static int adts_aac_read_header(AVFormatContext *s,
AVFormatParameters *ap)
{
AVStream *st;

st = av_new_stream(s, 0);
if (!st)
return AVERROR(ENOMEM);

st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
st->codec->codec_id = s->iformat->value;
st->need_parsing = AVSTREAM_PARSE_FULL;

ff_id3v1_read(s);
ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);

return 0;
}

#endif

/* Note: Do not forget to add new entries to the Makefile as well. */

#if CONFIG_AAC_DEMUXER
AVInputFormat aac_demuxer = {
"aac",
NULL_IF_CONFIG_SMALL("raw ADTS AAC"),
0,
adts_aac_probe,
adts_aac_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "aac",
.value = CODEC_ID_AAC,
};
#endif

#if CONFIG_AC3_DEMUXER
AVInputFormat ac3_demuxer = {
"ac3",
Expand Down

0 comments on commit 49824cb

Please sign in to comment.