| | 1 | /* |
| | 2 | * LATM 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 "libavutil/internal.h" |
| | 25 | #include "avformat.h" |
| | 26 | #include "rawdec.h" |
| | 27 | |
| | 28 | |
| | 29 | static int latm_probe(AVProbeData *p) |
| | 30 | { |
| | 31 | int max_frames = 0, first_frames = 0; |
| | 32 | int fsize, frames; |
| | 33 | uint8_t *buf0 = p->buf; |
| | 34 | uint8_t *buf2; |
| | 35 | uint8_t *buf; |
| | 36 | uint8_t *end = buf0 + p->buf_size - 4; |
| | 37 | buf = buf0; |
| | 38 | |
| | 39 | for(; buf < end; buf= buf2+1) { |
| | 40 | buf2 = buf; |
| | 41 | |
| | 42 | for(frames = 0; buf2 < end; frames++) { |
| | 43 | uint32_t header = AV_RB16(buf2); |
| | 44 | if((header&0xFFE0) != 0x56E0) |
| | 45 | break; |
| | 46 | fsize = ((AV_RB32(buf2) >> 8) & 0x1FFF) + 3; |
| | 47 | if(fsize < 7) |
| | 48 | break; |
| | 49 | buf2 += fsize; |
| | 50 | } |
| | 51 | max_frames = FFMAX(max_frames, frames); |
| | 52 | if(buf == buf0) |
| | 53 | first_frames= frames; |
| | 54 | } |
| | 55 | if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1; |
| | 56 | else if(max_frames>500)return AVPROBE_SCORE_MAX/2; |
| | 57 | else if(max_frames>=3) return AVPROBE_SCORE_MAX/4; |
| | 58 | else if(max_frames>=1) return 1; |
| | 59 | else return 0; |
| | 60 | } |
| | 61 | |
| | 62 | static int latm_read_header(AVFormatContext *s, |
| | 63 | AVFormatParameters *ap) |
| | 64 | { |
| | 65 | AVStream *st; |
| | 66 | |
| | 67 | st = av_new_stream(s, 0); |
| | 68 | if (!st) |
| | 69 | return AVERROR(ENOMEM); |
| | 70 | |
| | 71 | st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
| | 72 | st->codec->codec_id = s->iformat->value; |
| | 73 | st->need_parsing = AVSTREAM_PARSE_FULL; |
| | 74 | |
| | 75 | //LCM of all possible AAC sample rates |
| | 76 | av_set_pts_info(st, 64, 1, 28224000); |
| | 77 | |
| | 78 | return 0; |
| | 79 | } |
| | 80 | |
| | 81 | |
| | 82 | AVInputFormat ff_latm_demuxer = { |
| | 83 | .name = "latm", |
| | 84 | .long_name = NULL_IF_CONFIG_SMALL("LATM"), |
| | 85 | .read_probe = latm_probe, |
| | 86 | .read_header = latm_read_header, |
| | 87 | .read_packet = ff_raw_read_partial_packet, |
| | 88 | .flags= AVFMT_GENERIC_INDEX, |
| | 89 | .value = CODEC_ID_AAC_LATM, |
| | 90 | }; |