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