Hi, all,

I'am tring to use "JPEG Baseline Profile Encoder on C64x+ " 2.00.002 on 6446
Linux, but can't work.

I want to encode YUV444 to JPEG on 6446 Linux with "JPEG Baseline Profile
Encoder on C64x+ " 2.00.002,
so I create a codec and a codec server.

In my application, I create the codec instance successfully, and so as
control(XDM_SETPARAMS).
then I call control(XDM_GETBUFINFO), I get something, but no correct.
when call process(), it failed. And I can get nothing from the
IMG_ENC1_status.extendedError.

Here is the code,

My code :



        /* CREATE IMAGE ENCODER */
        IIMGENC1_Params          params;
        /* Setting the sizes of Base Class Objects */
        params.size                    = sizeof(IIMGENC1_Params);
//        params.maxWidth                = 3172;
//        params.maxHeight               = 2048;
//        params.maxWidth                = 1600;
//        params.maxHeight               = 1216;
        params.maxWidth                = 720;
        params.maxHeight               = 480;
        params.maxScans                = 0;
        params.dataEndianness          = XDM_BYTE;
        params.forceChromaFormat       = 5; // output YUV444

        IMGENC1_Handle encHandle = IMGENC1_create(ceHandle, encoderName,
&params);
        if (encHandle == NULL) {
                printf("CEapp-> ERROR: can't open codec %s\n", encoderName);
        }

        /* SET DYNAMIC PARAMS */
        IDMJPGE_TIGEM_DynamicParams dynamicParams;
        IMGENC1_Status status;

        dynamicParams.params.size              =
sizeof(dynamicParams.params);
        dynamicParams.params.numAU             = 0;
        dynamicParams.params.generateHeader    = XDM_ENCODE_AU;
        dynamicParams.params.inputWidth        = 720;
        dynamicParams.params.inputHeight       = 480;
        dynamicParams.params.captureWidth      = 720;
        dynamicParams.params.qValue            = 70;
        dynamicParams.params.inputChromaFormat = 5; // input YUV444

        //memset(&status, 0, sizeof(status));
        status.size = sizeof(status);
        status.extendedError = 0;
        if (IMGENC1_control(encHandle, XDM_SETPARAMS,
                            &dynamicParams.params, &status) != IMGENC1_EOK)
{
                printf("XDM_SETPARAMS ERROR -- %x\n",
(int)status.extendedError);
                return -1;
        }

        /* GET BUFFER INFORMATION */
        if (IMGENC1_control(encHandle, XDM_GETBUFINFO,
                            &dynamicParams.params, &status) != IMGENC1_EOK)
{
                return -1;
        }

        int ii;
        printf("bufInfo :\n");
        printf("minNumInBufs : %d\n", (int)status.bufInfo.minNumInBufs);
        //for (ii = 0; ii < status.bufInfo.minNumInBufs; ++ii) {
        //        printf("minInBufSize[%d] : %d\n", ii,
(int)status.bufInfo.minInBufSize[ii]);
        //}
        for (ii = 0; ii < XDM_MAX_IO_BUFFERS; ++ii) {
                printf("minInBufSize[%d] : %d\n", ii,
(int)status.bufInfo.minInBufSize[ii]);
        }
        printf("minNumOutBufs : %d\n", (int)status.bufInfo.minNumOutBufs);
        for (ii = 0; ii < status.bufInfo.minNumOutBufs; ++ii) {
                printf("minOutBufSize[%d] : %d\n", ii,
(int)status.bufInfo.minOutBufSize[ii]);
        }

I get the following information :

bufInfo :
minNumInBufs : 16200
minInBufSize[0] : 1
minInBufSize[1] : 345600
minInBufSize[2] : 345600
minInBufSize[3] : 345600
minInBufSize[4] : -3
minInBufSize[5] : -2097185
minInBufSize[6] : 2080309247
minInBufSize[7] : -33816577
minInBufSize[8] : -1
minInBufSize[9] : -268501250
minInBufSize[10] : -1
minInBufSize[11] : -35651587
minInBufSize[12] : -1612709889
minInBufSize[13] : -1
minInBufSize[14] : -16777217
minInBufSize[15] : -5
minNumOutBufs : 3
minOutBufSize[0] : -524297
minOutBufSize[1] : 242520
minOutBufSize[2] : -67109889

