CodecBase.h revision b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54
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 2711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik 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> 388338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar 3905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarnamespace android { 4005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 4111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kimclass BufferChannelBase; 4279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kimclass BufferProducerWrapper; 437e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer; 44d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface; 4579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kimstruct RenderedFrameInfo; 46addf2cbb120346ae42e78fa739245a353db5edadChong Zhangclass Surface; 4705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 483a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct CodecBase : public AHandler, /* static */ ColorUtils { 4979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 5079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * This interface defines events firing from CodecBase back to MediaCodec. 5179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * All methods must not block. 5279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 5311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim class CodecCallback { 5479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim public: 5511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual ~CodecCallback() = default; 5679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim 5779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 5879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec for seeing an output EOS. 5979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 6079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param err the underlying cause of the EOS. If the value is neither 6179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * OK nor ERROR_END_OF_STREAM, the EOS is declared 6279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * prematurely for that error. 6379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 6479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onEos(status_t err) = 0; 6579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 6611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Notify MediaCodec that start operation is complete. 6711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 6811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual void onStartCompleted() = 0; 6911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 7079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that stop operation is complete. 7179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 7279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onStopCompleted() = 0; 7379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 7479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that release operation is complete. 7579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 7679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onReleaseCompleted() = 0; 7779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 7879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that flush operation is complete. 7979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 8079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onFlushCompleted() = 0; 8179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 8279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that an error is occurred. 8379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 8479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param err an error code for the occurred error. 8579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param actionCode an action code for severity of the error. 8679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 8779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onError(status_t err, enum ActionCode actionCode) = 0; 8879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 8979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that the underlying component is allocated. 9079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 9179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param componentName the unique name of the component specified in 9279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * MediaCodecList. 9379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 9479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onComponentAllocated(const char *componentName) = 0; 9579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 9679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that the underlying component is configured. 9779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 9879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param inputFormat an input format at configure time. 9979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param outputFormat an output format at configure time. 10079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 10179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onComponentConfigured( 10279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim const sp<AMessage> &inputFormat, const sp<AMessage> &outputFormat) = 0; 10379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 10479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that the input surface is created. 10579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 10679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param inputFormat an input format at surface creation. Formats 10779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * could change from the previous state as a result 10879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * of creating a surface. 10979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param outputFormat an output format at surface creation. 11079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param inputSurface the created surface. 11179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 11279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onInputSurfaceCreated( 11379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim const sp<AMessage> &inputFormat, 11479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim const sp<AMessage> &outputFormat, 11579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim const sp<BufferProducerWrapper> &inputSurface) = 0; 11679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 11779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that the input surface creation is failed. 11879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 11979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param err an error code of the cause. 12079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 12179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onInputSurfaceCreationFailed(status_t err) = 0; 12279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 12379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that the component accepted the provided input 12479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * surface. 12579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 12679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param inputFormat an input format at surface assignment. Formats 12779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * could change from the previous state as a result 12879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * of assigning a surface. 12979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param outputFormat an output format at surface assignment. 13079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 13179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onInputSurfaceAccepted( 13279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim const sp<AMessage> &inputFormat, 13379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim const sp<AMessage> &outputFormat) = 0; 13479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 13579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that the component declined the provided input 13679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * surface. 13779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 13879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param err an error code of the cause. 13979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 14079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onInputSurfaceDeclined(status_t err) = 0; 14179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 14279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Noitfy MediaCodec that the requested input EOS is sent to the input 14379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * surface. 14479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 14579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param err an error code returned from the surface. If there is no 14679054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * input surface, the value is INVALID_OPERATION. 14779054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 14879054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onSignaledInputEOS(status_t err) = 0; 14979054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim /** 15079054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * Notify MediaCodec that output frames are rendered with information on 15179054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * those frames. 15279054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * 15379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim * @param done a list of rendered frames. 15479054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim */ 15579054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim virtual void onOutputFramesRendered(const std::list<RenderedFrameInfo> &done) = 0; 15611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 15711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Notify MediaCodec that output buffers are changed. 15811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 15911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual void onOutputBuffersChanged() = 0; 16005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar }; 16105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 16211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 16311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * This interface defines events firing from BufferChannelBase back to MediaCodec. 16411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * All methods must not block. 16511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 16611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim class BufferCallback { 16711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim public: 16811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual ~BufferCallback() = default; 16911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim 17011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 17111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Notify MediaCodec that an input buffer is available with given index. 17211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * When BufferChannelBase::getInputBufferArray() is not called, 17311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * BufferChannelBase may report different buffers with the same index if 17411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * MediaCodec already queued/discarded the buffer. After calling 17511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * BufferChannelBase::getInputBufferArray(), the buffer and index match the 17611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * returned array. 17711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 17811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual void onInputBufferAvailable( 17911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim size_t index, const sp<MediaCodecBuffer> &buffer) = 0; 18011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 18111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Notify MediaCodec that an output buffer is available with given index. 18211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * When BufferChannelBase::getOutputBufferArray() is not called, 18311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * BufferChannelBase may report different buffers with the same index if 18411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * MediaCodec already queued/discarded the buffer. After calling 18511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * BufferChannelBase::getOutputBufferArray(), the buffer and index match the 18611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * returned array. 18711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 18811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual void onOutputBufferAvailable( 18911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim size_t index, const sp<MediaCodecBuffer> &buffer) = 0; 19011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim }; 19128edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar enum { 19228edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar kMaxCodecBufferSize = 8192 * 4096 * 4, // 8K RGBA 19328edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar }; 19428edbba6aa6c1a9bbea76da2f5cc3cd73af8eb4cLajos Molnar 19511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim inline void setCallback(std::unique_ptr<CodecCallback> &&callback) { 19611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim mCallback = std::move(callback); 19711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim } 19811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual std::shared_ptr<BufferChannelBase> getBufferChannel() = 0; 19905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 20005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void initiateAllocateComponent(const sp<AMessage> &msg) = 0; 20105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void initiateConfigureComponent(const sp<AMessage> &msg) = 0; 20205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void initiateCreateInputSurface() = 0; 2038f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang virtual void initiateSetInputSurface( 204d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<PersistentSurface> &surface) = 0; 20505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void initiateStart() = 0; 20605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void initiateShutdown(bool keepComponentAllocated = false) = 0; 20705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 20805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar // require an explicit message handler 20905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void onMessageReceived(const sp<AMessage> &msg) = 0; 21005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 2115b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar virtual status_t queryCapabilities( 212b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen const AString& /*name*/, const AString& /*mime*/, bool /*isEncoder*/, 213b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen sp<MediaCodecInfo::Capabilities>* /*caps*/ /* nonnull */) { return INVALID_OPERATION; } 2145b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar 215b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen virtual status_t setSurface(const sp<Surface>& /*surface*/) { return INVALID_OPERATION; } 2161dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 21705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void signalFlush() = 0; 21805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void signalResume() = 0; 21905ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 22005ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void signalRequestIDRFrame() = 0; 22105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void signalSetParameters(const sp<AMessage> &msg) = 0; 22205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar virtual void signalEndOfInputStream() = 0; 22305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 2248338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar /* 2258338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * Codec-related defines 2268338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar */ 2278338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar 22805ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprotected: 22911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim CodecBase() = default; 23011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual ~CodecBase() = default; 23105ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 23211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim std::unique_ptr<CodecCallback> mCallback; 23379054b1f53b448511f1edb6e0dcab1d7b6f39964Wonsik Kim 23405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarprivate: 23505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar DISALLOW_EVIL_CONSTRUCTORS(CodecBase); 23605ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar}; 23705ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 23811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim/** 23911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * A channel between MediaCodec and CodecBase object which manages buffer 24011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * passing. Only MediaCodec is expected to call these methods, and 24111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * underlying CodecBase implementation should define its own interface 24211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * separately for itself. 24311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 24411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Concurrency assumptions: 24511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 24611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 1) Clients may access the object at multiple threads concurrently. 24711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 2) All methods do not call underlying CodecBase object while holding a lock. 24811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 3) Code inside critical section executes within 1ms. 24911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 25011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kimclass BufferChannelBase { 25111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kimpublic: 25211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual ~BufferChannelBase() = default; 25311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim 25411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim inline void setCallback(std::unique_ptr<CodecBase::BufferCallback> &&callback) { 25511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim mCallback = std::move(callback); 25611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim } 25711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim 25811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim inline void setCrypto(const sp<ICrypto> &crypto) { 25911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim mCrypto = crypto; 26011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim } 26111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim 26211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 26311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Queue an input buffer into the buffer channel. 26411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 26511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * @return OK if successful; 26611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * -ENOENT if the buffer is not known (TODO: this should be 26711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * handled gracefully in the future, here and below). 26811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 26911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual status_t queueInputBuffer(const sp<MediaCodecBuffer> &buffer) = 0; 27011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 27111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Queue a secure input buffer into the buffer channel. 27211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 27311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * @return OK if successful; 27411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * -ENOENT if the buffer is not known; 27511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * -ENOSYS if mCrypto is not set so that decryption is not 27611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * possible; 27711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * other errors if decryption failed. 27811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 27911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual status_t queueSecureInputBuffer( 28011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim const sp<MediaCodecBuffer> &buffer, 28111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim bool secure, 28211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim const uint8_t *key, 28311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim const uint8_t *iv, 28411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim CryptoPlugin::Mode mode, 28511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim CryptoPlugin::Pattern pattern, 28611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim const CryptoPlugin::SubSample *subSamples, 28711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim size_t numSubSamples, 28811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim AString *errorDetailMsg) = 0; 28911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 29011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Request buffer rendering at specified time. 29111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 29211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * @param timestampNs nanosecond timestamp for rendering time. 29311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * @return OK if successful; 29411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * -ENOENT if the buffer is not known. 29511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 29611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual status_t renderOutputBuffer( 29711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) = 0; 29811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 29911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Discard a buffer to the underlying CodecBase object. 30011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 30111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * TODO: remove once this operation can be handled by just clearing the 30211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * reference. 30311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * 30411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * @return OK if successful; 30511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * -ENOENT if the buffer is not known. 30611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 30711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual status_t discardBuffer(const sp<MediaCodecBuffer> &buffer) = 0; 30811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 30911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Clear and fill array with input buffers. 31011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 31111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual void getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) = 0; 31211b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim /** 31311b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim * Clear and fill array with output buffers. 31411b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim */ 31511b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim virtual void getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) = 0; 31611b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim 31711b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kimprotected: 31811b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim std::unique_ptr<CodecBase::BufferCallback> mCallback; 31911b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim sp<ICrypto> mCrypto; 32011b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim}; 32111b72100e02e02b6cd8a6b14cd2068c96dc49b7dWonsik Kim 32205ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar} // namespace android 32305ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 32405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar#endif // CODEC_BASE_H_ 32505ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnar 326