MediaCodec.h revision 1bd139a2a68690e80398b70b27ca59550fea0e65
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 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <gui/ISurfaceTexture.h> 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h> 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h> 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 255778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 275778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer; 285778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ACodec; 295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage; 30ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct ICrypto; 315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer; 325778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SurfaceTextureClient; 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 345778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 43ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BUFFER_FLAG_ENCRYPTED = 8, 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByType( 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder); 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByComponentName( 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name); 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<SurfaceTextureClient> &nativeWindow, 551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 59c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 60c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Returns to a state in which the component remains allocated but 61c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // unconfigured. 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 64c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // Client MUST call release before releasing final reference to this 65c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber // object. 66c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber status_t release(); 67c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 955778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 995778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 110c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber RELEASING, 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatInit = 'init', 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatConfigure = 'conf', 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatStart = 'strt', 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatStop = 'stop', 123c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber kWhatRelease = 'rele', 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueInputBuffer = 'deqI', 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatQueueInputBuffer = 'queI', 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueOutputBuffer = 'deqO', 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatReleaseOutputBuffer = 'relO', 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatGetBuffers = 'getB', 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatFlush = 'flus', 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatGetOutputFormat = 'getO', 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueInputTimedOut = 'dITO', 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatCodecNotify = 'codc', 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagIsSoftwareCodec = 1, 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 143ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kFlagIsSecure = 64, 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *mBufferID; 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ABuffer> mData; 149ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ABuffer> mEncryptedData; 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mNotify; 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ACodec> mCodec; 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mReplyID; 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<SurfaceTextureClient> mNativeWindow; 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> mPortBuffers[2]; 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mDequeueInputReplyID; 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mDequeueOutputReplyID; 1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 173ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber sp<ICrypto> mCrypto; 174ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec(const sp<ALooper> &looper); 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t init(const char *name, bool nameIsType, bool encoder); 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodec(); 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodecOnPort(int32_t portIndex); 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false); 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false); 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 200