更新时间: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; }
父主题: 调用示例