1c5b0abf900474b204c367093984ff60da4fba09cGloria Wang/* 2c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * Copyright (C) 2011 The Android Open Source Project 3c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * 4c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * you may not use this file except in compliance with the License. 6c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * You may obtain a copy of the License at 7c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * 8c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * http://www.apache.org/licenses/LICENSE-2.0 9c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * 10c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * Unless required by applicable law or agreed to in writing, software 11c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * distributed under the License is distributed on an "AS IS" BASIS, 12c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * See the License for the specific language governing permissions and 14c5b0abf900474b204c367093984ff60da4fba09cGloria Wang * limitations under the License. 15c5b0abf900474b204c367093984ff60da4fba09cGloria Wang */ 16c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 17c5b0abf900474b204c367093984ff60da4fba09cGloria Wang//#define LOG_NDEBUG 0 18c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#define LOG_TAG "AACExtractor" 19c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <utils/Log.h> 20c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 21c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include "include/AACExtractor.h" 22c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include "include/avc_utils.h" 23c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 24c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/foundation/ABuffer.h> 25c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/DataSource.h> 26c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/MediaBufferGroup.h> 27c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/MediaDebug.h> 28c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/MediaDefs.h> 29c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/MediaErrors.h> 30c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/MediaSource.h> 31c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <media/stagefright/MetaData.h> 32c5b0abf900474b204c367093984ff60da4fba09cGloria Wang#include <utils/String8.h> 33c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 34c5b0abf900474b204c367093984ff60da4fba09cGloria Wangnamespace android { 35c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 36c5b0abf900474b204c367093984ff60da4fba09cGloria Wangclass AACSource : public MediaSource { 37c5b0abf900474b204c367093984ff60da4fba09cGloria Wangpublic: 38c5b0abf900474b204c367093984ff60da4fba09cGloria Wang AACSource(const sp<DataSource> &source, 39c5b0abf900474b204c367093984ff60da4fba09cGloria Wang const sp<MetaData> &meta, 40c5b0abf900474b204c367093984ff60da4fba09cGloria Wang const Vector<uint64_t> &offset_vector, 41c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t frame_duration_us); 42c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 43c5b0abf900474b204c367093984ff60da4fba09cGloria Wang virtual status_t start(MetaData *params = NULL); 44c5b0abf900474b204c367093984ff60da4fba09cGloria Wang virtual status_t stop(); 45c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 46c5b0abf900474b204c367093984ff60da4fba09cGloria Wang virtual sp<MetaData> getFormat(); 47c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 48c5b0abf900474b204c367093984ff60da4fba09cGloria Wang virtual status_t read( 49c5b0abf900474b204c367093984ff60da4fba09cGloria Wang MediaBuffer **buffer, const ReadOptions *options = NULL); 50c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 51c5b0abf900474b204c367093984ff60da4fba09cGloria Wangprotected: 52c5b0abf900474b204c367093984ff60da4fba09cGloria Wang virtual ~AACSource(); 53c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 54c5b0abf900474b204c367093984ff60da4fba09cGloria Wangprivate: 55c5b0abf900474b204c367093984ff60da4fba09cGloria Wang static const size_t kMaxFrameSize; 56c5b0abf900474b204c367093984ff60da4fba09cGloria Wang sp<DataSource> mDataSource; 57c5b0abf900474b204c367093984ff60da4fba09cGloria Wang sp<MetaData> mMeta; 58c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 59c5b0abf900474b204c367093984ff60da4fba09cGloria Wang off64_t mOffset; 60c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t mCurrentTimeUs; 61c5b0abf900474b204c367093984ff60da4fba09cGloria Wang bool mStarted; 62c5b0abf900474b204c367093984ff60da4fba09cGloria Wang MediaBufferGroup *mGroup; 63c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 64c5b0abf900474b204c367093984ff60da4fba09cGloria Wang Vector<uint64_t> mOffsetVector; 65c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t mFrameDurationUs; 66c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 67c5b0abf900474b204c367093984ff60da4fba09cGloria Wang AACSource(const AACSource &); 68c5b0abf900474b204c367093984ff60da4fba09cGloria Wang AACSource &operator=(const AACSource &); 69c5b0abf900474b204c367093984ff60da4fba09cGloria Wang}; 70c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 71c5b0abf900474b204c367093984ff60da4fba09cGloria Wang//////////////////////////////////////////////////////////////////////////////// 72c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 73c5b0abf900474b204c367093984ff60da4fba09cGloria Wang// Returns the sample rate based on the sampling frequency index 74c5b0abf900474b204c367093984ff60da4fba09cGloria Wanguint32_t get_sample_rate(const uint8_t sf_index) 75c5b0abf900474b204c367093984ff60da4fba09cGloria Wang{ 76c5b0abf900474b204c367093984ff60da4fba09cGloria Wang static const uint32_t sample_rates[] = 77c5b0abf900474b204c367093984ff60da4fba09cGloria Wang { 78c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 96000, 88200, 64000, 48000, 44100, 32000, 79c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 24000, 22050, 16000, 12000, 11025, 8000 80c5b0abf900474b204c367093984ff60da4fba09cGloria Wang }; 81c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 82c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) { 83c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return sample_rates[sf_index]; 84c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 85c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 86c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return 0; 87c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 88c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 8959fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi// Returns the frame length in bytes as described in an ADTS header starting at the given offset, 9059fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi// or 0 if the size can't be read due to an error in the header or a read failure. 9159fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi// The returned value is the AAC frame size with the ADTS header length (regardless of 9259fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi// the presence of the CRC). 9359fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi// If headerSize is non-NULL, it will be used to return the size of the header of this ADTS frame. 9459fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivistatic size_t getAdtsFrameLength(const sp<DataSource> &source, off64_t offset, size_t* headerSize) { 9559fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi 9659fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi const size_t kAdtsHeaderLengthNoCrc = 7; 9759fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi const size_t kAdtsHeaderLengthWithCrc = 9; 9859fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi 99c5b0abf900474b204c367093984ff60da4fba09cGloria Wang size_t frameSize = 0; 100c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 101c5b0abf900474b204c367093984ff60da4fba09cGloria Wang uint8_t syncword[2]; 1023c10b01551057a21b502014ff984fdf8e1c90a43Gloria Wang if (source->readAt(offset, &syncword, 2) != 2) { 103c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return 0; 104c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 105c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if ((syncword[0] != 0xff) || ((syncword[1] & 0xf6) != 0xf0)) { 106c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return 0; 107c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 108c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 109c5b0abf900474b204c367093984ff60da4fba09cGloria Wang uint8_t protectionAbsent; 110c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (source->readAt(offset + 1, &protectionAbsent, 1) < 1) { 111c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return 0; 112c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 113c5b0abf900474b204c367093984ff60da4fba09cGloria Wang protectionAbsent &= 0x1; 114c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 115c5b0abf900474b204c367093984ff60da4fba09cGloria Wang uint8_t header[3]; 116c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (source->readAt(offset + 3, &header, 3) < 3) { 117c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return 0; 118c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 119c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 120c5b0abf900474b204c367093984ff60da4fba09cGloria Wang frameSize = (header[0] & 0x3) << 11 | header[1] << 3 | header[2] >> 5; 12159fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi 12259fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi // protectionAbsent is 0 if there is CRC 12359fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi size_t headSize = protectionAbsent ? kAdtsHeaderLengthNoCrc : kAdtsHeaderLengthWithCrc; 12459fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi if (headSize > frameSize) { 12559fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi return 0; 12659fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi } 12759fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi if (headerSize != NULL) { 12859fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi *headerSize = headSize; 12959fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi } 130c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 131c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return frameSize; 132c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 133c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 134c5b0abf900474b204c367093984ff60da4fba09cGloria WangAACExtractor::AACExtractor(const sp<DataSource> &source) 135c5b0abf900474b204c367093984ff60da4fba09cGloria Wang : mDataSource(source), 136c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mInitCheck(NO_INIT), 137c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mFrameDurationUs(0) { 138c5b0abf900474b204c367093984ff60da4fba09cGloria Wang String8 mimeType; 139c5b0abf900474b204c367093984ff60da4fba09cGloria Wang float confidence; 140c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (!SniffAAC(mDataSource, &mimeType, &confidence, NULL)) { 141c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return; 142c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 143c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 144c5b0abf900474b204c367093984ff60da4fba09cGloria Wang uint8_t profile, sf_index, channel, header[2]; 145c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mDataSource->readAt(2, &header, 2) < 2) { 146c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return; 147c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 148c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 149c5b0abf900474b204c367093984ff60da4fba09cGloria Wang profile = (header[0] >> 6) & 0x3; 150c5b0abf900474b204c367093984ff60da4fba09cGloria Wang sf_index = (header[0] >> 2) & 0xf; 151c5b0abf900474b204c367093984ff60da4fba09cGloria Wang uint32_t sr = get_sample_rate(sf_index); 152c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (sr == 0) { 153c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return; 154c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 155c5b0abf900474b204c367093984ff60da4fba09cGloria Wang channel = (header[0] & 0x1) << 2 | (header[1] >> 6); 156c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 157c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mMeta = MakeAACCodecSpecificData(profile, sf_index, channel); 158c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 159c5b0abf900474b204c367093984ff60da4fba09cGloria Wang off64_t offset = 0; 160c5b0abf900474b204c367093984ff60da4fba09cGloria Wang off64_t streamSize, numFrames = 0; 161c5b0abf900474b204c367093984ff60da4fba09cGloria Wang size_t frameSize = 0; 162c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t duration = 0; 163c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 164c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mDataSource->getSize(&streamSize) == OK) { 165c5b0abf900474b204c367093984ff60da4fba09cGloria Wang while (offset < streamSize) { 16659fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi if ((frameSize = getAdtsFrameLength(source, offset, NULL)) == 0) { 167c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return; 168c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 169c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 170c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mOffsetVector.push(offset); 171c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 172c5b0abf900474b204c367093984ff60da4fba09cGloria Wang offset += frameSize; 173c5b0abf900474b204c367093984ff60da4fba09cGloria Wang numFrames ++; 174c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 175c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 176c5b0abf900474b204c367093984ff60da4fba09cGloria Wang // Round up and get the duration 177c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mFrameDurationUs = (1024 * 1000000ll + (sr - 1)) / sr; 178c5b0abf900474b204c367093984ff60da4fba09cGloria Wang duration = numFrames * mFrameDurationUs; 179c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mMeta->setInt64(kKeyDuration, duration); 180c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 181c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 182c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mInitCheck = OK; 183c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 184c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 185c5b0abf900474b204c367093984ff60da4fba09cGloria WangAACExtractor::~AACExtractor() { 186c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 187c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 188c5b0abf900474b204c367093984ff60da4fba09cGloria Wangsp<MetaData> AACExtractor::getMetaData() { 189c5b0abf900474b204c367093984ff60da4fba09cGloria Wang sp<MetaData> meta = new MetaData; 190c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 191c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mInitCheck != OK) { 192c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return meta; 193c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 194c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 195c5b0abf900474b204c367093984ff60da4fba09cGloria Wang meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC_ADTS); 196c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 197c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return meta; 198c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 199c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 200c5b0abf900474b204c367093984ff60da4fba09cGloria Wangsize_t AACExtractor::countTracks() { 201c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return mInitCheck == OK ? 1 : 0; 202c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 203c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 204c5b0abf900474b204c367093984ff60da4fba09cGloria Wangsp<MediaSource> AACExtractor::getTrack(size_t index) { 205c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mInitCheck != OK || index != 0) { 206c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return NULL; 207c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 208c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 209c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return new AACSource(mDataSource, mMeta, mOffsetVector, mFrameDurationUs); 210c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 211c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 212c5b0abf900474b204c367093984ff60da4fba09cGloria Wangsp<MetaData> AACExtractor::getTrackMetaData(size_t index, uint32_t flags) { 213c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mInitCheck != OK || index != 0) { 214c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return NULL; 215c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 216c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 217c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return mMeta; 218c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 219c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 220c5b0abf900474b204c367093984ff60da4fba09cGloria Wang//////////////////////////////////////////////////////////////////////////////// 221c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 222c5b0abf900474b204c367093984ff60da4fba09cGloria Wang// 8192 = 2^13, 13bit AAC frame size (in bytes) 223c5b0abf900474b204c367093984ff60da4fba09cGloria Wangconst size_t AACSource::kMaxFrameSize = 8192; 224c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 225c5b0abf900474b204c367093984ff60da4fba09cGloria WangAACSource::AACSource( 226c5b0abf900474b204c367093984ff60da4fba09cGloria Wang const sp<DataSource> &source, const sp<MetaData> &meta, 227c5b0abf900474b204c367093984ff60da4fba09cGloria Wang const Vector<uint64_t> &offset_vector, 228c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t frame_duration_us) 229c5b0abf900474b204c367093984ff60da4fba09cGloria Wang : mDataSource(source), 230c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mMeta(meta), 231c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mOffset(0), 232c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mCurrentTimeUs(0), 233c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mStarted(false), 234c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mGroup(NULL), 235c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mOffsetVector(offset_vector), 236c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mFrameDurationUs(frame_duration_us) { 237c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 238c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 239c5b0abf900474b204c367093984ff60da4fba09cGloria WangAACSource::~AACSource() { 240c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mStarted) { 241c5b0abf900474b204c367093984ff60da4fba09cGloria Wang stop(); 242c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 243c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 244c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 245c5b0abf900474b204c367093984ff60da4fba09cGloria Wangstatus_t AACSource::start(MetaData *params) { 246c5b0abf900474b204c367093984ff60da4fba09cGloria Wang CHECK(!mStarted); 247c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 248c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mOffset = 0; 249c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mCurrentTimeUs = 0; 250c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mGroup = new MediaBufferGroup; 251c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mGroup->add_buffer(new MediaBuffer(kMaxFrameSize)); 252c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mStarted = true; 253c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 254c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return OK; 255c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 256c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 257c5b0abf900474b204c367093984ff60da4fba09cGloria Wangstatus_t AACSource::stop() { 258c5b0abf900474b204c367093984ff60da4fba09cGloria Wang CHECK(mStarted); 259c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 260c5b0abf900474b204c367093984ff60da4fba09cGloria Wang delete mGroup; 261c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mGroup = NULL; 262c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 263c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mStarted = false; 264c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return OK; 265c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 266c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 267c5b0abf900474b204c367093984ff60da4fba09cGloria Wangsp<MetaData> AACSource::getFormat() { 268c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return mMeta; 269c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 270c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 271c5b0abf900474b204c367093984ff60da4fba09cGloria Wangstatus_t AACSource::read( 272c5b0abf900474b204c367093984ff60da4fba09cGloria Wang MediaBuffer **out, const ReadOptions *options) { 273c5b0abf900474b204c367093984ff60da4fba09cGloria Wang *out = NULL; 274c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 275c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t seekTimeUs; 276c5b0abf900474b204c367093984ff60da4fba09cGloria Wang ReadOptions::SeekMode mode; 277c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (options && options->getSeekTo(&seekTimeUs, &mode)) { 278c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (mFrameDurationUs > 0) { 279c5b0abf900474b204c367093984ff60da4fba09cGloria Wang int64_t seekFrame = seekTimeUs / mFrameDurationUs; 280c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mCurrentTimeUs = seekFrame * mFrameDurationUs; 281c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 282c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mOffset = mOffsetVector.itemAt(seekFrame); 283c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 284c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 285c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 28659fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi size_t frameSize, frameSizeWithoutHeader, headerSize; 28759fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi if ((frameSize = getAdtsFrameLength(mDataSource, mOffset, &headerSize)) == 0) { 288c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return ERROR_END_OF_STREAM; 289c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 290c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 291c5b0abf900474b204c367093984ff60da4fba09cGloria Wang MediaBuffer *buffer; 292c5b0abf900474b204c367093984ff60da4fba09cGloria Wang status_t err = mGroup->acquire_buffer(&buffer); 293c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (err != OK) { 294c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return err; 295c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 296c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 29759fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi frameSizeWithoutHeader = frameSize - headerSize; 29859fe406b3a475648828d4e44ca47427fa4829677Jean-Michel Trivi if (mDataSource->readAt(mOffset + headerSize, buffer->data(), 299c5b0abf900474b204c367093984ff60da4fba09cGloria Wang frameSizeWithoutHeader) != (ssize_t)frameSizeWithoutHeader) { 300c5b0abf900474b204c367093984ff60da4fba09cGloria Wang buffer->release(); 301c5b0abf900474b204c367093984ff60da4fba09cGloria Wang buffer = NULL; 302c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 303c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return ERROR_IO; 304c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 305c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 306c5b0abf900474b204c367093984ff60da4fba09cGloria Wang buffer->set_range(0, frameSizeWithoutHeader); 307c5b0abf900474b204c367093984ff60da4fba09cGloria Wang buffer->meta_data()->setInt64(kKeyTime, mCurrentTimeUs); 308c5b0abf900474b204c367093984ff60da4fba09cGloria Wang buffer->meta_data()->setInt32(kKeyIsSyncFrame, 1); 309c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 310c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mOffset += frameSize; 311c5b0abf900474b204c367093984ff60da4fba09cGloria Wang mCurrentTimeUs += mFrameDurationUs; 312c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 313c5b0abf900474b204c367093984ff60da4fba09cGloria Wang *out = buffer; 314c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return OK; 315c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 316c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 317c5b0abf900474b204c367093984ff60da4fba09cGloria Wang//////////////////////////////////////////////////////////////////////////////// 318c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 319c5b0abf900474b204c367093984ff60da4fba09cGloria Wangbool SniffAAC( 320c5b0abf900474b204c367093984ff60da4fba09cGloria Wang const sp<DataSource> &source, String8 *mimeType, float *confidence, 321c5b0abf900474b204c367093984ff60da4fba09cGloria Wang sp<AMessage> *) { 322c5b0abf900474b204c367093984ff60da4fba09cGloria Wang uint8_t header[2]; 323c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 324c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if (source->readAt(0, &header, 2) != 2) { 325c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return false; 326c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 327c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 328c5b0abf900474b204c367093984ff60da4fba09cGloria Wang // ADTS syncword 329c5b0abf900474b204c367093984ff60da4fba09cGloria Wang if ((header[0] == 0xff) && ((header[1] & 0xf6) == 0xf0)) { 330c5b0abf900474b204c367093984ff60da4fba09cGloria Wang *mimeType = MEDIA_MIMETYPE_AUDIO_AAC_ADTS; 331c5b0abf900474b204c367093984ff60da4fba09cGloria Wang *confidence = 0.2; 332c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return true; 333c5b0abf900474b204c367093984ff60da4fba09cGloria Wang } 334c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 335c5b0abf900474b204c367093984ff60da4fba09cGloria Wang return false; 336c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} 337c5b0abf900474b204c367093984ff60da4fba09cGloria Wang 338c5b0abf900474b204c367093984ff60da4fba09cGloria Wang} // namespace android 339