static bool ParseSEICallback( const hxxx_sei_data_t *p_sei_data, void *cbdata ) { decoder_t *p_dec = (decoder_t *) cbdata; decoder_sys_t *p_sys = p_dec->p_sys; if( p_sei_data->i_type == HXXX_SEI_USER_DATA_REGISTERED_ITU_T_T35 ) { if( p_sei_data->itu_t35.type == HXXX_ITU_T35_TYPE_CC ) { cc_storage_append( p_sys->p_ccs, true, p_sei_data->itu_t35.u.cc.p_data, p_sei_data->itu_t35.u.cc.i_data ); } } return true; }
static bool ParseSeiCallback( const hxxx_sei_data_t *p_sei_data, void *cbdata ) { decoder_t *p_dec = (decoder_t *) cbdata; decoder_sys_t *p_sys = p_dec->p_sys; switch( p_sei_data->i_type ) { /* Look for pic timing */ case HXXX_SEI_PIC_TIMING: { const h264_sequence_parameter_set_t *p_sps = p_sys->p_active_sps; if( unlikely( p_sps == NULL ) ) { assert( p_sps ); break; } if( p_sps->vui.b_valid ) { if( p_sps->vui.b_hrd_parameters_present_flag ) { bs_read( p_sei_data->p_bs, p_sps->vui.i_cpb_removal_delay_length_minus1 + 1 ); p_sys->i_dpb_output_delay = bs_read( p_sei_data->p_bs, p_sps->vui.i_dpb_output_delay_length_minus1 + 1 ); } if( p_sps->vui.b_pic_struct_present_flag ) p_sys->i_pic_struct = bs_read( p_sei_data->p_bs, 4 ); /* + unparsed remains */ } } break; /* Look for user_data_registered_itu_t_t35 */ case HXXX_SEI_USER_DATA_REGISTERED_ITU_T_T35: { if( p_sei_data->itu_t35.type == HXXX_ITU_T35_TYPE_CC ) { cc_storage_append( p_sys->p_ccs, true, p_sei_data->itu_t35.u.cc.p_data, p_sei_data->itu_t35.u.cc.i_data ); } } break; case HXXX_SEI_FRAME_PACKING_ARRANGEMENT: { if( p_dec->fmt_in.video.multiview_mode == MULTIVIEW_2D ) { video_multiview_mode_t mode; switch( p_sei_data->frame_packing.type ) { case FRAME_PACKING_INTERLEAVED_CHECKERBOARD: mode = MULTIVIEW_STEREO_CHECKERBOARD; break; case FRAME_PACKING_INTERLEAVED_COLUMN: mode = MULTIVIEW_STEREO_COL; break; case FRAME_PACKING_INTERLEAVED_ROW: mode = MULTIVIEW_STEREO_ROW; break; case FRAME_PACKING_SIDE_BY_SIDE: mode = MULTIVIEW_STEREO_SBS; break; case FRAME_PACKING_TOP_BOTTOM: mode = MULTIVIEW_STEREO_TB; break; case FRAME_PACKING_TEMPORAL: mode = MULTIVIEW_STEREO_FRAME; break; case FRAME_PACKING_TILED: default: mode = MULTIVIEW_2D; break; } p_dec->fmt_out.video.multiview_mode = mode; } } break; /* Look for SEI recovery point */ case HXXX_SEI_RECOVERY_POINT: { if( !p_sys->b_recovered ) msg_Dbg( p_dec, "Seen SEI recovery point, %d recovery frames", p_sei_data->recovery.i_frames ); p_sys->i_recovery_frame_cnt = p_sei_data->recovery.i_frames; } break; default: /* Will skip */ break; } return true; }