+ if( p_dec->p_sys->i_fps_num < 5 && /* Work-around buggy streams */
+ p_dec->fmt_in.video.i_frame_rate > 0 &&
+ p_dec->fmt_in.video.i_frame_rate_base > 0 )
+ {
+ p_sys->i_interpolated_pts += INT64_C(1000000) *
+ p_dec->fmt_in.video.i_frame_rate_base *
+ p_vop->i_rate / INPUT_RATE_DEFAULT /
+ p_dec->fmt_in.video.i_frame_rate;
+ }
+ else if( p_dec->p_sys->i_fps_num )
+ p_sys->i_interpolated_pts +=
+ ( INT64_C(1000000) * (i_time_ref + i_time_increment -
+ p_sys->i_last_time - p_sys->i_last_timeincr) *
+ p_vop->i_rate / INPUT_RATE_DEFAULT /
+ p_dec->p_sys->i_fps_num );
+
+ p_sys->i_last_time = i_time_ref;
+ p_sys->i_last_timeincr = i_time_increment;
+
+ /* Correct interpolated dts when we receive a new pts/dts */
+ if( p_vop->i_pts > 0 )
+ p_sys->i_interpolated_pts = p_vop->i_pts;
+ if( p_vop->i_dts > 0 )
+ p_sys->i_interpolated_dts = p_vop->i_dts;
+
+ if( (p_sys->i_flags & BLOCK_FLAG_TYPE_B) || !p_sys->b_frame )
+ {
+ /* Trivial case (DTS == PTS) */
+
+ p_sys->i_interpolated_dts = p_sys->i_interpolated_pts;
+
+ if( p_vop->i_pts > 0 )
+ p_sys->i_interpolated_dts = p_vop->i_pts;
+ if( p_vop->i_dts > 0 )
+ p_sys->i_interpolated_dts = p_vop->i_dts;
+
+ p_sys->i_interpolated_pts = p_sys->i_interpolated_dts;
+ }
+ else
+ {
+ if( p_sys->i_last_ref_pts > 0 )
+ p_sys->i_interpolated_dts = p_sys->i_last_ref_pts;
+
+ p_sys->i_last_ref_pts = p_sys->i_interpolated_pts;
+ }
+
+ return VLC_SUCCESS;
+}
+
+/* look at ffmpeg av_log2 ;) */
+static int vlc_log2( unsigned int v )
+{
+ int n = 0;
+ static const int vlc_log2_table[16] =
+ {
+ 0,0,1,1,2,2,2,2, 3,3,3,3,3,3,3,3
+ };
+
+ if( v&0xffff0000 )
+ {
+ v >>= 16;
+ n += 16;
+ }
+ if( v&0xff00 )
+ {
+ v >>= 8;
+ n += 8;
+ }
+ if( v&0xf0 )
+ {
+ v >>= 4;
+ n += 4;
+ }
+ n += vlc_log2_table[v];
+
+ return n;
+}