MythTV master
mythplayercaptionsui.cpp
Go to the documentation of this file.
1// MythTV
2#include "libmythbase/mythconfig.h"
5
7#include "livetvchain.h"
10#include "tv_play.h"
11
12#define LOC QString("PlayerCaptions: ")
13
15 : MythPlayerAudioUI(MainWindow, Tv, Context, Flags),
16 m_captionsOverlay(MainWindow, Tv, nullptr, m_painter)
17{
18 // Register state type for signalling
19 qRegisterMetaType<MythCaptionsState>();
20
21 m_itvEnabled = gCoreContext->GetBoolSetting("EnableMHEG", false);
22
23 // Connect outgoing
25
26 // Inbound connections
46
47 // Signalled connections (from MHIContext)
51
52 // Signalled from the decoder
53 connect(this, &MythPlayerCaptionsUI::EnableSubtitles, this, [this](bool Enable) { this->SetCaptionsEnabled(Enable, false); });
54
55 // Signalled from the base class
57}
58
60{
61 delete m_interactiveTV;
62}
63
65{
66 LOG(VB_GENERAL, LOG_INFO, LOC + "Initialising captions");
70}
71
73{
75 bool inprogress = (m_playerCtx->GetState() == kState_WatchingRecording ||
79}
80
82{
85}
86
88{
90 return;
91
92 if (auto * subs = m_captionsOverlay.InitSubtitles(); subs)
93 {
94 auto newval = std::clamp(subs->GetZoom() + Delta, 50, 200);
95 UpdateOSDStatus(tr("Adjust Subtitle Zoom"), tr("Subtitle Zoom"),
96 QString::number(newval), kOSDFunctionalType_SubtitleZoomAdjust,
97 "%", newval * 1000 / 200, kOSDTimeout_None);
99 subs->SetZoom(newval);
100 }
101}
102
103void MythPlayerCaptionsUI::AdjustSubtitleDelay(std::chrono::milliseconds Delta)
104{
107 if (!showing || (m_browsing || m_editing))
108 return;
109
110 if (auto * subs = m_captionsOverlay.InitSubtitles(); subs)
111 {
112 auto newval = std::clamp(subs->GetDelay() + (Delta * 10), -5000ms, 5000ms);
113 // range of -5000ms..+5000ms, scale to 0..1000
114 UpdateOSDStatus(tr("Adjust Subtitle Delay"), tr("Subtitle Delay"),
115 QString::number(newval.count()), kOSDFunctionalType_SubtitleDelayAdjust,
116 "ms", (newval.count() / 10) + 500, kOSDTimeout_None);
118 subs->SetDelay(newval);
119 }
120
121}
122
124{
127}
128
130{
131 if (kTrackTypeCC608 == Type) return kDisplayCC608;
132 if (kTrackTypeCC708 == Type) return kDisplayCC708;
133 if (kTrackTypeSubtitle == Type) return kDisplayAVSubtitle;
136 if (kTrackTypeRawText == Type) return kDisplayRawTextSubtitle;
137 return 0;
138}
139
141{
142 if (kDisplayCC608 == Type) return kTrackTypeCC608;
143 if (kDisplayCC708 == Type) return kTrackTypeCC708;
144 if (kDisplayAVSubtitle == Type) return kTrackTypeSubtitle;
147 if (kDisplayRawTextSubtitle == Type) return kTrackTypeRawText;
148 return kTrackTypeUnknown;
149}
150
152{
153 auto oldcaptions = m_captionsState.m_textDisplayMode;
157 if (oldcaptions != m_captionsState.m_textDisplayMode)
160
161 QMutexLocker locker(&m_osdLock);
162
163 bool newTextDesired = (m_captionsState.m_textDisplayMode & kDisplayAllTextCaptions) != 0U;
164 // Only turn off textDesired if the Operator requested it.
165 if (UpdateOSD || newTextDesired)
166 m_textDesired = newTextDesired;
167
168 auto msg = (kDisplayNUVTeletextCaptions & Mode) ? tr("TXT CAP") : "";
170 {
171 if (auto track = GetTrack(kTrackTypeTeletextCaptions); (track > 1) && (m_decoder != nullptr))
172 msg += m_decoder->GetTrackDesc(kTrackTypeTeletextCaptions, static_cast<uint>(track));
174 }
178 if ((kDisplayCC608 & Mode) || (kDisplayCC708 & Mode) ||
180 {
181 if (uint type = toTrackType(Mode); m_decoder != nullptr)
182 if (auto track = GetTrack(type); track > -1)
183 msg += m_decoder->GetTrackDesc(type, static_cast<uint>(track));
184
186 }
187
189 {
190 msg += tr("Text subtitles");
192 }
193
194 if (!msg.isEmpty() && UpdateOSD)
195 {
196 msg += " " + tr("Off");
198 }
199}
200
202{
203 QMutexLocker locker(&m_osdLock);
204 bool newTextDesired = (Mode & kDisplayAllTextCaptions) != 0U;
205 // Only turn off textDesired if the Operator requested it.
206 if (UpdateOSD || newTextDesired)
207 m_textDesired = newTextDesired;
208 QString msg;
209 if ((kDisplayCC608 & Mode) || (kDisplayCC708 & Mode) ||
211 {
212 if (auto type = toTrackType(Mode); m_decoder != nullptr)
213 if (auto track = GetTrack(type); track > -1)
214 msg += m_decoder->GetTrackDesc(type, static_cast<uint>(track));
215
216 m_captionsOverlay.EnableSubtitles(static_cast<int>(Mode));
217 }
218
220 {
223 subs->m_needSync = true;
224 msg += tr("Text subtitles");
225 }
226
228 msg += tr("TXT %1").arg(m_ttPageNum, 3, 16);
229
230 if ((kDisplayTeletextCaptions & Mode) && (m_decoder != nullptr))
231 {
234
237
238 EnableTeletext(page);
239 }
240
241 msg += " " + tr("On");
242 LOG(VB_PLAYBACK, LOG_INFO, QString("EnableCaptions(%1) msg: %2").arg(Mode).arg(msg));
243
244 auto oldcaptions = m_captionsState.m_textDisplayMode;
248 if (oldcaptions != m_captionsState.m_textDisplayMode)
250 if (UpdateOSD)
252}
253
258{
260 SetCaptionsEnabled(true, false);
261}
262
264{
266 UpdateOSDMessage(m_allowForcedSubtitles ? tr("Forced Subtitles On") : tr("Forced Subtitles Off"));
267}
268
270{
272}
273
275{
276 QMutexLocker locker(&m_osdLock);
277 auto mode = toCaptionType(Type);
278 auto origmode = m_captionsState.m_textDisplayMode;
280 DisableCaptions(m_captionsState.m_textDisplayMode, (origmode & mode) != 0U);
281 if (origmode & mode)
282 return;
283 if (mode)
284 EnableCaptions(mode);
285}
286
287void MythPlayerCaptionsUI::SetCaptionsEnabled(bool Enable, bool UpdateOSD)
288{
289 QMutexLocker locker(&m_osdLock);
290 auto origmode = m_captionsState.m_textDisplayMode;
291
292 // Only turn off textDesired if the Operator requested it.
293 if (UpdateOSD || Enable)
294 m_textDesired = Enable;
295
296 if (!Enable)
297 {
298 DisableCaptions(origmode, UpdateOSD);
299 return;
300 }
301
304 {
305 DisableCaptions(origmode, false);
306 if (kDisplayNone == mode)
307 {
308 if (UpdateOSD)
309 UpdateOSDMessage(tr("No captions", "CC/Teletext/Subtitle text not available"), kOSDTimeout_Med);
310 LOG(VB_PLAYBACK, LOG_INFO, "No captions available yet to enable.");
311 }
312 else
313 {
314 EnableCaptions(mode, UpdateOSD);
315 }
316 }
317}
318
320{
321 if (m_decoder)
322 return m_decoder->GetTracks(Type);
323 return {};
324}
325
327{
328 if (m_decoder)
329 return m_decoder->GetTrackCount(Type);
330 return 0;
331}
332
334{
335 if (!m_decoder)
336 return;
337
338 m_decoder->SetTrack(Type, static_cast<int>(TrackNo));
339 if (kTrackTypeAudio == Type)
340 {
342 }
343 else if (auto subtype = toCaptionType(Type); subtype)
344 {
346 EnableCaptions(subtype, true);
347 if ((kDisplayCC708 == subtype || kDisplayCC608 == subtype) && m_decoder)
348 if (auto sid = m_decoder->GetTrackInfo(Type, TrackNo).m_stream_id; sid > 0)
349 (kDisplayCC708 == subtype) ? m_cc708.SetCurrentService(sid) : m_cc608.SetMode(sid);
350 }
351}
352
354{
356 m_osdLock.lock();
358 m_osdLock.unlock();
359}
360
362{
365 return;
366
367 m_osdLock.lock();
369 m_osdLock.unlock();
370}
371
373{
374 if (m_decoder)
375 return m_decoder->GetTrack(Type);
376 return -1;
377}
378
380{
381 if (!m_decoder)
382 return;
383 if (auto ret = m_decoder->ChangeTrack(Type, Direction); ret >= 0)
385}
386
388{
389 if (!m_decoder || (Direction < 0))
390 return;
391
395 {
397 if (GetTrack(tracktype) < m_decoder->NextTrack(tracktype))
398 {
399 SetTrack(tracktype, static_cast<uint>(m_decoder->NextTrack(tracktype)));
400 return;
401 }
402 }
404 if ((nextmode == kDisplayTextSubtitle) || (nextmode == kDisplayNUVTeletextCaptions) ||
405 (nextmode == kDisplayNone))
406 {
408 if (nextmode != kDisplayNone)
409 EnableCaptions(nextmode, true);
410 }
411 else
412 {
413 uint tracktype = toTrackType(nextmode);
414 uint tracks = m_decoder->GetTrackCount(tracktype);
415 if (tracks)
416 {
418 SetTrack(tracktype, 0);
419 }
420 }
421}
422
424{
425 if (Mode == kDisplayNone)
426 return false;
428 return true;
429 // External subtitles are now decoded with FFmpeg and are AVSubtitles.
431 return true;
433 return true;
434 return false;
435}
436
438{
439 // Text->TextStream->708->608->AVSubs->Teletext->NUV->None
440 // NUV only offerred if PAL
441 bool pal = (m_vbiMode == VBIMode::PAL_TT);
442 uint nextmode = kDisplayNone;
443
445 nextmode = kDisplayRawTextSubtitle;
446 else if (kDisplayRawTextSubtitle == Mode)
447 nextmode = kDisplayCC708;
448 else if (kDisplayCC708 == Mode)
449 nextmode = kDisplayCC608;
450 else if (kDisplayCC608 == Mode)
451 nextmode = kDisplayAVSubtitle;
452 else if (kDisplayAVSubtitle == Mode)
453 nextmode = kDisplayTeletextCaptions;
454 else if (kDisplayTeletextCaptions == Mode)
455 nextmode = pal ? kDisplayNUVTeletextCaptions : kDisplayNone;
456 else if ((kDisplayNUVTeletextCaptions == Mode) && pal)
457 nextmode = kDisplayNone;
458 else if (kDisplayNone == Mode)
459 nextmode = kDisplayTextSubtitle;
460
461 if (nextmode == kDisplayNone || HasCaptionTrack(nextmode))
462 return nextmode;
463
464 return NextCaptionTrack(nextmode);
465}
466
468{
469 QMutexLocker locker(&m_osdLock);
470 auto oldcaptions = m_captionsState.m_textDisplayMode;
474 if (oldcaptions != m_captionsState.m_textDisplayMode)
476}
477
479{
480 QMutexLocker locker(&m_osdLock);
482 auto oldcaptions = m_captionsState.m_textDisplayMode;
484 if (oldcaptions != m_captionsState.m_textDisplayMode)
486
487 // If subtitles were enabled before the teletext menu was displayed then re-enable them
490}
491
493{
494 QMutexLocker locker(&m_osdLock);
496}
497
501{
502 m_osdLock.lock();
504 auto oldcaptions = m_captionsState.m_textDisplayMode;
505 m_ttPageNum = static_cast<int>(Page);
507 m_captionsState.m_textDisplayMode &= static_cast<uint>(~kDisplayAllCaptions);
509 if (oldcaptions != m_captionsState.m_textDisplayMode)
511 m_osdLock.unlock();
512}
513
514void MythPlayerCaptionsUI::HandleTeletextAction(const QString& Action, bool &Handled)
515{
517 return;
518
519 bool exit = false;
520 m_osdLock.lock();
521 Handled = m_captionsOverlay.TeletextAction(Action, exit);
522 m_osdLock.unlock();
523 if (exit)
525}
526
528{
529#if CONFIG_MHEG
530 bool update = false;
531 {
532 QMutexLocker lock1(&m_osdLock);
533 QMutexLocker lock2(&m_itvLock);
535 {
536 m_interactiveTV = new InteractiveTV(this);
538 update = true;
539 }
540 }
541 if (update)
543#endif
544 return m_interactiveTV;
545}
546
554void MythPlayerCaptionsUI::ITVHandleAction([[maybe_unused]] const QString &Action,
555 [[maybe_unused]] bool& Handled)
556{
557#if CONFIG_MHEG
558 if (!GetInteractiveTV())
559 {
560 Handled = false;
561 return;
562 }
563
564 QMutexLocker locker(&m_itvLock);
565 Handled = m_interactiveTV->OfferKey(Action);
566#endif
567}
568
570void MythPlayerCaptionsUI::ITVRestart([[maybe_unused]] uint Chanid,
571 [[maybe_unused]] uint Cardid,
572 [[maybe_unused]] bool IsLiveTV)
573{
574#if CONFIG_MHEG
575 if (!GetInteractiveTV())
576 return;
577
578 QMutexLocker locker(&m_itvLock);
579 m_interactiveTV->Restart(static_cast<int>(Chanid), static_cast<int>(Cardid), IsLiveTV);
580 m_itvVisible = false;
581#endif
582}
583
592{
593 QMutexLocker locker(&m_decoderChangeLock);
594 if (m_decoder)
596 return false;
597}
598
604{
605 QMutexLocker locker(&m_decoderChangeLock);
606 if (m_decoder)
608 return false;
609}
610
612{
613 QMutexLocker locker(&m_decoderChangeLock);
614 if (!m_decoder)
615 return 25;
616 double fps = m_decoder->GetFPS();
617 return fps > 0 ? fps : 25.0;
618}
619
620void MythPlayerCaptionsUI::SetStream(const QString& Stream)
621{
622 // The stream name is empty if the stream is closing
623 LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("SetStream '%1'").arg(Stream));
624
625 // Stream will be changed by JumpToStream called from EventLoop
626 // If successful will call m_interactiveTV->StreamStarted();
627 m_newStream = Stream;
628
629 if (Stream.isEmpty() && m_playerCtx->m_tvchain && m_playerCtx->m_buffer->GetType() == kMythBufferMHEG)
630 {
631 // Restore livetv
633 m_playerCtx->m_tvchain->JumpToNext(false, 0s);
634 m_playerCtx->m_tvchain->JumpToNext(true, 0s);
635 }
636}
637
638// Called from the interactiveTV (MHIContext) thread
639std::chrono::milliseconds MythPlayerCaptionsUI::GetStreamPos()
640{
641 return millisecondsFromFloat((1000 * GetFramesPlayed()) / SafeFPS());
642}
643
644// Called from the interactiveTV (MHIContext) thread
645std::chrono::milliseconds MythPlayerCaptionsUI::GetStreamMaxPos()
646{
647 std::chrono::seconds maxsecs = m_totalDuration > 0s ? m_totalDuration : m_totalLength;
648 auto maxpos = duration_cast<std::chrono::milliseconds>(maxsecs);
649 auto pos = GetStreamPos();
650 return maxpos > pos ? maxpos : pos;
651}
652
653void MythPlayerCaptionsUI::SetStreamPos(std::chrono::milliseconds Position)
654{
655 auto frameNum = static_cast<uint64_t>((Position.count() * SafeFPS()) / 1000);
656 LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("SetStreamPos %1 mS = frame %2, now=%3")
657 .arg(Position.count()).arg(frameNum).arg(GetFramesPlayed()) );
658 JumpToFrame(frameNum);
659}
660
662{
663 if (Playing)
664 Play();
665 else
666 Pause();
667}
An action (for this plugin) consists of a description, and a set of key sequences.
Definition: action.h:41
void SetTTPageNum(int page)
Definition: cc608reader.h:84
void SetMode(int mode)
void SetCurrentService(int service)
Definition: cc708reader.h:21
virtual uint GetTrackCount(uint Type)
int ChangeTrack(uint Type, int Dir)
virtual QString GetTrackDesc(uint Type, uint TrackNo)
virtual int SetTrack(uint Type, int TrackNo)
int GetTrack(uint Type)
virtual bool SetAudioByComponentTag(int)
Definition: decoderbase.h:245
virtual bool SetVideoByComponentTag(int)
Definition: decoderbase.h:246
virtual QStringList GetTracks(uint Type)
int NextTrack(uint Type)
StreamInfo GetTrackInfo(uint Type, uint TrackNo)
virtual int GetTrackLanguageIndex(uint Type, uint TrackNo)
virtual double GetFPS(void) const
Definition: decoderbase.h:189
This is the interface between an MHEG engine and a MythTV TV object.
Definition: interactivetv.h:18
void JumpToNext(bool up, std::chrono::seconds pos)
jump to the next (up == true) or previous (up == false) liveTV program If pos > 0: indicate the absol...
void EnableSubtitles(int Type, bool ForcedOnly=false)
void EnableTeletext(bool Enable, int Page)
bool TeletextAction(const QString &Action, bool &Exit)
SubtitleScreen * InitSubtitles()
bool GetBoolSetting(const QString &key, bool defaultval=false)
MythBufferType GetType() const
QString GetSubtitleFilename(void) const
Acts as the interface between the UI and the underlying AudioPlayer object.
void InitialiseState() override
Initialise audio and signal initial state.
std::chrono::milliseconds GetStreamMaxPos()
virtual void SetTrack(uint Type, uint TrackNo)
void StreamPlay(bool Playing=true)
void SetInteractiveStreamPos(std::chrono::milliseconds Position)
InteractiveTV * GetInteractiveTV() override
void SetCaptionsEnabled(bool Enable, bool UpdateOSD=true)
void ToggleCaptionsByType(uint Type)
void AdjustSubtitleDelay(std::chrono::milliseconds Delta)
void InitialiseState() override
void ITVRestart(uint Chanid, uint Cardid, bool IsLiveTV)
Restart the MHEG/MHP engine.
void EnableTeletext(int Page=0x100)
void PlayInteractiveStream(bool Play)
void ChangeTrack(uint Type, int Direction)
void SetStream(const QString &Stream)
void SetStreamPos(std::chrono::milliseconds Position)
QStringList GetTracks(uint Type)
void ChangeCaptionTrack(int Direction)
MythCaptionsOverlay m_captionsOverlay
void SetTeletextPage(uint Page)
Set Teletext NUV Caption page.
MythCaptionsState m_captionsState
std::chrono::milliseconds GetStreamPos()
void tracksChanged(uint TrackType) override
This tries to re-enable captions/subtitles if the user wants them and one of the captions/subtitles t...
void AdjustSubtitleZoom(int Delta)
void EnableSubtitles(bool Enable)
bool SetVideoByComponentTag(int Tag)
Selects the video stream using the DVB component tag.
MythPlayerCaptionsUI(MythMainWindow *MainWindow, TV *Tv, PlayerContext *Context, PlayerFlags Flags)
void SetInteractiveStream(const QString &Stream)
void ITVHandleAction(const QString &Action, bool &Handled)
Submit Action to the interactiveTV object.
InteractiveTV * m_interactiveTV
virtual void DisableCaptions(uint Mode, bool UpdateOSD=true)
virtual void EnableCaptions(uint Mode, bool UpdateOSD=true)
void HandleTeletextAction(const QString &Action, bool &Handled)
void CaptionsStateChanged(MythCaptionsState CaptionsState)
uint NextCaptionTrack(uint Mode)
void SetAllowForcedSubtitles(bool Allow)
bool SetAudioByComponentTag(int Tag)
Selects the audio stream using the DVB component tag.
void ChangeOSDPositionUpdates(bool Enable)
void UpdateOSDMessage(const QString &Message)
void UpdateOSDStatus(osdInfo &Info, int Type, OSDTimeout Timeout)
QRecursiveMutex m_osdLock
void SetEof(EofState eof)
bool FlagIsSet(PlayerFlags arg)
Definition: mythplayer.h:317
bool m_disableForcedSubtitles
Definition: mythplayer.h:464
DecoderBase * m_decoder
Definition: mythplayer.h:361
virtual bool JumpToFrame(uint64_t frame)
Definition: mythplayer.cpp:889
QRecursiveMutex m_decoderChangeLock
Definition: mythplayer.h:362
bool m_allowForcedSubtitles
Definition: mythplayer.h:465
CC708Reader m_cc708
Definition: mythplayer.h:469
std::chrono::seconds m_totalDuration
Definition: mythplayer.h:426
uint64_t GetFramesPlayed(void) const
Definition: mythplayer.h:143
void RequestResetCaptions()
bool m_enableForcedSubtitles
Definition: mythplayer.h:463
int m_ttPageNum
VBI page to display when in PAL vbimode.
Definition: mythplayer.h:455
bool Pause(void)
Definition: mythplayer.cpp:150
SubtitleReader m_subReader
Definition: mythplayer.h:458
bool Play(float speed=1.0, bool normal=true, bool unpauseaudio=true)
Definition: mythplayer.cpp:183
CC608Reader m_cc608
Definition: mythplayer.h:468
uint m_vbiMode
VBI decoder to use.
Definition: mythplayer.h:454
PlayerContext * m_playerCtx
Definition: mythplayer.h:365
std::chrono::seconds m_totalLength
Definition: mythplayer.h:425
TVState GetState(void) const
MythMediaBuffer * m_buffer
LiveTVChain * m_tvchain
int m_stream_id
Definition: decoderbase.h:104
void TextSubtitlesUpdated()
AVSubtitles * GetAVSubtitles(void)
void LoadExternalSubtitles(const QString &subtitleFileName, bool isInProgress)
bool HasTextSubtitles(void)
void SetCaptionsEnabled(bool Enable, bool UpdateOSD=true)
void EnableCaptions(uint Mode, bool UpdateOSD=true)
void ChangeCaptionTrack(int Direction)
void DisableCaptions(uint Mode, bool UpdateOSD=true)
void CaptionsStateChanged(MythCaptionsState CaptionsState)
void ResetTeletext()
void AdjustSubtitleDelay(std::chrono::milliseconds Delta)
void AdjustSubtitleZoom(int Delta)
void ChangeTrack(uint Type, int Direction)
void SetTeletextPage(uint Page)
void HandleTeletextAction(const QString &Action, bool &Handled)
void RestartITV(uint Chanid, uint Cardid, bool IsLiveTV)
void ResetCaptions()
void ToggleCaptions()
void HandleITVAction(const QString &Action, bool &Handled)
void EnableTeletext(int Page=0x100)
void ToggleCaptionsByType(uint Type)
void ChangeAllowForcedSubtitles(bool Allow)
void SetTrack(uint Type, uint TrackNo)
Control TV playback.
Definition: tv_play.h:156
@ PAL_TT
Definition: tv.h:13
unsigned int uint
Definition: compat.h:60
@ kEofStateDelayed
Definition: decoderbase.h:70
TrackType
Track types.
Definition: decoderbase.h:27
@ kTrackTypeCC608
Definition: decoderbase.h:32
@ kTrackTypeRawText
Definition: decoderbase.h:36
@ kTrackTypeSubtitle
Definition: decoderbase.h:31
@ kTrackTypeTextSubtitle
Definition: decoderbase.h:42
@ kTrackTypeCC708
Definition: decoderbase.h:33
@ kTrackTypeTeletextCaptions
Definition: decoderbase.h:34
@ kTrackTypeAudio
Definition: decoderbase.h:29
@ kTrackTypeUnknown
Definition: decoderbase.h:28
std::enable_if_t< std::is_floating_point_v< T >, std::chrono::milliseconds > millisecondsFromFloat(T value)
Helper function for convert a floating point number to a duration.
Definition: mythchrono.h:91
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
@ kMythBufferMHEG
PlayerFlags
Definition: mythplayer.h:64
@ kNoITV
Definition: mythplayer.h:74
#define LOC
static uint toCaptionType(uint Type)
static uint toTrackType(uint Type)
@ kOSDFunctionalType_SubtitleZoomAdjust
Definition: osd.h:51
@ kOSDFunctionalType_SubtitleDelayAdjust
Definition: osd.h:52
@ kOSDTimeout_None
Definition: osd.h:58
@ kOSDTimeout_Med
Definition: osd.h:60
static eu8 clamp(eu8 value, eu8 low, eu8 high)
Definition: pxsup2dast.c:206
Mode
Definition: synaesthesia.h:20
@ kState_WatchingLiveTV
Watching LiveTV is the state for when we are watching a recording and the user has control over the c...
Definition: tv.h:66
@ kState_WatchingRecording
Watching Recording is the state for when we are watching an in progress recording,...
Definition: tv.h:83
@ kDisplayCC608
Definition: videoouttypes.h:16
@ kDisplayNone
Definition: videoouttypes.h:12
@ kDisplayAVSubtitle
Definition: videoouttypes.h:15
@ kDisplayRawTextSubtitle
Definition: videoouttypes.h:20
@ kDisplayTeletextMenu
Definition: videoouttypes.h:22
@ kDisplayAllTextCaptions
Definition: videoouttypes.h:23
@ kDisplayAllCaptions
Definition: videoouttypes.h:21
@ kDisplayNUVTeletextCaptions
Definition: videoouttypes.h:13
@ kDisplayTextSubtitle
Definition: videoouttypes.h:18
@ kDisplayTeletextCaptions
Definition: videoouttypes.h:14
@ kDisplayCC708
Definition: videoouttypes.h:17
bool OptionalCaptionEnabled(uint Captions)
Return whether any optional captions are enabled.
Definition: videoouttypes.h:30