#include "oapv_fuzzer.h" #include #include #include #include #include #include "inc/oapv.h" #include "app/oapv_app_util.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { oapvd_t did = NULL; oapvm_t mid = NULL; oapvd_cdesc_t cdesc; oapv_bitb_t bitb; oapv_frms_t ofrms; oapv_au_info_t aui; oapvd_stat_t stat; int i = 0; int ret = 0; memset(&cdesc, 0, sizeof(cdesc)); memset(&ofrms, 0, sizeof(ofrms)); memset(&aui, 0, sizeof(oapv_au_info_t)); did = oapvd_create(&cdesc, &ret); if (did == NULL) { return 0; } mid = oapvm_create(&ret); if (OAPV_FAILED(ret)) { ret = -1; goto ERR; } if (OAPV_FAILED(oapvd_info((void *)data, size, &aui))) { ret = -1; goto ERR; } /* create decoding frame buffers */ ofrms.num_frms = aui.num_frms; for (i = 0; i < ofrms.num_frms; i++) { oapv_frm_t *frm = &ofrms.frm[i]; oapv_frm_info_t *finfo = &aui.frm_info[i]; if (frm->imgb != NULL && (frm->imgb->w[0] != finfo->w || frm->imgb->h[0] != finfo->h)) { frm->imgb->release(frm->imgb); frm->imgb = NULL; } if (frm->imgb == NULL) { frm->imgb = imgb_create(finfo->w, finfo->h, finfo->cs); if (frm->imgb == NULL) { ret = -1; goto ERR; } } } /* main decoding block */ bitb.addr = (void *)data; bitb.ssize = size; ret = oapvd_decode(did, &bitb, &ofrms, mid, &stat); if (OAPV_FAILED(ret)) { ret = -1; goto ERR; } ERR: if (did) oapvd_delete(did); if (mid) oapvm_delete(mid); for (int i = 0; i < ofrms.num_frms; i++) { if (ofrms.frm[i].imgb != NULL) { ofrms.frm[i].imgb->release(ofrms.frm[i].imgb); } } return ret; }