xine-lib  1.2.9
Data Structures | Functions | Variables
h264_parser.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "h264_parser.h"
#include "nal.h"
#include "cpb.h"

Data Structures

struct  buf_reader
 

Functions

static struct h264_parserinit_parser ()
 
static uint32_t read_bits (struct buf_reader *buf, int len)
 
static uint32_t read_exp_golomb (struct buf_reader *buf)
 
static int32_t read_exp_golomb_s (struct buf_reader *buf)
 
static void calculate_pic_order (struct h264_parser *parser, struct coded_picture *pic, struct slice_header *slc)
 
static void parse_scaling_list (struct buf_reader *buf, uint8_t *scaling_list, int length, int index)
 
static struct nal_unitparse_nal_header (struct buf_reader *buf, struct coded_picture *pic, struct h264_parser *parser)
 
static void sps_scaling_list_fallback (struct seq_parameter_set_rbsp *sps, int i)
 
static void pps_scaling_list_fallback (struct seq_parameter_set_rbsp *sps, struct pic_parameter_set_rbsp *pps, int i)
 
static uint8_t parse_sps (struct buf_reader *buf, struct seq_parameter_set_rbsp *sps)
 
static void interpret_sps (struct coded_picture *pic, struct h264_parser *parser)
 
static void parse_vui_parameters (struct buf_reader *buf, struct seq_parameter_set_rbsp *sps)
 
static void parse_hrd_parameters (struct buf_reader *buf, struct hrd_parameters *hrd)
 
static uint8_t parse_pps (struct buf_reader *buf, struct pic_parameter_set_rbsp *pps)
 
static void interpret_pps (struct coded_picture *pic)
 
static void parse_sei (struct buf_reader *buf, struct sei_message *sei, struct h264_parser *parser)
 
static void interpret_sei (struct coded_picture *pic)
 
static uint8_t parse_slice_header (struct buf_reader *buf, struct nal_unit *slc_nal, struct h264_parser *parser)
 
static void interpret_slice_header (struct h264_parser *parser, struct nal_unit *slc_nal)
 
static void parse_ref_pic_list_reordering (struct buf_reader *buf, struct slice_header *slc)
 
static void calculate_pic_nums (struct h264_parser *parser, struct coded_picture *cpic)
 
static void execute_ref_pic_marking (struct coded_picture *cpic, uint32_t memory_management_control_operation, uint32_t marking_nr, struct h264_parser *parser)
 
static void parse_pred_weight_table (struct buf_reader *buf, struct slice_header *slc, struct h264_parser *parser)
 
static void parse_dec_ref_pic_marking (struct buf_reader *buf, struct nal_unit *slc_nal)
 
static uint32_t bits_read (struct buf_reader *buf)
 
static void skip_emulation_prevention_three_byte (struct buf_reader *buf)
 
static int rbsp_trailing_bits (const uint8_t *buf, int buf_len)
 
static struct h264_parserinit_parser (xine_t *xine)
 
static void free_parser (struct h264_parser *parser)
 
static void parse_codec_private (struct h264_parser *parser, const uint8_t *inbuf, int inbuf_len)
 
static void process_mmc_operations (struct h264_parser *parser, struct coded_picture *picture)
 
static int parse_frame (struct h264_parser *parser, const uint8_t *inbuf, int inbuf_len, int64_t pts, const void **ret_buf, uint32_t *ret_len, struct coded_picture **ret_pic)
 
static int parse_nal (const uint8_t *buf, int buf_len, struct h264_parser *parser, struct coded_picture **completed_picture)
 
static int seek_for_nal (uint8_t *buf, int buf_len, struct h264_parser *parser)
 

Variables

static const uint8_t default_4x4_intra [16]
 
static const uint8_t default_4x4_inter [16]
 
static const uint8_t default_8x8_intra [64]
 
static const uint8_t default_8x8_inter [64]
 

Function Documentation

◆ bits_read()

static uint32_t bits_read ( struct buf_reader buf)
inlinestatic
Returns
total number of bits read by the buf_reader

References buf_reader::buf.

Referenced by parse_pps().

◆ calculate_pic_nums()

static void calculate_pic_nums ( struct h264_parser parser,
struct coded_picture cpic 
)
static

◆ calculate_pic_order()

