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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************
  2.  *
  3.  * XVID MPEG-4 VIDEO CODEC
  4.  * decoder main
  5.  *
  6.  * This program is an implementation of a part of one or more MPEG-4
  7.  * Video tools as specified in ISO/IEC 14496-2 standard.  Those intending
  8.  * to use this software module in hardware or software products are
  9.  * advised that its use may infringe existing patents or copyrights, and
  10.  * any such use would be at such party's own risk.  The original
  11.  * developer of this software module and his/her company, and subsequent
  12.  * editors and their companies, will have no liability for use of this
  13.  * software or modifications or derivatives thereof.
  14.  *
  15.  * This program is xvid_free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the xvid_free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  *
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the xvid_free Software
  27.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  28.  *
  29.  *************************************************************************/
  30. /**************************************************************************
  31.  *
  32.  * History:
  33.  *
  34.  *  29.03.2002  interlacing fix - compensated block wasn't being used when
  35.  *              reconstructing blocks, thus artifacts
  36.  *              interlacing speedup - used transfers to re-interlace
  37.  *              interlaced decoding should be as fast as progressive now
  38.  *  26.03.2002  interlacing support - moved transfers outside decode loop
  39.  * 26.12.2001 decoder_mbinter: dequant/idct moved within if(coded) block
  40.  * 22.12.2001 block based interpolation
  41.  * 01.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
  42.  *
  43.  *************************************************************************/
  44. #include <stdlib.h>
  45. #include <string.h>  // memset
  46. #include "xvid.h"
  47. #include "portab.h"
  48. #include "decoder.h"
  49. #include "bitstream/bitstream.h"
  50. #include "bitstream/mbcoding.h"
  51. #include "quant/quant_h263.h"
  52. #include "quant/quant_mpeg4.h"
  53. #include "dct/idct.h"
  54. #include "dct/fdct.h"
  55. #include "utils/mem_transfer.h"
  56. #include "image/interpolate8x8.h"
  57. #include "bitstream/mbcoding.h"
  58. #include "prediction/mbprediction.h"
  59. #include "utils/timer.h"
  60. #include "utils/emms.h"
  61. #include "image/image.h"
  62. #include "image/colorspace.h"
  63. #include "utils/mem_align.h"
  64. int decoder_alloc(XVID_DEC_PARAM * param)
  65. {
  66.   param->handle = xvid_malloc(sizeof(DECODER), CACHE_LINE);
  67.   if (param->handle == NULL) 
  68.     return XVID_ERR_MEMORY;
  69.   return XVID_ERR_OK;
  70. }
  71. int decoder_initialize (DECODER *dec)
  72. {
  73. dec->mb_width = (dec->width + 15) / 16;
  74. dec->mb_height = (dec->height + 15) / 16;
  75. dec->edged_width = 16 * dec->mb_width + 2 * EDGE_SIZE;
  76. dec->edged_height = 16 * dec->mb_height + 2 * EDGE_SIZE;
  77. if (image_create(&dec->cur, dec->edged_width, dec->edged_height))
  78. {
  79. xvid_free(dec);
  80. return XVID_ERR_MEMORY;
  81. }
  82. if (image_create(&dec->refn, dec->edged_width, dec->edged_height))
  83. {
  84. image_destroy(&dec->cur, dec->edged_width, dec->edged_height);
  85. xvid_free(dec);
  86. return XVID_ERR_MEMORY;
  87. }
  88. dec->mbs = xvid_malloc(sizeof(MACROBLOCK) * dec->mb_width * dec->mb_height, CACHE_LINE);
  89. if (dec->mbs == NULL)
  90. {
  91. image_destroy(&dec->cur, dec->edged_width, dec->edged_height);
  92. xvid_free(dec);
  93. return XVID_ERR_MEMORY;
  94. }
  95. init_timer();
  96. return XVID_ERR_OK;
  97. }
  98. int decoder_create(XVID_DEC_PARAM * param)
  99. {
  100.   DECODER *dec;
  101.   decoder_alloc(param);
  102.   if (param->handle == NULL) return XVID_ERR_MEMORY;
  103.   dec = param->handle;
  104.   dec->width = param->width;
  105.   dec->height = param->height;
  106.   return (decoder_initialize(dec));
  107. }
  108. int decoder_destroy(DECODER * dec)
  109. {
  110. if (dec->mbs != NULL)
  111.    xvid_free(dec->mbs);
  112. image_destroy(&dec->refn, dec->edged_width, dec->edged_height);
  113. image_destroy(&dec->cur, dec->edged_width, dec->edged_height);
  114. xvid_free(dec);
  115. write_timer();
  116. return XVID_ERR_OK;
  117. }
  118. static const int32_t dquant_table[4] =
  119. {
  120. -1, -2, 1, 2
  121. };
  122. // decode an intra macroblock
  123. static
  124. void decoder_mbintra(DECODER * dec,
  125.      MACROBLOCK * pMB,
  126.      const uint32_t x_pos,
  127.      const uint32_t y_pos,
  128.      const uint32_t acpred_flag,
  129.      const uint32_t cbp,
  130.      Bitstream * bs,
  131.      const uint32_t quant,
  132.      const uint32_t intra_dc_threshold)
  133. {
  134. DECLARE_ALIGNED_MATRIX(block, 6, 64, int16_t, CACHE_LINE);
  135. DECLARE_ALIGNED_MATRIX(data,  6, 64, int16_t, CACHE_LINE);
  136. uint32_t stride = dec->edged_width;
  137. uint32_t stride2 = stride / 2;
  138. uint32_t next_block = stride * 8;
  139. uint32_t i;
  140. uint32_t iQuant = pMB->quant;
  141. uint8_t *pY_Cur, *pU_Cur, *pV_Cur;
  142. pY_Cur = dec->cur.y + (y_pos << 4) * stride + (x_pos << 4);
  143. pU_Cur = dec->cur.u + (y_pos << 3) * stride2 + (x_pos << 3);
  144. pV_Cur = dec->cur.v + (y_pos << 3) * stride2 + (x_pos << 3);
  145. memset(block, 0, 6*64*sizeof(int16_t)); // clear
  146. for (i = 0; i < 6; i++)
  147. {
  148. uint32_t iDcScaler = get_dc_scaler(iQuant, i < 4);
  149. int16_t predictors[8];
  150. int start_coeff;
  151. start_timer();
  152. predict_acdc(dec->mbs, x_pos, y_pos, dec->mb_width, i, &block[i*64], iQuant, iDcScaler, predictors);
  153. if (!acpred_flag)
  154. {
  155. pMB->acpred_directions[i] = 0;
  156. }
  157. stop_prediction_timer();
  158. if (quant < intra_dc_threshold)
  159. {
  160. int dc_size;
  161. int dc_dif;
  162. dc_size = i < 4 ?  get_dc_size_lum(bs) : get_dc_size_chrom(bs);
  163. dc_dif = dc_size ? get_dc_dif(bs, dc_size) : 0 ;
  164. if (dc_size > 8)
  165. {
  166. BitstreamSkip(bs, 1); // marker
  167. }
  168. block[i*64 + 0] = dc_dif;
  169. start_coeff = 1;
  170. }
  171. else
  172. {
  173. start_coeff = 0;
  174. }
  175. start_timer();
  176. if (cbp & (1 << (5-i))) // coded
  177. {
  178. get_intra_block(bs, &block[i*64], pMB->acpred_directions[i], start_coeff);
  179. }
  180. stop_coding_timer();
  181. start_timer();
  182. add_acdc(pMB, i, &block[i*64], iDcScaler, predictors);
  183. stop_prediction_timer();
  184. start_timer();
  185. if (dec->quant_type == 0)
  186. {
  187. dequant_intra(&data[i*64], &block[i*64], iQuant, iDcScaler);
  188. }
  189. else
  190. {
  191. dequant4_intra(&data[i*64], &block[i*64], iQuant, iDcScaler);
  192. }
  193. stop_iquant_timer();
  194. start_timer();
  195. idct(&data[i*64]);
  196. stop_idct_timer();
  197. }
  198. if (dec->interlacing && pMB->field_dct)
  199. {
  200. next_block = stride;
  201. stride *= 2;
  202. }
  203. start_timer();
  204. transfer_16to8copy(pY_Cur,                  &data[0*64], stride);
  205. transfer_16to8copy(pY_Cur + 8,              &data[1*64], stride);
  206. transfer_16to8copy(pY_Cur + next_block,     &data[2*64], stride);
  207. transfer_16to8copy(pY_Cur + 8 + next_block, &data[3*64], stride);
  208. transfer_16to8copy(pU_Cur,                  &data[4*64], stride2);
  209. transfer_16to8copy(pV_Cur,                  &data[5*64], stride2);
  210. stop_transfer_timer();
  211. }
  212. #define SIGN(X) (((X)>0)?1:-1)
  213. #define ABS(X) (((X)>0)?(X):-(X))
  214. static const uint32_t roundtab[16] =
  215. { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 };
  216. // decode an inter macroblock
  217. static void decoder_mbinter(DECODER * dec,
  218.     const MACROBLOCK * pMB,
  219.     const uint32_t x_pos,
  220.     const uint32_t y_pos,
  221.     const uint32_t acpred_flag,
  222.     const uint32_t cbp,
  223.     Bitstream * bs,
  224.     const uint32_t quant,
  225.     const uint32_t rounding)
  226. {
  227. DECLARE_ALIGNED_MATRIX(block,6, 64, int16_t, CACHE_LINE);
  228. DECLARE_ALIGNED_MATRIX(data, 6, 64, int16_t, CACHE_LINE);
  229. uint32_t stride = dec->edged_width;
  230. uint32_t stride2 = stride / 2;
  231. uint32_t next_block = stride * 8;
  232. uint32_t i;
  233. uint32_t iQuant = pMB->quant;
  234. uint8_t *pY_Cur, *pU_Cur, *pV_Cur;
  235. int uv_dx, uv_dy;
  236. pY_Cur = dec->cur.y + (y_pos << 4) * stride + (x_pos << 4);
  237. pU_Cur = dec->cur.u + (y_pos << 3) * stride2 + (x_pos << 3);
  238. pV_Cur = dec->cur.v + (y_pos << 3) * stride2 + (x_pos << 3);
  239. if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)
  240. {
  241. uv_dx = pMB->mvs[0].x;
  242. uv_dy = pMB->mvs[0].y;
  243. uv_dx = (uv_dx & 3) ? (uv_dx >> 1) | 1 : uv_dx / 2;
  244. uv_dy = (uv_dy & 3) ? (uv_dy >> 1) | 1 : uv_dy / 2;
  245. }
  246. else
  247. {
  248. int sum;
  249. sum = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x;
  250. uv_dx = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2) );
  251. sum = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y;
  252. uv_dy = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2) );
  253. }
  254. start_timer();
  255. interpolate8x8_switch(dec->cur.y, dec->refn.y, 16*x_pos,     16*y_pos    , pMB->mvs[0].x, pMB->mvs[0].y, stride,  rounding);
  256. interpolate8x8_switch(dec->cur.y, dec->refn.y, 16*x_pos + 8, 16*y_pos    , pMB->mvs[1].x, pMB->mvs[1].y, stride,  rounding);
  257. interpolate8x8_switch(dec->cur.y, dec->refn.y, 16*x_pos,     16*y_pos + 8, pMB->mvs[2].x, pMB->mvs[2].y, stride,  rounding);
  258. interpolate8x8_switch(dec->cur.y, dec->refn.y, 16*x_pos + 8, 16*y_pos + 8, pMB->mvs[3].x, pMB->mvs[3].y, stride,  rounding);
  259. interpolate8x8_switch(dec->cur.u, dec->refn.u, 8*x_pos,      8*y_pos,      uv_dx,         uv_dy,         stride2, rounding);
  260. interpolate8x8_switch(dec->cur.v, dec->refn.v, 8*x_pos,      8*y_pos,      uv_dx,         uv_dy,         stride2, rounding);
  261. stop_comp_timer();
  262. for (i = 0; i < 6; i++)
  263. {
  264. if (cbp & (1 << (5-i))) // coded
  265. {
  266. memset(&block[i*64], 0, 64 * sizeof(int16_t)); // clear
  267. start_timer();
  268. get_inter_block(bs, &block[i*64]);
  269. stop_coding_timer();
  270. start_timer();
  271. if (dec->quant_type == 0)
  272. {
  273. dequant_inter(&data[i*64], &block[i*64], iQuant);
  274. }
  275. else
  276. {
  277. dequant4_inter(&data[i*64], &block[i*64], iQuant);
  278. }
  279. stop_iquant_timer();
  280. start_timer();
  281. idct(&data[i*64]);
  282. stop_idct_timer();
  283. }
  284. }
  285. if (dec->interlacing && pMB->field_dct)
  286. {
  287. next_block = stride;
  288. stride *= 2;
  289. }
  290. start_timer();
  291. if (cbp & 32)
  292. transfer_16to8add(pY_Cur,                  &data[0*64], stride);
  293. if (cbp & 16)
  294. transfer_16to8add(pY_Cur + 8,              &data[1*64], stride);
  295. if (cbp & 8)
  296. transfer_16to8add(pY_Cur + next_block,     &data[2*64], stride);
  297. if (cbp & 4)
  298. transfer_16to8add(pY_Cur + 8 + next_block, &data[3*64], stride);
  299. if (cbp & 2)
  300. transfer_16to8add(pU_Cur,                  &data[4*64], stride2);
  301. if (cbp & 1)
  302. transfer_16to8add(pV_Cur,                  &data[5*64], stride2);
  303. stop_transfer_timer();
  304. }
  305. static void decoder_iframe(DECODER * dec, Bitstream * bs, int quant, int intra_dc_threshold)
  306. {
  307. uint32_t x, y;
  308. for (y = 0; y < dec->mb_height; y++)
  309. {
  310. for (x = 0; x < dec->mb_width; x++)
  311. {
  312. MACROBLOCK * mb = &dec->mbs[y*dec->mb_width + x];
  313. uint32_t mcbpc;
  314. uint32_t cbpc;
  315. uint32_t acpred_flag;
  316. uint32_t cbpy;
  317. uint32_t cbp;
  318. mcbpc = get_mcbpc_intra(bs);
  319. mb->mode = mcbpc & 7;
  320. cbpc = (mcbpc >> 4);
  321. acpred_flag = BitstreamGetBit(bs);
  322. if (mb->mode == MODE_STUFFING)
  323. {
  324. DEBUG("-- STUFFING ?");
  325. continue;
  326. }
  327. cbpy = get_cbpy(bs, 1);
  328. cbp = (cbpy << 2) | cbpc;
  329. if (mb->mode == MODE_INTRA_Q)
  330. {
  331. quant += dquant_table[BitstreamGetBits(bs,2)];
  332. if (quant > 31)
  333. {
  334. quant = 31;
  335. }
  336. else if (quant < 1)
  337. {
  338. quant = 1;
  339. }
  340. }
  341. mb->quant = quant;
  342. if (dec->interlacing)
  343. {
  344. mb->field_dct = BitstreamGetBit(bs);
  345. DEBUG1("deci: field_dct: ", mb->field_dct);
  346. }
  347. decoder_mbintra(dec, mb, x, y, acpred_flag, cbp, bs, quant, intra_dc_threshold);
  348. }
  349. }
  350. }
  351. static void get_motion_vector(DECODER *dec, Bitstream *bs, int x, int y, int k, VECTOR * mv, int fcode)
  352. {
  353. int scale_fac = 1 << (fcode - 1);
  354. int high = (32 * scale_fac) - 1;
  355. int low = ((-32) * scale_fac);
  356. int range = (64 * scale_fac);
  357. VECTOR pmv[4];
  358. uint32_t psad[4];
  359. int mv_x, mv_y;
  360. int pmv_x, pmv_y;
  361. get_pmvdata(dec->mbs, x, y, dec->mb_width, k, pmv, psad);
  362. pmv_x = pmv[0].x;
  363. pmv_y = pmv[0].y;
  364. mv_x = get_mv(bs, fcode);
  365. mv_y = get_mv(bs, fcode);
  366. mv_x += pmv_x;
  367. mv_y += pmv_y;
  368. if (mv_x < low)
  369. {
  370. mv_x += range;
  371. else if (mv_x > high)
  372. {
  373. mv_x -= range;
  374. }
  375. if (mv_y < low)
  376. {
  377. mv_y += range;
  378. else if (mv_y > high)
  379. {
  380. mv_y -= range;
  381. }
  382. mv->x = mv_x;
  383. mv->y = mv_y;
  384. }
  385. static
  386. void decoder_pframe(DECODER * dec, Bitstream * bs, int rounding, int quant, int fcode, int intra_dc_threshold)
  387. {
  388. uint32_t x, y;
  389. image_swap(&dec->cur, &dec->refn);
  390. start_timer();
  391. image_setedges(&dec->refn, dec->edged_width, dec->edged_height, dec->width, dec->height, dec->interlacing);
  392. stop_edges_timer();
  393. for (y = 0; y < dec->mb_height; y++)
  394. {
  395. for (x = 0; x < dec->mb_width; x++)
  396. {
  397. MACROBLOCK * mb = &dec->mbs[y*dec->mb_width + x];
  398. if (!BitstreamGetBit(bs)) // not_coded
  399. {
  400. uint32_t mcbpc;
  401. uint32_t cbpc;
  402. uint32_t acpred_flag;
  403. uint32_t cbpy;
  404. uint32_t cbp;
  405. uint32_t intra;
  406. mcbpc = get_mcbpc_inter(bs);
  407. mb->mode = mcbpc & 7;
  408. cbpc = (mcbpc >> 4);
  409. acpred_flag = 0;
  410. intra = (mb->mode == MODE_INTRA || mb->mode == MODE_INTRA_Q);
  411. if (intra)
  412. {
  413. acpred_flag = BitstreamGetBit(bs);
  414. }
  415. if (mb->mode == MODE_STUFFING)
  416. {
  417. DEBUG("-- STUFFING ?");
  418. continue;
  419. }
  420. cbpy = get_cbpy(bs, intra);
  421. cbp = (cbpy << 2) | cbpc;
  422. if (mb->mode == MODE_INTER_Q || mb->mode == MODE_INTRA_Q)
  423. {
  424. quant += dquant_table[BitstreamGetBits(bs,2)];
  425. if (quant > 31)
  426. {
  427. quant = 31;
  428. }
  429. else if (mb->quant < 1)
  430. {
  431. quant = 1;
  432. }
  433. }
  434. mb->quant = quant;
  435. if (dec->interlacing)
  436. {
  437. mb->field_dct = BitstreamGetBit(bs);
  438. DEBUG1("decp: field_dct: ", mb->field_dct);
  439. if (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q)
  440. {
  441. mb->field_pred = BitstreamGetBit(bs);
  442. DEBUG1("decp: field_pred: ", mb->field_pred);
  443. if (mb->field_pred)
  444. {
  445. mb->field_for_top = BitstreamGetBit(bs);
  446. DEBUG1("decp: field_for_top: ", mb->field_for_top);
  447. mb->field_for_bot = BitstreamGetBit(bs);
  448. DEBUG1("decp: field_for_bot: ", mb->field_for_bot);
  449. }
  450. }
  451. }
  452. if (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q)
  453. {
  454. if (dec->interlacing && mb->field_pred)
  455. {
  456. get_motion_vector(dec, bs, x, y, 0, &mb->mvs[0], fcode);
  457. get_motion_vector(dec, bs, x, y, 0, &mb->mvs[1], fcode);
  458. }
  459. else
  460. {
  461. get_motion_vector(dec, bs, x, y, 0, &mb->mvs[0], fcode);
  462. mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = mb->mvs[0].x;
  463. mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = mb->mvs[0].y;
  464. }
  465. }
  466. else if (mb->mode == MODE_INTER4V /* || mb->mode == MODE_INTER4V_Q */)
  467. {
  468. get_motion_vector(dec, bs, x, y, 0, &mb->mvs[0], fcode);
  469. get_motion_vector(dec, bs, x, y, 1, &mb->mvs[1], fcode);
  470. get_motion_vector(dec, bs, x, y, 2, &mb->mvs[2], fcode);
  471. get_motion_vector(dec, bs, x, y, 3, &mb->mvs[3], fcode);
  472. }
  473. else  // MODE_INTRA, MODE_INTRA_Q
  474. {
  475. mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = 0;
  476. mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = 0;
  477. decoder_mbintra(dec, mb, x, y, acpred_flag, cbp, bs, quant, intra_dc_threshold);
  478. continue;
  479. }
  480. decoder_mbinter(dec, mb, x, y, acpred_flag, cbp, bs, quant, rounding);
  481. }
  482. else // not coded
  483. {
  484. mb->mode = MODE_NOT_CODED; 
  485. mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = 0;
  486. mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = 0;
  487. // copy macroblock directly from ref to cur
  488. start_timer();
  489. transfer8x8_copy(dec->cur.y + (16*y)*dec->edged_width + (16*x), 
  490.  dec->refn.y + (16*y)*dec->edged_width + (16*x), 
  491.  dec->edged_width);
  492. transfer8x8_copy(dec->cur.y + (16*y)*dec->edged_width + (16*x+8), 
  493.  dec->refn.y + (16*y)*dec->edged_width + (16*x+8), 
  494.  dec->edged_width);
  495. transfer8x8_copy(dec->cur.y + (16*y+8)*dec->edged_width + (16*x), 
  496.  dec->refn.y + (16*y+8)*dec->edged_width + (16*x), 
  497.  dec->edged_width);
  498. transfer8x8_copy(dec->cur.y + (16*y+8)*dec->edged_width + (16*x+8), 
  499.  dec->refn.y + (16*y+8)*dec->edged_width + (16*x+8), 
  500.  dec->edged_width);
  501. transfer8x8_copy(dec->cur.u + (8*y)*dec->edged_width/2 + (8*x), 
  502.  dec->refn.u + (8*y)*dec->edged_width/2 + (8*x), 
  503.  dec->edged_width/2);
  504. transfer8x8_copy(dec->cur.v + (8*y)*dec->edged_width/2 + (8*x), 
  505.  dec->refn.v + (8*y)*dec->edged_width/2 + (8*x), 
  506.  dec->edged_width/2);
  507. stop_transfer_timer();
  508. }
  509. }
  510. }
  511. }
  512. int decoder_decode(DECODER * dec, XVID_DEC_FRAME * frame)
  513. {
  514. Bitstream bs;
  515. uint32_t rounding;
  516. uint32_t quant;
  517. uint32_t fcode;
  518. uint32_t intra_dc_threshold;
  519. start_global_timer();
  520. BitstreamInit(&bs, frame->bitstream, frame->length);
  521. switch (BitstreamReadHeaders(&bs, dec, &rounding, &quant, &fcode, &intra_dc_threshold, 0))
  522. {
  523. case P_VOP :
  524. decoder_pframe(dec, &bs, rounding, quant, fcode, intra_dc_threshold);
  525. break;
  526. case I_VOP :
  527. //DEBUG1("",intra_dc_threshold);
  528. decoder_iframe(dec, &bs, quant, intra_dc_threshold);
  529. break;
  530. case B_VOP : // ignore
  531. break;
  532. case N_VOP : // vop not coded
  533. break;
  534. default :
  535. return XVID_ERR_FAIL;
  536. }
  537. frame->length = BitstreamPos(&bs) / 8;
  538. start_timer();
  539. image_output(&dec->cur, dec->width, dec->height, dec->edged_width,
  540.      frame->image, frame->stride, frame->colorspace);
  541. stop_conv_timer();
  542. emms();
  543. stop_global_timer();
  544. return XVID_ERR_OK;
  545. }
  546. int decoder_find_vol (DECODER * dec, 
  547.       XVID_DEC_FRAME * frame, 
  548.       XVID_DEC_PARAM * param)
  549. {
  550. Bitstream bs;
  551. uint32_t rounding;
  552. uint32_t quant;
  553. uint32_t fcode;
  554. uint32_t intra_dc_threshold;
  555. int ret;
  556. BitstreamInit(&bs, frame->bitstream, frame->length);
  557. ret = BitstreamReadHeaders(&bs, dec, &rounding, &quant, &fcode, &intra_dc_threshold, 1);
  558. frame->length = BitstreamPos(&bs) / 8;
  559. if (ret > 0) {
  560.   param->width = dec->width;
  561.   param->height = dec->height;
  562.   return decoder_initialize(dec);
  563. }
  564. if (ret < 0) return XVID_ERR_FORMAT;
  565. return XVID_ERR_FAIL;
  566. }