153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia/*
253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Copyright 2017 The Android Open Source Project
353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *
453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Licensed under the Apache License, Version 2.0 (the "License");
553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * you may not use this file except in compliance with the License.
653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * You may obtain a copy of the License at
753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *
853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *      http://www.apache.org/licenses/LICENSE-2.0
953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *
1053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Unless required by applicable law or agreed to in writing, software
1153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * distributed under the License is distributed on an "AS IS" BASIS,
1253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * See the License for the specific language governing permissions and
1453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * limitations under the License.
1553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */
1653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
1753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#ifndef NUPLAYER2_DECODER_BASE_H_
1853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
1953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define NUPLAYER2_DECODER_BASE_H_
2053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "NuPlayer2.h"
2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/foundation/AHandler.h>
2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android {
2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct ABuffer;
2828288fb0b1da843cdd37edab0cdecff32abacdceWei Jiastruct ANativeWindowWrapper;
2953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct MediaCodec;
3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass MediaBuffer;
3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass MediaCodecBuffer;
3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
3353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct NuPlayer2::DecoderBase : public AHandler {
3453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    explicit DecoderBase(const sp<AMessage> &notify);
3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void configure(const sp<AMessage> &format);
3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void init();
3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void setParameters(const sp<AMessage> &params);
3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // Synchronous call to ensure decoder will not request or send out data.
4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void pause();
4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void setRenderer(const sp<Renderer> &renderer);
4428288fb0b1da843cdd37edab0cdecff32abacdceWei Jia    virtual status_t setVideoSurface(const sp<ANativeWindowWrapper> &) { return INVALID_OPERATION; }
4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void signalFlush();
4753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void signalResume(bool notifyComplete);
4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void initiateShutdown();
4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual sp<AMessage> getStats() const {
5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        return mStats;
5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t releaseCrypto() {
5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        return INVALID_OPERATION;
5653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    enum {
5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatInputDiscontinuity  = 'inDi',
6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatVideoSizeChanged    = 'viSC',
6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatFlushCompleted      = 'flsC',
6253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatShutdownCompleted   = 'shDC',
6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatResumeCompleted     = 'resC',
6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatEOS                 = 'eos ',
6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatError               = 'err ',
6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    };
6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaprotected:
6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual ~DecoderBase();
7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void stopLooper();
7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onMessageReceived(const sp<AMessage> &msg);
7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onConfigure(const sp<AMessage> &format) = 0;
7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onSetParameters(const sp<AMessage> &params) = 0;
7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onSetRenderer(const sp<Renderer> &renderer) = 0;
7953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onResume(bool notifyComplete) = 0;
8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onFlush() = 0;
8153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onShutdown(bool notifyComplete) = 0;
8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void onRequestInputBuffers();
8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual bool doRequestBuffers() = 0;
8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void handleError(int32_t err);
8653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<AMessage> mNotify;
8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mBufferGeneration;
8953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mPaused;
9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<AMessage> mStats;
9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaprivate:
9353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    enum {
9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatConfigure           = 'conf',
9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSetParameters       = 'setP',
9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSetRenderer         = 'setR',
9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatPause               = 'paus',
9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatRequestInputBuffers = 'reqB',
9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatFlush               = 'flus',
10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatShutdown            = 'shuD',
10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    };
10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<ALooper> mDecoderLooper;
10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mRequestInputBuffersPending;
10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    DISALLOW_EVIL_CONSTRUCTORS(DecoderBase);
10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia};
10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}  // namespace android
11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
11153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#endif  // NUPLAYER2_DECODER_BASE_H_
112