bool EMRGBFilter::LoadSetting(EMProjectDataLoader* p_opLoader) { string test = p_opLoader -> LoadString(); if(test != "EMRGBFilter -") { return false; } m_vWidth = p_opLoader -> LoadInt(); m_vHeight = p_opLoader -> LoadInt(); m_vPadBytes = p_opLoader -> LoadInt(); m_vBpP = p_opLoader -> LoadInt(); m_vNewParameter = p_opLoader -> LoadFloat(); m_vRGB[0] = p_opLoader -> LoadFloat(); m_vRGB[1] = p_opLoader -> LoadFloat(); m_vRGB[2] = p_opLoader -> LoadFloat(); test = p_opLoader -> LoadString(); if(test != "- EMRGBFilter") { return false; } InitFilter(m_vWidth, m_vHeight, m_vBpP, m_vPadBytes, m_vNewParameter); SetExtendedSettings(m_vRGB); return true; }
bigtime_t EqualizerNode::GetFilterLatency(void) { if (fOutputMedia.destination == media_destination::null) return 0LL; BBufferGroup* test_group = new BBufferGroup(fOutputMedia.format.u.raw_audio.buffer_size, 1); BBuffer* buffer = test_group->RequestBuffer(fOutputMedia.format.u.raw_audio.buffer_size); buffer->Header()->type = B_MEDIA_RAW_AUDIO; buffer->Header()->size_used = fOutputMedia.format.u.raw_audio.buffer_size; bigtime_t begin = system_time(); FilterBuffer(buffer); bigtime_t latency = system_time() - begin; buffer->Recycle(); delete test_group; InitFilter(); return latency; }
void InitGyro(void) { // initialise A2D, needs a dry run to enable A2D(1); A2D(2); InitFilter(A2D(A2D_CHANNEL_FRONT),A2D(A2D_CHANNEL_SIDE)); // front and left AngleGyro = 0; }
FILTER *CreateFilterPO() { FILTER *fpPO; if(!(fpPO=(FILTER *)ALLOC(1,sizeof(FILTER)))) { return(NULL); } fpPO->ID = FILTER_ID; InitFilter(fpPO); return(fpPO); }
/* main function */ int main() { // empty buffers memset(inputimage, 0, HEIGHT*WIDTH*sizeof(unsigned char)); memset(outputimage, 0, HEIGHT*WIDTH*sizeof(unsigned char)); // read image(s) ReadImage("testpattern.raw", inputimage); InitFilter(); ProcessImage(inputimage, outputimage); WriteImage("smoothed.raw", outputimage); return 0; }
void EqualizerNode::Connect(status_t status, const media_source &src, const media_destination &dst, const media_format &format, char* name) { if (status < B_OK) { fOutputMedia.destination = media_destination::null; return; } strncpy(name, fOutputMedia.name, B_MEDIA_NAME_LENGTH); fOutputMedia.destination = dst; fFormat = format; media_node_id timeSource; FindLatencyFor(fOutputMedia.destination, &fDownstreamLatency, &timeSource); InitFilter(); fProcessLatency = GetFilterLatency(); SetEventLatency(fDownstreamLatency + fProcessLatency); if (fInputMedia.source != media_source::null) { SendLatencyChange(fInputMedia.source, fInputMedia.destination, EventLatency() + SchedulingLatency()); } bigtime_t duration = 0; int sample_size = (fFormat.u.raw_audio.format & 0xf) * fFormat.u.raw_audio.channel_count; if (fFormat.u.raw_audio.buffer_size > 0 && fFormat.u.raw_audio.frame_rate > 0 && sample_size > 0) { duration = (bigtime_t)(((fFormat.u.raw_audio.buffer_size / sample_size) / fFormat.u.raw_audio.frame_rate) * 1000000.0); } SetBufferDuration(duration); }
OMX_ERRORTYPE VideoFilter::ProcessDataBuffer() { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_U32 flags=0; if(bInReturnBufferState == OMX_TRUE) return OMX_ErrorNoMore; ret = ProcessInputBuffer(); if(ret == OMX_ErrorNotReady) return OMX_ErrorNone; if(ret != OMX_ErrorNone) return ret; ret = ProcessOutputBuffer(); if(ret != OMX_ErrorNone) return ret; FilterBufRetCode DecRet = FILTER_OK; DecRet = FilterOneBuffer(); if(DecRet & FILTER_INPUT_CONSUMED) { DecRet = (FilterBufRetCode)(DecRet & ~FILTER_INPUT_CONSUMED); ReturnInputBuffer(); } if(DecRet & FILTER_ONE_FRM_DECODED) { OMX_S32 nStuffSize; OMX_S32 nFrmSize; OMX_PTR pFrm; ret=GetDecBuffer(&pFrm, &nStuffSize, &nFrmSize); if(ret == OMX_ErrorNone) { LOG_DEBUG("%s: get one decoded frm: 0x%X(%d,%d) \n",__FUNCTION__,(int)pFrm,(int)nStuffSize,(int)nFrmSize); tsmSetFrmBoundary(hTsHandle, nStuffSize, nFrmSize, pFrm); } else { LOG_ERROR("%s: get decoded buffer failure !\n",__FUNCTION__); } DecRet = (FilterBufRetCode)(DecRet & ~FILTER_ONE_FRM_DECODED); } switch(DecRet & FILTER_FLAGS_MASK) { case FILTER_FLAG_CODEC_DATA: flags=OMX_BUFFERFLAG_CODECCONFIG; break; case FILTER_FLAG_NONKEY_FRAME: flags=OMX_BUFFERFLAG_ENDOFFRAME; break; case FILTER_FLAG_KEY_FRAME: flags=OMX_BUFFERFLAG_SYNCFRAME|OMX_BUFFERFLAG_ENDOFFRAME; break; default: flags=0; break; } DecRet = (FilterBufRetCode)(DecRet & ~FILTER_FLAGS_MASK); if(DecRet > 0) { LOG_DEBUG("DecRet: %d\n", DecRet); } switch(DecRet) { case FILTER_OK: break; case FILTER_NO_INPUT_BUFFER: if(pInBufferHdr != NULL) SetInputBuffer(pInBufferHdr->pBuffer + pInBufferHdr->nOffset, pInBufferHdr->nFilledLen, bLastInput); else bNeedInputBuffer = OMX_TRUE; break; case FILTER_NO_OUTPUT_BUFFER: bNeedOutBuffer = OMX_TRUE; break; case FILTER_DO_INIT: ret = InitFilter(); if(ret == OMX_ErrorNone) bInit = OMX_TRUE; break; case FILTER_LAST_OUTPUT: HandleLastOutput(flags); ret = OMX_ErrorNoMore; break; case FILTER_HAS_OUTPUT: { OMX_PTR pBuffer = NULL; OMX_S32 nOutSize=0; OMX_BUFFERHEADERTYPE *pBufferHdr = NULL; GetOutputBuffer(&pBuffer,&nOutSize); pBufferHdr = GetOutBufferHdrFromList(pBuffer); if(pBufferHdr != NULL) { pBufferHdr->nFlags = flags; pBufferHdr->nFilledLen = nOutSize;//pBufferHdr->nAllocLen; ReturnOutputBuffer(pBufferHdr,flags); } else { SetOutputBuffer(pBuffer); //still need to return it to vpu to avoid the frame is isolated in the pipeline LOG_ERROR("Can't find related bufferhdr with frame: %p\n", pBuffer); } } break; case FILTER_SKIP_OUTPUT: tsmGetFrmTs(hTsHandle, NULL); break; case FILTER_ERROR: SendEvent(OMX_EventError, OMX_ErrorStreamCorrupt, 0, NULL); ret=OMX_ErrorStreamCorrupt; break; default: break; } return ret; }
OMX_ERRORTYPE VideoFilter::ProcessDataBuffer() { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_U32 flags=0; if(bInReturnBufferState == OMX_TRUE) return OMX_ErrorNoMore; ret = ProcessInputBuffer(); if(ret == OMX_ErrorNotReady) return OMX_ErrorNone; if(ret != OMX_ErrorNone) return ret; ret = ProcessOutputBuffer(); if(ret != OMX_ErrorNone) return ret; FilterBufRetCode DecRet = FILTER_OK; DecRet = FilterOneBuffer(); if(DecRet & FILTER_INPUT_CONSUMED) { DecRet = (FilterBufRetCode)(DecRet & ~FILTER_INPUT_CONSUMED); ReturnInputBuffer(); } if(DecRet & FILTER_INPUT_CONSUMED_EXT_READ) { DecRet = (FilterBufRetCode)(DecRet & ~FILTER_INPUT_CONSUMED_EXT_READ); if(pInBufferHdr){ InBufferHdrList.Add(pInBufferHdr); pInBufferHdr = NULL; } else{ //for eos buffer with size=0, pInBufferHdr may be retured aleady before (in ProcessInputBuffer()) } } if(DecRet & FILTER_INPUT_CONSUMED_EXT_RETURN) { OMX_PTR ptr; DecRet = (FilterBufRetCode)(DecRet & ~FILTER_INPUT_CONSUMED_EXT_RETURN); GetReturnedInputDataPtr(&ptr); //since the list is FIFO, we needn't map ptr and pHdr if(InBufferHdrList.GetNodeCnt()>0){ OMX_BUFFERHEADERTYPE* pHdr; pHdr=InBufferHdrList.GetNode(0); if(pHdr==NULL){ LOG_ERROR("warning: get one null hdr from InBufferHdrList !\n"); } if(pHdr->pBuffer!=ptr){ LOG_ERROR("warning: the address doesn't match between ptr and pHdr->pBuffer !\n"); } InBufferHdrList.Remove(pHdr); ports[IN_PORT]->SendBuffer(pHdr); } else{ //this path is only for eos if((DecRet&FILTER_LAST_OUTPUT)==0){ LOG_ERROR("warning: the numbers between insert and get doesn't matched !\n"); } } } if(DecRet & FILTER_ONE_FRM_DECODED){ OMX_S32 nStuffSize; OMX_S32 nFrmSize; OMX_PTR pFrm; ret=GetDecBuffer(&pFrm, &nStuffSize, &nFrmSize); if(ret == OMX_ErrorNone){ LOG_DEBUG("%s: get one decoded frm: 0x%X(%d,%d) \n",__FUNCTION__,(int)pFrm,(int)nStuffSize,(int)nFrmSize); tsmSetFrmBoundary(hTsHandle, nStuffSize, nFrmSize, pFrm); } else{ LOG_ERROR("%s: get decoded buffer failure !\n",__FUNCTION__); } DecRet = (FilterBufRetCode)(DecRet & ~FILTER_ONE_FRM_DECODED); } switch(DecRet & FILTER_FLAGS_MASK) { case FILTER_FLAG_CODEC_DATA: flags=OMX_BUFFERFLAG_CODECCONFIG; break; case FILTER_FLAG_NONKEY_FRAME: flags=OMX_BUFFERFLAG_ENDOFFRAME; break; case FILTER_FLAG_KEY_FRAME: flags=OMX_BUFFERFLAG_SYNCFRAME|OMX_BUFFERFLAG_ENDOFFRAME; break; default: flags=0; break; } DecRet = (FilterBufRetCode)(DecRet & ~FILTER_FLAGS_MASK); if(DecRet > 0) { LOG_DEBUG("DecRet: %d\n", DecRet); } switch(DecRet) { case FILTER_OK: break; case FILTER_NO_INPUT_BUFFER: if(pInBufferHdr != NULL) SetInputBuffer(pInBufferHdr->pBuffer + pInBufferHdr->nOffset, pInBufferHdr->nFilledLen, bLastInput); else bNeedInputBuffer = OMX_TRUE; break; case FILTER_NO_OUTPUT_BUFFER: bNeedOutBuffer = OMX_TRUE; break; case FILTER_DO_INIT: ret = InitFilter(); if(ret == OMX_ErrorNone) bInit = OMX_TRUE; break; case FILTER_LAST_OUTPUT: HandleLastOutput(flags); ret = OMX_ErrorNoMore; break; case FILTER_HAS_OUTPUT: { OMX_PTR pBuffer = NULL; OMX_S32 nOutSize=0; OMX_BUFFERHEADERTYPE *pBufferHdr = NULL; GetOutputBuffer(&pBuffer,&nOutSize); if (nOutSize == 0) { nInvalidFrameCnt ++; if (nInvalidFrameCnt <= MOSAIC_COUNT) { SetOutputBuffer(pBuffer); //still need to return it to vpu to avoid the frame is isolated in the pipeline tsmGetFrmTs(hTsHandle, NULL); break; } } else { nInvalidFrameCnt = 0; } pBufferHdr = GetOutBufferHdrFromList(pBuffer); if(pBufferHdr != NULL) { pBufferHdr->nFlags = flags; pBufferHdr->nFilledLen = nOutSize;//pBufferHdr->nAllocLen; ReturnOutputBuffer(pBufferHdr,flags); } else{ SetOutputBuffer(pBuffer); //still need to return it to vpu to avoid the frame is isolated in the pipeline LOG_ERROR("Can't find related bufferhdr with frame: %p\n", pBuffer); } } break; case FILTER_SKIP_OUTPUT: tsmGetFrmTs(hTsHandle, NULL); break; case FILTER_ERROR: SendEvent(OMX_EventError, OMX_ErrorStreamCorrupt, 0, NULL); ret=OMX_ErrorStreamCorrupt; break; default: break; } return ret; }