MediaCodec.h revision 5778822d86b0337407514b9372562b86edfa91cd
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; 305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer; 315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SurfaceTextureClient; 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler { 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum ConfigureFlags { 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURE_FLAG_ENCODE = 1, 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum BufferFlags { 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_SYNCFRAME = 1, 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_CODECCONFIG = 2, 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber BUFFER_FLAG_EOS = 4, 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByType( 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder); 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber static sp<MediaCodec> CreateByComponentName( 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name); 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t configure( 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<SurfaceTextureClient> &nativeWindow, 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t start(); 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t stop(); 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t flush(); 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t queueInputBuffer( 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags); 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t dequeueOutputBuffer( 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs = 0ll); 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t renderOutputBufferAndRelease(size_t index); 785778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t releaseOutputBuffer(size_t index); 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputFormat(sp<AMessage> *format) const; 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 855778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~MediaCodec(); 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 895778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum State { 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber UNINITIALIZED, 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZING, 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber INITIALIZED, 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURING, 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CONFIGURED, 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTING, 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber STARTED, 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber FLUSHING, 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber STOPPING, 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput = 0, 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput = 1, 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatInit = 'init', 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatConfigure = 'conf', 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatStart = 'strt', 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatStop = 'stop', 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueInputBuffer = 'deqI', 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatQueueInputBuffer = 'queI', 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueOutputBuffer = 'deqO', 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatReleaseOutputBuffer = 'relO', 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatGetBuffers = 'getB', 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatFlush = 'flus', 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatGetOutputFormat = 'getO', 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueInputTimedOut = 'dITO', 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatDequeueOutputTimedOut = 'dOTO', 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber kWhatCodecNotify = 'codc', 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber enum { 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagIsSoftwareCodec = 1, 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputFormatChanged = 2, 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagOutputBuffersChanged = 4, 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagStickyError = 8, 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueInputPending = 16, 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber kFlagDequeueOutputPending = 32, 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber struct BufferInfo { 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *mBufferID; 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ABuffer> mData; 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mNotify; 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mOwnedByClient; 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber }; 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber State mState; 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mLooper; 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> mCodecLooper; 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ACodec> mCodec; 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mReplyID; 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mFlags; 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<SurfaceTextureClient> mNativeWindow; 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber SoftwareRenderer *mSoftRenderer; 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> mOutputFormat; 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> mAvailPortBuffers[2]; 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> mPortBuffers[2]; 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueInputTimeoutGeneration; 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mDequeueInputReplyID; 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t mDequeueOutputTimeoutGeneration; 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t mDequeueOutputReplyID; 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec(const sp<ALooper> &looper); 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber static status_t PostAndAwaitResponse( 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response); 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t init(const char *name, bool nameIsType, bool encoder); 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber void setState(State newState); 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodec(); 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber void returnBuffersToCodecOnPort(int32_t portIndex); 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onQueueInputBuffer(const sp<AMessage> &msg); 1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t dequeuePortBuffer(int32_t portIndex); 1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false); 1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false); 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber void cancelPendingDequeueOperations(); 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif // MEDIA_CODEC_H_ 184