NuPlayerDecoder.h revision 7137ec7e005a5a6e3c0edb91cfacf16a31f4bf6a
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
27137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Copyright 2014 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#ifndef NUPLAYER_DECODER_H_
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define NUPLAYER_DECODER_H_
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h"
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
227137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include "NuPlayerDecoderBase.h"
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
24f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
267137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstruct NuPlayer::Decoder : public DecoderBase {
271173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Decoder(const sp<AMessage> &notify,
28c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            const sp<Source> &source,
29c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            const sp<Renderer> &renderer = NULL,
307137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            const sp<NativeWindowWrapper> &nativeWindow = NULL,
317137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            const sp<CCDecoder> &ccDecoder = NULL);
32c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia
337137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void getStats(
347137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            int64_t *mNumFramesTotal,
357137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            int64_t *mNumFramesDropped) const;
361cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~Decoder();
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
427137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onConfigure(const sp<AMessage> &format);
437137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onSetRenderer(const sp<Renderer> &renderer);
447137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onGetInputBuffers(Vector<sp<ABuffer> > *dstBuffers);
457137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onResume();
467137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onFlush(bool notifyComplete);
477137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void onShutdown(bool notifyComplete);
487137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    virtual void doRequestBuffers();
497137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
507137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangprivate:
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum {
527137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatCodecNotify         = 'cdcN',
537137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        kWhatRenderBuffer        = 'rndr',
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> mNotify;
571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<NativeWindowWrapper> mNativeWindow;
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
59c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    sp<Source> mSource;
60c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    sp<Renderer> mRenderer;
617137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<CCDecoder> mCCDecoder;
62c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia
631cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    sp<AMessage> mInputFormat;
641cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    sp<AMessage> mOutputFormat;
651cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    sp<MediaCodec> mCodec;
66078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber    sp<ALooper> mCodecLooper;
671cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar
682245fc625910e47d1ba3c339e205c21ab58a47adWei Jia    List<sp<AMessage> > mPendingInputMessages;
692245fc625910e47d1ba3c339e205c21ab58a47adWei Jia
701cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    Vector<sp<ABuffer> > mInputBuffers;
711cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    Vector<sp<ABuffer> > mOutputBuffers;
7287603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar    Vector<sp<ABuffer> > mCSDsForCurrentFormat;
7387603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar    Vector<sp<ABuffer> > mCSDsToSubmit;
74095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar    Vector<bool> mInputBufferIsDequeued;
75095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar    Vector<MediaBuffer *> mMediaBuffers;
767137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    Vector<size_t> mDequeuedInputBuffers;
771cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar
78c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia    int64_t mSkipRenderingUntilMediaTimeUs;
797137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    int64_t mNumFramesTotal;
807137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    int64_t mNumFramesDropped;
817137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool mIsAudio;
827137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool mIsVideoAVC;
837137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool mIsSecure;
847137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool mFormatChangePending;
857137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
867137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    int32_t mBufferGeneration;
877137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool mPaused;
887137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    AString mComponentName;
89c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia
901cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    void handleError(int32_t err);
911cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    bool handleAnInputBuffer();
921cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    bool handleAnOutputBuffer();
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
94095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar    void releaseAndResetMediaBuffers();
951cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    void requestCodecNotification();
961cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    bool isStaleReply(const sp<AMessage> &msg);
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
987137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    status_t fetchInputData(sp<AMessage> &reply);
997137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool onInputBufferFetched(const sp<AMessage> &msg);
1001cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar    void onRenderBuffer(const sp<AMessage> &msg);
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1027137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool supportsSeamlessFormatChange(const sp<AMessage> &to) const;
1036d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih    bool supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const;
10487603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar    void rememberCodecSpecificData(const sp<AMessage> &format);
1056d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Decoder);
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif  // NUPLAYER_DECODER_H_
112