This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Jpeg Quality

Other Parts Discussed in Thread: DM8107

Hi, all!

       My version: DM8168, DVRRDK_04.00.00.03

       I get yuv420sp from nfs  and jpeg from encode, the I convert yuv420sp to bmp using my C code. I find that Jpeg qaulity is lower than bmp.  Then I view the code mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c, I changed value of qp, but it didn't work.

      My question: How can I get a high quality jpeg, which parameter can do it ?

 Thanks a lot.

  • The JPEG encoder version used in DVRRDK is old. You can migrate to REL.500.V.MJPEG.E.IVAHD.01.00.14.00 encoder release which supports setting of targetBitrate, quality factor and selection of rate control algorithm.

    You can get the latest encoder package from TI FAE.

    It requires some changes in encLink to integrate new JPEG encoder. Once you have the encoder release we wiil share patch with required encLink changes.

  • Hi, Badri Narayanan!

          Thank you for your reply!

           I get new REL.500.V.MJPEG.E.IVAHD.01.00.14.00  from TI that supports 8k*8k resolution , and now I have gotten a 4896*4096 jpeg sucessfully.

          Shall you share me your patch  with required encLink changes ? 

          Thank you!

  • Hi,

    Please refer to patch : 

    diff --git a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c
    index 3ba1217..4ce645f 100755
    --- a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c
    +++ b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c
    @@ -203,9 +203,11 @@ static Int enclink_jpeg_set_static_params(IJPEGVENC_Params * staticParams,
         /* Initialize default values for static params */
         *staticParams = JPEGVENC_TI_PARAMS;
     
    -    staticParams->videnc2Params.maxHeight = algCreateParams->maxHeight;
    +    staticParams->videnc2Params.maxHeight =
    +                  VpsUtils_align(algCreateParams->maxHeight, 2);
     
    -    staticParams->videnc2Params.maxWidth = algCreateParams->maxWidth;
    +    staticParams->videnc2Params.maxWidth =
    +                  VpsUtils_align(algCreateParams->maxWidth, 16);
     
         staticParams->videnc2Params.maxInterFrameInterval = NULL;
         staticParams->videnc2Params.inputContentType = IVIDEO_PROGRESSIVE;
    @@ -219,6 +221,10 @@ static Int enclink_jpeg_set_static_params(IJPEGVENC_Params * staticParams,
     
         staticParams->videnc2Params.numInputDataUnits = 1;
         staticParams->videnc2Params.numOutputDataUnits = 1;
    +
    +    staticParams->videnc2Params.rateControlPreset = IVIDEO_USER_DEFINED;
    +    staticParams->rateControlParams.rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_DEFAULT;
    +
         return 0;
     }
     
    @@ -457,6 +463,33 @@ static Int enclink_jpeg_set_dynamic_params(IJPEGVENC_DynamicParams *
             algDynamicParams->refFrameRate;
         dynamicParams->videnc2DynamicParams.ignoreOutbufSizeFlag = XDAS_FALSE;
     
    +    dynamicParams->qualityFactor = (algDynamicParams->qpInitI==-1)?
    +						JPEG_QUALITYFACTOR_DEFAULT:algDynamicParams->qpInitI;
    +
    +	/* Rate control params */
    +	if (algDynamicParams->qpInitI != -1)
    +	{
    +        dynamicParams->rateControlParams.rateControlParamsPreset
    +            = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED;
    +        dynamicParams->rateControlParams.qpMinI = algDynamicParams->qpMinI;
    +        dynamicParams->rateControlParams.qpMaxI = algDynamicParams->qpMaxI;
    +        dynamicParams->rateControlParams.qpI    = algDynamicParams->qpInitI;
    +    }
    +    dynamicParams->rateControlParams.rcAlgo = algDynamicParams->rcAlg;
    +    if(algDynamicParams->rcAlg == IJPEGVENC_RATECONTROL_CBR_LOW_DELAY)
    +    {
    +        dynamicParams->rateControlParams.HRDBufferSize =
    +            algDynamicParams->targetBitRate / 2;
    +        dynamicParams->rateControlParams.initialBufferLevel =
    +            algDynamicParams->targetBitRate / 2;
    +    }
    +    else {
    +        dynamicParams->rateControlParams.HRDBufferSize =
    +            algDynamicParams->targetBitRate * 2;
    +        dynamicParams->rateControlParams.initialBufferLevel =
    +            algDynamicParams->targetBitRate * 2;
    +    }
    +
         return 0;
     }
     
    @@ -629,9 +662,26 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj)
         /* Set the modified encoder bitRate value */
         if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_BITRATE) & 0x1)
         {
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +            rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED;
     
             algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams.
                 targetBitRate = algObj->algDynamicParams.targetBitRate;
    +
    +        if (algObj->algDynamicParams.rcAlg == IJPEGVENC_RATECONTROL_CBR_LOW_DELAY) {
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                HRDBufferSize = algObj->algDynamicParams.targetBitRate / 2;
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                initialBufferLevel = algObj->algDynamicParams.targetBitRate / 2;
    +        }
    +        else
    +        {
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                HRDBufferSize = algObj->algDynamicParams.targetBitRate * 2;
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                initialBufferLevel = algObj->algDynamicParams.targetBitRate * 2;
    +        }
    +
             #ifdef SYSTEM_VERBOSE_PRINTS
             Vps_printf("\n ENCLINK: new targetbitrate to set:%d \n",
                        algObj->algDynamicParams.targetBitRate);
    @@ -648,6 +698,8 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj)
             algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams.
                 targetFrameRate = algObj->algDynamicParams.targetFrameRate;
             algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams.
    +                refFrameRate  = algObj->algDynamicParams.refFrameRate;
    +        algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams.
                 targetBitRate = algObj->algDynamicParams.targetBitRate;
             #ifdef SYSTEM_VERBOSE_PRINTS
             Vps_printf("\n ENCLINK: new targetbitrate to set:%d \n",
    @@ -660,6 +712,25 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj)
             setConfigFlag = TRUE;
         }
     
    +    /* Set the modified Qualityfactor value for a jpeg Frame */
    +    if ((bitMask >>  ENC_LINK_SETCONFIG_BITMASK_QPI) & 0x1)
    +    {
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +            rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED;
    +
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.qpMinI 	= algObj->algDynamicParams.qpMinI;
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.qpMaxI 	= algObj->algDynamicParams.qpMaxI;
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.qpI 		= algObj->algDynamicParams.qpInitI;
    +
    +        #ifdef SYSTEM_VERBOSE_PRINTS
    +        Vps_printf("\n ENCLINK: new qualityFactor Param to set:%d\n",
    +                algObj->algDynamicParams.qpInitI);
    +        #endif
    +        algObj->setConfigBitMask &= (ENC_LINK_SETCONFIG_BITMASK_RESET_VALUE ^
    +                                    (1 << ENC_LINK_SETCONFIG_BITMASK_QPI));
    +        setConfigFlag = TRUE;
    +    }
    +	
         /* Set the modified encoder Intra Frame Interval(GOP) value */
         if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_INTRAI) & 0x1)
         {
    @@ -686,16 +757,50 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj)
             setConfigFlag = TRUE;
         }
     
    -    /* Set the modified Qualityfactor value for a jpeg Frame */
    -    if ((bitMask >>  ENC_LINK_SETCONFIG_BITMASK_QPI) & 0x1)
    +    /* Set the modified encoder rateControl value */
    +    if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_RCALGO) & 0x1)
         {
    -        algObj->u.jpegAlgIfObj.dynamicParams.qualityFactor = algObj->algDynamicParams.qpInitI;
    -        #ifdef SYSTEM_VERBOSE_PRINTS
    -        Vps_printf("\n ENCLINK: new qualityFactor Param to set:%d\n",
    -                algObj->algDynamicParams.qpInitI);
    -        #endif
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +            rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED;
    +
    +        algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams.
    +                targetBitRate = algObj->algDynamicParams.targetBitRate;
    +
    +        algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.rcAlgo =
    +                algObj->algDynamicParams.rcAlg;
    +
    +        /* 0=> VBR, 1=> CBR, 2=> OFF */
    +		if (algObj->algDynamicParams.rcAlg == IJPEGVENC_RATECONTROL_VBR_STORAGE)
    +        {
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                HRDBufferSize = algObj->algDynamicParams.targetBitRate * 2;
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                initialBufferLevel = algObj->algDynamicParams.targetBitRate * 2;
    +        }
    +        else if (algObj->algDynamicParams.rcAlg == IJPEGVENC_RATECONTROL_CBR_LOW_DELAY)
    +        {
    +          	algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                HRDBufferSize = algObj->algDynamicParams.targetBitRate / 2;
    +          	algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.
    +                initialBufferLevel = algObj->algDynamicParams.targetBitRate / 2;
    +        }
    +        else
    +        {	/* TURN OFF RC */
    +        	algObj->algDynamicParams.rcAlg = IJPEGVENC_RATECONTROL_DISABLE;
    +            algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.rcAlgo =
    +                IJPEGVENC_RATECONTROL_DISABLE;
    +
    +        	algObj->u.jpegAlgIfObj.dynamicParams.qualityFactor = algObj->algDynamicParams.qpInitI;
    +
    +			Vps_printf("\n JPGLINK: new qualityFactor Param to set:%d\n",
    +					algObj->algDynamicParams.qpInitI);
    +        }
    +
    +		Vps_printf("\n JPGLINK: new rate control algorithm  to set:%d for bitrate: %d\n",
    +			   algObj->algDynamicParams.rcAlg, algObj->algDynamicParams.targetBitRate);
    +
             algObj->setConfigBitMask &= (ENC_LINK_SETCONFIG_BITMASK_RESET_VALUE ^
    -                                    (1 << ENC_LINK_SETCONFIG_BITMASK_QPI));
    +                                     (1 << ENC_LINK_SETCONFIG_BITMASK_RCALGO));
             setConfigFlag = TRUE;
         }
     
    @@ -751,6 +856,16 @@ Int32 EncLinkJPEG_algGetConfig(EncLink_algObj * algObj)
                 status.videnc2Status.encDynamicParams.inputWidth;
             algObj->algDynamicParams.inputHeight =
                 status.videnc2Status.encDynamicParams.inputHeight;
    +        algObj->algDynamicParams.targetBitRate =
    +            status.videnc2Status.encDynamicParams.targetBitRate;
    +        algObj->algDynamicParams.targetFrameRate =
    +            status.videnc2Status.encDynamicParams.targetFrameRate;
    +        algObj->algDynamicParams.intraFrameInterval =
    +            status.videnc2Status.encDynamicParams.intraFrameInterval;
    +        algObj->algDynamicParams.forceFrame =
    +            status.videnc2Status.encDynamicParams.forceFrame;
    +        algObj->algDynamicParams.refFrameRate =
    +            status.videnc2Status.encDynamicParams.refFrameRate;
         }
         return (retVal);
     }
    diff --git a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h
    index b1786b4..caad6ca 100755
    --- a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h
    +++ b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h
    @@ -13,6 +13,7 @@
     
     #include "encLink_algIf.h"
     
    +#define JPEG_QUALITYFACTOR_DEFAULT      (80)
     /**
      *  Analytic info output buffer size, this buffer is used to place MV & SAD of
      *  encoded frame, should be big enough to hold the size of  typical HD sequence
    
    for mjpeg encoder migration.

    Regards,

    Reshma

  • Hi,
    I have a problem with the jpeg image.
    I used the codec version REL.500.V.MJPEG.E.IVAHD.01.00.04.00 on the dm8107 (DVRRDK_04.01.00.02).

    My problem is, when I compare the histogram of my RAW capture and of my jpeg picture, I see a differnce.

    The histogram of the RAW picture show that the entire range of 0 to 255 is used but on the histogram of the jpeg, it is between 16 and 245 (see attached file).


    This gives the impression that the JPEG image is blur.
    I searched around the DVRRDK and I don't find how to tell the compressor to encode JPEG image on a range of values ​​from 0 to 255.
    Can you help me ?
    regards

  • Can you pls migrate to latest MJPEG encoder REL.500.V.MJPEG.E.IVAHD.01.00.14.00 and apply the patch in this thread and set the targetBitrate .The MJPEG encoder version you are currently using doesn't support setting bitrate/quality level.You can get the latest encoder from TI FAE.

  • Hi Badri,
    Ok I will contact my TI FAE to obtain new MJPEG encoder.
    But, do you think this will fix my problem?
    In terms of quality of image details, the result is correct (qpInit = 97), but it is really the problem of non-use of the range of 0 to 255 which gives the impression of a bad return.
    What do you think about that?

    regards

     

  • I dont think it will resolve the pixel range issue but there is known quality issue due to lack of support for targteBitrate and rcAlgo in the encoder version you are using.I will check with encoder team on the pixel range issue but only latest encoder version is actively supported so migration to latest version will enable codec team provide bug fixes if any