1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-03 01:31:53 +02:00

packetizer: h26x: recovery point has changed for HEVC

This commit is contained in:
Francois Cartegnie 2021-02-03 13:38:29 +01:00
parent 27db51ce4f
commit 63a50f5439
8 changed files with 42 additions and 13 deletions

View File

@ -1228,9 +1228,13 @@ static bool ParseSeiCallback( const hxxx_sei_data_t *p_sei_data, void *cbdata )
/* 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;
h264_sei_recovery_point_t reco;
if( !p_sys->b_recovered &&
h264_decode_sei_recovery_point( p_sei_data->p_bs, &reco ) )
{
msg_Dbg( p_dec, "Seen SEI recovery point, %u recovery frames", reco.i_frames );
p_sys->i_recovery_frame_cnt = reco.i_frames;
}
} break;
default:

View File

@ -861,3 +861,12 @@ bool h264_get_profile_level(const es_format_t *p_fmt, uint8_t *pi_profile,
return true;
}
bool h264_decode_sei_recovery_point( bs_t *p_bs, h264_sei_recovery_point_t *p_reco )
{
p_reco->i_frames = bs_read_ue( p_bs );
//bool b_exact_match = bs_read( p_bs, 1 );
//bool b_broken_link = bs_read( p_bs, 1 );
//int i_changing_slice_group = bs_read( p_bs, 2 );
return true;
}

View File

@ -22,6 +22,7 @@
# include <vlc_common.h>
# include <vlc_es.h>
# include <vlc_bits.h>
#define PROFILE_H264_BASELINE 66
#define PROFILE_H264_MAIN 77
@ -198,4 +199,11 @@ bool h264_get_colorimetry( const h264_sequence_parameter_set_t *p_sps,
bool h264_get_profile_level(const es_format_t *p_fmt, uint8_t *pi_profile,
uint8_t *pi_level, uint8_t *p_nal_length_size);
typedef struct
{
unsigned i_frames;
} h264_sei_recovery_point_t;
bool h264_decode_sei_recovery_point( bs_t *, h264_sei_recovery_point_t * );
#endif /* H264_NAL_H */

View File

@ -1063,9 +1063,11 @@ static bool ParseSEICallback( const hxxx_sei_data_t *p_sei_data, void *cbdata )
} break;
case HXXX_SEI_RECOVERY_POINT:
{
if( !p_sys->b_recovery_point )
hevc_sei_recovery_point_t reco;
if( !p_sys->b_recovery_point &&
hevc_decode_sei_recovery_point( p_sei_data->p_bs, &reco ) )
{
msg_Dbg( p_dec, "Seen SEI recovery point, %d recovery frames", p_sei_data->recovery.i_frames );
msg_Dbg( p_dec, "Seen SEI recovery point, %d recovery frames", reco.i_frames );
p_sys->b_recovery_point = true;
}
} break;

View File

@ -1654,6 +1654,12 @@ hevc_sei_pic_timing_t * hevc_decode_sei_pic_timing( bs_t *p_bs,
return p_timing;
}
bool hevc_decode_sei_recovery_point( bs_t *p_bs, hevc_sei_recovery_point_t *p_reco )
{
p_reco->i_frames = bs_read_se( p_bs );
return true;
}
bool hevc_frame_is_progressive( const hevc_sequence_parameter_set_t *p_sps,
const hevc_sei_pic_timing_t *p_timing )
{

View File

@ -375,6 +375,13 @@ hevc_sei_pic_timing_t * hevc_decode_sei_pic_timing( bs_t *,
const hevc_sequence_parameter_set_t * );
void hevc_release_sei_pic_timing( hevc_sei_pic_timing_t * );
typedef struct
{
int i_frames;
} hevc_sei_recovery_point_t;
bool hevc_decode_sei_recovery_point( bs_t *, hevc_sei_recovery_point_t * );
uint8_t hevc_get_num_clock_ts( const hevc_sequence_parameter_set_t *,
const hevc_sei_pic_timing_t * /* can be NULL */ );
bool hevc_frame_is_progressive( const hevc_sequence_parameter_set_t *,

View File

@ -168,10 +168,7 @@ void HxxxParseSEI(const uint8_t *p_buf, size_t i_buf,
/* Look for SEI recovery point */
case HXXX_SEI_RECOVERY_POINT:
{
sei_data.recovery.i_frames = bs_read_ue( &s );
//bool b_exact_match = bs_read( &s, 1 );
//bool b_broken_link = bs_read( &s, 1 );
//int i_changing_slice_group = bs_read( &s, 2 );
sei_data.p_bs = &s;
b_continue = pf_callback( &sei_data, cbdata );
} break;

View File

@ -74,10 +74,6 @@ typedef struct
bool b_frame0;
} frame_packing;
struct
{
int i_frames;
} recovery;
struct
{
uint16_t primaries[3*2]; /* G,B,R / x,y */
uint16_t white_point[2]; /* x,y */