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.

385 lines
11KB

  1. /*
  2. * This file is part of Libav.
  3. *
  4. * Libav is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * Libav is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with Libav; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. static int FUNC(sequence_header)(CodedBitstreamContext *ctx, RWContext *rw,
  19. MPEG2RawSequenceHeader *current)
  20. {
  21. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  22. int err, i;
  23. HEADER("Sequence Header");
  24. ui(8, sequence_header_code);
  25. ui(12, horizontal_size_value);
  26. ui(12, vertical_size_value);
  27. mpeg2->horizontal_size = current->horizontal_size_value;
  28. mpeg2->vertical_size = current->vertical_size_value;
  29. ui(4, aspect_ratio_information);
  30. ui(4, frame_rate_code);
  31. ui(18, bit_rate_value);
  32. marker_bit();
  33. ui(10, vbv_buffer_size_value);
  34. ui(1, constrained_parameters_flag);
  35. ui(1, load_intra_quantiser_matrix);
  36. if (current->load_intra_quantiser_matrix) {
  37. for (i = 0; i < 64; i++)
  38. ui(8, intra_quantiser_matrix[i]);
  39. }
  40. ui(1, load_non_intra_quantiser_matrix);
  41. if (current->load_non_intra_quantiser_matrix) {
  42. for (i = 0; i < 64; i++)
  43. ui(8, non_intra_quantiser_matrix[i]);
  44. }
  45. return 0;
  46. }
  47. static int FUNC(user_data)(CodedBitstreamContext *ctx, RWContext *rw,
  48. MPEG2RawUserData *current)
  49. {
  50. size_t k;
  51. int err;
  52. HEADER("User Data");
  53. ui(8, user_data_start_code);
  54. #ifdef READ
  55. k = bitstream_bits_left(rw);
  56. av_assert0(k % 8 == 0);
  57. current->user_data_length = k /= 8;
  58. if (k > 0) {
  59. current->user_data = av_malloc(k);
  60. if (!current->user_data)
  61. return AVERROR(ENOMEM);
  62. }
  63. #endif
  64. for (k = 0; k < current->user_data_length; k++)
  65. xui(8, user_data, current->user_data[k]);
  66. return 0;
  67. }
  68. static int FUNC(sequence_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  69. MPEG2RawSequenceExtension *current)
  70. {
  71. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  72. int err;
  73. HEADER("Sequence Extension");
  74. ui(8, profile_and_level_indication);
  75. ui(1, progressive_sequence);
  76. ui(2, chroma_format);
  77. ui(2, horizontal_size_extension);
  78. ui(2, vertical_size_extension);
  79. mpeg2->horizontal_size = (mpeg2->horizontal_size & 0xfff) |
  80. current->horizontal_size_extension << 12;
  81. mpeg2->vertical_size = (mpeg2->vertical_size & 0xfff) |
  82. current->vertical_size_extension << 12;
  83. mpeg2->progressive_sequence = current->progressive_sequence;
  84. ui(12, bit_rate_extension);
  85. marker_bit();
  86. ui(8, vbv_buffer_size_extension);
  87. ui(1, low_delay);
  88. ui(2, frame_rate_extension_n);
  89. ui(5, frame_rate_extension_d);
  90. return 0;
  91. }
  92. static int FUNC(sequence_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  93. MPEG2RawSequenceDisplayExtension *current)
  94. {
  95. int err;
  96. HEADER("Sequence Display Extension");
  97. ui(3, video_format);
  98. ui(1, colour_description);
  99. if (current->colour_description) {
  100. ui(8, colour_primaries);
  101. ui(8, transfer_characteristics);
  102. ui(8, matrix_coefficients);
  103. }
  104. ui(14, display_horizontal_size);
  105. marker_bit();
  106. ui(14, display_vertical_size);
  107. return 0;
  108. }
  109. static int FUNC(group_of_pictures_header)(CodedBitstreamContext *ctx, RWContext *rw,
  110. MPEG2RawGroupOfPicturesHeader *current)
  111. {
  112. int err;
  113. HEADER("Group of Pictures Header");
  114. ui(8, group_start_code);
  115. ui(25, time_code);
  116. ui(1, closed_gop);
  117. ui(1, broken_link);
  118. return 0;
  119. }
  120. static int FUNC(picture_header)(CodedBitstreamContext *ctx, RWContext *rw,
  121. MPEG2RawPictureHeader *current)
  122. {
  123. int err;
  124. HEADER("Picture Header");
  125. ui(8, picture_start_code);
  126. ui(10, temporal_reference);
  127. ui(3, picture_coding_type);
  128. ui(16, vbv_delay);
  129. if (current->picture_coding_type == 2 ||
  130. current->picture_coding_type == 3) {
  131. ui(1, full_pel_forward_vector);
  132. ui(3, forward_f_code);
  133. }
  134. if (current->picture_coding_type == 3) {
  135. ui(1, full_pel_backward_vector);
  136. ui(3, backward_f_code);
  137. }
  138. ui(1, extra_bit_picture);
  139. return 0;
  140. }
  141. static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  142. MPEG2RawPictureCodingExtension *current)
  143. {
  144. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  145. int err;
  146. HEADER("Picture Coding Extension");
  147. ui(4, f_code[0][0]);
  148. ui(4, f_code[0][1]);
  149. ui(4, f_code[1][0]);
  150. ui(4, f_code[1][1]);
  151. ui(2, intra_dc_precision);
  152. ui(2, picture_structure);
  153. ui(1, top_field_first);
  154. ui(1, frame_pred_frame_dct);
  155. ui(1, concealment_motion_vectors);
  156. ui(1, q_scale_type);
  157. ui(1, intra_vlc_format);
  158. ui(1, alternate_scan);
  159. ui(1, repeat_first_field);
  160. ui(1, chroma_420_type);
  161. ui(1, progressive_frame);
  162. if (mpeg2->progressive_sequence) {
  163. if (current->repeat_first_field) {
  164. if (current->top_field_first)
  165. mpeg2->number_of_frame_centre_offsets = 3;
  166. else
  167. mpeg2->number_of_frame_centre_offsets = 2;
  168. } else {
  169. mpeg2->number_of_frame_centre_offsets = 1;
  170. }
  171. } else {
  172. if (current->picture_structure == 1 || // Top field.
  173. current->picture_structure == 2) { // Bottom field.
  174. mpeg2->number_of_frame_centre_offsets = 1;
  175. } else {
  176. if (current->repeat_first_field)
  177. mpeg2->number_of_frame_centre_offsets = 3;
  178. else
  179. mpeg2->number_of_frame_centre_offsets = 2;
  180. }
  181. }
  182. ui(1, composite_display_flag);
  183. if (current->composite_display_flag) {
  184. ui(1, v_axis);
  185. ui(3, field_sequence);
  186. ui(1, sub_carrier);
  187. ui(7, burst_amplitude);
  188. ui(8, sub_carrier_phase);
  189. }
  190. return 0;
  191. }
  192. static int FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  193. MPEG2RawQuantMatrixExtension *current)
  194. {
  195. int err, i;
  196. HEADER("Quant Matrix Extension");
  197. ui(1, load_intra_quantiser_matrix);
  198. if (current->load_intra_quantiser_matrix) {
  199. for (i = 0; i < 64; i++)
  200. ui(8, intra_quantiser_matrix[i]);
  201. }
  202. ui(1, load_non_intra_quantiser_matrix);
  203. if (current->load_non_intra_quantiser_matrix) {
  204. for (i = 0; i < 64; i++)
  205. ui(8, non_intra_quantiser_matrix[i]);
  206. }
  207. ui(1, load_chroma_intra_quantiser_matrix);
  208. if (current->load_chroma_intra_quantiser_matrix) {
  209. for (i = 0; i < 64; i++)
  210. ui(8, intra_quantiser_matrix[i]);
  211. }
  212. ui(1, load_chroma_non_intra_quantiser_matrix);
  213. if (current->load_chroma_non_intra_quantiser_matrix) {
  214. for (i = 0; i < 64; i++)
  215. ui(8, chroma_non_intra_quantiser_matrix[i]);
  216. }
  217. return 0;
  218. }
  219. static int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  220. MPEG2RawPictureDisplayExtension *current)
  221. {
  222. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  223. int err, i;
  224. HEADER("Picture Display Extension");
  225. for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
  226. ui(16, frame_centre_horizontal_offset[i]);
  227. marker_bit();
  228. ui(16, frame_centre_vertical_offset[i]);
  229. marker_bit();
  230. }
  231. return 0;
  232. }
  233. static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
  234. MPEG2RawExtensionData *current)
  235. {
  236. int err;
  237. HEADER("Extension Data");
  238. ui(8, extension_start_code);
  239. ui(4, extension_start_code_identifier);
  240. switch (current->extension_start_code_identifier) {
  241. case 1:
  242. return FUNC(sequence_extension)
  243. (ctx, rw, &current->data.sequence);
  244. case 2:
  245. return FUNC(sequence_display_extension)
  246. (ctx, rw, &current->data.sequence_display);
  247. case 3:
  248. return FUNC(quant_matrix_extension)
  249. (ctx, rw, &current->data.quant_matrix);
  250. case 7:
  251. return FUNC(picture_display_extension)
  252. (ctx, rw, &current->data.picture_display);
  253. case 8:
  254. return FUNC(picture_coding_extension)
  255. (ctx, rw, &current->data.picture_coding);
  256. default:
  257. av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid extension ID %d.\n",
  258. current->extension_start_code_identifier);
  259. return AVERROR_INVALIDDATA;
  260. }
  261. }
  262. static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
  263. MPEG2RawSliceHeader *current)
  264. {
  265. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  266. int err;
  267. HEADER("Slice Header");
  268. ui(8, slice_vertical_position);
  269. if (mpeg2->vertical_size > 2800)
  270. ui(3, slice_vertical_position_extension);
  271. if (mpeg2->scalable) {
  272. if (mpeg2->scalable_mode == 0)
  273. ui(7, priority_breakpoint);
  274. }
  275. ui(5, quantiser_scale_code);
  276. if (nextbits(1, 1, current->slice_extension_flag)) {
  277. ui(1, slice_extension_flag);
  278. ui(1, intra_slice);
  279. ui(1, slice_picture_id_enable);
  280. ui(6, slice_picture_id);
  281. {
  282. size_t k;
  283. #ifdef READ
  284. BitstreamContext start;
  285. uint8_t bit;
  286. start = *rw;
  287. for (k = 0; nextbits(1, 1, bit); k++)
  288. bitstream_skip(rw, 8);
  289. current->extra_information_length = k;
  290. if (k > 0) {
  291. *rw = start;
  292. current->extra_information =
  293. av_malloc(current->extra_information_length);
  294. if (!current->extra_information)
  295. return AVERROR(ENOMEM);
  296. for (k = 0; k < current->extra_information_length; k++) {
  297. xui(1, extra_bit_slice, bit);
  298. xui(8, extra_information_slice,
  299. current->extra_information[k]);
  300. }
  301. }
  302. #else
  303. for (k = 0; k < current->extra_information_length; k++) {
  304. xui(1, extra_bit_slice, 1);
  305. xui(8, extra_information_slice, current->extra_information[k]);
  306. }
  307. #endif
  308. }
  309. }
  310. ui(1, extra_bit_slice);
  311. return 0;
  312. }