Updated on 2022-03-13 GMT+08:00

Implementing the JPEGD Function

  • The memory size can be obtained by calling DvppGetOutParameter. The output memory can be specified and freed by the user. The calling example is as follows:
    void TEST_JPEGD_CUSTOM_MEMORY()
    {
        struct JpegdIn jpegdInData;
        struct JpegdOut jpegdOutData;
    
        if (g_rank) {
            jpegdInData.isYUV420Need = false;
        }
    
        FILE *fpIn = fopen(g_inFileName, "rb");
        if (fpIn == nullptr) {
            HIAI_ENGINE_LOG(HIAI_OPEN_FILE_ERROR, "can not open file %s.", g_inFileName);
            return;
        }
    
        do { // for resource fpIn
            fseek(fpIn, 0, SEEK_END);
            // the buf len should 8 byte larger, the driver asked
            uint32_t fileLen   = ftell(fpIn);
            jpegdInData.jpegDataSize = fileLen + 8;
            fseek(fpIn, 0, SEEK_SET);
    
            void* addrOrig = HIAI_DVPP_DMalloc(jpegdInData.jpegDataSize);
            if (addrOrig == nullptr) {
                HIAI_ENGINE_LOG(HIAI_JPEGD_CTL_ERROR, "can not alloc input buffer");
                fclose(fpIn);
                fpIn = nullptr;
                break;
            }
    
            jpegdInData.jpegData = reinterpret_cast<unsigned char*>(addrOrig);
            do { // for resource inBuf
                fread(jpegdInData.jpegData, 1, fileLen, fpIn);
                fclose(fpIn);
                fpIn = nullptr;
                int32_t ret = DvppGetOutParameter((void*)(&jpegdInData), (void*)(&jpegdOutData), GET_JPEGD_OUT_PARAMETER);
                if (ret != 0) {
                    HIAI_ENGINE_LOG(HIAI_JPEGD_CTL_ERROR, "call DvppGetOutParameter process failed");
                    break;
                }
                HIAI_ENGINE_LOG("jpegd out size is %d", jpegdOutData.yuvDataSize);
                jpegdOutData.yuvData = (unsigned char*)HIAI_DVPP_DMalloc(jpegdOutData.yuvDataSize);
                if (jpegdOutData.yuvData == nullptr) {
                    HIAI_ENGINE_LOG(HIAI_JPEGD_CTL_ERROR, "can not alloc output buffer");
                    break;
                }
                HIAI_ENGINE_LOG("jpegdOutData.yuvData is %p", jpegdOutData.yuvData);
    
                dvppapi_ctl_msg dvppApiCtlMsg;
                dvppApiCtlMsg.in = (void *)&jpegdInData;
                dvppApiCtlMsg.in_size = sizeof(jpegdInData);
                dvppApiCtlMsg.out = (void *)&jpegdOutData;
                dvppApiCtlMsg.out_size = sizeof(jpegdOutData);
    
                IDVPPAPI *pidvppapi = nullptr;
                CreateDvppApi(pidvppapi);
    
                if (pidvppapi != nullptr) {
                    for (int i = 0;i < g_loop; i++) {
                        if (0 != DvppCtl(pidvppapi, DVPP_CTL_JPEGD_PROC, &dvppApiCtlMsg)) {
                            HIAI_ENGINE_LOG(HIAI_JPEGD_CTL_ERROR, "call dvppctl process failed");
                            break;
                        }
                    }
                    DestroyDvppApi(pidvppapi);
                } else {
                    HIAI_ENGINE_LOG(HIAI_CREATE_DVPP_ERROR, "can not create dvpp api");
                    break;
                }
                WriteTestJpegdResultToFile(&jpegdOutData);
            } while (0); // for resource inBuf
    
            if (addrOrig != nullptr) {
                HIAI_DVPP_DFree(addrOrig);
                addrOrig = nullptr;
            }
            if (jpegdOutData.yuvData != nullptr) {
                HIAI_DVPP_DFree(jpegdOutData.yuvData);
                jpegdOutData.yuvData = nullptr;
            }
        } while (0); // for resource fpIn
    }
  • If the output buffer is not specified by the user, DVPP allocates the buffer internally. The cbFree() callback function should be called to free the buffer. The calling example is as follows:
    void JpegdProcess()
    {
        struct jpegd_raw_data_info jpegdInData;
        struct jpegd_yuv_data_info jpegdOutData;
    
        if (g_rank) {
            jpegdInData.IsYUV420Need = false;
        }
    
        FILE *fpIn = fopen(g_inFileName, "rb");
        if (fpIn == nullptr) {
            HIAI_ENGINE_LOG(HIAI_OPEN_FILE_ERROR, "can not open file %s.", g_inFileName);
            return;
        }
    
        do { // for resource fpIn
            fseek(fpIn, 0, SEEK_END);
            // the buf len should 8 byte larger, the driver asked
            uint32_t fileLen   = ftell(fpIn);
            jpegdInData.jpeg_data_size = fileLen + 8;
            fseek(fpIn, 0, SEEK_SET);
    
            void* addrOrig = HIAI_DVPP_DMalloc(jpegdInData.jpeg_data_size);
            if (addrOrig == nullptr) {
                HIAI_ENGINE_LOG(HIAI_JPEGD_CTL_ERROR, "can not alloc input buffer");
                break;
            }
    
            jpegdInData.jpeg_data = reinterpret_cast<unsigned char*>(addrOrig);
    
            do { // for resource inBuf
                fread(jpegdInData.jpeg_data, 1, fileLen, fpIn);
                dvppapi_ctl_msg dvppApiCtlMsg;
                dvppApiCtlMsg.in = (void*)&jpegdInData;
                dvppApiCtlMsg.in_size = sizeof(jpegdInData);
                dvppApiCtlMsg.out = (void*)&jpegdOutData;
                dvppApiCtlMsg.out_size = sizeof(jpegdOutData);
    
                IDVPPAPI *pidvppapi = nullptr;
                CreateDvppApi(pidvppapi);
    
                if (pidvppapi != nullptr) {
                    for (int i = 0;i < g_loop; i++) { // same picture loop test
                        if (DvppCtl(pidvppapi, DVPP_CTL_JPEGD_PROC, &dvppApiCtlMsg) != 0) {
                            HIAI_ENGINE_LOG(HIAI_JPEGD_CTL_ERROR, "call dvppctl process failed");
                            break;
                        }
                        if (i < g_loop - 1) {
                            jpegdOutData.cbFree();
                            jpegdOutData.yuv_data = nullptr;
                        }
                    }
                    DestroyDvppApi(pidvppapi);
                } else {
                    HIAI_ENGINE_LOG(HIAI_CREATE_DVPP_ERROR, "can not create dvpp api");
                    break;
                }
    
                WriteJpegdProcessResultToFile(&jpegdOutData);
                jpegdOutData.cbFree();
                jpegdOutData.yuv_data = nullptr;
    
            } while (0); // for resource inBuf
    
            if (addrOrig != nullptr) {
                HIAI_DVPP_DFree(addrOrig);
                addrOrig = nullptr;
            }
    
        } while (0); // for resource fpIn
        fclose(fpIn);
        fpIn = nullptr;
    }