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 }