CodecBase.h revision 28edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4c
105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar/*
205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * Copyright (C) 2014 The Android Open Source Project
305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar *
405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * you may not use this file except in compliance with the License.
605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * You may obtain a copy of the License at
705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar *
805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar *
1005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * Unless required by applicable law or agreed to in writing, software
1105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
1205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * See the License for the specific language governing permissions and
1405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar * limitations under the License.
1505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar */
1605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
1705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#ifndef CODEC_BASE_H_
1805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
1905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#define CODEC_BASE_H_
2005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
2105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#include <stdint.h>
2205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
233a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define STRINGIFY_ENUMS
243a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
258338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <media/IOMX.h>
265b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar#include <media/MediaCodecInfo.h>
2705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#include <media/stagefright/foundation/AHandler.h>
283a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/stagefright/foundation/ColorUtils.h>
298338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <media/hardware/HardwareAPI.h>
308338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
31a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar#include <utils/NativeHandle.h>
3205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
338338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <system/graphics.h>
348338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
3505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarnamespace android {
3605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
3705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarstruct ABuffer;
38d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface;
3905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
403a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct CodecBase : public AHandler, /* static */ ColorUtils {
4105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    enum {
4205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatFillThisBuffer      = 'fill',
4305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatDrainThisBuffer     = 'drai',
4405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatEOS                 = 'eos ',
4505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatShutdownCompleted   = 'scom',
4605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatFlushCompleted      = 'fcom',
4705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatOutputFormatChanged = 'outC',
4805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatError               = 'erro',
4905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatComponentAllocated  = 'cAll',
5005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatComponentConfigured = 'cCon',
5105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatInputSurfaceCreated = 'isfc',
52d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        kWhatInputSurfaceAccepted = 'isfa',
5305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatSignaledInputEOS    = 'seos',
5405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatBuffersAllocated    = 'allc',
5590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        kWhatOutputFramesRendered = 'outR',
5605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
5705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
5828edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    enum {
5928edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar        kMaxCodecBufferSize = 8192 * 4096 * 4, // 8K RGBA
6028edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    };
6128edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar
6205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void setNotificationMessage(const sp<AMessage> &msg) = 0;
6305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
6405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0;
6505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0;
6605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateCreateInputSurface() = 0;
678f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual void initiateSetInputSurface(
68d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            const sp<PersistentSurface> &surface) = 0;
6905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateStart() = 0;
7005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateShutdown(bool keepComponentAllocated = false) = 0;
7105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
7205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    // require an explicit message handler
7305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;
7405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
755b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    virtual status_t queryCapabilities(
765b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            const AString &name, const AString &mime, bool isEncoder,
775b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */) { return INVALID_OPERATION; }
785b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar
791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    virtual status_t setSurface(const sp<Surface> &surface) { return INVALID_OPERATION; }
801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
8105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalFlush() = 0;
8205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalResume() = 0;
8305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
8405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalRequestIDRFrame() = 0;
8505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalSetParameters(const sp<AMessage> &msg) = 0;
8605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalEndOfInputStream() = 0;
8705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
8805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    struct PortDescription : public RefBase {
8905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual size_t countBuffers() = 0;
9005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual IOMX::buffer_id bufferIDAt(size_t index) const = 0;
9105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual sp<ABuffer> bufferAt(size_t index) const = 0;
92c6e96a912c2cdedf853e3bd7b68c953fa818ff40Lajos Molnar        virtual sp<NativeHandle> handleAt(size_t index) const { return NULL; };
9386b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu        virtual sp<RefBase> memRefAt(size_t index) const { return NULL; }
9405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
9505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    protected:
9605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        PortDescription();
9705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual ~PortDescription();
9805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
9905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    private:
10005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
10105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
10205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
1038338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    /*
1048338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     * Codec-related defines
1058338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     */
1068338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
10705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprotected:
10805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    CodecBase();
10905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual ~CodecBase();
11005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
11105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprivate:
11205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(CodecBase);
11305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar};
11405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
11505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar}  // namespace android
11605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
11705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#endif  // CODEC_BASE_H_
11805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
119