9#include <QWaitCondition>
16#include <QRecursiveMutex>
17#include <QReadWriteLock>
22#include "libmythbase/mythconfig.h"
144 Q_DECLARE_TR_FUNCTIONS(
TVRec)
147 friend class TVRecRecordThread;
150 explicit
TVRec(
int _inputid);
151 ~
TVRec(
void) override;
155 void RecordPending(const
ProgramInfo *rcinfo,
std::chrono::seconds secsleft,
bool hasLater);
157 RecStatus::Type GetRecordingStatus(
void) const;
159 void StopRecording(
bool killFile =
false);
161 void FinishRecording(
void) { SetFlags(kFlagFinishRecording,
162 __FILE__, __LINE__); }
165 __FILE__, __LINE__); }
166 void CancelNextRecording(
bool cancel);
170 bool IsRunning(
void)
const {
return HasFlags(kFlagRunMainLoop); }
172 void Stop(
void) { ClearFlags(kFlagRunMainLoop, __FILE__, __LINE__); }
176 bool IsPlaying(
void) {
return StateIsPlaying(m_internalState); }
179 bool IsRecording(
void) {
return StateIsRecording(m_internalState); }
181 bool SetVideoFiltersForChannel(
uint sourceid,
const QString &channum);
183 bool IsBusy(
InputInfo *busy_input =
nullptr, std::chrono::seconds time_buffer = 5s)
const;
184 bool IsReallyRecording(
void);
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);
199 void SetLiveRecording(
int recording);
201 QString GetInput(
void)
const;
202 uint GetSourceID(
void)
const;
203 QString SetInput(QString input);
207 { SetChannel(QString(
"NextChannel %1").arg((
int)dir)); }
208 void SetChannel(
const QString& name,
uint requestType = kFlagDetect);
209 bool QueueEITChannelChange(
const QString &name);
211 std::chrono::milliseconds SetSignalMonitoringRate(std::chrono::milliseconds rate,
int notifyFrontend = 1);
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;
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);
238 bool IsErrored(
void)
const {
return HasFlags(kFlagErrored); }
241 void RecorderPaused(
void);
243 void SetNextLiveTVDir(QString dir);
249 void AllGood(
void)
override { WakeEventLoop(); }
253 void EnableActiveScan(
bool enable);
256 void run(
void)
override;
257 bool WaitForEventThreadSleep(
bool wake =
true,
258 std::chrono::milliseconds time = std::chrono::milliseconds::max());
263 void TeardownAll(
void);
264 void WakeEventLoop(
void);
266 static bool GetDevices(
uint inputid,
272 void TeardownRecorder(
uint request_flags);
275 bool CreateChannel(
const QString &startchannel,
276 bool enter_power_save_mode);
277 void CloseChannel(
void);
281 bool SetupSignalMonitor(
282 bool tablemon,
bool EITscan,
bool notify);
283 bool SetupDTVSignalMonitor(
bool EITscan);
284 void TeardownSignalMonitor(
void);
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);
292 void HandleTuning(
void);
300 void TuningRestartRecorder(
void);
301 QString TuningGetChanNum(
const TuningRequest &request, QString &input)
const;
304 void HandleStateChange(
void);
305 void ChangeState(
TVState nextState);
306 static bool StateIsRecording(
TVState state);
307 static bool StateIsPlaying(
TVState state);
311 void HandlePendingRecordings(
void);
313 bool WaitForNextLiveTVDir(
void);
315 const QString &channum);
316 bool CreateLiveTVRingBuffer(
const QString & channum);
317 bool SwitchLiveTVRingBuffer(
const QString & channum,
318 bool discont,
bool set_rec);
324 QDateTime GetRecordEndTime(
const ProgramInfo *pi)
const;
325 void CheckForRecGroupChange(
void);
331 void SetRecordingStatus(
344 bool m_signalEventCmdSent {
false};
348 uint m_signalMonitorCheckCnt {0};
349 bool m_reachedRecordingDeadline {
false};
351 bool m_reachedPreFail {
false};
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};
374 bool m_isPip {
false};
393 bool m_changeState {
false};
394 bool m_pauseNotify {
true};
402 bool m_triggerEventLoopSignal {
false};
405 bool m_triggerEventSleepSignal {
false};
406 volatile bool m_switchingBuffer {
false};
414 int m_overrecordseconds {0};
431 QString m_rbFileExt {
"ts"};
439 static constexpr std::chrono::milliseconds kSignalMonitoringRate { 50ms };
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;
451 static const uint kFlagLiveTV = 0x00000100;
453 static const uint kFlagRecording = 0x00000200;
455 static const uint kFlagAntennaAdjust = 0x00000400;
456 static const uint kFlagRec = 0x00000F00;
460 static const uint kFlagEITScan = 0x00001000;
462 static const uint kFlagCloseRec = 0x00002000;
464 static const uint kFlagKillRec = 0x00004000;
466 static const uint kFlagNoRec = 0x0000F000;
467 static const uint kFlagKillRingBuffer = 0x00010000;
470 static const uint kFlagWaitingForRecPause = 0x00100000;
471 static const uint kFlagWaitingForSignal = 0x00200000;
472 static const uint kFlagNeedToStartRecorder = 0x00800000;
473 static const uint kFlagPendingActions = 0x00F00000;
476 static const uint kFlagSignalMonitorRunning = 0x01000000;
477 static const uint kFlagEITScannerRunning = 0x04000000;
479 static const uint kFlagDummyRecorderRunning = 0x10000000;
480 static const uint kFlagRecorderRunning = 0x20000000;
481 static const uint kFlagAnyRecRunning = 0x30000000;
482 static const uint kFlagAnyRunning = 0x3F000000;
485 static const uint kFlagRingBufferReady = 0x40000000;
486 static const uint kFlagDetect = 0x80000000;
This is a specialization of DTVRecorder used to handle streams from ASI drivers.
Abstract class providing a generic interface to tuning hardware.
Class providing a generic interface to digital tuning hardware.
This is a specialization of RecorderBase used to handle MPEG-2, MPEG-4, MPEG-4 AVC,...
This class is intended to detect the presence of needed tables.
Provides interface to the tuning hardware when using DVB drivers.
std::chrono::milliseconds m_dvbTuningDelay
This is a specialization of DTVRecorder used to handle streams from DVB drivers.
Acts as glue between ChannelBase, EITSource and EITHelper.
FireWireDBOptions()=default
FirewireChannel Copyright (c) 2005 by Jim Westfall and Dave Abrahams Distributed as part of MythTV un...
GeneralDBOptions()=default
Keeps track of recordings in a current LiveTV instance.
Encapsulates data about MPEG stream and emits events for each table.
This is a wrapper around QThread that does several additional things.
std::vector< uint > m_possibleConflicts
QDateTime m_recordingStart
Holds information on recordings and videos.
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
This is the abstract base class for supporting recorder hardware.
Holds information on a TV Program one might wish to record.
Signal monitoring base class.
This is the coordinating class of the Recorder Subsystem.
TuningQueue m_tuningRequests
QHash< QString, int > m_autoRunJobs
uint GetFlags(void) const
void Stop(void)
Tells TVRec to stop event loop.
QDateTime m_signalEventCmdTimeout
void FrontendReady(void)
Tells TVRec that the frontend's TV class is ready for messages.
QMutex m_nextLiveTVDirLock
QDateTime m_recordEndTime
GeneralDBOptions m_genOpt
void StatusSignalStrength(const SignalMonitorValue &) override
Signal to be sent with an actual signal value.
QString m_liveTVStartChannel
QString m_overRecordCategory
bool IsRecording(void)
Returns "state == kState_RecordingRecordedOnly".
QWaitCondition m_triggerEventSleepWait
bool IsRunning(void) const
Returns true if event loop has not been told to shut down.
void StatusChannelTuned(const SignalMonitorValue &) override
Signal to be sent with change change status.
QRecursiveMutex m_pendingRecLock
void AllGood(void) override
Signal to be sent when you have a lock on all values.
QDateTime m_eitScanStopTime
QMutex m_triggerEventLoopLock
bool IsErrored(void) const
Returns true is "errored" is true, false otherwise.
QDateTime m_eitScanStartTime
uint GetParentId(void) const
QDateTime m_preFailDeadline
PendingMap m_pendingRecordings
FireWireDBOptions m_fwOpt
QWaitCondition m_triggerEventLoopWait
QWaitCondition m_triggerLiveTVDir
void ChangeChannel(ChannelChangeDirection dir)
Changes to a channel in the 'dir' channel change direction.
QDateTime m_startRecordingDeadline
static QReadWriteLock s_inputsLock
QRecursiveMutex m_stateChangeLock
QMutex m_triggerEventSleepLock
uint GetInputId(void) const
Returns the inputid.
QDateTime m_signalMonitorDeadline
static QMap< uint, TVRec * > s_inputs
bool IsPlaying(void)
Returns "state == kState_RecordingPreRecorded".
std::vector< uint > m_eitInputs
bool HasFlags(uint f) const
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 ...
bool IsOnSameMultiplex(void) const
TuningRequest(uint f, QString ch, QString in=QString())
RecordingInfo * m_program
QString toString(void) const
TuningRequest(uint f, RecordingInfo *p)
Implements tuning for TV cards using the V4L driver API, both versions 1 and 2.
void run(const QString &name, Class *object, void(Class::*fn)())
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
BrowseDirection
Used to request ProgramInfo for channel browsing.
ChannelChangeDirection
ChannelChangeDirection is an enumeration of possible channel changing directions.
TVState
TVState is an enumeration of the states used by TV and TVRec.
@ kState_None
None State, this is the initial state in both TV and TVRec, it indicates that we are ready to change ...
QMap< uint, PendingInfo > PendingMap
TuningRequest myth_deque_init(const TuningRequest *)