17137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang/*
27137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Copyright (C) 2010 The Android Open Source Project
37137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *
47137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
57137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * you may not use this file except in compliance with the License.
67137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * You may obtain a copy of the License at
77137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *
87137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
97137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *
107137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Unless required by applicable law or agreed to in writing, software
117137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
127137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * See the License for the specific language governing permissions and
147137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * limitations under the License.
157137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang */
167137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
177137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#ifndef NUPLAYER_DECODER_BASE_H_
187137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
197137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#define NUPLAYER_DECODER_BASE_H_
207137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
217137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include "NuPlayer.h"
227137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
237137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include <media/stagefright/foundation/AHandler.h>
247137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
257137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangnamespace android {
267137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
277137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstruct ABuffer;
287137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstruct MediaCodec;
29ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass MediaBuffer;
307e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer;
31a81c6229638a4db56752dd77a6610e0f0971e877Lajos Molnarclass Surface;
327137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
337137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstruct NuPlayer::DecoderBase : public AHandler {
34e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh    explicit DecoderBase(const sp<AMessage> &notify);
357137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
367137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void configure(const sp<AMessage> &format);
377137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void init();
388db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu    void setParameters(const sp<AMessage> &params);
397137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
403bc667014875aba35102941b3997d242c303aa0dWei Jia    // Synchronous call to ensure decoder will not request or send out data.
413bc667014875aba35102941b3997d242c303aa0dWei Jia    void pause();
423bc667014875aba35102941b3997d242c303aa0dWei Jia
437137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void setRenderer(const sp<Renderer> &renderer);
44a81c6229638a4db56752dd77a6610e0f0971e877Lajos Molnar    virtual status_t setVideoSurface(const sp<Surface> &) { return INVALID_OPERATION; }
457137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
467137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void signalFlush();
47f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang    void signalResume(bool notifyComplete);
487137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void initiateShutdown();
497137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
50e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan    virtual sp<AMessage> getStats() const {
51e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan        return mStats;
52e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan    }
537137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
54cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    virtual status_t releaseCrypto() {
55cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        return INVALID_OPERATION;
56cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    }
57cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
587137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    enum {
597137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatInputDiscontinuity  = 'inDi',
607137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatVideoSizeChanged    = 'viSC',
617137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatFlushCompleted      = 'flsC',
627137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatShutdownCompleted   = 'shDC',
63f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang        kWhatResumeCompleted     = 'resC',
647137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatEOS                 = 'eos ',
657137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatError               = 'err ',
667137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    };
677137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
687137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangprotected:
697137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
707137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual ~DecoderBase();
717137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
7237ff0e6639e90ca49d4f0386a76c09437b459efdWei Jia    void stopLooper();
7337ff0e6639e90ca49d4f0386a76c09437b459efdWei Jia
747137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onMessageReceived(const sp<AMessage> &msg);
757137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
767137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onConfigure(const sp<AMessage> &format) = 0;
778db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu    virtual void onSetParameters(const sp<AMessage> &params) = 0;
787137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onSetRenderer(const sp<Renderer> &renderer) = 0;
79f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang    virtual void onResume(bool notifyComplete) = 0;
8066704af4d82c2b6303609b29402641f861fdcb19Chong Zhang    virtual void onFlush() = 0;
817137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onShutdown(bool notifyComplete) = 0;
827137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
837137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void onRequestInputBuffers();
843b032b3865fd93173aadca0591eeea32853206f9Chong Zhang    virtual bool doRequestBuffers() = 0;
85202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    virtual void handleError(int32_t err);
86202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung
87202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    sp<AMessage> mNotify;
88202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    int32_t mBufferGeneration;
893bc667014875aba35102941b3997d242c303aa0dWei Jia    bool mPaused;
90e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan    sp<AMessage> mStats;
917137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
927137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangprivate:
937137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    enum {
947137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatConfigure           = 'conf',
958db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu        kWhatSetParameters       = 'setP',
967137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatSetRenderer         = 'setR',
973bc667014875aba35102941b3997d242c303aa0dWei Jia        kWhatPause               = 'paus',
987137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatRequestInputBuffers = 'reqB',
997137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatFlush               = 'flus',
1007137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatShutdown            = 'shuD',
1017137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    };
1027137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1037137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<ALooper> mDecoderLooper;
1047137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool mRequestInputBuffersPending;
1057137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1067137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    DISALLOW_EVIL_CONSTRUCTORS(DecoderBase);
1077137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang};
1087137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1097137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}  // namespace android
1107137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1117137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#endif  // NUPLAYER_DECODER_BASE_H_
112