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
21093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include <media/stagefright/MediaExtractor.h>
22093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include <utils/Vector.h>
23d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber#include <utils/threads.h>
24093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
25093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Hubernamespace mkvparser {
26093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct Segment;
27093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber};
28093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
29093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Hubernamespace android {
30093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
315a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberstruct AMessage;
32093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberclass String8;
33093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
34093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct DataSourceReader;
35093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct MatroskaSource;
36093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
37093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberstruct MatroskaExtractor : public MediaExtractor {
38093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    MatroskaExtractor(const sp<DataSource> &source);
39093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
40093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual size_t countTracks();
41093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
42093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual sp<MediaSource> getTrack(size_t index);
43093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
44093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual sp<MetaData> getTrackMetaData(
45093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber            size_t index, uint32_t flags);
46093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
47093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual sp<MetaData> getMetaData();
48093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
49d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    virtual uint32_t flags() const;
50d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber
51093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberprotected:
52093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    virtual ~MatroskaExtractor();
53093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
54093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberprivate:
55093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    friend struct MatroskaSource;
56d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    friend struct BlockIterator;
57093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
58093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    struct TrackInfo {
59093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber        unsigned long mTrackNum;
60093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber        sp<MetaData> mMeta;
61093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    };
62d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber
63d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    Mutex mLock;
64093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    Vector<TrackInfo> mTracks;
65093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
66093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    sp<DataSource> mDataSource;
67093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    DataSourceReader *mReader;
68093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    mkvparser::Segment *mSegment;
695279d1d8c19e5fdbb177805db0da8e8aadac3079Andreas Huber    bool mExtractedThumbnails;
70d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    bool mIsLiveStreaming;
718c32b164d00d3e4d73764d06956331f09693ef43Andreas Huber    bool mIsWebm;
72093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
73093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    void addTracks();
745279d1d8c19e5fdbb177805db0da8e8aadac3079Andreas Huber    void findThumbnails();
75093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
76d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber    bool isLiveStreaming() const;
77d42573cace9db2b5948e540c32beaef80f04153cAndreas Huber
78093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    MatroskaExtractor(const MatroskaExtractor &);
79093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber    MatroskaExtractor &operator=(const MatroskaExtractor &);
80093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber};
81093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
82093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huberbool SniffMatroska(
835a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
845a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        sp<AMessage> *);
85093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
86093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber}  // namespace android
87093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
88093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#endif  // MATROSKA_EXTRACTOR_H_
89