static void calculate_pic_order ( struct h264_parser parser,
struct coded_picture pic,
struct slice_header slc 
)
static

◆ execute_ref_pic_marking()

static void execute_ref_pic_marking ( struct coded_picture cpic,
uint32_t  memory_management_control_operation,
uint32_t  marking_nr,
struct h264_parser parser 
)
static

◆ free_parser()

static void free_parser ( struct h264_parser parser)
static

◆ init_parser() [1/2]

static struct h264_parser* init_parser ( )
static

Referenced by open_plugin(), and vdpau_h264_reset().

◆ init_parser() [2/2]

static struct h264_parser* init_parser ( xine_t xine)
static

◆ interpret_pps()

static void interpret_pps ( struct coded_picture pic)
static

◆ interpret_sei()

static void interpret_sei ( struct coded_picture pic)
static

◆ interpret_slice_header()

static void interpret_slice_header ( struct h264_parser parser,
struct nal_unit slc_nal 
)
static

◆ interpret_sps()

static void interpret_sps ( struct coded_picture pic,
struct h264_parser parser 
)
static

◆ parse_codec_private()

static void parse_codec_private ( struct h264_parser parser,
const uint8_t *  inbuf,
int  inbuf_len 
)
static

◆ parse_dec_ref_pic_marking()

static void parse_dec_ref_pic_marking ( struct buf_reader buf,
struct nal_unit slc_nal 
)
static

◆ parse_frame()

static int parse_frame ( struct h264_parser parser,
const uint8_t *  inbuf,
int  inbuf_len,
int64_t  pts,
const void **  ret_buf,
uint32_t *  ret_len,
struct coded_picture **  ret_pic 
)
static

◆ parse_hrd_parameters()

static void parse_hrd_parameters ( struct buf_reader buf,
struct hrd_parameters hrd 
)
static

◆ parse_nal()

static int parse_nal ( const uint8_t *  buf,
int  buf_len,
struct h264_parser parser,
struct coded_picture **  completed_picture 
)
static
Returns
0: NAL is part of coded picture 2: NAL is not part of coded picture 1: NAL is the beginning of a new coded picture 3: NAL is marked as END_OF_SEQUENCE

we detect the start of a new access unit if a non-vcl nal unit is received after a vcl nal unit NAL_END_OF_SEQUENCE terminates the current access unit

in case of an access unit which does not contain any non-vcl nal units we have to detect the new access unit through the algorithm for detecting first vcl nal units of a primary coded picture

frame boundary detection according to ITU-T Rec. H264 (11/2007) chapt 7.4.1.2.4, p65

References slice_header::bottom_field_flag, buf_reader::buf, calculate_pic_order(), create_coded_picture(), buf_reader::cur_offset, buf_reader::cur_pos, slice_header::delta_pic_order_cnt, slice_header::delta_pic_order_cnt_bottom, slice_header::field_pic_flag, coded_picture::flag_mask, slice_header::frame_num, IDR_PIC, slice_header::idr_pic_id, interpret_pps(), interpret_sei(), interpret_slice_header(), interpret_sps(), h264_parser::last_vcl_nal, buf_reader::len, lock_nal_unit(), NAL_AU_DELIMITER, nal_buffer_append(), NAL_END_OF_SEQUENCE, NAL_PART_C, NAL_PPS, nal_unit::nal_ref_idc, NAL_SEI, NAL_SLICE, NAL_SLICE_IDR, NAL_SPS, nal_unit::nal_unit_type, NON_VCL, NULL, parse_nal_header(), h264_parser::pic, slice_header::pic_order_cnt_lsb, seq_parameter_set_rbsp::pic_order_cnt_type, slice_header::pic_parameter_set_id, h264_parser::position, h264_parser::pps_buffer, REFERENCE, release_nal_unit(), coded_picture::sei_nal, nal_unit::slc, coded_picture::slc_nal, coded_picture::slice_cnt, nal_unit::sps, h264_parser::sps_buffer, and VCL.

Referenced by parse_codec_private(), and parse_frame().

◆ parse_nal_header()

static struct nal_unit * parse_nal_header ( struct buf_reader buf,
struct coded_picture pic,
struct h264_parser parser 
)
static

◆ parse_pps()

