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.

426 lines
12KB

  1. /*
  2. * This file is part of FFmpeg.
  3. *
  4. * FFmpeg 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. * FFmpeg 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 FFmpeg; 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. uir(12, horizontal_size_value);
  26. uir(12, vertical_size_value);
  27. mpeg2->horizontal_size = current->horizontal_size_value;
  28. mpeg2->vertical_size = current->vertical_size_value;
  29. uir(4, aspect_ratio_information);
  30. uir(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. uirs(8, intra_quantiser_matrix[i], 1, 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. uirs(8, non_intra_quantiser_matrix[i], 1, 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 = get_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_allocz(k + AV_INPUT_BUFFER_PADDING_SIZE);
  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. uis(8, user_data[k], 1, 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. #ifdef READ
  102. #define READ_AND_PATCH(name) do { \
  103. ui(8, name); \
  104. if (current->name == 0) { \
  105. current->name = 2; \
  106. av_log(ctx->log_ctx, AV_LOG_WARNING, "%s in a sequence display " \
  107. "extension had the invalid value 0. Setting it to 2 " \
  108. "(meaning unknown) instead.\n", #name); \
  109. } \
  110. } while (0)
  111. READ_AND_PATCH(colour_primaries);
  112. READ_AND_PATCH(transfer_characteristics);
  113. READ_AND_PATCH(matrix_coefficients);
  114. #undef READ_AND_PATCH
  115. #else
  116. uir(8, colour_primaries);
  117. uir(8, transfer_characteristics);
  118. uir(8, matrix_coefficients);
  119. #endif
  120. } else {
  121. infer(colour_primaries, 2);
  122. infer(transfer_characteristics, 2);
  123. infer(matrix_coefficients, 2);
  124. }
  125. ui(14, display_horizontal_size);
  126. marker_bit();
  127. ui(14, display_vertical_size);
  128. return 0;
  129. }
  130. static int FUNC(group_of_pictures_header)(CodedBitstreamContext *ctx, RWContext *rw,
  131. MPEG2RawGroupOfPicturesHeader *current)
  132. {
  133. int err;
  134. HEADER("Group of Pictures Header");
  135. ui(8, group_start_code);
  136. ui(25, time_code);
  137. ui(1, closed_gop);
  138. ui(1, broken_link);
  139. return 0;
  140. }
  141. static int FUNC(extra_information)(CodedBitstreamContext *ctx, RWContext *rw,
  142. MPEG2RawExtraInformation *current,
  143. const char *element_name, const char *marker_name)
  144. {
  145. int err;
  146. size_t k;
  147. #ifdef READ
  148. GetBitContext start = *rw;
  149. uint8_t bit;
  150. for (k = 0; nextbits(1, 1, bit); k++)
  151. skip_bits(rw, 1 + 8);
  152. current->extra_information_length = k;
  153. if (k > 0) {
  154. *rw = start;
  155. current->extra_information_ref =
  156. av_buffer_allocz(k + AV_INPUT_BUFFER_PADDING_SIZE);
  157. if (!current->extra_information_ref)
  158. return AVERROR(ENOMEM);
  159. current->extra_information = current->extra_information_ref->data;
  160. }
  161. #endif
  162. for (k = 0; k < current->extra_information_length; k++) {
  163. bit(marker_name, 1);
  164. xuia(8, element_name,
  165. current->extra_information[k], 0, 255, 1, k);
  166. }
  167. bit(marker_name, 0);
  168. return 0;
  169. }
  170. static int FUNC(picture_header)(CodedBitstreamContext *ctx, RWContext *rw,
  171. MPEG2RawPictureHeader *current)
  172. {
  173. int err;
  174. HEADER("Picture Header");
  175. ui(8, picture_start_code);
  176. ui(10, temporal_reference);
  177. uir(3, picture_coding_type);
  178. ui(16, vbv_delay);
  179. if (current->picture_coding_type == 2 ||
  180. current->picture_coding_type == 3) {
  181. ui(1, full_pel_forward_vector);
  182. ui(3, forward_f_code);
  183. }
  184. if (current->picture_coding_type == 3) {
  185. ui(1, full_pel_backward_vector);
  186. ui(3, backward_f_code);
  187. }
  188. CHECK(FUNC(extra_information)(ctx, rw, &current->extra_information_picture,
  189. "extra_information_picture[k]", "extra_bit_picture"));
  190. return 0;
  191. }
  192. static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  193. MPEG2RawPictureCodingExtension *current)
  194. {
  195. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  196. int err;
  197. HEADER("Picture Coding Extension");
  198. uir(4, f_code[0][0]);
  199. uir(4, f_code[0][1]);
  200. uir(4, f_code[1][0]);
  201. uir(4, f_code[1][1]);
  202. ui(2, intra_dc_precision);
  203. ui(2, picture_structure);
  204. ui(1, top_field_first);
  205. ui(1, frame_pred_frame_dct);
  206. ui(1, concealment_motion_vectors);
  207. ui(1, q_scale_type);
  208. ui(1, intra_vlc_format);
  209. ui(1, alternate_scan);
  210. ui(1, repeat_first_field);
  211. ui(1, chroma_420_type);
  212. ui(1, progressive_frame);
  213. if (mpeg2->progressive_sequence) {
  214. if (current->repeat_first_field) {
  215. if (current->top_field_first)
  216. mpeg2->number_of_frame_centre_offsets = 3;
  217. else
  218. mpeg2->number_of_frame_centre_offsets = 2;
  219. } else {
  220. mpeg2->number_of_frame_centre_offsets = 1;
  221. }
  222. } else {
  223. if (current->picture_structure == 1 || // Top field.
  224. current->picture_structure == 2) { // Bottom field.
  225. mpeg2->number_of_frame_centre_offsets = 1;
  226. } else {
  227. if (current->repeat_first_field)
  228. mpeg2->number_of_frame_centre_offsets = 3;
  229. else
  230. mpeg2->number_of_frame_centre_offsets = 2;
  231. }
  232. }
  233. ui(1, composite_display_flag);
  234. if (current->composite_display_flag) {
  235. ui(1, v_axis);
  236. ui(3, field_sequence);
  237. ui(1, sub_carrier);
  238. ui(7, burst_amplitude);
  239. ui(8, sub_carrier_phase);
  240. }
  241. return 0;
  242. }
  243. static int FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  244. MPEG2RawQuantMatrixExtension *current)
  245. {
  246. int err, i;
  247. HEADER("Quant Matrix Extension");
  248. ui(1, load_intra_quantiser_matrix);
  249. if (current->load_intra_quantiser_matrix) {
  250. for (i = 0; i < 64; i++)
  251. uirs(8, intra_quantiser_matrix[i], 1, i);
  252. }
  253. ui(1, load_non_intra_quantiser_matrix);
  254. if (current->load_non_intra_quantiser_matrix) {
  255. for (i = 0; i < 64; i++)
  256. uirs(8, non_intra_quantiser_matrix[i], 1, i);
  257. }
  258. ui(1, load_chroma_intra_quantiser_matrix);
  259. if (current->load_chroma_intra_quantiser_matrix) {
  260. for (i = 0; i < 64; i++)
  261. uirs(8, intra_quantiser_matrix[i], 1, i);
  262. }
  263. ui(1, load_chroma_non_intra_quantiser_matrix);
  264. if (current->load_chroma_non_intra_quantiser_matrix) {
  265. for (i = 0; i < 64; i++)
  266. uirs(8, chroma_non_intra_quantiser_matrix[i], 1, i);
  267. }
  268. return 0;
  269. }
  270. static int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  271. MPEG2RawPictureDisplayExtension *current)
  272. {
  273. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  274. int err, i;
  275. HEADER("Picture Display Extension");
  276. for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
  277. sis(16, frame_centre_horizontal_offset[i], 1, i);
  278. marker_bit();
  279. sis(16, frame_centre_vertical_offset[i], 1, i);
  280. marker_bit();
  281. }
  282. return 0;
  283. }
  284. static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
  285. MPEG2RawExtensionData *current)
  286. {
  287. int err;
  288. HEADER("Extension Data");
  289. ui(8, extension_start_code);
  290. ui(4, extension_start_code_identifier);
  291. switch (current->extension_start_code_identifier) {
  292. case MPEG2_EXTENSION_SEQUENCE:
  293. return FUNC(sequence_extension)
  294. (ctx, rw, &current->data.sequence);
  295. case MPEG2_EXTENSION_SEQUENCE_DISPLAY:
  296. return FUNC(sequence_display_extension)
  297. (ctx, rw, &current->data.sequence_display);
  298. case MPEG2_EXTENSION_QUANT_MATRIX:
  299. return FUNC(quant_matrix_extension)
  300. (ctx, rw, &current->data.quant_matrix);
  301. case MPEG2_EXTENSION_PICTURE_DISPLAY:
  302. return FUNC(picture_display_extension)
  303. (ctx, rw, &current->data.picture_display);
  304. case MPEG2_EXTENSION_PICTURE_CODING:
  305. return FUNC(picture_coding_extension)
  306. (ctx, rw, &current->data.picture_coding);
  307. default:
  308. av_log(ctx->log_ctx, AV_LOG_ERROR, "Extension ID %d not supported.\n",
  309. current->extension_start_code_identifier);
  310. return AVERROR_PATCHWELCOME;
  311. }
  312. }
  313. static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
  314. MPEG2RawSliceHeader *current)
  315. {
  316. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  317. int err;
  318. HEADER("Slice Header");
  319. ui(8, slice_vertical_position);
  320. if (mpeg2->vertical_size > 2800)
  321. ui(3, slice_vertical_position_extension);
  322. if (mpeg2->scalable) {
  323. if (mpeg2->scalable_mode == 0)
  324. ui(7, priority_breakpoint);
  325. }
  326. uir(5, quantiser_scale_code);
  327. if (nextbits(1, 1, current->slice_extension_flag)) {
  328. ui(1, slice_extension_flag);
  329. ui(1, intra_slice);
  330. ui(1, slice_picture_id_enable);
  331. ui(6, slice_picture_id);
  332. }
  333. CHECK(FUNC(extra_information)(ctx, rw, &current->extra_information_slice,
  334. "extra_information_slice[k]", "extra_bit_slice"));
  335. return 0;
  336. }
  337. static int FUNC(sequence_end)(CodedBitstreamContext *ctx, RWContext *rw,
  338. MPEG2RawSequenceEnd *current)
  339. {
  340. int err;
  341. HEADER("Sequence End");
  342. ui(8, sequence_end_code);
  343. return 0;
  344. }