parse.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:20k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *  parse.c
  3.  *
  4.  *  Copyright (C) Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - Nov 1999
  5.  *
  6.  *  This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
  7.  *
  8.  *  mpeg2dec is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2, or (at your option)
  11.  *  any later version.
  12.  *   
  13.  *  mpeg2dec is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *   
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with GNU Make; see the file COPYING.  If not, write to
  20.  *  the Free Software Foundation, 
  21.  *
  22.  */
  23. #include <stddef.h>
  24. #include <stdio.h>
  25. #include "config.h"
  26. #include "mpeg2.h"
  27. #include "mpeg2_internal.h"
  28. #include "bitstream.h"
  29. #include "stats.h"
  30. #include "parse.h"
  31. //FIXME remove when new vlc stuff is in
  32. #include "old_crap.h"
  33. //FIXME remove when you put vlc_get_block_coeff into vlc.
  34. typedef struct {
  35.   char run, level, len;
  36. } DCTtab;
  37. extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
  38. extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
  39. extern DCTtab DCTtab0a[],DCTtab1a[];
  40. //FIXME remove when you put vlc_get_block_coeff into vlc.
  41. uint_32 non_linear_quantizer_scale[32] =
  42. {
  43.    0, 1, 2, 3, 4, 5, 6, 7,
  44.    8,10,12,14,16,18,20,22,
  45.   24,28,32,36,40,44,48,52,
  46.   56,64,72,80,88,96,104,112
  47. };
  48. static uint_8 scan_norm_mmx[64] =
  49. // MMX Zig-Zag scan pattern (transposed)  
  50.  0, 8, 1, 2, 9,16,24,17,10, 3, 4,11,18,25,32,40,
  51. 33,26,19,12, 5, 6,13,20,27,34,41,48,56,49,42,35,
  52. 28,21,14, 7,15,22,29,36,43,50,57,58,51,44,37,30,
  53. 23,31,38,45,52,59,60,53,46,39,47,54,61,62,55,63
  54. };
  55. static uint_8 scan_alt_mmx[64] = 
  56. // Alternate scan pattern (transposed)
  57.  0, 1, 2, 3, 8, 9,16,17,10,11, 4, 5, 6, 7,15,14,
  58. 13,12,19,18,24,25,32,33,26,27,20,21,22,23,28,29,
  59. 30,31,34,35,40,41,48,49,42,43,36,37,38,39,44,45,
  60. 46,47,50,51,56,57,58,59,52,53,54,55,60,61,62,63,
  61. };
  62. static uint_8 scan_norm[64] =
  63. // Zig-Zag scan pattern
  64. 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
  65. 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
  66. 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
  67. 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
  68. };
  69. static uint_8 scan_alt[64] =
  70. // Alternate scan pattern 
  71. 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
  72. 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
  73. 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
  74. 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
  75. };
  76. static uint_8 default_intra_quantization_matrix[64] = 
  77. {
  78.    8, 16, 19, 22, 26, 27, 29, 34,
  79.   16, 16, 22, 24, 27, 29, 34, 37,
  80.   19, 22, 26, 27, 29, 34, 34, 38,
  81.   22, 22, 26, 27, 29, 34, 37, 40,
  82.   22, 26, 27, 29, 32, 35, 40, 48,
  83.   26, 27, 29, 32, 35, 40, 48, 58,
  84.   26, 27, 29, 34, 38, 46, 56, 69,
  85.   27, 29, 35, 38, 46, 56, 69, 83
  86. };
  87. static uint_8 default_non_intra_quantization_matrix[64] = 
  88. {
  89. 16, 16, 16, 16, 16, 16, 16, 16, 
  90. 16, 16, 16, 16, 16, 16, 16, 16, 
  91. 16, 16, 16, 16, 16, 16, 16, 16, 
  92. 16, 16, 16, 16, 16, 16, 16, 16, 
  93. 16, 16, 16, 16, 16, 16, 16, 16, 
  94. 16, 16, 16, 16, 16, 16, 16, 16, 
  95. 16, 16, 16, 16, 16, 16, 16, 16, 
  96. 16, 16, 16, 16, 16, 16, 16, 16 
  97. };
  98. static void parse_sequence_display_extension(picture_t *picture);
  99. static void parse_sequence_extension(picture_t *picture);
  100. static void parse_picture_coding_extension(picture_t *picture);
  101. void
  102. parse_state_init(picture_t *picture)
  103. {
  104. picture->intra_quantizer_matrix = default_intra_quantization_matrix;
  105. picture->non_intra_quantizer_matrix = default_non_intra_quantization_matrix;
  106. //FIXME we should set pointers to the real scan matrices
  107. //here (mmx vs normal) instead of the ifdefs in parse_picture_coding_extension
  108. picture->scan = scan_norm;
  109. }
  110. //FIXME remove once we get everything working
  111. void parse_marker_bit(char *string)
  112. {
  113.   int marker;
  114.   marker = Get_Bits(1);
  115.   if(!marker)
  116.     fprintf(stderr,"(parse) %s marker_bit set to 0n",string);
  117. }
  118. void 
  119. parse_sequence_header(picture_t *picture)
  120. {
  121. uint_32 i;
  122.   picture->horizontal_size             = Get_Bits(12);
  123.   picture->vertical_size               = Get_Bits(12);
  124. //XXX this needs field fixups
  125. picture->coded_picture_height = ((picture->vertical_size + 15)/16) * 16;
  126. picture->coded_picture_width  = ((picture->horizontal_size   + 15)/16) * 16;
  127.   picture->aspect_ratio_information    = Get_Bits(4);
  128.   picture->frame_rate_code             = Get_Bits(4);
  129.   picture->bit_rate_value              = Get_Bits(18);
  130.   parse_marker_bit("sequence_header");
  131.   picture->vbv_buffer_size             = Get_Bits(10);
  132.   picture->constrained_parameters_flag = Get_Bits(1);
  133.   if((picture->use_custom_intra_quantizer_matrix = Get_Bits(1)))
  134.   {
  135. picture->intra_quantizer_matrix = picture->custom_intra_quantization_matrix;
  136.     for (i=0; i < 64; i++)
  137.       picture->custom_intra_quantization_matrix[scan_norm[i]] = Get_Bits(8);
  138.   }
  139. else
  140. picture->intra_quantizer_matrix = default_intra_quantization_matrix;
  141.   if((picture->use_custom_non_intra_quantizer_matrix = Get_Bits(1)))
  142.   {
  143. picture->non_intra_quantizer_matrix = picture->custom_non_intra_quantization_matrix;
  144.     for (i=0; i < 64; i++)
  145.       picture->custom_non_intra_quantization_matrix[scan_norm[i]] = Get_Bits(8);
  146.   }
  147. else
  148. picture->non_intra_quantizer_matrix = default_non_intra_quantization_matrix;
  149. stats_sequence_header(picture);
  150. }
  151. void
  152. parse_extension(picture_t *picture)
  153. {
  154. uint_32 code;
  155. code = Get_Bits(4);
  156. switch(code)
  157. {
  158. case PICTURE_CODING_EXTENSION_ID:
  159. parse_picture_coding_extension(picture);
  160. break;
  161. case SEQUENCE_EXTENSION_ID:
  162. parse_sequence_extension(picture);
  163. break;
  164. case SEQUENCE_DISPLAY_EXTENSION_ID:
  165. parse_sequence_display_extension(picture);
  166. break;
  167. default:
  168. fprintf(stderr,"(parse) unsupported extension %dn",code);
  169. exit(1);
  170. }
  171. }
  172. void
  173. parse_user_data(void)
  174. {
  175.   while (Show_Bits(24)!=0x01L)
  176.     Flush_Buffer(8);
  177. }
  178. static void
  179. parse_sequence_extension(picture_t *picture)
  180. {
  181.   /*picture->profile_and_level_indication = */ Get_Bits(8);
  182.   picture->progressive_sequence           =    Get_Bits(1);
  183.   picture->chroma_format                  =    Get_Bits(2);
  184.   /*picture->horizontal_size_extension    = */ Get_Bits(2);
  185.   /*picture->vertical_size_extension      = */ Get_Bits(2);
  186.   /*picture->bit_rate_extension           = */ Get_Bits(12);
  187.   parse_marker_bit("sequence_extension");
  188.   /*picture->vbv_buffer_size_extension    = */ Get_Bits(8);
  189.   /*picture->low_delay                    = */ Get_Bits(1);
  190.   /*picture->frame_rate_extension_n       = */ Get_Bits(2);
  191.   /*picture->frame_rate_extension_d       = */ Get_Bits(5);
  192. stats_sequence_ext(picture);
  193. //
  194. //XXX since we don't support anything but 4:2:0, die gracefully
  195. if(picture->chroma_format != CHROMA_420)
  196. {
  197. fprintf(stderr,"(parse) sorry, mpeg2dec doesn't support color formats other than 4:2:0n");
  198. exit(1);
  199. }
  200. }
  201. static void
  202. parse_sequence_display_extension(picture_t *picture)
  203. {
  204.   picture->video_format      = Get_Bits(3);
  205.   picture->color_description = Get_Bits(1);
  206.   if (picture->color_description)
  207.   {
  208.     picture->color_primaries          = Get_Bits(8);
  209.     picture->transfer_characteristics = Get_Bits(8);
  210.     picture->matrix_coefficients      = Get_Bits(8);
  211.   }
  212.   picture->display_horizontal_size = Get_Bits(14);
  213.   parse_marker_bit("sequence_display_extension");
  214.   picture->display_vertical_size   = Get_Bits(14);
  215. stats_sequence_display_ext(picture);
  216. }
  217. void 
  218. parse_gop_header(picture_t *picture)
  219. {
  220.   picture->drop_flag   = Get_Bits(1);
  221.   picture->hour        = Get_Bits(5);
  222.   picture->minute      = Get_Bits(6);
  223.   parse_marker_bit("gop_header");
  224.   picture->sec         = Get_Bits(6);
  225.   picture->frame       = Get_Bits(6);
  226.   picture->closed_gop  = Get_Bits(1);
  227.   picture->broken_link = Get_Bits(1);
  228. stats_gop_header(picture);
  229. }
  230. static void 
  231. parse_picture_coding_extension(picture_t *picture)
  232. {
  233.   picture->f_code[0][0] = Get_Bits(4);
  234.   picture->f_code[0][1] = Get_Bits(4);
  235.   picture->f_code[1][0] = Get_Bits(4);
  236.   picture->f_code[1][1] = Get_Bits(4);
  237.   picture->intra_dc_precision         = Get_Bits(2);
  238.   picture->picture_structure          = Get_Bits(2);
  239.   picture->top_field_first            = Get_Bits(1);
  240.   picture->frame_pred_frame_dct       = Get_Bits(1);
  241.   picture->concealment_motion_vectors = Get_Bits(1);
  242.   picture->q_scale_type               = Get_Bits(1);
  243.   picture->intra_vlc_format           = Get_Bits(1);
  244.   picture->alternate_scan             = Get_Bits(1);
  245. #ifdef __i386__
  246. if(picture->alternate_scan)
  247. picture->scan = scan_alt_mmx;
  248. else
  249. picture->scan = scan_norm_mmx;
  250. #else
  251. if(picture->alternate_scan)
  252. picture->scan = scan_alt;
  253. else
  254. picture->scan = scan_norm;
  255. #endif
  256.   picture->repeat_first_field         = Get_Bits(1);
  257. /*chroma_420_type isn't used */       Get_Bits(1);
  258.   picture->progressive_frame          = Get_Bits(1);
  259.   picture->composite_display_flag     = Get_Bits(1);
  260.   if (picture->composite_display_flag)
  261.   {
  262. //This info is not used in the decoding process
  263.     /* picture->v_axis            = */ Get_Bits(1);
  264.     /* picture->field_sequence    = */ Get_Bits(3);
  265.     /* picture->sub_carrier       = */ Get_Bits(1);
  266.     /* picture->burst_amplitude   = */ Get_Bits(7);
  267.     /* picture->sub_carrier_phase = */ Get_Bits(8);
  268.   }
  269. //XXX die gracefully if we encounter a field picture based stream
  270. if(picture->picture_structure != FRAME_PICTURE)
  271. {
  272. fprintf(stderr,"(parse) sorry, mpeg2dec doesn't support field based pictures yetn");
  273. exit(1);
  274. }
  275. stats_picture_coding_ext_header(picture);
  276. }
  277. void 
  278. parse_picture_header(picture_t *picture)
  279. {
  280.   picture->temporal_reference  = Get_Bits(10);
  281.   picture->picture_coding_type = Get_Bits(3);
  282.   picture->vbv_delay           = Get_Bits(16);
  283.   if (picture->picture_coding_type==P_TYPE || picture->picture_coding_type==B_TYPE)
  284.   {
  285.     picture->full_pel_forward_vector = Get_Bits(1);
  286.     picture->forward_f_code = Get_Bits(3);
  287.   }
  288.   if (picture->picture_coding_type==B_TYPE)
  289.   {
  290.     picture->full_pel_backward_vector = Get_Bits(1);
  291.     picture->backward_f_code = Get_Bits(3);
  292.   }
  293. stats_picture_header(picture);
  294. }
  295. void
  296. parse_slice_header(const picture_t *picture, slice_t *slice)
  297. {
  298. uint_32 intra_slice_flag;
  299.   slice->quantizer_scale_code = Get_Bits(5);
  300. if (picture->q_scale_type)
  301.    slice->quantizer_scale = non_linear_quantizer_scale[slice->quantizer_scale_code];
  302. else
  303.    slice->quantizer_scale = slice->quantizer_scale_code << 1 ;
  304.   if ((intra_slice_flag = Get_Bits(1)))
  305.   {
  306. //Ignore the value of intra_slice
  307.     Get_Bits(1);
  308.     slice->slice_picture_id_enable = Get_Bits(1);
  309. slice->slice_picture_id = Get_Bits(6);
  310. //Ignore all the extra_data
  311. while(Get_Bits1())
  312. Flush_Buffer(8);
  313. }
  314. //reset intra dc predictor
  315. slice->dc_dct_pred[0]=slice->dc_dct_pred[1]=slice->dc_dct_pred[2]= 
  316. 1<<(picture->intra_dc_precision + 7) ;
  317. stats_slice_header(slice);
  318. }
  319. //This goes into vlc.c when it gets written
  320. sint_32
  321. vlc_get_block_coeff(uint_16 non_intra_dc,uint_16 intra_vlc_format)
  322. {
  323.   uint_32 code;
  324.   DCTtab *tab;
  325. uint_16 run;
  326. sint_16 val;
  327. //this routines handles intra AC and non-intra AC/DC coefficients
  328. code = Show_Bits(16);
  329.  
  330. if (code>=16384 && !intra_vlc_format)
  331. {
  332. if (non_intra_dc)
  333. tab = &DCTtabfirst[(code>>12)-4];
  334. else
  335. tab = &DCTtabnext[(code>>12)-4];
  336. }
  337. else if (code>=1024)
  338. {
  339. if (intra_vlc_format)
  340. tab = &DCTtab0a[(code>>8)-4];
  341. else
  342. tab = &DCTtab0[(code>>8)-4];
  343. }
  344. else if (code>=512)
  345. {
  346. if (intra_vlc_format)
  347. tab = &DCTtab1a[(code>>6)-8];
  348. else
  349. tab = &DCTtab1[(code>>6)-8];
  350. }
  351. else if (code>=256)
  352. tab = &DCTtab2[(code>>4)-16];
  353. else if (code>=128)
  354. tab = &DCTtab3[(code>>3)-16];
  355. else if (code>=64)
  356. tab = &DCTtab4[(code>>2)-16];
  357. else if (code>=32)
  358. tab = &DCTtab5[(code>>1)-16];
  359. else if (code>=16)
  360. tab = &DCTtab6[code-16];
  361. else
  362. {
  363. fprintf(stderr,"invalid Huffman code in vlc_get_block_coeff()n");
  364. return 0;
  365. }
  366. Flush_Buffer(tab->len);
  367. if (tab->run==64) // end_of_block 
  368. return 0;
  369. if (tab->run==65) /* escape */
  370. {
  371. run = Get_Bits(6);
  372. val = Get_Bits(12);
  373. if ((val&2047)==0)
  374. {
  375. fprintf(stderr,"invalid escape in vlc_get_block_coeff()n");
  376. return 0;
  377. }
  378. if(val >= 2048)
  379. val =  val - 4096;
  380. }
  381. else
  382. {
  383. run = tab->run;
  384. val = tab->level;
  385.  
  386. if(Get_Bits(1)) //sign bit
  387. val = -val;
  388. }
  389. return ((val << 16) + run);
  390. }
  391. void
  392. parse_intra_block(const picture_t *picture,slice_t *slice,sint_16 *dest,uint_32 cc)
  393. {
  394. sint_32 coeff;
  395. uint_32 i = 1;
  396. uint_32 j;
  397. uint_16 run;
  398. sint_16 val;
  399. uint_8 *scan = picture->scan;
  400. uint_8 *quant_matrix = picture->intra_quantizer_matrix;
  401. sint_16 quantizer_scale = slice->quantizer_scale;
  402. //Clear the entire block and bring it into the cache
  403. //XXX we should perhaps do this at the start of the frame
  404. memset(dest,0,sizeof(sint_16) * 64);
  405. //Get the intra DC coefficient and inverse quantize it
  406.   if (cc == 0)
  407.     dest[0] = (slice->dc_dct_pred[0] += Get_Luma_DC_dct_diff()) << (3 - picture->intra_dc_precision);
  408.   else 
  409.     dest[0] = (slice->dc_dct_pred[cc]+= Get_Chroma_DC_dct_diff()) << (3 - picture->intra_dc_precision);
  410. //FIXME convert the cross platform IDCT to use 11.4 fixed point
  411. #ifdef __i386__
  412. dest[0] <<= 4;
  413. #endif
  414. i = 1;
  415. while((coeff = vlc_get_block_coeff(0,picture->intra_vlc_format)))
  416. {
  417. val = coeff >> 16;
  418. run = coeff & 0xffffL;
  419. i += run;
  420.     j = scan[i++];
  421. //FIXME convert the cross platform IDCT to use 11.4 fixed point
  422. #ifdef __i386__
  423.     dest[j] = (val * quantizer_scale * quant_matrix[j]);
  424. #else
  425.     dest[j] = (val * quantizer_scale * quant_matrix[j]) >> 4;
  426. #endif
  427. #if 0
  428. sint_32 sum = 0;
  429. if(dest[j] > 2047)
  430. dest[j] = 2047;
  431. else if(dest[j] < -2048)
  432. dest[j] = -2048;
  433. sum += dest[j];
  434. #endif
  435. }
  436. #if 0
  437. if ((sum & 1) == 0)
  438. dest[63] ^= 1;
  439. #endif
  440. if(i > 64)
  441. {
  442. fprintf(stderr,"Invalid DCT index in parse_intra_block()n");
  443. exit(1);
  444. }
  445. }
  446. void
  447. parse_non_intra_block(const picture_t *picture,slice_t *slice,sint_16 *dest,uint_32 cc)
  448. {
  449. uint_32 coeff;
  450. uint_32 i = 0;
  451. uint_32 j;
  452. uint_16 run;
  453. sint_16 val;
  454. uint_8 *scan = picture->scan;
  455. uint_8 *quant_matrix = picture->intra_quantizer_matrix;
  456. sint_16 quantizer_scale = slice->quantizer_scale;
  457. //Clear the entire block and bring it into the cache
  458. memset(dest,0,sizeof(sint_16) * 64);
  459. while((coeff = vlc_get_block_coeff(i==0,0)))
  460. {
  461. val = coeff >> 16;
  462. run = coeff & 0xffffL;
  463. i += run;
  464.     j = scan[i++];
  465. //FIXME mmx
  466. //FIXME convert the cross platform IDCT to use 11.4 fixed point
  467. #ifdef __i386__
  468.     dest[j] = (((val<<1) + (val>>15))* quantizer_scale * quant_matrix[j]) >> 1;
  469. #else
  470.     dest[j] = (((val<<1) + (val>>15))* quantizer_scale * quant_matrix[j]) >> 5;
  471. #endif
  472. }
  473. if(i > 64)
  474. {
  475. fprintf(stderr,"Invalid DCT index in parse_intra_block()n");
  476. exit(1);
  477. }
  478. }
  479. void
  480. parse_macroblock(const picture_t *picture,slice_t* slice, macroblock_t *mb)
  481. {
  482.   uint_32 quantizer_scale_code;
  483.   uint_32 picture_structure = picture->picture_structure;
  484. uint_32 i;
  485. //Clear the skipped flag
  486. mb->skipped = 0;
  487.   // get macroblock_type 
  488.   mb->macroblock_type = Get_macroblock_type(picture->picture_coding_type);
  489.   // get frame/field motion type 
  490.   if (mb->macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
  491.   {
  492.     if (picture_structure==FRAME_PICTURE) // frame_motion_type 
  493.     {
  494.       mb->motion_type = picture->frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
  495. if(!picture->frame_pred_frame_dct)
  496.       {
  497.         printf("frame_motion_type (");
  498.         printf("): %sn",mb->motion_type==MC_FIELD?"Field":
  499.                          mb->motion_type==MC_FRAME?"Frame":
  500.                          mb->motion_type==MC_DMV?"Dual_Prime":"Invalid");
  501. }
  502.       
  503.     }
  504.     else // field_motion_type 
  505.     {
  506.       mb->motion_type = Get_Bits(2);
  507.     }
  508.   }
  509.   else if ((mb->macroblock_type & MACROBLOCK_INTRA) && picture->concealment_motion_vectors)
  510.   {
  511.     // concealment motion vectors 
  512.     mb->motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
  513.   }
  514.   // derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18)
  515.   if (picture_structure==FRAME_PICTURE)
  516.   {
  517.     //mb->motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
  518.     mb->motion_vector_count = 1;
  519.     mb->mv_format = (mb->motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
  520.   }
  521.   else
  522.   {
  523.     mb->motion_vector_count = (mb->motion_type==MC_16X8) ? 2 : 1;
  524.     mb->mv_format = MV_FIELD;
  525.   }
  526.   mb->dmv = (mb->motion_type==MC_DMV); // dual prime
  527. //Set if we need to scale motion vector prediction by 1/2
  528.   mb->mvscale = ((mb->mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
  529.   // get dct_type (frame DCT / field DCT) 
  530. if( (picture_structure==FRAME_PICTURE) && (!picture->frame_pred_frame_dct) && 
  531. (mb->macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)) )
  532. mb->dct_type =  Get_Bits(1);
  533. else
  534. mb->dct_type =  0;
  535. if (mb->macroblock_type & MACROBLOCK_QUANT)
  536.   {
  537.     quantizer_scale_code = Get_Bits(5);
  538. //The quantizer scale code propogates up to the slice level
  539. if(picture->q_scale_type)
  540. slice->quantizer_scale = non_linear_quantizer_scale[quantizer_scale_code];
  541. else
  542.       slice->quantizer_scale = quantizer_scale_code << 1;
  543.   }
  544.   // 6.3.17.2 Motion vectors 
  545.   // decode forward motion vectors 
  546.   if ((mb->macroblock_type & MACROBLOCK_MOTION_FORWARD) || 
  547. ((mb->macroblock_type & MACROBLOCK_INTRA) && picture->concealment_motion_vectors))
  548.   {
  549. //Field pictures are definately broken here
  550. //FIXME this could be faster too
  551.       motion_vectors(slice->pmv,(int*)mb->dmvector,mb->motion_vertical_field_select,
  552.         0,mb->motion_vector_count,mb->mv_format,0,0,mb->dmv,
  553. mb->mvscale);
  554.   }
  555.   // decode backward motion vectors 
  556.   if (mb->macroblock_type & MACROBLOCK_MOTION_BACKWARD)
  557.   {
  558.       motion_vectors(slice->pmv,(int*)mb->dmvector,mb->motion_vertical_field_select,
  559.         1,mb->motion_vector_count,mb->mv_format,0,0,mb->dmv,
  560.         mb->mvscale);
  561.   }
  562.   if ((mb->macroblock_type & MACROBLOCK_INTRA) && picture->concealment_motion_vectors)
  563.     Flush_Buffer(1); // remove marker_bit 
  564.   // 6.3.17.4 Coded block pattern 
  565.   if (mb->macroblock_type & MACROBLOCK_PATTERN)
  566.   {
  567.     mb->coded_block_pattern = Get_coded_block_pattern();
  568.     if (picture->chroma_format==CHROMA_422)
  569.     {
  570.       // coded_block_pattern_1 
  571.       mb->coded_block_pattern = (mb->coded_block_pattern<<2) | Get_Bits(2); 
  572. }
  573. else if (picture->chroma_format==CHROMA_444)
  574. {
  575. // coded_block_pattern_2 
  576. mb->coded_block_pattern = (mb->coded_block_pattern<<6) | Get_Bits(6); 
  577. }
  578. }
  579.   else
  580.     mb->coded_block_pattern = (mb->macroblock_type & MACROBLOCK_INTRA) ? 
  581.       0x3f : 0;
  582. //FIXME remove
  583. //fprintf(stderr,"(mb) cbp %02xn",mb->coded_block_pattern);
  584. //coded_block_pattern is set only if there are blocks in bitstream
  585.   if(mb->coded_block_pattern)
  586. {
  587. //XXX only 4:2:0 is supported here - fix later
  588. // Decode lum blocks 
  589. for (i=0; i<4; i++)
  590. {
  591. if (mb->coded_block_pattern & (1<<(5-i)))
  592. {
  593. if (mb->macroblock_type & MACROBLOCK_INTRA)
  594. parse_intra_block(picture,slice,&mb->y_blocks[i*64],0);
  595. else
  596. parse_non_intra_block(picture,slice,&mb->y_blocks[i*64],0);
  597. }
  598. }
  599. // Decode chroma blocks 
  600. if (mb->coded_block_pattern & 0x2)
  601. {
  602. if (mb->macroblock_type & MACROBLOCK_INTRA)
  603. parse_intra_block(picture,slice,mb->cr_blocks,1);
  604. else
  605. parse_non_intra_block(picture,slice,mb->cr_blocks,1);
  606. }
  607. if (mb->coded_block_pattern & 0x1)
  608. {
  609. if (mb->macroblock_type & MACROBLOCK_INTRA)
  610. parse_intra_block(picture,slice,mb->cb_blocks,2);
  611. else
  612. parse_non_intra_block(picture,slice,mb->cb_blocks,2);
  613. }
  614. }
  615.   // 7.2.1 DC coefficients in intra blocks 
  616.   if (!(mb->macroblock_type & MACROBLOCK_INTRA))
  617. {
  618. //FIXME this looks suspicious...should be reset to 2^(intra_dc_precision+7)
  619. //
  620. //lets see if it works
  621. slice->dc_dct_pred[0]=slice->dc_dct_pred[1]=slice->dc_dct_pred[2]= 
  622. 1<<(picture->intra_dc_precision + 7) ;
  623. }
  624.   //7.6.3.4 Resetting motion vector predictors 
  625.   if ((mb->macroblock_type & MACROBLOCK_INTRA) && !picture->concealment_motion_vectors)
  626. memset(slice->pmv,0,sizeof(uint_16) * 8);
  627.   // special "No_MC" macroblock_type case 
  628.   // 7.6.3.5 Prediction in P pictures 
  629.   if ((picture->picture_coding_type==P_TYPE) 
  630.     && !(mb->macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
  631.   {
  632.     // non-intra mb without forward mv in a P picture 
  633.     // 7.6.3.4 Resetting motion vector predictors 
  634. memset(slice->pmv,0,sizeof(uint_16) * 8);
  635.     //6.3.17.1 Macroblock modes, frame_motion_type 
  636.     //if (picture_structure==FRAME_PICTURE)
  637.     //  *motion_type = MC_FRAME;
  638.     //else
  639.     //{
  640.     //  *motion_type = MC_FIELD;
  641.     //  /* predict from field of same parity */
  642.     //  motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
  643.     //}
  644.   }
  645.   //if (*stwclass==4)
  646.   //{
  647.   //  /* purely spatially predicted macroblock */
  648.   //  /* 7.7.5.1 Resetting motion vector predictions */
  649. //  slice_reset_pmv(slice);
  650.   // }
  651. }