MediaCodec.h revision 6fc17d1a7c5d2fb117491b2e9f66c6236b526508
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
6468845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu    static const pid_t kNoPid = -1;
6568845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
676fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar            const sp<ALooper> &looper, const AString &mime, bool encoder, status_t *err = NULL,
6868845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu            pid_t pid = kNoPid);
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
716fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar            const sp<ALooper> &looper, const AString &name, status_t *err = NULL,
7268845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu            pid_t pid = kNoPid);
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
74d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    static sp<PersistentSurface> CreatePersistentInputSurface();
75d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
781a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &nativeWindow,
791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
82c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    status_t setCallback(const sp<AMessage> &callback);
83c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
8490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    status_t setOnFrameRenderedNotification(const sp<AMessage> &notify);
8590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
888f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    status_t setInputSurface(const sp<PersistentSurface> &surface);
89d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
91c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
92c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
93c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
96671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // Resets the codec to the INITIALIZED state.  Can be called after an error
97671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // has occured to make the codec usable.
98671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    status_t reset();
99671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
100c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
101c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
102c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
103c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
1115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
1164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
1174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
1184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
1194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
1204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
1214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
12218cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker            const CryptoPlugin::Pattern &pattern,
1234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
1245b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1255b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
137fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t signalEndOfInputStream();
1427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
144e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t getInputFormat(sp<AMessage> *format) const;
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
146e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar    status_t getWidevineLegacyBuffers(Vector<sp<ABuffer> > *buffers) const;
147e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1517bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer);
1527bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputFormat(size_t index, sp<AMessage> *format);
1537bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getInputBuffer(size_t index, sp<ABuffer> *buffer);
1547bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
1551dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t setSurface(const sp<Surface> &nativeWindow);
1561dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
157496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    status_t requestIDRFrame();
158496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
159575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // Notification will be posted once there "is something to do", i.e.
160575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // an input/output buffer has become available, a format change is
161575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // pending, an error is pending.
162575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void requestActivityNotification(const sp<AMessage> &notify);
163575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
164717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t getName(AString *componentName) const;
165717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
166a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t setParameters(const sp<AMessage> &params);
167a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
16890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // Create a MediaCodec notification message from a list of rendered or dropped render infos
16990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // by adding rendered frame information to a base notification message. Returns the number
17090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // of frames that were rendered.
17190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    static size_t CreateFramesRenderedMessage(
17290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            std::list<FrameRenderTracker::Info> done, sp<AMessage> &msg);
17390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
1745778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
17947a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    // used by ResourceManagerClient
1804b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu    status_t reclaim(bool force = false);
18147a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    friend struct ResourceManagerClient;
18247a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu
18347a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wuprivate:
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
1930e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar        FLUSHED,
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
195c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
204575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatInit                           = 'init',
205575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatConfigure                      = 'conf',
2061dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar        kWhatSetSurface                     = 'sSur',
2077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatCreateInputSurface             = 'cisf',
2088f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang        kWhatSetInputSurface                = 'sisf',
209575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStart                          = 'strt',
210575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStop                           = 'stop',
211575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRelease                        = 'rele',
212575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputBuffer             = 'deqI',
213575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatQueueInputBuffer               = 'queI',
214575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputBuffer            = 'deqO',
215575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatReleaseOutputBuffer            = 'relO',
2167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatSignalEndOfInputStream         = 'eois',
217575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetBuffers                     = 'getB',
218575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatFlush                          = 'flus',
219575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetOutputFormat                = 'getO',
220e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        kWhatGetInputFormat                 = 'getI',
221575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputTimedOut           = 'dITO',
222575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputTimedOut          = 'dOTO',
223575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatCodecNotify                    = 'codc',
224575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestIDRFrame                = 'ridr',
225575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestActivityNotification    = 'racN',
226717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        kWhatGetName                        = 'getN',
227a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        kWhatSetParameters                  = 'setP',
228c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kWhatSetCallback                    = 'setC',
22990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        kWhatSetNotification                = 'setN',
2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
2333a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar        kFlagUsesSoftwareRenderer       = 1,
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
239ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
240aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        kFlagSawMediaServerDie          = 128,
241e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagIsEncoder                  = 256,
242e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagGatherCodecSpecificData    = 512,
243c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kFlagIsAsync                    = 1024,
24452dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan        kFlagIsComponentAllocated       = 2048,
2458b23759763dbf11b0c628a7e62dc5b3dea7dc188Lajos Molnar        kFlagPushBlankBuffersOnShutdown = 4096,
2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
249609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        uint32_t mBufferID;
2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<ABuffer> mData;
25186b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu        sp<RefBase> mMemRef;
252ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        sp<ABuffer> mEncryptedData;
253c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker        sp<IMemory> mSharedEncryptedBuffer;
2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> mNotify;
2557bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar        sp<AMessage> mFormat;
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
25967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    struct ResourceManagerServiceProxy : public IBinder::DeathRecipient {
26068845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu        ResourceManagerServiceProxy(pid_t pid);
26167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        ~ResourceManagerServiceProxy();
26267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
26367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void init();
26467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
26567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // implements DeathRecipient
26667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        virtual void binderDied(const wp<IBinder>& /*who*/);
26767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
26867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void addResource(
26967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                int64_t clientId,
27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                const sp<IResourceManagerClient> client,
27167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                const Vector<MediaResource> &resources);
27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void removeResource(int64_t clientId);
27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
27537c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        bool reclaimResource(const Vector<MediaResource> &resources);
27667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
27767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    private:
27867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        Mutex mLock;
27967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        sp<IResourceManagerService> mService;
28068845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu        pid_t mPid;
28167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    };
28267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
28447a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    bool mReleasedByResourceManager;
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
28792cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar    sp<CodecBase> mCodec;
288717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    AString mComponentName;
2893f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mReplyID;
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
291251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    status_t mStickyError;
292f06cc24ce7aeb5ff6f45b770a15286c95f8cc9ffLajos Molnar    sp<Surface> mSurface;
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
29490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
296e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> mInputFormat;
297c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    sp<AMessage> mCallback;
29890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    sp<AMessage> mOnFrameRenderedNotification;
299c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker    sp<MemoryDealer> mDealer;
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
30167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<IResourceManagerClient> mResourceManagerClient;
30267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<ResourceManagerServiceProxy> mResourceManagerService;
30367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3042606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mBatteryStatNotified;
3052606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mIsVideo;
30667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int32_t mVideoWidth;
30767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int32_t mVideoHeight;
308505aab41c0e8e79a49d4506344fcd9d220d5965bChong Zhang    int32_t mRotationDegrees;
3092606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
310671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // initial create parameters
311671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    AString mInitName;
312671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitNameIsType;
313671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitIsEncoder;
314671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
31567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // configure parameter
31667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<AMessage> mConfigureMsg;
31767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3187bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // Used only to synchronize asynchronous getBufferAndFormat
3197bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // across all the other (synchronous) buffer state change
3207bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // operations, such as de/queueIn/OutputBuffer, start and
3217bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // stop/flush/reset/release.
3227bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    Mutex mBufferLock;
3237bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> mPortBuffers[2];
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
3283f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueInputReplyID;
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
3313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueOutputReplyID;
3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
333ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
334ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
3358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    List<sp<ABuffer> > mCSD;
3368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
337575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> mActivityNotify;
338575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
3396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden    bool mHaveInputSurface;
3403d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang    bool mHavePendingInputBuffers;
3416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
34268845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu    MediaCodec(const sp<ALooper> &looper, pid_t pid);
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
34747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err);
348c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
349dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung    status_t init(const AString &name, bool nameIsType, bool encoder);
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
35286b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu    void returnBuffersToCodec(bool isReclaim = false);
35386b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu    void returnBuffersToCodecOnPort(int32_t portIndex, bool isReclaim = false);
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3597bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getBufferAndFormat(
3607bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            size_t portIndex, size_t index,
3617bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            sp<ABuffer> *buffer, sp<AMessage> *format);
3627bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
3633f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
3643f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    void extractCSD(const sp<AMessage> &format);
3688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    status_t queueCSDInputBuffer(size_t bufferIndex);
3698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
3701dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t handleSetSurface(const sp<Surface> &surface);
3711dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t connectToSurface(const sp<Surface> &surface);
3721dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t disconnectFromSurface();
3737541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
374575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void postActivityNotificationIfPossible();
375575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
376c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onInputBufferAvailable();
377c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputBufferAvailable();
378749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang    void onError(status_t err, int32_t actionCode, const char *detail = NULL);
379c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputFormatChanged();
380c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
381a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t onSetParameters(const sp<AMessage> &params);
382a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
383e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
3842606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    void updateBatteryStat();
3850e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar    bool isExecuting() const;
386e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
38767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    uint64_t getGraphicBufferSize();
388c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu    void addResource(const String8 &type, const String8 &subtype, uint64_t value);
38967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3904b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu    bool hasPendingBuffer(int portIndex);
3914b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu    bool hasPendingBuffer();
3924b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu
393251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    /* called to get the last codec error when the sticky flag is set.
394251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     * if no such codec error is found, returns UNKNOWN_ERROR.
395251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     */
396251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline status_t getStickyError() const {
397251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR;
398251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
399251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
400251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline void setStickyError(status_t err) {
401251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mFlags |= kFlagStickyError;
402251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mStickyError = err;
403251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
404251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
411