MediaCodec.h revision cefac14261a32fb856b0d1ab31541787112e306e
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 21dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <memory> 22dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <vector> 23dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim 248ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h> 254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber#include <media/hardware/CryptoAPI.h> 265b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar#include <media/MediaCodecInfo.h> 2767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#include <media/MediaResource.h> 28db1221479a7ffe7094c51c463bbd36522ed106abRay Essick#include <media/MediaAnalyticsItem.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h> 3090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar#include <media/stagefright/FrameRenderTracker.h> 315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h> 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 335778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer; 365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage; 373f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString; 39dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimclass BufferChannelBase; 4092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase; 41be8f14c64b3af442dc1341ea9bf1ca68e56dd824Colin Crossclass IBatteryStats; 42c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct ICrypto; 437e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer; 44ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IMemory; 4567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerClient; 4667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerService; 47d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface; 4861c2351da89cb281b2dfd56c6c6779ccb4bc1172Dan Willemsenclass SoftwareRenderer; 49be8f14c64b3af442dc1341ea9bf1ca68e56dd824Colin Crossclass Surface; 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 515778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 62c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang enum { 63c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_INPUT_AVAILABLE = 1, 64c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_AVAILABLE = 2, 65c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_ERROR = 3, 66c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_FORMAT_CHANGED = 4, 6799acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu CB_RESOURCE_RECLAIMED = 5, 68c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang }; 69c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 7068845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu static const pid_t kNoPid = -1; 71f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia static const uid_t kNoUid = -1; 7268845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByType( 746fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar const sp<ALooper> &looper, const AString &mime, bool encoder, status_t *err = NULL, 75f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia pid_t pid = kNoPid, uid_t uid = kNoUid); 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByComponentName( 786fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar const sp<ALooper> &looper, const AString &name, status_t *err = NULL, 79f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia pid_t pid = kNoPid, uid_t uid = kNoUid); 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 81d291c222357303b9611cab89d0c3b047584ef377Chong Zhang static sp<PersistentSurface> CreatePersistentInputSurface(); 82d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 835b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar // utility method to query capabilities 845b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar static status_t QueryCapabilities( 855b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar const AString &name, const AString &mime, bool isEncoder, 865b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar sp<MediaCodecInfo::Capabilities> *caps /* nonnull */); 875b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 901a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 94cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania status_t releaseCrypto(); 95cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 96c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang status_t setCallback(const sp<AMessage> &callback); 97c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 9890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar status_t setOnFrameRenderedNotification(const sp<AMessage> ¬ify); 9990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 1007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); 1017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1028f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang status_t setInputSurface(const sp<PersistentSurface> &surface); 103d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 105c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 106c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Returns to a state in which the component remains allocated but 107c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // unconfigured. 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 110671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // Resets the codec to the INITIALIZED state. Can be called after an error 111671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // has occured to make the codec usable. 112671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t reset(); 113671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 114c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Client MUST call release before releasing final reference to this 115c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // object. 116c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber status_t release(); 117c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 1255b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1265b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber status_t queueSecureInputBuffer( 1294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 1304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 1314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 1324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 1334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 1344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 1354b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 13618cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker const CryptoPlugin::Pattern &pattern, 1374b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 1385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1395b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 151fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs); 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t signalEndOfInputStream(); 1567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 158e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t getInputFormat(sp<AMessage> *format) const; 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1607e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim status_t getInputBuffers(Vector<sp<MediaCodecBuffer> > *buffers) const; 1617e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim status_t getOutputBuffers(Vector<sp<MediaCodecBuffer> > *buffers) const; 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1637e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim status_t getOutputBuffer(size_t index, sp<MediaCodecBuffer> *buffer); 1647bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputFormat(size_t index, sp<AMessage> *format); 1657e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim status_t getInputBuffer(size_t index, sp<MediaCodecBuffer> *buffer); 1667bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 1671dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t setSurface(const sp<Surface> &nativeWindow); 1681dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 169496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t requestIDRFrame(); 170496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 171575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // Notification will be posted once there "is something to do", i.e. 172575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // an input/output buffer has become available, a format change is 173575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // pending, an error is pending. 174575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void requestActivityNotification(const sp<AMessage> ¬ify); 175575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 176717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t getName(AString *componentName) const; 177717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 178db1221479a7ffe7094c51c463bbd36522ed106abRay Essick status_t getMetrics(Parcel *reply); 179db1221479a7ffe7094c51c463bbd36522ed106abRay Essick 180a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t setParameters(const sp<AMessage> ¶ms); 181a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 18290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // Create a MediaCodec notification message from a list of rendered or dropped render infos 18390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // by adding rendered frame information to a base notification message. Returns the number 18490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // of frames that were rendered. 18590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar static size_t CreateFramesRenderedMessage( 18640d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh const std::list<FrameRenderTracker::Info> &done, sp<AMessage> &msg); 18790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 19347a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu // used by ResourceManagerClient 1944b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu status_t reclaim(bool force = false); 19547a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu friend struct ResourceManagerClient; 19647a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu 19747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wuprivate: 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 2070e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar FLUSHED, 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 209c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber RELEASING, 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 218575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatInit = 'init', 219575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatConfigure = 'conf', 2201dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar kWhatSetSurface = 'sSur', 2217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatCreateInputSurface = 'cisf', 2228f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang kWhatSetInputSurface = 'sisf', 223575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStart = 'strt', 224575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStop = 'stop', 225575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRelease = 'rele', 226575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputBuffer = 'deqI', 227575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatQueueInputBuffer = 'queI', 228575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputBuffer = 'deqO', 229575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatReleaseOutputBuffer = 'relO', 2307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatSignalEndOfInputStream = 'eois', 231575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetBuffers = 'getB', 232575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatFlush = 'flus', 233575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetOutputFormat = 'getO', 234e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar kWhatGetInputFormat = 'getI', 235575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputTimedOut = 'dITO', 236575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 237575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatCodecNotify = 'codc', 238575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestIDRFrame = 'ridr', 239575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestActivityNotification = 'racN', 240717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo kWhatGetName = 'getN', 241a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber kWhatSetParameters = 'setP', 242c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kWhatSetCallback = 'setC', 24390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar kWhatSetNotification = 'setN', 244cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania kWhatDrmReleaseCrypto = 'rDrm', 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 2483a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar kFlagUsesSoftwareRenderer = 1, 2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 254ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kFlagIsSecure = 64, 255aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber kFlagSawMediaServerDie = 128, 256e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagIsEncoder = 256, 257fd44d8e2f2d37184f7add67125657f3fbfb5a085Wonsik Kim // 512 skipped 258c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kFlagIsAsync = 1024, 25952dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan kFlagIsComponentAllocated = 2048, 2608b23759763dbf11b0c628a7e62dc5b3dea7dc188Lajos Molnar kFlagPushBlankBuffersOnShutdown = 4096, 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 264dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim BufferInfo(); 265dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim 2667e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim sp<MediaCodecBuffer> mData; 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu struct ResourceManagerServiceProxy : public IBinder::DeathRecipient { 27168845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu ResourceManagerServiceProxy(pid_t pid); 27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ~ResourceManagerServiceProxy(); 27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void init(); 27567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // implements DeathRecipient 27767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu virtual void binderDied(const wp<IBinder>& /*who*/); 27867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void addResource( 28067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int64_t clientId, 28140d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh const sp<IResourceManagerClient> &client, 28267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const Vector<MediaResource> &resources); 28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void removeResource(int64_t clientId); 28567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 28637c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu bool reclaimResource(const Vector<MediaResource> &resources); 28767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 28867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu private: 28967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu Mutex mLock; 29067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerService> mService; 29168845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu pid_t mPid; 29267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu }; 29367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 295f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia uid_t mUid; 29647a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu bool mReleasedByResourceManager; 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 29992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase> mCodec; 300717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo AString mComponentName; 3013f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mReplyID; 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 303251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung status_t mStickyError; 304f06cc24ce7aeb5ff6f45b770a15286c95f8cc9ffLajos Molnar sp<Surface> mSurface; 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 30690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 307db1221479a7ffe7094c51c463bbd36522ed106abRay Essick MediaAnalyticsItem *mAnalyticsItem; 308db1221479a7ffe7094c51c463bbd36522ed106abRay Essick 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 310e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> mInputFormat; 311c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> mCallback; 31290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar sp<AMessage> mOnFrameRenderedNotification; 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerClient> mResourceManagerClient; 31567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<ResourceManagerServiceProxy> mResourceManagerService; 31667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3172606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mBatteryStatNotified; 3182606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mIsVideo; 31967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoWidth; 32067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoHeight; 321505aab41c0e8e79a49d4506344fcd9d220d5965bChong Zhang int32_t mRotationDegrees; 3222606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 323671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // initial create parameters 324671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar AString mInitName; 325671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitNameIsType; 326671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitIsEncoder; 327671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 32867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // configure parameter 32967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<AMessage> mConfigureMsg; 33067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3317bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // Used only to synchronize asynchronous getBufferAndFormat 3327bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // across all the other (synchronous) buffer state change 3337bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // operations, such as de/queueIn/OutputBuffer, start and 3347bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // stop/flush/reset/release. 3357bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex mBufferLock; 3367bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 338dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim std::vector<BufferInfo> mPortBuffers[2]; 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 3413f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueInputReplyID; 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 3443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueOutputReplyID; 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 346ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ICrypto> mCrypto; 347ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber List<sp<ABuffer> > mCSD; 3498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 350575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> mActivityNotify; 351575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 3526507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden bool mHaveInputSurface; 3533d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang bool mHavePendingInputBuffers; 3546507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 355dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim std::shared_ptr<BufferChannelBase> mBufferChannel; 356dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim 357f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia MediaCodec(const sp<ALooper> &looper, pid_t pid, uid_t uid); 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3595b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar static sp<CodecBase> GetCodecBase(const AString &name, bool nameIsType = false); 3605b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 36447a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err); 365c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 366dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung status_t init(const AString &name, bool nameIsType, bool encoder); 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 36986b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu void returnBuffersToCodec(bool isReclaim = false); 37086b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu void returnBuffersToCodecOnPort(int32_t portIndex, bool isReclaim = false); 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3767bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getBufferAndFormat( 3777bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 3787e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim sp<MediaCodecBuffer> *buffer, sp<AMessage> *format); 3797bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3803f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3813f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber void extractCSD(const sp<AMessage> &format); 3858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t queueCSDInputBuffer(size_t bufferIndex); 3868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 3871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t handleSetSurface(const sp<Surface> &surface); 3881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t connectToSurface(const sp<Surface> &surface); 3891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t disconnectFromSurface(); 3907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 391575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void postActivityNotificationIfPossible(); 392575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 393c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onInputBufferAvailable(); 394c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputBufferAvailable(); 395749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang void onError(status_t err, int32_t actionCode, const char *detail = NULL); 396c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputFormatChanged(); 397c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 398a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t onSetParameters(const sp<AMessage> ¶ms); 399a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4007e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim status_t amendOutputFormatWithCodecSpecificData(const sp<MediaCodecBuffer> &buffer); 4012606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void updateBatteryStat(); 4020e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar bool isExecuting() const; 403e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 40467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu uint64_t getGraphicBufferSize(); 405ea15fd29af81490311af9e12949b43524c39400eRonghua Wu void addResource(MediaResource::Type type, MediaResource::SubType subtype, uint64_t value); 40667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 4074b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu bool hasPendingBuffer(int portIndex); 4084b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu bool hasPendingBuffer(); 4094b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu 410251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung /* called to get the last codec error when the sticky flag is set. 411251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung * if no such codec error is found, returns UNKNOWN_ERROR. 412251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung */ 413251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline status_t getStickyError() const { 414251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR; 415251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 416251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 417251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline void setStickyError(status_t err) { 418251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mFlags |= kFlagStickyError; 419251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mStickyError = err; 420251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 421251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 422cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania void onReleaseCrypto(const sp<AMessage>& msg); 423cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 430