📄 exolvidpip.c
字号:
ptsaDefaultCapabilities_t pDefaultCap2, ptsaDefaultInstanceSetup_t pDefaultSetup2, int ReceiverIndex, ptmVideoFormat_t pSetupFormat, int NrPackets, tmmlMmspHandle_t hMemSpace, ptsaInOutDescriptor_t* ppIoDescr){ tmErrorCode_t tmError = TM_OK; ptsaInOutDescriptorSetup_t pIodSetup=Null; UInt32 NrBuffers=0; UInt32 BufferSize=0; int i; DBG_PRINT((dbgexolVidPip, DBG_INTERFACE_ENTER, "exolVidPipCreateIoDescr" )); DBG_ASSERT2((pDefaultCap1 != 0),("exolVidPipCreateIoDescr pDefaultCap1 Null")); DBG_ASSERT2((pDefaultCap2 != 0),("exolVidPipCreateIoDescr pDefaultCap2 Null")); DBG_ASSERT2((ppIoDescr != 0),("exolVidPipCreateIoDescr ppIoDescr Null")); DBG_ASSERT2((pSetupFormat != 0),("exolVidPipCreateIoDescr pSetupFormat Null")); tmError = tmVideoUtilGetFormatNrBuffers( pSetupFormat, //const Void * pFormat, // I: av format &NrBuffers); //pUInt32 pNrBuffers // O: nr buffers this format uses. DBG_ASSERT2((tmError == TM_OK),("tmVideoUtilGetFormatNrBuffers failed:0x%X\n",tmError)); /*-----------------------------------------------------------------------*/ /* Create InOutDescriptors */ /*-----------------------------------------------------------------------*/ //pIodSetup = (ptsaInOutDescriptorSetup_t)malloc((sizeof(tsaInOutDescriptorSetup_t)) + (NrBuffers - 1) * sizeof(UInt32)); tmError = tmmlMalloc( hMemSpace, sizeof(tsaInOutDescriptorSetup_t) + 8, (pVoid*)&pIodSetup,tmmlMallocCacheAligned | tmmlMallocCleared); pIodSetup->format = Null; //(ptmAvFormat_t)pSetupFormat; //Null; // using Null format let us change the format afterwards pIodSetup->flags = tsaIODescSetupFlagCacheMalloc | tsaIODescSetupFlagInvalidateDataout; pIodSetup->fullQName = "A0IF"; pIodSetup->emptyQName = "A0IE"; pIodSetup->queueFlags = 0; pIodSetup->senderCap = pDefaultCap1; //ivp->pVcapVipCap->defaultCapabilities; pIodSetup->receiverCap = pDefaultCap2; //ivp->pVrendGfxVoCap->defaultCapabilities; pIodSetup->senderIndex = SenderIndex; //VCAPVIP2_MAIN_OUTPUT; pIodSetup->receiverIndex = ReceiverIndex; //VRENDGFXVO_MAIN_INPUT; pIodSetup->packetBase = 0xF40; pIodSetup->numberOfPackets = NrPackets; DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "Allocating iodescr buffers:" )); for(i=0;i < NrBuffers;i++) { tmError = tmVideoUtilGetFormatBufferSize( pSetupFormat, //const Void * pFormat, // I: av format i, //UInt32 bufferNr, // I: buffer index &BufferSize); //pUInt32 pBufferSize // O: size of buffer. DBG_ASSERT2((tmError == TM_OK),("tmVideoUtilGetFormatBufferSize failed:0x%X\n",tmError)); pIodSetup->bufSize[i] = BufferSize; //768 * 576 * 2; DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "Buffer %d size: %d",i,BufferSize )); } pIodSetup->numberOfBuffers = NrBuffers; // create IO descriptor DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "Creating IO descriptor..." )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->format:0x%X",pIodSetup->format )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->format->size:%d",pSetupFormat->size )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->format->dataClass:%d",pSetupFormat->dataClass )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->format->dataType:0x%X",pSetupFormat->dataType )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->format->dataSubtype:0x%X",pSetupFormat->dataSubtype )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->format->description:0x%X",pSetupFormat->description )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->senderCap:0x%X",pIodSetup->senderCap )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->receiverCap:0x%X",pIodSetup->receiverCap )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->senderIndex:%d",pIodSetup->senderIndex )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->receiverIndex:%d",pIodSetup->receiverIndex )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->numberOfPackets:%d",pIodSetup->numberOfPackets )); DBG_PRINT((dbgexolVidPip, DBG_LEVEL_1, "pIodSetup->numberOfBuffers:%d",pIodSetup->numberOfBuffers )); tmError = tsaDefaultInOutDescriptorCreateInMmsp( ppIoDescr, pIodSetup, hMemSpace, tmmlMallocCacheAligned | tmmlMallocCleared); DBG_ASSERT2((tmError == TM_OK),("tsaDefaultInOutDescriptorCreate failed:0x%X\n",tmError)); tmmlFree(pIodSetup); pIodSetup=Null; /*-----------------------------------------------------------------------*/ /* Install Format */ /*-----------------------------------------------------------------------*/ tmError = tsaDefaultSenderReconnect(*ppIoDescr, SenderIndex, pDefaultCap1, NULL); DBG_ASSERT2((tmError == TM_OK),("tsaDefaultSenderReconnect failed:0x%X\n",tmError)); tmError = tsaDefaultReceiverReconnect(*ppIoDescr, ReceiverIndex, pDefaultCap2); DBG_ASSERT2((tmError == TM_OK),("tsaDefaultReceiverReconnect failed:0x%X\n",tmError)); if(pDefaultSetup1) pDefaultSetup1->outputDescriptors[SenderIndex] = *ppIoDescr; if(pDefaultSetup2) pDefaultSetup2->inputDescriptors[ReceiverIndex] = *ppIoDescr; tmError = tsaDefaultInstallFormat(*ppIoDescr,(ptmAvFormat_t) pSetupFormat); DBG_ASSERT2((tmError == TM_OK),("tsaDefaultInstallFormat failed:0x%X\n",tmError)); DBG_PRINT((dbgexolVidPip, DBG_INTERFACE_LEAVE, "exolVidPipCreateIoDescr" )); return tmError;}
//-----------------------------------------------------------------------------// FUNCTION: RunVip://// DESCRIPTION: This function does// set input format// set src rect// set dst rect//// RETURN: tmErrorCode_t//// NOTES: None//-----------------------------------------------------------------------------//void RunVip(exolVidPipInstance_t* ivp){ tmErrorCode_t tmError = TM_OK; ptmVideoFormat_t pInputFormat=&ivp->InputFormat; ptmVideoFormat_t pOutputFormat=&ivp->OutputFormat; UInt32 VrendGfxVoFlags=0; tsaInOutDescriptorTeeSetup_t ioteesetup;
ptsaInOutDescriptorTeeSetup_t pioteesetup=&ioteesetup;
tmError=tmError;
DBG_PRINT((dbgexolVidPip, DBG_INTERFACE_ENTER, "RunVip" )); /*-----------------------------------------------------------------------*/ /* Get Capabilities */ /*-----------------------------------------------------------------------*/ tmError = tmolVrendGfxVoGetCapabilities(&ivp->pVrendGfxVoCap); DBG_ASSERT2((tmError == TM_OK),("tmolVrendGfxVoGetCapabilities failed:0x%X\n",tmError)); tmError = tmolVcapVip2_GetCapabilities(&ivp->pVcapVipCap); DBG_ASSERT2((tmError == TM_OK),("tmolVcapVipGetCapabilities failed:0x%X\n",tmError)); /*-----------------------------------------------------------------------*/ /* Create IoDescr for Video */ /*-----------------------------------------------------------------------*/
pInputFormat->description = vdfFieldInField;
tmError = exolVidPipCreateIoDescr( ivp->pVcapVipCap->pDefCapabilities, Null, VCAPVIP2_MAIN_OUTPUT, ivp->pVrendGfxVoCap->defaultCapabilities, Null, VRENDGFXVO_MAIN_INPUT, pInputFormat, 12, // DS#5117 6, // vip=2 (dbl buff) gfxvo=3 (3FMS Dei) +1 que ivp->hInstMemSpace, &ivp->pVipToRend1InIod); DBG_ASSERT2((tmError == TM_OK),("exolVidPipCreateIoDescr failed:0x%X\n",tmError));
// Create Tee for second renderer input
// Creating InOutDescriptorsTee
pioteesetup->flags = tsaIODescSetupFlagNone;
pioteesetup->fullQName = "CWFT";
pioteesetup->emptyQName = "CWET";
pioteesetup->queueFlags = 0;
pioteesetup->receiverCap = ivp->pVrendGfxVoCap->defaultCapabilities;
pioteesetup->receiverIndex = VRENDGFXVO_SECOND_INPUT;
pioteesetup->packetBase = 0xC00;
pioteesetup->bCopyData = False;
tmError = tsaDefaultInOutDescriptorCreateTee(&ivp->pVipToRend2InIod, pioteesetup, ivp->pVipToRend1InIod);
DBG_ASSERT2((tmError == TM_OK),("tsaDefaultInOutDescriptorCreateTee failed:0x%X\n",tmError));
/* calculation for io descr packets: between Vip -> GfxVo (buffertype: FieldInField) Vip needs 2 packets in interlaced, dubble buffer mode GfxVo needs 1 packet in interlaced display mode 2 packets when progressive & 2 Field deinterlacing 3 packets when progressive & 3 Field deinterlacing 1 packet in the queue */
/*-----------------------------------------------------------------------*/ /* Setup Components */ /*-----------------------------------------------------------------------*/ /* ------------------------ Setup Video -------------------------------- */ tmError = exolVidPipSetupVcapVip( ivp, pInputFormat, ivp->pVipToRend1InIod); DBG_ASSERT2((tmError == TM_OK),("exolVidPipSetupVcapVip failed:0x%X\n",tmError));
if(ivp->pipWindow)
{ VrendGfxVoFlags = exolVidPipSetup_UseLayer0 | exolVidPipSetup_NeedBuffer0|
exolVidPipSetup_UseLayer1 | exolVidPipSetup_NeedBuffer1|
exolVidPipSetup_HorizontalScalingInQvcp1;
tmError = exolVidPipSetupVrendGfxVo( ivp,
pOutputFormat,
ivp->pVipToRend1InIod,
ivp->pVipToRend2InIod,
VrendGfxVoFlags); //exolVidPipSetup_UseLayer0 | exolVidPipSetup_NeedBuffer0 );
// when using progressive output modes always need buffer
DBG_ASSERT2((tmError == TM_OK),("exolVidPipSetupVrendGfxVo failed:0x%X\n",tmError));
}
else
{
VrendGfxVoFlags = exolVidPipSetup_UseLayer0 | exolVidPipSetup_NeedBuffer0;
tmError = exolVidPipSetupVrendGfxVo( ivp,
pOutputFormat,
ivp->pVipToRend1InIod,
Null,
VrendGfxVoFlags); //exolVidPipSetup_UseLayer0 | exolVidPipSetup_NeedBuffer0 );
// when using progressive output modes always need buffer
DBG_ASSERT2((tmError == TM_OK),("exolVidPipSetupVrendGfxVo failed:0x%X\n",tmError));
}
/*-----------------------------------------------------------------------*/ /* Start Components */ /*-----------------------------------------------------------------------*/ /* now everything is ready: Start all components. */ tmError = tmolVcapVip2_Start(ivp->hVcapVip); DBG_ASSERT2((tmError == TM_OK),("tmolVcapVip2_Start failed:0x%X\n",tmError)); tmError = tmolVrendGfxVoStart(ivp->hVrendGfxVo); DBG_ASSERT2((tmError == TM_OK),("tmolVrendGfxVoStart failed:0x%X\n",tmError)); // really dirty trick to get 2nd pattern (works on Nref) if(ivp->InternalTestPattern == 2 ) { MMIO(0x106104) |= 0xc000000 ; } /*-----------------------------------------------------------------------*/ // Vip is now running tmError = doVipSubMenu(ivp); DBG_ASSERT2((tmError == TM_OK),("doTest failed:0x%X\n",tmError)); /*-----------------------------------------------------------------------*/ /* Stop and close Components */ /*-----------------------------------------------------------------------*/ /* --- Stop video --- */ // from left to right tmError = tmolVcapVip2_Stop(ivp->hVcapVip); DBG_ASSERT2((tmError == TM_OK),("tmolVcapVip2_Stop failed:0x%X\n",tmError)); tmError = tmolVcapVip2_Close(ivp->hVcapVip); DBG_ASSERT2((tmError == TM_OK),("tmolVcapVip2_Close failed:0x%X\n",tmError));
tmError = tmVdecAna_Close(ivp->decInstance);
DBG_ASSERT2((tmError == TM_OK),("tmVdecAna_Close failed:0x%X\n",tmError));
tmError = tmolVrendGfxVoStop(ivp->hVrendGfxVo); DBG_ASSERT2((tmError == TM_OK),("tmolVrendGfxVoStop failed:0x%X\n",tmError)); tmError = tmolVrendGfxVoClose(ivp->hVrendGfxVo); DBG_ASSERT2((tmError == TM_OK),("tmolVrendGfxVoClose failed:0x%X\n",tmError)); if(ivp->AnalogVideoEncoder) { tmError = tmVencAna_Close(ivp->pVencAnaInst); DBG_ASSERT2((tmError == TM_OK),("tmolVrendGfxVoClose failed:0x%X\n",tmError)); } /*-----------------------------------------------------------------------*/ /* Destroy io Descriptor */ /*-----------------------------------------------------------------------*/ /* Destroy InOutDescriptors */
tmError = tsaDefaultInOutDescriptorDestroyTee(ivp->pVipToRend2InIod, ivp->pVipToRend1InIod);
DBG_ASSERT2((tmError == TM_OK),("tsaDefaultInOutDescriptorDestroyTee failed:0x%X\n",tmError));
tmError = tsaDefaultInOutDescriptorDestroy(ivp->pVipToRend1InIod); DBG_ASSERT2((tmError == TM_OK),("tsaDefaultInOutDescriptorDestroy failed:0x%X\n",tmError)); DBG_PRINT((dbgexolVidPip, DBG_INTERFACE_LEAVE, "RunVip" )); return;}//-----------------------------------------------------------------------------// FUNCTION: doVipSubMenu://// DESCRIPTION: This function does// set input format// set src rect// set dst rect//// RETURN: tmErrorCode_t//// NOTES: None//-----------------------------------------------------------------------------//static tmErrorCode_tdoVipSubMenu(exolVidPipInstance_t* ivp) // instance pointer{ tmErrorCode_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -