2 * LOAS AudioSyncStream demuxer
3 * Copyright (c) 2008 Michael Niedermayer <michaelni@gmx.at>
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/intreadwrite.h"
23 #include "libavutil/internal.h"
28 #define LOAS_SYNC_WORD 0x2b7
30 static int loas_probe(AVProbeData
*p
)
32 int max_frames
= 0, first_frames
= 0;
34 const uint8_t *buf0
= p
->buf
;
37 const uint8_t *end
= buf0
+ p
->buf_size
- 3;
40 for (; buf
< end
; buf
= buf2
+ 1) {
43 for (frames
= 0; buf2
< end
; frames
++) {
44 uint32_t header
= AV_RB24(buf2
);
45 if ((header
>> 13) != LOAS_SYNC_WORD
)
47 fsize
= (header
& 0x1FFF) + 3;
50 fsize
= FFMIN(fsize
, end
- buf2
);
53 max_frames
= FFMAX(max_frames
, frames
);
55 first_frames
= frames
;
58 if (first_frames
>= 3)
59 return AVPROBE_SCORE_EXTENSION
+ 1;
60 else if (max_frames
> 100)
61 return AVPROBE_SCORE_EXTENSION
;
62 else if (max_frames
>= 3)
63 return AVPROBE_SCORE_EXTENSION
/ 2;
68 static int loas_read_header(AVFormatContext
*s
)
72 st
= avformat_new_stream(s
, NULL
);
74 return AVERROR(ENOMEM
);
76 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
77 st
->codec
->codec_id
= s
->iformat
->raw_codec_id
;
78 st
->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
80 //LCM of all possible AAC sample rates
81 avpriv_set_pts_info(st
, 64, 1, 28224000);
86 AVInputFormat ff_loas_demuxer
= {
88 .long_name
= NULL_IF_CONFIG_SMALL("LOAS AudioSyncStream"),
89 .read_probe
= loas_probe
,
90 .read_header
= loas_read_header
,
91 .read_packet
= ff_raw_read_partial_packet
,
92 .flags
= AVFMT_GENERIC_INDEX
,
93 .raw_codec_id
= AV_CODEC_ID_AAC_LATM
,