162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#define LOG_TAG "OMXVideoEncoderVP8" 362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#include "OMXVideoEncoderVP8.h" 462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 563ee173ed94850f02f22d0c1143ebfecb1066597Liu Bolunstatic const char *VP8_MIME_TYPE = "video/x-vnd.on2.vp8"; 662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMXVideoEncoderVP8::OMXVideoEncoderVP8() { 862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying LOGV("OMXVideoEncoderVP8 is constructed."); 962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying BuildHandlerList(); 1062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mVideoEncoder = createVideoEncoder(VP8_MIME_TYPE); 1162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if(!mVideoEncoder) LOGE("OMX_ErrorInsufficientResources"); 1262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 1362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 1462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMXVideoEncoderVP8::~OMXVideoEncoderVP8() { 1562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying LOGV("OMXVideoEncoderVP8 is destructed."); 1662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 1762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 1862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput) { 1962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 2062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying memset(&mParamVp8, 0, sizeof(mParamVp8)); 2162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying SetTypeHeader(&mParamVp8, sizeof(mParamVp8)); 2262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mParamVp8.nPortIndex = OUTPORT_INDEX; 2362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mParamVp8.eProfile = OMX_VIDEO_VP8ProfileMain; 2462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mParamVp8.eLevel = OMX_VIDEO_VP8Level_Version3; 2562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 26cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun memset(&mConfigVideoVp8ReferenceFrame, 0, sizeof(mConfigVideoVp8ReferenceFrame)); 27cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun SetTypeHeader(&mConfigVideoVp8ReferenceFrame, sizeof(mConfigVideoVp8ReferenceFrame)); 28cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.nPortIndex = OUTPORT_INDEX; 29cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.bUsePreviousFrame = OMX_TRUE; 30cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.bUseGoldenFrame = OMX_TRUE; 31cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.bUseAlternateFrame = OMX_TRUE; 32cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.bPreviousFrameRefresh = OMX_TRUE; 33cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.bGoldenFrameRefresh = OMX_TRUE; 34cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun mConfigVideoVp8ReferenceFrame.bAlternateFrameRefresh = OMX_TRUE; 35cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun 3662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying paramPortDefinitionOutput->nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT; 3762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying paramPortDefinitionOutput->nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT; 3862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying paramPortDefinitionOutput->nBufferSize = OUTPORT_BUFFER_SIZE; 3962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying paramPortDefinitionOutput->format.video.cMIMEType = (OMX_STRING)VP8_MIME_TYPE; 4007cf1edddd80bbcd569575d9a6759fd82fd963f8Dan Liang paramPortDefinitionOutput->format.video.eCompressionFormat = OMX_VIDEO_CodingVP8; 4162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 4294f43328fd68ede85ccf631ca0fa9c942d18f5eeliubolun // OMX_VIDEO_PARAM_INTEL_NUMBER_OF_TEMPORAL_LAYER 436b334fd4175f234d24739f75330c50549fb6bed0bolunliu memset(&mTemporalLayer, 0, sizeof(mTemporalLayer)); 446b334fd4175f234d24739f75330c50549fb6bed0bolunliu SetTypeHeader(&mTemporalLayer, sizeof(mTemporalLayer)); 456b334fd4175f234d24739f75330c50549fb6bed0bolunliu mTemporalLayer.nPortIndex = OUTPORT_INDEX; 466b334fd4175f234d24739f75330c50549fb6bed0bolunliu mTemporalLayer.nNumberOfTemporalLayer = 1;//default value is 1 4794f43328fd68ede85ccf631ca0fa9c942d18f5eeliubolun 4862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mParamProfileLevel.eProfile = OMX_VIDEO_VP8ProfileMain; 4962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mParamProfileLevel.eLevel = OMX_VIDEO_VP8Level_Version3; 5062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorNone; 5162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 5262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 5362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::SetVideoEncoderParam() { 5462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 5562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (!mEncoderParams) { 5662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying LOGE("NULL pointer: mEncoderParams"); 5762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorBadParameter; 5862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 5962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 6062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mVideoEncoder->getParameters(mEncoderParams); 615096d08f3afc029d82f2e2a34aa1fb8a427ce050Chang Ying mEncoderParams->profile = VAProfileVP8Version0_3; 6262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMXVideoEncoderBase::SetVideoEncoderParam(); 6362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 6462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 6562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorInit(void) { 6662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMXVideoEncoderBase::ProcessorInit(); 6762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 6862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 6962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorDeinit(void) { 7062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMXVideoEncoderBase::ProcessorDeinit(); 7162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 7262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 7362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers, 7462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying buffer_retain_t *retains, 750541f11be2f78b558476772f1f877e140f9d844bywan OMX_U32) { 7662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 7762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying VideoEncOutputBuffer outBuf; 7862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying VideoEncRawBuffer inBuf; 7962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying Encode_Status ret = ENCODE_SUCCESS; 8062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 8162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_U32 outfilledlen = 0; 8262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_S64 outtimestamp = 0; 8362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_U32 outflags = 0; 8462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_ERRORTYPE oret = OMX_ErrorNone; 8562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 86d06de36eb079130c029eb590dd56d600266cb7f2bolunliu if(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS) { 87d06de36eb079130c029eb590dd56d600266cb7f2bolunliu LOGV("%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); 88d06de36eb079130c029eb590dd56d600266cb7f2bolunliu outflags |= OMX_BUFFERFLAG_EOS; 89d06de36eb079130c029eb590dd56d600266cb7f2bolunliu } 9062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 9162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (!buffers[INPORT_INDEX]->nFilledLen) { 9262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying LOGV("%s(),%d: input buffer's nFilledLen is zero\n", __func__, __LINE__); 9362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying goto out; 9462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 9562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 9662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying inBuf.data = buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset; 9762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying inBuf.size = buffers[INPORT_INDEX]->nFilledLen; 98d06de36eb079130c029eb590dd56d600266cb7f2bolunliu inBuf.type = FTYPE_UNKNOWN; 99d06de36eb079130c029eb590dd56d600266cb7f2bolunliu inBuf.timeStamp = buffers[INPORT_INDEX]->nTimeStamp; 10062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 10162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outBuf.data = 10262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset; 10362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outBuf.dataSize = 0; 10462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outBuf.bufferSize = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset; 10562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 10662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (mFrameRetrieved) { 10762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying // encode and setConfig need to be thread safe 10862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying pthread_mutex_unlock(&mSerializationLock); 10962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying ret = mVideoEncoder->encode(&inBuf); 11062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying pthread_mutex_unlock(&mSerializationLock); 11162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 11262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_ENCODE_STATUS("encode"); 11362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mFrameRetrieved = OMX_FALSE; 11462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 11562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying // This is for buffer contention, we won't release current buffer 11662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying // but the last input buffer 11762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); 11862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 11962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 12062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying { 12162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outBuf.format = OUTPUT_EVERYTHING; 122dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu ret = mVideoEncoder->getOutput(&outBuf); 123dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu //CHECK_ENCODE_STATUS("getOutput"); 124dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu if(ret == ENCODE_NO_REQUEST_DATA) { 125dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu mFrameRetrieved = OMX_TRUE; 126dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 127dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu if (mSyncEncoding) 128dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 129dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu else 130d06de36eb079130c029eb590dd56d600266cb7f2bolunliu retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 131dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu 132dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu goto out; 133dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu } 13462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 1350740ec12c293d6b6080fd92d210300b4ed5169faliubolun LOGV("VP8 encode output data size = %d", outBuf.dataSize); 13662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 13762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 13862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outfilledlen = outBuf.dataSize; 13962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outtimestamp = buffers[INPORT_INDEX]->nTimeStamp; 14062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 14162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) { 14262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outflags |= OMX_BUFFERFLAG_SYNCFRAME; 14362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 14462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 14562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) { 14662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying LOGV("Get buffer done\n"); 14762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 14862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mFrameRetrieved = OMX_TRUE; 14988c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang if (mSyncEncoding) 15088c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 15188c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang else 152d06de36eb079130c029eb590dd56d600266cb7f2bolunliu retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 15362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 15462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } else { 15562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again 15662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 15762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 15862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 15962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 16062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 16162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 16262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (outfilledlen > 0) { 16362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 16462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } else { 16562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 16662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 16762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 16862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 16962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 17062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#if SHOW_FPS 17162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying { 17262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying struct timeval t; 17362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_TICKS current_ts, interval_ts; 17462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying float current_fps, average_fps; 17562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 17662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying t.tv_sec = t.tv_usec = 0; 17762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying gettimeofday(&t, NULL); 17862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 17962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying current_ts = 18062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000; 18162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying interval_ts = current_ts - lastTs; 18262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying lastTs = current_ts; 18362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 18462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying current_fps = (float)1000000000 / (float)interval_ts; 18562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying average_fps = (current_fps + lastFps) / 2; 18662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying lastFps = current_fps; 18762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 18862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying LOGV("FPS = %2.1f\n", average_fps); 18962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 19062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#endif 19162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 19262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Yingout: 19362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 19462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (retains[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) { 19562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen; 19662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp; 19762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying buffers[OUTPORT_INDEX]->nFlags = outflags; 19862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 19962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 20062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (retains[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN || 20162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying retains[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) { 20262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mFrameInputCount ++; 20362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 20462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 20562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if (retains[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) 20662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying mFrameOutputCount ++; 20762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 20862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return oret; 20962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 21062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 21162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::BuildHandlerList(void) { 21262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMXVideoEncoderBase::BuildHandlerList(); 21362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying AddHandler((OMX_INDEXTYPE)OMX_IndexParamVideoVp8, GetParamVideoVp8, SetParamVideoVp8); 21462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying AddHandler((OMX_INDEXTYPE)OMX_IndexConfigVideoVp8ReferenceFrame, GetConfigVideoVp8ReferenceFrame, SetConfigVideoVp8ReferenceFrame); 215186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun AddHandler((OMX_INDEXTYPE)OMX_IndexExtVP8MaxFrameSizeRatio, GetConfigVp8MaxFrameSizeRatio, SetConfigVp8MaxFrameSizeRatio); 21694f43328fd68ede85ccf631ca0fa9c942d18f5eeliubolun 21762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorNone; 21862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 21962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 22062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::GetParamVideoVp8(OMX_PTR pStructure) { 22162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_ERRORTYPE ret; 22262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_VIDEO_PARAM_VP8TYPE *p = (OMX_VIDEO_PARAM_VP8TYPE*) pStructure; 22362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_TYPE_HEADER(p); 22462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_PORT_INDEX(p, OUTPORT_INDEX); 22562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 22662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying memcpy(p, &mParamVp8, sizeof(*p)); 22762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorNone; 22862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 22962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 23062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::SetParamVideoVp8(OMX_PTR pStructure) { 23162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_ERRORTYPE ret; 23262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_VIDEO_PARAM_VP8TYPE *p = (OMX_VIDEO_PARAM_VP8TYPE*) pStructure; 23362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_TYPE_HEADER(p); 23462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_PORT_INDEX(p, OUTPORT_INDEX); 23562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_SET_PARAM_STATE(); 23662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 23762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying memcpy(&mParamVp8, p, sizeof(mParamVp8)); 23862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorNone; 23962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 24062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 24162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::GetConfigVideoVp8ReferenceFrame(OMX_PTR pStructure) { 242cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun OMX_ERRORTYPE ret; 243cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun OMX_VIDEO_VP8REFERENCEFRAMETYPE *p = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*)pStructure; 244cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun CHECK_TYPE_HEADER(p); 245cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun CHECK_PORT_INDEX(p, OUTPORT_INDEX); 246cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun 247cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun memcpy(p, &mConfigVideoVp8ReferenceFrame, sizeof(*p)); 248cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun 24962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorNone; 25062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 25162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 25262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::SetConfigVideoVp8ReferenceFrame(OMX_PTR pStructure) { 25362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_ERRORTYPE ret; 25462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying Encode_Status retStatus = ENCODE_SUCCESS; 25562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying OMX_VIDEO_VP8REFERENCEFRAMETYPE *p = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) pStructure; 25662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_TYPE_HEADER(p); 25762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_PORT_INDEX(p, OUTPORT_INDEX); 25862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 25962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying CHECK_SET_CONFIG_STATE(); 26062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 261cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun VideoConfigVP8ReferenceFrame configVP8ReferenceFrame; 262cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun configVP8ReferenceFrame.no_ref_last = !p->bUsePreviousFrame; 263cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun configVP8ReferenceFrame.no_ref_gf = !p->bUseGoldenFrame; 264cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun configVP8ReferenceFrame.no_ref_arf = !p->bUseAlternateFrame; 265cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun configVP8ReferenceFrame.refresh_alternate_frame = p->bAlternateFrameRefresh; 266cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun configVP8ReferenceFrame.refresh_golden_frame = p->bGoldenFrameRefresh; 267cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun configVP8ReferenceFrame.refresh_last = p->bPreviousFrameRefresh; 26862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 269cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun retStatus = mVideoEncoder->setConfig(&configVP8ReferenceFrame); 27062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying if(retStatus != ENCODE_SUCCESS) { 2718b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun LOGW("Failed to set reference frame"); 27262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying } 27362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying return OMX_ErrorNone; 27462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying} 27562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying 2760541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoEncoderVP8::GetConfigVp8MaxFrameSizeRatio(OMX_PTR) { 277a0f95d79fa654a816532eea0ee8868e56049847cliubolun 2788b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun return OMX_ErrorNone; 2798b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun} 2808b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun 281186cf3638a4f387568fe2590e81a1a8a23c054e4liubolunOMX_ERRORTYPE OMXVideoEncoderVP8::SetConfigVp8MaxFrameSizeRatio(OMX_PTR pStructure) { 2828b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun OMX_ERRORTYPE ret; 2838b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun Encode_Status retStatus = ENCODE_SUCCESS; 284186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun OMX_VIDEO_CONFIG_INTEL_VP8_MAX_FRAME_SIZE_RATIO *p = (OMX_VIDEO_CONFIG_INTEL_VP8_MAX_FRAME_SIZE_RATIO*)pStructure; 2858b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun CHECK_TYPE_HEADER(p); 2868b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun CHECK_PORT_INDEX(p, OUTPORT_INDEX); 2878b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun 2888b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun CHECK_SET_CONFIG_STATE(); 2898b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun 290186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun VideoConfigVP8MaxFrameSizeRatio configVP8MaxFrameSizeRatio; 291186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun configVP8MaxFrameSizeRatio.max_frame_size_ratio = p->nMaxFrameSizeRatio; 2928b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun 293186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun retStatus = mVideoEncoder->setConfig(&configVP8MaxFrameSizeRatio); 2948b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun if(retStatus != ENCODE_SUCCESS) { 295186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun LOGW("Failed to set vp8 max frame size ratio"); 2968b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun } 2978b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun 2988b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun return OMX_ErrorNone; 2998b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun} 300a0f95d79fa654a816532eea0ee8868e56049847cliubolun 3016333d6c9db604ad320f2c1d4baa7a51eb4883a78Liu BolunDECLARE_OMX_COMPONENT("OMX.Intel.VideoEncoder.VP8", "video_encoder.vp8", OMXVideoEncoderVP8); 302