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.

341 lines
9.2KB

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