xref: /aosp_15_r20/external/libavc/fuzzer/mvc_dec_fuzzer.cpp (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker #include <cstdio>
21*495ae853SAndroid Build Coastguard Worker #include <cstdlib>
22*495ae853SAndroid Build Coastguard Worker #include <cstring>
23*495ae853SAndroid Build Coastguard Worker #include <algorithm>
24*495ae853SAndroid Build Coastguard Worker 
25*495ae853SAndroid Build Coastguard Worker #ifdef __cplusplus
26*495ae853SAndroid Build Coastguard Worker extern "C"
27*495ae853SAndroid Build Coastguard Worker {
28*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
29*495ae853SAndroid Build Coastguard Worker #include "imvcd.h"
30*495ae853SAndroid Build Coastguard Worker }
31*495ae853SAndroid Build Coastguard Worker #endif
32*495ae853SAndroid Build Coastguard Worker 
33*495ae853SAndroid Build Coastguard Worker #define MAX_NUM_VIEWS 6
34*495ae853SAndroid Build Coastguard Worker 
35*495ae853SAndroid Build Coastguard Worker #define NUM_COMPONENTS 3
36*495ae853SAndroid Build Coastguard Worker 
37*495ae853SAndroid Build Coastguard Worker #define NELEMENTS(x) (sizeof(x) / sizeof(x[0]))
38*495ae853SAndroid Build Coastguard Worker 
39*495ae853SAndroid Build Coastguard Worker typedef enum ARG_OFFSETS_T
40*495ae853SAndroid Build Coastguard Worker {
41*495ae853SAndroid Build Coastguard Worker     OFFSET_COLOR_FORMAT = 6,
42*495ae853SAndroid Build Coastguard Worker     OFFSET_NUM_CORES,
43*495ae853SAndroid Build Coastguard Worker     OFFSET_ARCH,
44*495ae853SAndroid Build Coastguard Worker     /* Should be the last entry */
45*495ae853SAndroid Build Coastguard Worker     OFFSET_MAX,
46*495ae853SAndroid Build Coastguard Worker } ARG_OFFSETS_T;
47*495ae853SAndroid Build Coastguard Worker 
48*495ae853SAndroid Build Coastguard Worker static const IV_COLOR_FORMAT_T supportedColorFormats[] = {IV_YUV_420P};
49*495ae853SAndroid Build Coastguard Worker static const IVD_ARCH_T supportedArchitectures[] = {ARCH_ARM_NEONINTR, ARCH_X86_GENERIC,
50*495ae853SAndroid Build Coastguard Worker                                                     ARCH_X86_SSSE3, ARCH_X86_SSE42};
51*495ae853SAndroid Build Coastguard Worker static const int kMaxNumDecodeCalls = 1000;
52*495ae853SAndroid Build Coastguard Worker static const int kSupportedColorFormats = NELEMENTS(supportedColorFormats);
53*495ae853SAndroid Build Coastguard Worker static const int kSupportedArchitectures = NELEMENTS(supportedArchitectures);
54*495ae853SAndroid Build Coastguard Worker static const int kMaxCores = 3;
55*495ae853SAndroid Build Coastguard Worker 
mvcd_aligned_malloc(void * pv_ctxt,WORD32 alignment,WORD32 i4_size)56*495ae853SAndroid Build Coastguard Worker static inline void *mvcd_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
57*495ae853SAndroid Build Coastguard Worker {
58*495ae853SAndroid Build Coastguard Worker     void *buf = nullptr;
59*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
60*495ae853SAndroid Build Coastguard Worker 
61*495ae853SAndroid Build Coastguard Worker     if(0 != posix_memalign(&buf, alignment, i4_size))
62*495ae853SAndroid Build Coastguard Worker     {
63*495ae853SAndroid Build Coastguard Worker         return nullptr;
64*495ae853SAndroid Build Coastguard Worker     }
65*495ae853SAndroid Build Coastguard Worker 
66*495ae853SAndroid Build Coastguard Worker     return buf;
67*495ae853SAndroid Build Coastguard Worker }
68*495ae853SAndroid Build Coastguard Worker 
mvcd_aligned_free(void * pv_ctxt,void * pv_buf)69*495ae853SAndroid Build Coastguard Worker static inline void mvcd_aligned_free(void *pv_ctxt, void *pv_buf)
70*495ae853SAndroid Build Coastguard Worker {
71*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
72*495ae853SAndroid Build Coastguard Worker     free(pv_buf);
73*495ae853SAndroid Build Coastguard Worker }
74*495ae853SAndroid Build Coastguard Worker 
75*495ae853SAndroid Build Coastguard Worker class Codec
76*495ae853SAndroid Build Coastguard Worker {
77*495ae853SAndroid Build Coastguard Worker    public:
78*495ae853SAndroid Build Coastguard Worker     Codec(IV_COLOR_FORMAT_T colorFormat, size_t numCores);
79*495ae853SAndroid Build Coastguard Worker     ~Codec();
80*495ae853SAndroid Build Coastguard Worker 
81*495ae853SAndroid Build Coastguard Worker     void resetCodec();
82*495ae853SAndroid Build Coastguard Worker     WORD32 allocFrame();
83*495ae853SAndroid Build Coastguard Worker     void freeFrame();
84*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T decodeHeader(const uint8_t *data, size_t size);
85*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T decodeFrame(const uint8_t *data, size_t size, size_t *bytesConsumed);
86*495ae853SAndroid Build Coastguard Worker     void setArchitecture(IVD_ARCH_T arch);
87*495ae853SAndroid Build Coastguard Worker     void setBufInfo();
88*495ae853SAndroid Build Coastguard Worker     void setCores();
89*495ae853SAndroid Build Coastguard Worker 
getOutBuf()90*495ae853SAndroid Build Coastguard Worker     ivd_out_bufdesc_t *getOutBuf() { return &mOutBufHandle; }
91*495ae853SAndroid Build Coastguard Worker 
getViewDispBuf(UWORD16 u2_view_id=0)92*495ae853SAndroid Build Coastguard Worker     iv_yuv_buf_t *getViewDispBuf(UWORD16 u2_view_id = 0) { return &as_view_disp_bufs[u2_view_id]; }
93*495ae853SAndroid Build Coastguard Worker 
getNumViews()94*495ae853SAndroid Build Coastguard Worker     UWORD32 getNumViews() { return mBufInfo.s_mvc_buf_info.u2_num_views; }
95*495ae853SAndroid Build Coastguard Worker 
getCodecHandle()96*495ae853SAndroid Build Coastguard Worker     iv_obj_t *getCodecHandle() { return mCodec; }
97*495ae853SAndroid Build Coastguard Worker 
98*495ae853SAndroid Build Coastguard Worker    private:
99*495ae853SAndroid Build Coastguard Worker     iv_obj_t *mCodec;
100*495ae853SAndroid Build Coastguard Worker     ivd_out_bufdesc_t mOutBufHandle;
101*495ae853SAndroid Build Coastguard Worker     iv_yuv_buf_t as_view_disp_bufs[MAX_NUM_VIEWS];
102*495ae853SAndroid Build Coastguard Worker     imvcd_get_buf_info_op_t mBufInfo;
103*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T mColorFormat;
104*495ae853SAndroid Build Coastguard Worker     size_t mNumCores;
105*495ae853SAndroid Build Coastguard Worker     uint32_t mWidth;
106*495ae853SAndroid Build Coastguard Worker     uint32_t mHeight;
107*495ae853SAndroid Build Coastguard Worker };
108*495ae853SAndroid Build Coastguard Worker 
Codec(IV_COLOR_FORMAT_T colorFormat,size_t numCores)109*495ae853SAndroid Build Coastguard Worker Codec::Codec(IV_COLOR_FORMAT_T colorFormat, size_t numCores)
110*495ae853SAndroid Build Coastguard Worker     : mCodec(nullptr), mColorFormat(colorFormat), mNumCores(numCores), mWidth(0), mHeight(0)
111*495ae853SAndroid Build Coastguard Worker {
112*495ae853SAndroid Build Coastguard Worker     imvcd_create_ip_t s_create_ip;
113*495ae853SAndroid Build Coastguard Worker     imvcd_create_op_t s_create_op;
114*495ae853SAndroid Build Coastguard Worker 
115*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.e_cmd = IVD_CMD_CREATE;
116*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.e_output_format = colorFormat;
117*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.pf_aligned_alloc = mvcd_aligned_malloc;
118*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.pf_aligned_free = mvcd_aligned_free;
119*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.u4_share_disp_buf = 0;
120*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.pv_mem_ctxt = nullptr;
121*495ae853SAndroid Build Coastguard Worker 
122*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.u4_size = sizeof(s_create_ip.s_ivd_ip);
123*495ae853SAndroid Build Coastguard Worker     s_create_op.s_ivd_op.u4_size = sizeof(s_create_op.s_ivd_op);
124*495ae853SAndroid Build Coastguard Worker 
125*495ae853SAndroid Build Coastguard Worker     imvcd_api_function(NULL, &s_create_ip, &s_create_op);
126*495ae853SAndroid Build Coastguard Worker 
127*495ae853SAndroid Build Coastguard Worker     mCodec = static_cast<iv_obj_t *>(s_create_op.s_ivd_op.pv_handle);
128*495ae853SAndroid Build Coastguard Worker 
129*495ae853SAndroid Build Coastguard Worker     setCores();
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker     memset(getOutBuf(), 0, sizeof(getOutBuf()[0]));
132*495ae853SAndroid Build Coastguard Worker }
133*495ae853SAndroid Build Coastguard Worker 
~Codec()134*495ae853SAndroid Build Coastguard Worker Codec::~Codec()
135*495ae853SAndroid Build Coastguard Worker {
136*495ae853SAndroid Build Coastguard Worker     imvcd_delete_ip_t s_delete_ip;
137*495ae853SAndroid Build Coastguard Worker     imvcd_delete_op_t s_delete_op;
138*495ae853SAndroid Build Coastguard Worker 
139*495ae853SAndroid Build Coastguard Worker     s_delete_ip.s_ivd_ip.e_cmd = IVD_CMD_DELETE;
140*495ae853SAndroid Build Coastguard Worker 
141*495ae853SAndroid Build Coastguard Worker     s_delete_ip.s_ivd_ip.u4_size = sizeof(s_delete_ip.s_ivd_ip);
142*495ae853SAndroid Build Coastguard Worker     s_delete_op.s_ivd_op.u4_size = sizeof(s_delete_op.s_ivd_op);
143*495ae853SAndroid Build Coastguard Worker 
144*495ae853SAndroid Build Coastguard Worker     imvcd_api_function(mCodec, &s_delete_ip, &s_delete_op);
145*495ae853SAndroid Build Coastguard Worker }
146*495ae853SAndroid Build Coastguard Worker 
setCores()147*495ae853SAndroid Build Coastguard Worker void Codec::setCores()
148*495ae853SAndroid Build Coastguard Worker {
149*495ae853SAndroid Build Coastguard Worker     imvcd_set_num_cores_ip_t s_ctl_ip;
150*495ae853SAndroid Build Coastguard Worker     imvcd_set_num_cores_op_t s_ctl_op;
151*495ae853SAndroid Build Coastguard Worker 
152*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_size = sizeof(s_ctl_ip);
153*495ae853SAndroid Build Coastguard Worker     s_ctl_op.u4_size = sizeof(s_ctl_op);
154*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
155*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_sub_cmd = static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IMVCD_CTL_SET_NUM_CORES);
156*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_num_cores = mNumCores;
157*495ae853SAndroid Build Coastguard Worker 
158*495ae853SAndroid Build Coastguard Worker     imvcd_api_function(mCodec, &s_ctl_ip, &s_ctl_op);
159*495ae853SAndroid Build Coastguard Worker }
160*495ae853SAndroid Build Coastguard Worker 
setArchitecture(IVD_ARCH_T e_arch)161*495ae853SAndroid Build Coastguard Worker void Codec::setArchitecture(IVD_ARCH_T e_arch)
162*495ae853SAndroid Build Coastguard Worker {
163*495ae853SAndroid Build Coastguard Worker     imvcd_set_arch_ip_t s_ctl_ip;
164*495ae853SAndroid Build Coastguard Worker     imvcd_set_arch_op_t s_ctl_op;
165*495ae853SAndroid Build Coastguard Worker 
166*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_size = sizeof(s_ctl_ip);
167*495ae853SAndroid Build Coastguard Worker     s_ctl_op.u4_size = sizeof(s_ctl_op);
168*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
169*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_sub_cmd = static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IMVCD_CTL_SET_PROCESSOR);
170*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_arch = e_arch;
171*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_soc = SOC_GENERIC;
172*495ae853SAndroid Build Coastguard Worker 
173*495ae853SAndroid Build Coastguard Worker     imvcd_api_function(mCodec, &s_ctl_ip, &s_ctl_op);
174*495ae853SAndroid Build Coastguard Worker }
175*495ae853SAndroid Build Coastguard Worker 
setBufInfo()176*495ae853SAndroid Build Coastguard Worker void Codec::setBufInfo()
177*495ae853SAndroid Build Coastguard Worker {
178*495ae853SAndroid Build Coastguard Worker     imvcd_get_buf_info_ip_t s_ctl_ip;
179*495ae853SAndroid Build Coastguard Worker     imvcd_get_buf_info_op_t s_ctl_op;
180*495ae853SAndroid Build Coastguard Worker 
181*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
182*495ae853SAndroid Build Coastguard Worker     s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
183*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
184*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_sub_cmd =
185*495ae853SAndroid Build Coastguard Worker         static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IVD_CMD_CTL_GETBUFINFO);
186*495ae853SAndroid Build Coastguard Worker 
187*495ae853SAndroid Build Coastguard Worker     imvcd_api_function(mCodec, &s_ctl_ip, &s_ctl_op);
188*495ae853SAndroid Build Coastguard Worker 
189*495ae853SAndroid Build Coastguard Worker     mBufInfo = s_ctl_op;
190*495ae853SAndroid Build Coastguard Worker }
191*495ae853SAndroid Build Coastguard Worker 
allocFrame()192*495ae853SAndroid Build Coastguard Worker WORD32 Codec::allocFrame()
193*495ae853SAndroid Build Coastguard Worker {
194*495ae853SAndroid Build Coastguard Worker     if(getNumViews() > MAX_NUM_VIEWS)
195*495ae853SAndroid Build Coastguard Worker     {
196*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
197*495ae853SAndroid Build Coastguard Worker     }
198*495ae853SAndroid Build Coastguard Worker 
199*495ae853SAndroid Build Coastguard Worker     if(mBufInfo.s_ivd_op.u4_min_num_out_bufs < (NUM_COMPONENTS * getNumViews()))
200*495ae853SAndroid Build Coastguard Worker     {
201*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
202*495ae853SAndroid Build Coastguard Worker     }
203*495ae853SAndroid Build Coastguard Worker 
204*495ae853SAndroid Build Coastguard Worker     getOutBuf()->u4_num_bufs = mBufInfo.s_ivd_op.u4_min_num_out_bufs;
205*495ae853SAndroid Build Coastguard Worker 
206*495ae853SAndroid Build Coastguard Worker     for(UWORD32 i = 0; i < getOutBuf()->u4_num_bufs; i++)
207*495ae853SAndroid Build Coastguard Worker     {
208*495ae853SAndroid Build Coastguard Worker         getOutBuf()->u4_min_out_buf_size[i] = mBufInfo.s_ivd_op.u4_min_out_buf_size[i];
209*495ae853SAndroid Build Coastguard Worker         getOutBuf()->pu1_bufs[i] =
210*495ae853SAndroid Build Coastguard Worker             (UWORD8 *) mvcd_aligned_malloc(nullptr, 16, mBufInfo.s_ivd_op.u4_min_out_buf_size[i]);
211*495ae853SAndroid Build Coastguard Worker 
212*495ae853SAndroid Build Coastguard Worker         if(getOutBuf()->pu1_bufs[i] == nullptr)
213*495ae853SAndroid Build Coastguard Worker         {
214*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
215*495ae853SAndroid Build Coastguard Worker         }
216*495ae853SAndroid Build Coastguard Worker     }
217*495ae853SAndroid Build Coastguard Worker 
218*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
219*495ae853SAndroid Build Coastguard Worker }
220*495ae853SAndroid Build Coastguard Worker 
freeFrame()221*495ae853SAndroid Build Coastguard Worker void Codec::freeFrame()
222*495ae853SAndroid Build Coastguard Worker {
223*495ae853SAndroid Build Coastguard Worker     for(UWORD32 i = 0; i < getOutBuf()->u4_num_bufs; i++)
224*495ae853SAndroid Build Coastguard Worker     {
225*495ae853SAndroid Build Coastguard Worker         if(getOutBuf()->pu1_bufs[i])
226*495ae853SAndroid Build Coastguard Worker         {
227*495ae853SAndroid Build Coastguard Worker             mvcd_aligned_free(nullptr, getOutBuf()->pu1_bufs[i]);
228*495ae853SAndroid Build Coastguard Worker             getOutBuf()->pu1_bufs[i] = nullptr;
229*495ae853SAndroid Build Coastguard Worker         }
230*495ae853SAndroid Build Coastguard Worker     }
231*495ae853SAndroid Build Coastguard Worker }
232*495ae853SAndroid Build Coastguard Worker 
sendDecodeSignal(iv_obj_t * psCodec,IVD_VIDEO_DECODE_MODE_T eDecMode)233*495ae853SAndroid Build Coastguard Worker static void sendDecodeSignal(iv_obj_t *psCodec, IVD_VIDEO_DECODE_MODE_T eDecMode)
234*495ae853SAndroid Build Coastguard Worker {
235*495ae853SAndroid Build Coastguard Worker     imvcd_set_config_ip_t s_ctl_ip;
236*495ae853SAndroid Build Coastguard Worker     imvcd_set_config_op_t s_ctl_op;
237*495ae853SAndroid Build Coastguard Worker 
238*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
239*495ae853SAndroid Build Coastguard Worker     s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
240*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
241*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_sub_cmd =
242*495ae853SAndroid Build Coastguard Worker         static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IVD_CMD_CTL_SETPARAMS);
243*495ae853SAndroid Build Coastguard Worker 
244*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
245*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_frm_skip_mode = IVD_SKIP_NONE;
246*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_vid_dec_mode = eDecMode;
247*495ae853SAndroid Build Coastguard Worker 
248*495ae853SAndroid Build Coastguard Worker     imvcd_api_function(psCodec, &s_ctl_ip, &s_ctl_op);
249*495ae853SAndroid Build Coastguard Worker }
250*495ae853SAndroid Build Coastguard Worker 
decodeHeader(const uint8_t * data,size_t size)251*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T Codec::decodeHeader(const uint8_t *data, size_t size)
252*495ae853SAndroid Build Coastguard Worker {
253*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret;
254*495ae853SAndroid Build Coastguard Worker 
255*495ae853SAndroid Build Coastguard Worker     WORD32 numBytesRemaining = size;
256*495ae853SAndroid Build Coastguard Worker 
257*495ae853SAndroid Build Coastguard Worker     sendDecodeSignal(mCodec, IVD_DECODE_HEADER);
258*495ae853SAndroid Build Coastguard Worker 
259*495ae853SAndroid Build Coastguard Worker     while(size > 0)
260*495ae853SAndroid Build Coastguard Worker     {
261*495ae853SAndroid Build Coastguard Worker         imvcd_video_decode_ip_t s_video_decode_ip;
262*495ae853SAndroid Build Coastguard Worker         imvcd_video_decode_op_t s_video_decode_op;
263*495ae853SAndroid Build Coastguard Worker 
264*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_num_bytes_dec = 0;
265*495ae853SAndroid Build Coastguard Worker 
266*495ae853SAndroid Build Coastguard Worker         memset(&s_video_decode_ip, 0, sizeof(s_video_decode_ip));
267*495ae853SAndroid Build Coastguard Worker         memset(&s_video_decode_op, 0, sizeof(s_video_decode_op));
268*495ae853SAndroid Build Coastguard Worker 
269*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
270*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_ts = 0;
271*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.pv_stream_buffer =
272*495ae853SAndroid Build Coastguard Worker             static_cast<void *>(const_cast<uint8_t *>(data));
273*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_num_Bytes = numBytesRemaining;
274*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.s_out_buffer = getOutBuf()[0];
275*495ae853SAndroid Build Coastguard Worker         s_video_decode_op.ps_view_disp_bufs = getViewDispBuf();
276*495ae853SAndroid Build Coastguard Worker 
277*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
278*495ae853SAndroid Build Coastguard Worker         s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
279*495ae853SAndroid Build Coastguard Worker 
280*495ae853SAndroid Build Coastguard Worker         ret = imvcd_api_function(mCodec, &s_video_decode_ip, &s_video_decode_op);
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != ret)
283*495ae853SAndroid Build Coastguard Worker         {
284*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
285*495ae853SAndroid Build Coastguard Worker         }
286*495ae853SAndroid Build Coastguard Worker 
287*495ae853SAndroid Build Coastguard Worker         u4_num_bytes_dec = s_video_decode_op.s_ivd_op.u4_num_bytes_consumed;
288*495ae853SAndroid Build Coastguard Worker 
289*495ae853SAndroid Build Coastguard Worker         data += u4_num_bytes_dec;
290*495ae853SAndroid Build Coastguard Worker         numBytesRemaining -= u4_num_bytes_dec;
291*495ae853SAndroid Build Coastguard Worker         mWidth = s_video_decode_op.s_ivd_op.u4_pic_wd;
292*495ae853SAndroid Build Coastguard Worker         mHeight = s_video_decode_op.s_ivd_op.u4_pic_ht;
293*495ae853SAndroid Build Coastguard Worker 
294*495ae853SAndroid Build Coastguard Worker         /* Break after successful header decode */
295*495ae853SAndroid Build Coastguard Worker         if(mWidth && mHeight)
296*495ae853SAndroid Build Coastguard Worker         {
297*495ae853SAndroid Build Coastguard Worker             break;
298*495ae853SAndroid Build Coastguard Worker         }
299*495ae853SAndroid Build Coastguard Worker     }
300*495ae853SAndroid Build Coastguard Worker 
301*495ae853SAndroid Build Coastguard Worker     /* if width / height are invalid, set them to defaults */
302*495ae853SAndroid Build Coastguard Worker     if(!mWidth)
303*495ae853SAndroid Build Coastguard Worker     {
304*495ae853SAndroid Build Coastguard Worker         mWidth = 1920;
305*495ae853SAndroid Build Coastguard Worker     }
306*495ae853SAndroid Build Coastguard Worker 
307*495ae853SAndroid Build Coastguard Worker     if(!mHeight)
308*495ae853SAndroid Build Coastguard Worker     {
309*495ae853SAndroid Build Coastguard Worker         mHeight = 1080;
310*495ae853SAndroid Build Coastguard Worker     }
311*495ae853SAndroid Build Coastguard Worker 
312*495ae853SAndroid Build Coastguard Worker     setBufInfo();
313*495ae853SAndroid Build Coastguard Worker 
314*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
315*495ae853SAndroid Build Coastguard Worker }
316*495ae853SAndroid Build Coastguard Worker 
decodeFrame(const uint8_t * data,size_t size,size_t * bytesConsumed)317*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T Codec::decodeFrame(const uint8_t *data, size_t size, size_t *bytesConsumed)
318*495ae853SAndroid Build Coastguard Worker {
319*495ae853SAndroid Build Coastguard Worker     imvcd_video_decode_ip_t s_video_decode_ip;
320*495ae853SAndroid Build Coastguard Worker     imvcd_video_decode_op_t s_video_decode_op;
321*495ae853SAndroid Build Coastguard Worker 
322*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret;
323*495ae853SAndroid Build Coastguard Worker 
324*495ae853SAndroid Build Coastguard Worker     memset(&s_video_decode_ip, 0, sizeof(s_video_decode_ip));
325*495ae853SAndroid Build Coastguard Worker     memset(&s_video_decode_op, 0, sizeof(s_video_decode_op));
326*495ae853SAndroid Build Coastguard Worker 
327*495ae853SAndroid Build Coastguard Worker     sendDecodeSignal(mCodec, IVD_DECODE_FRAME);
328*495ae853SAndroid Build Coastguard Worker 
329*495ae853SAndroid Build Coastguard Worker     s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
330*495ae853SAndroid Build Coastguard Worker     s_video_decode_ip.s_ivd_ip.u4_ts = 0;
331*495ae853SAndroid Build Coastguard Worker     s_video_decode_ip.s_ivd_ip.pv_stream_buffer = static_cast<void *>(const_cast<uint8_t *>(data));
332*495ae853SAndroid Build Coastguard Worker     s_video_decode_ip.s_ivd_ip.u4_num_Bytes = size;
333*495ae853SAndroid Build Coastguard Worker     s_video_decode_ip.s_ivd_ip.s_out_buffer = getOutBuf()[0];
334*495ae853SAndroid Build Coastguard Worker     s_video_decode_op.ps_view_disp_bufs = getViewDispBuf();
335*495ae853SAndroid Build Coastguard Worker 
336*495ae853SAndroid Build Coastguard Worker     s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
337*495ae853SAndroid Build Coastguard Worker     s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
338*495ae853SAndroid Build Coastguard Worker 
339*495ae853SAndroid Build Coastguard Worker     ret = imvcd_api_function(mCodec, &s_video_decode_ip, &s_video_decode_op);
340*495ae853SAndroid Build Coastguard Worker 
341*495ae853SAndroid Build Coastguard Worker     bytesConsumed[0] = s_video_decode_op.s_ivd_op.u4_num_bytes_consumed;
342*495ae853SAndroid Build Coastguard Worker 
343*495ae853SAndroid Build Coastguard Worker     if(s_video_decode_op.s_ivd_op.u4_pic_wd && s_video_decode_op.s_ivd_op.u4_pic_ht &&
344*495ae853SAndroid Build Coastguard Worker        ((mWidth != s_video_decode_op.s_ivd_op.u4_pic_wd) ||
345*495ae853SAndroid Build Coastguard Worker         (mHeight != s_video_decode_op.s_ivd_op.u4_pic_ht)))
346*495ae853SAndroid Build Coastguard Worker     {
347*495ae853SAndroid Build Coastguard Worker         mWidth = s_video_decode_op.s_ivd_op.u4_pic_wd;
348*495ae853SAndroid Build Coastguard Worker         mHeight = s_video_decode_op.s_ivd_op.u4_pic_ht;
349*495ae853SAndroid Build Coastguard Worker         freeFrame();
350*495ae853SAndroid Build Coastguard Worker         allocFrame();
351*495ae853SAndroid Build Coastguard Worker     }
352*495ae853SAndroid Build Coastguard Worker 
353*495ae853SAndroid Build Coastguard Worker     return ret;
354*495ae853SAndroid Build Coastguard Worker }
355*495ae853SAndroid Build Coastguard Worker 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)356*495ae853SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
357*495ae853SAndroid Build Coastguard Worker {
358*495ae853SAndroid Build Coastguard Worker     if(size < 1)
359*495ae853SAndroid Build Coastguard Worker     {
360*495ae853SAndroid Build Coastguard Worker         return 0;
361*495ae853SAndroid Build Coastguard Worker     }
362*495ae853SAndroid Build Coastguard Worker 
363*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
364*495ae853SAndroid Build Coastguard Worker 
365*495ae853SAndroid Build Coastguard Worker     size_t colorFormatOfst = std::min((size_t) OFFSET_COLOR_FORMAT, size - 1);
366*495ae853SAndroid Build Coastguard Worker     size_t numCoresOfst = std::min((size_t) OFFSET_NUM_CORES, size - 1);
367*495ae853SAndroid Build Coastguard Worker     size_t architectureOfst = std::min((size_t) OFFSET_ARCH, size - 1);
368*495ae853SAndroid Build Coastguard Worker     size_t architectureIdx = data[architectureOfst] % kSupportedArchitectures;
369*495ae853SAndroid Build Coastguard Worker     size_t colorFormatIdx = data[colorFormatOfst] % kSupportedColorFormats;
370*495ae853SAndroid Build Coastguard Worker     uint32_t numCores = (data[numCoresOfst] % kMaxCores) + 1;
371*495ae853SAndroid Build Coastguard Worker     uint32_t numDecodeCalls = 0;
372*495ae853SAndroid Build Coastguard Worker 
373*495ae853SAndroid Build Coastguard Worker     IVD_ARCH_T arch = (IVD_ARCH_T) supportedArchitectures[architectureIdx];
374*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T colorFormat = (IV_COLOR_FORMAT_T) (supportedColorFormats[colorFormatIdx]);
375*495ae853SAndroid Build Coastguard Worker 
376*495ae853SAndroid Build Coastguard Worker     Codec cCodec = Codec(colorFormat, numCores);
377*495ae853SAndroid Build Coastguard Worker 
378*495ae853SAndroid Build Coastguard Worker     cCodec.setArchitecture(arch);
379*495ae853SAndroid Build Coastguard Worker 
380*495ae853SAndroid Build Coastguard Worker     ret = cCodec.decodeHeader(data, size);
381*495ae853SAndroid Build Coastguard Worker 
382*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
383*495ae853SAndroid Build Coastguard Worker     {
384*495ae853SAndroid Build Coastguard Worker         return 0;
385*495ae853SAndroid Build Coastguard Worker     }
386*495ae853SAndroid Build Coastguard Worker 
387*495ae853SAndroid Build Coastguard Worker     ret = cCodec.allocFrame();
388*495ae853SAndroid Build Coastguard Worker 
389*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
390*495ae853SAndroid Build Coastguard Worker     {
391*495ae853SAndroid Build Coastguard Worker         cCodec.freeFrame();
392*495ae853SAndroid Build Coastguard Worker 
393*495ae853SAndroid Build Coastguard Worker         return 0;
394*495ae853SAndroid Build Coastguard Worker     }
395*495ae853SAndroid Build Coastguard Worker 
396*495ae853SAndroid Build Coastguard Worker     while((size > 0) && (numDecodeCalls < kMaxNumDecodeCalls))
397*495ae853SAndroid Build Coastguard Worker     {
398*495ae853SAndroid Build Coastguard Worker         size_t bytesConsumed;
399*495ae853SAndroid Build Coastguard Worker 
400*495ae853SAndroid Build Coastguard Worker         IV_API_CALL_STATUS_T ret = cCodec.decodeFrame(data, size, &bytesConsumed);
401*495ae853SAndroid Build Coastguard Worker 
402*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
403*495ae853SAndroid Build Coastguard Worker         {
404*495ae853SAndroid Build Coastguard Worker             break;
405*495ae853SAndroid Build Coastguard Worker         }
406*495ae853SAndroid Build Coastguard Worker 
407*495ae853SAndroid Build Coastguard Worker         bytesConsumed = std::min(size, bytesConsumed);
408*495ae853SAndroid Build Coastguard Worker         data += bytesConsumed;
409*495ae853SAndroid Build Coastguard Worker         size -= bytesConsumed;
410*495ae853SAndroid Build Coastguard Worker         numDecodeCalls++;
411*495ae853SAndroid Build Coastguard Worker     }
412*495ae853SAndroid Build Coastguard Worker 
413*495ae853SAndroid Build Coastguard Worker     cCodec.freeFrame();
414*495ae853SAndroid Build Coastguard Worker 
415*495ae853SAndroid Build Coastguard Worker     return 0;
416*495ae853SAndroid Build Coastguard Worker }
417