MythTV  master
recordingfile.cpp
Go to the documentation of this file.
1 
2 #include "recordingfile.h"
3 
4 #include "libmythbase/mythdb.h"
6 
8 {
9  if (m_recordingId == 0)
10  return false;
11 
13  query.prepare("SELECT "
14  "hostname, storagegroup, id, basename, filesize, "
15  "video_codec, width, height, aspect, fps, "
16  "audio_codec, audio_channels, audio_sample_rate, "
17  "audio_avg_bitrate, container "
18  "FROM recordedfile "
19  "WHERE recordedid = :RECORDEDID ");
20  query.bindValue(":RECORDEDID", m_recordingId);
21 
22  if (!query.exec())
23  {
24  MythDB::DBError("RecordingFile::Load()", query);
25  return false;
26  }
27 
28  if (query.next())
29  {
30  m_storageDeviceID = query.value(0).toString();
31  m_storageGroup = query.value(1).toString();
32 
33  m_fileId = query.value(2).toUInt();
34  m_fileName = query.value(3).toString();
35  m_fileSize = static_cast<uint64_t>(query.value(4).toLongLong());
36 
37  m_videoCodec = query.value(5).toString();
38  uint width = query.value(6).toUInt();
39  uint height = query.value(7).toUInt();
40  m_videoResolution = QSize(width, height);
41  m_videoAspectRatio = query.value(8).toFloat();
42  m_videoFrameRate = query.value(9).toFloat();
43 
44  m_audioCodec = query.value(10).toString();
45  m_audioChannels = query.value(11).toUInt();
46  m_audioSampleRate = query.value(12).toUInt();
47  m_audioBitrate = query.value(13).toUInt();
48 
49  m_containerFormat = AVContainerFromString(query.value(14).toString());
50  }
51 
52  return true;
53 }
54 
56 {
57  if (m_recordingId == 0)
58  return false;
59 
61 
62  if (m_fileId > 0)
63  {
64  query.prepare("UPDATE recordedfile "
65  "SET "
66  "basename = :FILENAME, "
67  "filesize = :FILESIZE, "
68  "width = :WIDTH, "
69  "height = :HEIGHT, "
70  "fps = :FRAMERATE, "
71  "aspect = :ASPECT_RATIO, "
72  "audio_sample_rate = :AUDIO_SAMPLERATE, "
73  "audio_avg_bitrate = :AUDIO_BITRATE, "
74  "audio_channels = :AUDIO_CHANNELS, "
75  "audio_codec = :AUDIO_CODEC, "
76  "video_codec = :VIDEO_CODEC, "
77  "hostname = :STORAGE_DEVICE, "
78  "storagegroup = :STORAGE_GROUP, "
79  "recordedid = :RECORDING_ID, "
80  "container = :CONTAINER "
81  "WHERE id = :FILE_ID ");
82  query.bindValue(":FILE_ID", m_fileId);
83  }
84  else
85  {
86  query.prepare("INSERT INTO recordedfile "
87  "SET "
88  "basename = :FILENAME, "
89  "filesize = :FILESIZE, "
90  "width = :WIDTH, "
91  "height = :HEIGHT, "
92  "fps = :FRAMERATE, "
93  "aspect = :ASPECT_RATIO, "
94  "audio_sample_rate = :AUDIO_SAMPLERATE, "
95  "audio_avg_bitrate = :AUDIO_BITRATE, "
96  "audio_channels = :AUDIO_CHANNELS, "
97  "audio_codec = :AUDIO_CODEC, "
98  "video_codec = :VIDEO_CODEC, "
99  "hostname = :STORAGE_DEVICE, "
100  "storagegroup = :STORAGE_GROUP, "
101  "recordedid = :RECORDING_ID, "
102  "container = :CONTAINER ");
103  }
104 
105  query.bindValueNoNull(":FILENAME", m_fileName);
106  query.bindValue(":FILESIZE", static_cast<quint64>(m_fileSize));
107  query.bindValue(":WIDTH", m_videoResolution.width());
108  query.bindValue(":HEIGHT", m_videoResolution.height());
109  query.bindValue(":FRAMERATE", m_videoFrameRate);
110  query.bindValue(":ASPECT_RATIO", m_videoAspectRatio);
111  query.bindValue(":AUDIO_SAMPLERATE", m_audioSampleRate);
112  query.bindValue(":AUDIO_BITRATE", m_audioBitrate);
113  query.bindValue(":AUDIO_CHANNELS", m_audioChannels);
114  query.bindValueNoNull(":AUDIO_CODEC", m_audioCodec);
115  query.bindValueNoNull(":VIDEO_CODEC", m_videoCodec);
116  query.bindValueNoNull(":STORAGE_DEVICE", m_storageDeviceID);
117  query.bindValueNoNull(":STORAGE_GROUP", m_storageGroup);
118  query.bindValue(":CONTAINER", AVContainerToString(m_containerFormat));
119  query.bindValue(":RECORDING_ID", m_recordingId);
120 
121  if (!query.exec())
122  {
123  MythDB::DBError("RecordingFile::Save()", query);
124  return false;
125  }
126 
127  if (m_fileId == 0)
128  m_fileId = query.lastInsertId().toUInt();
129 
130  return true;
131 }
132 
134 {
135  if (formatStr == "NUV")
136  return formatNUV;
137  if (formatStr == "MPEG2-TS")
138  return formatMPEG2_TS;
139  if (formatStr == "MPEG2-PS")
140  return formatMPEG2_PS;
141  return formatUnknown;
142 }
143 
145 {
146  switch (format)
147  {
148  case formatNUV :
149  return "NUV";
150  case formatMPEG2_TS :
151  return "MPEG2-TS";
152  case formatMPEG2_PS :
153  return "MPEG2-PS";
154  case formatUnknown:
155  default:
156  return "";
157  }
158 }
159 
160 
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:813
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:127
MSqlQuery::bindValueNoNull
void bindValueNoNull(const QString &placeholder, const QVariant &val)
Add a single binding, taking care not to set a NULL value.
Definition: mythdbcon.cpp:903
RecordingFile::m_audioCodec
QString m_audioCodec
Definition: recordingfile.h:54
formatUnknown
@ formatUnknown
Definition: recordingfile.h:14
mythdb.h
MSqlQuery::lastInsertId
QVariant lastInsertId()
Return the id of the last inserted row.
Definition: mythdbcon.cpp:936
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:204
mythdbcon.h
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:619
RecordingFile::AVContainerToString
static QString AVContainerToString(AVContainer format)
Definition: recordingfile.cpp:144
formatStr
QScriptValue formatStr(QScriptContext *context, QScriptEngine *interpreter)
Definition: serverSideScripting.cpp:31
RecordingFile::AVContainerFromString
static AVContainer AVContainerFromString(const QString &formatStr)
Definition: recordingfile.cpp:133
AVContainer
AVContainer
Definition: recordingfile.h:12
RecordingFile::m_videoResolution
QSize m_videoResolution
Definition: recordingfile.h:50
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:551
RecordingFile::Save
bool Save()
Definition: recordingfile.cpp:55
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
recordingfile.h
RecordingFile::m_containerFormat
AVContainer m_containerFormat
Definition: recordingfile.h:47
RecordingFile::m_fileId
uint m_fileId
Definition: recordingfile.h:43
uint
unsigned int uint
Definition: compat.h:81
RecordingFile::m_videoFrameRate
double m_videoFrameRate
Definition: recordingfile.h:52
RecordingFile::m_fileSize
uint64_t m_fileSize
Definition: recordingfile.h:45
RecordingFile::m_recordingId
uint m_recordingId
Definition: recordingfile.h:38
RecordingFile::m_videoCodec
QString m_videoCodec
Definition: recordingfile.h:49
formatNUV
@ formatNUV
Definition: recordingfile.h:15
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:889
RecordingFile::m_fileName
QString m_fileName
Definition: recordingfile.h:44
RecordingFile::m_audioSampleRate
double m_audioSampleRate
Definition: recordingfile.h:56
RecordingFile::m_videoAspectRatio
double m_videoAspectRatio
Definition: recordingfile.h:51
RecordingFile::m_audioBitrate
int m_audioBitrate
Definition: recordingfile.h:57
RecordingFile::Load
bool Load()
Definition: recordingfile.cpp:7
RecordingFile::m_storageGroup
QString m_storageGroup
Definition: recordingfile.h:41
formatMPEG2_PS
@ formatMPEG2_PS
Definition: recordingfile.h:17
formatMPEG2_TS
@ formatMPEG2_TS
Definition: recordingfile.h:16
RecordingFile::m_storageDeviceID
QString m_storageDeviceID
Definition: recordingfile.h:40
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:838
RecordingFile::m_audioChannels
int m_audioChannels
Definition: recordingfile.h:55