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, &params);
#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

Reply via email to