1 /*****************************************************************************
2 * Copyright © 2010-2014 VideoLAN
4 * Authors: Jean-Baptiste Kempf <jb@videolan.org>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
23 # include <vlc_common.h>
26 #define PROFILE_H264_BASELINE 66
27 #define PROFILE_H264_MAIN 77
28 #define PROFILE_H264_EXTENDED 88
29 #define PROFILE_H264_HIGH 100
30 #define PROFILE_H264_HIGH_10 110
31 #define PROFILE_H264_HIGH_422 122
32 #define PROFILE_H264_HIGH_444 144
33 #define PROFILE_H264_HIGH_444_PREDICTIVE 244
35 #define PROFILE_H264_CAVLC_INTRA 44
36 #define PROFILE_H264_SVC_BASELINE 83
37 #define PROFILE_H264_SVC_HIGH 86
38 #define PROFILE_H264_MVC_STEREO_HIGH 128
39 #define PROFILE_H264_MVC_MULTIVIEW_HIGH 118
41 #define PROFILE_H264_MFC_HIGH 134
42 #define PROFILE_H264_MVC_MULTIVIEW_DEPTH_HIGH 138
43 #define PROFILE_H264_MVC_ENHANCED_MULTIVIEW_DEPTH_HIGH 139
45 #define H264_SPS_ID_MAX (31)
46 #define H264_PPS_ID_MAX (255)
48 enum h264_nal_unit_type_e
52 H264_NAL_SLICE_DPA
= 2,
53 H264_NAL_SLICE_DPB
= 3,
54 H264_NAL_SLICE_DPC
= 4,
55 H264_NAL_SLICE_IDR
= 5, /* ref_idc != 0 */
56 H264_NAL_SEI
= 6, /* ref_idc == 0 */
59 H264_NAL_AU_DELIMITER
= 9,
60 /* ref_idc == 0 for 6,9,10,11,12 */
61 H264_NAL_END_OF_SEQ
= 10,
62 H264_NAL_END_OF_STREAM
= 11,
63 H264_NAL_FILLER_DATA
= 12,
64 H264_NAL_SPS_EXT
= 13,
66 H264_NAL_SUBSET_SPS
= 15,
67 H264_NAL_DEPTH_PS
= 16,
68 H264_NAL_RESERVED_17
= 17,
69 H264_NAL_RESERVED_18
= 18,
70 H264_NAL_SLICE_WP
= 19,
71 H264_NAL_SLICE_EXT
= 20,
72 H264_NAL_SLICE_3D_EXT
= 21,
73 H264_NAL_RESERVED_22
= 22,
74 H264_NAL_RESERVED_23
= 23,
77 typedef struct h264_sequence_parameter_set_t h264_sequence_parameter_set_t
;
78 typedef struct h264_picture_parameter_set_t h264_picture_parameter_set_t
;
80 h264_sequence_parameter_set_t
* h264_decode_sps( const uint8_t *, size_t, bool );
81 h264_picture_parameter_set_t
* h264_decode_pps( const uint8_t *, size_t, bool );
83 void h264_release_sps( h264_sequence_parameter_set_t
* );
84 void h264_release_pps( h264_picture_parameter_set_t
* );
86 struct h264_sequence_parameter_set_t
89 uint8_t i_profile
, i_level
;
90 uint8_t i_constraint_set_flags
;
91 /* according to avcC, 3 bits max for those */
93 uint8_t i_bit_depth_luma
;
94 uint8_t i_bit_depth_chroma
;
95 uint8_t b_separate_colour_planes_flag
;
97 uint32_t pic_width_in_mbs_minus1
;
98 uint32_t pic_height_in_map_units_minus1
;
101 uint32_t left_offset
;
102 uint32_t right_offset
;
104 uint32_t bottom_offset
;
106 uint8_t frame_mbs_only_flag
;
107 uint8_t mb_adaptive_frame_field_flag
;
108 int i_log2_max_frame_num
;
109 int i_pic_order_cnt_type
;
110 int i_delta_pic_order_always_zero_flag
;
111 int32_t offset_for_non_ref_pic
;
112 int32_t offset_for_top_to_bottom_field
;
113 int i_num_ref_frames_in_pic_order_cnt_cycle
;
114 int32_t offset_for_ref_frame
[255];
115 int i_log2_max_pic_order_cnt_lsb
;
119 int i_sar_num
, i_sar_den
;
122 uint8_t i_colour_primaries
;
123 uint8_t i_transfer_characteristics
;
124 uint8_t i_matrix_coefficients
;
126 bool b_timing_info_present_flag
;
127 uint32_t i_num_units_in_tick
;
128 uint32_t i_time_scale
;
129 bool b_fixed_frame_rate
;
130 bool b_pic_struct_present_flag
;
131 bool b_hrd_parameters_present_flag
; /* CpbDpbDelaysPresentFlag */
132 uint8_t i_cpb_removal_delay_length_minus1
;
133 uint8_t i_dpb_output_delay_length_minus1
;
136 uint8_t b_bitstream_restriction_flag
;
137 uint8_t i_max_num_reorder_frames
;
141 struct h264_picture_parameter_set_t
145 uint8_t i_pic_order_present_flag
;
146 uint8_t i_redundant_pic_present_flag
;
147 uint8_t weighted_pred_flag
;
148 uint8_t weighted_bipred_idc
;
152 AnnexB : [\x00] \x00 \x00 \x01 Prefixed NAL
153 AVC Sample format : NalLengthSize encoded size prefixed NAL
154 avcC: AVCDecoderConfigurationRecord combining SPS & PPS in AVC Sample Format
157 #define H264_MIN_AVCC_SIZE 7
159 bool h264_isavcC( const uint8_t *, size_t );
161 /* Convert AVC Sample format to Annex B in-place */
162 void h264_AVC_to_AnnexB( uint8_t *p_buf
, uint32_t i_len
,
163 uint8_t i_nal_length_size
);
165 /* Get the First SPS/PPS NAL pointers from an Annex B buffer
166 * Returns TRUE if a SPS and/or a PPS is found */
167 bool h264_AnnexB_get_spspps( const uint8_t *p_buf
, size_t i_buf
,
168 const uint8_t **pp_sps
, size_t *p_sps_size
,
169 const uint8_t **pp_pps
, size_t *p_pps_size
,
170 const uint8_t **pp_ext
, size_t *p_ext_size
);
172 /* Create a AVCDecoderConfigurationRecord from non prefixed SPS/PPS
173 * Returns a valid block_t on success, must be freed with block_Release */
174 block_t
*h264_NAL_to_avcC( uint8_t i_nal_length_size
,
175 const uint8_t **pp_sps_buf
,
176 const size_t *p_sps_size
, uint8_t i_sps_count
,
177 const uint8_t **pp_pps_buf
,
178 const size_t *p_pps_size
, uint8_t i_pps_count
);
180 /* Convert AVCDecoderConfigurationRecord SPS/PPS to Annex B format */
181 uint8_t * h264_avcC_to_AnnexB_NAL( const uint8_t *p_buf
, size_t i_buf
,
182 size_t *pi_result
, uint8_t *pi_nal_length_size
);
184 bool h264_get_dpb_values( const h264_sequence_parameter_set_t
*,
185 uint8_t *pi_depth
, unsigned *pi_delay
);
187 bool h264_get_picture_size( const h264_sequence_parameter_set_t
*, unsigned *p_w
, unsigned *p_h
,
188 unsigned *p_vw
, unsigned *p_vh
);
189 bool h264_get_chroma_luma( const h264_sequence_parameter_set_t
*, uint8_t *pi_chroma_format
,
190 uint8_t *pi_depth_luma
, uint8_t *pi_depth_chroma
);
191 bool h264_get_colorimetry( const h264_sequence_parameter_set_t
*p_sps
,
192 video_color_primaries_t
*p_primaries
,
193 video_transfer_func_t
*p_transfer
,
194 video_color_space_t
*p_colorspace
,
195 bool *p_full_range
);
197 /* Get level and Profile from DecoderConfigurationRecord */
198 bool h264_get_profile_level(const es_format_t
*p_fmt
, uint8_t *pi_profile
,
199 uint8_t *pi_level
, uint8_t *p_nal_length_size
);
201 #endif /* H264_NAL_H */