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
27dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <media/ICrypto.h>
288338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <media/IOMX.h>
295b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar#include <media/MediaCodecInfo.h>
3079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim#include <media/stagefright/MediaErrors.h>
3105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#include <media/stagefright/foundation/AHandler.h>
323a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/stagefright/foundation/ColorUtils.h>
338338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <media/hardware/HardwareAPI.h>
348338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
35a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar#include <utils/NativeHandle.h>
3605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
378338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <system/graphics.h>
383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include <android/media/IDescrambler.h>
398338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
4005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarnamespace android {
413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangusing namespace media;
42dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimclass BufferChannelBase;
4379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kimclass BufferProducerWrapper;
447e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer;
45d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface;
4679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kimstruct RenderedFrameInfo;
47addf2cbb120346ae42e78fa739245a353db5edadChong Zhangclass Surface;
4805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
493a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct CodecBase : public AHandler, /* static */ ColorUtils {
5079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    /**
5179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim     * This interface defines events firing from CodecBase back to MediaCodec.
5279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim     * All methods must not block.
5379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim     */
54dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    class CodecCallback {
5579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim    public:
56dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        virtual ~CodecCallback() = default;
5779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim
5879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
5979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec for seeing an output EOS.
6079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
6179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err the underlying cause of the EOS. If the value is neither
6279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *            OK nor ERROR_END_OF_STREAM, the EOS is declared
6379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *            prematurely for that error.
6479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
6579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onEos(status_t err) = 0;
6679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
67dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * Notify MediaCodec that start operation is complete.
68dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         */
69dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        virtual void onStartCompleted() = 0;
70dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        /**
7179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that stop operation is complete.
7279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
7379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onStopCompleted() = 0;
7479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
7579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that release operation is complete.
7679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
7779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onReleaseCompleted() = 0;
7879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
7979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that flush operation is complete.
8079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
8179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onFlushCompleted() = 0;
8279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
8379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that an error is occurred.
8479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
8579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err         an error code for the occurred error.
8679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param actionCode  an action code for severity of the error.
8779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
8879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onError(status_t err, enum ActionCode actionCode) = 0;
8979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
9079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the underlying component is allocated.
9179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
9279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param componentName the unique name of the component specified in
9379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      MediaCodecList.
9479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
9579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onComponentAllocated(const char *componentName) = 0;
9679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
9779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the underlying component is configured.
9879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
9979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputFormat   an input format at configure time.
10079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param outputFormat  an output format at configure time.
10179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
10279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onComponentConfigured(
10379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &inputFormat, const sp<AMessage> &outputFormat) = 0;
10479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
10579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the input surface is created.
10679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
10779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputFormat   an input format at surface creation. Formats
10879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      could change from the previous state as a result
10979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      of creating a surface.
11079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param outputFormat  an output format at surface creation.
11179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputSurface  the created surface.
11279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
11379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceCreated(
11479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &inputFormat,
11579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &outputFormat,
11679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<BufferProducerWrapper> &inputSurface) = 0;
11779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
11879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the input surface creation is failed.
11979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
12079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err an error code of the cause.
12179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
12279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceCreationFailed(status_t err) = 0;
12379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
12479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the component accepted the provided input
12579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * surface.
12679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
12779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param inputFormat   an input format at surface assignment. Formats
12879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      could change from the previous state as a result
12979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *                      of assigning a surface.
13079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param outputFormat  an output format at surface assignment.
13179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
13279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceAccepted(
13379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &inputFormat,
13479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim                const sp<AMessage> &outputFormat) = 0;
13579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
13679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that the component declined the provided input
13779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * surface.
13879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
13979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err an error code of the cause.
14079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
14179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onInputSurfaceDeclined(status_t err) = 0;
14279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
14379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Noitfy MediaCodec that the requested input EOS is sent to the input
14479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * surface.
14579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
14679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param err an error code returned from the surface. If there is no
14779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *            input surface, the value is INVALID_OPERATION.
14879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
14979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onSignaledInputEOS(status_t err) = 0;
15079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        /**
15179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * Notify MediaCodec that output frames are rendered with information on
15279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * those frames.
15379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         *
15479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         * @param done  a list of rendered frames.
15579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim         */
15679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim        virtual void onOutputFramesRendered(const std::list<RenderedFrameInfo> &done) = 0;
157dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        /**
158dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * Notify MediaCodec that output buffers are changed.
159dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         */
160dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        virtual void onOutputBuffersChanged() = 0;
16105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    };
16205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
163dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
164dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * This interface defines events firing from BufferChannelBase back to MediaCodec.
165dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * All methods must not block.
166dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
167dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    class BufferCallback {
168dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    public:
169dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        virtual ~BufferCallback() = default;
170dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
171dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        /**
172dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * Notify MediaCodec that an input buffer is available with given index.
173dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * When BufferChannelBase::getInputBufferArray() is not called,
174dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * BufferChannelBase may report different buffers with the same index if
175dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * MediaCodec already queued/discarded the buffer. After calling
176dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * BufferChannelBase::getInputBufferArray(), the buffer and index match the
177dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * returned array.
178dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         */
179dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        virtual void onInputBufferAvailable(
180dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim                size_t index, const sp<MediaCodecBuffer> &buffer) = 0;
181dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        /**
182dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * Notify MediaCodec that an output buffer is available with given index.
183dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * When BufferChannelBase::getOutputBufferArray() is not called,
184dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * BufferChannelBase may report different buffers with the same index if
185dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * MediaCodec already queued/discarded the buffer. After calling
186dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * BufferChannelBase::getOutputBufferArray(), the buffer and index match the
187dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         * returned array.
188dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim         */
189dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        virtual void onOutputBufferAvailable(
190dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim                size_t index, const sp<MediaCodecBuffer> &buffer) = 0;
191dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    };
19228edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    enum {
19328edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar        kMaxCodecBufferSize = 8192 * 4096 * 4, // 8K RGBA
19428edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar    };
19528edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar
196dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    inline void setCallback(std::unique_ptr<CodecCallback> &&callback) {
197dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        mCallback = std::move(callback);
198dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    }
199dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual std::shared_ptr<BufferChannelBase> getBufferChannel() = 0;
20005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
20105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0;
20205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0;
20305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateCreateInputSurface() = 0;
2048f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual void initiateSetInputSurface(
205d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            const sp<PersistentSurface> &surface) = 0;
20605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateStart() = 0;
20705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void initiateShutdown(bool keepComponentAllocated = false) = 0;
20805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
20905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    // require an explicit message handler
21005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;
21105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
2125b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    virtual status_t queryCapabilities(
213b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen            const AString& /*name*/, const AString& /*mime*/, bool /*isEncoder*/,
214b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen            sp<MediaCodecInfo::Capabilities>* /*caps*/ /* nonnull */) { return INVALID_OPERATION; }
2155b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar
216b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen    virtual status_t setSurface(const sp<Surface>& /*surface*/) { return INVALID_OPERATION; }
2171dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
21805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalFlush() = 0;
21905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalResume() = 0;
22005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
22105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalRequestIDRFrame() = 0;
22205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalSetParameters(const sp<AMessage> &msg) = 0;
22305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    virtual void signalEndOfInputStream() = 0;
22405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
2258338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    /*
2268338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     * Codec-related defines
2278338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar     */
2288338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
22905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprotected:
230dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    CodecBase() = default;
231dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual ~CodecBase() = default;
23205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
233dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    std::unique_ptr<CodecCallback> mCallback;
23479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim
23505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprivate:
23605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(CodecBase);
23705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar};
23805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
239dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim/**
240dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * A channel between MediaCodec and CodecBase object which manages buffer
241dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * passing. Only MediaCodec is expected to call these methods, and
242dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * underlying CodecBase implementation should define its own interface
243dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * separately for itself.
244dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim *
245dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * Concurrency assumptions:
246dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim *
247dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * 1) Clients may access the object at multiple threads concurrently.
248dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * 2) All methods do not call underlying CodecBase object while holding a lock.
249dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * 3) Code inside critical section executes within 1ms.
250dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim */
251dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimclass BufferChannelBase {
252dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimpublic:
253dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual ~BufferChannelBase() = default;
254dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
255dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    inline void setCallback(std::unique_ptr<CodecBase::BufferCallback> &&callback) {
256dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        mCallback = std::move(callback);
257dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    }
258dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
259dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    inline void setCrypto(const sp<ICrypto> &crypto) {
260dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        mCrypto = crypto;
261dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    }
262dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
2633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    inline void setDescrambler(const sp<IDescrambler> &descrambler) {
2643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambler = descrambler;
2653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
2663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
267dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
268dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Queue an input buffer into the buffer channel.
269dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
270dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @return    OK if successful;
271dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            -ENOENT if the buffer is not known (TODO: this should be
272dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            handled gracefully in the future, here and below).
273dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
274dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t queueInputBuffer(const sp<MediaCodecBuffer> &buffer) = 0;
275dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
276dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Queue a secure input buffer into the buffer channel.
277dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
278dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @return    OK if successful;
279dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            -ENOENT if the buffer is not known;
280dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            -ENOSYS if mCrypto is not set so that decryption is not
281dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            possible;
282dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            other errors if decryption failed.
283dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
284dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t queueSecureInputBuffer(
285dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const sp<MediaCodecBuffer> &buffer,
286dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            bool secure,
287dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const uint8_t *key,
288dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const uint8_t *iv,
289dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            CryptoPlugin::Mode mode,
290dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            CryptoPlugin::Pattern pattern,
291dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const CryptoPlugin::SubSample *subSamples,
292dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            size_t numSubSamples,
293dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            AString *errorDetailMsg) = 0;
294dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
295dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Request buffer rendering at specified time.
296dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
297dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @param     timestampNs   nanosecond timestamp for rendering time.
298dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @return    OK if successful;
299dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            -ENOENT if the buffer is not known.
300dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
301dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t renderOutputBuffer(
302dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) = 0;
303dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
304dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Discard a buffer to the underlying CodecBase object.
305dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
306dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * TODO: remove once this operation can be handled by just clearing the
307dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * reference.
308dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
309dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @return    OK if successful;
310dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *            -ENOENT if the buffer is not known.
311dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
312dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t discardBuffer(const sp<MediaCodecBuffer> &buffer) = 0;
313dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
314dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Clear and fill array with input buffers.
315dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
316dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual void getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) = 0;
317dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
318dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Clear and fill array with output buffers.
319dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
320dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual void getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) = 0;
321dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
322dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimprotected:
323dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    std::unique_ptr<CodecBase::BufferCallback> mCallback;
324dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    sp<ICrypto> mCrypto;
3253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IDescrambler> mDescrambler;
326dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim};
327dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
32805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar}  // namespace android
32905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
33005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#endif  // CODEC_BASE_H_
33105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar
332