MediaCodec.h revision 671160ffe81592efa376dc1ff0fc3f4ddcdebc35
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> 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h> 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h> 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 265778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 285778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer; 295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage; 305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString; 3192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase; 32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct ICrypto; 335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer; 341a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface; 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 435778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 47c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang enum { 48c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_INPUT_AVAILABLE = 1, 49c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_AVAILABLE = 2, 50c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_ERROR = 3, 51c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_FORMAT_CHANGED = 4, 52c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang }; 53c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByType( 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder); 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByComponentName( 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name); 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 621a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 66c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang status_t setCallback(const sp<AMessage> &callback); 67c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); 697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 71c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 72c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Returns to a state in which the component remains allocated but 73c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // unconfigured. 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 76671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // Resets the codec to the INITIALIZED state. Can be called after an error 77671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // has occured to make the codec usable. 78671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t reset(); 79671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 80c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Client MUST call release before releasing final reference to this 81c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // object. 82c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber status_t release(); 83c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 915b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 925b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber status_t queueSecureInputBuffer( 954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 1004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 1014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 1024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 1035b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1045b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 116fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs); 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t signalEndOfInputStream(); 1217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 123e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t getInputFormat(sp<AMessage> *format) const; 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1287bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer); 1297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputFormat(size_t index, sp<AMessage> *format); 1307bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getInputBuffer(size_t index, sp<ABuffer> *buffer); 1317bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 132496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t requestIDRFrame(); 133496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 134575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // Notification will be posted once there "is something to do", i.e. 135575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // an input/output buffer has become available, a format change is 136575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // pending, an error is pending. 137575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void requestActivityNotification(const sp<AMessage> ¬ify); 138575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 139717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t getName(AString *componentName) const; 140717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 141a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t setParameters(const sp<AMessage> ¶ms); 142a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 158c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber RELEASING, 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 167575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatInit = 'init', 168575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatConfigure = 'conf', 1697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatCreateInputSurface = 'cisf', 170575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStart = 'strt', 171575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStop = 'stop', 172575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRelease = 'rele', 173575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputBuffer = 'deqI', 174575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatQueueInputBuffer = 'queI', 175575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputBuffer = 'deqO', 176575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatReleaseOutputBuffer = 'relO', 1777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatSignalEndOfInputStream = 'eois', 178575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetBuffers = 'getB', 179575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatFlush = 'flus', 180575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetOutputFormat = 'getO', 181e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar kWhatGetInputFormat = 'getI', 182575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputTimedOut = 'dITO', 183575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 184575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatCodecNotify = 'codc', 185575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestIDRFrame = 'ridr', 186575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestActivityNotification = 'racN', 187717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo kWhatGetName = 'getN', 188a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber kWhatSetParameters = 'setP', 189c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kWhatSetCallback = 'setC', 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagIsSoftwareCodec = 1, 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 199ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kFlagIsSecure = 64, 200aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber kFlagSawMediaServerDie = 128, 201e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagIsEncoder = 256, 202e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagGatherCodecSpecificData = 512, 203c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kFlagIsAsync = 1024, 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 207609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t mBufferID; 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ABuffer> mData; 209ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ABuffer> mEncryptedData; 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mNotify; 2117bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> mFormat; 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 21892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase> mCodec; 219717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo AString mComponentName; 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mReplyID; 2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 2221a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian sp<Surface> mNativeWindow; 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 225e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> mInputFormat; 226c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> mCallback; 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 228671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // initial create parameters 229671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar AString mInitName; 230671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitNameIsType; 231671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitIsEncoder; 232671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 2337bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // Used only to synchronize asynchronous getBufferAndFormat 2347bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // across all the other (synchronous) buffer state change 2357bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // operations, such as de/queueIn/OutputBuffer, start and 2367bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // stop/flush/reset/release. 2377bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex mBufferLock; 2387bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> mPortBuffers[2]; 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mDequeueInputReplyID; 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mDequeueOutputReplyID; 2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 248ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ICrypto> mCrypto; 249ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber List<sp<ABuffer> > mCSD; 2518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 252575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> mActivityNotify; 253575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 2546507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden bool mHaveInputSurface; 2556507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec(const sp<ALooper> &looper); 2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 261c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang static void PostReplyWithError(int32_t replyID, int32_t err); 262c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t init(const char *name, bool nameIsType, bool encoder); 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodec(); 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodecOnPort(int32_t portIndex); 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2737bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getBufferAndFormat( 2747bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 2757bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format); 2767bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false); 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false); 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber void extractCSD(const sp<AMessage> &format); 2828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t queueCSDInputBuffer(size_t bufferIndex); 2838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 2847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t setNativeWindow( 2851a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surface); 2867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 287575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void postActivityNotificationIfPossible(); 288575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 289c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onInputBufferAvailable(); 290c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputBufferAvailable(); 291749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang void onError(status_t err, int32_t actionCode, const char *detail = NULL); 292c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputFormatChanged(); 293c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 294a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t onSetParameters(const sp<AMessage> ¶ms); 295a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 296e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer); 297e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 304