CodecBase.h revision 28edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4c
1/*
2 * Copyright (C) 2014 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 CODEC_BASE_H_
18
19#define CODEC_BASE_H_
20
21#include <stdint.h>
22
23#define STRINGIFY_ENUMS
24
25#include <media/IOMX.h>
26#include <media/MediaCodecInfo.h>
27#include <media/stagefright/foundation/AHandler.h>
28#include <media/stagefright/foundation/ColorUtils.h>
29#include <media/hardware/HardwareAPI.h>
30
31#include <utils/NativeHandle.h>
32
33#include <system/graphics.h>
34
35namespace android {
36
37struct ABuffer;
38struct PersistentSurface;
39
40struct CodecBase : public AHandler, /* static */ ColorUtils {
41    enum {
42        kWhatFillThisBuffer      = 'fill',
43        kWhatDrainThisBuffer     = 'drai',
44        kWhatEOS                 = 'eos ',
45        kWhatShutdownCompleted   = 'scom',
46        kWhatFlushCompleted      = 'fcom',
47        kWhatOutputFormatChanged = 'outC',
48        kWhatError               = 'erro',
49        kWhatComponentAllocated  = 'cAll',
50        kWhatComponentConfigured = 'cCon',
51        kWhatInputSurfaceCreated = 'isfc',
52        kWhatInputSurfaceAccepted = 'isfa',
53        kWhatSignaledInputEOS    = 'seos',
54        kWhatBuffersAllocated    = 'allc',
55        kWhatOutputFramesRendered = 'outR',
56    };
57
58    enum {
59        kMaxCodecBufferSize = 8192 * 4096 * 4, // 8K RGBA
60    };
61
62    virtual void setNotificationMessage(const sp<AMessage> &msg) = 0;
63
64    virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0;
65    virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0;
66    virtual void initiateCreateInputSurface() = 0;
67    virtual void initiateSetInputSurface(
68            const sp<PersistentSurface> &surface) = 0;
69    virtual void initiateStart() = 0;
70    virtual void initiateShutdown(bool keepComponentAllocated = false) = 0;
71
72    // require an explicit message handler
73    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;
74
75    virtual status_t queryCapabilities(
76            const AString &name, const AString &mime, bool isEncoder,
77            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */) { return INVALID_OPERATION; }
78
79    virtual status_t setSurface(const sp<Surface> &surface) { return INVALID_OPERATION; }
80
81    virtual void signalFlush() = 0;
82    virtual void signalResume() = 0;
83
84    virtual void signalRequestIDRFrame() = 0;
85    virtual void signalSetParameters(const sp<AMessage> &msg) = 0;
86    virtual void signalEndOfInputStream() = 0;
87
88    struct PortDescription : public RefBase {
89        virtual size_t countBuffers() = 0;
90        virtual IOMX::buffer_id bufferIDAt(size_t index) const = 0;
91        virtual sp<ABuffer> bufferAt(size_t index) const = 0;
92        virtual sp<NativeHandle> handleAt(size_t index) const { return NULL; };
93        virtual sp<RefBase> memRefAt(size_t index) const { return NULL; }
94
95    protected:
96        PortDescription();
97        virtual ~PortDescription();
98
99    private:
100        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
101    };
102
103    /*
104     * Codec-related defines
105     */
106
107protected:
108    CodecBase();
109    virtual ~CodecBase();
110
111private:
112    DISALLOW_EVIL_CONSTRUCTORS(CodecBase);
113};
114
115}  // namespace android
116
117#endif  // CODEC_BASE_H_
118
119