Hi,
The task is as follows, you need to implement the transfer of H264 bitstream on the platform of DM6437.
The original image has a size of 704х448 in the format XDM_YUV_422ILE
The system configuration is as follows:
SYS/BIOS 6.41.4.54
NDK 2.24.3.35
XDAIS 7.21.1.07
xdctools_3_30_04_52
CODEC dm6446_h264enc_02_02_00_02
#define IMAGE_WIDTH_ENCODE 704
#define IMAGE_HEIGHT_ENCODE 448
params->encodingPreset = XDM_DEFAULT ;
params->rateControlPreset = IVIDEO_LOW_DELAY ;
params->dataEndianness = XDM_BYTE ;
params->maxInterFrameInterval = 1 ;
params->inputContentType = IVIDEO_PROGRESSIVE ;
params->reconChromaFormat = XDM_CHROMA_NA;
params->maxWidth = IMAGE_WIDTH_ENCODE;
params->maxHeight = IMAGE_HEIGHT_ENCODE;
params->maxFrameRate = 30000;
params->maxBitRate = 2048000;
params->inputChromaFormat = XDM_YUV_422ILE;
dynamicParams->inputWidth = params.maxWidth;
dynamicParams->inputHeight = params.maxHeight;
dynamicParams->refFrameRate = params.maxFrameRate ;
dynamicParams->targetFrameRate = params.maxFrameRate ;
dynamicParams->targetBitRate = params.maxBitRate ;
dynamicParams->generateHeader = XDM_ENCODE_AU ;
dynamicParams->captureWidth = 0 ;
dynamicParams->forceFrame = IVIDEO_NA_FRAME;
dynamicParams->mbDataFlag = 0;
dynamicParams->interFrameInterval = 1;
dynamicParams->intraFrameInterval = 30;
void H264_test(unsigned int *size, unsigned char **buffer)
{
IVIDENC1_Status status;
IVIDENC1_InArgs inArgs;
IVIDENC1_OutArgs outArgs;
IVIDENC1_Fxns *ividEncfxns = NULL;
XDAS_Int8 ii;
XDAS_Int8* pInputBuf [XDM_MAX_IO_BUFFERS];
XDAS_Int8* pOutputBuf [XDM_MAX_IO_BUFFERS];
IVIDEO1_BufDescIn inputBufDesc;
XDM_BufDesc outputBufDesc;
XDAS_UInt32 bytesGenerated;
XDAS_UInt32 frameCount;
XDAS_Int32 retVal;
XDAS_Int32 groupId, numAlgs;
IALG_Handle handleArray[NUM_ALGS];
IDMA3_Fxns* dmaFxns[NUM_ALGS];
TestApp_EnableCache();
setInitParams(¶ms);
params.size = sizeof(IVIDENC1_Params);
status.size = sizeof(IVIDENC1_Status);
dynamicParams.size = sizeof(IVIDENC1_DynamicParams);
inArgs.size = sizeof(IVIDENC1_InArgs);
outArgs.size = sizeof(IVIDENC1_OutArgs);
frameCount = 0;
printf("\nCreating Algorithm Instance...\n");
handle = (IALG_Handle)ALG_create ((IALG_Fxns *)&H264VENC_TI_IH264VENC, (IALG_Handle)NULL, (IALG_Params *) ¶ms);
if (handle == NULL)
{
printf("Failed to Create Instance...\n Exiting for this configuration..\n");
return;
}
ividEncfxns = (IVIDENC1_Fxns *)handle->fxns;
printf("\nAlgorithm Instance Creation Done...\n");
qdma_setup();
#ifdef ENABLE_DMAN3
DMAN3_PARAMS.paRamBaseIndex = DMAN3_PARAMBASE_H264;
DMAN3_PARAMS.numQdmaChannels = DMAN3_TOTALCHANNELS_H264;
DMAN3_PARAMS.qdmaChannels = DMAN3_QDMA_CHANNELS_H264;
DMAN3_PARAMS.numPaRamEntries = DMAN3_NUMPARAMENTRIES_H264;
numAlgs = NUM_ALGS;
groupId = 0;
DMAN3_PARAMS.numPaRamGroup[groupId] = DMAN3_NUMPARAMENTRIES_H264;
DMAN3_init();
handleArray[0] = (IALG_Handle) handle;
dmaFxns[0] = &H264VENC_TI_IDMA3;
if (DMAN3_grantDmaChannels(groupId, handleArray, dmaFxns, numAlgs) != DMAN3_SOK)
{
printf("Problem adding algorithm's dma resources");
printf("... Exiting for this configuration... \n");
return;
}
#endif
setDynamicParams(&dynamicParams);
inputBufDesc.bufDesc[0].buf = (XDAS_Int8 *)pInputBuf;
outputBufDesc.bufs= (XDAS_Int8 **)pOutputBuf;
handle->fxns->algActivate(handle);
ividEncfxns->control((IVIDENC1_Handle)handle,
XDM_GETBUFINFO,
(IVIDENC1_DynamicParams *)&dynamicParams,
(IVIDENC1_Status *)&status);
handle->fxns->algDeactivate(handle);
inputBufDesc.numBufs = status.bufInfo.minNumInBufs;
inputBufDesc.bufDesc[0].buf = inputData;
inputBufDesc.bufDesc[0].bufSize = status.bufInfo.minInBufSize[0];
for(ii=0; ii < (status.bufInfo.minNumInBufs - 1); ii++)
{
inputBufDesc.bufDesc[ii+1].buf = inputBufDesc.bufDesc[ii].buf +
status.bufInfo.minInBufSize[ii];
inputBufDesc.bufDesc[ii+1].bufSize =
status.bufInfo.minInBufSize[ii +1];
}
outputBufDesc.numBufs = status.bufInfo.minNumOutBufs;
outputBufDesc.bufs[0] = outputData;
outputBufDesc.bufSizes[0] = status.bufInfo.minOutBufSize[0];
for(ii=0; ii< (status.bufInfo.minNumOutBufs-1); ii++)
{
outputBufDesc.bufs[ii+1] = outputBufDesc.bufs[ii] +
status.bufInfo.minOutBufSize[ii];
outputBufDesc.bufSizes[ii+1] =
status.bufInfo.minOutBufSize[ii+1];
}
ividEncfxns = (IVIDENC1_Fxns *)handle->fxns;
bytesGenerated = 0;
inputBufDesc.frameWidth = IMAGE_WIDTH_ENCODE;
inputBufDesc.frameHeight = IMAGE_HEIGHT_ENCODE;
inputBufDesc.framePitch = IMAGE_WIDTH_ENCODE*2;
memset(outputData, 0x00, sizeof(outputData));
memset(inputData, 0x00, sizeof(inputData));
memset(outputFile, 0x00, sizeof(outputFile));
do
{
if(get_crop_frame())
{
memcpy(inputData, get_crop_frame()->img_data, IMAGE_WIDTH_ENCODE*IMAGE_HEIGHT_ENCODE*2);
memset(inputData, k * 0x10, sizeof(inputData));
inputBufDesc.numBufs = 1;
inputBufDesc.bufDesc[0].buf = inputData;
inputBufDesc.bufDesc[0].bufSize = IMAGE_WIDTH_ENCODE*IMAGE_HEIGHT_ENCODE*2;
BCACHE_wbInv(inputBufDesc.bufDesc[0].buf,
inputBufDesc.bufDesc[0].bufSize,
TRUE);
}
BCACHE_wbInvAll(); /* No need to call BCACHE_wait() */
handle->fxns->algActivate(handle);
int code = ividEncfxns->control((IVIDENC1_Handle)handle, XDM_SETPARAMS,
(IVIDENC1_DynamicParams *)&dynamicParams, (IVIDENC1_Status *)&status);
if(status.extendedError == 0)
{
retVal = ividEncfxns->process((IVIDENC1_Handle)handle,
(IVIDEO1_BufDescIn *)&inputBufDesc,
(XDM_BufDesc *)&outputBufDesc,
(IVIDENC1_InArgs *)&inArgs,
(IVIDENC1_OutArgs *)&outArgs);
}
else
{
retVal = XDM_EFAIL;
}
printf("Process: %d %d\n", status.extendedError, retVal);
if(retVal == XDM_EFAIL)
{
printf("Process function returned an Error... \n");
printf("Exiting with error code %0x... \n",
outArgs.extendedError);
break;
}
ividEncfxns->control((IVIDENC1_Handle)handle,
XDM_GETSTATUS,
(IVIDENC1_DynamicParams *)&dynamicParams,
(IVIDENC1_Status *)&status);
handle->fxns->algDeactivate(handle);
BCACHE_wbInvAll(); /* No need to call BCACHE_wait() */
if(outArgs.reconBufs.numBufs)
{
printf("Encoded Frame # %d \n", frameCount);
printf("#bytesGenerated: %d\n", outArgs.bytesGenerated);
frameCount++;
}
memcpy(&outputFile[bytesGenerated], outArgs.encodedBuf.buf, outArgs.bytesGenerated);
bytesGenerated += outArgs.bytesGenerated;
if (frameCount >= framesToEncode)
{
printf("Specified number of Frames Encoded...\n");
break;
}
} while(1);
printf("all bytesGenerated: %d\n", bytesGenerated);
*size = bytesGenerated;
*buffer = (unsigned char*)&outputFile[0];
#ifdef ENABLE_DMAN3
if (DMAN3_releaseDmaChannels( handleArray, dmaFxns, numAlgs) != DMAN3_SOK)
{
printf("Problem removing algorithm's dma resources...\n" );
printf("Exiting for this configuration... ");
return;
}
DMAN3_exit();
#endif //C6000
ALG_delete (handle);
if(frameCount == 0)
{
frameCount = 1;
}
printf("-------------- SUMMARY --------------------\n");
printf(" Total number of Frames = %d\n",
(XDAS_UInt32)frameCount);
printf(" Bit Rate at %d frames/Sec = %d Kbps\n",params.maxFrameRate,(
XDAS_UInt32)(((bytesGenerated*8*params.maxFrameRate)/frameCount)/1000));
printf(" Width and Height = %d, %d \n",
dynamicParams.inputWidth, dynamicParams.inputHeight);
printf (" -------------- END --------------------\n");
}
The output of the codec is as follows:
Creating Algorithm Instance...
Algorithm Instance Creation Done...
Process: 0 0
Encoded Frame # 0
#bytesGenerated: 295756
Process: 0 0
Encoded Frame # 1
#bytesGenerated: 279736
Specified number of Frames Encoded...
all bytesGenerated: 575492
-------------- SUMMARY --------------------
Total number of Frames = 2
Bit Rate at 1000 frames/Sec = 154484 Kbps
Width and Height = 704, 448
-------------- END --------------------
How can the situation be remedied?