gethdr.c
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:13k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  2. /*
  3.  * Disclaimer of Warranty
  4.  *
  5.  * These software programs are available to the user without any license fee or
  6.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  7.  * any and all warranties, whether express, implied, or statuary, including any
  8.  * implied warranties or merchantability or of fitness for a particular
  9.  * purpose.  In no event shall the copyright-holder be liable for any
  10.  * incidental, punitive, or consequential damages of any kind whatsoever
  11.  * arising from the use of these programs.
  12.  *
  13.  * This disclaimer of warranty extends to the user of these programs and user's
  14.  * customers, employees, agents, transferees, successors, and assigns.
  15.  *
  16.  * The MPEG Software Simulation Group does not represent or warrant that the
  17.  * programs furnished hereunder are free of infringement of any third-party
  18.  * patents.
  19.  *
  20.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  21.  * are subject to royalty fees to patent holders.  Many of these patents are
  22.  * general enough such that they are unavoidable regardless of implementation
  23.  * design.
  24.  *
  25.  */
  26. #include "global.h"
  27. #include "getbit.h"
  28. static double frame_rate_Table[16] = 
  29. {
  30. 0.0,
  31. ((24.0*1000.0)/1001.0),
  32. 24.0,
  33. 25.0,
  34. ((30.0*1000.0)/1001.0),
  35. 30.0,
  36. 50.0,
  37. ((60.0*1000.0)/1001.0),
  38. 60.0,
  39. -1, // reserved
  40. -1,
  41. -1,
  42. -1,
  43. -1,
  44. -1,
  45. -1
  46. };
  47. static char *AspectRatio[5] = {
  48. "", "1 : 1", "4 : 3", "16 : 9", "2.21 : 1"
  49. };
  50. __forceinline static void group_of_pictures_header(void);
  51. __forceinline static void picture_header(void);
  52. static void sequence_extension(void);
  53. static void sequence_display_extension(void);
  54. static void quant_matrix_extension(void);
  55. static void picture_display_extension(void);
  56. static void picture_coding_extension(void);
  57. static void copyright_extension(void);
  58. static int  extra_bit_information(void);
  59. static void extension_and_user_data(void);
  60. /* decode headers from one input stream */
  61. int Get_Hdr()
  62. {
  63. for (;;)
  64. {
  65. /* look for next_start_code */
  66. next_start_code();
  67. if (Fault_Flag)
  68. {
  69. return 0;
  70. }
  71. switch (Get_Bits(32))
  72. {
  73. case SEQUENCE_HEADER_CODE:
  74. sequence_header();
  75. break;
  76. case GROUP_START_CODE:
  77. group_of_pictures_header();
  78. break;
  79. case PICTURE_START_CODE:
  80. picture_header();
  81. return 1;
  82. }
  83. }
  84. }
  85. /* align to start of next next_start_code */
  86. void next_start_code()
  87. {
  88. Flush_Buffer(BitsLeft & 7);
  89. while (Show_Bits(24) != 1 && !Fault_Flag)
  90. Flush_Buffer(8);
  91. }
  92. /* decode sequence header */
  93. void sequence_header()
  94. {
  95. int constrained_parameters_flag;
  96. int bit_rate_value;
  97. int vbv_buffer_size;
  98. int i;
  99. horizontal_size             = Get_Bits(12);
  100. vertical_size               = Get_Bits(12);
  101. aspect_ratio_information    = Get_Bits(4);
  102. frame_rate_code             = Get_Bits(4);
  103. bit_rate_value              = Get_Bits(18);
  104. Flush_Buffer(1); // marker bit
  105. vbv_buffer_size             = Get_Bits(10);
  106. constrained_parameters_flag = Get_Bits(1);
  107. if (load_intra_quantizer_matrix = Get_Bits(1))
  108. {
  109. for (i=0; i<64; i++)
  110. intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  111. }
  112. else
  113. {
  114. for (i=0; i<64; i++)
  115. intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
  116. }
  117. if (load_non_intra_quantizer_matrix = Get_Bits(1))
  118. {
  119. for (i=0; i<64; i++)
  120. non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  121. }
  122. else
  123. {
  124. for (i=0; i<64; i++)
  125. non_intra_quantizer_matrix[i] = 16;
  126. }
  127. /* copy luminance to chrominance matrices */
  128. for (i=0; i<64; i++)
  129. {
  130. chroma_intra_quantizer_matrix[i] = intra_quantizer_matrix[i];
  131. chroma_non_intra_quantizer_matrix[i] = non_intra_quantizer_matrix[i];
  132. }
  133. extension_and_user_data();
  134. }
  135. /* decode group of pictures header */
  136. /* ISO/IEC 13818-2 section 6.2.2.6 */
  137. static void group_of_pictures_header()
  138. {
  139. int gop_hour;
  140. int gop_minute;
  141. int gop_sec;
  142. int gop_frame;
  143. int drop_flag;
  144. int closed_gop;
  145. int broken_link;
  146. drop_flag   = Get_Bits(1);
  147. gop_hour    = Get_Bits(5);
  148. gop_minute  = Get_Bits(6);
  149. Flush_Buffer(1); // marker bit
  150. gop_sec     = Get_Bits(6);
  151. gop_frame = Get_Bits(6);
  152. closed_gop  = Get_Bits(1);
  153. broken_link = Get_Bits(1);
  154. extension_and_user_data();
  155. }
  156. /* decode picture header */
  157. /* ISO/IEC 13818-2 section 6.2.3 */
  158. static void picture_header()
  159. {
  160. int vbv_delay;
  161. int full_pel_forward_vector;
  162. int forward_f_code;
  163. int full_pel_backward_vector;
  164. int backward_f_code;
  165. int Extra_Information_Byte_Count;
  166. temporal_reference  = Get_Bits(10);
  167. picture_coding_type = Get_Bits(3);
  168. //------------------------------------------------------------------------------------
  169. d2v_current.type = picture_coding_type;
  170. if (d2v_current.type==I_TYPE)
  171. {
  172. /* d2v_current.lba = process.startloc/BUFFER_SIZE - 2;
  173. if (d2v_current.lba < 0)
  174. {
  175. if (d2v_current.file > 0)
  176. {
  177. d2v_current.file --;
  178. d2v_current.lba = process.length[d2v_current.file]/BUFFER_SIZE - 1;
  179. }
  180. else
  181. d2v_current.lba = 0;
  182. }
  183. if (process.locate==LOCATE_RIP)
  184. {
  185. process.file = d2v_current.file;
  186. process.lba = d2v_current.lba;
  187. }*/
  188. }
  189. //-----------------------------------------------------------------------------------
  190. vbv_delay = Get_Bits(16);
  191. if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
  192. {
  193. full_pel_forward_vector = Get_Bits(1);
  194. forward_f_code = Get_Bits(3);
  195. }
  196. if (picture_coding_type==B_TYPE)
  197. {
  198. full_pel_backward_vector = Get_Bits(1);
  199. backward_f_code = Get_Bits(3);
  200. }
  201. Extra_Information_Byte_Count = extra_bit_information();
  202. extension_and_user_data();
  203. }
  204. /* decode slice header */
  205. /* ISO/IEC 13818-2 section 6.2.4 */
  206. int slice_header()
  207. {
  208. int slice_vertical_position_extension;
  209. int quantizer_scale_code;
  210. int slice_picture_id_enable = 0;
  211. int slice_picture_id = 0;
  212. int extra_information_slice = 0;
  213. slice_vertical_position_extension = vertical_size>2800 ? Get_Bits(3) : 0;
  214. quantizer_scale_code = Get_Bits(5);
  215. quantizer_scale = q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
  216. /* slice_id introduced in March 1995 as part of the video corridendum
  217.    (after the IS was drafted in November 1994) */
  218. if (Get_Bits(1))
  219. {
  220. Get_Bits(1); // intra slice
  221. slice_picture_id_enable = Get_Bits(1);
  222. slice_picture_id = Get_Bits(6);
  223. extra_information_slice = extra_bit_information();
  224. }
  225. return slice_vertical_position_extension;
  226. }
  227. /* decode extension and user data */
  228. /* ISO/IEC 13818-2 section 6.2.2.2 */
  229. static void extension_and_user_data()
  230. {
  231. int code, ext_ID;
  232. next_start_code();
  233. while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
  234. {
  235. if (code==EXTENSION_START_CODE)
  236. {
  237. Flush_Buffer(32);
  238. ext_ID = Get_Bits(4);
  239. switch (ext_ID)
  240. {
  241. case SEQUENCE_EXTENSION_ID:
  242. sequence_extension();
  243. break;
  244. case SEQUENCE_DISPLAY_EXTENSION_ID:
  245. sequence_display_extension();
  246. break;
  247. case QUANT_MATRIX_EXTENSION_ID:
  248. quant_matrix_extension();
  249. break;
  250. case PICTURE_DISPLAY_EXTENSION_ID:
  251. picture_display_extension();
  252. break;
  253. case PICTURE_CODING_EXTENSION_ID:
  254. picture_coding_extension();
  255. break;
  256. case COPYRIGHT_EXTENSION_ID:
  257. copyright_extension();
  258. break;
  259. }
  260. next_start_code();
  261. }
  262. else
  263. {
  264. Flush_Buffer(32); // ISO/IEC 13818-2  sections 6.3.4.1 and 6.2.2.2.2
  265. next_start_code(); // skip user data
  266. }
  267. }
  268. }
  269. /* decode sequence extension */
  270. /* ISO/IEC 13818-2 section 6.2.2.3 */
  271. static void sequence_extension()
  272. {
  273. int profile_and_level_indication;
  274. int low_delay;
  275. int frame_rate_extension_n;
  276. int frame_rate_extension_d;
  277. int horizontal_size_extension;
  278. int vertical_size_extension;
  279. int bit_rate_extension;
  280. int vbv_buffer_size_extension;
  281. profile_and_level_indication = Get_Bits(8);
  282. progressive_sequence         = Get_Bits(1);
  283. chroma_format                = Get_Bits(2);
  284. horizontal_size_extension    = Get_Bits(2);
  285. vertical_size_extension      = Get_Bits(2);
  286. bit_rate_extension           = Get_Bits(12);
  287. Flush_Buffer(1); // marker bit
  288. vbv_buffer_size_extension    = Get_Bits(8);
  289. low_delay                    = Get_Bits(1);
  290.  
  291. frame_rate_extension_n       = Get_Bits(2);
  292. frame_rate_extension_d       = Get_Bits(5);
  293. frame_rate = (float)(frame_rate_Table[frame_rate_code] * (frame_rate_extension_n+1)/(frame_rate_extension_d+1));
  294. horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
  295. vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
  296. }
  297. /* decode sequence display extension */
  298. static void sequence_display_extension()
  299. {
  300. int video_format;  
  301. int color_description;
  302. int color_primaries;
  303. int transfer_characteristics;
  304. int matrix_coefficients;
  305. int display_horizontal_size;
  306. int display_vertical_size;
  307. video_format      = Get_Bits(3);
  308. color_description = Get_Bits(1);
  309. if (color_description)
  310. {
  311. color_primaries          = Get_Bits(8);
  312. transfer_characteristics = Get_Bits(8);
  313. matrix_coefficients      = Get_Bits(8);
  314. }
  315. display_horizontal_size = Get_Bits(14);
  316. Flush_Buffer(1); // marker bit
  317. display_vertical_size   = Get_Bits(14);
  318. }
  319. /* decode quant matrix entension */
  320. /* ISO/IEC 13818-2 section 6.2.3.2 */
  321. static void quant_matrix_extension()
  322. {
  323. int i;
  324. if (load_intra_quantizer_matrix = Get_Bits(1))
  325. for (i=0; i<64; i++)
  326. chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
  327. = intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  328. if (load_non_intra_quantizer_matrix = Get_Bits(1))
  329. for (i=0; i<64; i++)
  330. chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
  331. = non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  332. if (load_chroma_intra_quantizer_matrix = Get_Bits(1))
  333. for (i=0; i<64; i++)
  334. chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  335. if (load_chroma_non_intra_quantizer_matrix = Get_Bits(1))
  336. for (i=0; i<64; i++)
  337. chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  338. }
  339. /* decode picture display extension */
  340. /* ISO/IEC 13818-2 section 6.2.3.3. */
  341. static void picture_display_extension()
  342. {
  343. int frame_center_horizontal_offset[3];
  344. int frame_center_vertical_offset[3];
  345. int i;
  346. int number_of_frame_center_offsets;
  347. /* based on ISO/IEC 13818-2 section 6.3.12 
  348.    (November 1994) Picture display extensions */
  349. /* derive number_of_frame_center_offsets */
  350. if (progressive_sequence)
  351. {
  352. if (repeat_first_field)
  353. {
  354. if (top_field_first)
  355. number_of_frame_center_offsets = 3;
  356. else
  357. number_of_frame_center_offsets = 2;
  358. }
  359. else
  360. number_of_frame_center_offsets = 1;
  361. }
  362. else
  363. {
  364. if (picture_structure!=FRAME_PICTURE)
  365. number_of_frame_center_offsets = 1;
  366. else
  367. {
  368. if (repeat_first_field)
  369. number_of_frame_center_offsets = 3;
  370. else
  371. number_of_frame_center_offsets = 2;
  372. }
  373. }
  374. /* now parse */
  375. for (i=0; i<number_of_frame_center_offsets; i++)
  376. {
  377. frame_center_horizontal_offset[i] = Get_Bits(16);
  378. Flush_Buffer(1); // marker bit
  379. frame_center_vertical_offset[i] = Get_Bits(16);
  380. Flush_Buffer(1); // marker bit
  381. }
  382. }
  383. /* decode picture coding extension */
  384. static void picture_coding_extension()
  385. {
  386. int chroma_420_type;
  387. int composite_display_flag;
  388. int v_axis;
  389. int field_sequence;
  390. int sub_carrier;
  391. int burst_amplitude;
  392. int sub_carrier_phase;
  393. f_code[0][0] = Get_Bits(4);
  394. f_code[0][1] = Get_Bits(4);
  395. f_code[1][0] = Get_Bits(4);
  396. f_code[1][1] = Get_Bits(4);
  397. intra_dc_precision = Get_Bits(2);
  398. picture_structure = Get_Bits(2);
  399. top_field_first = Get_Bits(1);
  400. frame_pred_frame_dct = Get_Bits(1);
  401. concealment_motion_vectors = Get_Bits(1);
  402. q_scale_type = Get_Bits(1);
  403. intra_vlc_format = Get_Bits(1);
  404. alternate_scan = Get_Bits(1);
  405. repeat_first_field = Get_Bits(1);
  406. chroma_420_type = Get_Bits(1);
  407. progressive_frame = Get_Bits(1);
  408. composite_display_flag = Get_Bits(1);
  409. d2v_current.pf = progressive_frame;
  410. d2v_current.trf = (top_field_first<<1) + repeat_first_field;
  411. if (composite_display_flag)
  412. {
  413. v_axis            = Get_Bits(1);
  414. field_sequence    = Get_Bits(3);
  415. sub_carrier       = Get_Bits(1);
  416. burst_amplitude   = Get_Bits(7);
  417. sub_carrier_phase = Get_Bits(8);
  418. }
  419. }
  420. /* decode extra bit information */
  421. /* ISO/IEC 13818-2 section 6.2.3.4. */
  422. static int extra_bit_information()
  423. {
  424. int Byte_Count = 0;
  425. while (Get_Bits(1))
  426. {
  427. Flush_Buffer(8);
  428. Byte_Count++;
  429. }
  430. return(Byte_Count);
  431. }
  432. /* Copyright extension */
  433. /* ISO/IEC 13818-2 section 6.2.3.6. */
  434. /* (header added in November, 1994 to the IS document) */
  435. static void copyright_extension()
  436. {
  437. int copyright_flag;
  438. int copyright_identifier;
  439. int original_or_copy;
  440. int copyright_number_1;
  441. int copyright_number_2;
  442. int copyright_number_3;
  443. int reserved_data;
  444. copyright_flag =       Get_Bits(1); 
  445. copyright_identifier = Get_Bits(8);
  446. original_or_copy =     Get_Bits(1);
  447.   
  448. /* reserved */
  449. reserved_data = Get_Bits(7);
  450. Flush_Buffer(1); // marker bit
  451. copyright_number_1 =   Get_Bits(20);
  452. Flush_Buffer(1); // marker bit
  453. copyright_number_2 =   Get_Bits(22);
  454. Flush_Buffer(1); // marker bit
  455. copyright_number_3 =   Get_Bits(22);
  456. }