static uint8_t parse_pps ( struct buf_reader buf,
struct pic_parameter_set_rbsp pps 
)
static

References bits_read(), buf_reader::buf, pic_parameter_set_rbsp::chroma_qp_index_offset, pic_parameter_set_rbsp::constrained_intra_pred_flag, pic_parameter_set_rbsp::deblocking_filter_control_present_flag, pic_parameter_set_rbsp::entropy_coding_mode_flag, buf_reader::len, lprintf, pic_parameter_set_rbsp::num_ref_idx_l0_active_minus1, pic_parameter_set_rbsp::num_ref_idx_l1_active_minus1, pic_parameter_set_rbsp::num_slice_groups_minus1, parse_scaling_list(), pic_parameter_set_rbsp::pic_init_qp_minus26, pic_parameter_set_rbsp::pic_init_qs_minus26, pic_parameter_set_rbsp::pic_order_present_flag, pic_parameter_set_rbsp::pic_parameter_set_id, pic_parameter_set_rbsp::pic_scaling_list_present_flag, pic_parameter_set_rbsp::pic_scaling_matrix_present_flag, pic_parameter_set_rbsp::pic_size_in_map_units_minus1, rbsp_trailing_bits(), read_bits(), read_exp_golomb(), read_exp_golomb_s(), pic_parameter_set_rbsp::redundant_pic_cnt_present_flag, pic_parameter_set_rbsp::run_length_minus1, pic_parameter_set_rbsp::scaling_lists_4x4, pic_parameter_set_rbsp::scaling_lists_8x8, pic_parameter_set_rbsp::second_chroma_qp_index_offset, pic_parameter_set_rbsp::seq_parameter_set_id, pic_parameter_set_rbsp::slice_group_change_direction_flag, pic_parameter_set_rbsp::slice_group_change_rate_minus1, pic_parameter_set_rbsp::slice_group_id, pic_parameter_set_rbsp::slice_group_map_type, pic_parameter_set_rbsp::transform_8x8_mode_flag, pic_parameter_set_rbsp::weighted_bipred_idc, and pic_parameter_set_rbsp::weighted_pred_flag.

Referenced by parse_nal_header().

◆ parse_pred_weight_table()

static void parse_pred_weight_table ( struct buf_reader buf,
struct slice_header slc,
struct h264_parser parser 
)
static

◆ parse_ref_pic_list_reordering()

static void parse_ref_pic_list_reordering ( struct buf_reader buf,
struct slice_header slc 
)
static

◆ parse_scaling_list()

static void parse_scaling_list ( struct buf_reader buf,
uint8_t *  scaling_list,
int  length,
int  index 
)
static

◆ parse_sei()

static void parse_sei ( struct buf_reader buf,
struct sei_message sei,
struct h264_parser parser 
)
static

◆ parse_slice_header()

static uint8_t parse_slice_header ( struct buf_reader buf,
struct nal_unit slc_nal,
struct h264_parser parser 
)
static

References slice_header::bottom_field_flag, slice_header::colour_plane_id, slice_header::dec_ref_pic_marking_count, seq_parameter_set_rbsp::delta_pic_order_always_zero_flag, slice_header::delta_pic_order_cnt, slice_header::delta_pic_order_cnt_bottom, slice_header::direct_spatial_mv_pred_flag, slice_header::field_pic_flag, slice_header::first_mb_in_slice, seq_parameter_set_rbsp::frame_mbs_only_flag, slice_header::frame_num, slice_header::idr_pic_id, seq_parameter_set_rbsp::log2_max_frame_num_minus4, seq_parameter_set_rbsp::log2_max_pic_order_cnt_lsb_minus4, nal_buffer_get_by_pps_id(), nal_buffer_get_by_sps_id(), nal_unit::nal_ref_idc, NAL_SLICE_IDR, nal_unit::nal_unit_type, NULL, slice_header::num_ref_idx_active_override_flag, pic_parameter_set_rbsp::num_ref_idx_l0_active_minus1, slice_header::num_ref_idx_l0_active_minus1, pic_parameter_set_rbsp::num_ref_idx_l1_active_minus1, slice_header::num_ref_idx_l1_active_minus1, parse_dec_ref_pic_marking(), parse_pred_weight_table(), parse_ref_pic_list_reordering(), slice_header::pic_order_cnt_lsb, seq_parameter_set_rbsp::pic_order_cnt_type, pic_parameter_set_rbsp::pic_order_present_flag, slice_header::pic_parameter_set_id, nal_unit::pps, h264_parser::pps_buffer, read_bits(), read_exp_golomb(), read_exp_golomb_s(), slice_header::redundant_pic_cnt, pic_parameter_set_rbsp::redundant_pic_cnt_present_flag, seq_parameter_set_rbsp::separate_colour_plane_flag, pic_parameter_set_rbsp::seq_parameter_set_id, nal_unit::slc, SLICE_B, SLICE_P, SLICE_SP, slice_type(), slice_header::slice_type, nal_unit::sps, h264_parser::sps_buffer, pic_parameter_set_rbsp::weighted_bipred_idc, pic_parameter_set_rbsp::weighted_pred_flag, h264_parser::xine, XINE_VERBOSITY_DEBUG, and xprintf.