According to the document,
minNumInBufs should be 3, and minInBufSize[0~2] should be 546000 (=720x480)
minNumOutBufs should be 1, and minOutBufSize[0] should not be negative,
maybe minOutBufSize[1] is the correct output buffer size.

So I call process() like this :



        /* declare codec I/O buffer descriptors for the codec's process()
func. */
        XDM_BufDesc    inBufDesc;
        XDM_BufDesc    outBufDesc;
        XDAS_Int8*     inBufs     [ XDM_MAX_IO_BUFFERS ];
        XDAS_Int32     inBufSizes [ XDM_MAX_IO_BUFFERS ];
        XDAS_Int8*     outBufs    [ XDM_MAX_IO_BUFFERS ];
        XDAS_Int32     outBufSizes[ XDM_MAX_IO_BUFFERS ];

#if 0
        inBufDesc.numBufs     = status.bufInfo.minNumInBufs;
        inBufDesc.bufs[0]     = bmp_buf;
        inBufDesc.bufSizes[0] = status.bufInfo.minInBufSize[0];

        for (ii=0; ii< (status.bufInfo.minNumInBufs - 1);ii++ ) {
                inBufDesc.bufs[ii+1]      = inBufDesc.bufs[ii] +
                        status.bufInfo.minInBufSize[ii];
                inBufDesc.bufSizes[ii +1] =
                        status.bufInfo.minInBufSize[ii +1];
        }
#else
        inBufDesc.numBufs  = 3;
        inBufs[0]          = bmp_buf;
        inBufs[1]          = inBufs[0] + status.bufInfo.minInBufSize[1];
        inBufs[2]          = inBufs[1] + status.bufInfo.minInBufSize[2];
        inBufSizes[0]      = status.bufInfo.minInBufSize[1];
        inBufSizes[1]      = status.bufInfo.minInBufSize[2];
        inBufSizes[2]      = status.bufInfo.minInBufSize[3];
#endif
        inBufDesc.bufs     = inBufs;
        inBufDesc.bufSizes = inBufSizes;

#if 0
        outBufDesc.numBufs     = status.bufInfo.minNumOutBufs ;
        outBufDesc.bufs[0]     = jpg_buf;
        outBufDesc.bufSizes[0] = status.bufInfo.minOutBufSize[0];

        for (ii=0; ii< (status.bufInfo.minNumOutBufs-1); ii++) {
                outBufDesc.bufs[ii+1] = outBufDesc.bufs[ii] +
                        status.bufInfo.minOutBufSize[ii];
                outBufDesc.bufSizes[ii+1] =
                        status.bufInfo.minOutBufSize[ii+1];
        }
#else
        outBufDesc.numBufs  = 1;
        outBufs[0]          = jpg_buf;
        outBufSizes[0]      = status.bufInfo.minOutBufSize[1];
#endif
        outBufDesc.bufs     = outBufs;
        outBufDesc.bufSizes = outBufSizes;

        /* declare in and out argument descriptors for process() */
        IMGENC1_InArgs  inArgs;
        IMGENC1_OutArgs outArgs;

        /* fill in the input arguments structure; we have nothing for this
case */
        inArgs.size            = sizeof(inArgs);
        outArgs.size           = sizeof(outArgs);
        outArgs.extendedError  = 0;
        outArgs.bytesGenerated = 0;
        outArgs.currentAU      = 0;

        /* encode the frame, pass addrs of the structures we populated above
*/
        if (IMGENC1_process(encHandle, &inBufDesc, &outBufDesc, &inArgs,
&outArgs) != IMGENC1_EOK) {
                dbg("IMGENC1_process failed, extendedError = 0x%lx\n",
outArgs.extendedError);
                retval = -1;
                return retval;
        }

then, I get the information :

ceapp_encodeBuf : IMGENC1_process failed, extendedError = 0xbffdfbff

Anyone can help me ?

frank
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to