vpuhelper.c 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523
  1. // SPDX-License-Identifier: LGPL-2.1 OR BSD-3-Clause
  2. /*
  3. * Copyright (c) 2019, Chips&Media
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this
  10. * list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright notice,
  12. * this list of conditions and the following disclaimer in the documentation
  13. * and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  16. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  19. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  20. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  22. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  24. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include <stdio.h>
  27. #include <string.h>
  28. #include "main_helper.h"
  29. #ifdef PLATFORM_WIN32
  30. #pragma warning(disable : 4996) //!<< disable waring C4996: The POSIX name for this item is deprecated.
  31. #endif
  32. #ifndef min
  33. #define min(a,b) (((a) < (b)) ? (a) : (b))
  34. #endif
  35. /*******************************************************************************
  36. * REPORT *
  37. *******************************************************************************/
  38. #define USER_DATA_INFO_OFFSET (8*17)
  39. #define FN_PIC_INFO "dec_pic_disp_info.log"
  40. #define FN_SEQ_INFO "dec_seq_disp_info.log"
  41. #define FN_PIC_TYPE "dec_pic_type.log"
  42. #define FN_USER_DATA "dec_user_data.log"
  43. #define FN_SEQ_USER_DATA "dec_seq_user_data.log"
  44. // VC1 specific
  45. enum {
  46. BDU_SEQUENCE_END = 0x0A,
  47. BDU_SLICE = 0x0B,
  48. BDU_FIELD = 0x0C,
  49. BDU_FRAME = 0x0D,
  50. BDU_ENTRYPOINT_HEADER = 0x0E,
  51. BDU_SEQUENCE_HEADER = 0x0F,
  52. BDU_SLICE_LEVEL_USER_DATA = 0x1B,
  53. BDU_FIELD_LEVEL_USER_DATA = 0x1C,
  54. BDU_FRAME_LEVEL_USER_DATA = 0x1D,
  55. BDU_ENTRYPOINT_LEVEL_USER_DATA = 0x1E,
  56. BDU_SEQUENCE_LEVEL_USER_DATA = 0x1F
  57. };
  58. // AVC specific - SEI
  59. enum {
  60. SEI_REGISTERED_ITUTT35_USERDATA = 0x04,
  61. SEI_UNREGISTERED_USERDATA = 0x05,
  62. SEI_MVC_SCALABLE_NESTING = 0x25
  63. };
  64. static vpu_rpt_info_t s_rpt_info[MAX_VPU_CORE_NUM];
  65. void OpenDecReport(
  66. Uint32 core_idx,
  67. VpuReportConfig_t* cfg
  68. )
  69. {
  70. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  71. rpt->fpPicDispInfoLogfile = NULL;
  72. rpt->fpPicTypeLogfile = NULL;
  73. rpt->fpSeqDispInfoLogfile = NULL;
  74. rpt->fpUserDataLogfile = NULL;
  75. rpt->fpSeqUserDataLogfile = NULL;
  76. rpt->decIndex = 0;
  77. rpt->userDataEnable = cfg->userDataEnable;
  78. rpt->userDataReportMode = cfg->userDataReportMode;
  79. rpt->reportOpened = TRUE;
  80. return;
  81. }
  82. void CloseDecReport(
  83. DecHandle handle
  84. )
  85. {
  86. Uint32 core_idx = handle->coreIdx;
  87. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  88. if (rpt->reportOpened == FALSE) {
  89. return;
  90. }
  91. if (rpt->fpPicDispInfoLogfile) {
  92. osal_fclose(rpt->fpPicDispInfoLogfile);
  93. rpt->fpPicDispInfoLogfile = NULL;
  94. }
  95. if (rpt->fpPicTypeLogfile) {
  96. osal_fclose(rpt->fpPicTypeLogfile);
  97. rpt->fpPicTypeLogfile = NULL;
  98. }
  99. if (rpt->fpSeqDispInfoLogfile) {
  100. osal_fclose(rpt->fpSeqDispInfoLogfile);
  101. rpt->fpSeqDispInfoLogfile = NULL;
  102. }
  103. if (rpt->fpUserDataLogfile) {
  104. osal_fclose(rpt->fpUserDataLogfile);
  105. rpt->fpUserDataLogfile= NULL;
  106. }
  107. if (rpt->fpSeqUserDataLogfile) {
  108. osal_fclose(rpt->fpSeqUserDataLogfile);
  109. rpt->fpSeqUserDataLogfile = NULL;
  110. }
  111. if (rpt->vb_rpt.base) {
  112. vdi_free_dma_memory(core_idx, &rpt->vb_rpt, DEC_ETC, handle->instIndex);
  113. }
  114. rpt->decIndex = 0;
  115. return;
  116. }
  117. static void SaveUserData(
  118. Uint32 core_idx,
  119. BYTE* userDataBuf
  120. )
  121. {
  122. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  123. Uint32 i;
  124. Uint32 UserDataType;
  125. Uint32 UserDataSize;
  126. Uint32 userDataNum;
  127. Uint32 TotalSize;
  128. BYTE* tmpBuf;
  129. if (rpt->reportOpened == FALSE) {
  130. return;
  131. }
  132. if(rpt->fpUserDataLogfile == 0) {
  133. rpt->fpUserDataLogfile = osal_fopen(FN_USER_DATA, "w+");
  134. }
  135. tmpBuf = userDataBuf;
  136. userDataNum = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  137. TotalSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  138. tmpBuf = userDataBuf + 8;
  139. for(i=0; i<userDataNum; i++) {
  140. UserDataType = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  141. UserDataSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  142. osal_fprintf(rpt->fpUserDataLogfile, "\n[Idx Type Size] : [%4d %4d %4d]",i, UserDataType, UserDataSize);
  143. tmpBuf += 8;
  144. }
  145. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  146. tmpBuf = userDataBuf + USER_DATA_INFO_OFFSET;
  147. for(i=0; i<TotalSize; i++) {
  148. osal_fprintf(rpt->fpUserDataLogfile, "%02x", tmpBuf[i]);
  149. if ((i&7) == 7) {
  150. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  151. }
  152. }
  153. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  154. osal_fflush(rpt->fpUserDataLogfile);
  155. }
  156. static void SaveUserDataINT(
  157. Uint32 core_idx,
  158. BYTE* userDataBuf,
  159. Int32 size,
  160. Int32 intIssued,
  161. Int32 decIdx,
  162. CodStd bitstreamFormat
  163. )
  164. {
  165. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  166. Int32 i;
  167. Int32 UserDataType = 0;
  168. Int32 UserDataSize = 0;
  169. Int32 userDataNum = 0;
  170. Int32 TotalSize;
  171. BYTE* tmpBuf;
  172. BYTE* backupBufTmp;
  173. static Int32 backupSize = 0;
  174. static BYTE* backupBuf = NULL;
  175. if (rpt->reportOpened == FALSE) {
  176. return;
  177. }
  178. if(rpt->fpUserDataLogfile == NULL) {
  179. rpt->fpUserDataLogfile = osal_fopen(FN_USER_DATA, "w+");
  180. }
  181. backupBufTmp = (BYTE *)osal_malloc(backupSize + size);
  182. if (backupBufTmp == 0) {
  183. VLOG( ERR, "Can't mem allock\n");
  184. return;
  185. }
  186. for (i=0; i<backupSize; i++) {
  187. backupBufTmp[i] = backupBuf[i];
  188. }
  189. if (backupBuf != NULL) {
  190. osal_free(backupBuf);
  191. }
  192. backupBuf = backupBufTmp;
  193. tmpBuf = userDataBuf + USER_DATA_INFO_OFFSET;
  194. size -= USER_DATA_INFO_OFFSET;
  195. for(i=0; i<size; i++) {
  196. backupBuf[backupSize + i] = tmpBuf[i];
  197. }
  198. backupSize += size;
  199. if (intIssued) {
  200. return;
  201. }
  202. tmpBuf = userDataBuf;
  203. userDataNum = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  204. if(userDataNum == 0) {
  205. return;
  206. }
  207. tmpBuf = userDataBuf + 8;
  208. UserDataSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  209. UserDataSize = (UserDataSize+7)/8*8;
  210. osal_fprintf(rpt->fpUserDataLogfile, "FRAME [%1d]\n", decIdx);
  211. for(i=0; i<backupSize; i++) {
  212. osal_fprintf(rpt->fpUserDataLogfile, "%02x", backupBuf[i]);
  213. if ((i&7) == 7) {
  214. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  215. }
  216. if( (i%8==7) && (i==UserDataSize-1) && (UserDataSize != backupSize)) {
  217. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  218. tmpBuf+=8;
  219. UserDataSize += (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  220. UserDataSize = (UserDataSize+7)/8*8;
  221. }
  222. }
  223. if (backupSize > 0) {
  224. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  225. }
  226. tmpBuf = userDataBuf;
  227. userDataNum = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  228. TotalSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  229. osal_fprintf(rpt->fpUserDataLogfile, "User Data Num: [%d]\n", userDataNum);
  230. osal_fprintf(rpt->fpUserDataLogfile, "User Data Total Size: [%d]\n", TotalSize);
  231. tmpBuf = userDataBuf + 8;
  232. for(i=0; i<userDataNum; i++) {
  233. UserDataType = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  234. UserDataSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  235. if(bitstreamFormat == STD_VC1) {
  236. switch (UserDataType) {
  237. case BDU_SLICE_LEVEL_USER_DATA:
  238. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_SLICE_LEVEL_USER_DATA");
  239. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  240. break;
  241. case BDU_FIELD_LEVEL_USER_DATA:
  242. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_FIELD_LEVEL_USER_DATA");
  243. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  244. break;
  245. case BDU_FRAME_LEVEL_USER_DATA:
  246. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_FRAME_LEVEL_USER_DATA");
  247. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  248. break;
  249. case BDU_ENTRYPOINT_LEVEL_USER_DATA:
  250. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_ENTRYPOINT_LEVEL_USER_DATA");
  251. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  252. break;
  253. case BDU_SEQUENCE_LEVEL_USER_DATA:
  254. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_SEQUENCE_LEVEL_USER_DATA");
  255. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  256. break;
  257. }
  258. }
  259. else if(bitstreamFormat == STD_AVC) {
  260. switch (UserDataType) {
  261. case SEI_REGISTERED_ITUTT35_USERDATA:
  262. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "registered_itu_t_t35");
  263. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  264. break;
  265. case SEI_UNREGISTERED_USERDATA:
  266. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "unregistered");
  267. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  268. break;
  269. case SEI_MVC_SCALABLE_NESTING:
  270. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "mvc_scalable_nesting");
  271. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  272. break;
  273. }
  274. }
  275. else if(bitstreamFormat == STD_MPEG2) {
  276. switch (UserDataType) {
  277. case 0:
  278. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Seq]\n", i);
  279. break;
  280. case 1:
  281. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Gop]\n", i);
  282. break;
  283. case 2:
  284. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Pic]\n", i);
  285. break;
  286. default:
  287. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Error]\n", i);
  288. break;
  289. }
  290. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  291. }
  292. else if(bitstreamFormat == STD_AVS) {
  293. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "User Data");
  294. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  295. }
  296. else {
  297. switch (UserDataType) {
  298. case 0:
  299. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Vos]\n", i);
  300. break;
  301. case 1:
  302. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Vis]\n", i);
  303. break;
  304. case 2:
  305. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Vol]\n", i);
  306. break;
  307. case 3:
  308. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Gov]\n", i);
  309. break;
  310. default:
  311. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Error]\n", i);
  312. break;
  313. }
  314. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  315. }
  316. tmpBuf += 8;
  317. }
  318. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  319. osal_fflush(rpt->fpUserDataLogfile);
  320. backupSize = 0;
  321. if (backupBuf != NULL) {
  322. osal_free(backupBuf);
  323. }
  324. backupBuf = 0;
  325. }
  326. void CheckUserDataInterrupt(
  327. Uint32 core_idx,
  328. DecHandle handle,
  329. Int32 decodeIdx,
  330. CodStd bitstreamFormat,
  331. Int32 int_reason
  332. )
  333. {
  334. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  335. if (int_reason & (1<<INT_BIT_USERDATA)) {
  336. // USER DATA INTERRUPT Issued
  337. // User Data save
  338. if (rpt->userDataEnable == TRUE) {
  339. int size;
  340. BYTE *userDataBuf;
  341. size = rpt->vb_rpt.size + USER_DATA_INFO_OFFSET;
  342. userDataBuf = osal_malloc(size);
  343. osal_memset(userDataBuf, 0, size);
  344. vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, size, VDI_BIG_ENDIAN);
  345. if (decodeIdx >= 0)
  346. SaveUserDataINT(core_idx, userDataBuf, size, 1, rpt->decIndex, bitstreamFormat);
  347. osal_free(userDataBuf);
  348. } else {
  349. VLOG(ERR, "Unexpected Interrupt issued");
  350. }
  351. }
  352. }
  353. void ConfigDecReport(
  354. Uint32 core_idx,
  355. DecHandle handle,
  356. CodStd bitstreamFormat
  357. )
  358. {
  359. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  360. if (rpt->reportOpened == FALSE) {
  361. return;
  362. }
  363. // Report Information
  364. if (!rpt->vb_rpt.base) {
  365. rpt->vb_rpt.size = SIZE_REPORT_BUF;
  366. if (vdi_allocate_dma_memory(core_idx, &rpt->vb_rpt, DEC_ETC, handle->instIndex) < 0) {
  367. VLOG(ERR, "fail to allocate report buffer\n" );
  368. return;
  369. }
  370. }
  371. VPU_DecGiveCommand(handle, SET_ADDR_REP_USERDATA, &rpt->vb_rpt.phys_addr );
  372. VPU_DecGiveCommand(handle, SET_SIZE_REP_USERDATA, &rpt->vb_rpt.size );
  373. VPU_DecGiveCommand(handle, SET_USERDATA_REPORT_MODE, &rpt->userDataReportMode );
  374. if (rpt->userDataEnable == TRUE) {
  375. VPU_DecGiveCommand( handle, ENABLE_REP_USERDATA, 0 );
  376. }
  377. else {
  378. VPU_DecGiveCommand( handle, DISABLE_REP_USERDATA, 0 );
  379. }
  380. }
  381. void SaveDecReport(
  382. Uint32 core_idx,
  383. DecHandle handle,
  384. DecOutputInfo* pDecInfo,
  385. CodStd bitstreamFormat,
  386. Uint32 mbNumX,
  387. Uint32 mbNumY
  388. )
  389. {
  390. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  391. if (rpt->reportOpened == FALSE) {
  392. return ;
  393. }
  394. // Report Information
  395. // User Data
  396. if ((pDecInfo->indexFrameDecoded >= 0 || (bitstreamFormat == STD_VC1)) &&
  397. rpt->userDataEnable == TRUE &&
  398. pDecInfo->decOutputExtData.userDataSize > 0) {
  399. // Vc1 Frame user data follow picture. After last frame decoding, user data should be reported.
  400. Uint32 size = 0;
  401. BYTE* userDataBuf = NULL;
  402. if (pDecInfo->decOutputExtData.userDataBufFull == TRUE) {
  403. VLOG(ERR, "User Data Buffer is Full\n");
  404. }
  405. size = (pDecInfo->decOutputExtData.userDataSize+7)/8*8 + USER_DATA_INFO_OFFSET;
  406. userDataBuf = (BYTE*)osal_malloc(size);
  407. osal_memset(userDataBuf, 0, size);
  408. vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, size, HOST_ENDIAN);
  409. if (pDecInfo->indexFrameDecoded >= 0) {
  410. SaveUserData(core_idx, userDataBuf);
  411. }
  412. osal_free(userDataBuf);
  413. }
  414. if (((pDecInfo->indexFrameDecoded >= 0 || (bitstreamFormat == STD_VC1 )) && rpt->userDataEnable) || // Vc1 Frame user data follow picture. After last frame decoding, user data should be reported.
  415. (pDecInfo->indexFrameDisplay >= 0 && rpt->userDataEnable) ) {
  416. Uint32 size = 0;
  417. Uint32 dataSize = 0;
  418. BYTE* userDataBuf = NULL;
  419. if (pDecInfo->decOutputExtData.userDataBufFull) {
  420. VLOG(ERR, "User Data Buffer is Full\n");
  421. }
  422. dataSize = pDecInfo->decOutputExtData.userDataSize % rpt->vb_rpt.size;
  423. if (dataSize == 0 && pDecInfo->decOutputExtData.userDataSize != 0) {
  424. dataSize = rpt->vb_rpt.size;
  425. }
  426. size = (dataSize+7)/8*8 + USER_DATA_INFO_OFFSET;
  427. userDataBuf = (BYTE*)osal_malloc(size);
  428. osal_memset(userDataBuf, 0, size);
  429. vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, size, HOST_ENDIAN);
  430. if (pDecInfo->indexFrameDecoded >= 0 || (bitstreamFormat == STD_VC1)) {
  431. SaveUserDataINT(core_idx, userDataBuf, size, 0, rpt->decIndex, bitstreamFormat);
  432. }
  433. osal_free(userDataBuf);
  434. }
  435. if (pDecInfo->indexFrameDecoded >= 0) {
  436. if (rpt->fpPicTypeLogfile == NULL) {
  437. rpt->fpPicTypeLogfile = osal_fopen(FN_PIC_TYPE, "w+");
  438. }
  439. osal_fprintf(rpt->fpPicTypeLogfile, "FRAME [%1d]\n", rpt->decIndex);
  440. switch (bitstreamFormat) {
  441. case STD_AVC:
  442. if(pDecInfo->pictureStructure == 3) { // FIELD_INTERLACED
  443. osal_fprintf(rpt->fpPicTypeLogfile, "Top Field Type: [%s]\n", pDecInfo->picTypeFirst == 0 ? "I_TYPE" :
  444. (pDecInfo->picTypeFirst) == 1 ? "P_TYPE" :
  445. (pDecInfo->picTypeFirst) == 2 ? "BI_TYPE" :
  446. (pDecInfo->picTypeFirst) == 3 ? "B_TYPE" :
  447. (pDecInfo->picTypeFirst) == 4 ? "SKIP_TYPE" :
  448. (pDecInfo->picTypeFirst) == 5 ? "IDR_TYPE" :
  449. "FORBIDDEN");
  450. osal_fprintf(rpt->fpPicTypeLogfile, "Bottom Field Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  451. (pDecInfo->picType) == 1 ? "P_TYPE" :
  452. (pDecInfo->picType) == 2 ? "BI_TYPE" :
  453. (pDecInfo->picType) == 3 ? "B_TYPE" :
  454. (pDecInfo->picType) == 4 ? "SKIP_TYPE" :
  455. (pDecInfo->picType) == 5 ? "IDR_TYPE" :
  456. "FORBIDDEN");
  457. }
  458. else {
  459. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  460. (pDecInfo->picType) == 1 ? "P_TYPE" :
  461. (pDecInfo->picType) == 2 ? "BI_TYPE" :
  462. (pDecInfo->picType) == 3 ? "B_TYPE" :
  463. (pDecInfo->picType) == 4 ? "SKIP_TYPE" :
  464. (pDecInfo->picType) == 5 ? "IDR_TYPE" :
  465. "FORBIDDEN");
  466. }
  467. break;
  468. case STD_MPEG2 :
  469. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  470. pDecInfo->picType == 1 ? "P_TYPE" :
  471. pDecInfo->picType == 2 ? "B_TYPE" :
  472. "D_TYPE");
  473. break;
  474. case STD_MPEG4 :
  475. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  476. pDecInfo->picType == 1 ? "P_TYPE" :
  477. pDecInfo->picType == 2 ? "B_TYPE" :
  478. "S_TYPE");
  479. break;
  480. case STD_VC1:
  481. if(pDecInfo->pictureStructure == 3) { // FIELD_INTERLACED
  482. osal_fprintf(rpt->fpPicTypeLogfile, "Top Field Type: [%s]\n", pDecInfo->picTypeFirst == 0 ? "I_TYPE" :
  483. (pDecInfo->picTypeFirst) == 1 ? "P_TYPE" :
  484. (pDecInfo->picTypeFirst) == 2 ? "BI_TYPE" :
  485. (pDecInfo->picTypeFirst) == 3 ? "B_TYPE" :
  486. (pDecInfo->picTypeFirst) == 4 ? "SKIP_TYPE" :
  487. "FORBIDDEN");
  488. osal_fprintf(rpt->fpPicTypeLogfile, "Bottom Field Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  489. (pDecInfo->picType) == 1 ? "P_TYPE" :
  490. (pDecInfo->picType) == 2 ? "BI_TYPE" :
  491. (pDecInfo->picType) == 3 ? "B_TYPE" :
  492. (pDecInfo->picType) == 4 ? "SKIP_TYPE" :
  493. "FORBIDDEN");
  494. }
  495. else {
  496. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  497. (pDecInfo->picTypeFirst) == 1 ? "P_TYPE" :
  498. (pDecInfo->picTypeFirst) == 2 ? "BI_TYPE" :
  499. (pDecInfo->picTypeFirst) == 3 ? "B_TYPE" :
  500. (pDecInfo->picTypeFirst) == 4 ? "SKIP_TYPE" :
  501. "FORBIDDEN");
  502. }
  503. break;
  504. default:
  505. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  506. pDecInfo->picType == 1 ? "P_TYPE" :
  507. "B_TYPE");
  508. break;
  509. }
  510. }
  511. if (pDecInfo->indexFrameDecoded >= 0) {
  512. if (rpt->fpPicDispInfoLogfile == NULL) {
  513. rpt->fpPicDispInfoLogfile = osal_fopen(FN_PIC_INFO, "w+");
  514. }
  515. osal_fprintf(rpt->fpPicDispInfoLogfile, "FRAME [%1d]\n", rpt->decIndex);
  516. switch (bitstreamFormat) {
  517. case STD_MPEG2:
  518. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n",
  519. pDecInfo->picType == 0 ? "I_TYPE" :
  520. pDecInfo->picType == 1 ? "P_TYPE" :
  521. pDecInfo->picType == 2 ? "B_TYPE" :
  522. "D_TYPE");
  523. break;
  524. case STD_MPEG4:
  525. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n",
  526. pDecInfo->picType == 0 ? "I_TYPE" :
  527. pDecInfo->picType == 1 ? "P_TYPE" :
  528. pDecInfo->picType == 2 ? "B_TYPE" :
  529. "S_TYPE");
  530. break;
  531. case STD_VC1 :
  532. if(pDecInfo->pictureStructure == 3) { // FIELD_INTERLACED
  533. osal_fprintf(rpt->fpPicDispInfoLogfile, "Top : %s\n", (pDecInfo->picType>>3) == 0 ? "I_TYPE" :
  534. (pDecInfo->picType>>3) == 1 ? "P_TYPE" :
  535. (pDecInfo->picType>>3) == 2 ? "BI_TYPE" :
  536. (pDecInfo->picType>>3) == 3 ? "B_TYPE" :
  537. (pDecInfo->picType>>3) == 4 ? "SKIP_TYPE" :
  538. "FORBIDDEN");
  539. osal_fprintf(rpt->fpPicDispInfoLogfile, "Bottom : %s\n", (pDecInfo->picType&0x7) == 0 ? "I_TYPE" :
  540. (pDecInfo->picType&0x7) == 1 ? "P_TYPE" :
  541. (pDecInfo->picType&0x7) == 2 ? "BI_TYPE" :
  542. (pDecInfo->picType&0x7) == 3 ? "B_TYPE" :
  543. (pDecInfo->picType&0x7) == 4 ? "SKIP_TYPE" :
  544. "FORBIDDEN");
  545. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Picture");
  546. }
  547. else {
  548. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", (pDecInfo->picType>>3) == 0 ? "I_TYPE" :
  549. (pDecInfo->picType>>3) == 1 ? "P_TYPE" :
  550. (pDecInfo->picType>>3) == 2 ? "BI_TYPE" :
  551. (pDecInfo->picType>>3) == 3 ? "B_TYPE" :
  552. (pDecInfo->picType>>3) == 4 ? "SKIP_TYPE" :
  553. "FORBIDDEN");
  554. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Frame Picture");
  555. }
  556. break;
  557. default:
  558. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n",
  559. pDecInfo->picType == 0 ? "I_TYPE" :
  560. pDecInfo->picType == 1 ? "P_TYPE" :
  561. "B_TYPE");
  562. break;
  563. }
  564. if(bitstreamFormat != STD_VC1) {
  565. if (pDecInfo->interlacedFrame) {
  566. if(bitstreamFormat == STD_AVS) {
  567. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Frame Picture");
  568. }
  569. else {
  570. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Picture");
  571. }
  572. }
  573. else {
  574. if(bitstreamFormat == STD_AVS) {
  575. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Picture");
  576. }
  577. else {
  578. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Frame Picture");
  579. }
  580. }
  581. }
  582. if (bitstreamFormat != STD_RV) {
  583. if(bitstreamFormat == STD_VC1) {
  584. switch(pDecInfo->pictureStructure) {
  585. case 0: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "PROGRESSIVE"); break;
  586. case 2: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FRAME_INTERLACE"); break;
  587. case 3: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FIELD_INTERLACE"); break;
  588. default: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FORBIDDEN"); break;
  589. }
  590. }
  591. else if(bitstreamFormat == STD_AVC) {
  592. if(!pDecInfo->interlacedFrame) {
  593. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FRAME_PICTURE");
  594. }
  595. else {
  596. if(pDecInfo->topFieldFirst) {
  597. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Top Field First");
  598. }
  599. else {
  600. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Bottom Field First");
  601. }
  602. }
  603. }
  604. else if (bitstreamFormat != STD_MPEG4 && bitstreamFormat != STD_AVS) {
  605. switch (pDecInfo->pictureStructure) {
  606. case 1: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "TOP_FIELD"); break;
  607. case 2: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "BOTTOM_FIELD"); break;
  608. case 3: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FRAME_PICTURE"); break;
  609. default: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FORBIDDEN"); break;
  610. }
  611. }
  612. if(bitstreamFormat != STD_AVC) {
  613. if (pDecInfo->topFieldFirst) {
  614. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Top Field First");
  615. }
  616. else {
  617. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Bottom Field First");
  618. }
  619. if (bitstreamFormat != STD_MPEG4) {
  620. if (pDecInfo->repeatFirstField) {
  621. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Repeat First Field");
  622. }
  623. else {
  624. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Not Repeat First Field");
  625. }
  626. if (bitstreamFormat == STD_VC1) {
  627. osal_fprintf(rpt->fpPicDispInfoLogfile, "VC1 RPTFRM [%1d]\n", pDecInfo->progressiveFrame);
  628. }
  629. else if (pDecInfo->progressiveFrame) {
  630. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Progressive Frame");
  631. }
  632. else {
  633. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Frame");
  634. }
  635. }
  636. }
  637. }
  638. if (bitstreamFormat == STD_MPEG2) {
  639. osal_fprintf(rpt->fpPicDispInfoLogfile, "Field Sequence [%d]\n\n", pDecInfo->fieldSequence);
  640. }
  641. else {
  642. osal_fprintf(rpt->fpPicDispInfoLogfile, "\n");
  643. }
  644. osal_fflush(rpt->fpPicDispInfoLogfile);
  645. }
  646. if(pDecInfo->indexFrameDecoded >= 0) {
  647. rpt->decIndex ++;
  648. }
  649. return;
  650. }
  651. int setWaveEncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, ENC_CFG *pCfg)
  652. {
  653. Int32 i = 0;
  654. Int32 srcWidth;
  655. Int32 srcHeight;
  656. Int32 outputNum;
  657. Int32 bitrate;
  658. Int32 bitrateBL;
  659. EncWaveParam *param = &pEncOP->EncStdParam.waveParam;
  660. srcWidth = (pEncConfig->picWidth > 0) ? pEncConfig->picWidth : pCfg->waveCfg.picX;
  661. srcHeight = (pEncConfig->picHeight > 0) ? pEncConfig->picHeight : pCfg->waveCfg.picY;
  662. if(pCfg->waveCfg.enStillPicture) {
  663. outputNum = 1;
  664. }
  665. else {
  666. if ( pEncConfig->outNum != 0 ) {
  667. outputNum = pEncConfig->outNum;
  668. }
  669. else {
  670. outputNum = pCfg->NumFrame;
  671. }
  672. }
  673. bitrate = (pEncConfig->kbps > 0) ? pEncConfig->kbps*1024 : pCfg->RcBitRate;
  674. bitrateBL = (pEncConfig->kbps > 0) ? pEncConfig->kbps*1024 : pCfg->RcBitRateBL;
  675. pEncConfig->outNum = outputNum;
  676. pEncOP->picWidth = srcWidth;
  677. pEncOP->picHeight = srcHeight;
  678. pEncOP->frameRateInfo = pCfg->waveCfg.frameRate;
  679. param->level = 0;
  680. param->tier = 0;
  681. pEncOP->srcBitDepth = pCfg->SrcBitDepth;
  682. if (pCfg->waveCfg.internalBitDepth == 0)
  683. param->internalBitDepth = pCfg->SrcBitDepth;
  684. else
  685. param->internalBitDepth = pCfg->waveCfg.internalBitDepth;
  686. if ( param->internalBitDepth == 10 )
  687. pEncOP->outputFormat = FORMAT_420_P10_16BIT_MSB;
  688. if ( param->internalBitDepth == 8 )
  689. pEncOP->outputFormat = FORMAT_420;
  690. if (param->internalBitDepth > 8)
  691. param->profile = HEVC_PROFILE_MAIN10;
  692. else
  693. param->profile = HEVC_PROFILE_MAIN;
  694. if(pCfg->waveCfg.enStillPicture) {
  695. if (param->internalBitDepth > 8)
  696. param->profile = HEVC_PROFILE_MAIN10_STILLPICTURE;
  697. else
  698. param->profile = HEVC_PROFILE_STILLPICTURE;
  699. param->enStillPicture = 1;
  700. }
  701. param->losslessEnable = pCfg->waveCfg.losslessEnable;
  702. param->constIntraPredFlag = pCfg->waveCfg.constIntraPredFlag;
  703. if (pCfg->waveCfg.useAsLongtermPeriod > 0 || pCfg->waveCfg.refLongtermPeriod > 0)
  704. param->useLongTerm = 1;
  705. else
  706. param->useLongTerm = 0;
  707. #ifdef SUPPORT_LOOK_AHEAD_RC
  708. param->larcEnable = pCfg->waveCfg.larcEnable;
  709. param->larcPass = pCfg->waveCfg.larcPass;
  710. param->larcSize = pCfg->waveCfg.larcSize;
  711. param->larcWeight = pCfg->waveCfg.larcWeight;
  712. #endif
  713. /* for CMD_ENC_SEQ_GOP_PARAM */
  714. param->gopPresetIdx = pCfg->waveCfg.gopPresetIdx;
  715. /* for CMD_ENC_SEQ_INTRA_PARAM */
  716. param->decodingRefreshType = pCfg->waveCfg.decodingRefreshType;
  717. param->intraPeriod = pCfg->waveCfg.intraPeriod;
  718. param->intraQP = pCfg->waveCfg.intraQP;
  719. param->forcedIdrHeaderEnable = pCfg->waveCfg.forcedIdrHeaderEnable;
  720. /* for CMD_ENC_SEQ_CONF_WIN_TOP_BOT/LEFT_RIGHT */
  721. param->confWinTop = pCfg->waveCfg.confWinTop;
  722. param->confWinBot = pCfg->waveCfg.confWinBot;
  723. param->confWinLeft = pCfg->waveCfg.confWinLeft;
  724. param->confWinRight = pCfg->waveCfg.confWinRight;
  725. /* for CMD_ENC_SEQ_INDEPENDENT_SLICE */
  726. param->independSliceMode = pCfg->waveCfg.independSliceMode;
  727. param->independSliceModeArg = pCfg->waveCfg.independSliceModeArg;
  728. /* for CMD_ENC_SEQ_DEPENDENT_SLICE */
  729. param->dependSliceMode = pCfg->waveCfg.dependSliceMode;
  730. param->dependSliceModeArg = pCfg->waveCfg.dependSliceModeArg;
  731. /* for CMD_ENC_SEQ_INTRA_REFRESH_PARAM */
  732. param->intraRefreshMode = pCfg->waveCfg.intraRefreshMode;
  733. param->intraRefreshArg = pCfg->waveCfg.intraRefreshArg;
  734. param->useRecommendEncParam = pCfg->waveCfg.useRecommendEncParam;
  735. /* for CMD_ENC_PARAM */
  736. param->scalingListEnable = pCfg->waveCfg.scalingListEnable;
  737. param->cuSizeMode = 0x7; // always set cu8x8/16x16/32x32 enable to 1.
  738. param->tmvpEnable = pCfg->waveCfg.tmvpEnable;
  739. param->wppEnable = pCfg->waveCfg.wppenable;
  740. param->maxNumMerge = pCfg->waveCfg.maxNumMerge;
  741. param->disableDeblk = pCfg->waveCfg.disableDeblk;
  742. param->lfCrossSliceBoundaryEnable = pCfg->waveCfg.lfCrossSliceBoundaryEnable;
  743. param->betaOffsetDiv2 = pCfg->waveCfg.betaOffsetDiv2;
  744. param->tcOffsetDiv2 = pCfg->waveCfg.tcOffsetDiv2;
  745. param->skipIntraTrans = pCfg->waveCfg.skipIntraTrans;
  746. param->saoEnable = pCfg->waveCfg.saoEnable;
  747. param->intraNxNEnable = pCfg->waveCfg.intraNxNEnable;
  748. /* for CMD_ENC_RC_PARAM */
  749. pEncOP->rcEnable = pCfg->RcEnable;
  750. pEncOP->vbvBufferSize = pCfg->VbvBufferSize;
  751. param->cuLevelRCEnable = pCfg->waveCfg.cuLevelRCEnable;
  752. param->hvsQPEnable = pCfg->waveCfg.hvsQPEnable;
  753. param->hvsQpScale = pCfg->waveCfg.hvsQpScale;
  754. param->bitAllocMode = pCfg->waveCfg.bitAllocMode;
  755. for (i = 0; i < MAX_GOP_NUM; i++) {
  756. param->fixedBitRatio[i] = pCfg->waveCfg.fixedBitRatio[i];
  757. }
  758. param->minQpI = pCfg->waveCfg.minQp;
  759. param->minQpP = pCfg->waveCfg.minQp;
  760. param->minQpB = pCfg->waveCfg.minQp;
  761. param->maxQpI = pCfg->waveCfg.maxQp;
  762. param->maxQpP = pCfg->waveCfg.maxQp;
  763. param->maxQpB = pCfg->waveCfg.maxQp;
  764. param->hvsMaxDeltaQp = pCfg->waveCfg.maxDeltaQp;
  765. pEncOP->bitRate = bitrate;
  766. pEncOP->bitRateBL = bitrateBL;
  767. /* for CMD_ENC_CUSTOM_GOP_PARAM */
  768. param->gopParam.customGopSize = pCfg->waveCfg.gopParam.customGopSize;
  769. for (i= 0; i<param->gopParam.customGopSize; i++) {
  770. param->gopParam.picParam[i].picType = pCfg->waveCfg.gopParam.picParam[i].picType;
  771. param->gopParam.picParam[i].pocOffset = pCfg->waveCfg.gopParam.picParam[i].pocOffset;
  772. param->gopParam.picParam[i].picQp = pCfg->waveCfg.gopParam.picParam[i].picQp;
  773. param->gopParam.picParam[i].refPocL0 = pCfg->waveCfg.gopParam.picParam[i].refPocL0;
  774. param->gopParam.picParam[i].refPocL1 = pCfg->waveCfg.gopParam.picParam[i].refPocL1;
  775. param->gopParam.picParam[i].temporalId = pCfg->waveCfg.gopParam.picParam[i].temporalId;
  776. param->gopParam.picParam[i].numRefPicL0 = pCfg->waveCfg.gopParam.picParam[i].numRefPicL0;
  777. }
  778. param->roiEnable = pCfg->waveCfg.roiEnable;
  779. // VPS & VUI
  780. param->numUnitsInTick = pCfg->waveCfg.numUnitsInTick;
  781. param->timeScale = pCfg->waveCfg.timeScale;
  782. param->numTicksPocDiffOne = pCfg->waveCfg.numTicksPocDiffOne;
  783. param->chromaCbQpOffset = pCfg->waveCfg.chromaCbQpOffset;
  784. param->chromaCrQpOffset = pCfg->waveCfg.chromaCrQpOffset;
  785. param->initialRcQp = pCfg->waveCfg.initialRcQp;
  786. param->nrYEnable = pCfg->waveCfg.nrYEnable;
  787. param->nrCbEnable = pCfg->waveCfg.nrCbEnable;
  788. param->nrCrEnable = pCfg->waveCfg.nrCrEnable;
  789. param->nrNoiseEstEnable = pCfg->waveCfg.nrNoiseEstEnable;
  790. param->nrNoiseSigmaY = pCfg->waveCfg.nrNoiseSigmaY;
  791. param->nrNoiseSigmaCb = pCfg->waveCfg.nrNoiseSigmaCb;
  792. param->nrNoiseSigmaCr = pCfg->waveCfg.nrNoiseSigmaCr;
  793. param->nrIntraWeightY = pCfg->waveCfg.nrIntraWeightY;
  794. param->nrIntraWeightCb = pCfg->waveCfg.nrIntraWeightCb;
  795. param->nrIntraWeightCr = pCfg->waveCfg.nrIntraWeightCr;
  796. param->nrInterWeightY = pCfg->waveCfg.nrInterWeightY;
  797. param->nrInterWeightCb = pCfg->waveCfg.nrInterWeightCb;
  798. param->nrInterWeightCr = pCfg->waveCfg.nrInterWeightCr;
  799. param->monochromeEnable = pCfg->waveCfg.monochromeEnable;
  800. param->strongIntraSmoothEnable = pCfg->waveCfg.strongIntraSmoothEnable;
  801. param->weightPredEnable = pCfg->waveCfg.weightPredEnable;
  802. param->bgDetectEnable = pCfg->waveCfg.bgDetectEnable;
  803. param->bgThrDiff = pCfg->waveCfg.bgThrDiff;
  804. param->bgThrMeanDiff = pCfg->waveCfg.bgThrMeanDiff;
  805. param->bgLambdaQp = pCfg->waveCfg.bgLambdaQp;
  806. param->bgDeltaQp = pCfg->waveCfg.bgDeltaQp;
  807. param->customLambdaEnable = pCfg->waveCfg.customLambdaEnable;
  808. param->customMDEnable = pCfg->waveCfg.customMDEnable;
  809. param->pu04DeltaRate = pCfg->waveCfg.pu04DeltaRate;
  810. param->pu08DeltaRate = pCfg->waveCfg.pu08DeltaRate;
  811. param->pu16DeltaRate = pCfg->waveCfg.pu16DeltaRate;
  812. param->pu32DeltaRate = pCfg->waveCfg.pu32DeltaRate;
  813. param->pu04IntraPlanarDeltaRate = pCfg->waveCfg.pu04IntraPlanarDeltaRate;
  814. param->pu04IntraDcDeltaRate = pCfg->waveCfg.pu04IntraDcDeltaRate;
  815. param->pu04IntraAngleDeltaRate = pCfg->waveCfg.pu04IntraAngleDeltaRate;
  816. param->pu08IntraPlanarDeltaRate = pCfg->waveCfg.pu08IntraPlanarDeltaRate;
  817. param->pu08IntraDcDeltaRate = pCfg->waveCfg.pu08IntraDcDeltaRate;
  818. param->pu08IntraAngleDeltaRate = pCfg->waveCfg.pu08IntraAngleDeltaRate;
  819. param->pu16IntraPlanarDeltaRate = pCfg->waveCfg.pu16IntraPlanarDeltaRate;
  820. param->pu16IntraDcDeltaRate = pCfg->waveCfg.pu16IntraDcDeltaRate;
  821. param->pu16IntraAngleDeltaRate = pCfg->waveCfg.pu16IntraAngleDeltaRate;
  822. param->pu32IntraPlanarDeltaRate = pCfg->waveCfg.pu32IntraPlanarDeltaRate;
  823. param->pu32IntraDcDeltaRate = pCfg->waveCfg.pu32IntraDcDeltaRate;
  824. param->pu32IntraAngleDeltaRate = pCfg->waveCfg.pu32IntraAngleDeltaRate;
  825. param->cu08IntraDeltaRate = pCfg->waveCfg.cu08IntraDeltaRate;
  826. param->cu08InterDeltaRate = pCfg->waveCfg.cu08InterDeltaRate;
  827. param->cu08MergeDeltaRate = pCfg->waveCfg.cu08MergeDeltaRate;
  828. param->cu16IntraDeltaRate = pCfg->waveCfg.cu16IntraDeltaRate;
  829. param->cu16InterDeltaRate = pCfg->waveCfg.cu16InterDeltaRate;
  830. param->cu16MergeDeltaRate = pCfg->waveCfg.cu16MergeDeltaRate;
  831. param->cu32IntraDeltaRate = pCfg->waveCfg.cu32IntraDeltaRate;
  832. param->cu32InterDeltaRate = pCfg->waveCfg.cu32InterDeltaRate;
  833. param->cu32MergeDeltaRate = pCfg->waveCfg.cu32MergeDeltaRate;
  834. param->coefClearDisable = pCfg->waveCfg.coefClearDisable;
  835. param->rcWeightParam = pCfg->waveCfg.rcWeightParam;
  836. param->rcWeightBuf = pCfg->waveCfg.rcWeightBuf;
  837. param->s2fmeDisable = pCfg->waveCfg.s2fmeDisable;
  838. // for H.264 on WAVE
  839. param->avcIdrPeriod = pCfg->waveCfg.idrPeriod;
  840. param->rdoSkip = pCfg->waveCfg.rdoSkip;
  841. param->lambdaScalingEnable = pCfg->waveCfg.lambdaScalingEnable;
  842. param->transform8x8Enable = pCfg->waveCfg.transform8x8;
  843. param->avcSliceMode = pCfg->waveCfg.avcSliceMode;
  844. param->avcSliceArg = pCfg->waveCfg.avcSliceArg;
  845. param->intraMbRefreshMode = pCfg->waveCfg.intraMbRefreshMode;
  846. param->intraMbRefreshArg = pCfg->waveCfg.intraMbRefreshArg;
  847. param->mbLevelRcEnable = pCfg->waveCfg.mbLevelRc;
  848. param->entropyCodingMode = pCfg->waveCfg.entropyCodingMode;;
  849. return 1;
  850. }
  851. int setCoda9EncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, ENC_CFG *pCfg)
  852. {
  853. Int32 bitFormat;
  854. Int32 srcWidth;
  855. Int32 srcHeight;
  856. Int32 outputNum;
  857. bitFormat = pEncOP->bitstreamFormat;
  858. srcWidth = (pEncConfig->picWidth > 0) ? pEncConfig->picWidth : pCfg->PicX;
  859. srcHeight = (pEncConfig->picHeight > 0) ? pEncConfig->picHeight : pCfg->PicY;
  860. outputNum = (pEncConfig->outNum > 0) ? pEncConfig->outNum : pCfg->NumFrame;
  861. pEncConfig->outNum = outputNum;
  862. osal_memcpy(pEncConfig->skipPicNums, pCfg->skipPicNums, sizeof(pCfg->skipPicNums));
  863. pEncOP->picWidth = srcWidth;
  864. pEncOP->picHeight = srcHeight;
  865. pEncOP->frameRateInfo = pCfg->FrameRate;
  866. pEncOP->bitRate = pCfg->RcBitRate;
  867. pEncOP->rcInitDelay = pCfg->RcInitDelay;
  868. pEncOP->vbvBufferSize = pCfg->RcBufSize;
  869. pEncOP->frameSkipDisable = pCfg->frameSkipDisable; // for compare with C-model ( C-model = only 1 )
  870. pEncOP->meBlkMode = pCfg->MeBlkModeEnable; // for compare with C-model ( C-model = only 0 )
  871. pEncOP->gopSize = pCfg->GopPicNum;
  872. pEncOP->idrInterval = pCfg->IDRInterval;
  873. pEncOP->sliceMode.sliceMode = pCfg->SliceMode;
  874. pEncOP->sliceMode.sliceSizeMode = pCfg->SliceSizeMode;
  875. pEncOP->sliceMode.sliceSize = pCfg->SliceSizeNum;
  876. pEncOP->intraRefreshNum = pCfg->IntraRefreshNum;
  877. pEncOP->ConscIntraRefreshEnable = pCfg->ConscIntraRefreshEnable;
  878. pEncOP->rcIntraQp = pCfg->RCIntraQP;
  879. pEncOP->intraCostWeight = pCfg->intraCostWeight;
  880. pEncOP->MESearchRange = pCfg->SearchRange;
  881. pEncOP->rcEnable = pCfg->RcEnable;
  882. if (!pCfg->RcEnable)
  883. pEncOP->bitRate = 0;
  884. if (!pCfg->GammaSetEnable)
  885. pEncOP->userGamma = -1;
  886. else
  887. pEncOP->userGamma = pCfg->Gamma;
  888. pEncOP->MEUseZeroPmv = pCfg->MeUseZeroPmv;
  889. /* It was agreed that the statements below would be used. but Cmodel at r25518 is not changed yet according to the statements below
  890. if (bitFormat == STD_MPEG4)
  891. pEncOP->MEUseZeroPmv = 1;
  892. else
  893. pEncOP->MEUseZeroPmv = 0;
  894. */
  895. // MP4 263 Only
  896. if (!pCfg->ConstantIntraQPEnable)
  897. pEncOP->rcIntraQp = -1;
  898. if (pCfg->MaxQpSetEnable) // for MP4ENC
  899. pEncOP->userQpMax = pCfg->MaxQp;
  900. else
  901. pEncOP->userQpMax = -1;
  902. if (bitFormat == STD_AVC)
  903. {
  904. if(pCfg->MinQpSetEnable)
  905. pEncOP->userQpMin = pCfg->MinQp;
  906. else
  907. pEncOP->userQpMin = 12;
  908. if (pCfg->MaxQpSetEnable)
  909. pEncOP->userQpMax = pCfg->MaxQp;
  910. else
  911. pEncOP->userQpMax = 51;
  912. if(pCfg->MaxDeltaQpSetEnable)
  913. pEncOP->userMaxDeltaQp = pCfg->MaxDeltaQp;
  914. else
  915. pEncOP->userMaxDeltaQp = -1;
  916. if(pCfg->MinDeltaQpSetEnable)
  917. pEncOP->userMinDeltaQp = pCfg->MinDeltaQp;
  918. else
  919. pEncOP->userMinDeltaQp = -1;
  920. }
  921. pEncOP->rcIntervalMode = pCfg->rcIntervalMode; // 0:normal, 1:frame_level, 2:slice_level, 3: user defined Mb_level
  922. pEncOP->mbInterval = pCfg->RcMBInterval; // FIXME
  923. // Standard specific
  924. if( bitFormat == STD_MPEG4 ) {
  925. pEncOP->EncStdParam.mp4Param.mp4DataPartitionEnable = pCfg->DataPartEn;
  926. pEncOP->EncStdParam.mp4Param.mp4ReversibleVlcEnable = pCfg->RevVlcEn;
  927. pEncOP->EncStdParam.mp4Param.mp4IntraDcVlcThr = pCfg->IntraDcVlcThr;
  928. pEncOP->EncStdParam.mp4Param.mp4HecEnable = pCfg->HecEnable;
  929. pEncOP->EncStdParam.mp4Param.mp4Verid = pCfg->VerId;
  930. }
  931. else if( bitFormat == STD_H263 ) {
  932. pEncOP->EncStdParam.h263Param.h263AnnexIEnable = pCfg->AnnexI;
  933. pEncOP->EncStdParam.h263Param.h263AnnexJEnable = pCfg->AnnexJ;
  934. pEncOP->EncStdParam.h263Param.h263AnnexKEnable = pCfg->AnnexK;
  935. pEncOP->EncStdParam.h263Param.h263AnnexTEnable = pCfg->AnnexT;
  936. }
  937. else if( bitFormat == STD_AVC ) {
  938. pEncOP->EncStdParam.avcParam.constrainedIntraPredFlag = pCfg->ConstIntraPredFlag;
  939. pEncOP->EncStdParam.avcParam.disableDeblk = pCfg->DisableDeblk;
  940. pEncOP->EncStdParam.avcParam.deblkFilterOffsetAlpha = pCfg->DeblkOffsetA;
  941. pEncOP->EncStdParam.avcParam.deblkFilterOffsetBeta = pCfg->DeblkOffsetB;
  942. pEncOP->EncStdParam.avcParam.chromaQpOffset = pCfg->ChromaQpOffset;
  943. pEncOP->EncStdParam.avcParam.audEnable = pCfg->aud_en;
  944. pEncOP->EncStdParam.avcParam.frameCroppingFlag = pCfg->frameCroppingFlag;
  945. pEncOP->EncStdParam.avcParam.frameCropLeft = pCfg->frameCropLeft;
  946. pEncOP->EncStdParam.avcParam.frameCropRight = pCfg->frameCropRight;
  947. pEncOP->EncStdParam.avcParam.frameCropTop = pCfg->frameCropTop;
  948. pEncOP->EncStdParam.avcParam.frameCropBottom = pCfg->frameCropBottom;
  949. pEncOP->EncStdParam.avcParam.level = pCfg->level;
  950. // Update cropping information : Usage example for H.264 frame_cropping_flag
  951. if (pEncOP->picHeight == 1080)
  952. {
  953. // In case of AVC encoder, when we want to use unaligned display width(For example, 1080),
  954. // frameCroppingFlag parameters should be adjusted to displayable rectangle
  955. if (pEncConfig->rotAngle != 90 && pEncConfig->rotAngle != 270) // except rotation
  956. {
  957. if (pEncOP->EncStdParam.avcParam.frameCroppingFlag == 0)
  958. {
  959. pEncOP->EncStdParam.avcParam.frameCroppingFlag = 1;
  960. // frameCropBottomOffset = picHeight(MB-aligned) - displayable rectangle height
  961. pEncOP->EncStdParam.avcParam.frameCropBottom = 8;
  962. }
  963. }
  964. }
  965. }
  966. else {
  967. VLOG(ERR, "Invalid codec standard mode \n" );
  968. return 0;
  969. }
  970. return 1;
  971. }
  972. /******************************************************************************
  973. EncOpenParam Initialization
  974. ******************************************************************************/
  975. /**
  976. * To init EncOpenParam by runtime evaluation
  977. * IN
  978. * EncConfigParam *pEncConfig
  979. * OUT
  980. * EncOpenParam *pEncOP
  981. */
  982. #define DEFAULT_ENC_OUTPUT_NUM 30
  983. Int32 GetEncOpenParamDefault(EncOpenParam *pEncOP, TestEncConfig *pEncConfig)
  984. {
  985. int bitFormat;
  986. Int32 productId;
  987. productId = VPU_GetProductId(pEncOP->coreIdx);
  988. pEncConfig->outNum = pEncConfig->outNum == 0 ? DEFAULT_ENC_OUTPUT_NUM : pEncConfig->outNum;
  989. bitFormat = pEncOP->bitstreamFormat;
  990. pEncOP->picWidth = pEncConfig->picWidth;
  991. pEncOP->picHeight = pEncConfig->picHeight;
  992. pEncOP->frameRateInfo = 30;
  993. pEncOP->MESearchRange = 3;
  994. pEncOP->bitRate = pEncConfig->kbps;
  995. pEncOP->rcInitDelay = 0;
  996. pEncOP->vbvBufferSize = 0; // 0 = ignore
  997. pEncOP->meBlkMode = 0; // for compare with C-model ( C-model = only 0 )
  998. pEncOP->frameSkipDisable = 1; // for compare with C-model ( C-model = only 1 )
  999. pEncOP->gopSize = 30; // only first picture is I
  1000. pEncOP->sliceMode.sliceMode = 1; // 1 slice per picture
  1001. pEncOP->sliceMode.sliceSizeMode = 1;
  1002. pEncOP->sliceMode.sliceSize = 115;
  1003. pEncOP->intraRefreshNum = 0;
  1004. pEncOP->rcIntraQp = -1; // disable == -1
  1005. pEncOP->userQpMax = -1; // disable == -1
  1006. pEncOP->userGamma = (Uint32)(0.75*32768); // (0*32768 < gamma < 1*32768)
  1007. pEncOP->rcIntervalMode = 1; // 0:normal, 1:frame_level, 2:slice_level, 3: user defined Mb_level
  1008. pEncOP->mbInterval = 0;
  1009. pEncConfig->picQpY = 23;
  1010. if (bitFormat == STD_MPEG4)
  1011. pEncOP->MEUseZeroPmv = 1;
  1012. else
  1013. pEncOP->MEUseZeroPmv = 0;
  1014. pEncOP->intraCostWeight = 400;
  1015. // Standard specific
  1016. if( bitFormat == STD_MPEG4 ) {
  1017. pEncOP->EncStdParam.mp4Param.mp4DataPartitionEnable = 0;
  1018. pEncOP->EncStdParam.mp4Param.mp4ReversibleVlcEnable = 0;
  1019. pEncOP->EncStdParam.mp4Param.mp4IntraDcVlcThr = 0;
  1020. pEncOP->EncStdParam.mp4Param.mp4HecEnable = 0;
  1021. pEncOP->EncStdParam.mp4Param.mp4Verid = 2;
  1022. }
  1023. else if( bitFormat == STD_H263 ) {
  1024. pEncOP->EncStdParam.h263Param.h263AnnexIEnable = 0;
  1025. pEncOP->EncStdParam.h263Param.h263AnnexJEnable = 0;
  1026. pEncOP->EncStdParam.h263Param.h263AnnexKEnable = 0;
  1027. pEncOP->EncStdParam.h263Param.h263AnnexTEnable = 0;
  1028. }
  1029. else if( bitFormat == STD_AVC && productId != PRODUCT_ID_521) {
  1030. // AVC for CODA
  1031. pEncOP->EncStdParam.avcParam.constrainedIntraPredFlag = 0;
  1032. pEncOP->EncStdParam.avcParam.disableDeblk = 1;
  1033. pEncOP->EncStdParam.avcParam.deblkFilterOffsetAlpha = 6;
  1034. pEncOP->EncStdParam.avcParam.deblkFilterOffsetBeta = 0;
  1035. pEncOP->EncStdParam.avcParam.chromaQpOffset = 10;
  1036. pEncOP->EncStdParam.avcParam.audEnable = 0;
  1037. pEncOP->EncStdParam.avcParam.frameCroppingFlag = 0;
  1038. pEncOP->EncStdParam.avcParam.frameCropLeft = 0;
  1039. pEncOP->EncStdParam.avcParam.frameCropRight = 0;
  1040. pEncOP->EncStdParam.avcParam.frameCropTop = 0;
  1041. pEncOP->EncStdParam.avcParam.frameCropBottom = 0;
  1042. pEncOP->EncStdParam.avcParam.level = 0;
  1043. // Update cropping information : Usage example for H.264 frame_cropping_flag
  1044. if (pEncOP->picHeight == 1080)
  1045. {
  1046. // In case of AVC encoder, when we want to use unaligned display width(For example, 1080),
  1047. // frameCroppingFlag parameters should be adjusted to displayable rectangle
  1048. if (pEncConfig->rotAngle != 90 && pEncConfig->rotAngle != 270) // except rotation
  1049. {
  1050. if (pEncOP->EncStdParam.avcParam.frameCroppingFlag == 0)
  1051. {
  1052. pEncOP->EncStdParam.avcParam.frameCroppingFlag = 1;
  1053. // frameCropBottomOffset = picHeight(MB-aligned) - displayable rectangle height
  1054. pEncOP->EncStdParam.avcParam.frameCropBottom = 8;
  1055. }
  1056. }
  1057. }
  1058. }
  1059. else if( bitFormat == STD_HEVC || (bitFormat == STD_AVC && productId == PRODUCT_ID_521)) {
  1060. EncWaveParam *param = &pEncOP->EncStdParam.waveParam;
  1061. Int32 rcBitrate = pEncConfig->kbps * 1000;
  1062. Int32 i=0;
  1063. pEncOP->bitRate = rcBitrate;
  1064. param->profile = HEVC_PROFILE_MAIN;
  1065. param->level = 0;
  1066. param->tier = 0;
  1067. param->internalBitDepth = 8;
  1068. pEncOP->srcBitDepth = 8;
  1069. param->losslessEnable = 0;
  1070. param->constIntraPredFlag = 0;
  1071. param->useLongTerm = 0;
  1072. /* for CMD_ENC_SEQ_GOP_PARAM */
  1073. param->gopPresetIdx = PRESET_IDX_IBBBP;
  1074. /* for CMD_ENC_SEQ_INTRA_PARAM */
  1075. param->decodingRefreshType = 1;
  1076. param->intraPeriod = 28;
  1077. param->intraQP = 0;
  1078. param->forcedIdrHeaderEnable = 0;
  1079. /* for CMD_ENC_SEQ_CONF_WIN_TOP_BOT/LEFT_RIGHT */
  1080. param->confWinTop = 0;
  1081. param->confWinBot = 0;
  1082. param->confWinLeft = 0;
  1083. param->confWinRight = 0;
  1084. /* for CMD_ENC_SEQ_INDEPENDENT_SLICE */
  1085. param->independSliceMode = 0;
  1086. param->independSliceModeArg = 0;
  1087. /* for CMD_ENC_SEQ_DEPENDENT_SLICE */
  1088. param->dependSliceMode = 0;
  1089. param->dependSliceModeArg = 0;
  1090. /* for CMD_ENC_SEQ_INTRA_REFRESH_PARAM */
  1091. param->intraRefreshMode = 0;
  1092. param->intraRefreshArg = 0;
  1093. param->useRecommendEncParam = 1;
  1094. pEncConfig->roi_enable = 0;
  1095. /* for CMD_ENC_PARAM */
  1096. if (param->useRecommendEncParam != 1) { // 0 : Custom, 2 : Boost mode (normal encoding speed, normal picture quality), 3 : Fast mode (high encoding speed, low picture quality)
  1097. param->scalingListEnable = 0;
  1098. param->cuSizeMode = 0x7;
  1099. param->tmvpEnable = 1;
  1100. param->wppEnable = 0;
  1101. param->maxNumMerge = 2;
  1102. param->disableDeblk = 0;
  1103. param->lfCrossSliceBoundaryEnable = 1;
  1104. param->betaOffsetDiv2 = 0;
  1105. param->tcOffsetDiv2 = 0;
  1106. param->skipIntraTrans = 1;
  1107. param->saoEnable = 1;
  1108. param->intraNxNEnable = 1;
  1109. }
  1110. /* for CMD_ENC_RC_PARAM */
  1111. pEncOP->rcEnable = rcBitrate == 0 ? FALSE : TRUE;
  1112. pEncOP->vbvBufferSize = 3000;
  1113. param->roiEnable = 0;
  1114. param->bitAllocMode = 0;
  1115. for (i = 0; i < MAX_GOP_NUM; i++) {
  1116. param->fixedBitRatio[i] = 1;
  1117. }
  1118. param->cuLevelRCEnable = 0;
  1119. param->hvsQPEnable = 1;
  1120. param->hvsQpScale = 2;
  1121. /* for CMD_ENC_RC_MIN_MAX_QP */
  1122. param->minQpI = 8;
  1123. param->maxQpI = 51;
  1124. param->minQpP = 8;
  1125. param->maxQpP = 51;
  1126. param->minQpB = 8;
  1127. param->maxQpB = 51;
  1128. param->hvsMaxDeltaQp = 10;
  1129. /* for CMD_ENC_CUSTOM_GOP_PARAM */
  1130. param->gopParam.customGopSize = 0;
  1131. for (i= 0; i<param->gopParam.customGopSize; i++) {
  1132. param->gopParam.picParam[i].picType = PIC_TYPE_I;
  1133. param->gopParam.picParam[i].pocOffset = 1;
  1134. param->gopParam.picParam[i].picQp = 30;
  1135. param->gopParam.picParam[i].refPocL0 = 0;
  1136. param->gopParam.picParam[i].refPocL1 = 0;
  1137. param->gopParam.picParam[i].temporalId = 0;
  1138. }
  1139. // for VUI / time information.
  1140. param->numTicksPocDiffOne = 0;
  1141. param->timeScale = pEncOP->frameRateInfo * 1000;
  1142. param->numUnitsInTick = 1000;
  1143. param->chromaCbQpOffset = 0;
  1144. param->chromaCrQpOffset = 0;
  1145. param->initialRcQp = 63; // 63 is meaningless.
  1146. param->nrYEnable = 0;
  1147. param->nrCbEnable = 0;
  1148. param->nrCrEnable = 0;
  1149. param->nrNoiseEstEnable = 0;
  1150. pEncConfig->roi_avg_qp = 0;
  1151. pEncConfig->lambda_map_enable = 0;
  1152. param->monochromeEnable = 0;
  1153. param->strongIntraSmoothEnable = 1;
  1154. param->weightPredEnable = 0;
  1155. param->bgDetectEnable = 0;
  1156. param->bgThrDiff = 8;
  1157. param->bgThrMeanDiff = 1;
  1158. param->bgLambdaQp = 32;
  1159. param->bgDeltaQp = 3;
  1160. param->customLambdaEnable = 0;
  1161. param->customMDEnable = 0;
  1162. param->pu04DeltaRate = 0;
  1163. param->pu08DeltaRate = 0;
  1164. param->pu16DeltaRate = 0;
  1165. param->pu32DeltaRate = 0;
  1166. param->pu04IntraPlanarDeltaRate = 0;
  1167. param->pu04IntraDcDeltaRate = 0;
  1168. param->pu04IntraAngleDeltaRate = 0;
  1169. param->pu08IntraPlanarDeltaRate = 0;
  1170. param->pu08IntraDcDeltaRate = 0;
  1171. param->pu08IntraAngleDeltaRate = 0;
  1172. param->pu16IntraPlanarDeltaRate = 0;
  1173. param->pu16IntraDcDeltaRate = 0;
  1174. param->pu16IntraAngleDeltaRate = 0;
  1175. param->pu32IntraPlanarDeltaRate = 0;
  1176. param->pu32IntraDcDeltaRate = 0;
  1177. param->pu32IntraAngleDeltaRate = 0;
  1178. param->cu08IntraDeltaRate = 0;
  1179. param->cu08InterDeltaRate = 0;
  1180. param->cu08MergeDeltaRate = 0;
  1181. param->cu16IntraDeltaRate = 0;
  1182. param->cu16InterDeltaRate = 0;
  1183. param->cu16MergeDeltaRate = 0;
  1184. param->cu32IntraDeltaRate = 0;
  1185. param->cu32InterDeltaRate = 0;
  1186. param->cu32MergeDeltaRate = 0;
  1187. param->coefClearDisable = 0;
  1188. param->rcWeightParam = 2;
  1189. param->rcWeightBuf = 128;
  1190. // for H.264 encoder
  1191. param->avcIdrPeriod = 0;
  1192. param->rdoSkip = 1;
  1193. param->lambdaScalingEnable = 1;
  1194. param->transform8x8Enable = 1;
  1195. param->avcSliceMode = 0;
  1196. param->avcSliceArg = 0;
  1197. param->intraMbRefreshMode = 0;
  1198. param->intraMbRefreshArg = 1;
  1199. param->mbLevelRcEnable = 0;
  1200. param->entropyCodingMode = 1;
  1201. if (bitFormat == STD_AVC)
  1202. param->disableDeblk = 2;
  1203. }
  1204. else {
  1205. VLOG(ERR, "Invalid codec standard mode: bitFormat(%d) \n", bitFormat);
  1206. return 0;
  1207. }
  1208. return 1;
  1209. }
  1210. /**
  1211. * To init EncOpenParam by CFG file
  1212. * IN
  1213. * EncConfigParam *pEncConfig
  1214. * OUT
  1215. * EncOpenParam *pEncOP
  1216. * char *srcYuvFileName
  1217. */
  1218. Int32 GetEncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, ENC_CFG *pEncCfg)
  1219. {
  1220. int bitFormat;
  1221. ENC_CFG encCfgInst;
  1222. ENC_CFG *pCfg;
  1223. Int32 productId;
  1224. char yuvDir[128] = "yuv/";
  1225. productId = VPU_GetProductId(pEncOP->coreIdx);
  1226. // Source YUV Image File to load
  1227. if (pEncCfg) {
  1228. pCfg = pEncCfg;
  1229. }
  1230. else {
  1231. osal_memset( &encCfgInst, 0x00, sizeof(ENC_CFG));
  1232. pCfg = &encCfgInst;
  1233. }
  1234. bitFormat = pEncOP->bitstreamFormat;
  1235. if ( PRODUCT_ID_W_SERIES(productId) == TRUE ) {
  1236. // for WAVE
  1237. switch(bitFormat)
  1238. {
  1239. case STD_HEVC:
  1240. case STD_AVC:
  1241. if (parseWaveEncCfgFile(pCfg, pEncConfig->cfgFileName, bitFormat) == 0)
  1242. return 0;
  1243. if (pEncCfg)
  1244. strcpy(pEncConfig->yuvFileName, pCfg->SrcFileName);
  1245. else
  1246. sprintf(pEncConfig->yuvFileName, "%s%s", yuvDir, pCfg->SrcFileName);
  1247. if (pCfg->waveCfg.roiEnable) {
  1248. strcpy(pEncConfig->roi_file_name, pCfg->waveCfg.roiFileName);
  1249. if (!strcmp(pCfg->waveCfg.roiQpMapFile, "0") || pCfg->waveCfg.roiQpMapFile[0] == 0) {
  1250. //invalid value exist or not exist
  1251. }
  1252. else {
  1253. //valid value exist
  1254. strcpy(pEncConfig->roi_file_name, pCfg->waveCfg.roiQpMapFile);
  1255. }
  1256. }
  1257. pEncConfig->roi_enable = pCfg->waveCfg.roiEnable;
  1258. pEncConfig->encAUD = pCfg->waveCfg.encAUD;
  1259. pEncConfig->encEOS = pCfg->waveCfg.encEOS;
  1260. pEncConfig->encEOB = pCfg->waveCfg.encEOB;
  1261. pEncConfig->useAsLongtermPeriod = pCfg->waveCfg.useAsLongtermPeriod;
  1262. pEncConfig->refLongtermPeriod = pCfg->waveCfg.refLongtermPeriod;
  1263. pEncConfig->roi_avg_qp = pCfg->waveCfg.roiAvgQp;
  1264. pEncConfig->lambda_map_enable = pCfg->waveCfg.customLambdaMapEnable;
  1265. pEncConfig->mode_map_flag = pCfg->waveCfg.customModeMapFlag;
  1266. pEncConfig->wp_param_flag = pCfg->waveCfg.weightPredEnable;
  1267. pEncConfig->forceIdrPicIdx = pCfg->waveCfg.forceIdrPicIdx;
  1268. if (pCfg->waveCfg.scalingListEnable)
  1269. strcpy(pEncConfig->scaling_list_fileName, pCfg->waveCfg.scalingListFileName);
  1270. if (pCfg->waveCfg.customLambdaEnable)
  1271. strcpy(pEncConfig->custom_lambda_fileName, pCfg->waveCfg.customLambdaFileName);
  1272. // custom map
  1273. if (pCfg->waveCfg.customLambdaMapEnable)
  1274. strcpy(pEncConfig->lambda_map_fileName, pCfg->waveCfg.customLambdaMapFileName);
  1275. if (pCfg->waveCfg.customModeMapFlag)
  1276. strcpy(pEncConfig->mode_map_fileName, pCfg->waveCfg.customModeMapFileName);
  1277. if (pCfg->waveCfg.weightPredEnable&1)
  1278. strcpy(pEncConfig->wp_param_fileName, pCfg->waveCfg.WpParamFileName);
  1279. pEncConfig->force_picskip_start = pCfg->waveCfg.forcePicSkipStart;
  1280. pEncConfig->force_picskip_end = pCfg->waveCfg.forcePicSkipEnd;
  1281. pEncConfig->force_coefdrop_start= pCfg->waveCfg.forceCoefDropStart;
  1282. pEncConfig->force_coefdrop_end = pCfg->waveCfg.forceCoefDropEnd;
  1283. break;
  1284. default :
  1285. break;
  1286. }
  1287. }
  1288. else {
  1289. // for CODA
  1290. if (1 < strlen(pEncConfig->yuvSourceBaseDir)) {
  1291. osal_memset(yuvDir, 0x00, sizeof(yuvDir));
  1292. strcpy(yuvDir, pEncConfig->yuvSourceBaseDir);
  1293. }
  1294. switch(bitFormat)
  1295. {
  1296. case STD_AVC:
  1297. if (parseAvcCfgFile(pCfg, pEncConfig->cfgFileName) == 0)
  1298. return 0;
  1299. pEncConfig->picQpY = pCfg->PicQpY;
  1300. sprintf(pEncConfig->yuvFileName, "%s/%s", yuvDir, pCfg->SrcFileName);
  1301. if(pCfg->frameCropLeft || pCfg->frameCropRight || pCfg->frameCropTop || pCfg->frameCropBottom)
  1302. pCfg->frameCroppingFlag = 1;
  1303. break;
  1304. case STD_MPEG4:
  1305. case STD_H263:
  1306. if (parseMp4CfgFile(pCfg, pEncConfig->cfgFileName) == 0)
  1307. return 0;
  1308. pEncConfig->picQpY = pCfg->VopQuant;
  1309. sprintf(pEncConfig->yuvFileName, "%s/%s", yuvDir, pCfg->SrcFileName);
  1310. if (pCfg->ShortVideoHeader == 1) {
  1311. pEncOP->bitstreamFormat = STD_H263;
  1312. bitFormat = STD_H263;
  1313. }
  1314. break;
  1315. default:
  1316. break;
  1317. }
  1318. }
  1319. if (bitFormat == STD_HEVC || (bitFormat == STD_AVC && productId == PRODUCT_ID_521)) {
  1320. if (setWaveEncOpenParam(pEncOP, pEncConfig, pCfg) == 0)
  1321. return 0;
  1322. }
  1323. else {
  1324. if (setCoda9EncOpenParam(pEncOP, pEncConfig, pCfg) == 0)
  1325. return 0;
  1326. }
  1327. return 1;
  1328. }