更新时间:2021-03-18 GMT+08:00
分享

实现JPEGD功能

  • 使用DvppGetOutParameter接口获取内存大小,由用户指定输出内存,由用户自行释放内存,调用示例如下 。
    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
    }
  • 不由用户指定输出内存时,DVPP内部申请内存,需由用户调用cbFree()回调函数释放内存,调用示例如下。
    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;
    }
分享:

    相关文档

    相关产品