Help Center/
Atlas 300 Application (Model 3000)/
DVPP API Reference/
Calling Example/
Implementing the JPEGD Function
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; }
Parent topic: Calling Example
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
The system is busy. Please try again later.
For any further questions, feel free to contact us through the chatbot.
Chatbot