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.

288 lines
9.6KB

  1. /*
  2. * H.26L/H.264/AVC/JVT/14496-10/... sei decoding
  3. * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * H.264 / AVC / MPEG4 part10 sei decoding.
  24. * @author Michael Niedermayer <michaelni@gmx.at>
  25. */
  26. #include "avcodec.h"
  27. #include "golomb.h"
  28. #include "h264.h"
  29. #include "internal.h"
  30. static const uint8_t sei_num_clock_ts_table[9] = {
  31. 1, 1, 1, 2, 2, 3, 3, 2, 3
  32. };
  33. void ff_h264_reset_sei(H264Context *h)
  34. {
  35. h->sei_recovery_frame_cnt = -1;
  36. h->sei_dpb_output_delay = 0;
  37. h->sei_cpb_removal_delay = -1;
  38. h->sei_buffering_period_present = 0;
  39. h->sei_frame_packing_present = 0;
  40. h->sei_display_orientation_present = 0;
  41. }
  42. static int decode_picture_timing(H264Context *h)
  43. {
  44. if (h->sps.nal_hrd_parameters_present_flag ||
  45. h->sps.vcl_hrd_parameters_present_flag) {
  46. h->sei_cpb_removal_delay = get_bits(&h->gb,
  47. h->sps.cpb_removal_delay_length);
  48. h->sei_dpb_output_delay = get_bits(&h->gb,
  49. h->sps.dpb_output_delay_length);
  50. }
  51. if (h->sps.pic_struct_present_flag) {
  52. unsigned int i, num_clock_ts;
  53. h->sei_pic_struct = get_bits(&h->gb, 4);
  54. h->sei_ct_type = 0;
  55. if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING)
  56. return AVERROR_INVALIDDATA;
  57. num_clock_ts = sei_num_clock_ts_table[h->sei_pic_struct];
  58. for (i = 0; i < num_clock_ts; i++) {
  59. if (get_bits(&h->gb, 1)) { /* clock_timestamp_flag */
  60. unsigned int full_timestamp_flag;
  61. h->sei_ct_type |= 1 << get_bits(&h->gb, 2);
  62. skip_bits(&h->gb, 1); /* nuit_field_based_flag */
  63. skip_bits(&h->gb, 5); /* counting_type */
  64. full_timestamp_flag = get_bits(&h->gb, 1);
  65. skip_bits(&h->gb, 1); /* discontinuity_flag */
  66. skip_bits(&h->gb, 1); /* cnt_dropped_flag */
  67. skip_bits(&h->gb, 8); /* n_frames */
  68. if (full_timestamp_flag) {
  69. skip_bits(&h->gb, 6); /* seconds_value 0..59 */
  70. skip_bits(&h->gb, 6); /* minutes_value 0..59 */
  71. skip_bits(&h->gb, 5); /* hours_value 0..23 */
  72. } else {
  73. if (get_bits(&h->gb, 1)) { /* seconds_flag */
  74. skip_bits(&h->gb, 6); /* seconds_value range 0..59 */
  75. if (get_bits(&h->gb, 1)) { /* minutes_flag */
  76. skip_bits(&h->gb, 6); /* minutes_value 0..59 */
  77. if (get_bits(&h->gb, 1)) /* hours_flag */
  78. skip_bits(&h->gb, 5); /* hours_value 0..23 */
  79. }
  80. }
  81. }
  82. if (h->sps.time_offset_length > 0)
  83. skip_bits(&h->gb,
  84. h->sps.time_offset_length); /* time_offset */
  85. }
  86. }
  87. if (h->avctx->debug & FF_DEBUG_PICT_INFO)
  88. av_log(h->avctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n",
  89. h->sei_ct_type, h->sei_pic_struct);
  90. }
  91. return 0;
  92. }
  93. static int decode_unregistered_user_data(H264Context *h, int size)
  94. {
  95. uint8_t user_data[16 + 256];
  96. int e, build, i;
  97. if (size < 16)
  98. return AVERROR_INVALIDDATA;
  99. for (i = 0; i < sizeof(user_data) - 1 && i < size; i++)
  100. user_data[i] = get_bits(&h->gb, 8);
  101. user_data[i] = 0;
  102. e = sscanf(user_data + 16, "x264 - core %d", &build);
  103. if (e == 1 && build > 0)
  104. h->x264_build = build;
  105. if (h->avctx->debug & FF_DEBUG_BUGS)
  106. av_log(h->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data + 16);
  107. for (; i < size; i++)
  108. skip_bits(&h->gb, 8);
  109. return 0;
  110. }
  111. static int decode_recovery_point(H264Context *h)
  112. {
  113. h->sei_recovery_frame_cnt = get_ue_golomb(&h->gb);
  114. /* 1b exact_match_flag,
  115. * 1b broken_link_flag,
  116. * 2b changing_slice_group_idc */
  117. skip_bits(&h->gb, 4);
  118. return 0;
  119. }
  120. static int decode_buffering_period(H264Context *h)
  121. {
  122. unsigned int sps_id;
  123. int sched_sel_idx;
  124. SPS *sps;
  125. sps_id = get_ue_golomb_31(&h->gb);
  126. if (sps_id > 31 || !h->sps_buffers[sps_id]) {
  127. av_log(h->avctx, AV_LOG_ERROR,
  128. "non-existing SPS %d referenced in buffering period\n", sps_id);
  129. return AVERROR_INVALIDDATA;
  130. }
  131. sps = h->sps_buffers[sps_id];
  132. // NOTE: This is really so duplicated in the standard... See H.264, D.1.1
  133. if (sps->nal_hrd_parameters_present_flag) {
  134. for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) {
  135. h->initial_cpb_removal_delay[sched_sel_idx] =
  136. get_bits(&h->gb, sps->initial_cpb_removal_delay_length);
  137. // initial_cpb_removal_delay_offset
  138. skip_bits(&h->gb, sps->initial_cpb_removal_delay_length);
  139. }
  140. }
  141. if (sps->vcl_hrd_parameters_present_flag) {
  142. for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) {
  143. h->initial_cpb_removal_delay[sched_sel_idx] =
  144. get_bits(&h->gb, sps->initial_cpb_removal_delay_length);
  145. // initial_cpb_removal_delay_offset
  146. skip_bits(&h->gb, sps->initial_cpb_removal_delay_length);
  147. }
  148. }
  149. h->sei_buffering_period_present = 1;
  150. return 0;
  151. }
  152. static int decode_frame_packing_arrangement(H264Context *h)
  153. {
  154. get_ue_golomb(&h->gb); // frame_packing_arrangement_id
  155. h->sei_frame_packing_present = !get_bits1(&h->gb);
  156. if (h->sei_frame_packing_present) {
  157. h->frame_packing_arrangement_type = get_bits(&h->gb, 7);
  158. h->quincunx_subsampling = get_bits1(&h->gb);
  159. h->content_interpretation_type = get_bits(&h->gb, 6);
  160. // the following skips: spatial_flipping_flag, frame0_flipped_flag,
  161. // field_views_flag, current_frame_is_frame0_flag,
  162. // frame0_self_contained_flag, frame1_self_contained_flag
  163. skip_bits(&h->gb, 6);
  164. if (!h->quincunx_subsampling && h->frame_packing_arrangement_type != 5)
  165. skip_bits(&h->gb, 16); // frame[01]_grid_position_[xy]
  166. skip_bits(&h->gb, 8); // frame_packing_arrangement_reserved_byte
  167. get_ue_golomb(&h->gb); // frame_packing_arrangement_repetition_period
  168. }
  169. skip_bits1(&h->gb); // frame_packing_arrangement_extension_flag
  170. return 0;
  171. }
  172. static int decode_display_orientation(H264Context *h)
  173. {
  174. h->sei_display_orientation_present = !get_bits1(&h->gb);
  175. if (h->sei_display_orientation_present) {
  176. h->sei_hflip = get_bits1(&h->gb); // hor_flip
  177. h->sei_vflip = get_bits1(&h->gb); // ver_flip
  178. h->sei_anticlockwise_rotation = get_bits(&h->gb, 16);
  179. get_ue_golomb(&h->gb); // display_orientation_repetition_period
  180. skip_bits1(&h->gb); // display_orientation_extension_flag
  181. }
  182. return 0;
  183. }
  184. int ff_h264_decode_sei(H264Context *h)
  185. {
  186. while (get_bits_left(&h->gb) > 16) {
  187. int size = 0;
  188. int type = 0;
  189. int ret = 0;
  190. int last = 0;
  191. while (get_bits_left(&h->gb) >= 8 &&
  192. (last = get_bits(&h->gb, 8)) == 255) {
  193. type += 255;
  194. }
  195. type += last;
  196. last = 0;
  197. while (get_bits_left(&h->gb) >= 8 &&
  198. (last = get_bits(&h->gb, 8)) == 255) {
  199. size += 255;
  200. }
  201. size += last;
  202. if (size > get_bits_left(&h->gb) / 8) {
  203. av_log(h->avctx, AV_LOG_ERROR, "SEI type %d truncated at %d\n",
  204. type, get_bits_left(&h->gb));
  205. return AVERROR_INVALIDDATA;
  206. }
  207. switch (type) {
  208. case SEI_TYPE_PIC_TIMING: // Picture timing SEI
  209. ret = decode_picture_timing(h);
  210. if (ret < 0)
  211. return ret;
  212. break;
  213. case SEI_TYPE_USER_DATA_UNREGISTERED:
  214. ret = decode_unregistered_user_data(h, size);
  215. if (ret < 0)
  216. return ret;
  217. break;
  218. case SEI_TYPE_RECOVERY_POINT:
  219. ret = decode_recovery_point(h);
  220. if (ret < 0)
  221. return ret;
  222. break;
  223. case SEI_TYPE_BUFFERING_PERIOD:
  224. ret = decode_buffering_period(h);
  225. if (ret < 0)
  226. return ret;
  227. break;
  228. case SEI_TYPE_FRAME_PACKING:
  229. ret = decode_frame_packing_arrangement(h);
  230. if (ret < 0)
  231. return ret;
  232. break;
  233. case SEI_TYPE_DISPLAY_ORIENTATION:
  234. ret = decode_display_orientation(h);
  235. if (ret < 0)
  236. return ret;
  237. break;
  238. default:
  239. av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
  240. skip_bits(&h->gb, 8 * size);
  241. }
  242. // FIXME check bits here
  243. align_get_bits(&h->gb);
  244. }
  245. return 0;
  246. }