Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions tools/library/tbc/lddecodemetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <QDebug>
#include <QMap>
#include <QMultiMap>
#include <QVariant>
#include "tbc/logging.h"

// Default values used when configuring VideoParameters for a particular video system.
Expand Down Expand Up @@ -539,16 +540,16 @@ void LdDecodeMetaData::readFields(SqliteReader &reader, int captureId)
// Note: field_id in database is 0-indexed, but seqNo should be 1-indexed
int fieldId = fieldsQuery.value("field_id").toInt();
field.seqNo = fieldId + 1;
field.isFirstField = fieldsQuery.value("is_first_field").toInt() == 1;
field.syncConf = fieldsQuery.value("sync_conf").toInt();
field.medianBurstIRE = fieldsQuery.value("median_burst_ire").toDouble();
field.fieldPhaseID = fieldsQuery.value("field_phase_id").toInt();
field.audioSamples = fieldsQuery.value("audio_samples").toInt();
field.diskLoc = fieldsQuery.value("disk_loc").toDouble();
field.fileLoc = fieldsQuery.value("file_loc").toLongLong();
field.decodeFaults = fieldsQuery.value("decode_faults").toInt();
field.efmTValues = fieldsQuery.value("efm_t_values").toInt();
field.pad = fieldsQuery.value("pad").toInt() == 1;
field.isFirstField = SqliteValue::toBoolOrDefault(fieldsQuery, "is_first_field");
field.syncConf = SqliteValue::toIntOrDefault(fieldsQuery, "sync_conf", 0);
field.medianBurstIRE = SqliteValue::toDoubleOrDefault(fieldsQuery, "median_burst_ire", 0.0);
field.fieldPhaseID = SqliteValue::toIntOrDefault(fieldsQuery, "field_phase_id");
field.audioSamples = SqliteValue::toIntOrDefault(fieldsQuery, "audio_samples");
field.diskLoc = SqliteValue::toDoubleOrDefault(fieldsQuery, "disk_loc");
field.fileLoc = SqliteValue::toLongLongOrDefault(fieldsQuery, "file_loc");
field.decodeFaults = SqliteValue::toIntOrDefault(fieldsQuery, "decode_faults");
field.efmTValues = SqliteValue::toIntOrDefault(fieldsQuery, "efm_t_values");
field.pad = SqliteValue::toBoolOrDefault(fieldsQuery, "pad");

// Read NTSC data from the main field record
field.ntsc.isFmCodeDataValid = fieldsQuery.value("ntsc_is_fm_code_data_valid").toInt() == 1;
Expand Down
62 changes: 45 additions & 17 deletions tools/library/tbc/sqliteio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,34 @@
#include <QStringList>
#include "tbc/logging.h"

namespace SqliteValue
{
// Keep legacy "-1 means missing" semantics when SQLite stores NULL
int toIntOrDefault(const QSqlQuery &query, const char *column, int defaultValue)
{
const QVariant value = query.value(column);
return value.isNull() ? defaultValue : value.toInt();
}

qint64 toLongLongOrDefault(const QSqlQuery &query, const char *column, qint64 defaultValue)
{
const QVariant value = query.value(column);
return value.isNull() ? defaultValue : value.toLongLong();
}

double toDoubleOrDefault(const QSqlQuery &query, const char *column, double defaultValue)
{
const QVariant value = query.value(column);
return value.isNull() ? defaultValue : value.toDouble();
}

bool toBoolOrDefault(const QSqlQuery &query, const char *column, bool defaultValue)
{
const QVariant value = query.value(column);
return value.isNull() ? defaultValue : value.toInt() == 1;
}
}

// SQL schema as per documentation
static const QString SCHEMA_SQL = R"(
PRAGMA user_version = 1;
Expand Down Expand Up @@ -218,19 +246,19 @@ bool SqliteReader::readCaptureMetadata(int &captureId, QString &system, QString
decoder = query.value("decoder").toString();
gitBranch = query.value("git_branch").toString();
gitCommit = query.value("git_commit").toString();
videoSampleRate = query.value("video_sample_rate").toDouble();
activeVideoStart = query.value("active_video_start").toInt();
activeVideoEnd = query.value("active_video_end").toInt();
fieldWidth = query.value("field_width").toInt();
fieldHeight = query.value("field_height").toInt();
numberOfSequentialFields = query.value("number_of_sequential_fields").toInt();
colourBurstStart = query.value("colour_burst_start").toInt();
colourBurstEnd = query.value("colour_burst_end").toInt();
isMapped = query.value("is_mapped").toInt() == 1;
isSubcarrierLocked = query.value("is_subcarrier_locked").toInt() == 1;
isWidescreen = query.value("is_widescreen").toInt() == 1;
white16bIre = query.value("white_16b_ire").toInt();
black16bIre = query.value("black_16b_ire").toInt();
videoSampleRate = SqliteValue::toDoubleOrDefault(query, "video_sample_rate");
activeVideoStart = SqliteValue::toIntOrDefault(query, "active_video_start");
activeVideoEnd = SqliteValue::toIntOrDefault(query, "active_video_end");
fieldWidth = SqliteValue::toIntOrDefault(query, "field_width");
fieldHeight = SqliteValue::toIntOrDefault(query, "field_height");
numberOfSequentialFields = SqliteValue::toIntOrDefault(query, "number_of_sequential_fields");
colourBurstStart = SqliteValue::toIntOrDefault(query, "colour_burst_start");
colourBurstEnd = SqliteValue::toIntOrDefault(query, "colour_burst_end");
isMapped = SqliteValue::toBoolOrDefault(query, "is_mapped");
isSubcarrierLocked = SqliteValue::toBoolOrDefault(query, "is_subcarrier_locked");
isWidescreen = SqliteValue::toBoolOrDefault(query, "is_widescreen");
white16bIre = SqliteValue::toIntOrDefault(query, "white_16b_ire");
black16bIre = SqliteValue::toIntOrDefault(query, "black_16b_ire");
captureNotes = query.value("capture_notes").toString();

return true;
Expand All @@ -248,10 +276,10 @@ bool SqliteReader::readPcmAudioParameters(int captureId, int &bits, bool &isSign
return false;
}

bits = query.value("bits").toInt();
isSigned = query.value("is_signed").toInt() == 1;
isLittleEndian = query.value("is_little_endian").toInt() == 1;
sampleRate = query.value("sample_rate").toDouble();
bits = SqliteValue::toIntOrDefault(query, "bits");
isSigned = SqliteValue::toBoolOrDefault(query, "is_signed");
isLittleEndian = SqliteValue::toBoolOrDefault(query, "is_little_endian");
sampleRate = SqliteValue::toDoubleOrDefault(query, "sample_rate");

return true;
}
Expand Down
8 changes: 8 additions & 0 deletions tools/library/tbc/sqliteio.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@
#include <QVariant>
#include <stdexcept>

namespace SqliteValue
{
int toIntOrDefault(const QSqlQuery &query, const char *column, int defaultValue = -1);
qint64 toLongLongOrDefault(const QSqlQuery &query, const char *column, qint64 defaultValue = -1);
double toDoubleOrDefault(const QSqlQuery &query, const char *column, double defaultValue = -1.0);
bool toBoolOrDefault(const QSqlQuery &query, const char *column, bool defaultValue = false);
}

class SqliteReader
{
public:
Expand Down