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.

386 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_ref = av_buffer_alloc(k);
  60. if (!current->user_data_ref)
  61. return AVERROR(ENOMEM);
  62. current->user_data = current->user_data_ref->data;
  63. }
  64. #endif
  65. for (k = 0; k < current->user_data_length; k++)
  66. xui(8, user_data, current->user_data[k]);
  67. return 0;
  68. }
  69. static int FUNC(sequence_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  70. MPEG2RawSequenceExtension *current)
  71. {
  72. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  73. int err;
  74. HEADER("Sequence Extension");
  75. ui(8, profile_and_level_indication);
  76. ui(1, progressive_sequence);
  77. ui(2, chroma_format);
  78. ui(2, horizontal_size_extension);
  79. ui(2, vertical_size_extension);
  80. mpeg2->horizontal_size = (mpeg2->horizontal_size & 0xfff) |
  81. current->horizontal_size_extension << 12;
  82. mpeg2->vertical_size = (mpeg2->vertical_size & 0xfff) |
  83. current->vertical_size_extension << 12;
  84. mpeg2->progressive_sequence = current->progressive_sequence;
  85. ui(12, bit_rate_extension);
  86. marker_bit();
  87. ui(8, vbv_buffer_size_extension);
  88. ui(1, low_delay);
  89. ui(2, frame_rate_extension_n);
  90. ui(5, frame_rate_extension_d);
  91. return 0;
  92. }
  93. static int FUNC(sequence_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  94. MPEG2RawSequenceDisplayExtension *current)
  95. {
  96. int err;
  97. HEADER("Sequence Display Extension");
  98. ui(3, video_format);
  99. ui(1, colour_description);
  100. if (current->colour_description) {
  101. ui(8, colour_primaries);
  102. ui(8, transfer_characteristics);
  103. ui(8, matrix_coefficients);
  104. }
  105. ui(14, display_horizontal_size);
  106. marker_bit();
  107. ui(14, display_vertical_size);
  108. return 0;
  109. }
  110. static int FUNC(group_of_pictures_header)(CodedBitstreamContext *ctx, RWContext *rw,
  111. MPEG2RawGroupOfPicturesHeader *current)
  112. {
  113. int err;
  114. HEADER("Group of Pictures Header");
  115. ui(8, group_start_code);
  116. ui(25, time_code);
  117. ui(1, closed_gop);
  118. ui(1, broken_link);
  119. return 0;
  120. }
  121. static int FUNC(picture_header)(CodedBitstreamContext *ctx, RWContext *rw,
  122. MPEG2RawPictureHeader *current)
  123. {
  124. int err;
  125. HEADER("Picture Header");
  126. ui(8, picture_start_code);
  127. ui(10, temporal_reference);
  128. ui(3, picture_coding_type);
  129. ui(16, vbv_delay);
  130. if (current->picture_coding_type == 2 ||
  131. current->picture_coding_type == 3) {
  132. ui(1, full_pel_forward_vector);
  133. ui(3, forward_f_code);
  134. }
  135. if (current->picture_coding_type == 3) {
  136. ui(1, full_pel_backward_vector);
  137. ui(3, backward_f_code);
  138. }
  139. ui(1, extra_bit_picture);
  140. return 0;
  141. }
  142. static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  143. MPEG2RawPictureCodingExtension *current)
  144. {
  145. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  146. int err;
  147. HEADER("Picture Coding Extension");
  148. ui(4, f_code[0][0]);
  149. ui(4, f_code[0][1]);
  150. ui(4, f_code[1][0]);
  151. ui(4, f_code[1][1]);
  152. ui(2, intra_dc_precision);
  153. ui(2, picture_structure);
  154. ui(1, top_field_first);
  155. ui(1, frame_pred_frame_dct);
  156. ui(1, concealment_motion_vectors);
  157. ui(1, q_scale_type);
  158. ui(1, intra_vlc_format);
  159. ui(1, alternate_scan);
  160. ui(1, repeat_first_field);
  161. ui(1, chroma_420_type);
  162. ui(1, progressive_frame);
  163. if (mpeg2->progressive_sequence) {
  164. if (current->repeat_first_field) {
  165. if (current->top_field_first)
  166. mpeg2->number_of_frame_centre_offsets = 3;
  167. else
  168. mpeg2->number_of_frame_centre_offsets = 2;
  169. } else {
  170. mpeg2->number_of_frame_centre_offsets = 1;
  171. }
  172. } else {
  173. if (current->picture_structure == 1 || // Top field.
  174. current->picture_structure == 2) { // Bottom field.
  175. mpeg2->number_of_frame_centre_offsets = 1;
  176. } else {
  177. if (current->repeat_first_field)
  178. mpeg2->number_of_frame_centre_offsets = 3;
  179. else
  180. mpeg2->number_of_frame_centre_offsets = 2;
  181. }
  182. }
  183. ui(1, composite_display_flag);
  184. if (current->composite_display_flag) {
  185. ui(1, v_axis);
  186. ui(3, field_sequence);
  187. ui(1, sub_carrier);
  188. ui(7, burst_amplitude);
  189. ui(8, sub_carrier_phase);
  190. }
  191. return 0;
  192. }
  193. static int FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  194. MPEG2RawQuantMatrixExtension *current)
  195. {
  196. int err, i;
  197. HEADER("Quant Matrix Extension");
  198. ui(1, load_intra_quantiser_matrix);
  199. if (current->load_intra_quantiser_matrix) {
  200. for (i = 0; i < 64; i++)
  201. ui(8, intra_quantiser_matrix[i]);
  202. }
  203. ui(1, load_non_intra_quantiser_matrix);
  204. if (current->load_non_intra_quantiser_matrix) {
  205. for (i = 0; i < 64; i++)
  206. ui(8, non_intra_quantiser_matrix[i]);
  207. }
  208. ui(1, load_chroma_intra_quantiser_matrix);
  209. if (current->load_chroma_intra_quantiser_matrix) {
  210. for (i = 0; i < 64; i++)
  211. ui(8, intra_quantiser_matrix[i]);
  212. }
  213. ui(1, load_chroma_non_intra_quantiser_matrix);
  214. if (current->load_chroma_non_intra_quantiser_matrix) {
  215. for (i = 0; i < 64; i++)
  216. ui(8, chroma_non_intra_quantiser_matrix[i]);
  217. }
  218. return 0;
  219. }
  220. static int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  221. MPEG2RawPictureDisplayExtension *current)
  222. {
  223. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  224. int err, i;
  225. HEADER("Picture Display Extension");
  226. for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
  227. ui(16, frame_centre_horizontal_offset[i]);
  228. marker_bit();
  229. ui(16, frame_centre_vertical_offset[i]);
  230. marker_bit();
  231. }
  232. return 0;
  233. }
  234. static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
  235. MPEG2RawExtensionData *current)
  236. {
  237. int err;
  238. HEADER("Extension Data");
  239. ui(8, extension_start_code);
  240. ui(4, extension_start_code_identifier);
  241. switch (current->extension_start_code_identifier) {
  242. case 1:
  243. return FUNC(sequence_extension)
  244. (ctx, rw, &current->data.sequence);
  245. case 2:
  246. return FUNC(sequence_display_extension)
  247. (ctx, rw, &current->data.sequence_display);
  248. case 3:
  249. return FUNC(quant_matrix_extension)
  250. (ctx, rw, &current->data.quant_matrix);
  251. case 7:
  252. return FUNC(picture_display_extension)
  253. (ctx, rw, &current->data.picture_display);
  254. case 8:
  255. return FUNC(picture_coding_extension)
  256. (ctx, rw, &current->data.picture_coding);
  257. default:
  258. av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid extension ID %d.\n",
  259. current->extension_start_code_identifier);
  260. return AVERROR_INVALIDDATA;
  261. }
  262. }
  263. static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
  264. MPEG2RawSliceHeader *current)
  265. {
  266. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  267. int err;
  268. HEADER("Slice Header");
  269. ui(8, slice_vertical_position);
  270. if (mpeg2->vertical_size > 2800)
  271. ui(3, slice_vertical_position_extension);
  272. if (mpeg2->scalable) {
  273. if (mpeg2->scalable_mode == 0)
  274. ui(7, priority_breakpoint);
  275. }
  276. ui(5, quantiser_scale_code);
  277. if (nextbits(1, 1, current->slice_extension_flag)) {
  278. ui(1, slice_extension_flag);
  279. ui(1, intra_slice);
  280. ui(1, slice_picture_id_enable);
  281. ui(6, slice_picture_id);
  282. {
  283. size_t k;
  284. #ifdef READ
  285. BitstreamContext start;
  286. uint8_t bit;
  287. start = *rw;
  288. for (k = 0; nextbits(1, 1, bit); k++)
  289. bitstream_skip(rw, 8);
  290. current->extra_information_length = k;
  291. if (k > 0) {
  292. *rw = start;
  293. current->extra_information =
  294. av_malloc(current->extra_information_length);
  295. if (!current->extra_information)
  296. return AVERROR(ENOMEM);
  297. for (k = 0; k < current->extra_information_length; k++) {
  298. xui(1, extra_bit_slice, bit);
  299. xui(8, extra_information_slice,
  300. current->extra_information[k]);
  301. }
  302. }
  303. #else
  304. for (k = 0; k < current->extra_information_length; k++) {
  305. xui(1, extra_bit_slice, 1);
  306. xui(8, extra_information_slice, current->extra_information[k]);
  307. }
  308. #endif
  309. }
  310. }
  311. ui(1, extra_bit_slice);
  312. return 0;
  313. }