CodecBase.h revision 3a09d8d6f909063990a5681b15a442b2ba8ce54a
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 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 CODEC_BASE_H_
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define CODEC_BASE_H_
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
213a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <stdint.h>
223a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
233a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#define STRINGIFY_ENUMS
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/IOMX.h>
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/MediaCodecInfo.h>
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AHandler.h>
2835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#include <media/stagefright/foundation/ColorUtils.h>
297b15cb33847e6282ea8352c98894683b796127f3Wei Jia#include <media/hardware/HardwareAPI.h>
307e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim
31dc43dfa1294470a4413c37e863ef3b621da8681fLajos Molnar#include <utils/NativeHandle.h>
325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <system/graphics.h>
34d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
35d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Hubernamespace android {
36bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
37d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huberstruct ABuffer;
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct PersistentSurface;
39d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
40d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huberstruct CodecBase : public AHandler, /* static */ ColorUtils {
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum {
42bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        kWhatFillThisBuffer      = 'fill',
43bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        kWhatDrainThisBuffer     = 'drai',
44bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        kWhatEOS                 = 'eos ',
45bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        kWhatShutdownCompleted   = 'scom',
46bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        kWhatFlushCompleted      = 'fcom',
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatOutputFormatChanged = 'outC',
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatError               = 'erro',
497e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim        kWhatComponentAllocated  = 'cAll',
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatComponentConfigured = 'cCon',
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatInputSurfaceCreated = 'isfc',
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatInputSurfaceAccepted = 'isfa',
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSignaledInputEOS    = 'seos',
543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        kWhatBuffersAllocated    = 'allc',
553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        kWhatOutputFramesRendered = 'outR',
563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    };
573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
589816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    virtual void setNotificationMessage(const sp<AMessage> &msg) = 0;
597137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0;
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0;
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void initiateCreateInputSurface() = 0;
63bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    virtual void initiateSetInputSurface(
64a10fd23bb9fcf16e778c639ea5638e2917dacd89Ronghua Wu            const sp<PersistentSurface> &surface) = 0;
65bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    virtual void initiateStart() = 0;
66b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    virtual void initiateShutdown(bool keepComponentAllocated = false) = 0;
67b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
68b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    // require an explicit message handler
69c851b5de495169d7e9528644c2592746021bd968Lajos Molnar    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;
70c851b5de495169d7e9528644c2592746021bd968Lajos Molnar
71a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu    virtual status_t queryCapabilities(
72a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu            const AString &name, const AString &mime, bool isEncoder,
73a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */) { return INVALID_OPERATION; }
74202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung
753b9eb1f8629c6264d924ab7043f80d824cdd39e2Chong Zhang    virtual status_t setSurface(const sp<Surface> &surface) { return INVALID_OPERATION; }
763b9eb1f8629c6264d924ab7043f80d824cdd39e2Chong Zhang
773b9eb1f8629c6264d924ab7043f80d824cdd39e2Chong Zhang    virtual void signalFlush() = 0;
78202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    virtual void signalResume() = 0;
79c387f2b719a1a26c8306f77d79cc9a6f26b36813Dhananjay Kumar
80c387f2b719a1a26c8306f77d79cc9a6f26b36813Dhananjay Kumar    virtual void signalRequestIDRFrame() = 0;
813b9eb1f8629c6264d924ab7043f80d824cdd39e2Chong Zhang    virtual void signalSetParameters(const sp<AMessage> &msg) = 0;
823b9eb1f8629c6264d924ab7043f80d824cdd39e2Chong Zhang    virtual void signalEndOfInputStream() = 0;
839a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia
849a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia    struct PortDescription : public RefBase {
859a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia        virtual size_t countBuffers() = 0;
869a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia        virtual IOMX::buffer_id bufferIDAt(size_t index) const = 0;
879a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia        virtual sp<ABuffer> bufferAt(size_t index) const = 0;
889a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia        virtual sp<NativeHandle> handleAt(size_t index) const { return NULL; };
89c387f2b719a1a26c8306f77d79cc9a6f26b36813Dhananjay Kumar        virtual sp<RefBase> memRefAt(size_t index) const { return NULL; }
909a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia
919a3101b22b5115717faeac986b43fc6618fd3b30Wei Jia    protected:
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        PortDescription();
93faeb0f291330134dc4468359a36e099aae508449Ronghua Wu        virtual ~PortDescription();
94faeb0f291330134dc4468359a36e099aae508449Ronghua Wu
95faeb0f291330134dc4468359a36e099aae508449Ronghua Wu    private:
96faeb0f291330134dc4468359a36e099aae508449Ronghua Wu        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
97faeb0f291330134dc4468359a36e099aae508449Ronghua Wu    };
98faeb0f291330134dc4468359a36e099aae508449Ronghua Wu
99f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu    /*
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber     * Codec-related defines
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber     */
102faeb0f291330134dc4468359a36e099aae508449Ronghua Wu
103a05f1e3a8eb80a0a9f19456aea357d6d8e405794Wei Jiaprotected:
1040852917279f79a94907e9906d0533ae409a30f6aRonghua Wu    CodecBase();
105a05f1e3a8eb80a0a9f19456aea357d6d8e405794Wei Jia    virtual ~CodecBase();
1060852917279f79a94907e9906d0533ae409a30f6aRonghua Wu
1070852917279f79a94907e9906d0533ae409a30f6aRonghua Wuprivate:
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(CodecBase);
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif  // CODEC_BASE_H_
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
115bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia