-double
-FFmpegDecoder::compute_pts_offset (double first_video, double first_audio, float video_frame_rate)
-{
- double const old_first_video = first_video;
-
- /* Round the first video to a frame boundary */
- if (fabs (rint (first_video * video_frame_rate) - first_video * video_frame_rate) > 1e-6) {
- first_video = ceil (first_video * video_frame_rate) / video_frame_rate;
+ 1. One of them starts at time 0.
+ 2. The first video PTS value ends up on a frame boundary.
+
+ Then we remove big initial gaps in PTS and we allow our
+ insertion of black frames to work.
+
+ We will do:
+ audio_pts_to_use = audio_pts_from_ffmpeg + audio_pts_offset;
+ video_pts_to_use = video_pts_from_ffmpeg + video_pts_offset;
+ */
+
+ bool const have_video = video && c->first_video();
+ bool const have_audio = audio && c->audio_stream() && c->audio_stream()->first_audio;
+
+ /* First, make one of them start at 0 */
+
+ if (have_audio && have_video) {
+ _video_pts_offset = _audio_pts_offset = - min (c->first_video().get(), c->audio_stream()->first_audio.get());
+ } else if (have_video) {
+ _video_pts_offset = - c->first_video().get();
+ } else if (have_audio) {
+ _audio_pts_offset = - c->audio_stream()->first_audio.get();