00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef SEI_H
00016 #define SEI_H
00017
00018 #define MAX_LAYER_NUMBER 2
00019 #define MAX_DEPENDENT_SUBSEQ 5
00020
00021
00022
00023 typedef enum {
00024 SEI_BUFFERING_PERIOD = 0,
00025 SEI_PIC_TIMING,
00026 SEI_PAN_SCAN_RECT,
00027 SEI_FILLER_PAYLOAD,
00028 SEI_USER_DATA_REGISTERED_ITU_T_T35,
00029 SEI_USER_DATA_UNREGISTERED,
00030 SEI_RECOVERY_POINT,
00031 SEI_DEC_REF_PIC_MARKING_REPETITION,
00032 SEI_SPARE_PIC,
00033 SEI_SCENE_INFO,
00034 SEI_SUB_SEQ_INFO,
00035 SEI_SUB_SEQ_LAYER_CHARACTERISTICS,
00036 SEI_SUB_SEQ_CHARACTERISTICS,
00037 SEI_FULL_FRAME_FREEZE,
00038 SEI_FULL_FRAME_FREEZE_RELEASE,
00039 SEI_FULL_FRAME_SNAPSHOT,
00040 SEI_PROGRESSIVE_REFINEMENT_SEGMENT_START,
00041 SEI_PROGRESSIVE_REFINEMENT_SEGMENT_END,
00042 SEI_MOTION_CONSTRAINED_SLICE_GROUP_SET,
00043 SEI_FILM_GRAIN_CHARACTERISTICS,
00044 SEI_DEBLOCKING_FILTER_DISPLAY_PREFERENCE,
00045 SEI_STEREO_VIDEO_INFO,
00046 SEI_POST_FILTER_HINTS,
00047 SEI_TONE_MAPPING,
00048
00049 SEI_MAX_ELEMENTS
00050 } SEI_type;
00051
00052 #define MAX_FN 256
00053
00054 #define AGGREGATION_PACKET_TYPE 4
00055 #define SEI_PACKET_TYPE 5 // Tian Dong: See VCEG-N72, it need updates
00056
00057 #define NORMAL_SEI 0
00058 #define AGGREGATION_SEI 1
00059
00060
00061 typedef struct
00062 {
00063 Boolean available;
00064 int payloadSize;
00065 unsigned char subPacketType;
00066 byte* data;
00067 } sei_struct;
00068
00069
00070
00071 extern sei_struct sei_message[2];
00072
00073 void InitSEIMessages(void);
00074 void CloseSEIMessages(void);
00075 Boolean HaveAggregationSEI(void);
00076 void write_sei_message(int id, byte* payload, int payload_size, int payload_type);
00077 void finalize_sei_message(int id);
00078 void clear_sei_message(int id);
00079 void AppendTmpbits2Buf( Bitstream* dest, Bitstream* source );
00080
00081 void PrepareAggregationSEIMessage(void);
00082
00083
00084
00085 typedef struct
00086 {
00087 int target_frame_num;
00088 int num_spare_pics;
00089 int payloadSize;
00090 Bitstream* data;
00091 } spare_picture_struct;
00092
00093 extern Boolean seiHasSparePicture;
00094
00095 extern spare_picture_struct seiSparePicturePayload;
00096
00097 void InitSparePicture();
00098 void CloseSparePicture();
00099 void CalculateSparePicture();
00100 void ComposeSparePictureMessage(int delta_spare_frame_num, int ref_area_indicator, Bitstream *tmpBitstream);
00101 Boolean CompressSpareMBMap(unsigned char **map_sp, Bitstream *bitstream);
00102 void FinalizeSpareMBMap();
00103
00104
00105 typedef struct
00106 {
00107 int subseq_layer_num;
00108 int subseq_id;
00109 unsigned int last_picture_flag;
00110 unsigned int stored_frame_cnt;
00111
00112 int payloadSize;
00113 Bitstream* data;
00114 } subseq_information_struct;
00115
00116 extern Boolean seiHasSubseqInfo;
00117 extern subseq_information_struct seiSubseqInfo[MAX_LAYER_NUMBER];
00118
00119 void InitSubseqInfo(int currLayer);
00120 void UpdateSubseqInfo(int currLayer);
00121 void FinalizeSubseqInfo(int currLayer);
00122 void ClearSubseqInfoPayload(int currLayer);
00123 void CloseSubseqInfo(int currLayer);
00124
00125
00126 typedef struct
00127 {
00128 unsigned short bit_rate[MAX_LAYER_NUMBER];
00129 unsigned short frame_rate[MAX_LAYER_NUMBER];
00130 byte data[4*MAX_LAYER_NUMBER];
00131 int layer_number;
00132 int payloadSize;
00133 } subseq_layer_information_struct;
00134
00135 extern Boolean seiHasSubseqLayerInfo;
00136 extern subseq_layer_information_struct seiSubseqLayerInfo;
00137
00138 void InitSubseqLayerInfo();
00139 void CloseSubseqLayerInfo();
00140 void FinalizeSubseqLayerInfo();
00141
00142
00143 typedef struct
00144 {
00145 int subseq_layer_num;
00146 int subseq_id;
00147 int duration_flag;
00148 unsigned int subseq_duration;
00149 unsigned int average_rate_flag;
00150 unsigned int average_bit_rate;
00151 unsigned int average_frame_rate;
00152 int num_referenced_subseqs;
00153 int ref_subseq_layer_num[MAX_DEPENDENT_SUBSEQ];
00154 int ref_subseq_id[MAX_DEPENDENT_SUBSEQ];
00155
00156 Bitstream* data;
00157 int payloadSize;
00158 } subseq_char_information_struct;
00159
00160 extern Boolean seiHasSubseqChar;
00161 extern subseq_char_information_struct seiSubseqChar;
00162
00163 void InitSubseqChar();
00164 void ClearSubseqCharPayload();
00165 void UpdateSubseqChar();
00166 void FinalizeSubseqChar();
00167 void CloseSubseqChar();
00168
00169
00170 typedef struct
00171 {
00172 int scene_id;
00173 int scene_transition_type;
00174 int second_scene_id;
00175
00176 Bitstream* data;
00177 int payloadSize;
00178 } scene_information_struct;
00179
00180 extern Boolean seiHasSceneInformation;
00181 extern scene_information_struct seiSceneInformation;
00182
00183 void InitSceneInformation();
00184 void CloseSceneInformation();
00185 void UpdateSceneInformation(Boolean HasSceneInformation, int sceneID, int sceneTransType, int secondSceneID);
00186 void FinalizeSceneInformation();
00187
00188
00189 typedef struct
00190 {
00191 int pan_scan_rect_id;
00192 int pan_scan_rect_left_offset;
00193 int pan_scan_rect_right_offset;
00194 int pan_scan_rect_top_offset;
00195 int pan_scan_rect_bottom_offset;
00196
00197 Bitstream *data;
00198 int payloadSize;
00199 } panscanrect_information_struct;
00200
00201 extern Boolean seiHasPanScanRectInfo;
00202 extern panscanrect_information_struct seiPanScanRectInfo;
00203
00204 void InitPanScanRectInfo();
00205 void ClearPanScanRectInfoPayload();
00206 void UpdatePanScanRectInfo();
00207 void FinalizePanScanRectInfo();
00208 void ClosePanScanRectInfo();
00209
00210
00211 typedef struct
00212 {
00213 char *byte;
00214 int total_byte;
00215 Bitstream *data;
00216 int payloadSize;
00217 } user_data_unregistered_information_struct;
00218
00219 extern Boolean seiHasUser_data_unregistered_info;
00220 extern user_data_unregistered_information_struct seiUser_data_unregistered;
00221
00222 void InitUser_data_unregistered();
00223 void ClearUser_data_unregistered();
00224 void UpdateUser_data_unregistered();
00225 void FinalizeUser_data_unregistered();
00226 void CloseUser_data_unregistered();
00227
00228
00229 typedef struct
00230 {
00231 char *byte;
00232 int total_byte;
00233 int itu_t_t35_country_code;
00234 int itu_t_t35_country_code_extension_byte;
00235 Bitstream *data;
00236 int payloadSize;
00237 } user_data_registered_itu_t_t35_information_struct;
00238
00239 extern Boolean seiHasUser_data_registered_itu_t_t35_info;
00240 extern user_data_registered_itu_t_t35_information_struct seiUser_data_registered_itu_t_t35;
00241
00242 void InitUser_data_registered_itu_t_t35();
00243 void ClearUser_data_registered_itu_t_t35();
00244 void UpdateUser_data_registered_itu_t_t35();
00245 void FinalizeUser_data_registered_itu_t_t35();
00246 void CloseUser_data_registered_itu_t_t35();
00247
00248
00249 typedef struct
00250 {
00251 unsigned int recovery_frame_cnt;
00252 unsigned char exact_match_flag;
00253 unsigned char broken_link_flag;
00254 unsigned char changing_slice_group_idc;
00255
00256 Bitstream *data;
00257 int payloadSize;
00258 } recovery_point_information_struct;
00259
00260 extern Boolean seiHasRecoveryPoint_info;
00261 extern recovery_point_information_struct seiRecoveryPoint;
00262
00263 void InitRandomAccess();
00264 void ClearRandomAccess();
00265 void UpdateRandomAccess();
00266 void FinalizeRandomAccess();
00267 void CloseRandomAccess();
00268
00269
00270 #define MAX_CODED_BIT_DEPTH 12
00271 #define MAX_SEI_BIT_DEPTH 12
00272 #define MAX_NUM_PIVOTS (1<<MAX_CODED_BIT_DEPTH)
00273
00274 typedef struct
00275 {
00276 unsigned int tone_map_id;
00277 unsigned char tone_map_cancel_flag;
00278 unsigned int tone_map_repetition_period;
00279 unsigned char coded_data_bit_depth;
00280 unsigned char sei_bit_depth;
00281 unsigned int model_id;
00282
00283 int min_value;
00284 int max_value;
00285
00286 int sigmoid_midpoint;
00287 int sigmoid_width;
00288
00289 int start_of_coded_interval[1<<MAX_SEI_BIT_DEPTH];
00290
00291 int num_pivots;
00292 int coded_pivot_value[MAX_NUM_PIVOTS];
00293 int sei_pivot_value[MAX_NUM_PIVOTS];
00294
00295 Bitstream *data;
00296 int payloadSize;
00297 } tone_mapping_struct;
00298
00299 extern Boolean seiHasTone_mapping;
00300 extern tone_mapping_struct seiToneMapping;
00301
00302 void InitToneMapping();
00303 void FinalizeToneMapping();
00304 void ClearToneMapping();
00305 void UpdateToneMapping();
00306 void CloseToneMapping();
00307
00308
00309 typedef struct
00310 {
00311 unsigned int filter_hint_size_y;
00312 unsigned int filter_hint_size_x;
00313 unsigned int filter_hint_type;
00314 int ***filter_hint;
00315 unsigned int additional_extension_flag;
00316
00317 Bitstream *data;
00318 int payloadSize;
00319 } post_filter_information_struct;
00320
00321 extern Boolean seiHasPostFilterHints_info;
00322 extern post_filter_information_struct seiPostFilterHints;
00323
00324 void InitPostFilterHints();
00325 void ClearPostFilterHints();
00326 void UpdatePostFilterHints();
00327 void FinalizePostFilterHints();
00328 void ClosePostFilterHints();
00329
00330 int Write_SEI_NALU(int len);
00331
00332
00333
00334
00335 #define MAX_CPB_CNT_MINUS1 31
00336 #define MAX_PIC_STRUCT_VALUE 16
00337 typedef struct
00338 {
00339 int seq_parameter_set_id;
00340 int nal_initial_cpb_removal_delay[MAX_CPB_CNT_MINUS1+1];
00341 int nal_initial_cpb_removal_delay_offset[MAX_CPB_CNT_MINUS1+1];
00342 int vcl_initial_cpb_removal_delay[MAX_CPB_CNT_MINUS1+1];
00343 int vcl_initial_cpb_removal_delay_offset[MAX_CPB_CNT_MINUS1+1];
00344
00345 Bitstream *data;
00346 int payloadSize;
00347 } bufferingperiod_information_struct;
00348 extern Boolean seiHasBuffering_period;
00349 bufferingperiod_information_struct seiBufferingPeriod;
00350
00351 void InitBufferingPeriod();
00352 void ClearBufferingPeriod();
00353 void CloseBufferingPeriod();
00354 void UpdateBufferingPeriod();
00355 void FinalizeBufferingPeriod();
00356
00357
00358 typedef struct
00359 {
00360 int cpb_removal_delay;
00361 int dpb_output_delay;
00362 int pic_struct;
00363 Boolean clock_timestamp_flag[MAX_PIC_STRUCT_VALUE];
00364 int ct_type;
00365 Boolean nuit_field_based_flag;
00366 int counting_type;
00367 Boolean full_timestamp_flag;
00368 Boolean discontinuity_flag;
00369 Boolean cnt_dropped_flag;
00370 int n_frames;
00371 int seconds_value;
00372 int minutes_value;
00373 int hours_value;
00374 Boolean seconds_flag;
00375 Boolean minutes_flag;
00376 Boolean hours_flag;
00377 int time_offset;
00378
00379 Bitstream *data;
00380 int payloadSize;
00381 } pictiming_information_struct;
00382 extern Boolean seiHasPicTiming_info;
00383 pictiming_information_struct seiPicTiming;
00384
00385 void InitPicTiming();
00386 void ClearPicTiming();
00387 void ClosePicTiming();
00388 void UpdatePicTiming();
00389 void FinalizePicTiming();
00390
00391
00392 typedef struct
00393 {
00394 Boolean original_idr_flag;
00395 int original_frame_num;
00396 Boolean original_field_pic_flag;
00397 Boolean original_bottom_field_flag;
00398 DecRefPicMarking_t *dec_ref_pic_marking_buffer_saved;
00399
00400 Bitstream *data;
00401 int payloadSize;
00402 } drpm_repetition_information_struct;
00403 extern Boolean seiHasDRPMRepetition_info;
00404 drpm_repetition_information_struct seiDRPMRepetition;
00405
00406 void InitDRPMRepetition();
00407 void ClearDRPMRepetition();
00408 void CloseDRPMRepetition();
00409 void UpdateDRPMRepetition();
00410 void FinalizeDRPMRepetition();
00411 void free_drpm_buffer( DecRefPicMarking_t *pDRPM );
00412
00413
00414 #endif