Referenced by parse_nal_header().

◆ parse_sps()

static uint8_t parse_sps ( struct buf_reader buf,
struct seq_parameter_set_rbsp sps 
)
static

References seq_parameter_set_rbsp::bit_depth_chroma_minus8, seq_parameter_set_rbsp::bit_depth_luma_minus8, seq_parameter_set_rbsp::chroma_format_idc, seq_parameter_set_rbsp::constraint_setN_flag, seq_parameter_set_rbsp::delta_pic_order_always_zero_flag, seq_parameter_set_rbsp::direct_8x8_inference_flag, seq_parameter_set_rbsp::frame_crop_bottom_offset, seq_parameter_set_rbsp::frame_crop_left_offset, seq_parameter_set_rbsp::frame_crop_right_offset, seq_parameter_set_rbsp::frame_crop_top_offset, seq_parameter_set_rbsp::frame_cropping_flag, seq_parameter_set_rbsp::frame_mbs_only_flag, seq_parameter_set_rbsp::gaps_in_frame_num_value_allowed_flag, seq_parameter_set_rbsp::level_idc, seq_parameter_set_rbsp::log2_max_frame_num_minus4, seq_parameter_set_rbsp::log2_max_pic_order_cnt_lsb_minus4, seq_parameter_set_rbsp::max_frame_num, seq_parameter_set_rbsp::mb_adaptive_frame_field_flag, seq_parameter_set_rbsp::num_ref_frames, seq_parameter_set_rbsp::num_ref_frames_in_pic_order_cnt_cycle, seq_parameter_set_rbsp::offset_for_non_ref_pic, seq_parameter_set_rbsp::offset_for_ref_frame, seq_parameter_set_rbsp::offset_for_top_to_bottom_field, parse_scaling_list(), parse_vui_parameters(), seq_parameter_set_rbsp::pic_height, seq_parameter_set_rbsp::pic_order_cnt_type, seq_parameter_set_rbsp::pic_width, seq_parameter_set_rbsp::profile_idc, seq_parameter_set_rbsp::qpprime_y_zero_transform_bypass_flag, read_bits(), read_exp_golomb(), read_exp_golomb_s(), seq_parameter_set_rbsp::scaling_lists_4x4, seq_parameter_set_rbsp::scaling_lists_8x8, seq_parameter_set_rbsp::separate_colour_plane_flag, seq_parameter_set_rbsp::seq_parameter_set_id, seq_parameter_set_rbsp::seq_scaling_list_present_flag, seq_parameter_set_rbsp::seq_scaling_matrix_present_flag, sps_scaling_list_fallback(), and seq_parameter_set_rbsp::vui_parameters_present_flag.

Referenced by parse_nal_header().

◆ parse_vui_parameters()

static void parse_vui_parameters ( struct buf_reader buf,
struct seq_parameter_set_rbsp sps 
)
static

