videotimecode: Fix incorrect nsec_since_daily_jam calculation

For drop-frame timecodes, the nsec_since_daily_jam doesn't necessarily
directly correspond to this many hours/minutes/seconds/frames. We have
to get the frame count as per frames_since_daily_jam and then convert.

https://bugzilla.gnome.org/show_bug.cgi?id=774585
This commit is contained in:
Vivia Nikolaidou 2016-11-16 19:13:14 +02:00 committed by Sebastian Dröge
parent 088aebfda9
commit f578c00a14

View file

@ -174,7 +174,7 @@ gst_video_time_code_to_date_time (const GstVideoTimeCode * tc)
guint64 guint64
gst_video_time_code_nsec_since_daily_jam (const GstVideoTimeCode * tc) gst_video_time_code_nsec_since_daily_jam (const GstVideoTimeCode * tc)
{ {
gdouble nsec; guint64 frames, nsec;
g_return_val_if_fail (gst_video_time_code_is_valid (tc), -1); g_return_val_if_fail (gst_video_time_code_is_valid (tc), -1);
@ -187,21 +187,10 @@ gst_video_time_code_nsec_since_daily_jam (const GstVideoTimeCode * tc)
return -1; return -1;
} }
if ((tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_INTERLACED) frames = gst_video_time_code_frames_since_daily_jam (tc);
&& tc->field_count == 1) nsec =
nsec = gst_util_uint64_scale (frames, GST_SECOND * tc->config.fps_d,
gst_util_uint64_scale (GST_SECOND * tc->frames - 500 * GST_MSECOND, tc->config.fps_n);
tc->config.fps_d, tc->config.fps_n);
else
nsec =
gst_util_uint64_scale (GST_SECOND * tc->frames, tc->config.fps_d,
tc->config.fps_n);
/* hours <= 24 (daily jam required)
* minutes < 60
* seconds < 60
* this can't overflow */
nsec += GST_SECOND * (tc->seconds + (60 * (tc->minutes + 60 * tc->hours)));
return nsec; return nsec;
} }