/* Palettized RGB with palette element R:G:B */
#define VLC_CODEC_RGBP VLC_FOURCC('R','G','B','P')
/* 8 bits RGB */
-#define VLC_CODEC_RGB8 VLC_FOURCC('R','G','B','2')
+#define VLC_CODEC_RGB8 VLC_FOURCC('R','G','B','8')
/* 15 bits RGB stored on 16 bits */
#define VLC_CODEC_RGB15 VLC_FOURCC('R','V','1','5')
/* 16 bits RGB store on a 16 bits */
bool b_pps;
block_t *pp_sps[SPS_MAX];
block_t *pp_pps[PPS_MAX];
+ int i_recovery_frames; /* -1 = no recovery */
/* avcC data */
int i_avcC_length_size;
p_sys->pp_sps[i] = NULL;
for( i = 0; i < PPS_MAX; i++ )
p_sys->pp_pps[i] = NULL;
+ p_sys->i_recovery_frames = -1;
p_sys->slice.i_nal_type = -1;
p_sys->slice.i_nal_ref_idc = -1;
block_ChainAppend( &p_sys->p_frame, p_frag );
*pb_used_ts = false;
- if( p_sys->i_frame_dts <= VLC_TS_INVALID &&
+ if( p_sys->i_frame_dts <= VLC_TS_INVALID &&
p_sys->i_frame_pts <= VLC_TS_INVALID )
{
p_sys->i_frame_dts = i_frag_dts;
decoder_sys_t *p_sys = p_dec->p_sys;
block_t *p_pic;
- if( !p_sys->b_header && p_sys->slice.i_frame_type != BLOCK_FLAG_TYPE_I)
+ if ( !p_sys->b_header && p_sys->i_recovery_frames != -1 )
+ {
+ if( p_sys->i_recovery_frames == 0 )
+ {
+ msg_Dbg( p_dec, "Recovery from SEI recovery point complete" );
+ p_sys->b_header = true;
+ }
+ --p_sys->i_recovery_frames;
+ }
+
+ if( !p_sys->b_header && p_sys->i_recovery_frames == -1 &&
+ p_sys->slice.i_frame_type != BLOCK_FLAG_TYPE_I)
return NULL;
const bool b_sps_pps_i = p_sys->slice.i_frame_type == BLOCK_FLAG_TYPE_I &&
p_pic->i_length = 0; /* FIXME */
p_pic->i_flags |= p_sys->slice.i_frame_type;
p_pic->i_flags &= ~BLOCK_FLAG_PRIVATE_AUD;
+ if( !p_sys->b_header )
+ p_pic->i_flags |= BLOCK_FLAG_PREROLL;
p_sys->slice.i_frame_type = 0;
p_sys->p_frame = NULL;
cc_Extract( &p_sys->cc_next, true, &p_t35[3], i_t35 - 3 );
}
}
+
+ /* Look for SEI recovery point */
+ if( i_type == 6 )
+ {
+ bs_t s;
+ const int i_rec = i_size;
+ const uint8_t *p_rec = &pb_dec[i_used];
+
+ bs_init( &s, p_rec, i_rec );
+ int i_recovery_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 );
+ if( !p_sys->b_header )
+ {
+ msg_Dbg( p_dec, "Seen SEI recovery point, %d recovery frames", i_recovery_frames );
+ if ( p_sys->i_recovery_frames == -1 || i_recovery_frames < p_sys->i_recovery_frames )
+ p_sys->i_recovery_frames = i_recovery_frames;
+ }
+ }
+
i_used += i_size;
}
uint64_t date = mach_absolute_time();
mach_timebase_info_data_t tb = mtime_timebase_info;
- /* Get the ssystem dependent factor. Switch to double to prevent overflow */
- double factor = (double) tb.numer / (double) tb.denom;
- /* Convert to microseconds */
- double d = (double) date * factor / 1000;
- res = d;
+ /* tb.denom is uint32_t, switch to 64 bits to prevent overflow. */
+ uint64_t denom = tb.denom;
+
+ /* Switch to microsecs */
+ denom *= 1000LL;
+
+ /* Split the division to prevent overflow */
+ lldiv_t d = lldiv (tb.numer, denom);
+
+ res = (d.quot * date) + ((d.rem * date) / denom);
#elif defined( WIN32 ) || defined( UNDER_CE )
/* We don't need the real date, just the value of a high precision timer */