encoder.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:23k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "encoder.h"
  5. #include "prediction/mbprediction.h"
  6. #include "global.h"
  7. #include "utils/timer.h"
  8. #include "image/image.h"
  9. #include "bitstream/cbp.h"
  10. #include "utils/mbfunctions.h"
  11. #include "bitstream/bitstream.h"
  12. #include "bitstream/mbcoding.h"
  13. #include "utils/ratecontrol.h"
  14. #include "utils/emms.h"
  15. #include "bitstream/mbcoding.h"
  16. #include "quant/adapt_quant.h"
  17. #include "quant/quant_matrix.h"
  18. #include "utils/mem_align.h"
  19. #define ENC_CHECK(X) if(!(X)) return XVID_ERR_FORMAT
  20. #ifdef MPEG4IP
  21. static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool vol_header);
  22. #else
  23. static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits);
  24. #endif
  25. static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header);
  26. static int DQtab[4] = 
  27. {
  28. -1, -2, 1, 2
  29. };
  30. static int iDQtab[5] = 
  31. {
  32. 1, 0, NO_CHANGE, 2, 3
  33. };
  34. int encoder_create(XVID_ENC_PARAM * pParam)
  35. {
  36. Encoder *pEnc;
  37. uint32_t i;
  38. pParam->handle = NULL;
  39. ENC_CHECK(pParam);
  40. ENC_CHECK(pParam->width > 0 && pParam->width <= 1920);
  41. ENC_CHECK(pParam->height > 0 && pParam->height <= 1280);
  42. ENC_CHECK(!(pParam->width % 2));
  43. ENC_CHECK(!(pParam->height % 2));
  44. if (pParam->fincr <= 0 || pParam->fbase <= 0)
  45. {
  46. pParam->fincr = 1;
  47. pParam->fbase = 25;
  48. }
  49. // simplify the "fincr/fbase" fraction
  50. // (neccessary, since windows supplies us with huge numbers)
  51. i = pParam->fincr;
  52. while (i > 1)
  53. {
  54. if (pParam->fincr % i == 0 && pParam->fbase % i == 0)
  55. {
  56. pParam->fincr /= i;
  57. pParam->fbase /= i;
  58. i = pParam->fincr;
  59. continue;
  60. }
  61. i--;
  62. }
  63. if (pParam->fbase > 65535)
  64. {
  65. float div = (float)pParam->fbase / 65535;
  66. pParam->fbase = (int)(pParam->fbase / div);
  67. pParam->fincr = (int)(pParam->fincr / div);
  68. }
  69. if (pParam->bitrate <= 0)
  70. pParam->bitrate = 900000;
  71. if (pParam->rc_buffersize <= 0)
  72. pParam->rc_buffersize = 16;
  73. if ((pParam->min_quantizer <= 0) || (pParam->min_quantizer > 31))
  74. pParam->min_quantizer = 1;
  75. if ((pParam->max_quantizer <= 0) || (pParam->max_quantizer > 31))
  76. pParam->max_quantizer = 31;
  77. if (pParam->max_key_interval == 0) /* 1 keyframe each 10 seconds */ 
  78. pParam->max_key_interval = 10 * pParam->fincr / pParam->fbase;
  79. if (pParam->max_quantizer < pParam->min_quantizer)
  80. pParam->max_quantizer = pParam->min_quantizer;
  81. if ((pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE)) == NULL)
  82. return XVID_ERR_MEMORY;
  83. /* Fill members of Encoder structure */
  84. pEnc->mbParam.width = pParam->width;
  85. pEnc->mbParam.height = pParam->height;
  86. pEnc->mbParam.mb_width = (pEnc->mbParam.width + 15) / 16;
  87. pEnc->mbParam.mb_height = (pEnc->mbParam.height + 15) / 16;
  88. pEnc->mbParam.edged_width = 16 * pEnc->mbParam.mb_width + 2 * EDGE_SIZE;
  89. pEnc->mbParam.edged_height = 16 * pEnc->mbParam.mb_height + 2 * EDGE_SIZE;
  90. #ifdef MPEG4IP
  91. pEnc->mbParam.fincr = pParam->fincr;
  92. pEnc->mbParam.fbase = pParam->fbase;
  93. pEnc->mbParam.time_inc_bits = 1;
  94. while (pParam->fbase > (1 << pEnc->mbParam.time_inc_bits)) {
  95. pEnc->mbParam.time_inc_bits++;
  96. }
  97. #endif
  98. pEnc->sStat.fMvPrevSigma = -1;
  99. /* Fill rate control parameters */
  100. pEnc->mbParam.quant = 4;
  101. pEnc->bitrate = pParam->bitrate;
  102. pEnc->iFrameNum = 0;
  103. pEnc->iMaxKeyInterval = pParam->max_key_interval;
  104. /* try to allocate memory */
  105. pEnc->sCurrent.y = pEnc->sCurrent.u = pEnc->sCurrent.v = NULL;
  106. pEnc->sReference.y = pEnc->sReference.u = pEnc->sReference.v = NULL;
  107. pEnc->vInterH.y = pEnc->vInterH.u = pEnc->vInterH.v = NULL;
  108. pEnc->vInterV.y = pEnc->vInterV.u = pEnc->vInterV.v = NULL;
  109. pEnc->vInterVf.y = pEnc->vInterVf.u = pEnc->vInterVf.v = NULL;
  110. pEnc->vInterHV.y = pEnc->vInterHV.u = pEnc->vInterHV.v = NULL;
  111. pEnc->vInterHVf.y = pEnc->vInterHVf.u = pEnc->vInterHVf.v = NULL;
  112. pEnc->pMBs = NULL;
  113. if (image_create(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  114. image_create(&pEnc->sReference, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  115. image_create(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  116. image_create(&pEnc->vInterV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  117. image_create(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  118. image_create(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  119. image_create(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  120. #ifdef _DEBUG
  121. image_create(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
  122. #endif
  123. (pEnc->pMBs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL)
  124. {
  125. image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  126. image_destroy(&pEnc->sReference, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  127. image_destroy(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  128. image_destroy(&pEnc->vInterV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  129. image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  130. image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  131. image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  132. #ifdef _DEBUG
  133. image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  134. #endif
  135. if (pEnc)
  136. {
  137. xvid_free(pEnc);
  138. }
  139. return XVID_ERR_MEMORY;
  140. }
  141. // init macroblock array
  142. for (i = 0; i < pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; i++)
  143. {
  144. pEnc->pMBs[i].dquant = NO_CHANGE;
  145. }
  146. pParam->handle = (void *)pEnc;
  147. if (pParam->bitrate)
  148. {
  149. RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 1000 / pParam->fincr,
  150. pParam->max_quantizer, pParam->min_quantizer);
  151. }
  152. init_timer();
  153. return XVID_ERR_OK;
  154. }
  155. int encoder_destroy(Encoder * pEnc)
  156. {
  157. ENC_CHECK(pEnc);
  158. ENC_CHECK(pEnc->sCurrent.y);
  159. ENC_CHECK(pEnc->sReference.y);
  160. xvid_free(pEnc->pMBs);
  161. image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  162. image_destroy(&pEnc->sReference, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  163. image_destroy(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  164. image_destroy(&pEnc->vInterV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  165. image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  166. image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  167. image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  168. #ifdef _DEBUG
  169. image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
  170. #endif
  171. xvid_free(pEnc);
  172. return XVID_ERR_OK;
  173. }
  174. int encoder_encode(Encoder * pEnc, XVID_ENC_FRAME * pFrame, XVID_ENC_STATS * pResult)
  175. {
  176. uint16_t x, y;
  177. Bitstream bs;
  178. uint32_t bits;
  179. uint16_t write_vol_header = 0;
  180. #ifdef _DEBUG
  181. float psnr;
  182. uint8_t temp[100];
  183. #endif
  184. start_global_timer();
  185. ENC_CHECK(pEnc);
  186. ENC_CHECK(pFrame);
  187. ENC_CHECK(pFrame->bitstream);
  188. #ifndef MPEG4IP
  189. ENC_CHECK(pFrame->image);
  190. #endif
  191. pEnc->mbParam.global_flags = pFrame->general;
  192. pEnc->mbParam.motion_flags = pFrame->motion;
  193. pEnc->mbParam.hint = &pFrame->hint;
  194. start_timer();
  195. #ifdef MPEG4IP
  196. if (pFrame->image == NULL 
  197.   && pFrame->colorspace == XVID_CSP_I420) {
  198. ENC_CHECK(pFrame->image_y);
  199. ENC_CHECK(pFrame->image_u);
  200. ENC_CHECK(pFrame->image_v);
  201. ENC_CHECK(pFrame->stride >= pEnc->mbParam.width);
  202. if (yuv_input(&pEnc->sCurrent, 
  203.   pEnc->mbParam.width, 
  204.   pEnc->mbParam.height,
  205.   pEnc->mbParam.edged_width, 
  206.   pFrame->image_y, pFrame->image_u, pFrame->image_v,
  207.   pFrame->stride,
  208.   pFrame->colorspace)) {
  209. return XVID_ERR_FORMAT;
  210. }
  211. } else {
  212. #endif
  213. if (image_input(&pEnc->sCurrent, pEnc->mbParam.width, pEnc->mbParam.height,
  214. pEnc->mbParam.edged_width, pFrame->image, pFrame->colorspace))
  215. {
  216. return XVID_ERR_FORMAT;
  217. }
  218. #ifdef MPEG4IP
  219. }
  220. #endif
  221. stop_conv_timer();
  222. EMMS();
  223. #ifdef _DEBUG
  224. image_copy(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.height);
  225. #endif
  226. BitstreamInit(&bs, pFrame->bitstream, 0);
  227. if (pFrame->quant == 0)
  228. {
  229. pEnc->mbParam.quant = RateControlGetQ(0);
  230. }
  231. else
  232. {
  233. pEnc->mbParam.quant = pFrame->quant;
  234. }
  235. if ((pEnc->mbParam.global_flags & XVID_LUMIMASKING) > 0)
  236. {
  237. int * temp_dquants = (int *) xvid_malloc(pEnc->mbParam.mb_width * pEnc->mbParam.mb_height * sizeof(int), CACHE_LINE);
  238. pEnc->mbParam.quant = adaptive_quantization(pEnc->sCurrent.y,
  239.     pEnc->mbParam.width,
  240.     temp_dquants,
  241.     pEnc->mbParam.quant,
  242.     pEnc->mbParam.quant,
  243.     2*pEnc->mbParam.quant,
  244.     pEnc->mbParam.mb_width,
  245.     pEnc->mbParam.mb_height);
  246. for (y = 0; y < pEnc->mbParam.mb_height; y++)
  247. for (x = 0; x < pEnc->mbParam.mb_width; x++)
  248. {
  249. MACROBLOCK *pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width];
  250. pMB->dquant = iDQtab[(temp_dquants[y * pEnc->mbParam.mb_width + x] + 2)];
  251. }
  252. xvid_free(temp_dquants);
  253. }
  254. if(pEnc->mbParam.global_flags & XVID_H263QUANT) {
  255. if(pEnc->mbParam.quant_type != H263_QUANT)
  256. write_vol_header = 1;
  257. pEnc->mbParam.quant_type = H263_QUANT;
  258. }
  259. else if(pEnc->mbParam.global_flags & XVID_MPEGQUANT) {
  260. int ret1, ret2;
  261. ret1 = ret2 = 0;
  262. if(pEnc->mbParam.quant_type != MPEG4_QUANT)
  263. write_vol_header = 1;
  264. pEnc->mbParam.quant_type = MPEG4_QUANT;
  265. if ((pEnc->mbParam.global_flags & XVID_CUSTOM_QMATRIX) > 0) {
  266. if(pFrame->quant_intra_matrix != NULL)
  267. ret1 = set_intra_matrix(pFrame->quant_intra_matrix);
  268. if(pFrame->quant_inter_matrix != NULL)
  269. ret2 = set_inter_matrix(pFrame->quant_inter_matrix);
  270. }
  271. else {
  272. ret1 = set_intra_matrix(get_default_intra_matrix());
  273. ret2 = set_inter_matrix(get_default_inter_matrix());
  274. }
  275. if(write_vol_header == 0)
  276. write_vol_header = ret1 | ret2;
  277. }
  278. #ifdef MPEG4IP
  279. if (pEnc->iFrameNum == 0) {
  280. BitstreamWriteVoshHeader(&bs);
  281. write_vol_header = 1;
  282. }
  283. #endif
  284. if (pFrame->intra < 0)
  285. {
  286. if ((pEnc->iFrameNum == 0) || ((pEnc->iMaxKeyInterval > 0) 
  287.        && (pEnc->iFrameNum >= pEnc->iMaxKeyInterval)))
  288. #ifdef MPEG4IP
  289. pFrame->intra = FrameCodeI(pEnc, &bs, &bits, write_vol_header);
  290. #else
  291. pFrame->intra = FrameCodeI(pEnc, &bs, &bits);
  292. #endif
  293. else
  294. pFrame->intra = FrameCodeP(pEnc, &bs, &bits, 0, write_vol_header);
  295. }
  296. else
  297. {
  298. if (pFrame->intra == 1)
  299. #ifdef MPEG4IP
  300. pFrame->intra = FrameCodeI(pEnc, &bs, &bits, write_vol_header);
  301. #else
  302. pFrame->intra = FrameCodeI(pEnc, &bs, &bits);
  303. #endif
  304. else
  305. pFrame->intra = FrameCodeP(pEnc, &bs, &bits, 1, write_vol_header);
  306. }
  307. BitstreamPutBits(&bs, 0xFFFF, 16);
  308. BitstreamPutBits(&bs, 0xFFFF, 16);
  309. BitstreamPad(&bs);
  310. pFrame->length = BitstreamLength(&bs);
  311. if (pResult)
  312. {
  313. pResult->quant = pEnc->mbParam.quant;
  314. pResult->hlength = pFrame->length - (pEnc->sStat.iTextBits / 8);
  315. pResult->kblks = pEnc->sStat.kblks;
  316. pResult->mblks = pEnc->sStat.mblks;
  317. pResult->ublks = pEnc->sStat.ublks;
  318. #ifdef MPEG4IP
  319. pResult->image_y = pEnc->sCurrent.y;
  320. pResult->image_u = pEnc->sCurrent.u;
  321. pResult->image_v = pEnc->sCurrent.v;
  322. pResult->stride_y = pEnc->mbParam.edged_width;
  323. pResult->stride_uv = pResult->stride_y / 2;
  324. #endif
  325. }
  326.    
  327. EMMS();
  328. if (pFrame->quant == 0)
  329. {
  330. RateControlUpdate(pEnc->mbParam.quant, pFrame->length, pFrame->intra);
  331. }
  332. #ifdef _DEBUG
  333. psnr = image_psnr(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width,
  334. pEnc->mbParam.width, pEnc->mbParam.height);
  335. sprintf(temp, "PSNR: %fn", psnr);
  336. DEBUG(temp);
  337. #endif
  338. pEnc->iFrameNum++;
  339. image_swap(&pEnc->sCurrent, &pEnc->sReference);
  340. stop_global_timer();
  341. write_timer();
  342. return XVID_ERR_OK;
  343. }
  344. static __inline void CodeIntraMB(Encoder *pEnc, MACROBLOCK *pMB) {
  345. pMB->mode = MODE_INTRA;
  346. if ((pEnc->mbParam.global_flags & XVID_LUMIMASKING) > 0) {
  347. if(pMB->dquant != NO_CHANGE)
  348. {
  349. pMB->mode = MODE_INTRA_Q;
  350. pEnc->mbParam.quant += DQtab[pMB->dquant];
  351. if (pEnc->mbParam.quant > 31) pEnc->mbParam.quant = 31;
  352. if (pEnc->mbParam.quant < 1) pEnc->mbParam.quant = 1;
  353. }
  354. }
  355. pMB->quant = pEnc->mbParam.quant;
  356. }
  357. #define FCODEBITS 3
  358. #define MODEBITS 5
  359. static
  360. void HintedMESet(Encoder * pEnc, int * intra)
  361. {
  362. HINTINFO * hint;
  363. Bitstream bs;
  364. int length, high;
  365. uint32_t x, y;
  366. hint = pEnc->mbParam.hint;
  367. if (hint->rawhints)
  368. {
  369. *intra = hint->mvhint.intra;
  370. }
  371. else
  372. {
  373. BitstreamInit(&bs, hint->hintstream, hint->hintlength);
  374. *intra = BitstreamGetBit(&bs);
  375. }
  376. if (*intra)
  377. {
  378. return;
  379. }
  380. pEnc->mbParam.fixed_code = (hint->rawhints) ? hint->mvhint.fcode : BitstreamGetBits(&bs, FCODEBITS);
  381. length = pEnc->mbParam.fixed_code + 5;
  382. high = 1 << (length - 1);
  383. for (y=0 ; y<pEnc->mbParam.mb_height ; ++y)
  384. {
  385. for (x=0 ; x<pEnc->mbParam.mb_width ; ++x)
  386. {
  387. MACROBLOCK * pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width];
  388. MVBLOCKHINT * bhint = &hint->mvhint.block[x + y * pEnc->mbParam.mb_width];
  389. VECTOR pred[4];
  390. VECTOR tmp;
  391. int dummy[4];
  392. int vec;
  393. pMB->mode = (hint->rawhints) ? bhint->mode : BitstreamGetBits(&bs, MODEBITS);
  394. if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)
  395. {
  396. tmp.x  = (hint->rawhints) ? bhint->mvs[0].x : BitstreamGetBits(&bs, length);
  397. tmp.y  = (hint->rawhints) ? bhint->mvs[0].y : BitstreamGetBits(&bs, length);
  398. tmp.x -= (tmp.x >= high) ? high*2 : 0;
  399. tmp.y -= (tmp.y >= high) ? high*2 : 0;
  400. get_pmvdata(pEnc->pMBs, x, y, pEnc->mbParam.mb_width, 0, pred, dummy);
  401. for (vec=0 ; vec<4 ; ++vec)
  402. {
  403. pMB->mvs[vec].x  = tmp.x;
  404. pMB->mvs[vec].y  = tmp.y;
  405. pMB->pmvs[vec].x = pMB->mvs[0].x - pred[0].x;
  406. pMB->pmvs[vec].y = pMB->mvs[0].y - pred[0].y;
  407. }
  408. }
  409. else if (pMB->mode == MODE_INTER4V)
  410. {
  411. for (vec=0 ; vec<4 ; ++vec)
  412. {
  413. tmp.x  = (hint->rawhints) ? bhint->mvs[vec].x : BitstreamGetBits(&bs, length);
  414. tmp.y  = (hint->rawhints) ? bhint->mvs[vec].y : BitstreamGetBits(&bs, length);
  415. tmp.x -= (tmp.x >= high) ? high*2 : 0;
  416. tmp.y -= (tmp.y >= high) ? high*2 : 0;
  417. get_pmvdata(pEnc->pMBs, x, y, pEnc->mbParam.mb_width, vec, pred, dummy);
  418. pMB->mvs[vec].x  = tmp.x;
  419. pMB->mvs[vec].y  = tmp.y;
  420. pMB->pmvs[vec].x = pMB->mvs[vec].x - pred[0].x;
  421. pMB->pmvs[vec].y = pMB->mvs[vec].y - pred[0].y;
  422. }
  423. }
  424. else // intra / intra_q / stuffing / not_coded
  425. {
  426. for (vec=0 ; vec<4 ; ++vec)
  427. {
  428. pMB->mvs[vec].x  = pMB->mvs[vec].y  = 0;
  429. }
  430. }
  431. }
  432. }
  433. }
  434. static
  435. void HintedMEGet(Encoder * pEnc, int intra)
  436. {
  437. HINTINFO * hint;
  438. Bitstream bs;
  439. uint32_t x, y;
  440. int length, high;
  441. hint = pEnc->mbParam.hint;
  442. if (hint->rawhints)
  443. {
  444. hint->mvhint.intra = intra;
  445. }
  446. else
  447. {
  448. BitstreamInit(&bs, hint->hintstream, 0);
  449. BitstreamPutBit(&bs, intra);
  450. }
  451. if (intra)
  452. {
  453. if (!hint->rawhints)
  454. {
  455. BitstreamPad(&bs);
  456. hint->hintlength = BitstreamLength(&bs);
  457. }
  458. return;
  459. }
  460. length = pEnc->mbParam.fixed_code + 5;
  461. high = 1 << (length - 1);
  462. if (hint->rawhints)
  463. {
  464. hint->mvhint.fcode = pEnc->mbParam.fixed_code;
  465. }
  466. else
  467. {
  468. BitstreamPutBits(&bs, pEnc->mbParam.fixed_code, FCODEBITS);
  469. }
  470. for (y=0 ; y<pEnc->mbParam.mb_height ; ++y)
  471. {
  472. for (x=0 ; x<pEnc->mbParam.mb_width ; ++x)
  473. {
  474. MACROBLOCK * pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width];
  475. MVBLOCKHINT * bhint = &hint->mvhint.block[x + y * pEnc->mbParam.mb_width];
  476. VECTOR tmp;
  477. if (hint->rawhints)
  478. {
  479. bhint->mode = pMB->mode;
  480. }
  481. else
  482. {
  483. BitstreamPutBits(&bs, pMB->mode, MODEBITS);
  484. }
  485. if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)
  486. {
  487. tmp.x  = pMB->mvs[0].x;
  488. tmp.y  = pMB->mvs[0].y;
  489. tmp.x += (tmp.x < 0) ? high*2 : 0;
  490. tmp.y += (tmp.y < 0) ? high*2 : 0;
  491. if (hint->rawhints)
  492. {
  493. bhint->mvs[0].x = tmp.x;
  494. bhint->mvs[0].y = tmp.y;
  495. }
  496. else
  497. {
  498. BitstreamPutBits(&bs, tmp.x, length);
  499. BitstreamPutBits(&bs, tmp.y, length);
  500. }
  501. }
  502. else if (pMB->mode == MODE_INTER4V)
  503. {
  504. int vec;
  505. for (vec=0 ; vec<4 ; ++vec)
  506. {
  507. tmp.x  = pMB->mvs[vec].x;
  508. tmp.y  = pMB->mvs[vec].y;
  509. tmp.x += (tmp.x < 0) ? high*2 : 0;
  510. tmp.y += (tmp.y < 0) ? high*2 : 0;
  511. if (hint->rawhints)
  512. {
  513. bhint->mvs[vec].x = tmp.x;
  514. bhint->mvs[vec].y = tmp.y;
  515. }
  516. else
  517. {
  518. BitstreamPutBits(&bs, tmp.x, length);
  519. BitstreamPutBits(&bs, tmp.y, length);
  520. }
  521. }
  522. }
  523. }
  524. }
  525. if (!hint->rawhints)
  526. {
  527. BitstreamPad(&bs);
  528. hint->hintlength = BitstreamLength(&bs);
  529. }
  530. }
  531. static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits
  532. #ifdef MPEG4IP
  533. , bool vol_header
  534. #endif
  535. )
  536. {
  537. DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE);
  538. DECLARE_ALIGNED_MATRIX(qcoeff,    6, 64, int16_t, CACHE_LINE);
  539. uint16_t x, y;
  540. pEnc->iFrameNum = 0;
  541. pEnc->mbParam.rounding_type = 1;
  542. pEnc->mbParam.coding_type = I_VOP;
  543. #ifdef MPEG4IP
  544. if (vol_header) {
  545. BitstreamWriteVolHeader(bs, &pEnc->mbParam);
  546. }
  547. #else
  548. BitstreamWriteVolHeader(bs, &pEnc->mbParam);
  549. #endif
  550. BitstreamWriteVopHeader(bs, &pEnc->mbParam);
  551. *pBits = BitstreamPos(bs);
  552. pEnc->sStat.iTextBits = 0;
  553. pEnc->sStat.kblks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height;
  554. pEnc->sStat.mblks = pEnc->sStat.ublks = 0;
  555. for (y = 0; y < pEnc->mbParam.mb_height; y++)
  556. for (x = 0; x < pEnc->mbParam.mb_width; x++)
  557. {
  558. MACROBLOCK *pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width];
  559. CodeIntraMB(pEnc, pMB);
  560. MBTransQuantIntra(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, &pEnc->sCurrent);
  561. start_timer();
  562. MBPrediction(&pEnc->mbParam, x, y, pEnc->mbParam.mb_width, qcoeff, pEnc->pMBs);
  563. stop_prediction_timer();
  564. start_timer();
  565. MBCoding(&pEnc->mbParam, pMB, qcoeff, bs, &pEnc->sStat);
  566. stop_coding_timer();
  567. }
  568. emms();
  569. *pBits = BitstreamPos(bs) - *pBits;
  570. pEnc->sStat.fMvPrevSigma = -1;
  571. pEnc->sStat.iMvSum = 0;
  572. pEnc->sStat.iMvCount = 0;
  573. pEnc->mbParam.fixed_code = 2;
  574. if (pEnc->mbParam.global_flags & XVID_HINTEDME_GET)
  575. {
  576. HintedMEGet(pEnc, 1);
  577. }
  578. return 1;  // intra
  579. }
  580. #define INTRA_THRESHOLD 0.5
  581. static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header)
  582. {
  583. float fSigma;
  584. DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE);
  585. DECLARE_ALIGNED_MATRIX(qcoeff,    6, 64, int16_t, CACHE_LINE);
  586. int iLimit;
  587. uint32_t x, y;
  588. int iSearchRange;
  589. bool bIntra;
  590. IMAGE *pCurrent = &pEnc->sCurrent;
  591. IMAGE *pRef = &pEnc->sReference;
  592. start_timer();
  593. image_setedges(pRef,
  594.        pEnc->mbParam.edged_width,
  595.        pEnc->mbParam.edged_height,
  596.        pEnc->mbParam.width,
  597.        pEnc->mbParam.height,
  598.        pEnc->mbParam.global_flags & XVID_INTERLACING);
  599. stop_edges_timer();
  600. pEnc->mbParam.rounding_type = 1 - pEnc->mbParam.rounding_type;
  601. if (!force_inter)
  602. iLimit = (int)(pEnc->mbParam.mb_width * pEnc->mbParam.mb_height * INTRA_THRESHOLD);
  603. else
  604. iLimit = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height + 1;
  605. if ((pEnc->mbParam.global_flags & XVID_HALFPEL) > 0) {
  606. start_timer();
  607. image_interpolate(pRef, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV,
  608.   pEnc->mbParam.edged_width, pEnc->mbParam.edged_height,
  609.   pEnc->mbParam.rounding_type);
  610. stop_inter_timer();
  611. }
  612. start_timer();
  613. if (pEnc->mbParam.global_flags & XVID_HINTEDME_SET)
  614. {
  615. HintedMESet(pEnc, &bIntra);
  616. }
  617. else
  618. {
  619. bIntra = MotionEstimation(pEnc->pMBs, &pEnc->mbParam, &pEnc->sReference,
  620.   &pEnc->vInterH, &pEnc->vInterV,
  621.   &pEnc->vInterHV, &pEnc->sCurrent, iLimit);
  622. }
  623. stop_motion_timer();
  624. if (bIntra == 1)
  625. {
  626. #ifdef MPEG4IP
  627. return FrameCodeI(pEnc, bs, pBits, vol_header);
  628. #else
  629. return FrameCodeI(pEnc, bs, pBits);
  630. #endif
  631. }
  632. pEnc->mbParam.coding_type = P_VOP;
  633. if(vol_header)
  634. BitstreamWriteVolHeader(bs, &pEnc->mbParam);
  635. BitstreamWriteVopHeader(bs, &pEnc->mbParam);
  636. *pBits = BitstreamPos(bs);
  637. pEnc->sStat.iTextBits = 0;
  638. pEnc->sStat.iMvSum = 0;
  639. pEnc->sStat.iMvCount = 0;
  640. pEnc->sStat.kblks = pEnc->sStat.mblks = pEnc->sStat.ublks = 0;
  641. for(y = 0; y < pEnc->mbParam.mb_height; y++)
  642. {
  643. for(x = 0; x < pEnc->mbParam.mb_width; x++)
  644. {
  645. MACROBLOCK * pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width];
  646. bIntra = (pMB->mode == MODE_INTRA) || (pMB->mode == MODE_INTRA_Q);
  647. if (!bIntra)
  648. {
  649. start_timer();
  650. MBMotionCompensation(pMB,
  651.      x, y,
  652.      &pEnc->sReference,
  653.      &pEnc->vInterH,
  654.      &pEnc->vInterV,
  655.      &pEnc->vInterHV,
  656.      &pEnc->sCurrent,
  657.      dct_codes,
  658.      pEnc->mbParam.width,
  659.      pEnc->mbParam.height,
  660.      pEnc->mbParam.edged_width,
  661.      pEnc->mbParam.rounding_type);
  662. stop_comp_timer();
  663. if ((pEnc->mbParam.global_flags & XVID_LUMIMASKING) > 0) {
  664. if(pMB->dquant != NO_CHANGE) {
  665. pMB->mode = MODE_INTER_Q;
  666. pEnc->mbParam.quant += DQtab[pMB->dquant];
  667. if (pEnc->mbParam.quant > 31) pEnc->mbParam.quant = 31;
  668. else if(pEnc->mbParam.quant < 1) pEnc->mbParam.quant = 1;
  669. }
  670. }
  671. pMB->quant = pEnc->mbParam.quant;
  672. pMB->field_pred = 0;
  673. pMB->cbp = MBTransQuantInter(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, pCurrent);
  674. }
  675. else 
  676. {
  677. CodeIntraMB(pEnc, pMB);
  678. MBTransQuantIntra(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, pCurrent);
  679. }
  680. start_timer();
  681. MBPrediction(&pEnc->mbParam, x, y, pEnc->mbParam.mb_width, qcoeff, pEnc->pMBs);
  682. stop_prediction_timer();
  683. if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q)
  684. {
  685. pEnc->sStat.kblks++;
  686. }
  687. else if (pMB->cbp || 
  688.  pMB->mvs[0].x || pMB->mvs[0].y ||
  689.  pMB->mvs[1].x || pMB->mvs[1].y ||
  690.  pMB->mvs[2].x || pMB->mvs[2].y ||
  691.  pMB->mvs[3].x || pMB->mvs[3].y)
  692. {
  693. pEnc->sStat.mblks++;
  694. }
  695. else
  696. {
  697. pEnc->sStat.ublks++;
  698. }
  699. start_timer();
  700. MBCoding(&pEnc->mbParam, pMB, qcoeff, bs, &pEnc->sStat);
  701. stop_coding_timer();
  702. }
  703. }
  704. emms();
  705. if (pEnc->mbParam.global_flags & XVID_HINTEDME_GET)
  706. {
  707. HintedMEGet(pEnc, 0);
  708. }
  709. if (pEnc->sStat.iMvCount == 0)
  710. pEnc->sStat.iMvCount = 1;
  711. fSigma = (float)sqrt((float) pEnc->sStat.iMvSum / pEnc->sStat.iMvCount);
  712. iSearchRange = 1 << (3 + pEnc->mbParam.fixed_code);
  713. if ((fSigma > iSearchRange / 3) 
  714.     && (pEnc->mbParam.fixed_code <= 3)) // maximum search range 128
  715. {
  716. pEnc->mbParam.fixed_code++;
  717. iSearchRange *= 2;
  718. }
  719. else if ((fSigma < iSearchRange / 6)
  720.  && (pEnc->sStat.fMvPrevSigma >= 0)
  721.  && (pEnc->sStat.fMvPrevSigma < iSearchRange / 6)
  722.  && (pEnc->mbParam.fixed_code >= 2)) // minimum search range 16
  723. {
  724. pEnc->mbParam.fixed_code--;
  725. iSearchRange /= 2;
  726. }
  727. pEnc->sStat.fMvPrevSigma = fSigma;
  728.     
  729. *pBits = BitstreamPos(bs) - *pBits;
  730. return 0;  // inter
  731. }