MediaCodec.h revision 37c8924c508a7c9b8bd3c8ce80fc005070531902
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> 2590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar#include <media/stagefright/FrameRenderTracker.h> 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h> 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 285778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer; 315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage; 323f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 335b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString; 3492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase; 352606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangstruct IBatteryStats; 36c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct ICrypto; 37ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IMemory; 38c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct MemoryDealer; 3967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerClient; 4067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerService; 41d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface; 425778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer; 431a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface; 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 455778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 56c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang enum { 57c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_INPUT_AVAILABLE = 1, 58c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_AVAILABLE = 2, 59c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_ERROR = 3, 60c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_FORMAT_CHANGED = 4, 6199acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu CB_RESOURCE_RECLAIMED = 5, 62c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang }; 63c5619c7a6dcc1137fde7520351ad5284e3e958abChong 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 70d291c222357303b9611cab89d0c3b047584ef377Chong Zhang static sp<PersistentSurface> CreatePersistentInputSurface(); 71d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 741a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 751bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 78c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang status_t setCallback(const sp<AMessage> &callback); 79c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 8090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar status_t setOnFrameRenderedNotification(const sp<AMessage> ¬ify); 8190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); 837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 848f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang status_t setInputSurface(const sp<PersistentSurface> &surface); 85d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 87c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 88c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Returns to a state in which the component remains allocated but 89c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // unconfigured. 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 92671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // Resets the codec to the INITIALIZED state. Can be called after an error 93671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // has occured to make the codec usable. 94671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t reset(); 95671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 96c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Client MUST call release before releasing final reference to this 97c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // object. 98c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber status_t release(); 99c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 1075b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1085b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber status_t queueSecureInputBuffer( 1114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 1124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 1134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 1144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 1164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 1174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 1184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 1195b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1205b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 132fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs); 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t signalEndOfInputStream(); 1377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 139e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t getInputFormat(sp<AMessage> *format) const; 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 141e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar status_t getWidevineLegacyBuffers(Vector<sp<ABuffer> > *buffers) const; 142e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1467bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer); 1477bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputFormat(size_t index, sp<AMessage> *format); 1487bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getInputBuffer(size_t index, sp<ABuffer> *buffer); 1497bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 1501dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t setSurface(const sp<Surface> &nativeWindow); 1511dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 152496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t requestIDRFrame(); 153496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 154575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // Notification will be posted once there "is something to do", i.e. 155575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // an input/output buffer has become available, a format change is 156575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // pending, an error is pending. 157575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void requestActivityNotification(const sp<AMessage> ¬ify); 158575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 159717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t getName(AString *componentName) const; 160717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 161a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t setParameters(const sp<AMessage> ¶ms); 162a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 16390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // Create a MediaCodec notification message from a list of rendered or dropped render infos 16490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // by adding rendered frame information to a base notification message. Returns the number 16590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // of frames that were rendered. 16690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar static size_t CreateFramesRenderedMessage( 16790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar std::list<FrameRenderTracker::Info> done, sp<AMessage> &msg); 16890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1735778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 17447a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu // used by ResourceManagerClient 17547a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu status_t reclaim(); 17647a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu friend struct ResourceManagerClient; 17747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu 17847a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wuprivate: 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 1880e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar FLUSHED, 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 190c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber RELEASING, 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 199575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatInit = 'init', 200575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatConfigure = 'conf', 2011dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar kWhatSetSurface = 'sSur', 2027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatCreateInputSurface = 'cisf', 2038f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang kWhatSetInputSurface = 'sisf', 204575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStart = 'strt', 205575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStop = 'stop', 206575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRelease = 'rele', 207575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputBuffer = 'deqI', 208575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatQueueInputBuffer = 'queI', 209575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputBuffer = 'deqO', 210575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatReleaseOutputBuffer = 'relO', 2117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatSignalEndOfInputStream = 'eois', 212575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetBuffers = 'getB', 213575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatFlush = 'flus', 214575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetOutputFormat = 'getO', 215e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar kWhatGetInputFormat = 'getI', 216575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputTimedOut = 'dITO', 217575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 218575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatCodecNotify = 'codc', 219575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestIDRFrame = 'ridr', 220575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestActivityNotification = 'racN', 221717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo kWhatGetName = 'getN', 222a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber kWhatSetParameters = 'setP', 223c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kWhatSetCallback = 'setC', 22490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar kWhatSetNotification = 'setN', 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 2283a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar kFlagUsesSoftwareRenderer = 1, 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 234ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kFlagIsSecure = 64, 235aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber kFlagSawMediaServerDie = 128, 236e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagIsEncoder = 256, 237e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagGatherCodecSpecificData = 512, 238c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kFlagIsAsync = 1024, 23952dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan kFlagIsComponentAllocated = 2048, 2408b23759763dbf11b0c628a7e62dc5b3dea7dc188Lajos Molnar kFlagPushBlankBuffersOnShutdown = 4096, 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 244609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t mBufferID; 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ABuffer> mData; 246ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ABuffer> mEncryptedData; 247c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<IMemory> mSharedEncryptedBuffer; 2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mNotify; 2497bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> mFormat; 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu struct ResourceManagerServiceProxy : public IBinder::DeathRecipient { 25467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ResourceManagerServiceProxy(); 25567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ~ResourceManagerServiceProxy(); 25667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 25767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void init(); 25867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 25967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // implements DeathRecipient 26067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu virtual void binderDied(const wp<IBinder>& /*who*/); 26167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 26267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void addResource( 26367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int64_t clientId, 26467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const sp<IResourceManagerClient> client, 26567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const Vector<MediaResource> &resources); 26667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 26767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void removeResource(int64_t clientId); 26867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 26937c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu bool reclaimResource(const Vector<MediaResource> &resources); 27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu private: 27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu Mutex mLock; 27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerService> mService; 27437c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu int mPid; 27567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu }; 27667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 27847a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu bool mReleasedByResourceManager; 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 28192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase> mCodec; 282717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo AString mComponentName; 2833f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mReplyID; 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 285251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung status_t mStickyError; 286f06cc24ce7aeb5ff6f45b770a15286c95f8cc9ffLajos Molnar sp<Surface> mSurface; 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 28890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 290e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> mInputFormat; 291c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> mCallback; 29290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar sp<AMessage> mOnFrameRenderedNotification; 293c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<MemoryDealer> mDealer; 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerClient> mResourceManagerClient; 29667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<ResourceManagerServiceProxy> mResourceManagerService; 29767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2982606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mBatteryStatNotified; 2992606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mIsVideo; 30067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoWidth; 30167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoHeight; 3022606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 303671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // initial create parameters 304671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar AString mInitName; 305671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitNameIsType; 306671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitIsEncoder; 307671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 30867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // configure parameter 30967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<AMessage> mConfigureMsg; 31067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3117bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // Used only to synchronize asynchronous getBufferAndFormat 3127bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // across all the other (synchronous) buffer state change 3137bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // operations, such as de/queueIn/OutputBuffer, start and 3147bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // stop/flush/reset/release. 3157bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex mBufferLock; 3167bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> mPortBuffers[2]; 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 3213f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueInputReplyID; 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 3243f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueOutputReplyID; 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 326ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ICrypto> mCrypto; 327ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber List<sp<ABuffer> > mCSD; 3298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 330575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> mActivityNotify; 331575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 3326507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden bool mHaveInputSurface; 3333d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang bool mHavePendingInputBuffers; 3346507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec(const sp<ALooper> &looper); 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 34047a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err); 341c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 342dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung status_t init(const AString &name, bool nameIsType, bool encoder); 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodec(); 3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodecOnPort(int32_t portIndex); 3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3527bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getBufferAndFormat( 3537bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 3547bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format); 3557bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3563f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3573f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber void extractCSD(const sp<AMessage> &format); 3618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t queueCSDInputBuffer(size_t bufferIndex); 3628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 3631dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t handleSetSurface(const sp<Surface> &surface); 3641dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t connectToSurface(const sp<Surface> &surface); 3651dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t disconnectFromSurface(); 3667541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 367575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void postActivityNotificationIfPossible(); 368575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 369c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onInputBufferAvailable(); 370c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputBufferAvailable(); 371749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang void onError(status_t err, int32_t actionCode, const char *detail = NULL); 372c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputFormatChanged(); 373c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 374a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t onSetParameters(const sp<AMessage> ¶ms); 375a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 376e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer); 3772606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void updateBatteryStat(); 3780e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar bool isExecuting() const; 379e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 38067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu uint64_t getGraphicBufferSize(); 381c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu void addResource(const String8 &type, const String8 &subtype, uint64_t value); 38267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 383251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung /* called to get the last codec error when the sticky flag is set. 384251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung * if no such codec error is found, returns UNKNOWN_ERROR. 385251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung */ 386251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline status_t getStickyError() const { 387251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR; 388251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 389251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 390251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline void setStickyError(status_t err) { 391251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mFlags |= kFlagStickyError; 392251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mStickyError = err; 393251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 394251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 401