You've already forked libopenshot
mirror of
https://github.com/OpenShot/libopenshot.git
synced 2026-03-02 08:53:52 -08:00
Merge pull request #565 from OpenShot/fix-pts-offset-logic
Fix the PTS offset logic error when first reading a file with FFmpegReader
This commit is contained in:
@@ -1868,8 +1868,20 @@ void FFmpegReader::UpdatePTSOffset(bool is_video) {
|
||||
// VIDEO PACKET
|
||||
if (video_pts_offset == 99999) // Has the offset been set yet?
|
||||
{
|
||||
// Find the difference between PTS and frame number (no more than 10 timebase units allowed)
|
||||
video_pts_offset = 0 - std::max(GetVideoPTS(), (int64_t) info.video_timebase.ToInt() * 10);
|
||||
// Find the difference between PTS and frame number
|
||||
video_pts_offset = 0 - GetVideoPTS();
|
||||
|
||||
// Find the difference between PTS and frame number
|
||||
// Also, determine if PTS is invalid (too far away from zero)
|
||||
// We compare the PTS to the timebase value equal to 1 second (which means the PTS
|
||||
// must be within the -1 second to +1 second of zero, otherwise we ignore it)
|
||||
// TODO: Please see https://github.com/OpenShot/libopenshot/pull/565#issuecomment-690985272
|
||||
// for ideas to improve this logic.
|
||||
int64_t max_offset = info.video_timebase.Reciprocal().ToFloat();
|
||||
if (video_pts_offset < -max_offset || video_pts_offset > max_offset) {
|
||||
// Ignore PTS, it seems invalid
|
||||
video_pts_offset = 0;
|
||||
}
|
||||
|
||||
// debug output
|
||||
ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdatePTSOffset (Video)", "video_pts_offset", video_pts_offset, "is_video", is_video);
|
||||
@@ -1878,8 +1890,18 @@ void FFmpegReader::UpdatePTSOffset(bool is_video) {
|
||||
// AUDIO PACKET
|
||||
if (audio_pts_offset == 99999) // Has the offset been set yet?
|
||||
{
|
||||
// Find the difference between PTS and frame number (no more than 10 timebase units allowed)
|
||||
audio_pts_offset = 0 - std::max(packet->pts, (int64_t) info.audio_timebase.ToInt() * 10);
|
||||
// Find the difference between PTS and frame number
|
||||
// Also, determine if PTS is invalid (too far away from zero)
|
||||
// We compare the PTS to the timebase value equal to 1 second (which means the PTS
|
||||
// must be within the -1 second to +1 second of zero, otherwise we ignore it)
|
||||
// TODO: Please see https://github.com/OpenShot/libopenshot/pull/565#issuecomment-690985272
|
||||
// for ideas to improve this logic.
|
||||
audio_pts_offset = 0 - packet->pts;
|
||||
int64_t max_offset = info.audio_timebase.Reciprocal().ToFloat();
|
||||
if (audio_pts_offset < -max_offset || audio_pts_offset > max_offset) {
|
||||
// Ignore PTS, it seems invalid
|
||||
audio_pts_offset = 0;
|
||||
}
|
||||
|
||||
// debug output
|
||||
ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdatePTSOffset (Audio)", "audio_pts_offset", audio_pts_offset, "is_video", is_video);
|
||||
|
||||
Reference in New Issue
Block a user