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"
29 #define LOAS_SYNC_WORD 0x2b7
31 static int loas_probe(const AVProbeData
*p
)
33 int max_frames
= 0, first_frames
= 0;
35 const uint8_t *buf0
= p
->buf
;
38 const uint8_t *end
= buf0
+ p
->buf_size
- 3;
41 for (; buf
< end
; buf
= buf2
+ 1) {
44 for (frames
= 0; buf2
< end
; frames
++) {
45 uint32_t header
= AV_RB24(buf2
);
46 if ((header
>> 13) != LOAS_SYNC_WORD
)
48 fsize
= (header
& 0x1FFF) + 3;
51 fsize
= FFMIN(fsize
, end
- buf2
);
54 max_frames
= FFMAX(max_frames
, frames
);
56 first_frames
= frames
;
59 if (first_frames
>= 3)
60 return AVPROBE_SCORE_EXTENSION
+ 1;
61 else if (max_frames
> 100)
62 return AVPROBE_SCORE_EXTENSION
;
63 else if (max_frames
>= 3)
64 return AVPROBE_SCORE_EXTENSION
/ 2;
69 static int loas_read_header(AVFormatContext
*s
)
73 st
= avformat_new_stream(s
, NULL
);
75 return AVERROR(ENOMEM
);
77 st
->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
78 st
->codecpar
->codec_id
= AV_CODEC_ID_AAC_LATM
;
79 ffstream(st
)->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
81 //LCM of all possible AAC sample rates
82 avpriv_set_pts_info(st
, 64, 1, 28224000);
87 const FFInputFormat ff_loas_demuxer
= {
89 .p
.long_name
= NULL_IF_CONFIG_SMALL("LOAS AudioSyncStream"),
90 .p
.flags
= AVFMT_GENERIC_INDEX
,
91 .p
.priv_class
= &ff_raw_demuxer_class
,
92 .read_probe
= loas_probe
,
93 .read_header
= loas_read_header
,
94 .read_packet
= ff_raw_read_partial_packet
,
95 .raw_codec_id
= AV_CODEC_ID_AAC_LATM
,
96 .priv_data_size
= sizeof(FFRawDemuxerContext
),