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