15c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong/* 25c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * Copyright (C) 2012 The Android Open Source Project 35c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * 45c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 55c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * you may not use this file except in compliance with the License. 65c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * You may obtain a copy of the License at 75c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * 85c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * http://www.apache.org/licenses/LICENSE-2.0 95c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * 105c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * Unless required by applicable law or agreed to in writing, software 115c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * distributed under the License is distributed on an "AS IS" BASIS, 125c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * See the License for the specific language governing permissions and 145c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * limitations under the License. 155c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong */ 165c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 175c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#ifndef SOFT_AVC_ENCODER_H_ 185c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#define SOFT_AVC_ENCODER_H_ 195c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 205c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include <media/stagefright/MediaBuffer.h> 215c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include <media/stagefright/foundation/ABase.h> 225c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include <utils/Vector.h> 235c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 245c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include "avcenc_api.h" 255c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include "SimpleSoftOMXComponent.h" 265c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 275c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongnamespace android { 285c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 295c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongstruct MediaBuffer; 305c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 315c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongstruct SoftAVCEncoder : public MediaBufferObserver, 325c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong public SimpleSoftOMXComponent { 335c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong SoftAVCEncoder( 345c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong const char *name, 355c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong const OMX_CALLBACKTYPE *callbacks, 365c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_PTR appData, 375c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_COMPONENTTYPE **component); 385c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 395c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // Override SimpleSoftOMXComponent methods 405c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual OMX_ERRORTYPE internalGetParameter( 415c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_INDEXTYPE index, OMX_PTR params); 425c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 435c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual OMX_ERRORTYPE internalSetParameter( 445c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_INDEXTYPE index, const OMX_PTR params); 455c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 465c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual void onQueueFilled(OMX_U32 portIndex); 475c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 48bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala // Override SoftOMXComponent methods 49bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala 50bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala virtual OMX_ERRORTYPE getExtensionIndex( 51bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala const char *name, OMX_INDEXTYPE *index); 525c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 535c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // Implement MediaBufferObserver 545c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual void signalBufferReturned(MediaBuffer *buffer); 555c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 565c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 575c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // Callbacks required by PV's encoder 585c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t allocOutputBuffers(unsigned int sizeInMbs, unsigned int numBuffers); 595c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong void unbindOutputBuffer(int32_t index); 605c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t bindOutputBuffer(int32_t index, uint8_t **yuv); 615c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 625c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongprotected: 635c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual ~SoftAVCEncoder(); 645c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 655c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongprivate: 665c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong enum { 675c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong kNumBuffers = 2, 685c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong }; 695c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 70bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala enum { 71bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala kStoreMetaDataExtensionIndex = OMX_IndexVendorStartUnused + 1 72bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala }; 73bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala 745c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // OMX input buffer's timestamp and flags 755c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong typedef struct { 765c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int64_t mTimeUs; 775c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mFlags; 785c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong } InputBufferInfo; 795c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 805c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mVideoWidth; 815c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mVideoHeight; 825c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mVideoFrameRate; 835c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mVideoBitRate; 845c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mVideoColorFormat; 85bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala bool mStoreMetaDataInBuffers; 865c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mIDRFrameRefreshIntervalInSec; 875c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong AVCProfile mAVCEncProfile; 885c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong AVCLevel mAVCEncLevel; 895c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 905c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int64_t mNumInputFrames; 915c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int64_t mPrevTimestampUs; 925c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mStarted; 935c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mSpsPpsHeaderReceived; 945c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mReadyForNextFrame; 955c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mSawInputEOS; 965c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mSignalledError; 975c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mIsIDRFrame; 985c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 995c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong tagAVCHandle *mHandle; 1005c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong tagAVCEncParam *mEncParams; 1015c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong uint8_t *mInputFrameData; 1025c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong uint32_t *mSliceGroup; 1035c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong Vector<MediaBuffer *> mOutputBuffers; 1045c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong Vector<InputBufferInfo> mInputBufferInfoVec; 1055c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 1065c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong void initPorts(); 1075c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_ERRORTYPE initEncParams(); 1085c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_ERRORTYPE initEncoder(); 1095c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_ERRORTYPE releaseEncoder(); 1105c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong void releaseOutputBuffers(); 1115c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 112bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala uint8_t* extractGrallocData(void *data, buffer_handle_t *buffer); 113bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala void releaseGrallocData(buffer_handle_t buffer); 114bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala 1155c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong DISALLOW_EVIL_CONSTRUCTORS(SoftAVCEncoder); 1165c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong}; 1175c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 1185c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong} // namespace android 1195c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 1205c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#endif // SOFT_AVC_ENCODER_H_ 121