summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/timedtext/TimedTextPlayer.h
blob: a744db59417b3323c8e53bb90af7415b48ee5f9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef TIMEDTEXT_PLAYER_H_

#define TIMEDTEXT_PLAYER_H_

#include <media/MediaPlayerInterface.h>
#include <media/stagefright/foundation/ABase.h>
#include <media/stagefright/foundation/AString.h>

#include "include/TimedEventQueue.h"
#include "TimedTextParser.h"

namespace android {

class MediaSource;
class AwesomePlayer;
class MediaBuffer;

class TimedTextPlayer {
public:
    TimedTextPlayer(AwesomePlayer *observer,
                    const wp<MediaPlayerBase> &listener,
                    TimedEventQueue *queue);

    virtual ~TimedTextPlayer();

    // index: the index of the text track which will
    // be turned on
    status_t start(uint8_t index);

    void pause();

    void resume();

    status_t seekTo(int64_t time_us);

    void addTextSource(sp<MediaSource> source);

    status_t setTimedTextTrackIndex(int32_t index);
    status_t setParameter(int key, const Parcel &request);

private:
    enum TextType {
        kNoText        = 0,
        kInBandText    = 1,
        kOutOfBandText = 2,
    };

    Mutex mLock;

    sp<MediaSource> mSource;
    sp<DataSource> mOutOfBandSource;

    bool mSeeking;
    int64_t mSeekTimeUs;

    bool mStarted;

    sp<TimedEventQueue::Event> mTextEvent;
    bool mTextEventPending;

    TimedEventQueue *mQueue;

    wp<MediaPlayerBase> mListener;
    AwesomePlayer *mObserver;

    MediaBuffer *mTextBuffer;
    Parcel mData;

    // for in-band timed text
    Vector<sp<MediaSource> > mTextTrackVector;

    // for out-of-band timed text
    struct OutOfBandText {
        TimedTextParser::FileType type;
        sp<DataSource> source;
    };
    Vector<OutOfBandText > mTextOutOfBandVector;

    sp<TimedTextParser> mTextParser;
    AString mText;

    TextType mTextType;

    void reset();

    void onTextEvent();
    void postTextEvent(int64_t delayUs = -1);
    void cancelTextEvent();

    void notifyListener(int msg, const Parcel *parcel = NULL);

    status_t extractAndAppendLocalDescriptions(int64_t timeUs);
    status_t extractAndSendGlobalDescriptions();

    DISALLOW_EVIL_CONSTRUCTORS(TimedTextPlayer);
};

}  // namespace android

#endif  // TIMEDTEXT_PLAYER_H_