#ifndef _GF_MEDIA_DEV_H_
#define _GF_MEDIA_DEV_H_
#include <gpac/media_tools.h>
#ifndef GPAC_DISABLE_STREAMING
#include <gpac/ietf.h>
#endif
#ifndef GPAC_DISABLE_ISOM
void gf_media_get_sample_average_infos(GF_ISOFile *file, u32 Track, u32 *avgSize, u32 *MaxSize, u32 *TimeDelta, u32 *maxCTSDelta, u32 *const_duration, u32 *bandwidth);
#endif
#ifndef GPAC_DISABLE_MEDIA_IMPORT
GF_Err gf_import_message(GF_MediaImporter *import, GF_Err e, char *format, ...);
#endif
#ifndef GPAC_DISABLE_AV_PARSERS
u32 gf_latm_get_value(GF_BitStream *bs);
#define GF_SVC_SSPS_ID_SHIFT 16
u32 gf_media_nalu_is_start_code(GF_BitStream *bs);
u32 gf_media_nalu_next_start_code_bs(GF_BitStream *bs);
u32 gf_media_nalu_payload_end_bs(GF_BitStream *bs);
u32 gf_media_nalu_next_start_code(const u8 *data, u32 data_len, u32 *sc_size);
u8 AVC_NALUType(GF_BitStream *bs);
Bool SVC_NALUIsSlice(u8 type);
enum
{
AVC_SPS_PARSED = 1,
AVC_SPS_DECLARED = 1<<1,
AVC_SUBSPS_PARSED = 1<<2,
AVC_SUBSPS_DECLARED = 1<<3,
AVC_SPS_EXT_DECLARED = 1<<4,
};
typedef struct
{
u8 cpb_removal_delay_length_minus1;
u8 dpb_output_delay_length_minus1;
u8 time_offset_length;
} AVC_HRD;
typedef struct
{
s32 timing_info_present_flag;
u32 num_units_in_tick;
u32 time_scale;
s32 fixed_frame_rate_flag;
Bool aspect_ratio_info_present_flag;
u32 par_num, par_den;
Bool overscan_info_present_flag;
Bool video_signal_type_present_flag;
u8 video_format;
Bool video_full_range_flag;
Bool colour_description_present_flag;
u8 colour_primaries;
u8 transfer_characteristics;
u8 matrix_coefficients;
Bool nal_hrd_parameters_present_flag;
Bool vcl_hrd_parameters_present_flag;
Bool low_delay_hrd_flag;
AVC_HRD hrd;
Bool pic_struct_present_flag;
} AVC_VUI;
typedef struct
{
u32 left;
u32 right;
u32 top;
u32 bottom;
} AVC_CROP;
typedef struct
{
s32 profile_idc;
s32 level_idc;
s32 prof_compat;
s32 log2_max_frame_num;
u32 poc_type, poc_cycle_length;
s32 log2_max_poc_lsb;
s32 delta_pic_order_always_zero_flag;
s32 offset_for_non_ref_pic, offset_for_top_to_bottom_field;
Bool frame_mbs_only_flag;
Bool mb_adaptive_frame_field_flag;
u32 max_num_ref_frames;
Bool gaps_in_frame_num_value_allowed_flag;
u8 chroma_format;
u8 luma_bit_depth_m8;
u8 chroma_bit_depth_m8;
s16 offset_for_ref_frame[256];
u32 width, height;
Bool vui_parameters_present_flag;
AVC_VUI vui;
AVC_CROP crop;
u32 state;
u32 nb_ei, nb_ep, nb_eb;
} AVC_SPS;
typedef struct
{
s32 id;
s32 sps_id;
Bool entropy_coding_mode_flag;
s32 pic_order_present;
s32 redundant_pic_cnt_present;
u32 slice_group_count;
u32 status;
} AVC_PPS;
typedef struct
{
s32 idr_pic_flag;
u8 temporal_id, priority_id, dependency_id, quality_id;
} SVC_NALUHeader;
typedef struct
{
u8 nal_ref_idc, nal_unit_type, field_pic_flag, bottom_field_flag;
u32 frame_num, idr_pic_id, poc_lsb, slice_type;
s32 delta_poc_bottom;
s32 delta_poc[2];
s32 redundant_pic_cnt;
s32 poc;
u32 poc_msb, poc_msb_prev, poc_lsb_prev, frame_num_prev;
s32 frame_num_offset, frame_num_offset_prev;
AVC_SPS *sps;
AVC_PPS *pps;
SVC_NALUHeader NalHeader;
} AVCSliceInfo;
typedef struct
{
u32 frame_cnt;
u8 exact_match_flag;
u8 broken_link_flag;
u8 changing_slice_group_idc;
u8 valid;
} AVCSeiRecoveryPoint;
typedef struct
{
u8 pic_struct;
} AVCSeiPicTiming;
typedef struct
{
AVCSeiRecoveryPoint recovery_point;
AVCSeiPicTiming pic_timing;
} AVCSei;
typedef struct
{
AVC_SPS sps[32];
s8 sps_active_idx;
AVC_PPS pps[255];
AVCSliceInfo s_info;
AVCSei sei;
Bool is_svc;
} AVCState;
typedef struct
{
u32 NALUnitHeader;
u8 track_ref_index;
s8 sample_offset;
u32 data_offset;
u32 data_length;
} SVC_Extractor;
s32 gf_media_avc_read_sps(const char *sps_data, u32 sps_size, AVCState *avc, u32 subseq_sps, u32 *vui_flag_pos);
s32 gf_media_avc_read_pps(const char *pps_data, u32 pps_size, AVCState *avc);
s32 gf_media_avc_read_sps_ext(const char *spse_data, u32 spse_size);
Bool gf_media_avc_slice_is_IDR(AVCState *avc);
Bool gf_media_avc_slice_is_intra(AVCState *avc);
s32 gf_media_avc_parse_nalu(GF_BitStream *bs, u32 nal_hdr, AVCState *avc);
u32 gf_media_avc_reformat_sei(char *buffer, u32 nal_size, AVCState *avc);
#ifndef GPAC_DISABLE_ISOM
GF_Err gf_media_avc_change_par(GF_AVCConfig *avcc, s32 ar_n, s32 ar_d);
GF_Err gf_media_hevc_change_par(GF_HEVCConfig *hvcc, s32 ar_n, s32 ar_d);
#endif
typedef struct
{
Bool profile_present_flag, level_present_flag, tier_flag;
u8 profile_space;
u8 profile_idc;
u32 profile_compatibility_flag;
u8 level_idc;
} HEVC_SublayerPTL;
typedef struct
{
u8 profile_space, tier_flag, profile_idc, level_idc;
u32 profile_compatibility_flag;
Bool general_progressive_source_flag;
Bool general_interlaced_source_flag;
Bool general_non_packed_constraint_flag;
Bool general_frame_only_constraint_flag;
u64 general_reserved_44bits;
HEVC_SublayerPTL sub_ptl[8];
} HEVC_ProfileTierLevel;
typedef struct
{
u32 num_negative_pics;
u32 num_positive_pics;
s32 delta_poc[16];
} HEVC_ReferencePictureSets;
typedef struct
{
s32 id, vps_id;
u32 state;
u32 crc;
u32 width, height;
HEVC_ProfileTierLevel ptl;
u8 chroma_format_idc;
Bool cw_flag ;
u32 cw_left, cw_right, cw_top, cw_bottom;
u8 bit_depth_luma;
u8 bit_depth_chroma;
u8 log2_max_pic_order_cnt_lsb;
Bool separate_colour_plane_flag;
u32 max_CU_width, max_CU_height, max_CU_depth;
u32 bitsSliceSegmentAddress;
u32 num_short_term_ref_pic_sets, num_long_term_ref_pic_sps;
HEVC_ReferencePictureSets rps[64];
Bool aspect_ratio_info_present_flag, long_term_ref_pics_present_flag, temporal_mvp_enable_flag, sample_adaptive_offset_enabled_flag;
u8 sar_idc;
u16 sar_width, sar_height;
Bool has_timing_info;
u32 num_units_in_tick, time_scale;
Bool poc_proportional_to_timing_flag;
u32 num_ticks_poc_diff_one_minus1;
u32 rep_format_idx;
} HEVC_SPS;
typedef struct
{
s32 id;
u32 sps_id;
u32 state;
u32 crc;
Bool dependent_slice_segments_enabled_flag, tiles_enabled_flag, uniform_spacing_flag;
u32 num_extra_slice_header_bits, num_ref_idx_l0_default_active, num_ref_idx_l1_default_active;
Bool slice_segment_header_extension_present_flag, output_flag_present_flag, lists_modification_present_flag, cabac_init_present_flag;
Bool weighted_pred_flag, weighted_bipred_flag, slice_chroma_qp_offsets_present_flag, deblocking_filter_override_enabled_flag, loop_filter_across_slices_enabled_flag, entropy_coding_sync_enabled_flag;
Bool loop_filter_across_tiles_enabled_flag;
u32 num_tile_columns, num_tile_rows;
u32 column_width[22], row_height[20];
} HEVC_PPS;
typedef struct RepFormat
{
u32 chroma_format_idc;
u32 pic_width_luma_samples;
u32 pic_height_luma_samples;
u32 bit_depth_luma;
u32 bit_depth_chroma;
u8 separate_colour_plane_flag;
} HEVC_RepFormat;
typedef struct
{
u16 avg_bit_rate, max_bit_rate, avg_pic_rate;
u8 constand_pic_rate_idc;
} HEVC_RateInfo;
#define MAX_LHVC_LAYERS 4
#define MAX_NUM_LAYER_SETS 1024
typedef struct
{
s32 id;
u32 state;
s32 bit_pos_vps_extensions;
u32 crc;
Bool vps_extension_found;
u32 max_layers, max_sub_layers, max_layer_id, num_layer_sets;
Bool temporal_id_nesting;
HEVC_ProfileTierLevel ptl;
HEVC_SublayerPTL sub_ptl[8];
HEVC_RateInfo rates[8];
u32 scalability_mask[16];
u32 dimension_id[MAX_LHVC_LAYERS][16];
u32 layer_id_in_nuh[MAX_LHVC_LAYERS];
u32 layer_id_in_vps[MAX_LHVC_LAYERS];
u8 num_profile_tier_level, num_output_layer_sets;
u32 profile_level_tier_idx[MAX_LHVC_LAYERS];
HEVC_ProfileTierLevel ext_ptl[MAX_LHVC_LAYERS];
u32 num_rep_formats;
HEVC_RepFormat rep_formats[16];
u32 rep_format_idx[16];
Bool base_layer_internal_flag, base_layer_available_flag;
u8 num_layers_in_id_list[MAX_NUM_LAYER_SETS];
u8 direct_dependency_flag[MAX_LHVC_LAYERS][MAX_LHVC_LAYERS];
Bool output_layer_flag[MAX_LHVC_LAYERS][MAX_LHVC_LAYERS];
u8 profile_tier_level_idx[MAX_LHVC_LAYERS][MAX_LHVC_LAYERS];
Bool alt_output_layer_flag[MAX_LHVC_LAYERS];
u8 num_necessary_layers[MAX_LHVC_LAYERS];
Bool necessary_layers_flag[MAX_LHVC_LAYERS][MAX_LHVC_LAYERS];
u8 LayerSetLayerIdList[MAX_LHVC_LAYERS][MAX_LHVC_LAYERS];
u8 LayerSetLayerIdListMax[MAX_LHVC_LAYERS];
} HEVC_VPS;
typedef struct
{
AVCSeiRecoveryPoint recovery_point;
AVCSeiPicTiming pic_timing;
} HEVC_SEI;
typedef struct
{
u8 nal_unit_type;
u32 frame_num, poc_lsb, slice_type;
s32 redundant_pic_cnt;
s32 poc;
u32 poc_msb, poc_msb_prev, poc_lsb_prev, frame_num_prev;
s32 frame_num_offset, frame_num_offset_prev;
Bool dependent_slice_segment_flag;
Bool first_slice_segment_in_pic_flag;
u32 slice_segment_address;
u8 prev_layer_id_plus1;
s32 entry_point_start_bits;
s32 payload_start_offset;
HEVC_SPS *sps;
HEVC_PPS *pps;
} HEVCSliceInfo;
typedef struct _hevc_state
{
HEVC_SPS sps[16];
s8 sps_active_idx;
HEVC_PPS pps[64];
HEVC_VPS vps[16];
HEVCSliceInfo s_info;
HEVC_SEI sei;
s32 last_parsed_vps_id;
s32 last_parsed_sps_id;
s32 last_parsed_pps_id;
} HEVCState;
enum
{
GF_HEVC_SLICE_TYPE_B = 0,
GF_HEVC_SLICE_TYPE_P = 1,
GF_HEVC_SLICE_TYPE_I = 2,
};
s32 gf_media_hevc_read_vps(char *data, u32 size, HEVCState *hevc);
s32 gf_media_hevc_read_sps(char *data, u32 size, HEVCState *hevc);
s32 gf_media_hevc_read_pps(char *data, u32 size, HEVCState *hevc);
s32 gf_media_hevc_parse_nalu(char *data, u32 size, HEVCState *hevc, u8 *nal_unit_type, u8 *temporal_id, u8 *layer_id);
Bool gf_media_hevc_slice_is_intra(HEVCState *hevc);
Bool gf_media_hevc_slice_is_IDR(HEVCState *hevc);
s32 gf_media_hevc_read_vps_ex(char *data, u32 *size, HEVCState *hevc, Bool remove_extensions);
GF_Err gf_hevc_get_sps_info_with_state(HEVCState *hevc_state, char *sps_data, u32 sps_size, u32 *sps_id, u32 *width, u32 *height, s32 *par_n, s32 *par_d);
#endif
typedef struct
{
u8 rate_idx;
u8 pck_size;
} QCPRateTable;
#if !defined(GPAC_DISABLE_ISOM) && !defined(GPAC_DISABLE_STREAMING)
GP_RTPPacketizer *gf_rtp_packetizer_create_and_init_from_file(GF_ISOFile *file,
u32 TrackNum,
void *cbk_obj,
void (*OnNewPacket)(void *cbk, GF_RTPHeader *header),
void (*OnPacketDone)(void *cbk, GF_RTPHeader *header),
void (*OnDataReference)(void *cbk, u32 payload_size, u32 offset_from_orig),
void (*OnData)(void *cbk, char *data, u32 data_size, Bool is_head),
u32 Path_MTU,
u32 max_ptime,
u32 default_rtp_rate,
u32 flags,
u8 PayloadID,
Bool copy_media,
u32 InterleaveGroupID,
u8 InterleaveGroupPriority);
void gf_media_format_ttxt_sdp(GP_RTPPacketizer *builder, char *payload_name, char *sdpLine, GF_ISOFile *file, u32 track);
#endif
typedef enum
{
GF_DASH_TEMPLATE_SEGMENT = 0,
GF_DASH_TEMPLATE_INITIALIZATION,
GF_DASH_TEMPLATE_TEMPLATE,
GF_DASH_TEMPLATE_INITIALIZATION_TEMPLATE,
GF_DASH_TEMPLATE_REPINDEX,
} GF_DashTemplateSegmentType;
GF_Err gf_media_mpd_format_segment_name(GF_DashTemplateSegmentType seg_type, Bool is_bs_switching, char *segment_name, const char *output_file_name, const char *rep_id, const char *base_url, const char *seg_rad_name, const char *seg_ext, u64 start_time, u32 bandwidth, u32 segment_number, Bool use_segment_timeline);
#ifndef GPAC_DISABLE_VTT
typedef struct _webvtt_parser GF_WebVTTParser;
typedef struct _webvtt_sample GF_WebVTTSample;
GF_WebVTTParser *gf_webvtt_parser_new();
GF_Err gf_webvtt_parser_init(GF_WebVTTParser *parser, const char *input_file,
void *user, GF_Err (*report_message)(void *, GF_Err, char *, const char *),
void (*on_sample_parsed)(void *, GF_WebVTTSample *),
void (*on_header_parsed)(void *, const char *));
GF_Err gf_webvtt_parser_parse(GF_WebVTTParser *parser, u32 duration);
u64 gf_webvtt_parser_last_duration(GF_WebVTTParser *parser);
void gf_webvtt_parser_del(GF_WebVTTParser *parser);
void gf_webvtt_sample_del(GF_WebVTTSample * samp);
u64 gf_webvtt_sample_get_start(GF_WebVTTSample * samp);
#ifndef GPAC_DISABLE_ISOM
GF_Err gf_webvtt_dump_header(FILE *dump, GF_ISOFile *file, u32 track, Bool box_mode, u32 index);
GF_Err gf_webvtt_dump_sample(FILE *dump, GF_WebVTTSample *samp);
GF_Err gf_webvtt_parser_dump_done(GF_WebVTTParser *parser, u32 duration);
#endif
#endif
#endif