CodecBase.h revision addf2cbb120346ae42e78fa739245a353db5edad
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
377e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer;
38d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface;
39addf2cbb120346ae42e78fa739245a353db5edadChong Zhangclass Surface;
4005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
413a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct CodecBase : public AHandler, /* static */ ColorUtils {
4205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    enum {
4305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatFillThisBuffer      = 'fill',
4405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatDrainThisBuffer     = 'drai',
4505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatEOS                 = 'eos ',
4605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatShutdownCompleted   = 'scom',
4705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatFlushCompleted      = 'fcom',
4805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatOutputFormatChanged = 'outC',
4905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatError               = 'erro',
5005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatComponentAllocated  = 'cAll',
5105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatComponentConfigured = 'cCon',
5205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatInputSurfaceCreated = 'isfc',
53d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        kWhatInputSurfaceAccepted = 'isfa',
5405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatSignaledInputEOS    = 'seos',
5505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        kWhatBuffersAllocated    = 'allc',
5690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        kWhatOutputFramesRendered = 'outR',
5705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
5805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
5928edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    enum {
6028edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar        kMaxCodecBufferSize = 8192 * 4096 * 4, // 8K RGBA
6128edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    };
6228edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar
6305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void setNotificationMessage(const sp<AMessage> &msg) = 0;
6405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
6505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0;
6605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0;
6705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateCreateInputSurface() = 0;
688f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual void initiateSetInputSurface(
69d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            const sp<PersistentSurface> &surface) = 0;
7005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateStart() = 0;
7105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateShutdown(bool keepComponentAllocated = false) = 0;
7205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
7305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    // require an explicit message handler
7405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;
7505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
765b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    virtual status_t queryCapabilities(
775b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            const AString &name, const AString &mime, bool isEncoder,
785b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */) { return INVALID_OPERATION; }
795b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar
801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    virtual status_t setSurface(const sp<Surface> &surface) { return INVALID_OPERATION; }
811dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
8205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalFlush() = 0;
8305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalResume() = 0;
8405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
8505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalRequestIDRFrame() = 0;
8605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalSetParameters(const sp<AMessage> &msg) = 0;
8705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalEndOfInputStream() = 0;
8805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
8905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    struct PortDescription : public RefBase {
9005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual size_t countBuffers() = 0;
9105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual IOMX::buffer_id bufferIDAt(size_t index) const = 0;
927e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim        virtual sp<MediaCodecBuffer> bufferAt(size_t index) const = 0;
93c6e96a912c2cdedf853e3bd7b68c953fa818ff40Lajos Molnar        virtual sp<NativeHandle> handleAt(size_t index) const { return NULL; };
9486b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu        virtual sp<RefBase> memRefAt(size_t index) const { return NULL; }
9505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
9605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    protected:
9705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        PortDescription();
9805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual ~PortDescription();
9905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
10005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    private:
10105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
10205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
10305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
1048338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    /*
1058338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     * Codec-related defines
1068338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     */
1078338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
10805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprotected:
10905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    CodecBase();
11005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual ~CodecBase();
11105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
11205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprivate:
11305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(CodecBase);
11405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar};
11505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
11605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar}  // namespace android
11705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
11805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#endif  // CODEC_BASE_H_
11905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
120