MediaCodec.h revision 3d66eb4128aebef31bb0fa44c4d53d6122294a26
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 2012, The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber#ifndef MEDIA_CODEC_H_ 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define MEDIA_CODEC_H_ 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 218ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h> 224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber#include <media/hardware/CryptoAPI.h> 2367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#include <media/MediaResource.h> 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h> 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h> 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 275778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer; 305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage; 313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString; 3392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase; 342606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangstruct IBatteryStats; 35c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct ICrypto; 36c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct IMemory; 37c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct MemoryDealer; 3867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerClient; 3967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerService; 405778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer; 411a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface; 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 435778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 54c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang enum { 55c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_INPUT_AVAILABLE = 1, 56c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_AVAILABLE = 2, 57c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_ERROR = 3, 58c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_FORMAT_CHANGED = 4, 5999acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu CB_RESOURCE_RECLAIMED = 5, 60c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang }; 61c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 622606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang struct BatteryNotifier; 632606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByType( 65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const sp<ALooper> &looper, const char *mime, bool encoder, status_t *err = NULL); 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByComponentName( 68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const sp<ALooper> &looper, const char *name, status_t *err = NULL); 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 721a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 76c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang status_t setCallback(const sp<AMessage> &callback); 77c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); 797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 81c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 82c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Returns to a state in which the component remains allocated but 83c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // unconfigured. 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 86671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // Resets the codec to the INITIALIZED state. Can be called after an error 87671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // has occured to make the codec usable. 88671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t reset(); 89671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 90c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Client MUST call release before releasing final reference to this 91c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // object. 92c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber status_t release(); 93c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 1015b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1025b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber status_t queueSecureInputBuffer( 1054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 1064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 1074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 1084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 1094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 1114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 1124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 1135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1145b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 126fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs); 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t signalEndOfInputStream(); 1317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 133e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t getInputFormat(sp<AMessage> *format) const; 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 135e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar status_t getWidevineLegacyBuffers(Vector<sp<ABuffer> > *buffers) const; 136e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1407bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer); 1417bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputFormat(size_t index, sp<AMessage> *format); 1427bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getInputBuffer(size_t index, sp<ABuffer> *buffer); 1437bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 144496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t requestIDRFrame(); 145496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 146575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // Notification will be posted once there "is something to do", i.e. 147575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // an input/output buffer has become available, a format change is 148575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // pending, an error is pending. 149575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void requestActivityNotification(const sp<AMessage> ¬ify); 150575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 151717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t getName(AString *componentName) const; 152717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 153a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t setParameters(const sp<AMessage> ¶ms); 154a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 1690e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar FLUSHED, 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 171c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber RELEASING, 1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 180575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatInit = 'init', 181575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatConfigure = 'conf', 1827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatCreateInputSurface = 'cisf', 183575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStart = 'strt', 184575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStop = 'stop', 185575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRelease = 'rele', 186575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputBuffer = 'deqI', 187575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatQueueInputBuffer = 'queI', 188575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputBuffer = 'deqO', 189575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatReleaseOutputBuffer = 'relO', 1907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatSignalEndOfInputStream = 'eois', 191575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetBuffers = 'getB', 192575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatFlush = 'flus', 193575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetOutputFormat = 'getO', 194e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar kWhatGetInputFormat = 'getI', 195575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputTimedOut = 'dITO', 196575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 197575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatCodecNotify = 'codc', 198575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestIDRFrame = 'ridr', 199575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestActivityNotification = 'racN', 200717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo kWhatGetName = 'getN', 201a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber kWhatSetParameters = 'setP', 202c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kWhatSetCallback = 'setC', 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 2063a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar kFlagUsesSoftwareRenderer = 1, 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 212ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kFlagIsSecure = 64, 213aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber kFlagSawMediaServerDie = 128, 214e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagIsEncoder = 256, 215e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagGatherCodecSpecificData = 512, 216c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kFlagIsAsync = 1024, 21752dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan kFlagIsComponentAllocated = 2048, 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 221609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t mBufferID; 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ABuffer> mData; 223ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ABuffer> mEncryptedData; 224c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<IMemory> mSharedEncryptedBuffer; 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mNotify; 2267bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> mFormat; 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu struct ResourceManagerServiceProxy : public IBinder::DeathRecipient { 23167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ResourceManagerServiceProxy(); 23267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ~ResourceManagerServiceProxy(); 23367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 23467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void init(); 23567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 23667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // implements DeathRecipient 23767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu virtual void binderDied(const wp<IBinder>& /*who*/); 23867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 23967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void addResource( 24067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int pid, 24167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int64_t clientId, 24267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const sp<IResourceManagerClient> client, 24367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const Vector<MediaResource> &resources); 24467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 24567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void removeResource(int64_t clientId); 24667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 24767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu bool reclaimResource(int callingPid, const Vector<MediaResource> &resources); 24867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 24967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu private: 25067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu Mutex mLock; 25167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerService> mService; 25267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu }; 25367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 25792cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase> mCodec; 258717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo AString mComponentName; 2593f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mReplyID; 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 261251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung status_t mStickyError; 2621a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian sp<Surface> mNativeWindow; 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 265e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> mInputFormat; 266c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> mCallback; 267c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<MemoryDealer> mDealer; 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerClient> mResourceManagerClient; 27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<ResourceManagerServiceProxy> mResourceManagerService; 27167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2722606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mBatteryStatNotified; 2732606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mIsVideo; 27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoWidth; 27567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoHeight; 2762606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 277671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // initial create parameters 278671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar AString mInitName; 279671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitNameIsType; 280671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitIsEncoder; 281671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 28267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // configure parameter 28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<AMessage> mConfigureMsg; 28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2857bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // Used only to synchronize asynchronous getBufferAndFormat 2867bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // across all the other (synchronous) buffer state change 2877bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // operations, such as de/queueIn/OutputBuffer, start and 2887bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // stop/flush/reset/release. 2897bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex mBufferLock; 2907bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> mPortBuffers[2]; 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 2953f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueInputReplyID; 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 2983f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueOutputReplyID; 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 300ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ICrypto> mCrypto; 301ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3028ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber List<sp<ABuffer> > mCSD; 3038ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 304575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> mActivityNotify; 305575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 3066507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden bool mHaveInputSurface; 3073d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang bool mHavePendingInputBuffers; 3086507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec(const sp<ALooper> &looper); 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3143f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar static void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err); 315c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 316dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung status_t init(const AString &name, bool nameIsType, bool encoder); 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodec(); 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodecOnPort(int32_t portIndex); 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3267bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getBufferAndFormat( 3277bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 3287bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format); 3297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3303f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber void extractCSD(const sp<AMessage> &format); 3358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t queueCSDInputBuffer(size_t bufferIndex); 3368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 3377541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t setNativeWindow( 3381a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surface); 3397541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 340575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void postActivityNotificationIfPossible(); 341575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 342c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onInputBufferAvailable(); 343c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputBufferAvailable(); 344749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang void onError(status_t err, int32_t actionCode, const char *detail = NULL); 345c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputFormatChanged(); 346c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 347a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t onSetParameters(const sp<AMessage> ¶ms); 348a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 349e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer); 3502606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void updateBatteryStat(); 3510e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar bool isExecuting() const; 352e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 35367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu uint64_t getGraphicBufferSize(); 35467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void addResource(const char *type, uint64_t value); 35567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 356251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung /* called to get the last codec error when the sticky flag is set. 357251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung * if no such codec error is found, returns UNKNOWN_ERROR. 358251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung */ 359251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline status_t getStickyError() const { 360251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR; 361251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 362251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 363251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline void setStickyError(status_t err) { 364251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mFlags |= kFlagStickyError; 365251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mStickyError = err; 366251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 367251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 374