MediaCodec.h revision ea15fd29af81490311af9e12949b43524c39400e
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> 235b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar#include <media/MediaCodecInfo.h> 2467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#include <media/MediaResource.h> 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h> 2690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar#include <media/stagefright/FrameRenderTracker.h> 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 295778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer; 325778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage; 333f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 345b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString; 3592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase; 362606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangstruct IBatteryStats; 37c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct ICrypto; 38ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IMemory; 39c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct MemoryDealer; 4067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerClient; 4167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerService; 42d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface; 435778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer; 441a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface; 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 465778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 57c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang enum { 58c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_INPUT_AVAILABLE = 1, 59c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_AVAILABLE = 2, 60c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_ERROR = 3, 61c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CB_OUTPUT_FORMAT_CHANGED = 4, 6299acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu CB_RESOURCE_RECLAIMED = 5, 63c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang }; 64c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 6568845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu static const pid_t kNoPid = -1; 6668845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByType( 686fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar const sp<ALooper> &looper, const AString &mime, bool encoder, status_t *err = NULL, 6968845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu pid_t pid = kNoPid); 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByComponentName( 726fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar const sp<ALooper> &looper, const AString &name, status_t *err = NULL, 7368845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu pid_t pid = kNoPid); 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 75d291c222357303b9611cab89d0c3b047584ef377Chong Zhang static sp<PersistentSurface> CreatePersistentInputSurface(); 76d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 775b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar // utility method to query capabilities 785b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar static status_t QueryCapabilities( 795b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar const AString &name, const AString &mime, bool isEncoder, 805b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar sp<MediaCodecInfo::Capabilities> *caps /* nonnull */); 815b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 841a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 88c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang status_t setCallback(const sp<AMessage> &callback); 89c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 9090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar status_t setOnFrameRenderedNotification(const sp<AMessage> ¬ify); 9190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); 937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 948f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang status_t setInputSurface(const sp<PersistentSurface> &surface); 95d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 97c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 98c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Returns to a state in which the component remains allocated but 99c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // unconfigured. 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 102671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // Resets the codec to the INITIALIZED state. Can be called after an error 103671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // has occured to make the codec usable. 104671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t reset(); 105671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 106c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Client MUST call release before releasing final reference to this 107c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // object. 108c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber status_t release(); 109c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 1175b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1185b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber status_t queueSecureInputBuffer( 1214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 1224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 1234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 1244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 1254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 1264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 1274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 12818cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker const CryptoPlugin::Pattern &pattern, 1294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 1305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg = NULL); 1324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 143fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs); 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t signalEndOfInputStream(); 1487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 150e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t getInputFormat(sp<AMessage> *format) const; 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 152e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar status_t getWidevineLegacyBuffers(Vector<sp<ABuffer> > *buffers) const; 153e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1577bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer); 1587bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getOutputFormat(size_t index, sp<AMessage> *format); 1597bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getInputBuffer(size_t index, sp<ABuffer> *buffer); 1607bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 1611dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t setSurface(const sp<Surface> &nativeWindow); 1621dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 163496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t requestIDRFrame(); 164496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 165575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // Notification will be posted once there "is something to do", i.e. 166575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // an input/output buffer has become available, a format change is 167575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber // pending, an error is pending. 168575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void requestActivityNotification(const sp<AMessage> ¬ify); 169575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 170717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t getName(AString *componentName) const; 171717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 172a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t setParameters(const sp<AMessage> ¶ms); 173a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 17490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // Create a MediaCodec notification message from a list of rendered or dropped render infos 17590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // by adding rendered frame information to a base notification message. Returns the number 17690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar // of frames that were rendered. 17790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar static size_t CreateFramesRenderedMessage( 17890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar std::list<FrameRenderTracker::Info> done, sp<AMessage> &msg); 17990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 18547a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu // used by ResourceManagerClient 1864b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu status_t reclaim(bool force = false); 18747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu friend struct ResourceManagerClient; 18847a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu 18947a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wuprivate: 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 1990e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar FLUSHED, 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 201c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber RELEASING, 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 210575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatInit = 'init', 211575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatConfigure = 'conf', 2121dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar kWhatSetSurface = 'sSur', 2137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatCreateInputSurface = 'cisf', 2148f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang kWhatSetInputSurface = 'sisf', 215575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStart = 'strt', 216575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatStop = 'stop', 217575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRelease = 'rele', 218575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputBuffer = 'deqI', 219575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatQueueInputBuffer = 'queI', 220575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputBuffer = 'deqO', 221575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatReleaseOutputBuffer = 'relO', 2227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden kWhatSignalEndOfInputStream = 'eois', 223575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetBuffers = 'getB', 224575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatFlush = 'flus', 225575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatGetOutputFormat = 'getO', 226e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar kWhatGetInputFormat = 'getI', 227575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueInputTimedOut = 'dITO', 228575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 229575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatCodecNotify = 'codc', 230575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestIDRFrame = 'ridr', 231575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber kWhatRequestActivityNotification = 'racN', 232717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo kWhatGetName = 'getN', 233a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber kWhatSetParameters = 'setP', 234c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kWhatSetCallback = 'setC', 23590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar kWhatSetNotification = 'setN', 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 2393a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar kFlagUsesSoftwareRenderer = 1, 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 245ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kFlagIsSecure = 64, 246aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber kFlagSawMediaServerDie = 128, 247e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagIsEncoder = 256, 248e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber kFlagGatherCodecSpecificData = 512, 249c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang kFlagIsAsync = 1024, 25052dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan kFlagIsComponentAllocated = 2048, 2518b23759763dbf11b0c628a7e62dc5b3dea7dc188Lajos Molnar kFlagPushBlankBuffersOnShutdown = 4096, 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 255609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t mBufferID; 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ABuffer> mData; 257a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar sp<NativeHandle> mNativeHandle; 25886b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu sp<RefBase> mMemRef; 259ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ABuffer> mEncryptedData; 260c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<IMemory> mSharedEncryptedBuffer; 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mNotify; 2627bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> mFormat; 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu struct ResourceManagerServiceProxy : public IBinder::DeathRecipient { 26768845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu ResourceManagerServiceProxy(pid_t pid); 26867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ~ResourceManagerServiceProxy(); 26967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void init(); 27167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // implements DeathRecipient 27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu virtual void binderDied(const wp<IBinder>& /*who*/); 27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void addResource( 27667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int64_t clientId, 27767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const sp<IResourceManagerClient> client, 27867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu const Vector<MediaResource> &resources); 27967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 28067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu void removeResource(int64_t clientId); 28167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 28237c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu bool reclaimResource(const Vector<MediaResource> &resources); 28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu private: 28567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu Mutex mLock; 28667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerService> mService; 28768845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu pid_t mPid; 28867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu }; 28967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 29147a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu bool mReleasedByResourceManager; 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 29492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase> mCodec; 295717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo AString mComponentName; 2963f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mReplyID; 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 298251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung status_t mStickyError; 299f06cc24ce7aeb5ff6f45b770a15286c95f8cc9ffLajos Molnar sp<Surface> mSurface; 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 30190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 303e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> mInputFormat; 304c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> mCallback; 30590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar sp<AMessage> mOnFrameRenderedNotification; 306c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<MemoryDealer> mDealer; 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerClient> mResourceManagerClient; 30967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<ResourceManagerServiceProxy> mResourceManagerService; 31067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mBatteryStatNotified; 3122606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang bool mIsVideo; 31367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoWidth; 31467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int32_t mVideoHeight; 315505aab41c0e8e79a49d4506344fcd9d220d5965bChong Zhang int32_t mRotationDegrees; 3162606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 317671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // initial create parameters 318671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar AString mInitName; 319671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitNameIsType; 320671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar bool mInitIsEncoder; 321671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 32267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // configure parameter 32367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<AMessage> mConfigureMsg; 32467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3257bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // Used only to synchronize asynchronous getBufferAndFormat 3267bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // across all the other (synchronous) buffer state change 3277bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // operations, such as de/queueIn/OutputBuffer, start and 3287bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // stop/flush/reset/release. 3297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex mBufferLock; 3307bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> mPortBuffers[2]; 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 3353f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueInputReplyID; 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 3383f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDequeueOutputReplyID; 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 340ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ICrypto> mCrypto; 341ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber List<sp<ABuffer> > mCSD; 3438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 344575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> mActivityNotify; 345575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 3466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden bool mHaveInputSurface; 3473d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang bool mHavePendingInputBuffers; 3486507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 34968845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu MediaCodec(const sp<ALooper> &looper, pid_t pid); 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3515b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar static sp<CodecBase> GetCodecBase(const AString &name, bool nameIsType = false); 3525b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 35647a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err); 357c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 358dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung status_t init(const AString &name, bool nameIsType, bool encoder); 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 36186b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu void returnBuffersToCodec(bool isReclaim = false); 36286b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu void returnBuffersToCodecOnPort(int32_t portIndex, bool isReclaim = false); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3687bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar status_t getBufferAndFormat( 3697bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 3707bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format); 3717bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 3723f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3733f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false); 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber void extractCSD(const sp<AMessage> &format); 3778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t queueCSDInputBuffer(size_t bufferIndex); 3788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 3791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t handleSetSurface(const sp<Surface> &surface); 3801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t connectToSurface(const sp<Surface> &surface); 3811dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t disconnectFromSurface(); 3827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 383575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber void postActivityNotificationIfPossible(); 384575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 385c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onInputBufferAvailable(); 386c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputBufferAvailable(); 387749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang void onError(status_t err, int32_t actionCode, const char *detail = NULL); 388c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang void onOutputFormatChanged(); 389c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 390a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t onSetParameters(const sp<AMessage> ¶ms); 391a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 392e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer); 3932606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void updateBatteryStat(); 3940e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar bool isExecuting() const; 395e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 39667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu uint64_t getGraphicBufferSize(); 397ea15fd29af81490311af9e12949b43524c39400eRonghua Wu void addResource(MediaResource::Type type, MediaResource::SubType subtype, uint64_t value); 39867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3994b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu bool hasPendingBuffer(int portIndex); 4004b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu bool hasPendingBuffer(); 4014b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu 402251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung /* called to get the last codec error when the sticky flag is set. 403251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung * if no such codec error is found, returns UNKNOWN_ERROR. 404251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung */ 405251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline status_t getStickyError() const { 406251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR; 407251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 408251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 409251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung inline void setStickyError(status_t err) { 410251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mFlags |= kFlagStickyError; 411251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mStickyError = err; 412251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 413251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 420