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