1a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber/*
2a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * Copyright (C) 2010 The Android Open Source Project
3a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber *
4a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * you may not use this file except in compliance with the License.
6a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * You may obtain a copy of the License at
7a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber *
8a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber *
10a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * Unless required by applicable law or agreed to in writing, software
11a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * See the License for the specific language governing permissions and
14a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * limitations under the License.
15a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber */
16a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
17a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#ifndef NUPLAYER_RENDERER_H_
18a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
19a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#define NUPLAYER_RENDERER_H_
20a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
21a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#include "NuPlayer.h"
22a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
23a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Hubernamespace android {
24a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
2554e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huberstruct ABuffer;
2654e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber
27a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstruct NuPlayer::Renderer : public AHandler {
28a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    Renderer(const sp<MediaPlayerBase::AudioSink> &sink,
29a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber             const sp<AMessage> &notify);
30a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
31a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void queueBuffer(
32a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber            bool audio,
33a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber            const sp<ABuffer> &buffer,
34a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber            const sp<AMessage> &notifyConsumed);
35a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
36a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void queueEOS(bool audio, status_t finalResult);
37a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
38a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void flush(bool audio);
39a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
40a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void signalTimeDiscontinuity();
41a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
4241c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber    void signalAudioSinkChanged();
4341c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber
44601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber    void pause();
45601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber    void resume();
46601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber
47a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    enum {
48115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatEOS                = 'eos ',
49115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatFlushComplete      = 'fluC',
50115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatPosition           = 'posi',
51a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    };
52a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
53a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprotected:
54a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual ~Renderer();
55a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
56a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
57a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
58a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprivate:
59a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    enum {
60115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatDrainAudioQueue    = 'draA',
61115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatDrainVideoQueue    = 'draV',
62115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatQueueBuffer        = 'queB',
63115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatQueueEOS           = 'qEOS',
64115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatFlush              = 'flus',
65115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatAudioSinkChanged   = 'auSC',
66115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatPause              = 'paus',
67115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber        kWhatResume             = 'resm',
68a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    };
69a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
70a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    struct QueueEntry {
71a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        sp<ABuffer> mBuffer;
72a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        sp<AMessage> mNotifyConsumed;
73a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        size_t mOffset;
74a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        status_t mFinalResult;
75a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    };
76a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
77fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber    static const int64_t kMinPositionUpdateDelayUs;
78fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber
79a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    sp<MediaPlayerBase::AudioSink> mAudioSink;
80a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    sp<AMessage> mNotify;
81a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    List<QueueEntry> mAudioQueue;
82a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    List<QueueEntry> mVideoQueue;
83a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    uint32_t mNumFramesWritten;
84a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
85a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    bool mDrainAudioQueuePending;
86a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    bool mDrainVideoQueuePending;
87a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    int32_t mAudioQueueGeneration;
88a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    int32_t mVideoQueueGeneration;
89a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
90a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    int64_t mAnchorTimeMediaUs;
91a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    int64_t mAnchorTimeRealUs;
92a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
93a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    Mutex mFlushLock;  // protects the following 2 member vars.
94a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    bool mFlushingAudio;
95a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    bool mFlushingVideo;
96a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
9741c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber    bool mHasAudio;
9841c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber    bool mHasVideo;
99a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    bool mSyncQueues;
100a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
101601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber    bool mPaused;
102601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber
103fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber    int64_t mLastPositionUpdateUs;
104950fc9d1159bfc38e2b58a2ccf4465c630573126Andreas Huber    int64_t mVideoLateByUs;
105fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber
106115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber    bool onDrainAudioQueue();
107115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber    void postDrainAudioQueue(int64_t delayUs = 0);
108a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
109a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void onDrainVideoQueue();
110a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void postDrainVideoQueue();
111a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
112a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void onQueueBuffer(const sp<AMessage> &msg);
113a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void onQueueEOS(const sp<AMessage> &msg);
114a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void onFlush(const sp<AMessage> &msg);
11541c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber    void onAudioSinkChanged();
116601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber    void onPause();
117601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber    void onResume();
118a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
119d84fd7927eaf70fb7b9a55dd6c2adccfa66009acAndreas Huber    void notifyEOS(bool audio, status_t finalResult);
120a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void notifyFlushComplete(bool audio);
12108e10cb404c0f1620ca9db7494ccbb8adcca5ee5Andreas Huber    void notifyPosition();
122950fc9d1159bfc38e2b58a2ccf4465c630573126Andreas Huber    void notifyVideoLateBy(int64_t lateByUs);
123a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
124a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void flushQueue(List<QueueEntry> *queue);
125a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg);
126a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void syncQueuesDone();
127a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
128a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Renderer);
129a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber};
130a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
131a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber}  // namespace android
132a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
133a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#endif  // NUPLAYER_RENDERER_H_
134