1072f5247ef893e683728263a540bb93daafda376Andreas Huber/*
2072f5247ef893e683728263a540bb93daafda376Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3072f5247ef893e683728263a540bb93daafda376Andreas Huber *
4072f5247ef893e683728263a540bb93daafda376Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5072f5247ef893e683728263a540bb93daafda376Andreas Huber * you may not use this file except in compliance with the License.
6072f5247ef893e683728263a540bb93daafda376Andreas Huber * You may obtain a copy of the License at
7072f5247ef893e683728263a540bb93daafda376Andreas Huber *
8072f5247ef893e683728263a540bb93daafda376Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9072f5247ef893e683728263a540bb93daafda376Andreas Huber *
10072f5247ef893e683728263a540bb93daafda376Andreas Huber * Unless required by applicable law or agreed to in writing, software
11072f5247ef893e683728263a540bb93daafda376Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12072f5247ef893e683728263a540bb93daafda376Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13072f5247ef893e683728263a540bb93daafda376Andreas Huber * See the License for the specific language governing permissions and
14072f5247ef893e683728263a540bb93daafda376Andreas Huber * limitations under the License.
15072f5247ef893e683728263a540bb93daafda376Andreas Huber */
16072f5247ef893e683728263a540bb93daafda376Andreas Huber
17072f5247ef893e683728263a540bb93daafda376Andreas Huber#ifndef MATROSKA_EXTRACTOR_H_
18072f5247ef893e683728263a540bb93daafda376Andreas Huber
19072f5247ef893e683728263a540bb93daafda376Andreas Huber#define MATROSKA_EXTRACTOR_H_
20072f5247ef893e683728263a540bb93daafda376Andreas Huber
21072f5247ef893e683728263a540bb93daafda376Andreas Huber#include <media/stagefright/MediaExtractor.h>
22072f5247ef893e683728263a540bb93daafda376Andreas Huber#include <utils/Vector.h>
238885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber#include <utils/threads.h>
24072f5247ef893e683728263a540bb93daafda376Andreas Huber
25072f5247ef893e683728263a540bb93daafda376Andreas Hubernamespace mkvparser {
26072f5247ef893e683728263a540bb93daafda376Andreas Huberstruct Segment;
27072f5247ef893e683728263a540bb93daafda376Andreas Huber};
28072f5247ef893e683728263a540bb93daafda376Andreas Huber
29072f5247ef893e683728263a540bb93daafda376Andreas Hubernamespace android {
30072f5247ef893e683728263a540bb93daafda376Andreas Huber
31efdd088a71ddd0a96cf9ca2f58e8703fe8c5c494Andreas Huberstruct AMessage;
32072f5247ef893e683728263a540bb93daafda376Andreas Huberclass String8;
33072f5247ef893e683728263a540bb93daafda376Andreas Huber
34072f5247ef893e683728263a540bb93daafda376Andreas Huberstruct DataSourceReader;
35072f5247ef893e683728263a540bb93daafda376Andreas Huberstruct MatroskaSource;
36072f5247ef893e683728263a540bb93daafda376Andreas Huber
37072f5247ef893e683728263a540bb93daafda376Andreas Huberstruct MatroskaExtractor : public MediaExtractor {
38072f5247ef893e683728263a540bb93daafda376Andreas Huber    MatroskaExtractor(const sp<DataSource> &source);
39072f5247ef893e683728263a540bb93daafda376Andreas Huber
40072f5247ef893e683728263a540bb93daafda376Andreas Huber    virtual size_t countTracks();
41072f5247ef893e683728263a540bb93daafda376Andreas Huber
42072f5247ef893e683728263a540bb93daafda376Andreas Huber    virtual sp<MediaSource> getTrack(size_t index);
43072f5247ef893e683728263a540bb93daafda376Andreas Huber
44072f5247ef893e683728263a540bb93daafda376Andreas Huber    virtual sp<MetaData> getTrackMetaData(
45072f5247ef893e683728263a540bb93daafda376Andreas Huber            size_t index, uint32_t flags);
46072f5247ef893e683728263a540bb93daafda376Andreas Huber
47072f5247ef893e683728263a540bb93daafda376Andreas Huber    virtual sp<MetaData> getMetaData();
48072f5247ef893e683728263a540bb93daafda376Andreas Huber
498885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber    virtual uint32_t flags() const;
508885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber
51072f5247ef893e683728263a540bb93daafda376Andreas Huberprotected:
52072f5247ef893e683728263a540bb93daafda376Andreas Huber    virtual ~MatroskaExtractor();
53072f5247ef893e683728263a540bb93daafda376Andreas Huber
54072f5247ef893e683728263a540bb93daafda376Andreas Huberprivate:
55072f5247ef893e683728263a540bb93daafda376Andreas Huber    friend struct MatroskaSource;
568885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber    friend struct BlockIterator;
57072f5247ef893e683728263a540bb93daafda376Andreas Huber
58072f5247ef893e683728263a540bb93daafda376Andreas Huber    struct TrackInfo {
59072f5247ef893e683728263a540bb93daafda376Andreas Huber        unsigned long mTrackNum;
60072f5247ef893e683728263a540bb93daafda376Andreas Huber        sp<MetaData> mMeta;
61072f5247ef893e683728263a540bb93daafda376Andreas Huber    };
628885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber
638885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber    Mutex mLock;
64072f5247ef893e683728263a540bb93daafda376Andreas Huber    Vector<TrackInfo> mTracks;
65072f5247ef893e683728263a540bb93daafda376Andreas Huber
66072f5247ef893e683728263a540bb93daafda376Andreas Huber    sp<DataSource> mDataSource;
67072f5247ef893e683728263a540bb93daafda376Andreas Huber    DataSourceReader *mReader;
68072f5247ef893e683728263a540bb93daafda376Andreas Huber    mkvparser::Segment *mSegment;
696bdf2edba4de7f971639e8a50e938d218b6d7299Andreas Huber    bool mExtractedThumbnails;
708885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber    bool mIsLiveStreaming;
716e37cf90f90678a083eef57c62d47831fd208f48Andreas Huber    bool mIsWebm;
72072f5247ef893e683728263a540bb93daafda376Andreas Huber
73072f5247ef893e683728263a540bb93daafda376Andreas Huber    void addTracks();
746bdf2edba4de7f971639e8a50e938d218b6d7299Andreas Huber    void findThumbnails();
75072f5247ef893e683728263a540bb93daafda376Andreas Huber
768885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber    bool isLiveStreaming() const;
778885e679fc65ff856898fccd6fca8a388f42a4e5Andreas Huber
78072f5247ef893e683728263a540bb93daafda376Andreas Huber    MatroskaExtractor(const MatroskaExtractor &);
79072f5247ef893e683728263a540bb93daafda376Andreas Huber    MatroskaExtractor &operator=(const MatroskaExtractor &);
80072f5247ef893e683728263a540bb93daafda376Andreas Huber};
81072f5247ef893e683728263a540bb93daafda376Andreas Huber
82072f5247ef893e683728263a540bb93daafda376Andreas Huberbool SniffMatroska(
83efdd088a71ddd0a96cf9ca2f58e8703fe8c5c494Andreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
84efdd088a71ddd0a96cf9ca2f58e8703fe8c5c494Andreas Huber        sp<AMessage> *);
85072f5247ef893e683728263a540bb93daafda376Andreas Huber
86072f5247ef893e683728263a540bb93daafda376Andreas Huber}  // namespace android
87072f5247ef893e683728263a540bb93daafda376Andreas Huber
88072f5247ef893e683728263a540bb93daafda376Andreas Huber#endif  // MATROSKA_EXTRACTOR_H_
89