int64_t i_fps_num;
int64_t i_fps_den;
int64_t i_framenum;
- int i_init_delay;
- int i_delay_time;
uint64_t i_framerate_pos;
uint64_t i_duration_pos;
uint64_t i_bitrate_pos;
uint8_t b_write_length;
- int64_t i_init_delta;
- int64_t i_prev_timestamps[2];
+ int64_t i_prev_dts;
+ int64_t i_prev_pts;
int i_timebase_num;
int i_timebase_den;
p_flv->i_fps_den = p_param->i_fps_den;
p_flv->i_timebase_num = p_param->i_timebase_num;
p_flv->i_timebase_den = p_param->i_timebase_den;
- p_flv->i_init_delay = p_param->i_bframe ? (p_param->i_bframe_pyramid ? 2 : 1) : 0;
p_flv->b_vfr_input = p_param->b_vfr_input;
-
return 0;
}
flv_hnd_t *p_flv = handle;
flv_buffer *c = p_flv->c;
- int64_t dts;
- int64_t cts;
- int64_t offset;
-
- if( !p_flv->i_framenum )
- p_flv->i_delay_time = p_picture->i_dts;
+ int64_t dts = (int64_t)( (p_picture->i_dts * 1000 * ((double)p_flv->i_timebase_num / p_flv->i_timebase_den)) + 0.5 );
+ int64_t cts = (int64_t)( (p_picture->i_pts * 1000 * ((double)p_flv->i_timebase_num / p_flv->i_timebase_den)) + 0.5 );
+ int64_t offset = cts - dts;
- if( !p_flv->i_init_delay )
- dts = cts = (int64_t)((p_picture->i_pts * 1000 * p_flv->i_timebase_num / p_flv->i_timebase_den) + 0.5);
- else
+ if( p_flv->i_framenum )
{
- // Use DTS compression
- dts = p_picture->i_dts - p_flv->i_delay_time;
-
- if( p_flv->i_framenum == 1 )
- p_flv->i_init_delta = p_picture->i_dts - p_flv->i_delay_time;
-
- if( p_flv->i_framenum > p_flv->i_init_delay )
+ int64_t prev_dts = (int64_t)( (p_flv->i_prev_dts * 1000 * ((double)p_flv->i_timebase_num / p_flv->i_timebase_den)) + 0.5 );
+ int64_t prev_cts = (int64_t)( (p_flv->i_prev_pts * 1000 * ((double)p_flv->i_timebase_num / p_flv->i_timebase_den)) + 0.5 );
+ if( prev_dts == dts )
{
- dts = p_flv->i_prev_timestamps[ (p_flv->i_framenum - p_flv->i_init_delay) % p_flv->i_init_delay ];
- dts = (int64_t)((dts * 1000 * p_flv->i_timebase_num / p_flv->i_timebase_den) + 0.5);
+ double fps = ((double)p_flv->i_timebase_den / p_flv->i_timebase_num) / (p_picture->i_dts - p_flv->i_prev_dts);
+ fprintf( stderr, "flv [warning]: duplicate DTS %"PRId64" generated by rounding\n"
+ " current internal decoding framerate: %.6f fps\n", dts, fps );
}
- else if( p_flv->i_init_delta )
+ if( prev_cts == cts )
{
- // Compressed DTSs might not fit in input timescale
- double compressed_dts;
- compressed_dts = (p_flv->i_framenum * ((double)p_flv->i_init_delta / (2 * p_flv->i_init_delay)));
- dts = (int64_t)((compressed_dts * 1000 * p_flv->i_timebase_num / p_flv->i_timebase_den) + 0.5);
+ double fps = ((double)p_flv->i_timebase_den / p_flv->i_timebase_num) / (p_picture->i_pts - p_flv->i_prev_pts);
+ fprintf( stderr, "flv [warning]: duplicate CTS %"PRId64" is generated by rounding\n"
+ " current internal composition framerate: %.6f fps\n", cts, fps );
}
-
- p_flv->i_prev_timestamps[ p_flv->i_framenum % p_flv->i_init_delay ] = p_picture->i_dts - p_flv->i_delay_time;
-
- cts = p_picture->i_pts;
- cts = (int64_t)((cts * 1000 * p_flv->i_timebase_num / p_flv->i_timebase_den) + 0.5);
- }
-
- offset = cts - dts;
-
- assert( cts >= dts );
+ }
+ p_flv->i_prev_dts = p_picture->i_dts;
+ p_flv->i_prev_pts = p_picture->i_pts;
// A new frame - write packet header
x264_put_byte( c, FLV_TAG_TYPE_VIDEO );