MythTV master
tv_rec.h
Go to the documentation of this file.
1#ifndef TVREC_H
2#define TVREC_H
3
4// C++ headers
5#include <utility>
6#include <vector> // for vector
7
8// Qt headers
9#include <QWaitCondition>
10#include <QStringList>
11#include <QDateTime>
12#include <QRunnable>
13#include <QString>
14#include <QMap>
15#include <QMutex> // for QMutex
16#include <QRecursiveMutex>
17#include <QReadWriteLock>
18#include <QHash> // for QHash
19
20// MythTV headers
21#include "libmythbase/mthread.h"
22#include "libmythbase/mythconfig.h"
25#include "libmythbase/programtypes.h" // for RecStatus, RecStatus::Type, etc
26
27#include "inputinfo.h"
28#include "mythtvexp.h" // for MTV_PUBLIC
29#include "recordinginfo.h"
31#include "tv.h"
32#include "videoouttypes.h" // for PictureAttribute
33
34// locking order
35// setChannelLock -> stateChangeLock -> triggerEventLoopLock
36// -> pendingRecLock
37
38class MythMediaBuffer;
39class EITScanner;
41class LiveTVChain;
42
43class RecorderBase;
44class DTVRecorder;
45class DVBRecorder;
46class HDHRRecorder;
47class ASIRecorder;
48class CetonRecorder;
49
50class SignalMonitor;
52
53class ChannelBase;
54class DTVChannel;
55class DVBChannel;
56class FirewireChannel;
57class V4LChannel;
58class HDHRChannel;
59class CetonChannel;
60
61class MPEGStreamData;
62class ProgramMapTable;
64
66{
67 public:
68 GeneralDBOptions()= default;
69
70 QString m_videoDev;
71 QString m_vbiDev;
72 QString m_audioDev;
73 QString m_inputType {"V4L"};
75 bool m_skipBtAudio {false};
78 bool m_waitForSeqstart {false};
79};
80
82{
83 public:
84 DVBDBOptions() = default;
85
86 bool m_dvbOnDemand {false};
87 std::chrono::milliseconds m_dvbTuningDelay {0ms};
88 bool m_dvbEitScan {true};
89};
90
92{
93 public:
94 FireWireDBOptions() = default;
95
96 int m_speed {-1};
97 int m_connection {-1};
98 QString m_model;
99};
100
102{
103 public:
104 explicit TuningRequest(uint f) :
105 m_flags(f) {;}
107 m_flags(f), m_program(p) {;}
108 TuningRequest(uint f, QString ch, QString in = QString()) :
109 m_flags(f), m_channel(std::move(ch)), m_input(std::move(in)) {;}
110
111 QString toString(void) const;
112
113 bool IsOnSameMultiplex(void) const { return m_minorChan || (m_progNum >= 0); }
114
115 public:
118 QString m_channel;
119 QString m_input;
122 int m_progNum {-1};
123};
125inline TuningRequest myth_deque_init(const TuningRequest */*request*/) { return (TuningRequest)(0); }
126
128{
129 public:
130 PendingInfo() = default;
131
132 ProgramInfo *m_info {nullptr};
134 bool m_hasLaterShowing {false};
135 bool m_canceled {false};
136 bool m_ask {false};
137 bool m_doNotAsk {false};
138 std::vector<uint> m_possibleConflicts;
139};
140using PendingMap = QMap<uint,PendingInfo>;
141
142class MTV_PUBLIC TVRec : public SignalMonitorListener, public QRunnable
143{
144 Q_DECLARE_TR_FUNCTIONS(TVRec)
145
146 friend class TuningRequest;
147 friend class TVRecRecordThread;
148
149 public:
150 explicit TVRec(int _inputid);
151 ~TVRec(void) override;
152
153 bool Init(void);
154
155 void RecordPending(const ProgramInfo *rcinfo, std::chrono::seconds secsleft, bool hasLater);
156 RecStatus::Type StartRecording(ProgramInfo *pginfo);
157 RecStatus::Type GetRecordingStatus(void) const;
158
159 void StopRecording(bool killFile = false);
161 void FinishRecording(void) { SetFlags(kFlagFinishRecording,
162 __FILE__, __LINE__); }
164 void FrontendReady(void) { SetFlags(kFlagFrontendReady,
165 __FILE__, __LINE__); }
166 void CancelNextRecording(bool cancel);
167 ProgramInfo *GetRecording(void);
168
170 bool IsRunning(void) const { return HasFlags(kFlagRunMainLoop); }
172 void Stop(void) { ClearFlags(kFlagRunMainLoop, __FILE__, __LINE__); }
173
174 TVState GetState(void) const;
176 bool IsPlaying(void) { return StateIsPlaying(m_internalState); }
179 bool IsRecording(void) { return StateIsRecording(m_internalState); }
180
181 bool SetVideoFiltersForChannel(uint sourceid, const QString &channum);
182
183 bool IsBusy(InputInfo *busy_input = nullptr, std::chrono::seconds time_buffer = 5s) const;
184 bool IsReallyRecording(void);
185
186 float GetFramerate(void);
187 long long GetFramesWritten(void);
188 long long GetFilePosition(void);
189 long long GetMaxBitrate(void) const;
190 int64_t GetKeyframePosition(uint64_t desired) const;
191 bool GetKeyframePositions(int64_t start, int64_t end, frm_pos_map_t &map) const;
192 bool GetKeyframeDurations(int64_t start, int64_t end, frm_pos_map_t &map) const;
193 void SpawnLiveTV(LiveTVChain *newchain, bool pip, QString startchan);
194 QString GetChainID(void);
195 void StopLiveTV(void);
196 void PauseRecorder(void);
197 void ToggleChannelFavorite(const QString &changroupname);
198
199 void SetLiveRecording(int recording);
200
201 QString GetInput(void) const;
202 uint GetSourceID(void) const;
203 QString SetInput(QString input);
204
207 { SetChannel(QString("NextChannel %1").arg((int)dir)); }
208 void SetChannel(const QString& name, uint requestType = kFlagDetect);
209 bool QueueEITChannelChange(const QString &name);
210
211 std::chrono::milliseconds SetSignalMonitoringRate(std::chrono::milliseconds rate, int notifyFrontend = 1);
212 int GetPictureAttribute(PictureAttribute attr);
213 int ChangePictureAttribute(PictureAdjustType type, PictureAttribute attr,
214 bool direction);
215 bool CheckChannel(const QString& name) const;
216 bool ShouldSwitchToAnotherInput(const QString& chanid) const;
217 bool CheckChannelPrefix(const QString &prefix, uint &complete_valid_channel_on_rec,
218 bool &is_extra_char_useful, QString &needed_spacer) const;
219 void GetNextProgram(BrowseDirection direction,
220 QString &title, QString &subtitle,
221 QString &desc, QString &category,
222 QString &starttime, QString &endtime,
223 QString &callsign, QString &iconpath,
224 QString &channum, uint &chanid,
225 QString &seriesid, QString &programid);
226 bool GetChannelInfo(uint &chanid, uint &sourceid,
227 QString &callsign, QString &channum,
228 QString &channame, QString &xmltvid) const;
229 bool SetChannelInfo(uint chanid, uint sourceid, const QString& oldchannum,
230 const QString& callsign, const QString& channum,
231 const QString& channame, const QString& xmltvid);
232
234 uint GetInputId(void) const { return m_inputId; }
235 uint GetParentId(void) const { return m_parentId; }
236 uint GetMajorId(void) { return m_parentId ? m_parentId : m_inputId; }
238 bool IsErrored(void) const { return HasFlags(kFlagErrored); }
239
240 void RingBufferChanged(MythMediaBuffer *Buffer, RecordingInfo *pginfo, RecordingQuality *recq);
241 void RecorderPaused(void);
242
243 void SetNextLiveTVDir(QString dir);
244
245 uint GetFlags(void) const { return m_stateFlags; }
246
247 static TVRec *GetTVRec(uint inputid);
248
249 void AllGood(void) override { WakeEventLoop(); } // SignalMonitorListener
250 void StatusChannelTuned(const SignalMonitorValue &/*val*/) override { } // SignalMonitorListener
251 void StatusSignalLock(const SignalMonitorValue &/*val*/) override { } // SignalMonitorListener
252 void StatusSignalStrength(const SignalMonitorValue &/*val*/) override { } // SignalMonitorListener
253 void EnableActiveScan(bool enable);
254
255 protected:
256 void run(void) override; // QRunnable
257 bool WaitForEventThreadSleep(bool wake = true,
258 std::chrono::milliseconds time = std::chrono::milliseconds::max());
259
260 private:
261 void SetRingBuffer(MythMediaBuffer* Buffer);
262 void SetPseudoLiveTVRecording(RecordingInfo *pi);
263 void TeardownAll(void);
264 void WakeEventLoop(void);
265
266 static bool GetDevices(uint inputid,
267 uint &parentid,
268 GeneralDBOptions &gen_opts,
269 DVBDBOptions &dvb_opts,
270 FireWireDBOptions &firewire_opts);
271
272 void TeardownRecorder(uint request_flags);
273 DTVRecorder *GetDTVRecorder(void);
274
275 bool CreateChannel(const QString &startchannel,
276 bool enter_power_save_mode);
277 void CloseChannel(void);
278 DTVChannel *GetDTVChannel(void);
279 V4LChannel *GetV4LChannel(void);
280
281 bool SetupSignalMonitor(
282 bool tablemon, bool EITscan, bool notify);
283 bool SetupDTVSignalMonitor(bool EITscan);
284 void TeardownSignalMonitor(void);
285 DTVSignalMonitor *GetDTVSignalMonitor(void);
286
287 bool HasFlags(uint f) const { return (m_stateFlags & f) == f; }
288 void SetFlags(uint f, const QString & file, int line);
289 void ClearFlags(uint f, const QString & file, int line);
290 static QString FlagToString(uint f);
291
292 void HandleTuning(void);
293 void TuningShutdowns(const TuningRequest &request);
294 void TuningFrequency(const TuningRequest &request);
295 MPEGStreamData *TuningSignalCheck(void);
296
297 void TuningNewRecorder(MPEGStreamData *streamData);
298 bool TuningNewRecorderReal(MPEGStreamData *streamData, RecordingInfo **rec,
299 RecordingProfile& profile, bool had_dummyrec);
300 void TuningRestartRecorder(void);
301 QString TuningGetChanNum(const TuningRequest &request, QString &input) const;
302 bool TuningOnSameMultiplex(TuningRequest &request);
303
304 void HandleStateChange(void);
305 void ChangeState(TVState nextState);
306 static bool StateIsRecording(TVState state);
307 static bool StateIsPlaying(TVState state);
308 TVState RemovePlaying(TVState state) const;
309 TVState RemoveRecording(TVState state) const;
310
311 void HandlePendingRecordings(void);
312
313 bool WaitForNextLiveTVDir(void);
314 bool GetProgramRingBufferForLiveTV(RecordingInfo **pginfo, MythMediaBuffer **Buffer,
315 const QString &channum);
316 bool CreateLiveTVRingBuffer(const QString & channum);
317 bool SwitchLiveTVRingBuffer(const QString & channum,
318 bool discont, bool set_rec);
319
320 RecordingInfo *SwitchRecordingRingBuffer(const RecordingInfo &rcinfo);
321
322 void StartedRecording(RecordingInfo *curRec);
323 void FinishedRecording(RecordingInfo *curRec, RecordingQuality *recq);
324 QDateTime GetRecordEndTime(const ProgramInfo *pi) const;
325 void CheckForRecGroupChange(void);
326 void NotifySchedulerOfRecording(RecordingInfo *rec);
327 enum AutoRunInitType { kAutoRunProfile, kAutoRunNone, };
328 void InitAutoRunJobs(RecordingInfo *rec, AutoRunInitType t,
329 RecordingProfile *recpro, int line);
330
331 void SetRecordingStatus(
332 RecStatus::Type new_status, int line, bool have_lock = false);
333
334 QString LoadProfile(void *tvchain, RecordingInfo *rec,
336
337 // Various components TVRec coordinates
338 RecorderBase *m_recorder {nullptr};
339 ChannelBase *m_channel {nullptr};
340 SignalMonitor *m_signalMonitor {nullptr};
341 EITScanner *m_scanner {nullptr};
342
344 bool m_signalEventCmdSent {false};
345
348 uint m_signalMonitorCheckCnt {0};
349 bool m_reachedRecordingDeadline {false};
351 bool m_reachedPreFail {false};
352
353 // Various threads
355 MThread *m_eventThread {nullptr};
357 MThread *m_recorderThread {nullptr};
358
359 // Configuration variables from database
360 bool m_transcodeFirst {false};
361 bool m_earlyCommFlag {false};
362 bool m_runJobOnHostOnly {false};
363 std::chrono::seconds m_eitCrawlIdleStart {1min};
364 std::chrono::seconds m_eitTransportTimeout {5min};
365 std::chrono::seconds m_eitScanPeriod {15min};
366 int m_audioSampleRateDB {0};
367 std::chrono::seconds m_overRecordSecNrml {0s};
368 std::chrono::seconds m_overRecordSecCat {0s};
370
371 // Configuration variables from setup routines
373 uint m_parentId {0};
374 bool m_isPip {false};
375
376 // Configuration variables for EIT on conflicting inputs
377 static QMutex s_eitLock;
378 std::vector<uint> m_eitInputs;
379
380 // Configuration variables from database, based on inputid
384
386
387 // State variables
388 mutable QMutex m_setChannelLock;
389 mutable QRecursiveMutex m_stateChangeLock;
390 mutable QRecursiveMutex m_pendingRecLock;
391 TVState m_internalState {kState_None};
392 TVState m_desiredNextState {kState_None};
393 bool m_changeState {false};
394 bool m_pauseNotify {true};
395 uint m_stateFlags {0};
397 TuningRequest m_lastTuningRequest {0};
402 bool m_triggerEventLoopSignal {false};
405 bool m_triggerEventSleepSignal {false};
406 volatile bool m_switchingBuffer {false};
408
409 // Current recording info
410 RecordingInfo *m_curRecording {nullptr};
412 // RecordingInfo::MakeUniqueKey()->autoRun
413 QHash<QString,int> m_autoRunJobs;
414 int m_overrecordseconds {0};
415
416 // Pending recording info
418
419 // Pseudo LiveTV recording
420 RecordingInfo *m_pseudoLiveTVRecording {nullptr};
423 QWaitCondition m_triggerLiveTVDir;
425
426 // LiveTV file chain
427 LiveTVChain *m_tvChain {nullptr};
428
429 // RingBuffer info
430 MythMediaBuffer *m_buffer {nullptr};
431 QString m_rbFileExt {"ts"};
432
433 public:
434 static QReadWriteLock s_inputsLock;
435 static QMap<uint,TVRec*> s_inputs;
436
437 public:
439 static constexpr std::chrono::milliseconds kSignalMonitoringRate { 50ms };
440
441 // General State flags
442 static const uint kFlagFrontendReady = 0x00000001;
443 static const uint kFlagRunMainLoop = 0x00000002;
444 static const uint kFlagExitPlayer = 0x00000004;
445 static const uint kFlagFinishRecording = 0x00000008;
446 static const uint kFlagErrored = 0x00000010;
447 static const uint kFlagCancelNextRecording = 0x00000020;
448
449 // Tuning flags
451 static const uint kFlagLiveTV = 0x00000100;
453 static const uint kFlagRecording = 0x00000200;
455 static const uint kFlagAntennaAdjust = 0x00000400;
456 static const uint kFlagRec = 0x00000F00;
457
458 // Non-recording Commands
460 static const uint kFlagEITScan = 0x00001000;
462 static const uint kFlagCloseRec = 0x00002000;
464 static const uint kFlagKillRec = 0x00004000;
465
466 static const uint kFlagNoRec = 0x0000F000;
467 static const uint kFlagKillRingBuffer = 0x00010000;
468
469 // Waiting stuff
470 static const uint kFlagWaitingForRecPause = 0x00100000;
471 static const uint kFlagWaitingForSignal = 0x00200000;
472 static const uint kFlagNeedToStartRecorder = 0x00800000;
473 static const uint kFlagPendingActions = 0x00F00000;
474
475 // Running stuff
476 static const uint kFlagSignalMonitorRunning = 0x01000000;
477 static const uint kFlagEITScannerRunning = 0x04000000;
478
479 static const uint kFlagDummyRecorderRunning = 0x10000000;
480 static const uint kFlagRecorderRunning = 0x20000000;
481 static const uint kFlagAnyRecRunning = 0x30000000;
482 static const uint kFlagAnyRunning = 0x3F000000;
483
484 // Tuning state
485 static const uint kFlagRingBufferReady = 0x40000000;
486 static const uint kFlagDetect = 0x80000000;
487};
488
489#endif
#define GetState(a, b)
This is a specialization of DTVRecorder used to handle streams from ASI drivers.
Definition: asirecorder.h:56
Abstract class providing a generic interface to tuning hardware.
Definition: channelbase.h:32
Class providing a generic interface to digital tuning hardware.
Definition: dtvchannel.h:34
This is a specialization of RecorderBase used to handle MPEG-2, MPEG-4, MPEG-4 AVC,...
Definition: dtvrecorder.h:35
This class is intended to detect the presence of needed tables.
Provides interface to the tuning hardware when using DVB drivers.
Definition: dvbchannel.h:31
bool m_dvbOnDemand
Definition: tv_rec.h:86
DVBDBOptions()=default
std::chrono::milliseconds m_dvbTuningDelay
Definition: tv_rec.h:87
bool m_dvbEitScan
Definition: tv_rec.h:88
This is a specialization of DTVRecorder used to handle streams from DVB drivers.
Definition: dvbrecorder.h:22
Acts as glue between ChannelBase, EITSource and EITHelper.
Definition: eitscanner.h:29
QString m_model
Definition: tv_rec.h:98
int m_connection
Definition: tv_rec.h:97
FireWireDBOptions()=default
FirewireChannel Copyright (c) 2005 by Jim Westfall and Dave Abrahams Distributed as part of MythTV un...
bool m_skipBtAudio
Definition: tv_rec.h:75
QString m_inputType
Definition: tv_rec.h:73
int m_audioSampleRate
Definition: tv_rec.h:74
GeneralDBOptions()=default
bool m_waitForSeqstart
Definition: tv_rec.h:78
QString m_vbiDev
Definition: tv_rec.h:71
uint m_channelTimeout
Definition: tv_rec.h:77
QString m_videoDev
Definition: tv_rec.h:70
QString m_audioDev
Definition: tv_rec.h:72
uint m_signalTimeout
Definition: tv_rec.h:76
Keeps track of recordings in a current LiveTV instance.
Definition: livetvchain.h:33
Encapsulates data about MPEG stream and emits events for each table.
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
std::vector< uint > m_possibleConflicts
Definition: tv_rec.h:138
ProgramInfo * m_info
Definition: tv_rec.h:132
bool m_hasLaterShowing
Definition: tv_rec.h:134
PendingInfo()=default
QDateTime m_recordingStart
Definition: tv_rec.h:133
bool m_doNotAsk
Definition: tv_rec.h:137
bool m_canceled
Definition: tv_rec.h:135
bool m_ask
Definition: tv_rec.h:136
Holds information on recordings and videos.
Definition: programinfo.h:68
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
Definition: mpegtables.h:676
This is the abstract base class for supporting recorder hardware.
Definition: recorderbase.h:50
Holds information on a TV Program one might wish to record.
Definition: recordinginfo.h:36
Signal monitoring base class.
Definition: signalmonitor.h:31
This is the coordinating class of the Recorder Subsystem.
Definition: tv_rec.h:143
TuningQueue m_tuningRequests
Definition: tv_rec.h:396
QHash< QString, int > m_autoRunJobs
Definition: tv_rec.h:413
uint GetFlags(void) const
Definition: tv_rec.h:245
void Stop(void)
Tells TVRec to stop event loop.
Definition: tv_rec.h:172
QDateTime m_signalEventCmdTimeout
Definition: tv_rec.h:343
static QMutex s_eitLock
Definition: tv_rec.h:377
void FrontendReady(void)
Tells TVRec that the frontend's TV class is ready for messages.
Definition: tv_rec.h:164
QMutex m_nextLiveTVDirLock
Definition: tv_rec.h:422
QDateTime m_recordEndTime
Definition: tv_rec.h:411
GeneralDBOptions m_genOpt
Definition: tv_rec.h:381
void StatusSignalStrength(const SignalMonitorValue &) override
Signal to be sent with an actual signal value.
Definition: tv_rec.h:252
QMutex m_setChannelLock
Definition: tv_rec.h:388
QString m_nextLiveTVDir
Definition: tv_rec.h:421
DVBDBOptions m_dvbOpt
Definition: tv_rec.h:382
QString m_liveTVStartChannel
Definition: tv_rec.h:424
QString m_overRecordCategory
Definition: tv_rec.h:369
bool IsRecording(void)
Returns "state == kState_RecordingRecordedOnly".
Definition: tv_rec.h:179
QWaitCondition m_triggerEventSleepWait
Definition: tv_rec.h:404
uint m_inputId
Definition: tv_rec.h:372
QString m_recProfileName
Definition: tv_rec.h:385
bool IsRunning(void) const
Returns true if event loop has not been told to shut down.
Definition: tv_rec.h:170
void StatusChannelTuned(const SignalMonitorValue &) override
Signal to be sent with change change status.
Definition: tv_rec.h:250
QRecursiveMutex m_pendingRecLock
Definition: tv_rec.h:390
void AllGood(void) override
Signal to be sent when you have a lock on all values.
Definition: tv_rec.h:249
QDateTime m_eitScanStopTime
Definition: tv_rec.h:399
QMutex m_triggerEventLoopLock
Definition: tv_rec.h:400
bool IsErrored(void) const
Returns true is "errored" is true, false otherwise.
Definition: tv_rec.h:238
QDateTime m_eitScanStartTime
Definition: tv_rec.h:398
uint GetParentId(void) const
Definition: tv_rec.h:235
AutoRunInitType
Definition: tv_rec.h:327
QDateTime m_preFailDeadline
Definition: tv_rec.h:350
PendingMap m_pendingRecordings
Definition: tv_rec.h:417
FireWireDBOptions m_fwOpt
Definition: tv_rec.h:383
QWaitCondition m_triggerEventLoopWait
Definition: tv_rec.h:401
QWaitCondition m_triggerLiveTVDir
Definition: tv_rec.h:423
void ChangeChannel(ChannelChangeDirection dir)
Changes to a channel in the 'dir' channel change direction.
Definition: tv_rec.h:206
QDateTime m_startRecordingDeadline
Definition: tv_rec.h:346
static QReadWriteLock s_inputsLock
Definition: tv_rec.h:434
QRecursiveMutex m_stateChangeLock
Definition: tv_rec.h:389
uint GetMajorId(void)
Definition: tv_rec.h:236
QMutex m_triggerEventSleepLock
Definition: tv_rec.h:403
uint GetInputId(void) const
Returns the inputid.
Definition: tv_rec.h:234
QDateTime m_signalMonitorDeadline
Definition: tv_rec.h:347
static QMap< uint, TVRec * > s_inputs
Definition: tv_rec.h:435
bool IsPlaying(void)
Returns "state == kState_RecordingPreRecorded".
Definition: tv_rec.h:176
std::vector< uint > m_eitInputs
Definition: tv_rec.h:378
bool HasFlags(uint f) const
Definition: tv_rec.h:287
void StatusSignalLock(const SignalMonitorValue &) override
Signal to be sent as true when it is safe to begin or continue recording, and false if it may not be ...
Definition: tv_rec.h:251
int m_progNum
Definition: tv_rec.h:122
bool IsOnSameMultiplex(void) const
Definition: tv_rec.h:113
uint m_minorChan
Definition: tv_rec.h:121
TuningRequest(uint f, QString ch, QString in=QString())
Definition: tv_rec.h:108
uint m_flags
Definition: tv_rec.h:116
RecordingInfo * m_program
Definition: tv_rec.h:117
uint m_majorChan
Definition: tv_rec.h:120
TuningRequest(uint f)
Definition: tv_rec.h:104
QString toString(void) const
Definition: tv_rec.cpp:4940
TuningRequest(uint f, RecordingInfo *p)
Definition: tv_rec.h:106
QString m_channel
Definition: tv_rec.h:118
QString m_input
Definition: tv_rec.h:119
Implements tuning for TV cards using the V4L driver API, both versions 1 and 2.
Definition: v4lchannel.h:32
unsigned int uint
Definition: freesurround.h:24
#define MTV_PUBLIC
Definition: mythtvexp.h:15
void run(const QString &name, Class *object, void(Class::*fn)())
Definition: mconcurrent.h:137
STL namespace.
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
Definition: programtypes.h:44
BrowseDirection
Used to request ProgramInfo for channel browsing.
Definition: tv.h:41
PictureAdjustType
Definition: tv.h:124
ChannelChangeDirection
ChannelChangeDirection is an enumeration of possible channel changing directions.
Definition: tv.h:32
TVState
TVState is an enumeration of the states used by TV and TVRec.
Definition: tv.h:54
@ kState_None
None State, this is the initial state in both TV and TVRec, it indicates that we are ready to change ...
Definition: tv.h:61
QMap< uint, PendingInfo > PendingMap
Definition: tv_rec.h:140
TuningRequest myth_deque_init(const TuningRequest *)
Definition: tv_rec.h:125
VERBOSE_PREAMBLE false
Definition: verbosedefs.h:89
PictureAttribute