From: Robin Gareus Date: Sun, 22 Mar 2015 15:01:40 +0000 (+0100) Subject: fix #6208, negative broadcast timestamps X-Git-Tag: 4.0-rc1~129 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=fbe673d9c7da1b0fe3966b5161c2bccca68aa4ea;p=ardour.git fix #6208, negative broadcast timestamps --- diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc index ceb88eddc9..2c55886502 100644 --- a/libs/ardour/sndfileimportable.cc +++ b/libs/ardour/sndfileimportable.cc @@ -1,8 +1,10 @@ -#include "ardour/sndfileimportable.h" #include #include #include +#include "pbd/error.h" +#include "ardour/sndfileimportable.h" + using namespace ARDOUR; using namespace std; @@ -15,10 +17,32 @@ SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binf return 0; } + /* see http://tracker.ardour.org/view.php?id=6208 + * 0xffffffff 0xfffc5680 + * seems to be a bug in Presonus Capture (which generated the file) + * + * still since framepos_t is a signed int, ignore files that could + * lead to negative timestamps for now. + */ + + if (binfo->time_reference_high & 0x80000000) { + char tmp[64]; + snprintf(tmp, sizeof(tmp), "%x%08x", binfo->time_reference_high, binfo->time_reference_low); + PBD::warning << "Invalid Timestamp " << tmp << endmsg; + exists = false; + return 0; + } + exists = true; - int64_t ret = (uint32_t) binfo->time_reference_high; + /* libsndfile reads eactly 4 bytes for high and low, but + * uses "unsigned int" which may or may not be 32 bit little + * endian. + */ + int64_t ret = (uint32_t) (binfo->time_reference_high & 0x7fffffff); ret <<= 32; - ret |= (uint32_t) binfo->time_reference_low; + ret |= (uint32_t) (binfo->time_reference_low & 0xffffffff); + + assert(ret >= 0); return ret; } diff --git a/libs/audiographer/src/general/broadcast_info.cc b/libs/audiographer/src/general/broadcast_info.cc index df69ac9c79..5daee9b2ec 100644 --- a/libs/audiographer/src/general/broadcast_info.cc +++ b/libs/audiographer/src/general/broadcast_info.cc @@ -110,9 +110,13 @@ BroadcastInfo::get_time_reference () const return 0; } - int64_t ret = (uint32_t) info->time_reference_high; + if (info->time_reference_high & 0x80000000) { + return 0; + } + + int64_t ret = (uint32_t) (info->time_reference_high & 0x7fffffff); ret <<= 32; - ret |= (uint32_t) info->time_reference_low; + ret |= (uint32_t) (info->time_reference_low & 0xffffffff); return ret; }