I'm having some trouble trying to increase the quality of the video on
my dm355 design. In particular I am trying to manipulate the initQ
parameter in IMP4ENC_Params structure, along with some others.
Initially these changes that I have attached to the demo code for
video.c worked on one of my boards - but SEGFAULT'ed on another. This
other board also happened to have more available memory, but I'm not
sure that is the real problem.
Right now this code runs past the ALG_create call, but dies somewhere
else - gdb isn't helping since it just hangs when I try to breakpoint
the routine.
If anybody could help by taking a look and letting me know what I'm
potentially doing wrong - that would be much appreciated.
Thanks!
Steve
/******************************************************************************
* videoEncodeAlgCreate
******************************************************************************/
static int videoEncodeAlgCreate(Engine_Handle hEngine,
VIDENC1_Handle *hEncodePtr,
VideoEncoder videoEncoder,
int width, int height, int bitrate)
{
VIDENC1_DynamicParams dynamicParams;
VIDENC1_Status encStatus;
VIDENC1_Params params;
IMP4VENC_Params ext_params;
XDAS_Int32 status;
// IVIDENC1 status;
char *algName;
VIDENC1_Handle hEncode;
IALG_Fxns *ividEncfxns;
algName = videoEncodeAlgNames[videoEncoder];
params.size = sizeof(VIDENC1_Params);
params.encodingPreset = XDM_DEFAULT;
//XXX params.rateControlPreset = bitrate < 0 ? IVIDEO_NONE :
IVIDEO_LOW_DELAY;
params.rateControlPreset = bitrate < 0 ? IVIDEO_NONE :
IVIDEO_STORAGE;
params.maxHeight = height;
params.maxWidth = width;
params.maxFrameRate = gblGetYFactor() == NTSCSTD ? 30000 :
25000;
params.maxBitRate = bitrate < 0 ? 0 : bitrate;
params.inputChromaFormat = XDM_YUV_422ILE;
params.dataEndianness = XDM_BYTE;
params.maxInterFrameInterval = 0;
params.inputContentType = IVIDEO_PROGRESSIVE;
// Set the create time extended parameters
// These parameters are for the highest quality picture...
ext_params.videncParams = params;
ext_params.subWindowHeight = 480;
ext_params.subWindowWidth = 720;
ext_params.intraFrameInterval = 0; // I frame only
ext_params.intraDcVlcThr = XDM_DEFAULT;
ext_params.rotation = XDM_DEFAULT;
ext_params.intraThres = 192;
ext_params.intraAlgo = DM355_MPEG4E_INTRA_INTER_DECISION_HQ_LP;
ext_params.numMBRows = 5;
ext_params.initQ = 30; // MAX quality!!
ext_params.rcQ_MAX = 31;
ext_params.rcQ_MIN = 1;
ext_params.rateFix = XDM_DEFAULT;
ext_params.rateFixRange = 4;
ext_params.VBV_size = 10000;
ext_params.InitQ_P = 4;
ext_params.meRange = 31;
ext_params.meAlgo = DM355_MPEG4E_ME_HQ_LP;
ext_params.SkipMBAlgo = DM355_MPEG4E_SKIP_MB_HQ_LP;
ext_params.UMV = DM355_MPEG4E_UMV_HQ_LP;
ext_params.IIDC = DM355_MPEG4E_INTRA_INTER_BLK_SIZE_HQ_LP;
#if 0
hEncode = (VIDENC1_Handle) ALG_create(1, (IALG_Fxns *)&
MP4VENC_TI_IMP4VENC,
(IALG_Handle) NULL,
(IALG_Params *) & ext_params);
#else
/* Create video encoder instance */
hEncode = VIDENC1_create(hEngine, algName, ¶ms);
#endif
if (hEncode == NULL) {
ERR("Failed to open video encode algorithm: %s (0x%x)\n",
algName, Engine_getLastError(hEngine));
return FAILURE;
}
dynamicParams.size = sizeof(VIDENC1_DynamicParams);
dynamicParams.inputHeight = height;
dynamicParams.inputWidth = width;
dynamicParams.targetBitRate = bitrate < 0 ? 0 : bitrate;
// dynamicParams.intraFrameInterval = 30;
dynamicParams.intraFrameInterval = 0; // I frame only
dynamicParams.generateHeader = XDM_ENCODE_AU;
dynamicParams.captureWidth = 0;
//XXX dynamicParams.forceIFrame = 0;
if (gblGetYFactor() == NTSCSTD) {
dynamicParams.targetFrameRate = 30000;
dynamicParams.refFrameRate = 30000;
}
else {
dynamicParams.targetFrameRate = 25000;
dynamicParams.refFrameRate = 25000;
}
/* Set video encoder dynamic parameters */
encStatus.size = sizeof(VIDENC1_Status);
encStatus.data.buf = NULL;
/* Set Dynamic Params */
#if 0
ividEncfxns = (IALG_Fxns *)hEncode->fxns ;
status = ividEncfxns->algControl((VIDENC1_Handle)hEncode, XDM_SETPARAMS,
(VIDENC1_DynamicParams *)& ext_params,
(VIDENC1_Status *)&encStatus);
#endif
status = VIDENC1_control((VIDENC1_Handle)hEncode, XDM_SETPARAMS,
&dynamicParams,
&encStatus);
if (status != VIDENC1_EOK) {
ERR("XDM_SETPARAMS failed, status=%ld\n", status);
return FAILURE;
}
*hEncodePtr = hEncode;
return SUCCESS;
}
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source