fix #6208, negative broadcast timestamps

This commit is contained in:
Robin Gareus 2015-03-22 16:01:40 +01:00
parent 39e5f7b94b
commit fbe673d9c7
2 changed files with 33 additions and 5 deletions

View File

@ -1,8 +1,10 @@
#include "ardour/sndfileimportable.h"
#include <sndfile.h>
#include <iostream>
#include <cstring>
#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;
}

View File

@ -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;
}