1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef NUPLAYER_DECODER_BASE_H_
18 
19 #define NUPLAYER_DECODER_BASE_H_
20 
21 #include "NuPlayer.h"
22 
23 #include <media/stagefright/foundation/AHandler.h>
24 
25 namespace android {
26 
27 struct ABuffer;
28 struct MediaCodec;
29 class MediaBuffer;
30 class Surface;
31 
32 struct NuPlayer::DecoderBase : public AHandler {
33     DecoderBase(const sp<AMessage> &notify);
34 
35     void configure(const sp<AMessage> &format);
36     void init();
37     void setParameters(const sp<AMessage> &params);
38 
39     // Synchronous call to ensure decoder will not request or send out data.
40     void pause();
41 
42     void setRenderer(const sp<Renderer> &renderer);
setVideoSurfaceDecoderBase43     virtual status_t setVideoSurface(const sp<Surface> &) { return INVALID_OPERATION; }
44 
45     status_t getInputBuffers(Vector<sp<ABuffer> > *dstBuffers) const;
46     void signalFlush();
47     void signalResume(bool notifyComplete);
48     void initiateShutdown();
49 
getStatsDecoderBase50     virtual sp<AMessage> getStats() const {
51         return mStats;
52     }
53 
54     enum {
55         kWhatInputDiscontinuity  = 'inDi',
56         kWhatVideoSizeChanged    = 'viSC',
57         kWhatFlushCompleted      = 'flsC',
58         kWhatShutdownCompleted   = 'shDC',
59         kWhatResumeCompleted     = 'resC',
60         kWhatEOS                 = 'eos ',
61         kWhatError               = 'err ',
62     };
63 
64 protected:
65 
66     virtual ~DecoderBase();
67 
68     virtual void onMessageReceived(const sp<AMessage> &msg);
69 
70     virtual void onConfigure(const sp<AMessage> &format) = 0;
71     virtual void onSetParameters(const sp<AMessage> &params) = 0;
72     virtual void onSetRenderer(const sp<Renderer> &renderer) = 0;
73     virtual void onGetInputBuffers(Vector<sp<ABuffer> > *dstBuffers) = 0;
74     virtual void onResume(bool notifyComplete) = 0;
75     virtual void onFlush() = 0;
76     virtual void onShutdown(bool notifyComplete) = 0;
77 
78     void onRequestInputBuffers();
79     virtual bool doRequestBuffers() = 0;
80     virtual void handleError(int32_t err);
81 
82     sp<AMessage> mNotify;
83     int32_t mBufferGeneration;
84     bool mPaused;
85     sp<AMessage> mStats;
86 
87 private:
88     enum {
89         kWhatConfigure           = 'conf',
90         kWhatSetParameters       = 'setP',
91         kWhatSetRenderer         = 'setR',
92         kWhatPause               = 'paus',
93         kWhatGetInputBuffers     = 'gInB',
94         kWhatRequestInputBuffers = 'reqB',
95         kWhatFlush               = 'flus',
96         kWhatShutdown            = 'shuD',
97     };
98 
99     sp<ALooper> mDecoderLooper;
100     bool mRequestInputBuffersPending;
101 
102     DISALLOW_EVIL_CONSTRUCTORS(DecoderBase);
103 };
104 
105 }  // namespace android
106 
107 #endif  // NUPLAYER_DECODER_BASE_H_
108