1093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber/*
2093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * Copyright (C) 2010 The Android Open Source Project
3093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber *
4093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * you may not use this file except in compliance with the License.
6093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * You may obtain a copy of the License at
7093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber *
8093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber *
10093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * Unless required by applicable law or agreed to in writing, software
11093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * See the License for the specific language governing permissions and
14093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber * limitations under the License.
15093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber */
16093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
17093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#ifndef MATROSKA_EXTRACTOR_H_
18093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
19093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#define MATROSKA_EXTRACTOR_H_
20093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
212f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih#include "mkvparser.hpp"
222f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih
23093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include <media/stagefright/MediaExtractor.h>
24093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include <utils/Vector.h>
25d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber#include <utils/threads.h>
26093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
27093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Hubernamespace android {
28093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
295a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberstruct AMessage;
30093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberclass String8;
31093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
32093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct DataSourceReader;
33093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct MatroskaSource;
34093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
35093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct MatroskaExtractor : public MediaExtractor {
36093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    MatroskaExtractor(const sp<DataSource> &source);
37093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
38093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual size_t countTracks();
39093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
40093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual sp<MediaSource> getTrack(size_t index);
41093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
42093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual sp<MetaData> getTrackMetaData(
43093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber            size_t index, uint32_t flags);
44093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
45093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual sp<MetaData> getMetaData();
46093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
47d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    virtual uint32_t flags() const;
48d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber
49093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberprotected:
50093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual ~MatroskaExtractor();
51093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
52093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberprivate:
53093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    friend struct MatroskaSource;
54d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    friend struct BlockIterator;
55093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
56093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    struct TrackInfo {
57093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber        unsigned long mTrackNum;
58093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber        sp<MetaData> mMeta;
592f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih        const MatroskaExtractor *mExtractor;
602f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih        Vector<const mkvparser::CuePoint*> mCuePoints;
612f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih
622f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih        const mkvparser::Track* getTrack() const;
632f46e8152fb881d3a1d7afd223f1ed51f6e358b8Robert Shih        const mkvparser::CuePoint::TrackPosition *find(long long timeNs) const;
64093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    };
65d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber
66d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    Mutex mLock;
67093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    Vector<TrackInfo> mTracks;
68093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
69093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    sp<DataSource> mDataSource;
70093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    DataSourceReader *mReader;
71093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    mkvparser::Segment *mSegment;
725279d1d8c19e5fdbb177805db0da8e8aadac3079Andreas Huber    bool mExtractedThumbnails;
73d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    bool mIsLiveStreaming;
748c32b164d00d3e4d73764d06956331f09693ef43Andreas Huber    bool mIsWebm;
75bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    int64_t mSeekPreRollNs;
76093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
77093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    void addTracks();
785279d1d8c19e5fdbb177805db0da8e8aadac3079Andreas Huber    void findThumbnails();
79093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
80d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    bool isLiveStreaming() const;
81d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber
82093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    MatroskaExtractor(const MatroskaExtractor &);
83093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    MatroskaExtractor &operator=(const MatroskaExtractor &);
84093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber};
85093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
86093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberbool SniffMatroska(
875a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
885a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        sp<AMessage> *);
89093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
90093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber}  // namespace android
91093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
92093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#endif  // MATROSKA_EXTRACTOR_H_
93