main_helper.h 47 KB

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