1bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia/*
2bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * Copyright (C) 2014 The Android Open Source Project
3bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia *
4bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * Licensed under the Apache License, Version 2.0 (the "License");
5bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * you may not use this file except in compliance with the License.
6bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * You may obtain a copy of the License at
7bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia *
8bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia *      http://www.apache.org/licenses/LICENSE-2.0
9bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia *
10bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * Unless required by applicable law or agreed to in writing, software
11bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * distributed under the License is distributed on an "AS IS" BASIS,
12bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * See the License for the specific language governing permissions and
14bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * limitations under the License.
15bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia */
16bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
17bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#ifndef NUPLAYER_DECODER_PASS_THROUGH_H_
18bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
19bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#define NUPLAYER_DECODER_PASS_THROUGH_H_
20bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
21bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include "NuPlayer.h"
22bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
237137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include "NuPlayerDecoderBase.h"
24bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
25bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jianamespace android {
26bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
277137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstruct NuPlayer::DecoderPassThrough : public DecoderBase {
28c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    DecoderPassThrough(const sp<AMessage> &notify,
29c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia                       const sp<Source> &source,
30c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia                       const sp<Renderer> &renderer);
31bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
32bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiaprotected:
33bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
34bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    virtual ~DecoderPassThrough();
35bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
36bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    virtual void onMessageReceived(const sp<AMessage> &msg);
37bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
387137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onConfigure(const sp<AMessage> &format);
398db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu    virtual void onSetParameters(const sp<AMessage> &params);
407137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onSetRenderer(const sp<Renderer> &renderer);
417137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onGetInputBuffers(Vector<sp<ABuffer> > *dstBuffers);
42f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang    virtual void onResume(bool notifyComplete);
4366704af4d82c2b6303609b29402641f861fdcb19Chong Zhang    virtual void onFlush();
447137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onShutdown(bool notifyComplete);
453b032b3865fd93173aadca0591eeea32853206f9Chong Zhang    virtual bool doRequestBuffers();
467137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
47bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiaprivate:
48bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    enum {
49bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        kWhatBufferConsumed     = 'bufC',
50bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    };
51bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
52c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    sp<Source> mSource;
53c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    sp<Renderer> mRenderer;
54c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    int64_t mSkipRenderingUntilMediaTimeUs;
55f1828910d48bbd22e1392e6ab0ce31298d1f115cRonghua Wu    bool mPaused;
56c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia
57c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk    bool    mReachedEOS;
587137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
597137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    // Used by feedDecoderInputData to aggregate small buffers into
607137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    // one large buffer.
617137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<ABuffer> mPendingAudioAccessUnit;
627137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    status_t    mPendingAudioErr;
637137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<ABuffer> mAggregateBuffer;
647137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
657137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    // mPendingBuffersToDrain are only for debugging. It can be removed
667137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    // when the power investigation is done.
67c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk    size_t  mPendingBuffersToDrain;
68c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk    size_t  mCachedBytes;
69bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    AString mComponentName;
70bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
717137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool isStaleReply(const sp<AMessage> &msg);
72f1828910d48bbd22e1392e6ab0ce31298d1f115cRonghua Wu    bool isDoneFetching() const;
737137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
747137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    status_t dequeueAccessUnit(sp<ABuffer> *accessUnit);
757137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<ABuffer> aggregateBuffer(const sp<ABuffer> &accessUnit);
767137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    status_t fetchInputData(sp<AMessage> &reply);
7766704af4d82c2b6303609b29402641f861fdcb19Chong Zhang    void doFlush(bool notifyComplete);
787137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
797137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void onInputBufferFetched(const sp<AMessage> &msg);
807137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void onBufferConsumed(int32_t size);
817137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
82bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    DISALLOW_EVIL_CONSTRUCTORS(DecoderPassThrough);
83bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia};
84bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
85bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}  // namespace android
86bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
87bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#endif  // NUPLAYER_DECODER_PASS_THROUGH_H_
88