H264TestId.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. /*------------------------------------------------------------------------------
  2. -- --
  3. -- This software is confidential and proprietary and may be used --
  4. -- only as expressly authorized by a licensing agreement from --
  5. -- --
  6. -- Hantro Products Oy. --
  7. -- --
  8. -- (C) COPYRIGHT 2006 HANTRO PRODUCTS OY --
  9. -- ALL RIGHTS RESERVED --
  10. -- --
  11. -- The entire notice above must be reproduced --
  12. -- on all copies and should not be removed. --
  13. -- --
  14. --------------------------------------------------------------------------------
  15. --
  16. -- Abstract : Encoder setup according to a test vector
  17. --
  18. ------------------------------------------------------------------------------*/
  19. /*------------------------------------------------------------------------------
  20. 1. Include headers
  21. ------------------------------------------------------------------------------*/
  22. #include "H264TestId.h"
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. /*------------------------------------------------------------------------------
  26. 2. External compiler flags
  27. --------------------------------------------------------------------------------
  28. --------------------------------------------------------------------------------
  29. 3. Module defines
  30. ------------------------------------------------------------------------------*/
  31. /*------------------------------------------------------------------------------
  32. 4. Local function prototypes
  33. ------------------------------------------------------------------------------*/
  34. static void H264FrameQuantizationTest(h264Instance_s *inst);
  35. static void H264SliceTest(h264Instance_s *inst);
  36. static void H264StreamBufferLimitTest(h264Instance_s *inst);
  37. static void H264MbQuantizationTest(h264Instance_s *inst);
  38. static void H264FilterTest(h264Instance_s *inst);
  39. static void H264UserDataTest(h264Instance_s *inst);
  40. static void H264Intra16FavorTest(h264Instance_s *inst);
  41. static void H264InterFavorTest(h264Instance_s *inst);
  42. static void H264CroppingTest(h264Instance_s *inst);
  43. static void H264RgbInputMaskTest(h264Instance_s *inst);
  44. static void H264MadTest(h264Instance_s *inst);
  45. static void H264MvTest(h264Instance_s *inst);
  46. static void H264DMVPenaltyTest(h264Instance_s *inst);
  47. static void H264MaxOverfillMv(h264Instance_s *inst);
  48. static void H264RoiTest(h264Instance_s *inst);
  49. static void H264IntraAreaTest(h264Instance_s *inst);
  50. static void H264CirTest(h264Instance_s *inst);
  51. static void H264IntraSliceMapTest(h264Instance_s *inst);
  52. /*------------------------------------------------------------------------------
  53. TestID defines a test configuration for the encoder. If the encoder control
  54. software is compiled with INTERNAL_TEST flag the test ID will force the
  55. encoder operation according to the test vector.
  56. TestID Description
  57. 0 No action, normal encoder operation
  58. 1 Frame quantization test, adjust qp for every frame, qp = 0..51
  59. 2 Slice test, adjust slice amount for each frame
  60. 4 Stream buffer limit test, limit=500 (4kB) for first frame
  61. 6 Checkpoint quantization test.
  62. Checkpoints with minimum and maximum values. Gradual increase of
  63. checkpoint values.
  64. 7 Filter test, set disableDeblocking and filterOffsets A and B
  65. 12 User data test
  66. 15 Intra16Favor test, set to maximum value
  67. 16 Cropping test, set cropping values for every frame
  68. 19 RGB input mask test, set all values
  69. 20 MAD test, test all MAD QP change values
  70. 21 InterFavor test, set to maximum value
  71. 22 MV test, set cropping offsets so that max MVs are tested
  72. 23 DMV penalty test, set to minimum/maximum values
  73. 24 Max overfill MV
  74. 26 ROI test
  75. 27 Intra area test
  76. 28 CIR test
  77. 29 Intra slice map test
  78. ------------------------------------------------------------------------------*/
  79. /*------------------------------------------------------------------------------
  80. H264ConfigureTestBeforeStream
  81. Function configures the encoder instance before starting stream encoding
  82. ------------------------------------------------------------------------------*/
  83. void H264ConfigureTestBeforeStream(h264Instance_s * inst)
  84. {
  85. ASSERT(inst);
  86. switch(inst->testId)
  87. {
  88. default:
  89. break;
  90. }
  91. }
  92. /*------------------------------------------------------------------------------
  93. H264ConfigureTestBeforeFrame
  94. Function configures the encoder instance before starting frame encoding
  95. ------------------------------------------------------------------------------*/
  96. void H264ConfigureTestBeforeFrame(h264Instance_s * inst)
  97. {
  98. ASSERT(inst);
  99. switch(inst->testId)
  100. {
  101. case 1:
  102. H264FrameQuantizationTest(inst);
  103. break;
  104. case 2:
  105. H264SliceTest(inst);
  106. break;
  107. case 4:
  108. H264StreamBufferLimitTest(inst);
  109. break;
  110. case 6:
  111. H264MbQuantizationTest(inst);
  112. break;
  113. case 7:
  114. H264FilterTest(inst);
  115. break;
  116. case 12:
  117. H264UserDataTest(inst);
  118. break;
  119. case 15:
  120. H264Intra16FavorTest(inst);
  121. break;
  122. case 16:
  123. H264CroppingTest(inst);
  124. break;
  125. case 19:
  126. H264RgbInputMaskTest(inst);
  127. break;
  128. case 20:
  129. H264MadTest(inst);
  130. break;
  131. case 21:
  132. H264InterFavorTest(inst);
  133. break;
  134. case 22:
  135. H264MvTest(inst);
  136. break;
  137. case 23:
  138. H264DMVPenaltyTest(inst);
  139. break;
  140. case 24:
  141. H264MaxOverfillMv(inst);
  142. break;
  143. case 26:
  144. H264RoiTest(inst);
  145. break;
  146. case 27:
  147. H264IntraAreaTest(inst);
  148. break;
  149. case 28:
  150. H264CirTest(inst);
  151. break;
  152. case 29:
  153. H264IntraSliceMapTest(inst);
  154. break;
  155. default:
  156. break;
  157. }
  158. }
  159. /*------------------------------------------------------------------------------
  160. H264QuantizationTest
  161. ------------------------------------------------------------------------------*/
  162. void H264FrameQuantizationTest(h264Instance_s *inst)
  163. {
  164. i32 vopNum = inst->frameCnt;
  165. /* Inter frame qp start zero */
  166. inst->rateControl.qpHdr = MIN(51, MAX(0, (vopNum-1)%52));
  167. printf("H264FrameQuantTest# qpHdr %d\n", inst->rateControl.qpHdr);
  168. }
  169. /*------------------------------------------------------------------------------
  170. H264SliceTest
  171. ------------------------------------------------------------------------------*/
  172. void H264SliceTest(h264Instance_s *inst)
  173. {
  174. i32 vopNum = inst->frameCnt;
  175. inst->slice.sliceSize = (inst->mbPerRow*vopNum)%inst->mbPerFrame;
  176. printf("H264SliceTest# sliceSize %d\n", inst->slice.sliceSize);
  177. }
  178. /*------------------------------------------------------------------------------
  179. H264StreamBufferLimitTest
  180. ------------------------------------------------------------------------------*/
  181. void H264StreamBufferLimitTest(h264Instance_s *inst)
  182. {
  183. static u32 firstFrame = 1;
  184. if (!firstFrame)
  185. return;
  186. firstFrame = 0;
  187. inst->asic.regs.outputStrmSize = 4000;
  188. printf("H264StreamBufferLimitTest# streamBufferLimit %d bytes\n",
  189. inst->asic.regs.outputStrmSize);
  190. }
  191. /*------------------------------------------------------------------------------
  192. H264QuantizationTest
  193. NOTE: ASIC resolution for wordCntTarget and wordError is value/4
  194. ------------------------------------------------------------------------------*/
  195. void H264MbQuantizationTest(h264Instance_s *inst)
  196. {
  197. i32 vopNum = inst->frameCnt;
  198. h264QpCtrl_s *qc = &inst->rateControl.qpCtrl;
  199. h264RateControl_s *rc = &inst->rateControl;
  200. i32 tmp, i;
  201. i32 bitCnt = 0xffff / 200;
  202. rc->qpMin = MIN(51, vopNum/4);
  203. rc->qpMax = MAX(0, 51 - vopNum/4);
  204. rc->qpLastCoded = rc->qpTarget = rc->qpHdr = 26;
  205. for (i = 0; i < CHECK_POINTS_MAX; i++) {
  206. if (vopNum < 2) {
  207. tmp = 1;
  208. } else if (vopNum < 4) {
  209. tmp = 0xffff;
  210. } else {
  211. tmp = (vopNum * bitCnt)/4;
  212. }
  213. qc->wordCntTarget[i] = MIN(0xffff, tmp);
  214. }
  215. printf("H264MbQuantTest# wordCntTarget[] %d\n", qc->wordCntTarget[0]);
  216. for (i = 0; i < CTRL_LEVELS; i++) {
  217. if (vopNum < 2) {
  218. tmp = -0x8000;
  219. } else if (vopNum < 4) {
  220. tmp = 0x7fff;
  221. } else {
  222. tmp = (-bitCnt/2*vopNum + vopNum * i * bitCnt/5)/4;
  223. }
  224. qc->wordError[i] = MIN(0x7fff, MAX(-0x8000, tmp));
  225. tmp = -8 + i*3;
  226. if ((vopNum&4) == 0) {
  227. tmp = -tmp;
  228. }
  229. qc->qpChange[i] = MIN(0x7, MAX(-0x8, tmp));
  230. printf(" wordError[%d] %d qpChange[%d] %d\n",
  231. i, qc->wordError[i], i, qc->qpChange[i]);
  232. }
  233. }
  234. /*------------------------------------------------------------------------------
  235. H264FilterTest
  236. ------------------------------------------------------------------------------*/
  237. void H264FilterTest(h264Instance_s *inst)
  238. {
  239. i32 vopNum = inst->frameCnt;
  240. slice_s *slice = &inst->slice;
  241. slice->disableDeblocking = (vopNum/2)%3;
  242. if (vopNum == 0) {
  243. slice->filterOffsetA = -12;
  244. slice->filterOffsetB = 12;
  245. } else if (vopNum < 77) {
  246. if (vopNum%6 == 0) {
  247. slice->filterOffsetA += 2;
  248. slice->filterOffsetB -= 2;
  249. }
  250. } else if (vopNum == 78) {
  251. slice->filterOffsetA = -12;
  252. slice->filterOffsetB = -12;
  253. } else if (vopNum < 155) {
  254. if (vopNum%6 == 0) {
  255. slice->filterOffsetA += 2;
  256. slice->filterOffsetB += 2;
  257. }
  258. }
  259. printf("H264FilterTest# disableDeblock = %d, filterOffA = %i filterOffB = %i\n",
  260. slice->disableDeblocking, slice->filterOffsetA,
  261. slice->filterOffsetB);
  262. }
  263. /*------------------------------------------------------------------------------
  264. H264UserDataTest
  265. ------------------------------------------------------------------------------*/
  266. void H264UserDataTest(h264Instance_s *inst)
  267. {
  268. static u8 *userDataBuf = NULL;
  269. i32 userDataLength = (16 + inst->frameCnt*11) % 2048;
  270. i32 i;
  271. /* Allocate a buffer for user data, encoder reads data from this buffer
  272. * and writes it to the stream. This is never freed. */
  273. if (!userDataBuf)
  274. userDataBuf = (u8*)malloc(2048);
  275. if (!userDataBuf)
  276. return;
  277. for(i = 0; i < userDataLength; i++)
  278. {
  279. /* Fill user data buffer with ASCII symbols from 48 to 125 */
  280. userDataBuf[i] = 48 + i % 78;
  281. }
  282. /* Enable user data insertion */
  283. inst->rateControl.sei.userDataEnabled = ENCHW_YES;
  284. inst->rateControl.sei.pUserData = userDataBuf;
  285. inst->rateControl.sei.userDataSize = userDataLength;
  286. printf("H264UserDataTest# userDataSize %d\n", userDataLength);
  287. }
  288. /*------------------------------------------------------------------------------
  289. H264Intra16FavorTest
  290. ------------------------------------------------------------------------------*/
  291. void H264Intra16FavorTest(h264Instance_s *inst)
  292. {
  293. /* Force intra16 favor to maximum value */
  294. inst->asic.regs.intra16Favor = 65535;
  295. printf("H264Intra16FavorTest# intra16Favor %d\n",
  296. inst->asic.regs.intra16Favor);
  297. }
  298. /*------------------------------------------------------------------------------
  299. H264InterFavorTest
  300. ------------------------------------------------------------------------------*/
  301. void H264InterFavorTest(h264Instance_s *inst)
  302. {
  303. /* Force combinations of inter favor and skip penalty values */
  304. if ((inst->frameCnt % 3) == 0) {
  305. inst->asic.regs.skipPenalty = 1; /* default value */
  306. inst->asic.regs.interFavor = 65535;
  307. } else if ((inst->frameCnt % 3) == 1) {
  308. inst->asic.regs.skipPenalty = 0;
  309. inst->asic.regs.interFavor = 65535;
  310. } else {
  311. inst->asic.regs.skipPenalty = 0;
  312. inst->asic.regs.interFavor = 0; /* default value */
  313. }
  314. printf("H264InterFavorTest# interFavor %d skipPenalty %d\n",
  315. inst->asic.regs.interFavor, inst->asic.regs.skipPenalty);
  316. }
  317. /*------------------------------------------------------------------------------
  318. H264CroppingTest
  319. ------------------------------------------------------------------------------*/
  320. void H264CroppingTest(h264Instance_s *inst)
  321. {
  322. inst->preProcess.horOffsetSrc = inst->frameCnt % 8;
  323. inst->preProcess.verOffsetSrc = inst->frameCnt / 2;
  324. printf("H264CroppingTest# horOffsetSrc %d verOffsetSrc %d\n",
  325. inst->preProcess.horOffsetSrc, inst->preProcess.verOffsetSrc);
  326. }
  327. /*------------------------------------------------------------------------------
  328. H264RgbInputMaskTest
  329. ------------------------------------------------------------------------------*/
  330. void H264RgbInputMaskTest(h264Instance_s *inst)
  331. {
  332. u32 frameNum = (u32)inst->frameCnt;
  333. static u32 rMsb = 0;
  334. static u32 gMsb = 0;
  335. static u32 bMsb = 0;
  336. static u32 lsMask = 0; /* Lowest possible mask position */
  337. static u32 msMask = 0; /* Highest possible mask position */
  338. /* First frame normal
  339. * 1..29 step rMaskMsb values
  340. * 30..58 step gMaskMsb values
  341. * 59..87 step bMaskMsb values */
  342. if (frameNum == 0) {
  343. rMsb = inst->asic.regs.rMaskMsb;
  344. gMsb = inst->asic.regs.gMaskMsb;
  345. bMsb = inst->asic.regs.bMaskMsb;
  346. lsMask = MIN(rMsb, gMsb);
  347. lsMask = MIN(bMsb, lsMask);
  348. msMask = MAX(rMsb, gMsb);
  349. msMask = MAX(bMsb, msMask);
  350. if (msMask < 16)
  351. msMask = 15-2; /* 16bit RGB, 13 mask positions: 3..15 */
  352. else
  353. msMask = 31-2; /* 32bit RGB, 29 mask positions: 3..31 */
  354. } else if (frameNum <= msMask) {
  355. inst->asic.regs.rMaskMsb = MAX(frameNum+2, lsMask);
  356. inst->asic.regs.gMaskMsb = gMsb;
  357. inst->asic.regs.bMaskMsb = bMsb;
  358. } else if (frameNum <= msMask*2) {
  359. inst->asic.regs.rMaskMsb = rMsb;
  360. inst->asic.regs.gMaskMsb = MAX(frameNum-msMask+2, lsMask);
  361. if (inst->asic.regs.inputImageFormat == 4) /* RGB 565 special case */
  362. inst->asic.regs.gMaskMsb = MAX(frameNum-msMask+2, lsMask+1);
  363. inst->asic.regs.bMaskMsb = bMsb;
  364. } else if (frameNum <= msMask*3) {
  365. inst->asic.regs.rMaskMsb = rMsb;
  366. inst->asic.regs.gMaskMsb = gMsb;
  367. inst->asic.regs.bMaskMsb = MAX(frameNum-msMask*2+2, lsMask);
  368. } else {
  369. inst->asic.regs.rMaskMsb = rMsb;
  370. inst->asic.regs.gMaskMsb = gMsb;
  371. inst->asic.regs.bMaskMsb = bMsb;
  372. }
  373. printf("H264RgbInputMaskTest# %d %d %d\n", inst->asic.regs.rMaskMsb,
  374. inst->asic.regs.gMaskMsb, inst->asic.regs.bMaskMsb);
  375. }
  376. /*------------------------------------------------------------------------------
  377. H264MadTest
  378. ------------------------------------------------------------------------------*/
  379. void H264MadTest(h264Instance_s *inst)
  380. {
  381. u32 frameNum = (u32)inst->frameCnt;
  382. /* All values in range [-8,7] */
  383. inst->rateControl.mbQpAdjustment = -8 + (frameNum%16);
  384. /* Step 256, range [0,63*256] */
  385. inst->mad.threshold = 256 * ((frameNum+1)%64);
  386. printf("H264MadTest# %d %d\n",
  387. inst->asic.regs.madThreshold,
  388. inst->asic.regs.madQpDelta);
  389. }
  390. /*------------------------------------------------------------------------------
  391. H264MvTest
  392. ------------------------------------------------------------------------------*/
  393. void H264MvTest(h264Instance_s *inst)
  394. {
  395. u32 frame = (u32)inst->frameCnt;
  396. /* Set cropping offsets according to max MV length, decrement by frame
  397. * x = 32, 160, 32, 159, 32, 158, ..
  398. * y = 48, 80, 48, 79, 48, 78, .. */
  399. inst->preProcess.horOffsetSrc = 32 + (frame%2)*128 - (frame%2)*(frame/2);
  400. inst->preProcess.verOffsetSrc = 48 + (frame%2)*32 - (frame%2)*(frame/2);
  401. printf("H264MvTest# horOffsetSrc %d verOffsetSrc %d\n",
  402. inst->preProcess.horOffsetSrc, inst->preProcess.verOffsetSrc);
  403. }
  404. /*------------------------------------------------------------------------------
  405. H264DMVPenaltyTest
  406. ------------------------------------------------------------------------------*/
  407. void H264DMVPenaltyTest(h264Instance_s *inst)
  408. {
  409. u32 frame = (u32)inst->frameCnt;
  410. /* Set DMV penalty values to maximum and minimum */
  411. inst->asic.regs.diffMvPenalty = frame%2 ? 0x3FF-frame/2 : frame/2;
  412. inst->asic.regs.diffMvPenalty4p = frame%2 ? 0x3FF-frame/2 : frame/2;
  413. printf("H264DMVPenaltyTest# penalty %d penalty4p %d\n",
  414. inst->asic.regs.diffMvPenalty, inst->asic.regs.diffMvPenalty4p);
  415. }
  416. /*------------------------------------------------------------------------------
  417. H264MaxOverfillMv
  418. ------------------------------------------------------------------------------*/
  419. void H264MaxOverfillMv(h264Instance_s *inst)
  420. {
  421. u32 frame = (u32)inst->frameCnt;
  422. /* Set cropping offsets according to max MV length.
  423. * In test cases the picture is selected so that this will
  424. * cause maximum horizontal MV to point into overfilled area. */
  425. inst->preProcess.horOffsetSrc = 32 + (frame%2)*128;
  426. if (EncPreProcessCheck(&inst->preProcess) == ENCHW_NOK)
  427. inst->preProcess.horOffsetSrc = 0;
  428. inst->preProcess.verOffsetSrc = 176;
  429. if (EncPreProcessCheck(&inst->preProcess) == ENCHW_NOK)
  430. inst->preProcess.verOffsetSrc = 0;
  431. printf("H264MaxOverfillMv# horOffsetSrc %d verOffsetSrc %d\n",
  432. inst->preProcess.horOffsetSrc, inst->preProcess.verOffsetSrc);
  433. }
  434. /*------------------------------------------------------------------------------
  435. H264RoiTest
  436. ------------------------------------------------------------------------------*/
  437. void H264RoiTest(h264Instance_s *inst)
  438. {
  439. regValues_s *regs = &inst->asic.regs;
  440. u32 frame = (u32)inst->frameCnt;
  441. u32 mbPerRow = inst->mbPerRow;
  442. u32 mbPerCol = inst->mbPerCol;
  443. u32 frames = MIN(mbPerRow, mbPerCol);
  444. u32 loop = frames*3;
  445. /* Loop after this many encoded frames */
  446. frame = frame % loop;
  447. regs->roi1DeltaQp = (frame % 15) + 1;
  448. regs->roi2DeltaQp = 15 - (frame % 15);
  449. /* Set two ROI areas according to frame dimensions. */
  450. if (frame < frames)
  451. {
  452. /* ROI1 in top-left corner, ROI2 in bottom-right corner */
  453. regs->roi1Left = regs->roi1Top = 0;
  454. regs->roi1Right = regs->roi1Bottom = frame;
  455. regs->roi2Left = mbPerRow - 1 - frame;
  456. regs->roi2Top = mbPerCol - 1 - frame;
  457. regs->roi2Right = mbPerRow - 1;
  458. regs->roi2Bottom = mbPerCol - 1;
  459. }
  460. else if (frame < frames*2)
  461. {
  462. /* ROI1 gets smaller towards top-right corner,
  463. * ROI2 towards bottom-left corner */
  464. frame -= frames;
  465. regs->roi1Left = frame;
  466. regs->roi1Top = 0;
  467. regs->roi1Right = mbPerRow - 1;
  468. regs->roi1Bottom = mbPerCol - 1 - frame;
  469. regs->roi2Left = 0;
  470. regs->roi2Top = frame;
  471. regs->roi2Right = mbPerRow - 1 - frame;
  472. regs->roi2Bottom = mbPerCol - 1;
  473. }
  474. else if (frame < frames*3)
  475. {
  476. /* 1x1/2x2 ROIs moving diagonal across frame */
  477. frame -= frames*2;
  478. regs->roi1Left = frame - frame%2;
  479. regs->roi1Right = frame;
  480. regs->roi1Top = frame - frame%2;
  481. regs->roi1Bottom = frame;
  482. regs->roi2Left = frame - frame%2;
  483. regs->roi2Right = frame;
  484. regs->roi2Top = mbPerCol - 1 - frame;
  485. regs->roi2Bottom = mbPerCol - 1 - frame + frame%2;
  486. }
  487. printf("H264RoiTest# ROI1:%d x%dy%d-x%dy%d ROI2:%d x%dy%d-x%dy%d\n",
  488. regs->roi1DeltaQp, regs->roi1Left, regs->roi1Top,
  489. regs->roi1Right, regs->roi1Bottom,
  490. regs->roi2DeltaQp, regs->roi2Left, regs->roi2Top,
  491. regs->roi2Right, regs->roi2Bottom);
  492. }
  493. /*------------------------------------------------------------------------------
  494. H264IntraAreaTest
  495. ------------------------------------------------------------------------------*/
  496. void H264IntraAreaTest(h264Instance_s *inst)
  497. {
  498. regValues_s *regs = &inst->asic.regs;
  499. u32 frame = (u32)inst->frameCnt;
  500. u32 mbPerRow = inst->mbPerRow;
  501. u32 mbPerCol = inst->mbPerCol;
  502. u32 frames = MIN(mbPerRow, mbPerCol);
  503. u32 loop = frames*3;
  504. /* Loop after this many encoded frames */
  505. frame = frame % loop;
  506. if (frame < frames)
  507. {
  508. /* Intra area in top-left corner, gets bigger every frame */
  509. regs->intraAreaLeft = regs->intraAreaTop = 0;
  510. regs->intraAreaRight = regs->intraAreaBottom = frame;
  511. }
  512. else if (frame < frames*2)
  513. {
  514. /* Intra area gets smaller towards top-right corner */
  515. frame -= frames;
  516. regs->intraAreaLeft = frame;
  517. regs->intraAreaTop = 0;
  518. regs->intraAreaRight = mbPerRow - 1;
  519. regs->intraAreaBottom = mbPerCol - 1 - frame;
  520. }
  521. else if (frame < frames*3)
  522. {
  523. /* 1x1/2x2 Intra area moving diagonal across frame */
  524. frame -= frames*2;
  525. regs->intraAreaLeft = frame - frame%2;
  526. regs->intraAreaRight = frame;
  527. regs->intraAreaTop = frame - frame%2;
  528. regs->intraAreaBottom = frame;
  529. }
  530. printf("H264IntraAreaTest# x%dy%d-x%dy%d\n",
  531. regs->intraAreaLeft, regs->intraAreaTop,
  532. regs->intraAreaRight, regs->intraAreaBottom);
  533. }
  534. /*------------------------------------------------------------------------------
  535. H264CirTest
  536. ------------------------------------------------------------------------------*/
  537. void H264CirTest(h264Instance_s *inst)
  538. {
  539. regValues_s *regs = &inst->asic.regs;
  540. u32 frame = (u32)inst->frameCnt;
  541. u32 mbPerRow = inst->mbPerRow;
  542. u32 mbPerFrame = inst->mbPerFrame;
  543. u32 loop = inst->mbPerFrame+6;
  544. /* Loop after this many encoded frames */
  545. frame = frame % loop;
  546. switch (frame)
  547. {
  548. case 0:
  549. case 1:
  550. regs->cirStart = 0;
  551. regs->cirInterval = 1;
  552. break;
  553. case 2:
  554. regs->cirStart = 0;
  555. regs->cirInterval = 2;
  556. break;
  557. case 3:
  558. regs->cirStart = 0;
  559. regs->cirInterval = 3;
  560. break;
  561. case 4:
  562. regs->cirStart = 0;
  563. regs->cirInterval = mbPerRow;
  564. break;
  565. case 5:
  566. regs->cirStart = 0;
  567. regs->cirInterval = mbPerRow+1;
  568. break;
  569. case 6:
  570. regs->cirStart = 0;
  571. regs->cirInterval = mbPerFrame-1;
  572. break;
  573. case 7:
  574. regs->cirStart = mbPerFrame-1;
  575. regs->cirInterval = 1;
  576. break;
  577. default:
  578. regs->cirStart = frame-7;
  579. regs->cirInterval = (mbPerFrame-frame)%(mbPerRow*2);
  580. break;
  581. }
  582. printf("H264CirTest# start:%d interval:%d\n",
  583. regs->cirStart, regs->cirInterval);
  584. }
  585. /*------------------------------------------------------------------------------
  586. H264IntraSliceMapTest
  587. ------------------------------------------------------------------------------*/
  588. void H264IntraSliceMapTest(h264Instance_s *inst)
  589. {
  590. regValues_s *regs = &inst->asic.regs;
  591. u32 frame = (u32)inst->frameCnt;
  592. u32 mbPerCol = inst->mbPerCol;
  593. frame = frame % (mbPerCol*10);
  594. if (frame <= 1)
  595. {
  596. inst->slice.sliceSize = inst->mbPerRow;
  597. regs->intraSliceMap1 = 0x55555555;
  598. regs->intraSliceMap2 = 0x55555555;
  599. regs->intraSliceMap3 = 0x55555555;
  600. }
  601. else if (frame < mbPerCol+1)
  602. {
  603. inst->slice.sliceSize = inst->mbPerRow * (frame-1);
  604. regs->intraSliceMap1 = 0xAAAAAAAA;
  605. regs->intraSliceMap2 = 0xAAAAAAAA;
  606. regs->intraSliceMap3 = 0xAAAAAAAA;
  607. }
  608. else
  609. {
  610. inst->slice.sliceSize = inst->mbPerRow * (frame%mbPerCol);
  611. regs->intraSliceMap1 += frame;
  612. regs->intraSliceMap2 += frame;
  613. regs->intraSliceMap3 += frame;
  614. }
  615. printf("H264IntraSliceMapTest# "
  616. "sliceSize: %d map1: 0x%x map2: 0x%x map3: 0x%x \n",
  617. regs->sliceSizeMbRows, regs->intraSliceMap1,
  618. regs->intraSliceMap2, regs->intraSliceMap3);
  619. }
  620. #if 0
  621. /*------------------------------------------------------------------------------
  622. MbPerInterruptTest
  623. ------------------------------------------------------------------------------*/
  624. void MbPerInterruptTest(trace_s *trace)
  625. {
  626. if (trace->testId != 3) {
  627. return;
  628. }
  629. trace->control.mbPerInterrupt = trace->vopNum;
  630. }
  631. /*------------------------------------------------------------------------------
  632. H264FilterTest
  633. ------------------------------------------------------------------------------*/
  634. void H264FilterTest(trace_s *trace, slice_s *slice)
  635. {
  636. i32 vopNum = trace->vopNum;
  637. if (trace->testId != 7) {
  638. return;
  639. }
  640. slice->disableDeblocking = (vopNum/2)%3;
  641. if (vopNum == 0) {
  642. slice->filterOffsetA = -12;
  643. slice->filterOffsetB = 12;
  644. } else if (vopNum < 77) {
  645. if (vopNum%6 == 0) {
  646. slice->filterOffsetA += 2;
  647. slice->filterOffsetB -= 2;
  648. }
  649. } else if (vopNum == 78) {
  650. slice->filterOffsetA = -12;
  651. slice->filterOffsetB = -12;
  652. } else if (vopNum < 155) {
  653. if (vopNum%6 == 0) {
  654. slice->filterOffsetA += 2;
  655. slice->filterOffsetB += 2;
  656. }
  657. }
  658. }
  659. /*------------------------------------------------------------------------------
  660. H264SliceQuantTest() Change sliceQP from min->max->min.
  661. ------------------------------------------------------------------------------*/
  662. void H264SliceQuantTest(trace_s *trace, slice_s *slice, mb_s *mb,
  663. rateControl_s *rc)
  664. {
  665. if (trace->testId != 8) {
  666. return;
  667. }
  668. rc->vopRc = NO;
  669. rc->mbRc = NO;
  670. rc->picSkip = NO;
  671. if (mb->qpPrev == rc->qpMin) {
  672. mb->qpLum = rc->qpMax;
  673. } else if (mb->qpPrev == rc->qpMax) {
  674. mb->qpLum = rc->qpMin;
  675. } else {
  676. mb->qpLum = rc->qpMax;
  677. }
  678. mb->qpCh = qpCh[MIN(51, MAX(0, mb->qpLum + mb->chromaQpOffset))];
  679. rc->qp = rc->qpHdr = mb->qpLum;
  680. slice->sliceQpDelta = mb->qpLum - slice->picInitQpMinus26 - 26;
  681. }
  682. #endif