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