main_helper.h 48 KB

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