xref: /aosp_15_r20/external/libopenapv/android/oapv_fuzzer.c (revision abb65b4b03b69e1d508d4d9a44dcf199df16e7c3)
1*abb65b4bSAndroid Build Coastguard Worker #include "oapv_fuzzer.h"
2*abb65b4bSAndroid Build Coastguard Worker 
3*abb65b4bSAndroid Build Coastguard Worker #include <errno.h>
4*abb65b4bSAndroid Build Coastguard Worker #include <stddef.h>
5*abb65b4bSAndroid Build Coastguard Worker #include <stdint.h>
6*abb65b4bSAndroid Build Coastguard Worker #include <stdlib.h>
7*abb65b4bSAndroid Build Coastguard Worker #include <string.h>
8*abb65b4bSAndroid Build Coastguard Worker 
9*abb65b4bSAndroid Build Coastguard Worker #include "inc/oapv.h"
10*abb65b4bSAndroid Build Coastguard Worker #include "app/oapv_app_util.h"
11*abb65b4bSAndroid Build Coastguard Worker 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)12*abb65b4bSAndroid Build Coastguard Worker int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
13*abb65b4bSAndroid Build Coastguard Worker   oapvd_t did = NULL;
14*abb65b4bSAndroid Build Coastguard Worker   oapvm_t mid = NULL;
15*abb65b4bSAndroid Build Coastguard Worker   oapvd_cdesc_t cdesc;
16*abb65b4bSAndroid Build Coastguard Worker   oapv_bitb_t bitb;
17*abb65b4bSAndroid Build Coastguard Worker   oapv_frms_t ofrms;
18*abb65b4bSAndroid Build Coastguard Worker   oapv_au_info_t aui;
19*abb65b4bSAndroid Build Coastguard Worker   oapvd_stat_t stat;
20*abb65b4bSAndroid Build Coastguard Worker   int i = 0;
21*abb65b4bSAndroid Build Coastguard Worker 
22*abb65b4bSAndroid Build Coastguard Worker   int ret = 0;
23*abb65b4bSAndroid Build Coastguard Worker 
24*abb65b4bSAndroid Build Coastguard Worker   memset(&cdesc, 0, sizeof(cdesc));
25*abb65b4bSAndroid Build Coastguard Worker   memset(&ofrms, 0, sizeof(ofrms));
26*abb65b4bSAndroid Build Coastguard Worker   memset(&aui, 0, sizeof(oapv_au_info_t));
27*abb65b4bSAndroid Build Coastguard Worker 
28*abb65b4bSAndroid Build Coastguard Worker   did = oapvd_create(&cdesc, &ret);
29*abb65b4bSAndroid Build Coastguard Worker   if (did == NULL) {
30*abb65b4bSAndroid Build Coastguard Worker     return 0;
31*abb65b4bSAndroid Build Coastguard Worker   }
32*abb65b4bSAndroid Build Coastguard Worker 
33*abb65b4bSAndroid Build Coastguard Worker   mid = oapvm_create(&ret);
34*abb65b4bSAndroid Build Coastguard Worker   if (OAPV_FAILED(ret)) {
35*abb65b4bSAndroid Build Coastguard Worker     ret = -1;
36*abb65b4bSAndroid Build Coastguard Worker     goto ERR;
37*abb65b4bSAndroid Build Coastguard Worker   }
38*abb65b4bSAndroid Build Coastguard Worker 
39*abb65b4bSAndroid Build Coastguard Worker   if (OAPV_FAILED(oapvd_info((void *)data, size, &aui))) {
40*abb65b4bSAndroid Build Coastguard Worker     ret = -1;
41*abb65b4bSAndroid Build Coastguard Worker     goto ERR;
42*abb65b4bSAndroid Build Coastguard Worker   }
43*abb65b4bSAndroid Build Coastguard Worker 
44*abb65b4bSAndroid Build Coastguard Worker   /* create decoding frame buffers */
45*abb65b4bSAndroid Build Coastguard Worker   ofrms.num_frms = aui.num_frms;
46*abb65b4bSAndroid Build Coastguard Worker   for (i = 0; i < ofrms.num_frms; i++) {
47*abb65b4bSAndroid Build Coastguard Worker     oapv_frm_t *frm = &ofrms.frm[i];
48*abb65b4bSAndroid Build Coastguard Worker     oapv_frm_info_t *finfo = &aui.frm_info[i];
49*abb65b4bSAndroid Build Coastguard Worker 
50*abb65b4bSAndroid Build Coastguard Worker     if (frm->imgb != NULL &&
51*abb65b4bSAndroid Build Coastguard Worker         (frm->imgb->w[0] != finfo->w || frm->imgb->h[0] != finfo->h)) {
52*abb65b4bSAndroid Build Coastguard Worker       frm->imgb->release(frm->imgb);
53*abb65b4bSAndroid Build Coastguard Worker       frm->imgb = NULL;
54*abb65b4bSAndroid Build Coastguard Worker     }
55*abb65b4bSAndroid Build Coastguard Worker 
56*abb65b4bSAndroid Build Coastguard Worker     if (frm->imgb == NULL) {
57*abb65b4bSAndroid Build Coastguard Worker       frm->imgb = imgb_create(finfo->w, finfo->h, finfo->cs);
58*abb65b4bSAndroid Build Coastguard Worker       if (frm->imgb == NULL) {
59*abb65b4bSAndroid Build Coastguard Worker         ret = -1;
60*abb65b4bSAndroid Build Coastguard Worker         goto ERR;
61*abb65b4bSAndroid Build Coastguard Worker       }
62*abb65b4bSAndroid Build Coastguard Worker     }
63*abb65b4bSAndroid Build Coastguard Worker   }
64*abb65b4bSAndroid Build Coastguard Worker 
65*abb65b4bSAndroid Build Coastguard Worker   /* main decoding block */
66*abb65b4bSAndroid Build Coastguard Worker   bitb.addr = (void *)data;
67*abb65b4bSAndroid Build Coastguard Worker   bitb.ssize = size;
68*abb65b4bSAndroid Build Coastguard Worker 
69*abb65b4bSAndroid Build Coastguard Worker   ret = oapvd_decode(did, &bitb, &ofrms, mid, &stat);
70*abb65b4bSAndroid Build Coastguard Worker 
71*abb65b4bSAndroid Build Coastguard Worker   if (OAPV_FAILED(ret)) {
72*abb65b4bSAndroid Build Coastguard Worker     ret = -1;
73*abb65b4bSAndroid Build Coastguard Worker     goto ERR;
74*abb65b4bSAndroid Build Coastguard Worker   }
75*abb65b4bSAndroid Build Coastguard Worker 
76*abb65b4bSAndroid Build Coastguard Worker ERR:
77*abb65b4bSAndroid Build Coastguard Worker   if (did) oapvd_delete(did);
78*abb65b4bSAndroid Build Coastguard Worker 
79*abb65b4bSAndroid Build Coastguard Worker   if (mid) oapvm_delete(mid);
80*abb65b4bSAndroid Build Coastguard Worker 
81*abb65b4bSAndroid Build Coastguard Worker   for (int i = 0; i < ofrms.num_frms; i++) {
82*abb65b4bSAndroid Build Coastguard Worker     if (ofrms.frm[i].imgb != NULL) {
83*abb65b4bSAndroid Build Coastguard Worker       ofrms.frm[i].imgb->release(ofrms.frm[i].imgb);
84*abb65b4bSAndroid Build Coastguard Worker     }
85*abb65b4bSAndroid Build Coastguard Worker   }
86*abb65b4bSAndroid Build Coastguard Worker   return ret;
87*abb65b4bSAndroid Build Coastguard Worker }