CodecBase.h revision 79054b1f53b448511f1edb6e0dcab1d7b6f39964
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
2179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim#include <memory>
2279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim
2305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#include <stdint.h>
2405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
253a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define STRINGIFY_ENUMS
263a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
278338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <media/IOMX.h>
285b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar#include <media/MediaCodecInfo.h>
2979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim#include <media/stagefright/MediaErrors.h>
3005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#include <media/stagefright/foundation/AHandler.h>
313a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/stagefright/foundation/ColorUtils.h>
328338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <media/hardware/HardwareAPI.h>
338338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
34a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar#include <utils/NativeHandle.h>
3505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
368338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <system/graphics.h>
378338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
3805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarnamespace android {
3905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
4079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kimclass BufferProducerWrapper;
417e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer;
42d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface;
4379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kimstruct RenderedFrameInfo;
44addf2cbb120346ae42e78fa739245a353db5edadChong Zhangclass Surface;
4505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
463a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct CodecBase : public AHandler, /* static */ ColorUtils {
4779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    struct PortDescription;
4879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim
4979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    /**
5079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim     * This interface defines events firing from CodecBase back to MediaCodec.
5179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim     * All methods must not block.
5279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim     */
5379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    class Callback {
5479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    public:
5579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual ~Callback() = default;
5679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim
5779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
5879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Request MediaCodec to fill the specified input buffer.
5979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
6079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param bufferId  ID of the buffer, assigned by underlying component.
6179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param buffer    a buffer to be filled.
6279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param reply     a message to post once MediaCodec has filled the
6379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                  buffer.
6479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
6579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void fillThisBuffer(
6679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                IOMX::buffer_id bufferId,
6779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<MediaCodecBuffer> &buffer,
6879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &reply) = 0;
6979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
7079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Request MediaCodec to drain the specified output buffer.
7179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
7279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param bufferId  ID of the buffer, assigned by underlying component.
7379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param buffer    a buffer to be filled.
7479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param flags     flags associated with this buffer (e.g. EOS).
7579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param reply     a message to post once MediaCodec has filled the
7679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                  buffer.
7779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
7879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void drainThisBuffer(
7979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                IOMX::buffer_id bufferId,
8079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<MediaCodecBuffer> &buffer,
8179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                int32_t flags,
8279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &reply) = 0;
8379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
8479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec for seeing an output EOS.
8579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
8679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err the underlying cause of the EOS. If the value is neither
8779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *            OK nor ERROR_END_OF_STREAM, the EOS is declared
8879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *            prematurely for that error.
8979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
9079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onEos(status_t err) = 0;
9179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
9279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that stop operation is complete.
9379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
9479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onStopCompleted() = 0;
9579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
9679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that release operation is complete.
9779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
9879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onReleaseCompleted() = 0;
9979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
10079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that flush operation is complete.
10179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
10279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onFlushCompleted() = 0;
10379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
10479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that an error is occurred.
10579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
10679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err         an error code for the occurred error.
10779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param actionCode  an action code for severity of the error.
10879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
10979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onError(status_t err, enum ActionCode actionCode) = 0;
11079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
11179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the underlying component is allocated.
11279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
11379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param componentName the unique name of the component specified in
11479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      MediaCodecList.
11579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
11679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onComponentAllocated(const char *componentName) = 0;
11779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
11879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the underlying component is configured.
11979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
12079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputFormat   an input format at configure time.
12179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param outputFormat  an output format at configure time.
12279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
12379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onComponentConfigured(
12479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &inputFormat, const sp<AMessage> &outputFormat) = 0;
12579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
12679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the input surface is created.
12779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
12879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputFormat   an input format at surface creation. Formats
12979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      could change from the previous state as a result
13079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      of creating a surface.
13179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param outputFormat  an output format at surface creation.
13279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputSurface  the created surface.
13379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
13479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceCreated(
13579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &inputFormat,
13679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &outputFormat,
13779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<BufferProducerWrapper> &inputSurface) = 0;
13879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
13979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the input surface creation is failed.
14079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
14179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err an error code of the cause.
14279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
14379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceCreationFailed(status_t err) = 0;
14479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
14579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the component accepted the provided input
14679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * surface.
14779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
14879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputFormat   an input format at surface assignment. Formats
14979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      could change from the previous state as a result
15079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      of assigning a surface.
15179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param outputFormat  an output format at surface assignment.
15279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
15379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceAccepted(
15479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &inputFormat,
15579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &outputFormat) = 0;
15679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
15779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the component declined the provided input
15879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * surface.
15979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
16079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err an error code of the cause.
16179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
16279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceDeclined(status_t err) = 0;
16379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
16479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Noitfy MediaCodec that the requested input EOS is sent to the input
16579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * surface.
16679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
16779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err an error code returned from the surface. If there is no
16879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *            input surface, the value is INVALID_OPERATION.
16979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
17079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onSignaledInputEOS(status_t err) = 0;
17179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
17279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec with the allocated buffers.
17379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
17479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param portIndex zero for input port, one for output port.
17579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param portDesc  a PortDescription object containing allocated
17679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                  buffers.
17779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
17879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onBuffersAllocated(int32_t portIndex, const sp<PortDescription> &portDesc) = 0;
17979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
18079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that output frames are rendered with information on
18179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * those frames.
18279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
18379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param done  a list of rendered frames.
18479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
18579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onOutputFramesRendered(const std::list<RenderedFrameInfo> &done) = 0;
18605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
18705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
18828edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    enum {
18928edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar        kMaxCodecBufferSize = 8192 * 4096 * 4, // 8K RGBA
19028edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    };
19128edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar
19279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    void setCallback(std::shared_ptr<Callback> &&callback);
19305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
19405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0;
19505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0;
19605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateCreateInputSurface() = 0;
1978f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual void initiateSetInputSurface(
198d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            const sp<PersistentSurface> &surface) = 0;
19905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateStart() = 0;
20005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateShutdown(bool keepComponentAllocated = false) = 0;
20105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
20205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    // require an explicit message handler
20305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;
20405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
2055b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    virtual status_t queryCapabilities(
2065b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            const AString &name, const AString &mime, bool isEncoder,
2075b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */) { return INVALID_OPERATION; }
2085b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar
2091dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    virtual status_t setSurface(const sp<Surface> &surface) { return INVALID_OPERATION; }
2101dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
21105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalFlush() = 0;
21205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalResume() = 0;
21305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
21405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalRequestIDRFrame() = 0;
21505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalSetParameters(const sp<AMessage> &msg) = 0;
21605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalEndOfInputStream() = 0;
21705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
21805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    struct PortDescription : public RefBase {
21905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual size_t countBuffers() = 0;
22005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual IOMX::buffer_id bufferIDAt(size_t index) const = 0;
2217e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim        virtual sp<MediaCodecBuffer> bufferAt(size_t index) const = 0;
22205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
22305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    protected:
22405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        PortDescription();
22505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        virtual ~PortDescription();
22605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
22705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    private:
22805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
22905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
23005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
2318338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    /*
2328338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     * Codec-related defines
2338338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     */
2348338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
23505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprotected:
23605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    CodecBase();
23705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual ~CodecBase();
23805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
23979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    std::shared_ptr<Callback> mCallback;
24079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim
24105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprivate:
24205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(CodecBase);
24305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar};
24405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
24505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar}  // namespace android
24605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
24705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#endif  // CODEC_BASE_H_
24805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
249