vpuhelper.c 75 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247
  1. // SPDX-License-Identifier: LGPL-2.1 OR BSD-3-Clause
  2. //------------------------------------------------------------------------------
  3. // File: $Id$
  4. //
  5. // Copyright (c) 2006, Chips & Media. All rights reserved.
  6. //------------------------------------------------------------------------------
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "main_helper.h"
  10. #ifdef PLATFORM_WIN32
  11. #pragma warning(disable : 4996) //!<< disable waring C4996: The POSIX name for this item is deprecated.
  12. #endif
  13. #ifndef min
  14. #define min(a,b) (((a) < (b)) ? (a) : (b))
  15. #endif
  16. /*******************************************************************************
  17. * REPORT *
  18. *******************************************************************************/
  19. #define USER_DATA_INFO_OFFSET (8*17)
  20. #define FN_PIC_INFO "dec_pic_disp_info.log"
  21. #define FN_SEQ_INFO "dec_seq_disp_info.log"
  22. #define FN_PIC_TYPE "dec_pic_type.log"
  23. #define FN_USER_DATA "dec_user_data.log"
  24. #define FN_SEQ_USER_DATA "dec_seq_user_data.log"
  25. // VC1 specific
  26. enum {
  27. BDU_SEQUENCE_END = 0x0A,
  28. BDU_SLICE = 0x0B,
  29. BDU_FIELD = 0x0C,
  30. BDU_FRAME = 0x0D,
  31. BDU_ENTRYPOINT_HEADER = 0x0E,
  32. BDU_SEQUENCE_HEADER = 0x0F,
  33. BDU_SLICE_LEVEL_USER_DATA = 0x1B,
  34. BDU_FIELD_LEVEL_USER_DATA = 0x1C,
  35. BDU_FRAME_LEVEL_USER_DATA = 0x1D,
  36. BDU_ENTRYPOINT_LEVEL_USER_DATA = 0x1E,
  37. BDU_SEQUENCE_LEVEL_USER_DATA = 0x1F
  38. };
  39. // AVC specific - SEI
  40. enum {
  41. SEI_REGISTERED_ITUTT35_USERDATA = 0x04,
  42. SEI_UNREGISTERED_USERDATA = 0x05,
  43. SEI_MVC_SCALABLE_NESTING = 0x25
  44. };
  45. static vpu_rpt_info_t s_rpt_info[MAX_VPU_CORE_NUM];
  46. void OpenDecReport(
  47. Uint32 core_idx,
  48. VpuReportConfig_t* cfg
  49. )
  50. {
  51. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  52. rpt->fpPicDispInfoLogfile = NULL;
  53. rpt->fpPicTypeLogfile = NULL;
  54. rpt->fpSeqDispInfoLogfile = NULL;
  55. rpt->fpUserDataLogfile = NULL;
  56. rpt->fpSeqUserDataLogfile = NULL;
  57. rpt->decIndex = 0;
  58. rpt->userDataEnable = cfg->userDataEnable;
  59. rpt->userDataReportMode = cfg->userDataReportMode;
  60. rpt->reportOpened = TRUE;
  61. return;
  62. }
  63. void CloseDecReport(
  64. Uint32 core_idx
  65. )
  66. {
  67. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  68. if (rpt->reportOpened == FALSE) {
  69. return;
  70. }
  71. if (rpt->fpPicDispInfoLogfile) {
  72. osal_fclose(rpt->fpPicDispInfoLogfile);
  73. rpt->fpPicDispInfoLogfile = NULL;
  74. }
  75. if (rpt->fpPicTypeLogfile) {
  76. osal_fclose(rpt->fpPicTypeLogfile);
  77. rpt->fpPicTypeLogfile = NULL;
  78. }
  79. if (rpt->fpSeqDispInfoLogfile) {
  80. osal_fclose(rpt->fpSeqDispInfoLogfile);
  81. rpt->fpSeqDispInfoLogfile = NULL;
  82. }
  83. if (rpt->fpUserDataLogfile) {
  84. osal_fclose(rpt->fpUserDataLogfile);
  85. rpt->fpUserDataLogfile= NULL;
  86. }
  87. if (rpt->fpSeqUserDataLogfile) {
  88. osal_fclose(rpt->fpSeqUserDataLogfile);
  89. rpt->fpSeqUserDataLogfile = NULL;
  90. }
  91. if (rpt->vb_rpt.base) {
  92. vdi_free_dma_memory(core_idx, &rpt->vb_rpt);
  93. }
  94. rpt->decIndex = 0;
  95. return;
  96. }
  97. static void SaveUserData(
  98. Uint32 core_idx,
  99. BYTE* userDataBuf
  100. )
  101. {
  102. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  103. Uint32 i;
  104. Uint32 UserDataType;
  105. Uint32 UserDataSize;
  106. Uint32 userDataNum;
  107. Uint32 TotalSize;
  108. BYTE* tmpBuf;
  109. if (rpt->reportOpened == FALSE) {
  110. return;
  111. }
  112. if(rpt->fpUserDataLogfile == 0) {
  113. rpt->fpUserDataLogfile = osal_fopen(FN_USER_DATA, "w+");
  114. }
  115. tmpBuf = userDataBuf;
  116. userDataNum = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  117. TotalSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  118. tmpBuf = userDataBuf + 8;
  119. for(i=0; i<userDataNum; i++) {
  120. UserDataType = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  121. UserDataSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  122. osal_fprintf(rpt->fpUserDataLogfile, "\n[Idx Type Size] : [%4d %4d %4d]",i, UserDataType, UserDataSize);
  123. tmpBuf += 8;
  124. }
  125. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  126. tmpBuf = userDataBuf + USER_DATA_INFO_OFFSET;
  127. for(i=0; i<TotalSize; i++) {
  128. osal_fprintf(rpt->fpUserDataLogfile, "%02x", tmpBuf[i]);
  129. if ((i&7) == 7) {
  130. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  131. }
  132. }
  133. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  134. osal_fflush(rpt->fpUserDataLogfile);
  135. }
  136. static void SaveUserDataINT(
  137. Uint32 core_idx,
  138. BYTE* userDataBuf,
  139. Int32 size,
  140. Int32 intIssued,
  141. Int32 decIdx,
  142. CodStd bitstreamFormat
  143. )
  144. {
  145. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  146. Int32 i;
  147. Int32 UserDataType = 0;
  148. Int32 UserDataSize = 0;
  149. Int32 userDataNum = 0;
  150. Int32 TotalSize;
  151. BYTE* tmpBuf;
  152. BYTE* backupBufTmp;
  153. static Int32 backupSize = 0;
  154. static BYTE* backupBuf = NULL;
  155. if (rpt->reportOpened == FALSE) {
  156. return;
  157. }
  158. if(rpt->fpUserDataLogfile == NULL) {
  159. rpt->fpUserDataLogfile = osal_fopen(FN_USER_DATA, "w+");
  160. }
  161. backupBufTmp = (BYTE *)osal_malloc(backupSize + size);
  162. if (backupBufTmp == 0) {
  163. VLOG( ERR, "Can't mem allock\n");
  164. return;
  165. }
  166. for (i=0; i<backupSize; i++) {
  167. backupBufTmp[i] = backupBuf[i];
  168. }
  169. if (backupBuf != NULL) {
  170. osal_free(backupBuf);
  171. }
  172. backupBuf = backupBufTmp;
  173. tmpBuf = userDataBuf + USER_DATA_INFO_OFFSET;
  174. size -= USER_DATA_INFO_OFFSET;
  175. for(i=0; i<size; i++) {
  176. backupBuf[backupSize + i] = tmpBuf[i];
  177. }
  178. backupSize += size;
  179. if (intIssued) {
  180. return;
  181. }
  182. tmpBuf = userDataBuf;
  183. userDataNum = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  184. if(userDataNum == 0) {
  185. return;
  186. }
  187. tmpBuf = userDataBuf + 8;
  188. UserDataSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  189. UserDataSize = (UserDataSize+7)/8*8;
  190. osal_fprintf(rpt->fpUserDataLogfile, "FRAME [%1d]\n", decIdx);
  191. for(i=0; i<backupSize; i++) {
  192. osal_fprintf(rpt->fpUserDataLogfile, "%02x", backupBuf[i]);
  193. if ((i&7) == 7) {
  194. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  195. }
  196. if( (i%8==7) && (i==UserDataSize-1) && (UserDataSize != backupSize)) {
  197. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  198. tmpBuf+=8;
  199. UserDataSize += (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  200. UserDataSize = (UserDataSize+7)/8*8;
  201. }
  202. }
  203. if (backupSize > 0) {
  204. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  205. }
  206. tmpBuf = userDataBuf;
  207. userDataNum = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  208. TotalSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  209. osal_fprintf(rpt->fpUserDataLogfile, "User Data Num: [%d]\n", userDataNum);
  210. osal_fprintf(rpt->fpUserDataLogfile, "User Data Total Size: [%d]\n", TotalSize);
  211. tmpBuf = userDataBuf + 8;
  212. for(i=0; i<userDataNum; i++) {
  213. UserDataType = (short)((tmpBuf[0]<<8) | (tmpBuf[1]<<0));
  214. UserDataSize = (short)((tmpBuf[2]<<8) | (tmpBuf[3]<<0));
  215. if(bitstreamFormat == STD_VC1) {
  216. switch (UserDataType) {
  217. case BDU_SLICE_LEVEL_USER_DATA:
  218. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_SLICE_LEVEL_USER_DATA");
  219. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  220. break;
  221. case BDU_FIELD_LEVEL_USER_DATA:
  222. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_FIELD_LEVEL_USER_DATA");
  223. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  224. break;
  225. case BDU_FRAME_LEVEL_USER_DATA:
  226. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_FRAME_LEVEL_USER_DATA");
  227. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  228. break;
  229. case BDU_ENTRYPOINT_LEVEL_USER_DATA:
  230. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_ENTRYPOINT_LEVEL_USER_DATA");
  231. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  232. break;
  233. case BDU_SEQUENCE_LEVEL_USER_DATA:
  234. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "BDU_SEQUENCE_LEVEL_USER_DATA");
  235. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  236. break;
  237. }
  238. }
  239. else if(bitstreamFormat == STD_AVC) {
  240. switch (UserDataType) {
  241. case SEI_REGISTERED_ITUTT35_USERDATA:
  242. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "registered_itu_t_t35");
  243. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  244. break;
  245. case SEI_UNREGISTERED_USERDATA:
  246. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "unregistered");
  247. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  248. break;
  249. case SEI_MVC_SCALABLE_NESTING:
  250. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "mvc_scalable_nesting");
  251. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  252. break;
  253. }
  254. }
  255. else if(bitstreamFormat == STD_MPEG2) {
  256. switch (UserDataType) {
  257. case 0:
  258. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Seq]\n", i);
  259. break;
  260. case 1:
  261. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Gop]\n", i);
  262. break;
  263. case 2:
  264. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Pic]\n", i);
  265. break;
  266. default:
  267. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Error]\n", i);
  268. break;
  269. }
  270. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  271. }
  272. else if(bitstreamFormat == STD_AVS) {
  273. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:%s]\n", i, "User Data");
  274. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  275. }
  276. else {
  277. switch (UserDataType) {
  278. case 0:
  279. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Vos]\n", i);
  280. break;
  281. case 1:
  282. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Vis]\n", i);
  283. break;
  284. case 2:
  285. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Vol]\n", i);
  286. break;
  287. case 3:
  288. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Gov]\n", i);
  289. break;
  290. default:
  291. osal_fprintf(rpt->fpUserDataLogfile, "User Data Type: [%d:Error]\n", i);
  292. break;
  293. }
  294. osal_fprintf(rpt->fpUserDataLogfile, "User Data Size: [%d]\n", UserDataSize);
  295. }
  296. tmpBuf += 8;
  297. }
  298. osal_fprintf(rpt->fpUserDataLogfile, "\n");
  299. osal_fflush(rpt->fpUserDataLogfile);
  300. backupSize = 0;
  301. if (backupBuf != NULL) {
  302. osal_free(backupBuf);
  303. }
  304. backupBuf = 0;
  305. }
  306. void CheckUserDataInterrupt(
  307. Uint32 core_idx,
  308. DecHandle handle,
  309. Int32 decodeIdx,
  310. CodStd bitstreamFormat,
  311. Int32 int_reason
  312. )
  313. {
  314. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  315. if (int_reason & (1<<INT_BIT_USERDATA)) {
  316. // USER DATA INTERRUPT Issued
  317. // User Data save
  318. if (rpt->userDataEnable == TRUE) {
  319. int size;
  320. BYTE *userDataBuf;
  321. size = rpt->vb_rpt.size + USER_DATA_INFO_OFFSET;
  322. userDataBuf = osal_malloc(size);
  323. osal_memset(userDataBuf, 0, size);
  324. vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, size, VDI_BIG_ENDIAN);
  325. if (decodeIdx >= 0)
  326. SaveUserDataINT(core_idx, userDataBuf, size, 1, rpt->decIndex, bitstreamFormat);
  327. osal_free(userDataBuf);
  328. } else {
  329. VLOG(ERR, "Unexpected Interrupt issued");
  330. }
  331. }
  332. }
  333. void ConfigDecReport(
  334. Uint32 core_idx,
  335. DecHandle handle,
  336. CodStd bitstreamFormat
  337. )
  338. {
  339. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  340. if (rpt->reportOpened == FALSE) {
  341. return;
  342. }
  343. // Report Information
  344. if (!rpt->vb_rpt.base) {
  345. rpt->vb_rpt.size = SIZE_REPORT_BUF;
  346. if (vdi_allocate_dma_memory(core_idx, &rpt->vb_rpt) < 0) {
  347. VLOG(ERR, "fail to allocate report buffer\n" );
  348. return;
  349. }
  350. }
  351. VPU_DecGiveCommand(handle, SET_ADDR_REP_USERDATA, &rpt->vb_rpt.phys_addr );
  352. VPU_DecGiveCommand(handle, SET_SIZE_REP_USERDATA, &rpt->vb_rpt.size );
  353. VPU_DecGiveCommand(handle, SET_USERDATA_REPORT_MODE, &rpt->userDataReportMode );
  354. if (rpt->userDataEnable == TRUE) {
  355. VPU_DecGiveCommand( handle, ENABLE_REP_USERDATA, 0 );
  356. }
  357. else {
  358. VPU_DecGiveCommand( handle, DISABLE_REP_USERDATA, 0 );
  359. }
  360. }
  361. void SaveDecReport(
  362. Uint32 core_idx,
  363. DecHandle handle,
  364. DecOutputInfo* pDecInfo,
  365. CodStd bitstreamFormat,
  366. Uint32 mbNumX,
  367. Uint32 mbNumY
  368. )
  369. {
  370. vpu_rpt_info_t *rpt = &s_rpt_info[core_idx];
  371. if (rpt->reportOpened == FALSE) {
  372. return ;
  373. }
  374. // Report Information
  375. // User Data
  376. if ((pDecInfo->indexFrameDecoded >= 0 || (bitstreamFormat == STD_VC1)) &&
  377. rpt->userDataEnable == TRUE &&
  378. pDecInfo->decOutputExtData.userDataSize > 0) {
  379. // Vc1 Frame user data follow picture. After last frame decoding, user data should be reported.
  380. Uint32 size = 0;
  381. BYTE* userDataBuf = NULL;
  382. if (pDecInfo->decOutputExtData.userDataBufFull == TRUE) {
  383. VLOG(ERR, "User Data Buffer is Full\n");
  384. }
  385. size = (pDecInfo->decOutputExtData.userDataSize+7)/8*8 + USER_DATA_INFO_OFFSET;
  386. userDataBuf = (BYTE*)osal_malloc(size);
  387. osal_memset(userDataBuf, 0, size);
  388. vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, size, HOST_ENDIAN);
  389. if (pDecInfo->indexFrameDecoded >= 0) {
  390. SaveUserData(core_idx, userDataBuf);
  391. }
  392. osal_free(userDataBuf);
  393. }
  394. if (((pDecInfo->indexFrameDecoded >= 0 || (bitstreamFormat == STD_VC1 )) && rpt->userDataEnable) || // Vc1 Frame user data follow picture. After last frame decoding, user data should be reported.
  395. (pDecInfo->indexFrameDisplay >= 0 && rpt->userDataEnable) ) {
  396. Uint32 size = 0;
  397. Uint32 dataSize = 0;
  398. BYTE* userDataBuf = NULL;
  399. if (pDecInfo->decOutputExtData.userDataBufFull) {
  400. VLOG(ERR, "User Data Buffer is Full\n");
  401. }
  402. dataSize = pDecInfo->decOutputExtData.userDataSize % rpt->vb_rpt.size;
  403. if (dataSize == 0 && pDecInfo->decOutputExtData.userDataSize != 0) {
  404. dataSize = rpt->vb_rpt.size;
  405. }
  406. size = (dataSize+7)/8*8 + USER_DATA_INFO_OFFSET;
  407. userDataBuf = (BYTE*)osal_malloc(size);
  408. osal_memset(userDataBuf, 0, size);
  409. vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, size, HOST_ENDIAN);
  410. if (pDecInfo->indexFrameDecoded >= 0 || (bitstreamFormat == STD_VC1)) {
  411. SaveUserDataINT(core_idx, userDataBuf, size, 0, rpt->decIndex, bitstreamFormat);
  412. }
  413. osal_free(userDataBuf);
  414. }
  415. if (pDecInfo->indexFrameDecoded >= 0) {
  416. if (rpt->fpPicTypeLogfile == NULL) {
  417. rpt->fpPicTypeLogfile = osal_fopen(FN_PIC_TYPE, "w+");
  418. }
  419. osal_fprintf(rpt->fpPicTypeLogfile, "FRAME [%1d]\n", rpt->decIndex);
  420. switch (bitstreamFormat) {
  421. case STD_AVC:
  422. if(pDecInfo->pictureStructure == 3) { // FIELD_INTERLACED
  423. osal_fprintf(rpt->fpPicTypeLogfile, "Top Field Type: [%s]\n", pDecInfo->picTypeFirst == 0 ? "I_TYPE" :
  424. (pDecInfo->picTypeFirst) == 1 ? "P_TYPE" :
  425. (pDecInfo->picTypeFirst) == 2 ? "BI_TYPE" :
  426. (pDecInfo->picTypeFirst) == 3 ? "B_TYPE" :
  427. (pDecInfo->picTypeFirst) == 4 ? "SKIP_TYPE" :
  428. (pDecInfo->picTypeFirst) == 5 ? "IDR_TYPE" :
  429. "FORBIDDEN");
  430. osal_fprintf(rpt->fpPicTypeLogfile, "Bottom Field Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  431. (pDecInfo->picType) == 1 ? "P_TYPE" :
  432. (pDecInfo->picType) == 2 ? "BI_TYPE" :
  433. (pDecInfo->picType) == 3 ? "B_TYPE" :
  434. (pDecInfo->picType) == 4 ? "SKIP_TYPE" :
  435. (pDecInfo->picType) == 5 ? "IDR_TYPE" :
  436. "FORBIDDEN");
  437. }
  438. else {
  439. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  440. (pDecInfo->picType) == 1 ? "P_TYPE" :
  441. (pDecInfo->picType) == 2 ? "BI_TYPE" :
  442. (pDecInfo->picType) == 3 ? "B_TYPE" :
  443. (pDecInfo->picType) == 4 ? "SKIP_TYPE" :
  444. (pDecInfo->picType) == 5 ? "IDR_TYPE" :
  445. "FORBIDDEN");
  446. }
  447. break;
  448. case STD_MPEG2 :
  449. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  450. pDecInfo->picType == 1 ? "P_TYPE" :
  451. pDecInfo->picType == 2 ? "B_TYPE" :
  452. "D_TYPE");
  453. break;
  454. case STD_MPEG4 :
  455. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  456. pDecInfo->picType == 1 ? "P_TYPE" :
  457. pDecInfo->picType == 2 ? "B_TYPE" :
  458. "S_TYPE");
  459. break;
  460. case STD_VC1:
  461. if(pDecInfo->pictureStructure == 3) { // FIELD_INTERLACED
  462. osal_fprintf(rpt->fpPicTypeLogfile, "Top Field Type: [%s]\n", pDecInfo->picTypeFirst == 0 ? "I_TYPE" :
  463. (pDecInfo->picTypeFirst) == 1 ? "P_TYPE" :
  464. (pDecInfo->picTypeFirst) == 2 ? "BI_TYPE" :
  465. (pDecInfo->picTypeFirst) == 3 ? "B_TYPE" :
  466. (pDecInfo->picTypeFirst) == 4 ? "SKIP_TYPE" :
  467. "FORBIDDEN");
  468. osal_fprintf(rpt->fpPicTypeLogfile, "Bottom Field Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  469. (pDecInfo->picType) == 1 ? "P_TYPE" :
  470. (pDecInfo->picType) == 2 ? "BI_TYPE" :
  471. (pDecInfo->picType) == 3 ? "B_TYPE" :
  472. (pDecInfo->picType) == 4 ? "SKIP_TYPE" :
  473. "FORBIDDEN");
  474. }
  475. else {
  476. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  477. (pDecInfo->picTypeFirst) == 1 ? "P_TYPE" :
  478. (pDecInfo->picTypeFirst) == 2 ? "BI_TYPE" :
  479. (pDecInfo->picTypeFirst) == 3 ? "B_TYPE" :
  480. (pDecInfo->picTypeFirst) == 4 ? "SKIP_TYPE" :
  481. "FORBIDDEN");
  482. }
  483. break;
  484. default:
  485. osal_fprintf(rpt->fpPicTypeLogfile, "Picture Type: [%s]\n", pDecInfo->picType == 0 ? "I_TYPE" :
  486. pDecInfo->picType == 1 ? "P_TYPE" :
  487. "B_TYPE");
  488. break;
  489. }
  490. }
  491. if (pDecInfo->indexFrameDecoded >= 0) {
  492. if (rpt->fpPicDispInfoLogfile == NULL) {
  493. rpt->fpPicDispInfoLogfile = osal_fopen(FN_PIC_INFO, "w+");
  494. }
  495. osal_fprintf(rpt->fpPicDispInfoLogfile, "FRAME [%1d]\n", rpt->decIndex);
  496. switch (bitstreamFormat) {
  497. case STD_MPEG2:
  498. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n",
  499. pDecInfo->picType == 0 ? "I_TYPE" :
  500. pDecInfo->picType == 1 ? "P_TYPE" :
  501. pDecInfo->picType == 2 ? "B_TYPE" :
  502. "D_TYPE");
  503. break;
  504. case STD_MPEG4:
  505. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n",
  506. pDecInfo->picType == 0 ? "I_TYPE" :
  507. pDecInfo->picType == 1 ? "P_TYPE" :
  508. pDecInfo->picType == 2 ? "B_TYPE" :
  509. "S_TYPE");
  510. break;
  511. case STD_VC1 :
  512. if(pDecInfo->pictureStructure == 3) { // FIELD_INTERLACED
  513. osal_fprintf(rpt->fpPicDispInfoLogfile, "Top : %s\n", (pDecInfo->picType>>3) == 0 ? "I_TYPE" :
  514. (pDecInfo->picType>>3) == 1 ? "P_TYPE" :
  515. (pDecInfo->picType>>3) == 2 ? "BI_TYPE" :
  516. (pDecInfo->picType>>3) == 3 ? "B_TYPE" :
  517. (pDecInfo->picType>>3) == 4 ? "SKIP_TYPE" :
  518. "FORBIDDEN");
  519. osal_fprintf(rpt->fpPicDispInfoLogfile, "Bottom : %s\n", (pDecInfo->picType&0x7) == 0 ? "I_TYPE" :
  520. (pDecInfo->picType&0x7) == 1 ? "P_TYPE" :
  521. (pDecInfo->picType&0x7) == 2 ? "BI_TYPE" :
  522. (pDecInfo->picType&0x7) == 3 ? "B_TYPE" :
  523. (pDecInfo->picType&0x7) == 4 ? "SKIP_TYPE" :
  524. "FORBIDDEN");
  525. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Picture");
  526. }
  527. else {
  528. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", (pDecInfo->picType>>3) == 0 ? "I_TYPE" :
  529. (pDecInfo->picType>>3) == 1 ? "P_TYPE" :
  530. (pDecInfo->picType>>3) == 2 ? "BI_TYPE" :
  531. (pDecInfo->picType>>3) == 3 ? "B_TYPE" :
  532. (pDecInfo->picType>>3) == 4 ? "SKIP_TYPE" :
  533. "FORBIDDEN");
  534. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Frame Picture");
  535. }
  536. break;
  537. default:
  538. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n",
  539. pDecInfo->picType == 0 ? "I_TYPE" :
  540. pDecInfo->picType == 1 ? "P_TYPE" :
  541. "B_TYPE");
  542. break;
  543. }
  544. if(bitstreamFormat != STD_VC1) {
  545. if (pDecInfo->interlacedFrame) {
  546. if(bitstreamFormat == STD_AVS) {
  547. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Frame Picture");
  548. }
  549. else {
  550. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Picture");
  551. }
  552. }
  553. else {
  554. if(bitstreamFormat == STD_AVS) {
  555. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Picture");
  556. }
  557. else {
  558. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Frame Picture");
  559. }
  560. }
  561. }
  562. if (bitstreamFormat != STD_RV) {
  563. if(bitstreamFormat == STD_VC1) {
  564. switch(pDecInfo->pictureStructure) {
  565. case 0: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "PROGRESSIVE"); break;
  566. case 2: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FRAME_INTERLACE"); break;
  567. case 3: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FIELD_INTERLACE"); break;
  568. default: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FORBIDDEN"); break;
  569. }
  570. }
  571. else if(bitstreamFormat == STD_AVC) {
  572. if(!pDecInfo->interlacedFrame) {
  573. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FRAME_PICTURE");
  574. }
  575. else {
  576. if(pDecInfo->topFieldFirst) {
  577. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Top Field First");
  578. }
  579. else {
  580. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Bottom Field First");
  581. }
  582. }
  583. }
  584. else if (bitstreamFormat != STD_MPEG4 && bitstreamFormat != STD_AVS) {
  585. switch (pDecInfo->pictureStructure) {
  586. case 1: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "TOP_FIELD"); break;
  587. case 2: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "BOTTOM_FIELD"); break;
  588. case 3: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FRAME_PICTURE"); break;
  589. default: osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "FORBIDDEN"); break;
  590. }
  591. }
  592. if(bitstreamFormat != STD_AVC) {
  593. if (pDecInfo->topFieldFirst) {
  594. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Top Field First");
  595. }
  596. else {
  597. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Bottom Field First");
  598. }
  599. if (bitstreamFormat != STD_MPEG4) {
  600. if (pDecInfo->repeatFirstField) {
  601. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Repeat First Field");
  602. }
  603. else {
  604. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Not Repeat First Field");
  605. }
  606. if (bitstreamFormat == STD_VC1) {
  607. osal_fprintf(rpt->fpPicDispInfoLogfile, "VC1 RPTFRM [%1d]\n", pDecInfo->progressiveFrame);
  608. }
  609. else if (pDecInfo->progressiveFrame) {
  610. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Progressive Frame");
  611. }
  612. else {
  613. osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", "Interlaced Frame");
  614. }
  615. }
  616. }
  617. }
  618. if (bitstreamFormat == STD_MPEG2) {
  619. osal_fprintf(rpt->fpPicDispInfoLogfile, "Field Sequence [%d]\n\n", pDecInfo->fieldSequence);
  620. }
  621. else {
  622. osal_fprintf(rpt->fpPicDispInfoLogfile, "\n");
  623. }
  624. osal_fflush(rpt->fpPicDispInfoLogfile);
  625. }
  626. if(pDecInfo->indexFrameDecoded >= 0) {
  627. rpt->decIndex ++;
  628. }
  629. return;
  630. }
  631. #define DEFAULT_ENC_OUTPUT_NUM 30
  632. /*******************************************************************************
  633. * FUNCTIONS RELATED TO CPB *
  634. *******************************************************************************/
  635. int FillBsResetBufHelper(Uint32 core_idx,
  636. BYTE *buf,
  637. PhysicalAddress paBsBufAddr,
  638. int bsBufsize,
  639. int endian)
  640. {
  641. if( !bsBufsize )
  642. return -1;
  643. VpuReadMem(core_idx, paBsBufAddr, buf, bsBufsize, endian);
  644. return bsBufsize;
  645. }
  646. RetCode ReadBsRingBufHelper(Uint32 core_idx,
  647. EncHandle handle,
  648. osal_file_t bsFp,
  649. PhysicalAddress bitstreamBuffer,
  650. Uint32 bitstreamBufferSize,
  651. int defaultsize,
  652. int endian)
  653. {
  654. RetCode ret = RETCODE_SUCCESS;
  655. int loadSize = 0;
  656. PhysicalAddress paRdPtr, paWrPtr;
  657. int size = 0;
  658. PhysicalAddress paBsBufStart = bitstreamBuffer;
  659. PhysicalAddress paBsBufEnd = bitstreamBuffer+bitstreamBufferSize;
  660. ret = VPU_EncGetBitstreamBuffer(handle, &paRdPtr, &paWrPtr, &size);
  661. if( ret != RETCODE_SUCCESS )
  662. {
  663. VLOG(ERR, "VPU_EncGetBitstreamBuffer failed Error code is 0x%x \n", ret );
  664. goto LOAD_BS_ERROR;
  665. }
  666. if( size > 0 )
  667. {
  668. if( defaultsize > 0 )
  669. {
  670. if( size < defaultsize )
  671. loadSize = ( ( size >> 9 ) << 9 );
  672. else
  673. loadSize = defaultsize;
  674. }
  675. else
  676. {
  677. loadSize = size;
  678. }
  679. if( loadSize > 0 )
  680. {
  681. ProcessEncodedBitstreamBurst(core_idx, bsFp, paRdPtr, paBsBufStart, paBsBufEnd, loadSize, endian, NULL);
  682. ret = VPU_EncUpdateBitstreamBuffer(handle, loadSize);
  683. if( ret != RETCODE_SUCCESS )
  684. {
  685. VLOG(ERR, "VPU_EncUpdateBitstreamBuffer failed Error code is 0x%x \n", ret );
  686. goto LOAD_BS_ERROR;
  687. }
  688. }
  689. }
  690. LOAD_BS_ERROR:
  691. return ret;
  692. }
  693. /******************************************************************************
  694. DPB Image Data Control
  695. ******************************************************************************/
  696. /* THIS FUNCTION WILL BE REMOVED */
  697. /*lint -save -e438 */
  698. int LoadYuvImageHelperFormat(Uint32 core_idx,
  699. osal_file_t yuvFp,
  700. Uint8 *pYuv,
  701. FrameBuffer *fb,
  702. TiledMapConfig mapCfg,
  703. int picWidth,
  704. int picHeight,
  705. int stride,
  706. int interleave,
  707. int format,
  708. int endian,
  709. BOOL converter)
  710. {
  711. int frameSize;
  712. switch (format)
  713. {
  714. case FORMAT_420:
  715. frameSize = picWidth * picHeight * 3 / 2;
  716. break;
  717. case FORMAT_224:
  718. frameSize = picWidth * picHeight * 4 / 2;
  719. break;
  720. case FORMAT_422:
  721. frameSize = picWidth * picHeight * 4 / 2;
  722. break;
  723. case FORMAT_444:
  724. frameSize = picWidth * picHeight * 6 / 2;
  725. break;
  726. case FORMAT_400:
  727. frameSize = picWidth * picHeight;
  728. break;
  729. case FORMAT_YUYV:
  730. frameSize = picWidth * picHeight * 4 / 2;
  731. picWidth *= 2;
  732. stride*= 2;
  733. break;
  734. default:
  735. frameSize = picWidth * picHeight * 3 / 2;
  736. break;
  737. }
  738. // Load source one picture image to encode to SDRAM frame buffer.
  739. if( !osal_fread(pYuv, 1, frameSize, yuvFp) )
  740. {
  741. if( !osal_feof( yuvFp ) )
  742. VLOG(ERR, "Yuv Data osal_fread failed file handle is 0x%x \n", yuvFp );
  743. return 0;
  744. }
  745. if (fb->mapType)
  746. LoadTiledImageYuvBurst(core_idx, pYuv, picWidth, picHeight, fb, mapCfg);
  747. else
  748. {
  749. LoadYuvImageBurstFormat(core_idx, pYuv, picWidth, picHeight, fb, TRUE);
  750. }
  751. return 1;
  752. }
  753. /*lint -restore */
  754. #if 0
  755. int SaveYuvImageHelperFormat(
  756. Uint32 core_idx,
  757. osal_file_t yuvFp,
  758. FrameBuffer* fbSrc,
  759. TiledMapConfig mapCfg,
  760. Uint8* pYuv,
  761. VpuRect rect,
  762. BOOL enableCrop,
  763. int interLeave,
  764. int format,
  765. int endian)
  766. {
  767. int frameSize;
  768. int picWidth;
  769. int picHeight;
  770. picWidth = enableCrop == TRUE ? (int)(rect.right - rect.left) : fbSrc->stride;
  771. picHeight = enableCrop == TRUE ? (int)(rect.bottom - rect.top) : fbSrc->height;
  772. switch (format)
  773. {
  774. case FORMAT_420:
  775. frameSize = picWidth * ((picHeight+1)/2*2) * 3/2;
  776. break;
  777. case FORMAT_224:
  778. frameSize = picWidth * ((picHeight+1)/2*2) * 4/2;
  779. break;
  780. case FORMAT_422:
  781. frameSize = picWidth * picHeight * 4/2;
  782. break;
  783. case FORMAT_444:
  784. frameSize = picWidth * picHeight * 6/2;
  785. break;
  786. case FORMAT_400:
  787. frameSize = picWidth * picHeight;
  788. break;
  789. case FORMAT_420_P10_16BIT_LSB:
  790. case FORMAT_420_P10_16BIT_MSB:
  791. frameSize = picWidth*2 * ((picHeight+1)/2*2) * 3/2;
  792. break;
  793. default:
  794. frameSize = picWidth * ((picHeight+1)/2*2) * 3/2;
  795. break;
  796. }
  797. StoreYuvImageBurstFormat(core_idx, fbSrc, mapCfg, pYuv, rect, enableCrop, format, endian);
  798. if (yuvFp)
  799. {
  800. if( !osal_fwrite(pYuv, sizeof(Uint8), frameSize , yuvFp) )
  801. {
  802. VLOG(ERR, "Frame Data osal_fwrite failed file handle is 0x%x \n", yuvFp );
  803. return 0;
  804. }
  805. }
  806. return 1;
  807. }
  808. #endif
  809. int setWaveEncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, ENC_CFG *pCfg)
  810. {
  811. Int32 i = 0;
  812. Int32 srcWidth;
  813. Int32 srcHeight;
  814. Int32 outputNum;
  815. Int32 bitrate;
  816. EncHevcParam *param = &pEncOP->EncStdParam.hevcParam;
  817. srcWidth = (pEncConfig->picWidth > 0) ? pEncConfig->picWidth : pCfg->hevcCfg.picX;
  818. srcHeight = (pEncConfig->picHeight > 0) ? pEncConfig->picHeight : pCfg->hevcCfg.picY;
  819. outputNum = (pEncConfig->outNum > 0) ? min(pEncConfig->outNum,pCfg->NumFrame) : pCfg->NumFrame;
  820. bitrate = (pEncConfig->kbps > 0) ? pEncConfig->kbps*1024 : pCfg->RcBitRate;
  821. pEncConfig->outNum = outputNum;
  822. pEncOP->picWidth = srcWidth;
  823. pEncOP->picHeight = srcHeight;
  824. pEncOP->frameRateInfo = pCfg->hevcCfg.frameRate;
  825. param->level = 0;
  826. param->tier = 0;
  827. pEncOP->srcBitDepth = pCfg->SrcBitDepth;
  828. if (pCfg->hevcCfg.internalBitDepth == 0)
  829. param->internalBitDepth = pCfg->SrcBitDepth;
  830. else
  831. param->internalBitDepth = pCfg->hevcCfg.internalBitDepth;
  832. if (param->internalBitDepth > 8)
  833. param->profile = HEVC_PROFILE_MAIN10;
  834. else
  835. param->profile = HEVC_PROFILE_MAIN;
  836. param->chromaFormatIdc = 0;
  837. param->losslessEnable = pCfg->hevcCfg.losslessEnable;
  838. param->constIntraPredFlag = pCfg->hevcCfg.constIntraPredFlag;
  839. if (pCfg->hevcCfg.useAsLongtermPeriod > 0 || pCfg->hevcCfg.refLongtermPeriod > 0)
  840. param->useLongTerm = 1;
  841. else
  842. param->useLongTerm = 0;
  843. /* for CMD_ENC_SEQ_GOP_PARAM */
  844. param->gopPresetIdx = pCfg->hevcCfg.gopPresetIdx;
  845. /* for CMD_ENC_SEQ_INTRA_PARAM */
  846. param->decodingRefreshType = pCfg->hevcCfg.decodingRefreshType;
  847. param->intraPeriod = pCfg->hevcCfg.intraPeriod;
  848. param->intraQP = pCfg->hevcCfg.intraQP;
  849. param->forcedIdrHeaderEnable = pCfg->hevcCfg.forcedIdrHeaderEnable;
  850. /* for CMD_ENC_SEQ_CONF_WIN_TOP_BOT/LEFT_RIGHT */
  851. param->confWinTop = pCfg->hevcCfg.confWinTop;
  852. param->confWinBot = pCfg->hevcCfg.confWinBot;
  853. param->confWinLeft = pCfg->hevcCfg.confWinLeft;
  854. param->confWinRight = pCfg->hevcCfg.confWinRight;
  855. /* for CMD_ENC_SEQ_INDEPENDENT_SLICE */
  856. param->independSliceMode = pCfg->hevcCfg.independSliceMode;
  857. param->independSliceModeArg = pCfg->hevcCfg.independSliceModeArg;
  858. /* for CMD_ENC_SEQ_DEPENDENT_SLICE */
  859. param->dependSliceMode = pCfg->hevcCfg.dependSliceMode;
  860. param->dependSliceModeArg = pCfg->hevcCfg.dependSliceModeArg;
  861. /* for CMD_ENC_SEQ_INTRA_REFRESH_PARAM */
  862. param->intraRefreshMode = pCfg->hevcCfg.intraRefreshMode;
  863. param->intraRefreshArg = pCfg->hevcCfg.intraRefreshArg;
  864. param->useRecommendEncParam = pCfg->hevcCfg.useRecommendEncParam;
  865. /* for CMD_ENC_PARAM */
  866. param->scalingListEnable = pCfg->hevcCfg.scalingListEnable;
  867. param->cuSizeMode = pCfg->hevcCfg.cuSizeMode;
  868. param->tmvpEnable = pCfg->hevcCfg.tmvpEnable;
  869. param->wppEnable = pCfg->hevcCfg.wppenable;
  870. param->maxNumMerge = pCfg->hevcCfg.maxNumMerge;
  871. param->dynamicMerge8x8Enable = pCfg->hevcCfg.dynamicMerge8x8Enable;
  872. param->dynamicMerge16x16Enable = pCfg->hevcCfg.dynamicMerge16x16Enable;
  873. param->dynamicMerge32x32Enable = pCfg->hevcCfg.dynamicMerge32x32Enable;
  874. param->disableDeblk = pCfg->hevcCfg.disableDeblk;
  875. param->lfCrossSliceBoundaryEnable = pCfg->hevcCfg.lfCrossSliceBoundaryEnable;
  876. param->betaOffsetDiv2 = pCfg->hevcCfg.betaOffsetDiv2;
  877. param->tcOffsetDiv2 = pCfg->hevcCfg.tcOffsetDiv2;
  878. param->skipIntraTrans = pCfg->hevcCfg.skipIntraTrans;
  879. param->saoEnable = pCfg->hevcCfg.saoEnable;
  880. param->intraInInterSliceEnable = pCfg->hevcCfg.intraInInterSliceEnable;
  881. param->intraNxNEnable = pCfg->hevcCfg.intraNxNEnable;
  882. /* for CMD_ENC_RC_PARAM */
  883. pEncOP->rcEnable = pCfg->RcEnable;
  884. pEncOP->initialDelay = pCfg->RcInitDelay;
  885. param->cuLevelRCEnable = pCfg->hevcCfg.cuLevelRCEnable;
  886. param->hvsQPEnable = pCfg->hevcCfg.hvsQPEnable;
  887. param->hvsQpScaleEnable = pCfg->hevcCfg.hvsQpScaleEnable;
  888. param->hvsQpScale = pCfg->hevcCfg.hvsQpScale;
  889. param->ctuOptParam.roiDeltaQp= pCfg->hevcCfg.ctuOptParam.roiDeltaQp;
  890. param->intraQpOffset = pCfg->hevcCfg.intraQpOffset;
  891. param->initBufLevelx8 = pCfg->hevcCfg.initBufLevelx8;
  892. param->bitAllocMode = pCfg->hevcCfg.bitAllocMode;
  893. for (i = 0; i < MAX_GOP_NUM; i++) {
  894. param->fixedBitRatio[i] = pCfg->hevcCfg.fixedBitRatio[i];
  895. }
  896. /* for CMD_ENC_RC_MIN_MAX_QP */
  897. param->minQp = pCfg->hevcCfg.minQp;
  898. param->maxQp = pCfg->hevcCfg.maxQp;
  899. param->maxDeltaQp = pCfg->hevcCfg.maxDeltaQp;
  900. param->transRate = pCfg->hevcCfg.transRate;
  901. pEncOP->bitRate = bitrate;
  902. param->gopParam.enTemporalLayerQp = pCfg->hevcCfg.gopParam.enTemporalLayerQp;
  903. param->gopParam.tidQp0 = pCfg->hevcCfg.gopParam.tidQp0;
  904. param->gopParam.tidQp1 = pCfg->hevcCfg.gopParam.tidQp1;
  905. param->gopParam.tidQp2 = pCfg->hevcCfg.gopParam.tidQp2;
  906. param->gopParam.tidPeriod0 = pCfg->hevcCfg.gopParam.tidPeriod0;
  907. /* for CMD_ENC_CUSTOM_GOP_PARAM */
  908. param->gopParam.customGopSize = pCfg->hevcCfg.gopParam.customGopSize;
  909. param->gopParam.useDeriveLambdaWeight = pCfg->hevcCfg.gopParam.useDeriveLambdaWeight;
  910. for (i= 0; i<param->gopParam.customGopSize; i++) {
  911. param->gopParam.picParam[i].picType = pCfg->hevcCfg.gopParam.picParam[i].picType;
  912. param->gopParam.picParam[i].pocOffset = pCfg->hevcCfg.gopParam.picParam[i].pocOffset;
  913. param->gopParam.picParam[i].picQp = pCfg->hevcCfg.gopParam.picParam[i].picQp;
  914. param->gopParam.picParam[i].refPocL0 = pCfg->hevcCfg.gopParam.picParam[i].refPocL0;
  915. param->gopParam.picParam[i].refPocL1 = pCfg->hevcCfg.gopParam.picParam[i].refPocL1;
  916. param->gopParam.picParam[i].temporalId = pCfg->hevcCfg.gopParam.picParam[i].temporalId;
  917. param->gopParam.gopPicLambda[i] = pCfg->hevcCfg.gopParam.gopPicLambda[i];
  918. }
  919. param->ctuOptParam.roiEnable = pCfg->hevcCfg.ctuOptParam.roiEnable;
  920. param->ctuOptParam.ctuQpEnable = pCfg->hevcCfg.ctuOptParam.ctuQpEnable;
  921. // VPS & VUI
  922. param->numUnitsInTick = pCfg->hevcCfg.numUnitsInTick;
  923. param->timeScale = pCfg->hevcCfg.timeScale;
  924. param->numTicksPocDiffOne = pCfg->hevcCfg.numTicksPocDiffOne;
  925. if(pCfg->hevcCfg.frameRate) {
  926. param->numUnitsInTick = 1000;
  927. param->timeScale = (pCfg->hevcCfg.frameRate)*1000;
  928. }
  929. param->vuiParam.vuiParamFlags = pCfg->hevcCfg.vuiParam.vuiParamFlags;
  930. param->vuiParam.vuiAspectRatioIdc = pCfg->hevcCfg.vuiParam.vuiAspectRatioIdc;
  931. param->vuiParam.vuiSarSize = pCfg->hevcCfg.vuiParam.vuiSarSize;
  932. param->vuiParam.vuiOverScanAppropriate = pCfg->hevcCfg.vuiParam.vuiOverScanAppropriate;
  933. param->vuiParam.videoSignal = pCfg->hevcCfg.vuiParam.videoSignal;
  934. param->vuiParam.vuiChromaSampleLoc = pCfg->hevcCfg.vuiParam.vuiChromaSampleLoc;
  935. param->vuiParam.vuiDispWinLeftRight = pCfg->hevcCfg.vuiParam.vuiDispWinLeftRight;
  936. param->vuiParam.vuiDispWinTopBottom = pCfg->hevcCfg.vuiParam.vuiDispWinTopBottom;
  937. pEncOP->encodeVuiRbsp = pCfg->hevcCfg.vuiDataEnable;
  938. pEncOP->vuiRbspDataSize = pCfg->hevcCfg.vuiDataSize;
  939. pEncOP->encodeHrdRbspInVPS = pCfg->hevcCfg.hrdInVPS;
  940. pEncOP->hrdRbspDataSize = pCfg->hevcCfg.hrdDataSize;
  941. pEncOP->encodeHrdRbspInVUI = pCfg->hevcCfg.hrdInVUI;
  942. param->chromaCbQpOffset = pCfg->hevcCfg.chromaCbQpOffset;
  943. param->chromaCrQpOffset = pCfg->hevcCfg.chromaCrQpOffset;
  944. param->initialRcQp = pCfg->hevcCfg.initialRcQp;
  945. param->nrYEnable = pCfg->hevcCfg.nrYEnable;
  946. param->nrCbEnable = pCfg->hevcCfg.nrCbEnable;
  947. param->nrCrEnable = pCfg->hevcCfg.nrCrEnable;
  948. param->nrNoiseEstEnable = pCfg->hevcCfg.nrNoiseEstEnable;
  949. param->nrNoiseSigmaY = pCfg->hevcCfg.nrNoiseSigmaY;
  950. param->nrNoiseSigmaCb = pCfg->hevcCfg.nrNoiseSigmaCb;
  951. param->nrNoiseSigmaCr = pCfg->hevcCfg.nrNoiseSigmaCr;
  952. param->nrIntraWeightY = pCfg->hevcCfg.nrIntraWeightY;
  953. param->nrIntraWeightCb = pCfg->hevcCfg.nrIntraWeightCb;
  954. param->nrIntraWeightCr = pCfg->hevcCfg.nrIntraWeightCr;
  955. param->nrInterWeightY = pCfg->hevcCfg.nrInterWeightY;
  956. param->nrInterWeightCb = pCfg->hevcCfg.nrInterWeightCb;
  957. param->nrInterWeightCr = pCfg->hevcCfg.nrInterWeightCr;
  958. param->intraMinQp = pCfg->hevcCfg.intraMinQp;
  959. param->intraMaxQp = pCfg->hevcCfg.intraMaxQp;
  960. return 1;
  961. }
  962. int setCoda9EncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, ENC_CFG *pCfg)
  963. {
  964. Int32 bitFormat;
  965. Int32 srcWidth;
  966. Int32 srcHeight;
  967. Int32 outputNum;
  968. bitFormat = pEncOP->bitstreamFormat;
  969. srcWidth = (pEncConfig->picWidth > 0) ? pEncConfig->picWidth : pCfg->PicX;
  970. srcHeight = (pEncConfig->picHeight > 0) ? pEncConfig->picHeight : pCfg->PicY;
  971. outputNum = (pEncConfig->outNum > 0) ? pEncConfig->outNum : pCfg->NumFrame;
  972. pEncConfig->outNum = outputNum;
  973. osal_memcpy(pEncConfig->skipPicNums, pCfg->skipPicNums, sizeof(pCfg->skipPicNums));
  974. pEncOP->picWidth = srcWidth;
  975. pEncOP->picHeight = srcHeight;
  976. pEncOP->frameRateInfo = pCfg->FrameRate;
  977. pEncOP->bitRate = pCfg->RcBitRate;
  978. pEncOP->rcInitDelay = pCfg->RcInitDelay;
  979. pEncOP->vbvBufferSize = pCfg->RcBufSize;
  980. pEncOP->frameSkipDisable = pCfg->frameSkipDisable; // for compare with C-model ( C-model = only 1 )
  981. pEncOP->meBlkMode = pCfg->MeBlkModeEnable; // for compare with C-model ( C-model = only 0 )
  982. pEncOP->gopSize = pCfg->GopPicNum;
  983. pEncOP->idrInterval = pCfg->IDRInterval;
  984. pEncOP->sliceMode.sliceMode = pCfg->SliceMode;
  985. pEncOP->sliceMode.sliceSizeMode = pCfg->SliceSizeMode;
  986. pEncOP->sliceMode.sliceSize = pCfg->SliceSizeNum;
  987. pEncOP->intraRefreshNum = pCfg->IntraRefreshNum;
  988. pEncOP->ConscIntraRefreshEnable = pCfg->ConscIntraRefreshEnable;
  989. pEncOP->rcIntraQp = pCfg->RCIntraQP;
  990. pEncOP->intraCostWeight = pCfg->intraCostWeight;
  991. pEncOP->MESearchRange = pCfg->SearchRange;
  992. pEncOP->rcEnable = pCfg->RcEnable;
  993. if (!pCfg->RcEnable)
  994. pEncOP->bitRate = 0;
  995. if (!pCfg->GammaSetEnable)
  996. pEncOP->userGamma = -1;
  997. else
  998. pEncOP->userGamma = pCfg->Gamma;
  999. pEncOP->MEUseZeroPmv = pCfg->MeUseZeroPmv;
  1000. /* It was agreed that the statements below would be used. but Cmodel at r25518 is not changed yet according to the statements below
  1001. if (bitFormat == STD_MPEG4)
  1002. pEncOP->MEUseZeroPmv = 1;
  1003. else
  1004. pEncOP->MEUseZeroPmv = 0;
  1005. */
  1006. // MP4 263 Only
  1007. if (!pCfg->ConstantIntraQPEnable)
  1008. pEncOP->rcIntraQp = -1;
  1009. if (pCfg->MaxQpSetEnable)
  1010. pEncOP->userQpMax = pCfg->MaxQp;
  1011. else
  1012. pEncOP->userQpMax = -1;
  1013. // H.264 Only
  1014. if (bitFormat == STD_AVC)
  1015. {
  1016. if(pCfg->MinQpSetEnable)
  1017. pEncOP->userQpMin = pCfg->MinQp;
  1018. else
  1019. pEncOP->userQpMin = 12;
  1020. if (pCfg->MaxQpSetEnable)
  1021. pEncOP->userQpMax = pCfg->MaxQp;
  1022. else
  1023. pEncOP->userQpMax = 51;
  1024. if(pCfg->MaxDeltaQpSetEnable)
  1025. pEncOP->userMaxDeltaQp = pCfg->MaxDeltaQp;
  1026. else
  1027. pEncOP->userMaxDeltaQp = -1;
  1028. if(pCfg->MinDeltaQpSetEnable)
  1029. pEncOP->userMinDeltaQp = pCfg->MinDeltaQp;
  1030. else
  1031. pEncOP->userMinDeltaQp = -1;
  1032. }
  1033. pEncOP->rcIntervalMode = pCfg->rcIntervalMode; // 0:normal, 1:frame_level, 2:slice_level, 3: user defined Mb_level
  1034. pEncOP->mbInterval = pCfg->RcMBInterval; // FIXME
  1035. // Standard specific
  1036. if( bitFormat == STD_MPEG4 ) {
  1037. pEncOP->EncStdParam.mp4Param.mp4DataPartitionEnable = pCfg->DataPartEn;
  1038. pEncOP->EncStdParam.mp4Param.mp4ReversibleVlcEnable = pCfg->RevVlcEn;
  1039. pEncOP->EncStdParam.mp4Param.mp4IntraDcVlcThr = pCfg->IntraDcVlcThr;
  1040. pEncOP->EncStdParam.mp4Param.mp4HecEnable = pCfg->HecEnable;
  1041. pEncOP->EncStdParam.mp4Param.mp4Verid = pCfg->VerId;
  1042. }
  1043. else if( bitFormat == STD_H263 ) {
  1044. pEncOP->EncStdParam.h263Param.h263AnnexIEnable = pCfg->AnnexI;
  1045. pEncOP->EncStdParam.h263Param.h263AnnexJEnable = pCfg->AnnexJ;
  1046. pEncOP->EncStdParam.h263Param.h263AnnexKEnable = pCfg->AnnexK;
  1047. pEncOP->EncStdParam.h263Param.h263AnnexTEnable = pCfg->AnnexT;
  1048. }
  1049. else if( bitFormat == STD_AVC ) {
  1050. pEncOP->EncStdParam.avcParam.constrainedIntraPredFlag = pCfg->ConstIntraPredFlag;
  1051. pEncOP->EncStdParam.avcParam.disableDeblk = pCfg->DisableDeblk;
  1052. pEncOP->EncStdParam.avcParam.deblkFilterOffsetAlpha = pCfg->DeblkOffsetA;
  1053. pEncOP->EncStdParam.avcParam.deblkFilterOffsetBeta = pCfg->DeblkOffsetB;
  1054. pEncOP->EncStdParam.avcParam.chromaQpOffset = pCfg->ChromaQpOffset;
  1055. pEncOP->EncStdParam.avcParam.audEnable = pCfg->aud_en;
  1056. pEncOP->EncStdParam.avcParam.frameCroppingFlag = pCfg->frameCroppingFlag;
  1057. pEncOP->EncStdParam.avcParam.frameCropLeft = pCfg->frameCropLeft;
  1058. pEncOP->EncStdParam.avcParam.frameCropRight = pCfg->frameCropRight;
  1059. pEncOP->EncStdParam.avcParam.frameCropTop = pCfg->frameCropTop;
  1060. pEncOP->EncStdParam.avcParam.frameCropBottom = pCfg->frameCropBottom;
  1061. pEncOP->EncStdParam.avcParam.level = pCfg->level;
  1062. // Update cropping information : Usage example for H.264 frame_cropping_flag
  1063. if (pEncOP->picHeight == 1080)
  1064. {
  1065. // In case of AVC encoder, when we want to use unaligned display width(For example, 1080),
  1066. // frameCroppingFlag parameters should be adjusted to displayable rectangle
  1067. if (pEncConfig->rotAngle != 90 && pEncConfig->rotAngle != 270) // except rotation
  1068. {
  1069. if (pEncOP->EncStdParam.avcParam.frameCroppingFlag == 0)
  1070. {
  1071. pEncOP->EncStdParam.avcParam.frameCroppingFlag = 1;
  1072. // frameCropBottomOffset = picHeight(MB-aligned) - displayable rectangle height
  1073. pEncOP->EncStdParam.avcParam.frameCropBottom = 8;
  1074. }
  1075. }
  1076. }
  1077. }
  1078. else {
  1079. VLOG(ERR, "Invalid codec standard mode \n" );
  1080. return 0;
  1081. }
  1082. return 1;
  1083. }
  1084. #if 0
  1085. void changeRcParaTest(Uint32 core_idx, EncHandle handle,
  1086. osal_file_t bsFp,
  1087. EncParam *pEncParam,
  1088. EncHeaderParam *pEncHeaderParam,
  1089. TestEncConfig *pEncConfig,
  1090. EncOpenParam *pEncOP)
  1091. {
  1092. int optionNum;
  1093. while(1)
  1094. {
  1095. printf("\n 0: GOP number change\n");
  1096. printf(" 1: Intra Qp change\n");
  1097. printf(" 2: Bit Rate change\n");
  1098. printf(" 3: Frame Rate change\n");
  1099. printf(" 4: Intra Refresh Number change\n");
  1100. printf(" 5: Slice Mode change\n");
  1101. if(pEncOP->bitstreamFormat == STD_MPEG4)
  1102. {
  1103. printf(" 6: HEC Mode change\n");
  1104. }
  1105. printf(" 9: go encoding\n");
  1106. scanf("%d", &optionNum);
  1107. switch(optionNum){
  1108. case 0:
  1109. {
  1110. int newGopNum=0;
  1111. printf("\n New Gop Number=");
  1112. scanf("%d", &newGopNum);
  1113. VPU_EncGiveCommand(handle, ENC_SET_GOP_NUMBER, &newGopNum);
  1114. }
  1115. break;
  1116. case 1:
  1117. {
  1118. int newIntraQp=0;
  1119. printf("\n New Intra Qp value=");
  1120. scanf("%d", &newIntraQp);
  1121. VPU_EncGiveCommand(handle, ENC_SET_INTRA_QP, &newIntraQp);
  1122. }
  1123. break;
  1124. case 2:
  1125. {
  1126. int newBitrate=0;
  1127. printf("\n New Bit Rate=");
  1128. scanf("%d", &newBitrate);
  1129. VPU_EncGiveCommand(handle, ENC_SET_BITRATE, &newBitrate);
  1130. }
  1131. break;
  1132. case 3:
  1133. {
  1134. int newFramerate=0;
  1135. printf("\n New Frame Rate=");
  1136. scanf("%d", &newFramerate);
  1137. VPU_EncGiveCommand(handle, ENC_SET_FRAME_RATE, &newFramerate);
  1138. if( pEncOP->bitstreamFormat == STD_MPEG4 )
  1139. {
  1140. pEncHeaderParam->headerType = VOL_HEADER;
  1141. VPU_EncGiveCommand(handle, ENC_PUT_VIDEO_HEADER, pEncHeaderParam);
  1142. #ifdef SUPPORT_FFMPEG_DEMUX
  1143. if( pEncOP->ringBufferEnable == 0 && !pEncConfig->en_container )
  1144. #else
  1145. if( pEncOP->ringBufferEnable == 0 )
  1146. #endif
  1147. {
  1148. #if 0
  1149. if (!ReadBsResetBufHelper(core_idx, bsFp, pEncHeaderParam->buf, pEncHeaderParam->size, pEncOP->streamEndian))
  1150. break;
  1151. #else
  1152. BitstreamReader_Act(bsReader, core_idx, pEncHeaderParam->buf, pEncHeaderParam->size, pEncOP->streamEndian, comparator);
  1153. #endif
  1154. }
  1155. }
  1156. }
  1157. break;
  1158. case 4:
  1159. {
  1160. int newIntraRefreshNum=0;
  1161. printf("\n New Intra Refresh Number=");
  1162. scanf("%d", &newIntraRefreshNum);
  1163. VPU_EncGiveCommand(handle, ENC_SET_INTRA_MB_REFRESH_NUMBER, &newIntraRefreshNum);
  1164. }
  1165. break;
  1166. case 5:
  1167. {
  1168. EncSliceMode newSlice;
  1169. printf("\n New Slice Mode[0:one slice, 1:muliple slice]=");
  1170. scanf("%d", &newSlice.sliceMode);
  1171. if(!newSlice.sliceMode)
  1172. {
  1173. newSlice.sliceSizeMode = 0;
  1174. newSlice.sliceSize = 0;
  1175. }
  1176. else
  1177. {
  1178. printf("\n New Slice Size Mode[0:bit number, 1:mb number]=");
  1179. scanf("%d", &newSlice.sliceSizeMode);
  1180. if(!newSlice.sliceSizeMode)
  1181. {
  1182. printf("\n New Slice bit number=");
  1183. }
  1184. else
  1185. {
  1186. printf("\n New Slice MB number=");
  1187. }
  1188. scanf("%d", &newSlice.sliceSize);
  1189. }
  1190. VPU_EncGiveCommand(handle, ENC_SET_SLICE_INFO, &newSlice);
  1191. }
  1192. break;
  1193. case 6:
  1194. {
  1195. int newHecMode=0;
  1196. printf("\n New Hec Mode Enable[0:disable, 1:enable]=");
  1197. scanf("%d", &newHecMode);
  1198. if(newHecMode > 0)
  1199. {
  1200. VPU_EncGiveCommand(handle, ENC_ENABLE_HEC, &newHecMode);
  1201. }
  1202. else
  1203. {
  1204. VPU_EncGiveCommand(handle, ENC_DISABLE_HEC, &newHecMode);
  1205. }
  1206. }
  1207. break;
  1208. default:
  1209. break;
  1210. }
  1211. if(optionNum == 9)
  1212. break;
  1213. }
  1214. }
  1215. #endif
  1216. /******************************************************************************
  1217. EncOpenParam Initialization
  1218. ******************************************************************************/
  1219. /**
  1220. * To init EncOpenParam by runtime evaluation
  1221. * IN
  1222. * EncConfigParam *pEncConfig
  1223. * OUT
  1224. * EncOpenParam *pEncOP
  1225. */
  1226. Int32 GetEncOpenParamDefault(EncOpenParam *pEncOP, TestEncConfig *pEncConfig)
  1227. {
  1228. int bitFormat;
  1229. pEncConfig->outNum = pEncConfig->outNum == 0 ? DEFAULT_ENC_OUTPUT_NUM : pEncConfig->outNum;
  1230. bitFormat = pEncOP->bitstreamFormat;
  1231. pEncOP->picWidth = pEncConfig->picWidth;
  1232. pEncOP->picHeight = pEncConfig->picHeight;
  1233. pEncOP->frameRateInfo = 30;
  1234. pEncOP->MESearchRange = 3;
  1235. pEncOP->bitRate = pEncConfig->kbps;
  1236. pEncOP->rcInitDelay = 0;
  1237. pEncOP->vbvBufferSize = 0; // 0 = ignore
  1238. pEncOP->meBlkMode = 0; // for compare with C-model ( C-model = only 0 )
  1239. pEncOP->frameSkipDisable = 1; // for compare with C-model ( C-model = only 1 )
  1240. pEncOP->gopSize = 30; // only first picture is I
  1241. pEncOP->sliceMode.sliceMode = 1; // 1 slice per picture
  1242. pEncOP->sliceMode.sliceSizeMode = 1;
  1243. pEncOP->sliceMode.sliceSize = 115;
  1244. pEncOP->intraRefreshNum = 0;
  1245. pEncOP->rcIntraQp = -1; // disable == -1
  1246. pEncOP->userQpMax = -1; // disable == -1
  1247. pEncOP->userGamma = (Uint32)(0.75*32768); // (0*32768 < gamma < 1*32768)
  1248. pEncOP->rcIntervalMode = 1; // 0:normal, 1:frame_level, 2:slice_level, 3: user defined Mb_level
  1249. pEncOP->mbInterval = 0;
  1250. pEncConfig->picQpY = 23;
  1251. if (bitFormat == STD_MPEG4)
  1252. pEncOP->MEUseZeroPmv = 1;
  1253. else
  1254. pEncOP->MEUseZeroPmv = 0;
  1255. pEncOP->intraCostWeight = 400;
  1256. // Standard specific
  1257. if( bitFormat == STD_MPEG4 ) {
  1258. pEncOP->EncStdParam.mp4Param.mp4DataPartitionEnable = 0;
  1259. pEncOP->EncStdParam.mp4Param.mp4ReversibleVlcEnable = 0;
  1260. pEncOP->EncStdParam.mp4Param.mp4IntraDcVlcThr = 0;
  1261. pEncOP->EncStdParam.mp4Param.mp4HecEnable = 0;
  1262. pEncOP->EncStdParam.mp4Param.mp4Verid = 2;
  1263. }
  1264. else if( bitFormat == STD_H263 ) {
  1265. pEncOP->EncStdParam.h263Param.h263AnnexIEnable = 0;
  1266. pEncOP->EncStdParam.h263Param.h263AnnexJEnable = 0;
  1267. pEncOP->EncStdParam.h263Param.h263AnnexKEnable = 0;
  1268. pEncOP->EncStdParam.h263Param.h263AnnexTEnable = 0;
  1269. }
  1270. else if( bitFormat == STD_AVC ) {
  1271. pEncOP->EncStdParam.avcParam.constrainedIntraPredFlag = 0;
  1272. pEncOP->EncStdParam.avcParam.disableDeblk = 1;
  1273. pEncOP->EncStdParam.avcParam.deblkFilterOffsetAlpha = 6;
  1274. pEncOP->EncStdParam.avcParam.deblkFilterOffsetBeta = 0;
  1275. pEncOP->EncStdParam.avcParam.chromaQpOffset = 10;
  1276. pEncOP->EncStdParam.avcParam.audEnable = 0;
  1277. pEncOP->EncStdParam.avcParam.frameCroppingFlag = 0;
  1278. pEncOP->EncStdParam.avcParam.frameCropLeft = 0;
  1279. pEncOP->EncStdParam.avcParam.frameCropRight = 0;
  1280. pEncOP->EncStdParam.avcParam.frameCropTop = 0;
  1281. pEncOP->EncStdParam.avcParam.frameCropBottom = 0;
  1282. pEncOP->EncStdParam.avcParam.level = 0;
  1283. // Update cropping information : Usage example for H.264 frame_cropping_flag
  1284. if (pEncOP->picHeight == 1080)
  1285. {
  1286. // In case of AVC encoder, when we want to use unaligned display width(For example, 1080),
  1287. // frameCroppingFlag parameters should be adjusted to displayable rectangle
  1288. if (pEncConfig->rotAngle != 90 && pEncConfig->rotAngle != 270) // except rotation
  1289. {
  1290. if (pEncOP->EncStdParam.avcParam.frameCroppingFlag == 0)
  1291. {
  1292. pEncOP->EncStdParam.avcParam.frameCroppingFlag = 1;
  1293. // frameCropBottomOffset = picHeight(MB-aligned) - displayable rectangle height
  1294. pEncOP->EncStdParam.avcParam.frameCropBottom = 8;
  1295. }
  1296. }
  1297. }
  1298. }
  1299. else if( bitFormat == STD_HEVC ) {
  1300. EncHevcParam *param = &pEncOP->EncStdParam.hevcParam;
  1301. Int32 rcBitrate = pEncConfig->kbps * 1000;
  1302. Int32 i=0;
  1303. pEncOP->bitRate = rcBitrate;
  1304. param->profile = HEVC_PROFILE_MAIN;
  1305. param->level = 0;
  1306. param->tier = 0;
  1307. param->internalBitDepth = 8;
  1308. pEncOP->srcBitDepth = 8;
  1309. param->chromaFormatIdc = 0;
  1310. param->losslessEnable = 0;
  1311. param->constIntraPredFlag = 0;
  1312. param->enableAFBCD = 0;
  1313. param->useLongTerm = 0;
  1314. /* for CMD_ENC_SEQ_GOP_PARAM */
  1315. param->gopPresetIdx = PRESET_IDX_IBBBP;
  1316. /* for CMD_ENC_SEQ_INTRA_PARAM */
  1317. param->decodingRefreshType = 1;
  1318. param->intraPeriod = 28;
  1319. param->intraQP = 0;
  1320. /* for CMD_ENC_SEQ_CONF_WIN_TOP_BOT/LEFT_RIGHT */
  1321. param->confWinTop = 0;
  1322. param->confWinBot = 0;
  1323. param->confWinLeft = 0;
  1324. param->confWinRight = 0;
  1325. /* for CMD_ENC_SEQ_INDEPENDENT_SLICE */
  1326. param->independSliceMode = 0;
  1327. param->independSliceModeArg = 0;
  1328. /* for CMD_ENC_SEQ_DEPENDENT_SLICE */
  1329. param->dependSliceMode = 0;
  1330. param->dependSliceModeArg = 0;
  1331. /* for CMD_ENC_SEQ_INTRA_REFRESH_PARAM */
  1332. param->intraRefreshMode = 0;
  1333. param->intraRefreshArg = 0;
  1334. param->useRecommendEncParam = 1;
  1335. pEncConfig->seiDataEnc.prefixSeiNalEnable = 0;
  1336. pEncConfig->seiDataEnc.suffixSeiNalEnable = 0;
  1337. pEncOP->encodeHrdRbspInVPS = 0;
  1338. pEncOP->encodeHrdRbspInVUI = 0;
  1339. pEncOP->encodeVuiRbsp = 0;
  1340. pEncConfig->roi_enable = 0;
  1341. pEncConfig->ctu_qp_enable = 0;
  1342. /* for CMD_ENC_PARAM */
  1343. if (param->useRecommendEncParam != 1) { // 0 : Custom, 2 : Boost mode (normal encoding speed, normal picture quality), 3 : Fast mode (high encoding speed, low picture quality)
  1344. param->scalingListEnable = 0;
  1345. param->cuSizeMode = 0x7;
  1346. param->tmvpEnable = 1;
  1347. param->wppEnable = 0;
  1348. param->maxNumMerge = 2;
  1349. param->dynamicMerge8x8Enable = 1;
  1350. param->dynamicMerge16x16Enable = 1;
  1351. param->dynamicMerge32x32Enable = 1;
  1352. param->disableDeblk = 0;
  1353. param->lfCrossSliceBoundaryEnable = 1;
  1354. param->betaOffsetDiv2 = 0;
  1355. param->tcOffsetDiv2 = 0;
  1356. param->skipIntraTrans = 1;
  1357. param->saoEnable = 1;
  1358. param->intraInInterSliceEnable = 1;
  1359. param->intraNxNEnable = 1;
  1360. }
  1361. /* for CMD_ENC_RC_PARAM */
  1362. pEncOP->rcEnable = rcBitrate == 0 ? FALSE : TRUE;
  1363. pEncOP->initialDelay = 3000;
  1364. param->ctuOptParam.roiEnable = 0;
  1365. param->ctuOptParam.roiDeltaQp = 3;
  1366. param->ctuOptParam.ctuQpEnable = 0;
  1367. param->intraQpOffset = 0;
  1368. param->initBufLevelx8 = 1;
  1369. param->bitAllocMode = 0;
  1370. for (i = 0; i < MAX_GOP_NUM; i++) {
  1371. param->fixedBitRatio[i] = 1;
  1372. }
  1373. param->cuLevelRCEnable = 0;
  1374. param->hvsQPEnable = 1;
  1375. param->hvsQpScale = 2;
  1376. param->hvsQpScaleEnable = (param->hvsQpScale > 0) ? 1: 0;
  1377. /* for CMD_ENC_RC_MIN_MAX_QP */
  1378. param->minQp = 8;
  1379. param->maxQp = 51;
  1380. param->maxDeltaQp = 10;
  1381. param->minQpI = 8;
  1382. param->maxQpI = 51;
  1383. param->minQpP = 8;
  1384. param->maxQpP = 51;
  1385. param->minQpB = 8;
  1386. param->maxQpB = 51;
  1387. param->hvsMaxDeltaQp = 10;
  1388. param->gopParam.enTemporalLayerQp = 0;
  1389. param->gopParam.tidQp0 = 30;
  1390. param->gopParam.tidQp1 = 33;
  1391. param->gopParam.tidQp2 = 36;
  1392. param->gopParam.tidPeriod0 = 60;
  1393. /* for CMD_ENC_CUSTOM_GOP_PARAM */
  1394. param->gopParam.customGopSize = 0;
  1395. param->gopParam.useDeriveLambdaWeight = 0;
  1396. for (i= 0; i<param->gopParam.customGopSize; i++) {
  1397. param->gopParam.picParam[i].picType = PIC_TYPE_I;
  1398. param->gopParam.picParam[i].pocOffset = 1;
  1399. param->gopParam.picParam[i].picQp = 30;
  1400. param->gopParam.picParam[i].refPocL0 = 0;
  1401. param->gopParam.picParam[i].refPocL1 = 0;
  1402. param->gopParam.picParam[i].temporalId = 0;
  1403. param->gopParam.gopPicLambda[i] = 0;
  1404. }
  1405. param->transRate = 0;
  1406. // for VUI / time information.
  1407. param->numTicksPocDiffOne = 0;
  1408. param->timeScale = pEncOP->frameRateInfo * 1000;
  1409. param->numUnitsInTick = 1000;
  1410. param->vuiParam.vuiParamFlags = 0; // when vuiParamFlags == 0, VPU doesn't encode VUI
  1411. param->chromaCbQpOffset = 0;
  1412. param->chromaCrQpOffset = 0;
  1413. param->initialRcQp = 63; // 63 is meaningless.
  1414. param->nrYEnable = 0;
  1415. param->nrCbEnable = 0;
  1416. param->nrCrEnable = 0;
  1417. param->nrNoiseEstEnable = 0;
  1418. param->intraMinQp = 8;
  1419. param->intraMaxQp = 51;
  1420. param->rcWeightParam = 2;
  1421. param->rcWeightBuf = 128;
  1422. // for H.264 encoder
  1423. param->avcIdrPeriod = 0;
  1424. param->rdoSkip = 1;
  1425. param->lambdaScalingEnable = 1;
  1426. param->transform8x8Enable = 1;
  1427. param->avcSliceMode = 0;
  1428. param->avcSliceArg = 0;
  1429. param->intraMbRefreshMode = 0;
  1430. param->intraMbRefreshArg = 1;
  1431. param->mbLevelRcEnable = 0;
  1432. param->entropyCodingMode = 1;
  1433. if (bitFormat == STD_AVC)
  1434. param->disableDeblk = 2;
  1435. }
  1436. else {
  1437. VLOG(ERR, "Invalid codec standard mode: codec index(%d) \n", bitFormat);
  1438. return 0;
  1439. }
  1440. return 1;
  1441. }
  1442. /**
  1443. * To init EncOpenParam by CFG file
  1444. * IN
  1445. * EncConfigParam *pEncConfig
  1446. * OUT
  1447. * EncOpenParam *pEncOP
  1448. * char *srcYuvFileName
  1449. */
  1450. Int32 GetEncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, ENC_CFG *pEncCfg)
  1451. {
  1452. int bitFormat;
  1453. ENC_CFG encCfgInst;
  1454. ENC_CFG *pCfg;
  1455. char yuvDir[128] = "yuv/";
  1456. // Source YUV Image File to load
  1457. if (pEncCfg) {
  1458. pCfg = pEncCfg;
  1459. }
  1460. else {
  1461. osal_memset( &encCfgInst, 0x00, sizeof(ENC_CFG));
  1462. pCfg = &encCfgInst;
  1463. }
  1464. bitFormat = pEncOP->bitstreamFormat;
  1465. switch(bitFormat) {
  1466. case STD_AVC:
  1467. if (parseAvcCfgFile(pCfg, pEncConfig->cfgFileName) == 0)
  1468. return 0;
  1469. pEncConfig->picQpY = pCfg->PicQpY;
  1470. if (pEncCfg)
  1471. strcpy(pEncConfig->yuvFileName, pCfg->SrcFileName);
  1472. else
  1473. sprintf(pEncConfig->yuvFileName, "%s%s", yuvDir, pCfg->SrcFileName);
  1474. #ifdef SUPPORT_980_RC_LIB
  1475. if(pEncOP->EncStdParam.avcParam.svcExtension == TRUE)
  1476. {
  1477. if(pCfg->RcEnable != 0)
  1478. pCfg->RcEnable = 4; // Other modes are not supported.
  1479. if(pCfg->field_flag == 1) // Field is not supported
  1480. return 0;
  1481. }
  1482. if (pCfg->coda9RoiEnable) {
  1483. strcpy(pEncConfig->roi_file_name, pCfg->RoiFile);
  1484. }
  1485. #endif
  1486. break;
  1487. case STD_MPEG4:
  1488. case STD_H263:
  1489. if (parseMp4CfgFile(pCfg, pEncConfig->cfgFileName) == 0)
  1490. return 0;
  1491. pEncConfig->picQpY = pCfg->VopQuant;
  1492. if (pEncCfg)
  1493. strcpy(pEncConfig->yuvFileName, pCfg->SrcFileName);
  1494. else
  1495. sprintf(pEncConfig->yuvFileName, "%s%s", yuvDir, pCfg->SrcFileName);
  1496. if (pCfg->ShortVideoHeader == 1) {
  1497. pEncOP->bitstreamFormat = STD_H263;
  1498. bitFormat = STD_H263;
  1499. }
  1500. break;
  1501. case STD_HEVC:
  1502. if (parseHevcCfgFile(pCfg, pEncConfig->cfgFileName) == 0)
  1503. return 0;
  1504. if (pEncCfg)
  1505. strcpy(pEncConfig->yuvFileName, pCfg->SrcFileName);
  1506. else
  1507. sprintf(pEncConfig->yuvFileName, "%s%s", yuvDir, pCfg->SrcFileName);
  1508. if (pEncConfig->bitstreamFileName[0] == 0 && pCfg->BitStreamFileName[0] != 0)
  1509. sprintf(pEncConfig->bitstreamFileName, "%s", pCfg->BitStreamFileName);
  1510. if ( pEncConfig->bitstreamFileName[0] == 0 )
  1511. sprintf(pEncConfig->bitstreamFileName, "%s", "output_stream.265");
  1512. if (pCfg->hevcCfg.ctuOptParam.roiEnable)
  1513. strcpy(pEncConfig->roi_file_name, pCfg->hevcCfg.roiFileName);
  1514. pEncConfig->roi_enable = pCfg->hevcCfg.ctuOptParam.roiEnable;
  1515. pEncConfig->roi_delta_qp= pCfg->hevcCfg.ctuOptParam.roiDeltaQp;
  1516. if (pCfg->hevcCfg.prefixSeiEnable)
  1517. strcpy(pEncConfig->prefix_sei_nal_file_name, pCfg->hevcCfg.prefixSeiDataFileName);
  1518. if (pCfg->hevcCfg.suffixSeiEnable)
  1519. strcpy(pEncConfig->suffix_sei_nal_file_name, pCfg->hevcCfg.suffixSeiDataFileName);
  1520. pEncConfig->seiDataEnc.prefixSeiNalEnable = pCfg->hevcCfg.prefixSeiEnable;
  1521. pEncConfig->seiDataEnc.prefixSeiDataSize = pCfg->hevcCfg.prefixSeiDataSize;
  1522. pEncConfig->seiDataEnc.prefixSeiDataEncOrder = pCfg->hevcCfg.prefixSeiTimingFlag;
  1523. pEncConfig->seiDataEnc.suffixSeiNalEnable = pCfg->hevcCfg.suffixSeiEnable;
  1524. pEncConfig->seiDataEnc.suffixSeiDataSize = pCfg->hevcCfg.suffixSeiDataSize;
  1525. pEncConfig->seiDataEnc.suffixSeiDataEncOrder = pCfg->hevcCfg.suffixSeiTimingFlag;
  1526. if (pCfg->hevcCfg.hrdInVPS || pCfg->hevcCfg.hrdInVUI)
  1527. strcpy(pEncConfig->hrd_rbsp_file_name, pCfg->hevcCfg.hrdDataFileName);
  1528. if (pCfg->hevcCfg.vuiDataEnable)
  1529. strcpy(pEncConfig->vui_rbsp_file_name, pCfg->hevcCfg.vuiDataFileName);
  1530. if (pCfg->hevcCfg.ctuOptParam.ctuQpEnable)
  1531. strcpy(pEncConfig->ctuqp_file_name, pCfg->hevcCfg.ctuQpFileName);
  1532. pEncConfig->ctu_qp_enable = pCfg->hevcCfg.ctuOptParam.ctuQpEnable;
  1533. pEncConfig->encAUD = pCfg->hevcCfg.encAUD;
  1534. pEncConfig->encEOS = pCfg->hevcCfg.encEOS;
  1535. pEncConfig->encEOB = pCfg->hevcCfg.encEOB;
  1536. pEncConfig->useAsLongtermPeriod = pCfg->hevcCfg.useAsLongtermPeriod;
  1537. pEncConfig->refLongtermPeriod = pCfg->hevcCfg.refLongtermPeriod;
  1538. break;
  1539. default :
  1540. break;
  1541. }
  1542. if (bitFormat == STD_HEVC) {
  1543. if (setWaveEncOpenParam(pEncOP, pEncConfig, pCfg) == 0)
  1544. return 0;
  1545. }
  1546. else {
  1547. if (setCoda9EncOpenParam(pEncOP, pEncConfig, pCfg) == 0)
  1548. return 0;
  1549. }
  1550. return 1;
  1551. }
  1552. int ReadBsResetBufHelper(Uint32 core_idx,
  1553. osal_file_t streamFp,
  1554. PhysicalAddress bitstream,
  1555. int size,
  1556. int endian)
  1557. {
  1558. unsigned char *buf = osal_malloc(size);
  1559. if (!buf)
  1560. {
  1561. VLOG(ERR, "fail to allocate bitstream buffer\n" );
  1562. return 0;
  1563. }
  1564. vdi_read_memory(core_idx, bitstream, buf, size, endian);
  1565. osal_fwrite((void *)buf, sizeof(Uint8), size, streamFp);
  1566. osal_fflush(streamFp);
  1567. osal_free(buf);
  1568. return 1;
  1569. }
  1570. /*
  1571. * To be compatible with Ref-SW 4.0
  1572. */
  1573. frame_queue_item_t* frame_queue_init(
  1574. Int32 count
  1575. )
  1576. {
  1577. frame_queue_item_t* queue = NULL;
  1578. queue = (frame_queue_item_t *)osal_malloc(sizeof(frame_queue_item_t));
  1579. if (!queue) {
  1580. return NULL;
  1581. }
  1582. queue->size = count;
  1583. queue->count = 0;
  1584. queue->front = 0;
  1585. queue->rear = 0;
  1586. queue->buffer = (DecOutputInfo*)osal_malloc(count*sizeof(DecOutputInfo));
  1587. return queue;
  1588. }
  1589. void frame_queue_deinit(
  1590. frame_queue_item_t* queue
  1591. )
  1592. {
  1593. if (queue == NULL) {
  1594. return;
  1595. }
  1596. if (queue->buffer) {
  1597. osal_free(queue->buffer);
  1598. }
  1599. osal_free(queue);
  1600. }
  1601. /*
  1602. * Return 0 on success.
  1603. * -1 on failure
  1604. */
  1605. Int32 frame_queue_enqueue(
  1606. frame_queue_item_t* queue,
  1607. DecOutputInfo data
  1608. )
  1609. {
  1610. if (queue == NULL) {
  1611. return -1;
  1612. }
  1613. /* Queue is full */
  1614. if (queue->count == queue->size) {
  1615. return -1;
  1616. }
  1617. queue->buffer[queue->rear++] = data;
  1618. queue->rear %= queue->size;
  1619. queue->count++;
  1620. return 0;
  1621. }
  1622. /*
  1623. * Return 0 on success.
  1624. * -1 on failure
  1625. */
  1626. Int32 frame_queue_dequeue(
  1627. frame_queue_item_t* queue,
  1628. DecOutputInfo* data
  1629. )
  1630. {
  1631. if (queue == NULL) {
  1632. return -1;
  1633. }
  1634. /* Queue is empty */
  1635. if (queue->count == 0) {
  1636. return -1;
  1637. }
  1638. *data = queue->buffer[queue->front++];
  1639. queue->front %= queue->size;
  1640. queue->count--;
  1641. return 0;
  1642. }
  1643. Int32 frame_queue_dequeue_all(
  1644. frame_queue_item_t* queue
  1645. )
  1646. {
  1647. Int32 ret;
  1648. DecOutputInfo data;
  1649. if (queue == NULL) {
  1650. return -1;
  1651. }
  1652. do {
  1653. ret = frame_queue_dequeue(queue, &data);
  1654. if (ret >=0) {
  1655. VLOG(INFO, "Empty display Queue for flush display_index=%d\n", data.indexFrameDisplay);
  1656. }
  1657. } while (ret >= 0);
  1658. return 0;
  1659. }
  1660. Int32 frame_queue_peekqueue(
  1661. frame_queue_item_t* queue,
  1662. DecOutputInfo* data
  1663. )
  1664. {
  1665. if (queue == NULL) {
  1666. return -1;
  1667. }
  1668. /* Queue is empty */
  1669. if (queue->count == 0) {
  1670. return -1;
  1671. }
  1672. *data = queue->buffer[queue->front];
  1673. return 0;
  1674. }
  1675. Int32 frame_queue_check_in_queue(
  1676. frame_queue_item_t* queue,
  1677. Int32 index
  1678. )
  1679. {
  1680. DecOutputInfo data;
  1681. Int32 front;
  1682. Int32 count;
  1683. if (queue == NULL) {
  1684. return -1;
  1685. }
  1686. front = queue->front;
  1687. count = queue->count;
  1688. while(count > 0) {
  1689. data = queue->buffer[front++];
  1690. if (data.indexFrameDisplay == index) {
  1691. return 1;
  1692. }
  1693. count--;
  1694. front %= queue->size;
  1695. }
  1696. return 0;
  1697. }
  1698. Int32 frame_queue_count(
  1699. frame_queue_item_t* queue
  1700. )
  1701. {
  1702. if (queue == NULL) {
  1703. return -1;
  1704. }
  1705. return queue->count;
  1706. }
  1707. #ifdef SUPPORT_980_RC_LIB
  1708. #define AVC_ENC_NUT_SLICE 1
  1709. #define AVC_ENC_NUT_IDR 5
  1710. static frm_t *get_current_frame(
  1711. EncInfo *seq)
  1712. {
  1713. int i;
  1714. frm_t *curr_frm = NULL;
  1715. if (seq->openParam.gopSize== 1) //all intra
  1716. {
  1717. curr_frm = &seq->frm[0];
  1718. seq->prev_idx = 0;
  1719. }
  1720. else
  1721. {
  1722. for (i = 0; i < seq->num_total_frames; i++)
  1723. {
  1724. if (seq->frm[i].used_for_ref == 0)
  1725. {
  1726. curr_frm = &seq->frm[i];
  1727. seq->prev_idx = i;
  1728. break;
  1729. }
  1730. }
  1731. }
  1732. return curr_frm;
  1733. }
  1734. static void set_mmco(
  1735. EncInfo *seq)
  1736. {
  1737. int frmidx;
  1738. int next_idx = (seq->enc_idx_modulo == seq->gop_size - 1) ? 0 : seq->enc_idx_modulo + 1;
  1739. rps_t *next_rps = &seq->rps[next_idx];
  1740. int curr_gop_poc = seq->curr_frm->poc - seq->gop_entry[seq->enc_idx_modulo].curr_poc;
  1741. int next_gop_poc = curr_gop_poc + ((next_idx == 0) ? seq->gop_size : 0);
  1742. //mmco1 : set short-term as non-ref
  1743. seq->num_mmco1 = 0;
  1744. for (frmidx = 0; frmidx < seq->num_total_frames; frmidx++)
  1745. {
  1746. frm_t *frm = &seq->frm[frmidx];
  1747. if (frm->used_for_ref && (frm != seq->curr_frm) && (frmidx != seq->longterm_frmidx) )
  1748. {
  1749. int i;
  1750. int found = 0;
  1751. //check if the ref-frame is in next rps
  1752. for (i = 0; i < next_rps->num_poc; i++)
  1753. if (frm->poc == next_gop_poc + next_rps->poc[i])
  1754. found = 1;
  1755. if (!found)
  1756. {
  1757. seq->mmco1_frmidx[seq->num_mmco1++] = frmidx;
  1758. }
  1759. }
  1760. }
  1761. }
  1762. static int search_ref_frame(
  1763. EncInfo *seq,
  1764. int poc)
  1765. {
  1766. int i;
  1767. for (i = 0; i < 31; i++)
  1768. if (seq->frm[i].used_for_ref && seq->frm[i].poc == poc)
  1769. return i;
  1770. return -1;
  1771. }
  1772. static void set_refpic_list(
  1773. EncInfo *seq,
  1774. int ref_long_term)
  1775. {
  1776. int ref, list;
  1777. int num_ref, num_list;
  1778. int enc_idx;
  1779. int gop_poc;
  1780. enc_idx = seq->enc_idx_modulo;
  1781. gop_poc = seq->curr_frm->poc - seq->gop_entry[enc_idx].curr_poc;
  1782. seq->num_ref_idx = 0;
  1783. seq->ref_pic_list =0;
  1784. //fill ref_list
  1785. num_ref = 1;//(seq->curr_frm->slice_type == AVC_ENC_SLICE_TYPE_B || seq->gop_entry[enc_idx].use_multi_ref_p) ? 2 : 1;
  1786. for (ref = 0; ref < num_ref; ref++)
  1787. {
  1788. int frmidx;
  1789. int poc = gop_poc + seq->gop_entry[enc_idx].ref_poc;
  1790. if (ref_long_term && (ref == num_ref - 1) && (seq->longterm_frmidx >= 0)) //long-term
  1791. frmidx = seq->longterm_frmidx;
  1792. else
  1793. frmidx = search_ref_frame(seq, poc);
  1794. if (frmidx != -1)
  1795. {
  1796. seq->ref_pic_list = frmidx;
  1797. seq->num_ref_idx++;
  1798. }
  1799. }
  1800. //when num_ref_idx is 0, fill ref_list with rps
  1801. num_list = 1;
  1802. for (list = 0; list < num_list; list++)
  1803. {
  1804. if (seq->num_ref_idx == 0)
  1805. {
  1806. int i;
  1807. rps_t *rps = &seq->rps[enc_idx];
  1808. for (i = 0; i < rps->num_poc; i++)
  1809. {
  1810. int poc = gop_poc + rps->poc[i];
  1811. int frmidx = search_ref_frame(seq, poc);
  1812. if (frmidx != -1)
  1813. {
  1814. seq->ref_pic_list = frmidx;
  1815. seq->num_ref_idx++;
  1816. break;
  1817. }
  1818. }
  1819. }
  1820. }
  1821. }
  1822. static int get_nal_ref_idc(
  1823. EncInfo *seq,
  1824. int enc_idx)
  1825. {
  1826. if (seq->idr_picture)
  1827. return 3;
  1828. else if (seq->gop_entry[enc_idx].curr_poc == seq->gop_size) //anchor
  1829. return 2;
  1830. else if (seq->curr_frm->used_for_ref)
  1831. return 1;
  1832. else
  1833. return 0;
  1834. }
  1835. #define AVC_ENC_NUT_SLICE 1
  1836. #define AVC_ENC_NUT_IDR 5
  1837. void dpb_pic_init( EncInfo *pAvcInfo )
  1838. {
  1839. int encode_frame;
  1840. int enc_idx;// = pAvcInfo->enc_idx_modulo;
  1841. int i;
  1842. int gop_num = pAvcInfo->openParam.gopSize;
  1843. encode_frame = pAvcInfo->encoded_frames_in_gop;
  1844. enc_idx = pAvcInfo->enc_idx_modulo;
  1845. if (gop_num == 1) // All I
  1846. encode_frame = 0;
  1847. else
  1848. {
  1849. if (encode_frame >= gop_num && gop_num != 0) // I frame
  1850. encode_frame = 0;
  1851. }
  1852. pAvcInfo->idr_picture = 0;
  1853. if(pAvcInfo->frm_cnt == 0)
  1854. {
  1855. pAvcInfo->Idr_cnt = 0;
  1856. pAvcInfo->idr_picture = 1;
  1857. }
  1858. else
  1859. {
  1860. if((pAvcInfo->openParam.idrInterval) > 0 && (pAvcInfo->openParam.gopSize > 0))
  1861. {
  1862. if(encode_frame == 0)
  1863. {
  1864. pAvcInfo->Idr_cnt++;
  1865. }
  1866. if(pAvcInfo->openParam.idrInterval == pAvcInfo->Idr_cnt)
  1867. {
  1868. pAvcInfo->frm_cnt = 0;
  1869. pAvcInfo->Idr_cnt = 0;
  1870. pAvcInfo->idr_picture = 1;
  1871. }
  1872. }
  1873. }
  1874. if (pAvcInfo->idr_picture)
  1875. pAvcInfo->Idr_picId = (pAvcInfo->Idr_picId + 1) & 0xFFFF; // Idr_pic_id: 0 ~ 65535
  1876. pAvcInfo->slice_type = (encode_frame == 0) ? 0 : 1;
  1877. if(pAvcInfo->enc_long_term_cnt > 0)
  1878. {
  1879. if(pAvcInfo->enc_long_term_cnt == pAvcInfo->long_term_period)
  1880. pAvcInfo->enc_long_term_cnt = 0;
  1881. }
  1882. if(pAvcInfo->enc_long_term_cnt == 0 && pAvcInfo->long_term_period != -1 )
  1883. pAvcInfo->curr_long_term = 1;// enc_long_term_cnt % pAvcInfo->long_term_period;
  1884. else
  1885. pAvcInfo->curr_long_term = 0;
  1886. pAvcInfo->ref_long_term = pAvcInfo->curr_long_term || pAvcInfo->gop_entry[pAvcInfo->enc_idx_modulo].ref_long_term;
  1887. if(pAvcInfo->enc_idx_modulo >=0)
  1888. pAvcInfo->src_idx = pAvcInfo->enc_idx_gop + pAvcInfo->gop_entry[pAvcInfo->enc_idx_modulo].curr_poc;
  1889. else
  1890. pAvcInfo->src_idx = pAvcInfo->enc_idx_gop;
  1891. pAvcInfo->num_mmco1 = 0;
  1892. pAvcInfo->curr_frm = get_current_frame(pAvcInfo);
  1893. if(pAvcInfo->idr_picture)
  1894. pAvcInfo->src_idx_last_idr = pAvcInfo->src_idx;
  1895. if (pAvcInfo->idr_picture )
  1896. {
  1897. //pAvcInfo->Idr_picId ^= 1;
  1898. //clear all refs
  1899. for (i = 0; i < 31; i++)
  1900. pAvcInfo->frm[i].used_for_ref = 0;
  1901. pAvcInfo->curr_frm->used_for_ref = 1;
  1902. pAvcInfo->curr_frm->slice_type = 0;//I_SLICE;
  1903. pAvcInfo->curr_frm->poc = 0;
  1904. pAvcInfo->curr_frm->frame_num = 0;
  1905. }
  1906. else
  1907. {
  1908. int enc_idx = pAvcInfo->enc_idx_modulo;
  1909. pAvcInfo->curr_frm->used_for_ref = pAvcInfo->rps[enc_idx].used_for_ref || pAvcInfo->curr_long_term;
  1910. pAvcInfo->curr_frm->slice_type = pAvcInfo->slice_type;
  1911. pAvcInfo->curr_frm->poc = pAvcInfo->src_idx - pAvcInfo->src_idx_last_idr;
  1912. pAvcInfo->curr_frm->frame_num = (pAvcInfo->prev_frame_num + 1) % (1 << 4);
  1913. if (pAvcInfo->curr_frm->used_for_ref)
  1914. set_mmco(pAvcInfo);
  1915. if (pAvcInfo->curr_frm->slice_type != 0) // I_SLICE)
  1916. set_refpic_list(pAvcInfo,pAvcInfo->ref_long_term);
  1917. }
  1918. pAvcInfo->nal_ref_idc = get_nal_ref_idc(pAvcInfo, enc_idx);
  1919. pAvcInfo->nal_unit_type = pAvcInfo->idr_picture ? AVC_ENC_NUT_IDR : AVC_ENC_NUT_SLICE;
  1920. //update prev_frame_num
  1921. if (pAvcInfo->curr_frm->used_for_ref)
  1922. pAvcInfo->prev_frame_num = pAvcInfo->curr_frm->frame_num;
  1923. // pAvcInfo->RefPicList[0] = pAvcInfo->ref_pic_list;
  1924. pAvcInfo->temporal_id = (pAvcInfo->enc_idx_modulo == -1) ? 0 : pAvcInfo->gop_entry[pAvcInfo->enc_idx_modulo].temporal_id;
  1925. if(pAvcInfo->curr_long_term)
  1926. pAvcInfo->temporal_id = 0;
  1927. //Update cnt
  1928. pAvcInfo->enc_long_term_cnt++;
  1929. pAvcInfo->frm_cnt++;
  1930. }
  1931. #endif