References ASPECT_EXTENDED_SAR, seq_parameter_set_rbsp::aspect_ratio_idc, seq_parameter_set_rbsp::aspect_ration_info_present_flag, seq_parameter_set_rbsp::bitstream_restriction_flag, seq_parameter_set_rbsp::chroma_loc_info_present_flag, seq_parameter_set_rbsp::chroma_sample_loc_type_bottom_field, seq_parameter_set_rbsp::chroma_sample_loc_type_top_field, seq_parameter_set_rbsp::colour_description_present, seq_parameter_set_rbsp::colour_primaries, seq_parameter_set_rbsp::fixed_frame_rate_flag, seq_parameter_set_rbsp::log2_max_mv_length_horizontal, seq_parameter_set_rbsp::log2_max_mv_length_vertical, seq_parameter_set_rbsp::low_delay_hrd_flag, seq_parameter_set_rbsp::matrix_coefficients, seq_parameter_set_rbsp::max_bits_per_mb_denom, seq_parameter_set_rbsp::max_bytes_per_pic_denom, seq_parameter_set_rbsp::max_dec_frame_buffering, seq_parameter_set_rbsp::motion_vectors_over_pic_boundaries, seq_parameter_set_rbsp::nal_hrd_parameters, seq_parameter_set_rbsp::nal_hrd_parameters_present_flag, seq_parameter_set_rbsp::num_reorder_frames, seq_parameter_set_rbsp::num_units_in_tick, seq_parameter_set_rbsp::overscan_appropriate_flag, seq_parameter_set_rbsp::overscan_info_present_flag, parse_hrd_parameters(), seq_parameter_set_rbsp::pic_struct_present_flag, read_bits(), read_exp_golomb(), seq_parameter_set_rbsp::sar_height, seq_parameter_set_rbsp::sar_width, seq_parameter_set_rbsp::time_scale, seq_parameter_set_rbsp::timing_info_present_flag, seq_parameter_set_rbsp::transfer_characteristics, seq_parameter_set_rbsp::vc1_hrd_parameters, seq_parameter_set_rbsp::vc1_hrd_parameters_present_flag, seq_parameter_set_rbsp::video_format, seq_parameter_set_rbsp::video_full_range_flag, seq_parameter_set_rbsp::video_signal_type_present_flag, and seq_parameter_set_rbsp::vui_parameters.

Referenced by parse_sps().

◆ pps_scaling_list_fallback()

static void pps_scaling_list_fallback ( struct seq_parameter_set_rbsp sps,
struct pic_parameter_set_rbsp pps,
int  i 
)
static

◆ process_mmc_operations()

static void process_mmc_operations ( struct h264_parser parser,
struct coded_picture picture 
)
static

◆ rbsp_trailing_bits()

static int rbsp_trailing_bits ( const uint8_t *  buf,
int  buf_len 
)
inlinestatic

References buf_reader::buf, and lprintf.

Referenced by parse_pps().

◆ read_bits()

static uint32_t read_bits ( struct buf_reader buf,
int  len 
)
inlinestatic

◆ read_exp_golomb()

static uint32_t read_exp_golomb ( struct buf_reader buf)
static

◆ read_exp_golomb_s()

static int32_t read_exp_golomb_s ( struct buf_reader buf)
static

◆ seek_for_nal()

static int seek_for_nal ( uint8_t *  buf,
int  buf_len,
struct h264_parser parser 
)
static

◆ skip_emulation_prevention_three_byte()

static void skip_emulation_prevention_three_byte ( struct buf_reader buf)
inlinestatic

References buf_reader::buf.

Referenced by read_bits().

◆ sps_scaling_list_fallback()

static void sps_scaling_list_fallback ( struct seq_parameter_set_rbsp sps,
int  i 
)
static

Variable Documentation

◆ default_4x4_inter

const uint8_t default_4x4_inter[16]
static
Initial value:
= { 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27,
27, 27, 30, 30, 34 }

Referenced by parse_scaling_list(), and sps_scaling_list_fallback().

◆ default_4x4_intra

const uint8_t default_4x4_intra[16]
static
Initial value:
= { 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32,
32, 32, 37, 37, 42 }

Referenced by parse_scaling_list(), and sps_scaling_list_fallback().

◆ default_8x8_inter

const uint8_t default_8x8_inter[64]
static
Initial value:
= { 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19,
19, 19, 19, 19, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24,
24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27,
28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35 }

Referenced by parse_scaling_list(), and sps_scaling_list_fallback().

◆ default_8x8_intra

const uint8_t default_8x8_intra[64]
static
Initial value:
= { 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18,
18, 18, 18, 18, 23, 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27,
27, 27, 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31,
33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42 }

Referenced by parse_scaling_list(), and sps_scaling_list_fallback().