Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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 "internal.h"
  26. #include "rawdec.h"
  27. #include "id3v1.h"
  28. #include "apetag.h"
  29.  
  30. static int adts_aac_probe(AVProbeData *p)
  31. {
  32.     int max_frames = 0, first_frames = 0;
  33.     int fsize, frames;
  34.     const uint8_t *buf0 = p->buf;
  35.     const uint8_t *buf2;
  36.     const uint8_t *buf;
  37.     const uint8_t *end = buf0 + p->buf_size - 7;
  38.  
  39.     buf = buf0;
  40.  
  41.     for(; buf < end; buf= buf2+1) {
  42.         buf2 = buf;
  43.  
  44.         for(frames = 0; buf2 < end; frames++) {
  45.             uint32_t header = AV_RB16(buf2);
  46.             if((header&0xFFF6) != 0xFFF0)
  47.                 break;
  48.             fsize = (AV_RB32(buf2 + 3) >> 13) & 0x1FFF;
  49.             if(fsize < 7)
  50.                 break;
  51.             fsize = FFMIN(fsize, end - buf2);
  52.             buf2 += fsize;
  53.         }
  54.         max_frames = FFMAX(max_frames, frames);
  55.         if(buf == buf0)
  56.             first_frames= frames;
  57.     }
  58.     if   (first_frames>=3) return AVPROBE_SCORE_EXTENSION + 1;
  59.     else if(max_frames>500)return AVPROBE_SCORE_EXTENSION;
  60.     else if(max_frames>=3) return AVPROBE_SCORE_EXTENSION / 2;
  61.     else if(max_frames>=1) return 1;
  62.     else                   return 0;
  63. }
  64.  
  65. static int adts_aac_read_header(AVFormatContext *s)
  66. {
  67.     AVStream *st;
  68.  
  69.     st = avformat_new_stream(s, NULL);
  70.     if (!st)
  71.         return AVERROR(ENOMEM);
  72.  
  73.     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  74.     st->codec->codec_id = s->iformat->raw_codec_id;
  75.     st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
  76.  
  77.     ff_id3v1_read(s);
  78.     if (s->pb->seekable &&
  79.         !av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
  80.         int64_t cur = avio_tell(s->pb);
  81.         ff_ape_parse_tag(s);
  82.         avio_seek(s->pb, cur, SEEK_SET);
  83.     }
  84.  
  85.     //LCM of all possible ADTS sample rates
  86.     avpriv_set_pts_info(st, 64, 1, 28224000);
  87.  
  88.     return 0;
  89. }
  90.  
  91. AVInputFormat ff_aac_demuxer = {
  92.     .name           = "aac",
  93.     .long_name      = NULL_IF_CONFIG_SMALL("raw ADTS AAC (Advanced Audio Coding)"),
  94.     .read_probe     = adts_aac_probe,
  95.     .read_header    = adts_aac_read_header,
  96.     .read_packet    = ff_raw_read_partial_packet,
  97.     .flags          = AVFMT_GENERIC_INDEX,
  98.     .extensions     = "aac",
  99.     .raw_codec_id   = AV_CODEC_ID_AAC,
  100. };
  101.