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.

408 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(picture_header)(CodedBitstreamContext *ctx, RWContext *rw,
  142. MPEG2RawPictureHeader *current)
  143. {
  144. int err;
  145. HEADER("Picture Header");
  146. ui(8, picture_start_code);
  147. ui(10, temporal_reference);
  148. uir(3, picture_coding_type);
  149. ui(16, vbv_delay);
  150. if (current->picture_coding_type == 2 ||
  151. current->picture_coding_type == 3) {
  152. ui(1, full_pel_forward_vector);
  153. ui(3, forward_f_code);
  154. }
  155. if (current->picture_coding_type == 3) {
  156. ui(1, full_pel_backward_vector);
  157. ui(3, backward_f_code);
  158. }
  159. ui(1, extra_bit_picture);
  160. return 0;
  161. }
  162. static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  163. MPEG2RawPictureCodingExtension *current)
  164. {
  165. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  166. int err;
  167. HEADER("Picture Coding Extension");
  168. uir(4, f_code[0][0]);
  169. uir(4, f_code[0][1]);
  170. uir(4, f_code[1][0]);
  171. uir(4, f_code[1][1]);
  172. ui(2, intra_dc_precision);
  173. ui(2, picture_structure);
  174. ui(1, top_field_first);
  175. ui(1, frame_pred_frame_dct);
  176. ui(1, concealment_motion_vectors);
  177. ui(1, q_scale_type);
  178. ui(1, intra_vlc_format);
  179. ui(1, alternate_scan);
  180. ui(1, repeat_first_field);
  181. ui(1, chroma_420_type);
  182. ui(1, progressive_frame);
  183. if (mpeg2->progressive_sequence) {
  184. if (current->repeat_first_field) {
  185. if (current->top_field_first)
  186. mpeg2->number_of_frame_centre_offsets = 3;
  187. else
  188. mpeg2->number_of_frame_centre_offsets = 2;
  189. } else {
  190. mpeg2->number_of_frame_centre_offsets = 1;
  191. }
  192. } else {
  193. if (current->picture_structure == 1 || // Top field.
  194. current->picture_structure == 2) { // Bottom field.
  195. mpeg2->number_of_frame_centre_offsets = 1;
  196. } else {
  197. if (current->repeat_first_field)
  198. mpeg2->number_of_frame_centre_offsets = 3;
  199. else
  200. mpeg2->number_of_frame_centre_offsets = 2;
  201. }
  202. }
  203. ui(1, composite_display_flag);
  204. if (current->composite_display_flag) {
  205. ui(1, v_axis);
  206. ui(3, field_sequence);
  207. ui(1, sub_carrier);
  208. ui(7, burst_amplitude);
  209. ui(8, sub_carrier_phase);
  210. }
  211. return 0;
  212. }
  213. static int FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  214. MPEG2RawQuantMatrixExtension *current)
  215. {
  216. int err, i;
  217. HEADER("Quant Matrix Extension");
  218. ui(1, load_intra_quantiser_matrix);
  219. if (current->load_intra_quantiser_matrix) {
  220. for (i = 0; i < 64; i++)
  221. uirs(8, intra_quantiser_matrix[i], 1, i);
  222. }
  223. ui(1, load_non_intra_quantiser_matrix);
  224. if (current->load_non_intra_quantiser_matrix) {
  225. for (i = 0; i < 64; i++)
  226. uirs(8, non_intra_quantiser_matrix[i], 1, i);
  227. }
  228. ui(1, load_chroma_intra_quantiser_matrix);
  229. if (current->load_chroma_intra_quantiser_matrix) {
  230. for (i = 0; i < 64; i++)
  231. uirs(8, intra_quantiser_matrix[i], 1, i);
  232. }
  233. ui(1, load_chroma_non_intra_quantiser_matrix);
  234. if (current->load_chroma_non_intra_quantiser_matrix) {
  235. for (i = 0; i < 64; i++)
  236. uirs(8, chroma_non_intra_quantiser_matrix[i], 1, i);
  237. }
  238. return 0;
  239. }
  240. static int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
  241. MPEG2RawPictureDisplayExtension *current)
  242. {
  243. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  244. int err, i;
  245. HEADER("Picture Display Extension");
  246. for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
  247. sis(16, frame_centre_horizontal_offset[i], 1, i);
  248. marker_bit();
  249. sis(16, frame_centre_vertical_offset[i], 1, i);
  250. marker_bit();
  251. }
  252. return 0;
  253. }
  254. static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
  255. MPEG2RawExtensionData *current)
  256. {
  257. int err;
  258. HEADER("Extension Data");
  259. ui(8, extension_start_code);
  260. ui(4, extension_start_code_identifier);
  261. switch (current->extension_start_code_identifier) {
  262. case MPEG2_EXTENSION_SEQUENCE:
  263. return FUNC(sequence_extension)
  264. (ctx, rw, &current->data.sequence);
  265. case MPEG2_EXTENSION_SEQUENCE_DISPLAY:
  266. return FUNC(sequence_display_extension)
  267. (ctx, rw, &current->data.sequence_display);
  268. case MPEG2_EXTENSION_QUANT_MATRIX:
  269. return FUNC(quant_matrix_extension)
  270. (ctx, rw, &current->data.quant_matrix);
  271. case MPEG2_EXTENSION_PICTURE_DISPLAY:
  272. return FUNC(picture_display_extension)
  273. (ctx, rw, &current->data.picture_display);
  274. case MPEG2_EXTENSION_PICTURE_CODING:
  275. return FUNC(picture_coding_extension)
  276. (ctx, rw, &current->data.picture_coding);
  277. default:
  278. av_log(ctx->log_ctx, AV_LOG_ERROR, "Extension ID %d not supported.\n",
  279. current->extension_start_code_identifier);
  280. return AVERROR_PATCHWELCOME;
  281. }
  282. }
  283. static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
  284. MPEG2RawSliceHeader *current)
  285. {
  286. CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
  287. int err;
  288. HEADER("Slice Header");
  289. ui(8, slice_vertical_position);
  290. if (mpeg2->vertical_size > 2800)
  291. ui(3, slice_vertical_position_extension);
  292. if (mpeg2->scalable) {
  293. if (mpeg2->scalable_mode == 0)
  294. ui(7, priority_breakpoint);
  295. }
  296. uir(5, quantiser_scale_code);
  297. if (nextbits(1, 1, current->slice_extension_flag)) {
  298. ui(1, slice_extension_flag);
  299. ui(1, intra_slice);
  300. ui(1, slice_picture_id_enable);
  301. ui(6, slice_picture_id);
  302. {
  303. size_t k;
  304. #ifdef READ
  305. GetBitContext start;
  306. uint8_t bit;
  307. start = *rw;
  308. for (k = 0; nextbits(1, 1, bit); k++)
  309. skip_bits(rw, 8);
  310. current->extra_information_length = k;
  311. if (k > 0) {
  312. *rw = start;
  313. current->extra_information_ref =
  314. av_buffer_alloc(current->extra_information_length);
  315. if (!current->extra_information_ref)
  316. return AVERROR(ENOMEM);
  317. current->extra_information = current->extra_information_ref->data;
  318. for (k = 0; k < current->extra_information_length; k++) {
  319. xui(1, extra_bit_slice, bit, 1, 1, 0);
  320. xui(8, extra_information_slice[k],
  321. current->extra_information[k], 0, 255, 1, k);
  322. }
  323. }
  324. #else
  325. for (k = 0; k < current->extra_information_length; k++) {
  326. xui(1, extra_bit_slice, 1, 1, 1, 0);
  327. xui(8, extra_information_slice[k],
  328. current->extra_information[k], 0, 255, 1, k);
  329. }
  330. #endif
  331. }
  332. }
  333. ui(1, extra_bit_slice);
  334. return 0;
  335. }