main_helper.h 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924
  1. /* SPDX-License-Identifier: LGPL-2.1 OR BSD-3-Clause */
  2. //------------------------------------------------------------------------------
  3. // File: main_helper.h
  4. //
  5. // Copyright (c) 2006, Chips & Media. All rights reserved.
  6. //------------------------------------------------------------------------------
  7. #ifndef _MAIN_HELPER_H_
  8. #define _MAIN_HELPER_H_
  9. #include "config.h"
  10. #include "vpuapifunc.h"
  11. #include "vpuapi.h"
  12. #include "vputypes.h"
  13. #include "misc/debug.h"
  14. #ifdef PLATFORM_QNX
  15. #include <sys/stat.h>
  16. #endif
  17. #ifdef SUPPORT_ENCODE_CUSTOM_HEADER
  18. #include "./misc/header_struct.h"
  19. #endif
  20. #define MATCH_OR_MISMATCH(_expected, _value, _ret) ((_ret=(_expected == _value)) ? "MATCH" : "MISMATCH")
  21. #if defined(WIN32) || defined(WIN64)
  22. /*
  23. ( _MSC_VER => 1200 ) 6.0 vs6
  24. ( _MSC_VER => 1310 ) 7.1 vs2003
  25. ( _MSC_VER => 1400 ) 8.0 vs2005
  26. ( _MSC_VER => 1500 ) 9.0 vs2008
  27. ( _MSC_VER => 1600 ) 10.0 vs2010
  28. */
  29. #if (_MSC_VER == 1200)
  30. #define strcasecmp stricmp
  31. #define strncasecmp strnicmp
  32. #else
  33. #define strcasecmp _stricmp
  34. #define strncasecmp _strnicmp
  35. #endif
  36. #define inline _inline
  37. #if (_MSC_VER == 1600)
  38. #define strdup _strdup
  39. #endif
  40. #endif
  41. #define MAX_GETOPT_OPTIONS 100
  42. //extension of option struct in getopt
  43. struct OptionExt
  44. {
  45. const char *name;
  46. int has_arg;
  47. int *flag;
  48. int val;
  49. const char *help;
  50. };
  51. #define MAX_FILE_PATH 256
  52. #define MAX_PIC_SKIP_NUM 5
  53. #ifdef SUPPORT_SRC_BUF_CONTROL
  54. #define ENC_SRC_BUF_NUM 2000
  55. #else
  56. #define ENC_SRC_BUF_NUM 16 //!< case of GOPsize = 8 (IBBBBBBBP), max src buffer num = 13
  57. #endif
  58. #define EXTRA_SRC_BUFFER_NUM 0
  59. #define VPU_WAIT_TIME_OUT 10 //should be less than normal decoding time to give a chance to fill stream. if this value happens some problem. we should fix VPU_WaitInterrupt function
  60. #define VPU_WAIT_TIME_OUT_CQ 1
  61. #define PARALLEL_VPU_WAIT_TIME_OUT 1 //the value of timeout is 1 means we want to keep a waiting time to give a chance of an interrupt of the next core.
  62. extern char* productNameList[];
  63. typedef union {
  64. struct {
  65. Uint32 ctu_force_mode : 2; //[ 1: 0]
  66. Uint32 ctu_coeff_drop : 1; //[ 2]
  67. Uint32 reserved : 5; //[ 7: 3]
  68. Uint32 sub_ctu_qp_0 : 6; //[13: 8]
  69. Uint32 sub_ctu_qp_1 : 6; //[19:14]
  70. Uint32 sub_ctu_qp_2 : 6; //[25:20]
  71. Uint32 sub_ctu_qp_3 : 6; //[31:26]
  72. Uint32 lambda_sad_0 : 8; //[39:32]
  73. Uint32 lambda_sad_1 : 8; //[47:40]
  74. Uint32 lambda_sad_2 : 8; //[55:48]
  75. Uint32 lambda_sad_3 : 8; //[63:56]
  76. } field;
  77. } EncCustomMap; // for wave520 custom map (1 CTU = 64bits)
  78. typedef enum {
  79. MODE_YUV_LOAD = 0,
  80. MODE_COMP_JYUV,
  81. MODE_SAVE_JYUV,
  82. MODE_COMP_CONV_YUV,
  83. MODE_SAVE_CONV_YUV,
  84. MODE_SAVE_LOAD_YUV,
  85. MODE_COMP_RECON,
  86. MODE_SAVE_RECON,
  87. MODE_COMP_ENCODED,
  88. MODE_SAVE_ENCODED
  89. } CompSaveMode;
  90. typedef struct {
  91. int picX;
  92. int picY;
  93. int internalBitDepth;
  94. int losslessEnable;
  95. int constIntraPredFlag;
  96. int gopSize;
  97. int numTemporalLayers;
  98. int decodingRefreshType;
  99. int intraQP;
  100. int intraPeriod;
  101. int frameRate;
  102. int confWinTop;
  103. int confWinBot;
  104. int confWinLeft;
  105. int confWinRight;
  106. int independSliceMode;
  107. int independSliceModeArg;
  108. int dependSliceMode;
  109. int dependSliceModeArg;
  110. int intraRefreshMode;
  111. int intraRefreshArg;
  112. int useRecommendEncParam;
  113. int scalingListEnable;
  114. int cuSizeMode;
  115. int tmvpEnable;
  116. int wppenable;
  117. int maxNumMerge;
  118. int dynamicMerge8x8Enable;
  119. int dynamicMerge16x16Enable;
  120. int dynamicMerge32x32Enable;
  121. int disableDeblk;
  122. int lfCrossSliceBoundaryEnable;
  123. int betaOffsetDiv2;
  124. int tcOffsetDiv2;
  125. int skipIntraTrans;
  126. int saoEnable;
  127. int intraInInterSliceEnable;
  128. int intraNxNEnable;
  129. int rcEnable;
  130. int bitRate;
  131. int intraQpOffset;
  132. int initBufLevelx8;
  133. int bitAllocMode;
  134. int fixedBitRatio[MAX_GOP_NUM];
  135. int cuLevelRCEnable;
  136. int hvsQPEnable;
  137. int hvsQpScaleEnable;
  138. int hvsQpScale;
  139. int minQp;
  140. int maxQp;
  141. int maxDeltaQp;
  142. int initDelay;
  143. int transRate;
  144. int gopPresetIdx;
  145. // CUSTOM_GOP
  146. CustomGopParam gopParam;
  147. // ROI / CTU mode
  148. HevcCtuOptParam ctuOptParam;
  149. char roiFileName[MAX_FILE_PATH];
  150. char ctuQpFileName[MAX_FILE_PATH];
  151. // VUI
  152. HevcVuiParam vuiParam;
  153. Uint32 numUnitsInTick;
  154. Uint32 timeScale;
  155. Uint32 numTicksPocDiffOne;
  156. int encAUD;
  157. int encEOS;
  158. int encEOB;
  159. int chromaCbQpOffset;
  160. int chromaCrQpOffset;
  161. Uint32 initialRcQp;
  162. Uint32 nrYEnable;
  163. Uint32 nrCbEnable;
  164. Uint32 nrCrEnable;
  165. Uint32 nrNoiseEstEnable;
  166. Uint32 nrNoiseSigmaY;
  167. Uint32 nrNoiseSigmaCb;
  168. Uint32 nrNoiseSigmaCr;
  169. Uint32 nrIntraWeightY;
  170. Uint32 nrIntraWeightCb;
  171. Uint32 nrIntraWeightCr;
  172. Uint32 nrInterWeightY;
  173. Uint32 nrInterWeightCb;
  174. Uint32 nrInterWeightCr;
  175. Uint32 intraMinQp;
  176. Uint32 intraMaxQp;
  177. Uint32 useAsLongtermPeriod;
  178. Uint32 refLongtermPeriod;
  179. Uint32 vuiDataEnable;
  180. Uint32 vuiDataSize;
  181. char vuiDataFileName[MAX_FILE_PATH];
  182. Uint32 hrdInVPS;
  183. Uint32 hrdInVUI;
  184. Uint32 hrdDataSize;
  185. char hrdDataFileName[MAX_FILE_PATH];
  186. Uint32 prefixSeiEnable;
  187. Uint32 prefixSeiDataSize;
  188. Uint32 prefixSeiTimingFlag;
  189. char prefixSeiDataFileName[MAX_FILE_PATH];
  190. Uint32 suffixSeiEnable;
  191. Uint32 suffixSeiDataSize;
  192. Uint32 suffixSeiTimingFlag;
  193. char suffixSeiDataFileName[MAX_FILE_PATH];
  194. int forcedIdrHeaderEnable;
  195. // newly added for WAVE520
  196. } HEVC_ENC_CFG;
  197. typedef struct {
  198. char SrcFileName[MAX_FILE_PATH];
  199. char BitStreamFileName[MAX_FILE_PATH];
  200. BOOL srcCbCrInterleave;
  201. int NumFrame;
  202. int PicX;
  203. int PicY;
  204. int FrameRate;
  205. // MPEG4 ONLY
  206. int VerId;
  207. int DataPartEn;
  208. int RevVlcEn;
  209. int ShortVideoHeader;
  210. int AnnexI;
  211. int AnnexJ;
  212. int AnnexK;
  213. int AnnexT;
  214. int IntraDcVlcThr;
  215. int VopQuant;
  216. int frameCroppingFlag;
  217. int frameCropLeft;
  218. int frameCropRight;
  219. int frameCropTop;
  220. int frameCropBottom;
  221. // H.264 ONLY
  222. int ConstIntraPredFlag;
  223. int DisableDeblk;
  224. int DeblkOffsetA;
  225. int DeblkOffsetB;
  226. int ChromaQpOffset;
  227. int PicQpY;
  228. // H.264 VUI information
  229. int VuiPresFlag;
  230. int VideoSignalTypePresFlag;
  231. char VideoFormat;
  232. char VideoFullRangeFlag;
  233. int ColourDescripPresFlag;
  234. char ColourPrimaries;
  235. char TransferCharacteristics;
  236. char MatrixCoeff;
  237. int NumReorderFrame;
  238. int MaxDecBuffering;
  239. int aud_en;
  240. int level;
  241. // COMMON
  242. int GopPicNum;
  243. int SliceMode;
  244. int SliceSizeMode;
  245. int SliceSizeNum;
  246. // COMMON - RC
  247. int RcEnable;
  248. int RcBitRate;
  249. int RcInitDelay;
  250. int RcBufSize;
  251. int IntraRefreshNum;
  252. int ConscIntraRefreshEnable;
  253. int frameSkipDisable;
  254. int ConstantIntraQPEnable;
  255. int MaxQpSetEnable;
  256. int MaxQp;
  257. //H.264 only
  258. int MaxDeltaQpSetEnable;
  259. int MaxDeltaQp;
  260. int MinQpSetEnable;
  261. int MinQp;
  262. int MinDeltaQpSetEnable;
  263. int MinDeltaQp;
  264. int intraCostWeight;
  265. //MP4 Only
  266. int RCIntraQP;
  267. int HecEnable;
  268. int GammaSetEnable;
  269. int Gamma;
  270. // NEW RC Scheme
  271. int rcIntervalMode;
  272. int RcMBInterval;
  273. int skipPicNums[MAX_PIC_SKIP_NUM];
  274. int SearchRange; // for coda960
  275. int MeUseZeroPmv; // will be removed. must be 264 = 0, mpeg4 = 1 263 = 0
  276. int MeBlkModeEnable; // only api option
  277. int IDRInterval;
  278. int SrcBitDepth;
  279. HEVC_ENC_CFG hevcCfg;
  280. #ifdef AUTO_FRM_SKIP_DROP
  281. int enAutoFrmSkip;
  282. int enAutoFrmDrop;
  283. int vbvThreshold;
  284. int qpThreshold;
  285. int maxContinuosFrameSkipNum;
  286. int maxContinuosFrameDropNum;
  287. #endif
  288. int rcWeightFactor;
  289. } ENC_CFG;
  290. extern Uint32 randomSeed;
  291. /* yuv & md5 */
  292. #define NO_COMPARE 0
  293. #define YUV_COMPARE 1
  294. #define MD5_COMPARE 2
  295. #define STREAM_COMPARE 3
  296. #ifdef __cplusplus
  297. extern "C" {
  298. #endif /* __cplusplus */
  299. /* Performance report */
  300. typedef void* PFCtx;
  301. PFCtx PFMonitorSetup(
  302. Uint32 coreIndex,
  303. Uint32 instanceIndex,
  304. Uint32 referenceClkInMHz,
  305. Uint32 fps,
  306. char* strLogDir
  307. );
  308. void PFMonitorRelease(
  309. PFCtx context
  310. );
  311. void PFMonitorUpdate(
  312. PFCtx context,
  313. Uint32 cycles
  314. );
  315. void PrepareDecoderTest(
  316. DecHandle decHandle
  317. );
  318. void PreparationWorkForDecTest(
  319. DecHandle decHandle
  320. );
  321. void byte_swap(
  322. unsigned char* data,
  323. int len
  324. );
  325. Int32 LoadFirmware(
  326. Int32 productId,
  327. Uint8** retFirmware,
  328. Uint32* retSizeInWord,
  329. const char* path
  330. );
  331. void PrintDecSeqWarningMessages(
  332. Uint32 productId,
  333. DecInitialInfo* seqInfo
  334. );
  335. void
  336. DisplayEncodedInformation(
  337. EncHandle handle,
  338. CodStd codec,
  339. Uint32 frameNo,
  340. EncOutputInfo* encodedInfo,
  341. ...
  342. );
  343. void PrintEncSppStatus(
  344. Uint32 coreIdx,
  345. Uint32 productId
  346. );
  347. void WriteRegVCE(
  348. Uint32 core_idx,
  349. Uint32 vce_core_idx,
  350. Uint32 vce_addr,
  351. Uint32 udata
  352. );
  353. Uint32 ReadRegVCE(
  354. Uint32 core_idx,
  355. Uint32 vce_core_idx,
  356. Uint32 vce_addr
  357. );
  358. /*
  359. * VPU Helper functions
  360. */
  361. /************************************************************************/
  362. /* Video */
  363. /************************************************************************/
  364. #define PUT_BYTE(_p, _b) \
  365. *_p++ = (unsigned char)_b;
  366. #define PUT_BUFFER(_p, _buf, _len) \
  367. osal_memcpy(_p, _buf, _len); \
  368. _p += _len;
  369. #define PUT_LE32(_p, _var) \
  370. *_p++ = (unsigned char)((_var)>>0); \
  371. *_p++ = (unsigned char)((_var)>>8); \
  372. *_p++ = (unsigned char)((_var)>>16); \
  373. *_p++ = (unsigned char)((_var)>>24);
  374. #define PUT_BE32(_p, _var) \
  375. *_p++ = (unsigned char)((_var)>>24); \
  376. *_p++ = (unsigned char)((_var)>>16); \
  377. *_p++ = (unsigned char)((_var)>>8); \
  378. *_p++ = (unsigned char)((_var)>>0);
  379. #define PUT_LE16(_p, _var) \
  380. *_p++ = (unsigned char)((_var)>>0); \
  381. *_p++ = (unsigned char)((_var)>>8);
  382. #define PUT_BE16(_p, _var) \
  383. *_p++ = (unsigned char)((_var)>>8); \
  384. *_p++ = (unsigned char)((_var)>>0);
  385. Int32 ConvFOURCCToMp4Class(
  386. Int32 fourcc
  387. );
  388. Int32 ConvFOURCCToCodStd(
  389. Uint32 fourcc
  390. );
  391. Int32 ConvCodecIdToMp4Class(
  392. Uint32 codecId
  393. );
  394. Int32 ConvCodecIdToCodStd(
  395. Int32 codecId
  396. );
  397. Int32 ConvCodecIdToFourcc(
  398. Int32 codecId
  399. );
  400. /*!
  401. * \brief wrapper function of StoreYuvImageBurstFormat()
  402. */
  403. Uint8* GetYUVFromFrameBuffer(
  404. DecHandle decHandle,
  405. FrameBuffer* fb,
  406. VpuRect rcFrame,
  407. Uint32* retWidth,
  408. Uint32* retHeight,
  409. Uint32* retBpp,
  410. size_t* retSize
  411. );
  412. /************************************************************************/
  413. /* VpuMutex */
  414. /************************************************************************/
  415. typedef void* VpuMutex;
  416. VpuMutex VpuMutex_Create(
  417. void
  418. );
  419. void VpuMutex_Destroy(
  420. VpuMutex handle
  421. );
  422. BOOL VpuMutex_Lock(
  423. VpuMutex handle
  424. );
  425. BOOL VpuMutex_Unlock(
  426. VpuMutex handle
  427. );
  428. /************************************************************************/
  429. /* Queue */
  430. /************************************************************************/
  431. typedef struct {
  432. void* data;
  433. } QueueData;
  434. typedef struct {
  435. Uint8* buffer;
  436. Uint32 size;
  437. Uint32 itemSize;
  438. Uint32 count;
  439. Uint32 front;
  440. Uint32 rear;
  441. VpuMutex lock;
  442. } Queue;
  443. Queue* Queue_Create(
  444. Uint32 itemCount,
  445. Uint32 itemSize
  446. );
  447. Queue* Queue_Create_With_Lock(
  448. Uint32 itemCount,
  449. Uint32 itemSize
  450. );
  451. void Queue_Destroy(
  452. Queue* queue
  453. );
  454. /**
  455. * \brief Enqueue with deep copy
  456. */
  457. BOOL Queue_Enqueue(
  458. Queue* queue,
  459. void* data
  460. );
  461. /**
  462. * \brief Caller has responsibility for releasing the returned data
  463. */
  464. void* Queue_Dequeue(
  465. Queue* queue
  466. );
  467. void Queue_Flush(
  468. Queue* queue
  469. );
  470. void* Queue_Peek(
  471. Queue* queue
  472. );
  473. Uint32 Queue_Get_Cnt(
  474. Queue* queue
  475. );
  476. /**
  477. * \brief @dstQ is NULL, it allocates Queue structure and then copy from @srcQ.
  478. */
  479. Queue* Queue_Copy(
  480. Queue* dstQ,
  481. Queue* srcQ
  482. );
  483. /************************************************************************/
  484. /* VpuThread */
  485. /************************************************************************/
  486. typedef void* VpuThread;
  487. typedef void(*VpuThreadRunner)(void*);
  488. VpuThread
  489. VpuThread_Create(
  490. VpuThreadRunner func,
  491. void* arg
  492. );
  493. BOOL
  494. VpuThread_Join(
  495. VpuThread thread
  496. );
  497. /*!
  498. * \brief millisecond sleep
  499. */
  500. void
  501. MSleep(
  502. Uint32 ms //!<< millisecond
  503. );
  504. /************************************************************************/
  505. /* ETC */
  506. /************************************************************************/
  507. Uint32 GetRandom(
  508. Uint32 start,
  509. Uint32 end
  510. );
  511. #ifdef PLATFORM_WIN32
  512. struct timezone {
  513. Int32 tz_minuteswest; /* minutes W of Greenwich */
  514. BOOL tz_dsttime; /* type of dst correction */
  515. };
  516. Int32 gettimeofday(
  517. struct timeval* tv,
  518. struct timezone* tz
  519. );
  520. #endif
  521. /************************************************************************/
  522. /* MD5 */
  523. /************************************************************************/
  524. typedef struct MD5state_st {
  525. Uint32 A,B,C,D;
  526. Uint32 Nl,Nh;
  527. Uint32 data[16];
  528. Uint32 num;
  529. } MD5_CTX;
  530. Int32 MD5_Init(
  531. MD5_CTX *c
  532. );
  533. Int32 MD5_Update(
  534. MD5_CTX* c,
  535. const void* data,
  536. size_t len);
  537. Int32 MD5_Final(
  538. Uint8* md,
  539. MD5_CTX* c
  540. );
  541. Uint8* MD5(
  542. const Uint8* d,
  543. size_t n,
  544. Uint8* md
  545. );
  546. void plane_md5(MD5_CTX *md5_ctx,
  547. Uint8 *src,
  548. int src_x,
  549. int src_y,
  550. int out_x,
  551. int out_y,
  552. int stride,
  553. int bpp,
  554. Uint16 zero
  555. );
  556. /************************************************************************/
  557. /* Comparator */
  558. /************************************************************************/
  559. #define COMPARATOR_SKIP 0xF0F0F0F0
  560. typedef enum {
  561. COMPARATOR_CONF_SET_GOLDEN_DATA_SIZE,
  562. COMPARATOR_CONF_SKIP_GOLDEN_DATA, /*!<< 2nd parameter pointer of Queue
  563. containing skip command */
  564. COMPARATOR_CONF_SET_PICINFO, //!<< This command is followed by YUVInfo structure.
  565. } ComparatorConfType;
  566. typedef void* Comparator;
  567. typedef struct ComparatorImpl {
  568. void* context;
  569. char* filename;
  570. Uint32 curIndex;
  571. Uint32 numOfFrames;
  572. BOOL (*Create)(struct ComparatorImpl* impl, char* path);
  573. BOOL (*Destroy)(struct ComparatorImpl* impl);
  574. BOOL (*Compare)(struct ComparatorImpl* impl, void* data, Uint32 size);
  575. BOOL (*Configure)(struct ComparatorImpl* impl, ComparatorConfType type, void* val);
  576. BOOL (*Rewind)(struct ComparatorImpl* impl);
  577. BOOL eof;
  578. BOOL enableScanMode;
  579. BOOL usePrevDataOneTime;
  580. } ComparatorImpl;
  581. typedef struct {
  582. Uint32 totalFrames;
  583. ComparatorImpl* impl;
  584. } AbstractComparator;
  585. // YUV Comparator
  586. typedef struct {
  587. Uint32 width;
  588. Uint32 height;
  589. FrameBufferFormat format;
  590. BOOL cbcrInterleave;
  591. BOOL isVp9;
  592. } PictureInfo;
  593. Comparator Comparator_Create(
  594. Uint32 type, //!<< 1: yuv
  595. char* goldenPath,
  596. ...
  597. );
  598. BOOL Comparator_Destroy(
  599. Comparator comp
  600. );
  601. BOOL Comparator_Act(
  602. Comparator comp,
  603. void* data,
  604. Uint32 size
  605. );
  606. BOOL Comparator_CheckFrameCount(
  607. Comparator comp
  608. );
  609. BOOL Comparator_SetScanMode(
  610. Comparator comp,
  611. BOOL enable
  612. );
  613. BOOL Comparator_Rewind(
  614. Comparator comp
  615. );
  616. BOOL Comparator_CheckEOF(
  617. Comparator comp
  618. );
  619. Queue* Comprator_MakeSkipData(
  620. Comparator comp,
  621. const char* skipCmd
  622. );
  623. BOOL IsEndOfFile(
  624. FILE* fp
  625. );
  626. /************************************************************************/
  627. /* Bitstream Feeder */
  628. /************************************************************************/
  629. typedef enum {
  630. FEEDING_METHOD_FIXED_SIZE,
  631. FEEDING_METHOD_FRAME_SIZE,
  632. FEEDING_METHOD_SIZE_PLUS_ES,
  633. FEEDING_METHOD_MAX
  634. } FeedingMethod;
  635. typedef struct {
  636. void* data;
  637. Uint32 size;
  638. BOOL eos; //!<< End of stream
  639. } BSChunk;
  640. typedef void* BSFeeder;
  641. typedef void (*BSFeederHook)(BSFeeder feeder, void* data, Uint32 size, void* arg);
  642. /**
  643. * \brief BitstreamFeeder consumes bitstream and updates information of bitstream buffer of VPU.
  644. * \param handle handle of decoder
  645. * \param path bitstream path
  646. * \param method feeding method. see FeedingMethod.
  647. * \param loopCount If @loopCount is greater than 1 then BistreamFeeder reads the start of bitstream again
  648. * when it encounters the end of stream @loopCount times.
  649. * \param ... FEEDING_METHOD_FIXED_SIZE:
  650. * This value of parameter is size of chunk at a time.
  651. * If the size of chunk is equal to zero than the BitstreamFeeder reads bistream in random size.(1Byte ~ 4MB)
  652. * \return It returns the pointer of handle containing the context of the BitstreamFeeder.
  653. */
  654. void* BitstreamFeeder_Create(
  655. const char* path,
  656. FeedingMethod method,
  657. PhysicalAddress base,
  658. Uint32 size,
  659. ...
  660. );
  661. /**
  662. * \brief This is helper function set to simplify the flow that update bit-stream
  663. * to the VPU.
  664. */
  665. Uint32 BitstreamFeeder_Act(
  666. DecHandle decHandle,
  667. BSFeeder feeder,
  668. EndianMode endian,
  669. vpu_buffer_t* buffer
  670. );
  671. /**
  672. * \brief Set filling bitstream as ringbuffer mode or linebuffer mode.
  673. * \param mode 0 : auto
  674. * 1 : ringbuffer
  675. * 2 : linebuffer.
  676. */
  677. #define BSF_FILLING_AUTO 0
  678. #define BSF_FILLING_RINGBUFFER 1
  679. #define BSF_FILLING_LINEBUFFER 2
  680. /* BSF_FILLING_RINBGUFFER_WITH_ENDFLAG:
  681. * Scenario:
  682. * - Application writes 1 ~ 10 frames into bitstream buffer.
  683. * - Set stream end flag by using VPU_DecUpdateBitstreamBuffer(handle, 0).
  684. * - Application clears stream end flag by using VPU_DecUpdateBitstreamBuffer(handle, -1).
  685. * when indexFrameDisplay is equal to -1.
  686. * NOTE:
  687. * - Last frame cannot be a complete frame.
  688. */
  689. #define BSF_FILLING_RINGBUFFER_WITH_ENDFLAG 3
  690. void BitstreamFeeder_SetFillMode(
  691. BSFeeder feeder,
  692. Uint32 mode
  693. );
  694. BOOL BitstreamFeeder_IsEos(
  695. BSFeeder feeder
  696. );
  697. BOOL BitstreamFeeder_Destroy(
  698. BSFeeder feeder
  699. );
  700. BOOL BitstreamFeeder_Rewind(
  701. BSFeeder feeder
  702. );
  703. BOOL BitstreamFeeder_SetHook(
  704. BSFeeder feeder,
  705. BSFeederHook hookFunc,
  706. void* arg
  707. );
  708. BOOL BitstreamFeeder_SetAutoUpdate(
  709. BSFeeder feeder,
  710. BOOL onoff
  711. );
  712. /************************************************************************/
  713. /* YUV Feeder */
  714. /************************************************************************/
  715. #define SOURCE_YUV 0
  716. #define SOURCE_YUV_WITH_LOADER 2
  717. #define SOURCE_YUV_WITH_BUFFER 3
  718. #define JPEG_CREATE 0x01 //!<< This command is followed by yuvInfo structure.
  719. typedef struct {
  720. Uint32 cbcrInterleave;
  721. Uint32 nv21;
  722. Uint32 packedFormat;
  723. Uint32 srcFormat;
  724. Uint32 srcPlanar;
  725. Uint32 srcStride;
  726. Uint32 srcHeight;
  727. } YuvInfo;
  728. typedef void* YuvFeeder;
  729. typedef struct YuvFeederImpl {
  730. void* context;
  731. BOOL (*Create)(struct YuvFeederImpl* impl, const char* path, Uint32 packed, Uint32 fbStride, Uint32 fbHeight);
  732. BOOL (*Feed)(struct YuvFeederImpl* impl, Int32 coreIdx, FrameBuffer *fb, size_t picWidth, size_t picHeight, void* arg);
  733. BOOL (*Destroy)(struct YuvFeederImpl* impl);
  734. BOOL (*Configure)(struct YuvFeederImpl* impl, Uint32 cmd, YuvInfo yuv);
  735. } YuvFeederImpl;
  736. typedef struct {
  737. YuvFeederImpl* impl;
  738. Uint8 pYuv;
  739. } AbstractYuvFeeder;
  740. typedef struct {
  741. osal_file_t* fp;
  742. Uint8* pYuv;
  743. size_t fbStride;
  744. size_t cbcrInterleave;
  745. BOOL srcPlanar;
  746. } yuvContext;
  747. YuvFeeder YuvFeeder_Create(
  748. Uint32 type,
  749. const char* srcFilePath,
  750. YuvInfo yuvInfo
  751. );
  752. BOOL YuvFeeder_Feed(
  753. YuvFeeder feeder,
  754. Uint32 coreIdx,
  755. FrameBuffer* fb,
  756. size_t picWidth,
  757. size_t picHeight,
  758. void* arg
  759. );
  760. BOOL YuvFeeder_Destroy(
  761. YuvFeeder feeder
  762. );
  763. /************************************************************************/
  764. /* CNM video helper */
  765. /************************************************************************/
  766. /**
  767. * \param convertCbcrIntl If this value is TRUE, it stores YUV as NV12 or NV21 to @fb
  768. */
  769. BOOL LoadYuvImageBurstFormat(
  770. Uint32 coreIdx,
  771. Uint8* src,
  772. size_t picWidth,
  773. size_t picHeight,
  774. FrameBuffer *fb,
  775. BOOL convertCbcrIntl
  776. );
  777. void PreparationWorkForEncTest(
  778. EncHandle handle
  779. );
  780. int ProcessEncodedBitstreamBurst(
  781. Uint32 core_idx,
  782. osal_file_t fp,
  783. int targetAddr,
  784. PhysicalAddress bsBufStartAddr,
  785. PhysicalAddress bsBufEndAddr,
  786. int size,
  787. int endian,
  788. Comparator comparator
  789. );
  790. BOOL LoadTiledImageYuvBurst(
  791. Uint32 coreIdx,
  792. BYTE* pYuv,
  793. size_t picWidth,
  794. size_t picHeight,
  795. FrameBuffer* fb,
  796. TiledMapConfig mapCfg
  797. );
  798. Uint32 StoreYuvImageBurstFormat(
  799. Uint32 coreIndex,
  800. FrameBuffer* fbSrc,
  801. TiledMapConfig mapCfg,
  802. Uint8* pDst,
  803. VpuRect cropRect,
  804. BOOL enableCrop
  805. );
  806. /************************************************************************/
  807. /* Bit Reader */
  808. /************************************************************************/
  809. #define BS_RESET_BUF 0
  810. #define BS_RING_BUF 1
  811. #define BUFFER_MODE_TYPE_LINEBUFFER 0
  812. #define BUFFER_MODE_TYPE_RINGBUFFER 1
  813. typedef void* BitstreamReader;
  814. typedef struct BitstreamReaderImpl {
  815. void* context;
  816. BOOL (*Create)(struct BitstreamReaderImpl* impl, const char* path);
  817. Uint32 (*Act)(struct BitstreamReaderImpl* impl, Int32 coreIdx, PhysicalAddress bitstreamBuffer, Uint32 bitstreamBufferSize, int endian, Comparator comparator);
  818. BOOL (*Destroy)(struct BitstreamReaderImpl* impl);
  819. BOOL (*Configure)(struct BitstreamReaderImpl* impl, Uint32 cmd, void* val);
  820. } BitstreamReaderImpl;
  821. /*!
  822. * \param type 0: Linebuffer, 1: Ringbuffer
  823. * \param path output filepath.
  824. * \param endian Endianness of bitstream buffer
  825. * \param handle Pointer of encoder handle
  826. */
  827. BitstreamReader BitstreamReader_Create(
  828. Uint32 type,
  829. char* path,
  830. EndianMode endian,
  831. EncHandle* handle
  832. );
  833. /*!
  834. * \param bitstreamBuffer base address of bitstream buffer
  835. * \param bitstreamBufferSize size of bitstream buffer
  836. */
  837. BOOL BitstreamReader_Act(
  838. BitstreamReader reader,
  839. PhysicalAddress bitstreamBuffer,
  840. Uint32 bitstreamBufferSize,
  841. Uint32 defaultsize,
  842. Comparator comparator
  843. );
  844. BOOL BitstreamReader_Destroy(
  845. BitstreamReader reader
  846. );
  847. /*!
  848. * \param type 0: Linebuffer, 1: Ringbuffer
  849. * \param path output filepath.
  850. * \param endian Endianness of bitstream buffer
  851. * \param handle Pointer of encoder handle
  852. */
  853. BitstreamReader BufferStreamReader_Create(
  854. Uint32 type,
  855. EndianMode endian,
  856. EncHandle* handle
  857. );
  858. /*!
  859. * \param bitstreamBuffer base address of bitstream buffer
  860. * \param bitstreamBufferSize size of bitstream buffer
  861. */
  862. Uint32 BufferStreamReader_Act(
  863. BitstreamReader reader,
  864. PhysicalAddress bitstreamBuffer,
  865. Uint32 bitstreamBufferSize,
  866. Uint32 defaultsize,
  867. Uint8* pBuffer,
  868. Comparator comparator
  869. );
  870. BOOL BufferStreamReader_Destroy(
  871. BitstreamReader reader
  872. );
  873. /************************************************************************/
  874. /* Binary Reader */
  875. /************************************************************************/
  876. /************************************************************************/
  877. /* Simple Renderer */
  878. /************************************************************************/
  879. typedef void* Renderer;
  880. typedef enum {
  881. RENDER_DEVICE_NULL,
  882. RENDER_DEVICE_FBDEV,
  883. RENDER_DEVICE_HDMI,
  884. RENDER_DEVICE_MAX
  885. } RenderDeviceType;
  886. typedef struct RenderDevice {
  887. void* context;
  888. DecHandle decHandle;
  889. BOOL (*Open)(struct RenderDevice* device);
  890. void (*Render)(struct RenderDevice* device, DecOutputInfo* fbInfo, Uint8* yuv, Uint32 width, Uint32 height);
  891. BOOL (*Close)(struct RenderDevice* device);
  892. } RenderDevice;
  893. Renderer SimpleRenderer_Create(
  894. DecHandle decHandle,
  895. RenderDeviceType deviceType,
  896. const char* yuvPath //!<< path to store yuv iamge.
  897. );
  898. Uint32 SimpleRenderer_Act(
  899. Renderer renderer,
  900. DecOutputInfo* fbInfo,
  901. Uint8* pYuv,
  902. Uint32 width,
  903. Uint32 height
  904. );
  905. void* SimpleRenderer_GetFreeFrameInfo(
  906. Renderer renderer
  907. );
  908. /* \brief Flush display queues and clear display indexes
  909. */
  910. void SimpleRenderer_Flush(
  911. Renderer renderer
  912. );
  913. BOOL SimpleRenderer_Destroy(
  914. Renderer renderer
  915. );
  916. BOOL SimpleRenderer_SetFrameRate(
  917. Renderer renderer,
  918. Uint32 fps
  919. );
  920. /************************************************************************/
  921. /* Etc */
  922. /************************************************************************/
  923. typedef struct {
  924. DecOutputInfo* buffer;
  925. int size;
  926. int count;
  927. int front;
  928. int rear;
  929. } frame_queue_item_t;
  930. frame_queue_item_t* frame_queue_init(
  931. Int32 count
  932. );
  933. void frame_queue_deinit(
  934. frame_queue_item_t* queue
  935. );
  936. Int32 frame_queue_enqueue(
  937. frame_queue_item_t* queue,
  938. DecOutputInfo data
  939. );
  940. Int32 frame_queue_dequeue(
  941. frame_queue_item_t* queue,
  942. DecOutputInfo* data
  943. );
  944. Int32 frame_queue_dequeue_all(
  945. frame_queue_item_t* queue
  946. );
  947. Int32 frame_queue_peekqueue(
  948. frame_queue_item_t* queue,
  949. DecOutputInfo* data
  950. );
  951. Int32 frame_queue_count(
  952. frame_queue_item_t* queue
  953. );
  954. Int32 frame_queue_check_in_queue(
  955. frame_queue_item_t* queue,
  956. Int32 index
  957. );
  958. /*******************************************************************************
  959. * DATATYPES AND FUNCTIONS RELATED TO REPORT
  960. *******************************************************************************/
  961. typedef struct
  962. {
  963. osal_file_t fpPicDispInfoLogfile;
  964. osal_file_t fpPicTypeLogfile;
  965. osal_file_t fpSeqDispInfoLogfile;
  966. osal_file_t fpUserDataLogfile;
  967. osal_file_t fpSeqUserDataLogfile;
  968. // encoder report file
  969. osal_file_t fpEncSliceBndInfo;
  970. osal_file_t fpEncQpInfo;
  971. osal_file_t fpEncmvInfo;
  972. osal_file_t fpEncsliceInfo;
  973. // Report Information
  974. BOOL reportOpened;
  975. Int32 decIndex;
  976. vpu_buffer_t vb_rpt;
  977. BOOL userDataEnable;
  978. BOOL userDataReportMode;
  979. Int32 profile;
  980. Int32 level;
  981. } vpu_rpt_info_t;
  982. typedef struct VpuReportConfig_t {
  983. PhysicalAddress userDataBufAddr;
  984. BOOL userDataEnable;
  985. Int32 userDataReportMode; // (0 : Int32errupt mode, 1 Int32errupt disable mode)
  986. Int32 userDataBufSize;
  987. } VpuReportConfig_t;
  988. void OpenDecReport(
  989. Uint32 core_idx,
  990. VpuReportConfig_t* cfg
  991. );
  992. void CloseDecReport(
  993. Uint32 core_idx
  994. );
  995. void ConfigDecReport(
  996. Uint32 core_idx,
  997. DecHandle handle,
  998. CodStd bitstreamFormat
  999. );
  1000. void SaveDecReport(
  1001. Uint32 core_idx,
  1002. DecHandle handle,
  1003. DecOutputInfo* pDecInfo,
  1004. CodStd bitstreamFormat,
  1005. Uint32 mbNumX,
  1006. Uint32 mbNumY
  1007. );
  1008. void CheckUserDataInterrupt(
  1009. Uint32 core_idx,
  1010. DecHandle handle,
  1011. Int32 decodeIdx,
  1012. CodStd bitstreamFormat,
  1013. Int32 int_reason
  1014. );
  1015. #define MAX_CFG (217)
  1016. #define MAX_ROI_LEVEL (8)
  1017. #define LOG2_CTB_SIZE (6)
  1018. #define CTB_SIZE (1<<LOG2_CTB_SIZE)
  1019. #define LAMBDA_SCALE_FACTOR (100000)
  1020. #define FLOATING_POINT_LAMBDA (1)
  1021. #define TEMP_SCALABLE_RC (1)
  1022. #define UI16_MAX (0xFFFF)
  1023. #ifndef INT_MAX
  1024. #define INT_MAX (2147483647)
  1025. #endif
  1026. typedef enum {
  1027. INPUT_FILE = 0,
  1028. SOURCE_WIDTH,
  1029. SOURCE_HEIGHT,
  1030. INPUT_BIT_DEPTH,
  1031. FRAME_RATE, // 5
  1032. FRAME_SKIP,
  1033. FRAMES_TO_BE_ENCODED,
  1034. INTRA_PERIOD,
  1035. DECODING_REFRESH_TYPE,
  1036. DERIVE_LAMBDA_WEIGHT, // 10
  1037. GOP_SIZE,
  1038. EN_INTRA_IN_INTER_SLICE,
  1039. INTRA_NXN,
  1040. EN_CU_8X8,
  1041. EN_CU_16X16, // 15
  1042. EN_CU_32X32,
  1043. INTRA_TRANS_SKIP,
  1044. CONSTRAINED_INTRA_PRED,
  1045. INTRA_CTU_REFRESH_MODE,
  1046. INTRA_CTU_REFRESH_ARG, // 20
  1047. MAX_NUM_MERGE,
  1048. EN_DYN_MERGE,
  1049. EN_TEMPORAL_MVP,
  1050. SCALING_LIST,
  1051. INDE_SLICE_MODE, // 25
  1052. INDE_SLICE_ARG,
  1053. DE_SLICE_MODE,
  1054. DE_SLICE_ARG,
  1055. EN_DBK,
  1056. EN_SAO, // 30
  1057. LF_CROSS_SLICE_BOUNDARY_FLAG,
  1058. BETA_OFFSET_DIV2,
  1059. TC_OFFSET_DIV2,
  1060. WAVE_FRONT_SYNCHRO,
  1061. LOSSLESS_CODING, // 35
  1062. USE_PRESENT_ENC_TOOLS,
  1063. NUM_TEMPORAL_LAYERS,
  1064. GOP_PRESET,
  1065. RATE_CONTROL,
  1066. ENC_BITRATE, // 40
  1067. TRANS_BITRATE,
  1068. INITIAL_DELAY,
  1069. EN_HVS_QP,
  1070. CU_LEVEL_RATE_CONTROL,
  1071. CONF_WIND_SIZE_TOP, // 45
  1072. CONF_WIND_SIZE_BOT,
  1073. CONF_WIND_SIZE_RIGHT,
  1074. CONF_WIND_SIZE_LEFT,
  1075. HVS_QP_SCALE_DIV2,
  1076. MIN_QP, // 50
  1077. MAX_QP,
  1078. MAX_DELTA_QP,
  1079. NUM_ROI,
  1080. INTRA_QP,
  1081. ROI_DELTA_QP, // 55
  1082. INTRA_QP_OFFSET,
  1083. INIT_BUF_LEVELx8,
  1084. BIT_ALLOC_MODE,
  1085. FIXED_BIT_RATIO,
  1086. INTERNAL_BITDEPTH, // 60
  1087. EN_USER_DATA,
  1088. USER_DATA_ENC_ORDER,
  1089. USER_DATA_SIZE,
  1090. USER_DATA_SUFFIX_FLAG,
  1091. ROI_ENABLE, // 65
  1092. VUI_PARAM_FLAG,
  1093. VUI_ASPECT_RATIO_IDC,
  1094. VUI_SAR_SIZE,
  1095. VUI_OVERSCAN_APPROPRIATE,
  1096. VIDEO_SIGNAL, // 70
  1097. VUI_CHROMA_SAMPLE_LOC,
  1098. VUI_DISP_WIN_LEFT_RIGHT,
  1099. VUI_DISP_WIN_TOP_BOTTOM,
  1100. NUM_UNITS_IN_TICK,
  1101. TIME_SCALE, // 75
  1102. NUM_TICKS_POC_DIFF_ONE,
  1103. ENC_AUD,
  1104. ENC_EOS,
  1105. ENC_EOB,
  1106. CB_QP_OFFSET, // 80
  1107. CR_QP_OFFSET,
  1108. RC_INIT_QP,
  1109. EN_NR_Y,
  1110. EN_NR_CB,
  1111. EN_NR_CR, // 85
  1112. EN_NOISE_EST,
  1113. NOISE_SIGMA_Y,
  1114. NOISE_SIGMA_CB,
  1115. NOISE_SIGMA_CR,
  1116. INTRA_NOISE_WEIGHT_Y, // 90
  1117. INTRA_NOISE_WEIGHT_CB,
  1118. INTRA_NOISE_WEIGHT_CR,
  1119. INTER_NOISE_WEIGHT_Y,
  1120. INTER_NOISE_WEIGHT_CB,
  1121. INTER_NOISE_WEIGHT_CR, // 95
  1122. INTRA_MIN_QP,
  1123. INTRA_MAX_QP,
  1124. MDFLAG0,
  1125. MDFLAG1,
  1126. MDFLAG2, // 100
  1127. EN_SMART_BG,
  1128. THRPIXELNUMCNT,
  1129. THRMEAN0,
  1130. THRMEAN1,
  1131. THRMEAN2, // 105
  1132. THRMEAN3,
  1133. MDQPY,
  1134. MDQPC,
  1135. THRDCY0,
  1136. THRDCC0, // 110
  1137. THRDCY1,
  1138. THRDCC1,
  1139. THRDCY2,
  1140. THRDCC2,
  1141. THRACNUMY0, // 115
  1142. THRACNUMC0,
  1143. THRACNUMY1,
  1144. THRACNUMC1,
  1145. THRACNUMY2,
  1146. THRACNUMC2, // 120
  1147. USE_LONGTERM_PRRIOD,
  1148. REF_LONGTERM_PERIOD,
  1149. EN_CTU_MODE,
  1150. EN_CTU_QP,
  1151. CROP_X_POS, // 125
  1152. CROP_Y_POS,
  1153. CROP_X_SIZE,
  1154. CROP_Y_SIZE,
  1155. EN_VUI_DATA,
  1156. VUI_DATA_SIZE, // 130
  1157. EN_HRD_IN_VPS,
  1158. EN_HRD_IN_VUI,
  1159. HRD_DATA_SIZE,
  1160. EN_PREFIX_SEI_DATA,
  1161. PREFIX_SEI_DATA_SIZE, // 135
  1162. PREFIX_SEI_TIMING_FLAG,
  1163. EN_SUFFIX_SEI_DATA,
  1164. SUFFIX_SEI_DATA_SIZE,
  1165. SUFFIX_SEI_TIMING_FLAG,
  1166. EN_REPORT_MV_COL, // 140
  1167. EN_REPORT_DIST_MAP,
  1168. EN_REPORT_BIT_INFO,
  1169. EN_REPORT_FRAME_DIST,
  1170. EN_REPORT_QP_HISTO,
  1171. BITSTREAM_FILE, // 145
  1172. EN_CUSTOM_VPS,
  1173. EN_CUSTOM_SPS,
  1174. EN_CUSTOM_PPS,
  1175. CUSTOM_VPS_PSID,
  1176. CUSTOM_SPS_PSID, // 150
  1177. CUSTOM_SPS_ACTIVE_VPSID,
  1178. CUSTOM_PPS_ACTIVE_SPSID,
  1179. CUSTOM_VPS_INTFLAG,
  1180. CUSTOM_VPS_AVAILFLAG,
  1181. CUSTOM_VPS_MAXLAYER_MINUS1, // 155
  1182. CUSTOM_VPS_MAXSUBLAYER_MINUS1,
  1183. CUSTOM_VPS_TEMPID_NESTFLAG,
  1184. CUSTOM_VPS_MAXLAYER_ID,
  1185. CUSTOM_VPS_NUMLAYER_SETMINUS1,
  1186. CUSTOM_VPS_EXTFLAG, // 160
  1187. CUSTOM_VPS_EXTDATAFLAG,
  1188. CUSTOM_VPS_SUBORDER_INFOFLAG,
  1189. CUSTOM_SPS_SUBORDER_INFOFLAG,
  1190. CUSTOM_VPS_LAYERID_0,
  1191. CUSTOM_VPS_LAYERID_1, // 165
  1192. CUSTOM_SPS_LOG2_MAXPOC_MINUS4,
  1193. EN_FORCED_IDR_HEADER,
  1194. // newly added for WAVE520
  1195. EN_MONOCHROME,
  1196. EN_STRONG_INTRA_SMOOTH,
  1197. ROI_AVGQP, // 170
  1198. EN_WEIGHTED_PRED,
  1199. EN_BG_DETECT,
  1200. BG_TH_DIFF,
  1201. BG_TH_MEAN_DIFF,
  1202. BG_LAMBDA_QP, // 175
  1203. BG_DELTA_QP,
  1204. TILE_NUM_COLUMNS,
  1205. TILE_NUM_ROWS,
  1206. TILE_UNIFORM_SPACE,
  1207. EN_LAMBDA_MAP, // 180
  1208. EN_CUSTOM_LAMBDA,
  1209. EN_CUSTOM_MD,
  1210. PU04_DELTA_RATE,
  1211. PU08_DELTA_RATE,
  1212. PU16_DELTA_RATE, // 185
  1213. PU32_DELTA_RATE,
  1214. PU04_INTRA_PLANAR_DELTA_RATE,
  1215. PU04_INTRA_DC_DELTA_RATE,
  1216. PU04_INTRA_ANGLE_DELTA_RATE,
  1217. PU08_INTRA_PLANAR_DELTA_RATE, // 190
  1218. PU08_INTRA_DC_DELTA_RATE,
  1219. PU08_INTRA_ANGLE_DELTA_RATE,
  1220. PU16_INTRA_PLANAR_DELTA_RATE,
  1221. PU16_INTRA_DC_DELTA_RATE,
  1222. PU16_INTRA_ANGLE_DELTA_RATE, // 195
  1223. PU32_INTRA_PLANAR_DELTA_RATE,
  1224. PU32_INTRA_DC_DELTA_RATE,
  1225. PU32_INTRA_ANGLE_DELTA_RATE,
  1226. CU08_INTRA_DELTA_RATE,
  1227. CU08_INTER_DELTA_RATE, // 200
  1228. CU08_MERGE_DELTA_RATE,
  1229. CU16_INTRA_DELTA_RATE,
  1230. CU16_INTER_DELTA_RATE,
  1231. CU16_MERGE_DELTA_RATE,
  1232. CU32_INTRA_DELTA_RATE, // 205
  1233. CU32_INTER_DELTA_RATE,
  1234. CU32_MERGE_DELTA_RATE,
  1235. DISABLE_COEF_CLEAR,
  1236. EN_CUSTOM_MODE_MAP,
  1237. EN_TEMPORAL_LAYER_QP,
  1238. TID_0_QP,
  1239. TID_1_QP,
  1240. TID_2_QP,
  1241. TID_0_PERIOD,
  1242. } HevcCfgName;
  1243. typedef struct {
  1244. char *name;
  1245. int min;
  1246. int max;
  1247. int def;
  1248. } HevcCfgInfo;
  1249. Int32 GetEncOpenParamChange(
  1250. EncOpenParam* pEncOP,
  1251. char* cfgFileName,
  1252. ENC_CFG* pEncCfg,
  1253. EncHandle handle
  1254. );
  1255. void PrintVpuVersionInfo(
  1256. Uint32 coreIdx
  1257. );
  1258. void ChangePathStyle(
  1259. char *str
  1260. );
  1261. BOOL CalcYuvSize(
  1262. Int32 format,
  1263. Int32 picWidth,
  1264. Int32 picHeight,
  1265. Int32 cbcrInterleave,
  1266. size_t *lumaSize,
  1267. size_t *chromaSize,
  1268. size_t *frameSize,
  1269. Int32 *bitDepth,
  1270. Int32 *packedFormat,
  1271. Int32 *yuv3p4b
  1272. );
  1273. int GetPackedFormat (
  1274. int srcBitDepth,
  1275. int packedType,
  1276. int p10bits,
  1277. int msb
  1278. );
  1279. char* GetDirname(
  1280. const char* path
  1281. );
  1282. char* GetBasename(
  1283. const char* pathname
  1284. );
  1285. char* GetFileExtension(
  1286. const char* filename
  1287. );
  1288. int parseAvcCfgFile(
  1289. ENC_CFG* pEncCfg,
  1290. char* filename
  1291. );
  1292. int parseMp4CfgFile(
  1293. ENC_CFG* pEncCfg,
  1294. char* filename
  1295. );
  1296. int parseHevcCfgFile(
  1297. ENC_CFG* pEncCfg,
  1298. char* FileName
  1299. );
  1300. int parseRoiCtuModeParam(
  1301. char* lineStr,
  1302. VpuRect* roiRegion,
  1303. int* roiLevel,
  1304. int picX,
  1305. int picY
  1306. );
  1307. #ifdef __cplusplus
  1308. }
  1309. #endif /* __cplusplus */
  1310. typedef struct ObserverStruct {
  1311. void* ctx;
  1312. void (*construct)(struct ObserverStruct*, void*);
  1313. BOOL (*update)(struct ObserverStruct* ctx, void* data);
  1314. void (*destruct)(struct ObserverStruct*);
  1315. } Listener;
  1316. #define MAX_OBSERVERS 100
  1317. typedef struct TestMachine_struct {
  1318. Uint32 coreIdx;
  1319. Uint32 testEnvOptions; /*!<< See debug.h */
  1320. BOOL reset;
  1321. Listener observers[MAX_OBSERVERS];
  1322. Uint32 numObservers;
  1323. } TestMachine;
  1324. /************************************************************************/
  1325. /* Structure */
  1326. /************************************************************************/
  1327. typedef struct TestDecConfig_struct {
  1328. Uint32 magicNumber;
  1329. char outputPath[MAX_FILE_PATH];
  1330. char inputPath[MAX_FILE_PATH];
  1331. Int32 forceOutNum;
  1332. Int32 bitFormat;
  1333. Int32 reorder;
  1334. TiledMapType mapType;
  1335. Int32 bitstreamMode;
  1336. FeedingMethod feedingMode;
  1337. BOOL enableWTL;
  1338. FrameFlag wtlMode;
  1339. FrameBufferFormat wtlFormat;
  1340. Int32 coreIdx;
  1341. Int32 instIdx;
  1342. BOOL enableCrop; //!<< option for saving yuv
  1343. Uint32 loopCount;
  1344. BOOL cbcrInterleave; //!<< 0: None, 1: NV12, 2: NV21
  1345. BOOL nv21; //!<< FALSE: NV12, TRUE: NV21,
  1346. //!<< This variable is valid when cbcrInterleave is TRUE
  1347. EndianMode streamEndian;
  1348. EndianMode frameEndian;
  1349. Int32 secondaryAXI;
  1350. Int32 compareType;
  1351. char md5Path[MAX_FILE_PATH];
  1352. char fwPath[MAX_FILE_PATH];
  1353. char refYuvPath[MAX_FILE_PATH];
  1354. RenderDeviceType renderType;
  1355. BOOL thumbnailMode;
  1356. Int32 skipMode;
  1357. size_t bsSize;
  1358. struct {
  1359. BOOL enableMvc; //!<< H.264 MVC
  1360. BOOL enableSvc;
  1361. BOOL enableTiled2Linear;
  1362. FrameFlag tiled2LinearMode;
  1363. BOOL enableBWB;
  1364. Uint32 rotate; //!<< 0, 90, 180, 270
  1365. Uint32 mirror;
  1366. BOOL enableDering; //!<< MPEG-2/4
  1367. BOOL enableDeblock; //!<< MPEG-2/4
  1368. Uint32 mp4class; //!<< MPEG_4
  1369. Uint32 frameCacheBypass;
  1370. Uint32 frameCacheBurst;
  1371. Uint32 frameCacheMerge;
  1372. Uint32 frameCacheWayShape;
  1373. LowDelayInfo lowDelay; //!<< H.264
  1374. } coda9;
  1375. struct {
  1376. Uint32 numVCores; //!<< This numVCores is valid on PRODUCT_ID_4102 multi-core version
  1377. Uint32 fbcMode;
  1378. BOOL bwOptimization; //!<< On/Off bandwidth optimization function
  1379. BOOL craAsBla;
  1380. BOOL dualDisplay;
  1381. } wave4;
  1382. BOOL enableUserData;
  1383. Uint32 testEnvOptions; /*!<< See debug.h */
  1384. TestMachine* testMachine;
  1385. Uint32 tid; /*!<< Target temporal id for AVC and HEVC */
  1386. } TestDecConfig;
  1387. extern Listener decOutputInformation;
  1388. #ifdef __cplusplus
  1389. extern "C" {
  1390. #endif /* __cplusplus */
  1391. BOOL TestMachineSetup(
  1392. TestMachine* machine
  1393. );
  1394. void TestMachineCleanUp(
  1395. TestMachine* machine
  1396. );
  1397. struct option* ConvertOptions(
  1398. struct OptionExt* cnmOpt,
  1399. Uint32 nItems
  1400. );
  1401. void ReleaseVideoMemory(
  1402. Uint32 coreIndex,
  1403. vpu_buffer_t* memoryArr,
  1404. Uint32 count
  1405. );
  1406. BOOL AllocateDecFrameBuffer(
  1407. DecHandle decHandle,
  1408. TestDecConfig* config,
  1409. Uint32 tiledFbCount,
  1410. Uint32 linearFbCount,
  1411. FrameBuffer* retFbArray,
  1412. vpu_buffer_t* retFbAddrs,
  1413. Uint32* retStride
  1414. );
  1415. #define OUTPUT_FP_NUMBER 4
  1416. BOOL OpenDisplayBufferFile(
  1417. char *outputPath,
  1418. VpuRect rcDisplay,
  1419. TiledMapType mapType,
  1420. FILE *fp[]
  1421. );
  1422. void CloseDisplayBufferFile(
  1423. FILE *fp[]
  1424. );
  1425. void SaveDisplayBufferToFile(
  1426. DecHandle handle,
  1427. FrameBuffer dispFrame,
  1428. VpuRect rcDisplay,
  1429. FILE *fp[]
  1430. );
  1431. #ifdef SUPPORT_SAVE_PIC_INFO_TO_XML
  1432. FILE * CreatePicInfoXmlFile(
  1433. const char *yuvPath
  1434. );
  1435. void ClosePicInfoXMLFile(
  1436. FILE* fpXML
  1437. );
  1438. void SavePicInfoToXml(
  1439. FILE* fpXml,
  1440. DecOutputInfo* fbInfo
  1441. );
  1442. #endif /* SUPPORT_SAVE_PIC_INFO_TO_XML */
  1443. #ifdef __cplusplus
  1444. }
  1445. #endif /* __cplusplus */
  1446. typedef struct TestEncConfig_struct {
  1447. Uint32 magicNumber;
  1448. char yuvSourceBaseDir[MAX_FILE_PATH];
  1449. char yuvFileName[MAX_FILE_PATH];
  1450. char cmdFileName[MAX_FILE_PATH];
  1451. char bitstreamFileName[MAX_FILE_PATH];
  1452. char huffFileName[MAX_FILE_PATH];
  1453. char cInfoFileName[MAX_FILE_PATH];
  1454. char qMatFileName[MAX_FILE_PATH];
  1455. char qpFileName[MAX_FILE_PATH];
  1456. char cfgFileName[MAX_FILE_PATH];
  1457. CodStd stdMode;
  1458. int picWidth;
  1459. int picHeight;
  1460. int kbps;
  1461. int rotAngle;
  1462. int mirDir;
  1463. int useRot;
  1464. int qpReport;
  1465. int ringBufferEnable;
  1466. int rcIntraQp;
  1467. int outNum;
  1468. int skipPicNums[MAX_PIC_SKIP_NUM];
  1469. int instNum;
  1470. int coreIdx;
  1471. int mapType;
  1472. // 2D cache option
  1473. int lineBufIntEn;
  1474. int en_container; //enable container
  1475. int container_frame_rate; //framerate for container
  1476. int picQpY;
  1477. int cbcrInterleave;
  1478. int nv21;
  1479. BOOL needSourceConvert; //!<< If the format of YUV file is YUV planar mode and EncOpenParam::cbcrInterleave or EncOpenParam::nv21 is true
  1480. //!<< the value of needSourceConvert should be true.
  1481. int packedFormat;
  1482. int srcFormat;
  1483. int srcFormat3p4b;
  1484. int bitdepth;
  1485. int secondary_axi;
  1486. int stream_endian;
  1487. int frame_endian;
  1488. int source_endian;
  1489. int compare_type;
  1490. #define YUV_MODE_YUV 0
  1491. #define YUV_MODE_JYUV_CONV 1
  1492. #define YUV_MODE_YUV_LOADER 2
  1493. int yuv_mode;
  1494. char ref_stream_path[MAX_FILE_PATH];
  1495. int loopCount;
  1496. char ref_recon_md5_path[MAX_FILE_PATH];
  1497. #if defined(SUPPORT_W5ENC_BW_REPORT) || defined(CNM_FPGA_PLATFORM)
  1498. BOOL performance;
  1499. #endif
  1500. char roi_file_name[MAX_FILE_PATH];
  1501. FILE *roi_file;
  1502. int roi_enable;
  1503. int roi_delta_qp;
  1504. char ctuqp_file_name[MAX_FILE_PATH];
  1505. FILE *ctuqp_file;
  1506. int ctu_qp_enable;
  1507. int ctuQp[MAX_ROI_NUMBER];
  1508. //char user_data_file_name[MAX_FILE_PATH];
  1509. //FILE *user_data_fp;
  1510. HevcSEIDataEnc seiDataEnc;
  1511. char hrd_rbsp_file_name[MAX_FILE_PATH];
  1512. FILE *hrd_rbsp_fp;
  1513. char vui_rbsp_file_name[MAX_FILE_PATH];
  1514. FILE *vui_rbsp_fp;
  1515. char prefix_sei_nal_file_name[MAX_FILE_PATH];
  1516. FILE *prefix_sei_nal_fp;
  1517. char suffix_sei_nal_file_name[MAX_FILE_PATH];
  1518. FILE *suffix_sei_nal_fp;
  1519. int encAUD;
  1520. int encEOS;
  1521. int encEOB;
  1522. struct {
  1523. BOOL enableSvc;
  1524. BOOL enableLinear2Tiled;
  1525. FrameFlag linear2TiledMode;
  1526. } coda9;
  1527. VpuRect region[MAX_ROI_NUMBER]; /**< The size of the ROI region for H.265 (start X/Y in CTU, end X/Y int CTU) */
  1528. int roiLevel[MAX_ROI_NUMBER]; /**< An importance level for the given ROI region for H.265. The higher an ROI level is, the more important the region is with a lower QP. */
  1529. int useAsLongtermPeriod;
  1530. int refLongtermPeriod;
  1531. Uint32 testEnvOptions; /*!<< See debug.h */
  1532. // newly added for WAVE520
  1533. } TestEncConfig;
  1534. #ifdef __cplusplus
  1535. extern "C" {
  1536. #endif /* __cplusplus */
  1537. Int32 GetEncOpenParam(
  1538. EncOpenParam* pEncOP,
  1539. TestEncConfig* pEncConfig,
  1540. ENC_CFG* pEncCfg
  1541. );
  1542. Int32 GetEncOpenParamDefault(
  1543. EncOpenParam* pEncOP,
  1544. TestEncConfig* pEncConfig
  1545. );
  1546. void GenRegionToMap(
  1547. VpuRect *region, /**< The size of the ROI region for H.265 (start X/Y in CTU, end X/Y in CTU) */
  1548. int *roiLevel,
  1549. int num,
  1550. Uint32 mapWidth,
  1551. Uint32 mapHeight,
  1552. Uint8 *roiCtuMap
  1553. );
  1554. int setRoiMap(
  1555. int coreIdx,
  1556. TestEncConfig *encConfig,
  1557. EncOpenParam encOP,
  1558. PhysicalAddress addrRoiMap,
  1559. Uint8 *roiMapBuf,
  1560. int srcFrameWidth,
  1561. int srcFrameHeight,
  1562. EncParam *encParam,
  1563. int maxCtuNum
  1564. );
  1565. #define VUI_HRD_RBSP_BUF_SIZE 0x4000
  1566. #define SEI_NAL_DATA_BUF_SIZE 0x4000
  1567. Int32 writeVuiRbsp(
  1568. int coreIdx,
  1569. TestEncConfig *encConfig,
  1570. EncOpenParam *encOP,
  1571. vpu_buffer_t *vbVuiRbsp
  1572. );
  1573. Int32 writeHrdRbsp(
  1574. int coreIdx,
  1575. TestEncConfig *encConfig,
  1576. EncOpenParam *encOP,
  1577. vpu_buffer_t *vbHrdRbsp
  1578. );
  1579. #ifdef TEST_ENCODE_CUSTOM_HEADER
  1580. Int32 writeCustomHeader(
  1581. int coreIdx,
  1582. EncOpenParam *encOP,
  1583. vpu_buffer_t *vbVuiRbsp,
  1584. hrd_t *hrd
  1585. );
  1586. Int32 allocateSeiNalDataBuf(
  1587. int coreIdx,
  1588. vpu_buffer_t *vbSeiNal,
  1589. int srcFbNum
  1590. );
  1591. Int32 writeSeiNalData(
  1592. EncHandle handle,
  1593. int streamEndian,
  1594. PhysicalAddress prefixSeiNalAddr,
  1595. hrd_t *hrd
  1596. );
  1597. int calcScale(int x);
  1598. BOOL EncodeVUI(hrd_t *hrd, vui_t *vui, Uint8 *pBuffer, Uint32 bufferSize, Uint32 *pByteSize, Uint32 *pBitSize, double dframeRate);
  1599. Uint32 EncodePrefixSEI( sei_active_parameter_t *sap, sei_pic_timing_t *spt, sei_buffering_period_t *sbp, hrd_t *hrd, Uint8 *pBuffer, Uint32 bufferSize);
  1600. #endif
  1601. void setEncBgMode(
  1602. EncParam *encParam,
  1603. TestEncConfig encConfig
  1604. );
  1605. void GenRegionToQpMap(
  1606. VpuRect *region, /**< The size of the ROI region for H.265 (start X/Y in CTU, end X/Y int CTU) */
  1607. int *roiLevel,
  1608. int num,
  1609. int initQp,
  1610. Uint32 mapWidth,
  1611. Uint32 mapHeight,
  1612. Uint8 *roiCtuMap
  1613. );
  1614. int checkParamRestriction(
  1615. Uint32 productId,
  1616. TestEncConfig *encConfig
  1617. );
  1618. int openRoiMapFile(
  1619. TestEncConfig *encConfig
  1620. );
  1621. int allocateRoiMapBuf(
  1622. int coreIdx,
  1623. TestEncConfig encConfig,
  1624. vpu_buffer_t *vbROi,
  1625. int srcFbNum,
  1626. int ctuNum
  1627. );
  1628. int openCtuQpMapFile(
  1629. TestEncConfig *encConfig
  1630. );
  1631. int allocateCtuQpMapBuf(
  1632. int coreIdx,
  1633. TestEncConfig encConfig,
  1634. vpu_buffer_t *vbCtuQp,
  1635. int srcfbNum,
  1636. int ctuNum
  1637. );
  1638. int setCtuQpMap(
  1639. int coreIdx,
  1640. TestEncConfig *encConfig,
  1641. EncOpenParam encOP,
  1642. PhysicalAddress addrCtuQpMap,
  1643. Uint8 *ctuQpMapBuf,
  1644. int srcFrameWidth,
  1645. int srcFrameHeight,
  1646. EncParam *encParam,
  1647. int maxCtuNum
  1648. );
  1649. /************************************************************************/
  1650. /* User Parameters (WAVE520) */
  1651. /************************************************************************/
  1652. // user scaling list
  1653. #define SL_NUM_MATRIX (6)
  1654. typedef struct
  1655. {
  1656. Uint8 s4[SL_NUM_MATRIX][16]; // [INTRA_Y/U/V,INTER_Y/U/V][NUM_COEFF]
  1657. Uint8 s8[SL_NUM_MATRIX][64];
  1658. Uint8 s16[SL_NUM_MATRIX][64];
  1659. Uint8 s32[SL_NUM_MATRIX][64];
  1660. }UserScalingList;
  1661. enum ScalingListSize
  1662. {
  1663. SCALING_LIST_4x4 = 0,
  1664. SCALING_LIST_8x8,
  1665. SCALING_LIST_16x16,
  1666. SCALING_LIST_32x32,
  1667. SCALING_LIST_SIZE_NUM
  1668. };
  1669. int parse_user_scaling_list(UserScalingList* sl, FILE* fp_sl);
  1670. void dpb_pic_init( EncInfo *pAvcInfo);
  1671. // custom lambda
  1672. #define NUM_CUSTOM_LAMBDA (2*52)
  1673. int parse_custom_lambda(Uint32 buf[NUM_CUSTOM_LAMBDA], FILE* fp);
  1674. #ifdef __cplusplus
  1675. }
  1676. #endif /* __cplusplus */
  1677. #endif /* _MAIN_HELPER_H_ */