1f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber/* 2f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * Copyright (C) 2011 The Android Open Source Project 3f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * 4f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * you may not use this file except in compliance with the License. 6f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * You may obtain a copy of the License at 7f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * 8f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * 10f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * See the License for the specific language governing permissions and 14f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * limitations under the License. 15f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber */ 16f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 17f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#ifndef AVI_EXTRACTOR_H_ 18f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 19f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#define AVI_EXTRACTOR_H_ 20f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 21f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#include <media/stagefright/foundation/ABase.h> 22f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#include <media/stagefright/MediaExtractor.h> 23f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#include <media/stagefright/MediaSource.h> 24f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#include <utils/Vector.h> 25f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 26f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Hubernamespace android { 27f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 28f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huberstruct AVIExtractor : public MediaExtractor { 29f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber AVIExtractor(const sp<DataSource> &dataSource); 30f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 31f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber virtual size_t countTracks(); 32f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 33f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber virtual sp<MediaSource> getTrack(size_t index); 34f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 35f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber virtual sp<MetaData> getTrackMetaData( 36f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t index, uint32_t flags); 37f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 38f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber virtual sp<MetaData> getMetaData(); 39a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen virtual const char * name() { return "AVIExtractor"; } 40f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 41f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huberprotected: 42f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber virtual ~AVIExtractor(); 43f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 44f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huberprivate: 45f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber struct AVISource; 4632e1832dfac3a6bbcc5c0973ccd0e22de4d1a1acAndreas Huber struct MP3Splitter; 47f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 48f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber struct SampleInfo { 49f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber uint32_t mOffset; 50f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber bool mIsKey; 51f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber }; 52f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 53f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber struct Track { 54f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber sp<MetaData> mMeta; 55f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber Vector<SampleInfo> mSamples; 56f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber uint32_t mRate; 57f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber uint32_t mScale; 58f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 597de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber // If bytes per sample == 0, each chunk represents a single sample, 607de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber // otherwise each chunk should me a multiple of bytes-per-sample in 617de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber // size. 627de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber uint32_t mBytesPerSample; 637de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber 64f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber enum Kind { 65f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber AUDIO, 66f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber VIDEO, 67f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber OTHER 68f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 69f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber } mKind; 70f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 71f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t mNumSyncSamples; 72f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t mThumbnailSampleSize; 73f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber ssize_t mThumbnailSampleIndex; 74f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t mMaxSampleSize; 7532e1832dfac3a6bbcc5c0973ccd0e22de4d1a1acAndreas Huber 7632e1832dfac3a6bbcc5c0973ccd0e22de4d1a1acAndreas Huber // If mBytesPerSample > 0: 7732e1832dfac3a6bbcc5c0973ccd0e22de4d1a1acAndreas Huber double mAvgChunkSize; 7832e1832dfac3a6bbcc5c0973ccd0e22de4d1a1acAndreas Huber size_t mFirstChunkSize; 79f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber }; 80f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 81f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber sp<DataSource> mDataSource; 82f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t mInitCheck; 83f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber Vector<Track> mTracks; 84f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 85f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber off64_t mMovieOffset; 86f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber bool mFoundIndex; 87f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber bool mOffsetsAreAbsolute; 88f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 89f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber ssize_t parseChunk(off64_t offset, off64_t size, int depth = 0); 90f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t parseStreamHeader(off64_t offset, size_t size); 91f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t parseStreamFormat(off64_t offset, size_t size); 92f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t parseIndex(off64_t offset, size_t size); 93f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 94f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t parseHeaders(); 95f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 96f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t getSampleInfo( 97f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t trackIndex, size_t sampleIndex, 987de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber off64_t *offset, size_t *size, bool *isKey, 997de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber int64_t *sampleTimeUs); 1007de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber 1017de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber status_t getSampleTime( 1027de73f4eb68f3aa478e19ba05a13bc84296f9894Andreas Huber size_t trackIndex, size_t sampleIndex, int64_t *sampleTimeUs); 103f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 104f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t getSampleIndexAtTime( 105f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t trackIndex, 106f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber int64_t timeUs, MediaSource::ReadOptions::SeekMode mode, 107f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber size_t *sampleIndex) const; 108f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 109f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber status_t addMPEG4CodecSpecificData(size_t trackIndex); 110c639aad6d8894f57c02e620f52ccf49e51b64866Andreas Huber status_t addH264CodecSpecificData(size_t trackIndex); 111f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 112f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber static bool IsCorrectChunkType( 113f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber ssize_t trackIndex, Track::Kind kind, uint32_t chunkType); 114f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 115f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(AVIExtractor); 116f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber}; 117f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 118f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huberclass String8; 119f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huberstruct AMessage; 120f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 121f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huberbool SniffAVI( 122f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber const sp<DataSource> &source, String8 *mimeType, float *confidence, 123f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber sp<AMessage> *); 124f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 125f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber} // namespace android 126f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber 127f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber#endif // AVI_EXTRACTOR_H_ 128