Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

565 lines
17 KiB

  1. /* *************************************************************************
  2. ** INTEL Corporation Proprietary Information
  3. **
  4. ** This listing is supplied under the terms of a license
  5. ** agreement with INTEL Corporation and may not be copied
  6. ** nor disclosed except in accordance with the terms of
  7. ** that agreement.
  8. **
  9. ** Copyright (c) 1995 Intel Corporation.
  10. ** All Rights Reserved.
  11. **
  12. ** *************************************************************************
  13. */
  14. /*****************************************************************************
  15. *
  16. * d3pict.cpp
  17. *
  18. * Description:
  19. * This modules contains the picture header parsing routines
  20. *
  21. * Routines:
  22. * H263ReadPictureHeader
  23. *
  24. * Data:
  25. */
  26. /* $Header: S:\h26x\src\dec\d3pict.cpv 1.21 05 Feb 1997 12:24:30 JMCVEIGH $
  27. * $Log: S:\h26x\src\dec\d3pict.cpv $
  28. //
  29. // Rev 1.21 05 Feb 1997 12:24:30 JMCVEIGH
  30. // Support for latest H.263+ draft bitstream spec.
  31. //
  32. // Rev 1.20 16 Dec 1996 17:42:56 JMCVEIGH
  33. // Existence of extended PTYPE implies improved PB-frame mode if
  34. // a PB-frame. Also, initialized H.263+ optional flags if EPTYPE not
  35. // read.
  36. //
  37. // Rev 1.19 11 Dec 1996 14:59:12 JMCVEIGH
  38. //
  39. // Allow deblocking filter in reading of picture header.
  40. //
  41. // Rev 1.18 09 Dec 1996 18:02:10 JMCVEIGH
  42. // Added support for arbitrary frame sizes.
  43. //
  44. // Rev 1.17 31 Oct 1996 10:18:22 KLILLEVO
  45. // changed one (commented out) DBOUT to DbgLog
  46. //
  47. // Rev 1.16 20 Oct 1996 15:49:50 AGUPTA2
  48. // Adjusted DbgLog trace levels; 4:Frame, 5:GOB, 6:MB, 8:everything
  49. //
  50. // Rev 1.15 20 Oct 1996 14:05:54 AGUPTA2
  51. // Minor change in one of the DbgLog calls.
  52. //
  53. //
  54. // Rev 1.14 20 Oct 1996 13:21:44 AGUPTA2
  55. // Changed DBOUT into DbgLog. ASSERT is not changed to DbgAssert.
  56. //
  57. //
  58. // Rev 1.13 30 May 1996 10:16:32 KLILLEVO
  59. // removed to variables only needed for DEBUG_DECODER
  60. //
  61. // Rev 1.12 30 May 1996 10:14:44 KLILLEVO
  62. // removed one debug statement
  63. //
  64. // Rev 1.11 24 May 1996 10:47:00 KLILLEVO
  65. // added ifdef _DEBUG arounf wsprintf
  66. //
  67. // Rev 1.10 03 May 1996 13:06:36 CZHU
  68. //
  69. // Check bit 2 for packet loss errors to trigger packet loss recovery
  70. //
  71. // Rev 1.9 18 Dec 1995 12:49:54 RMCKENZX
  72. // added copyright notice & log stamp
  73. */
  74. #include "precomp.h"
  75. /* BIT field Constants
  76. */
  77. const int BITS_PICTURE_STARTCODE = 22;
  78. #ifdef SIM_OUT_OF_DATE
  79. const int BITS_TR = 5;
  80. #else
  81. const int BITS_TR = 8;
  82. #endif
  83. const int BIT_ONE_VAL = 1;
  84. const int BIT_TWO_VAL = 0;
  85. const int BITS_PTYPE_SOURCE_FORMAT = 3;
  86. #ifdef H263P
  87. // H.263+ draft, document LBC-96-358R3
  88. const int BITS_EPTYPE_RESERVED = 5;
  89. const int EPTYPE_RESERVED_VAL = 1;
  90. const int BITS_CSFMT_PARC = 4; // Custom source format pixel aspect ratio code
  91. const int BITS_CSFMT_FWI = 9; // Custom source format frame width indication
  92. const int BIT_CSFMT_14_VAL = 1; // Prevents start code emulation
  93. const int BITS_CSFMT_FHI = 9; // Custom source format frame height indication
  94. const int BITS_PAR_WIDTH = 8; // Pixel aspect ratio width
  95. const int BITS_PAR_HEIGHT = 8; // Pixel aspect ratio height
  96. #endif
  97. const int BITS_PQUANT = 5;
  98. const int BITS_TRB = 3;
  99. const int BITS_DBQUANT = 2;
  100. const int BITS_PSPARE = 8; //not includeing the following PEI
  101. /* PSC_VALUE - 0000 0000 0000 0000 - 1000 00xx xxxx xxxx
  102. */
  103. const U32 PSC_VALUE = (0x00008000 >> (32-BITS_PICTURE_STARTCODE));
  104. /* We only want to search so far before it is considered an error
  105. */
  106. const int MAX_LOOKAHEAD_NUMBER = 256; /* number of bits */
  107. /*****************************************************************************
  108. *
  109. * H263DecodePictureHeader
  110. *
  111. * Read and parse the picture header - updating the fpbsState if the read
  112. * succeeds.
  113. *
  114. * Returns an ICERR_STATUS
  115. */
  116. extern I32
  117. H263DecodePictureHeader(
  118. T_H263DecoderCatalog FAR * DC,
  119. U8 FAR * fpu8,
  120. U32 uBitsReady,
  121. U32 uWork,
  122. BITSTREAM_STATE FAR * fpbsState)
  123. {
  124. I32 iReturn;
  125. int iLookAhead;
  126. U32 uResult;
  127. U32 uData;
  128. int iSpareCount;
  129. FX_ENTRY("H263DecodePictureHeader")
  130. // PSC ----------------------------------------
  131. GET_FIXED_BITS((U32) BITS_PICTURE_STARTCODE, fpu8, uWork, uBitsReady,
  132. uResult);
  133. iLookAhead = 0;
  134. while (uResult != PSC_VALUE)
  135. {
  136. uResult = uResult << 1;
  137. uResult &= GetBitsMask[BITS_PICTURE_STARTCODE];
  138. GET_ONE_BIT(fpu8, uWork, uBitsReady, uData);
  139. uResult |= uData;
  140. iLookAhead++;
  141. if (iLookAhead > MAX_LOOKAHEAD_NUMBER)
  142. {
  143. ERRORMESSAGE(("%s: Missing PSC\r\n", _fx_));
  144. iReturn = ICERR_ERROR;
  145. goto done;
  146. }
  147. }
  148. GET_FIXED_BITS((U32) BITS_TR, fpu8, uWork, uBitsReady, uResult);
  149. DC->uTempRefPrev = DC->uTempRef;
  150. DC->uTempRef = uResult;
  151. // PTYPE ----------------------------------------
  152. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  153. if (uResult != BIT_ONE_VAL)
  154. {
  155. ERRORMESSAGE(("%s: PTYPE bit 1 error\r\n", _fx_));
  156. iReturn = ICERR_ERROR;
  157. goto done;
  158. }
  159. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  160. if (uResult != BIT_TWO_VAL)
  161. {
  162. ERRORMESSAGE(("%s: PTYPE bit 2 error\r\n", _fx_));
  163. //#ifdef LOSS_RECOVERY
  164. GET_BITS_SAVE_STATE(fpu8, uWork, uBitsReady, fpbsState);
  165. iReturn = PACKET_FAULT;
  166. //#endif
  167. goto done;
  168. }
  169. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  170. DC->bSplitScreen = (U16) uResult;
  171. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  172. DC->bCameraOn = (U16) uResult;
  173. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  174. DC->bFreezeRelease = (U16) uResult;
  175. GET_FIXED_BITS((U32) BITS_PTYPE_SOURCE_FORMAT, fpu8, uWork, uBitsReady,
  176. uResult);
  177. #ifdef H263P
  178. // We don't need to check that the frame dimensions are supported here.
  179. // This is handled in DecompressQuery()
  180. // Custom format is forbidden in PTYPE
  181. if (uResult == SRC_FORMAT_FORBIDDEN || uResult == SRC_FORMAT_CUSTOM)
  182. {
  183. ERRORMESSAGE(("%s: Forbidden src format\r\n", _fx_));
  184. iReturn = ICERR_ERROR;
  185. goto done;
  186. }
  187. #else
  188. #ifdef USE_BILINEAR_MSH26X
  189. if (uResult == SRC_FORMAT_FORBIDDEN)
  190. #else
  191. if (uResult == SRC_FORMAT_FORBIDDEN || uResult > SRC_FORMAT_CIF)
  192. #endif
  193. {
  194. ERRORMESSAGE(("%s: Src format not supported\r\n", _fx_));
  195. iReturn = ICERR_ERROR;
  196. goto done;
  197. }
  198. #endif
  199. DC->uPrevSrcFormat = DC->uSrcFormat;
  200. DC->uSrcFormat = uResult;
  201. #ifdef H263P
  202. // We don't support changes in the source format between frames. However,
  203. // if either the current or previous source format in PTYPE indicates
  204. // extended PTYPE, we do not know if the actual format (i.e., frame size)
  205. // has changed, yet
  206. if (DC->bReadSrcFormat && DC->uPrevSrcFormat != DC->uSrcFormat &&
  207. DC->uSrcFormat != SRC_FORMAT_EPTYPE)
  208. #else
  209. if (DC->bReadSrcFormat && DC->uPrevSrcFormat != DC->uSrcFormat)
  210. #endif
  211. {
  212. ERRORMESSAGE(("%s: Src format not supported\r\n", _fx_));
  213. iReturn = ICERR_ERROR;
  214. goto done;
  215. }
  216. #ifdef H263P
  217. // The actual source format has not been read if this is the
  218. // first frame and we detected an extended PTYPE
  219. if (DC->bReadSrcFormat || DC->uSrcFormat != SRC_FORMAT_EPTYPE)
  220. // We have read the actual source format, so mark flag as true.
  221. DC->bReadSrcFormat = 1;
  222. #else
  223. DC->bReadSrcFormat = 1;
  224. #endif
  225. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  226. DC->bKeyFrame = (U16) !uResult;
  227. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  228. DC->bUnrestrictedMotionVectors = (U16) uResult;
  229. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  230. DC->bArithmeticCoding = (U16) uResult;
  231. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  232. DC->bAdvancedPrediction = (U16) uResult;
  233. // If bit 12 is set to "1", bit 10 shall be set to "1" as well. (5.1.3 p14)
  234. /* if (DC->bAdvancedPrediction && !DC->bUnrestrictedMotionVectors) {
  235. ERRORMESSAGE(("%s: Warning: bit 12 is one and bit 10 is zero\r\n", _fx_));
  236. iReturn = ICERR_ERROR;
  237. goto done;
  238. } */
  239. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  240. DC->bPBFrame = (U16) uResult;
  241. // If bit 9 is set to "0", bit 13 shall be set to "0" as well." (5.1.3 p11)
  242. if (DC->bKeyFrame && DC->bPBFrame)
  243. {
  244. ERRORMESSAGE(("%s: A key frame can not be a PB frame\r\n", _fx_));
  245. iReturn = ICERR_ERROR;
  246. goto done;
  247. }
  248. #ifdef H263P
  249. // EPTYPE --------------------------------------
  250. if (DC->uSrcFormat == SRC_FORMAT_EPTYPE)
  251. {
  252. // Extended PTYPE detected in PTYPE.
  253. // We need to read the source format (again) and the optional mode flags.
  254. GET_FIXED_BITS((U32) BITS_PTYPE_SOURCE_FORMAT, fpu8, uWork, uBitsReady,
  255. uResult);
  256. if (uResult == SRC_FORMAT_FORBIDDEN || uResult == SRC_FORMAT_RESERVED)
  257. {
  258. ERRORMESSAGE(("%s: Forbidden or reserved src format\r\n", _fx_));
  259. iReturn = ICERR_ERROR;
  260. goto done;
  261. }
  262. DC->uSrcFormat = uResult; // DC->uPrevSrcFormat has already been saved
  263. // Check to make sure that the picture size has not changed between frames.
  264. if (DC->bReadSrcFormat && DC->uPrevSrcFormat != DC->uSrcFormat)
  265. {
  266. ERRORMESSAGE(("%s: Src format changed\r\n", _fx_));
  267. iReturn = ICERR_ERROR;
  268. goto done;
  269. }
  270. DC->bReadSrcFormat = 1; // The actual source format has finally been read
  271. // Optional modes:
  272. // Custom PCF ---------------------------------------
  273. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  274. DC->bCustomPCF = (U16) uResult;
  275. if (DC->bCustomPCF)
  276. {
  277. ERRORMESSAGE(("%s: Custom PCF not supported\r\n", _fx_));
  278. iReturn = ICERR_ERROR;
  279. goto done;
  280. }
  281. // Advanced intra coding ---------------------------------------
  282. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  283. DC->bAdvancedIntra = (U16) uResult;
  284. if (DC->bAdvancedIntra)
  285. {
  286. ERRORMESSAGE(("%s: Advanced intra coding not supported\r\n", _fx_));
  287. iReturn = ICERR_ERROR;
  288. goto done;
  289. }
  290. // Deblocking filter ---------------------------------------
  291. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  292. DC->bDeblockingFilter = (U16) uResult;
  293. // Slice structured ---------------------------------------
  294. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  295. DC->bSliceStructured = (U16) uResult;
  296. if (DC->bSliceStructured)
  297. {
  298. ERRORMESSAGE(("%s: Slice structured mode not supported\r\n", _fx_));
  299. iReturn = ICERR_ERROR;
  300. goto done;
  301. }
  302. // Improved PB-frames ---------------------------------------
  303. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  304. DC->bImprovedPBFrames = (U16) uResult;
  305. // Back channel operation ---------------------------------------
  306. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  307. DC->bBackChannel = (U16) uResult;
  308. if (DC->bBackChannel)
  309. {
  310. ERRORMESSAGE(("%s: Back-channel operation not supported\r\n", _fx_));
  311. iReturn = ICERR_ERROR;
  312. goto done;
  313. }
  314. // Scalability ---------------------------------------
  315. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  316. DC->bScalability = (U16) uResult;
  317. if (DC->bScalability)
  318. {
  319. ERRORMESSAGE(("%s: Scalability mode not supported\r\n", _fx_));
  320. iReturn = ICERR_ERROR;
  321. goto done;
  322. }
  323. // True B-frame mode ---------------------------------------
  324. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  325. DC->bTrueBFrame = (U16) uResult;
  326. if (DC->bTrueBFrame)
  327. {
  328. ERRORMESSAGE(("%s: True B-frames not supported\r\n", _fx_));
  329. iReturn = ICERR_ERROR;
  330. goto done;
  331. }
  332. // Reference-picture resampling ---------------------------------------
  333. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  334. DC->bResampling = (U16) uResult;
  335. if (DC->bResampling)
  336. {
  337. ERRORMESSAGE(("%s: Reference-picture resampling not supported\r\n", _fx_));
  338. iReturn = ICERR_ERROR;
  339. goto done;
  340. }
  341. // Reduced-resolution update ---------------------------------------
  342. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  343. DC->bResUpdate = (U16) uResult;
  344. if (DC->bResUpdate)
  345. {
  346. ERRORMESSAGE(("%s: Reduced resolution update not supported\r\n", _fx_));
  347. iReturn = ICERR_ERROR;
  348. goto done;
  349. }
  350. // Resevered bits
  351. GET_FIXED_BITS((U32) BITS_EPTYPE_RESERVED, fpu8, uWork, uBitsReady, uResult);
  352. if (uResult != EPTYPE_RESERVED_VAL)
  353. {
  354. ERRORMESSAGE(("%s: Invalid reserved code in EPTYPE\r\n", _fx_));
  355. iReturn = ICERR_ERROR;
  356. goto done;
  357. }
  358. } // end if (DC->uSrcFormat == SRC_FORMAT_EPTYPE)
  359. else // end if (DC->uSrcFormat == SRC_FORMAT_EPTYPE)
  360. {
  361. // We might never read these optional flags, so set them to
  362. // false if not extended PTYPE
  363. DC->bImprovedPBFrames = FALSE;
  364. DC->bAdvancedIntra = FALSE;
  365. DC->bDeblockingFilter = FALSE;
  366. DC->bSliceStructured = FALSE;
  367. DC->bCustomPCF = FALSE;
  368. DC->bBackChannel = FALSE;
  369. DC->bScalability = FALSE;
  370. DC->bTrueBFrame = FALSE;
  371. DC->bResampling = FALSE;
  372. DC->bResUpdate = FALSE;
  373. }
  374. // CSFMT --------------------------------------
  375. if (DC->uSrcFormat == SRC_FORMAT_CUSTOM)
  376. {
  377. // Custom source format detected. We need to read the aspect ratio
  378. // code and the frame width and height indications.
  379. // Pixel aspect ratio code
  380. GET_FIXED_BITS((U32) BITS_CSFMT_PARC, fpu8, uWork, uBitsReady, uResult);
  381. U16 uPARC = (U16)uResult;
  382. // Frame width indication
  383. GET_FIXED_BITS((U32) BITS_CSFMT_FWI, fpu8, uWork, uBitsReady, uResult);
  384. // The number of pixels per line is given by (FWI+1)*4. We do not
  385. // support cases where the picture width differs from that given in the
  386. // DC->uActualFrameWidth parameter.
  387. if (DC->uActualFrameWidth != ((uResult + 1) << 2))
  388. {
  389. ERRORMESSAGE(("%s: Frame width change not supported\r\n", _fx_));
  390. iReturn = ICERR_ERROR;
  391. goto done;
  392. }
  393. // Bit 13 must be "1" to prevent start code emulation
  394. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  395. if (uResult != BIT_CSFMT_14_VAL)
  396. {
  397. ERRORMESSAGE(("%s: CSFMT bit 13 != 1\r\n", _fx_));
  398. iReturn = ICERR_ERROR;
  399. goto done;
  400. }
  401. // Frame height indication
  402. GET_FIXED_BITS((U32) BITS_CSFMT_FHI, fpu8, uWork, uBitsReady, uResult);
  403. // The number of lines is given by (FHI+1)*4. We do not
  404. // support cases where the picture height differs from that given in the
  405. // DC->uActualFrameHeight parameter.
  406. if (DC->uActualFrameHeight != ((uResult + 1) << 2))
  407. {
  408. ERRORMESSAGE(("%s: Frame height change not supported\r\n", _fx_));
  409. iReturn = ICERR_ERROR;
  410. goto done;
  411. }
  412. switch (uPARC) {
  413. case PARC_SQUARE:
  414. DC->uPARWidth = 1;
  415. DC->uPARHeight = 1;
  416. break;
  417. case PARC_CIF:
  418. DC->uPARWidth = 12;
  419. DC->uPARHeight = 11;
  420. break;
  421. case PARC_10_11:
  422. DC->uPARWidth = 10;
  423. DC->uPARHeight = 11;
  424. break;
  425. case PARC_EXTENDED:
  426. GET_FIXED_BITS((U32) BITS_PAR_WIDTH, fpu8, uWork, uBitsReady, uResult);
  427. DC->uPARWidth = uResult;
  428. if (DC->uPARWidth == 0)
  429. {
  430. ERRORMESSAGE(("%s: Forbidden pixel aspect ratio width\r\n", _fx_));
  431. iReturn = ICERR_ERROR;
  432. goto done;
  433. }
  434. GET_FIXED_BITS((U32) BITS_PAR_HEIGHT, fpu8, uWork, uBitsReady, uResult);
  435. DC->uPARHeight = uResult;
  436. if (DC->uPARHeight == 0)
  437. {
  438. ERRORMESSAGE(("%s: Forbidden pixel aspect ratio height\r\n", _fx_));
  439. iReturn = ICERR_ERROR;
  440. goto done;
  441. }
  442. break;
  443. default:
  444. ERRORMESSAGE(("%s: Unsupported pixel aspect ratio code\r\n", _fx_));
  445. iReturn = ICERR_ERROR;
  446. goto done;
  447. }
  448. } // end if (DC->uSrcFormat == SRC_FORMAT_CUSTOM)
  449. #endif // H263P
  450. // PQUANT --------------------------------------
  451. GET_FIXED_BITS((U32) BITS_PQUANT, fpu8, uWork, uBitsReady, uResult);
  452. DC->uPQuant = uResult;
  453. // CPM -----------------------------------------
  454. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  455. DC->bCPM = (U16) uResult;
  456. if (DC->bCPM)
  457. {
  458. ERRORMESSAGE(("%s: Continuous Presence Multipoint is not supported\r\n", _fx_));
  459. iReturn = ICERR_ERROR;
  460. goto done;
  461. }
  462. // PLCI ----------------------------------------
  463. if (DC->bCPM)
  464. {
  465. // TBD("TBD: PLCI");
  466. iReturn = ICERR_ERROR;
  467. goto done;
  468. }
  469. if (DC->bPBFrame)
  470. {
  471. GET_FIXED_BITS((U32) BITS_TRB, fpu8, uWork, uBitsReady, uResult);
  472. DC->uBFrameTempRef = uResult;
  473. GET_FIXED_BITS((U32) BITS_DBQUANT, fpu8, uWork, uBitsReady, uResult);
  474. DC->uDBQuant = uResult;
  475. }
  476. else
  477. {
  478. DC->uBFrameTempRef = 12345678; /* clear the values */
  479. DC->uDBQuant = 12345678;
  480. }
  481. // skip spare bits
  482. iSpareCount = 0;
  483. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  484. while (uResult)
  485. {
  486. GET_FIXED_BITS((U32) BITS_PSPARE, fpu8, uWork, uBitsReady, uResult);
  487. GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
  488. iSpareCount += BITS_PSPARE;
  489. }
  490. DEBUGMSG(ZONE_DECODE_PICTURE_HEADER, ("%s: TR=%ld SS=%d CAM=%d FRZ=%d SRC=%ld PCT=%d UMV=%d AC=%d AP=%d PB=%d CPM=%d PQ=%ld TRB=%ld DBQ=%ld Spare=%d\r\n", _fx_, DC->uTempRef, DC->bSplitScreen, DC->bCameraOn, DC->bFreezeRelease, DC->uSrcFormat, !DC->bKeyFrame, DC->bUnrestrictedMotionVectors, DC->bArithmeticCoding, DC->bAdvancedPrediction, DC->bPBFrame, DC->bCPM, DC->uPQuant, DC->uBFrameTempRef, DC->uDBQuant, iSpareCount));
  491. #ifdef H263P
  492. DEBUGMSG(ZONE_DECODE_PICTURE_HEADER, ("%s: DF=%d TB=%d\r\n", _fx_, DC->bDeblockingFilter, DC->bTrueBFrame));
  493. if (DC->uSrcFormat == SRC_FORMAT_CUSTOM)
  494. {
  495. DEBUGMSG(ZONE_DECODE_PICTURE_HEADER, ("%s: PARW=%ld PARH=%ld FWI=%ld FHI=%ld\r\n", _fx_, DC->uPARWidth, DC->uPARHeight, (DC->uActualFrameWidth >> 2) - 1, (DC->uActualFrameHeight >> 2) - 1));
  496. }
  497. #endif // H263P
  498. GET_BITS_SAVE_STATE(fpu8, uWork, uBitsReady, fpbsState);
  499. iReturn = ICERR_OK;
  500. done:
  501. return iReturn;
  502. } /* end H263DecodePictureHeader() */