MythTV master
mythplayercaptionsui.cpp
Go to the documentation of this file.
1// MythTV
4
6#include "livetvchain.h"
9#include "tv_play.h"
10
11#define LOC QString("PlayerCaptions: ")
12
14 : MythPlayerAudioUI(MainWindow, Tv, Context, Flags),
15 m_captionsOverlay(MainWindow, Tv, nullptr, m_painter)
16{
17 // Register state type for signalling
18 qRegisterMetaType<MythCaptionsState>();
19
20 m_itvEnabled = gCoreContext->GetBoolSetting("EnableMHEG", false);
21
22 // Connect outgoing
24
25 // Inbound connections
45
46 // Signalled connections (from MHIContext)
50
51 // Signalled from the decoder
52 connect(this, &MythPlayerCaptionsUI::EnableSubtitles, this, [this](bool Enable) { this->SetCaptionsEnabled(Enable, false); });
53
54 // Signalled from the base class
56}
57
59{
60 delete m_interactiveTV;
61}
62
64{
65 LOG(VB_GENERAL, LOG_INFO, LOC + "Initialising captions");
69}
70
72{
74 bool inprogress = (m_playerCtx->GetState() == kState_WatchingRecording ||
78}
79
81{
84}
85
87{
89 return;
90
91 if (auto * subs = m_captionsOverlay.InitSubtitles(); subs)
92 {
93 auto newval = std::clamp(subs->GetZoom() + Delta, 50, 200);
94 UpdateOSDStatus(tr("Adjust Subtitle Zoom"), tr("Subtitle Zoom"),
95 QString::number(newval), kOSDFunctionalType_SubtitleZoomAdjust,
96 "%", newval * 1000 / 200, kOSDTimeout_None);
98 subs->SetZoom(newval);
99 }
100}
101
102void MythPlayerCaptionsUI::AdjustSubtitleDelay(std::chrono::milliseconds Delta)
103{
106 if (!showing || (m_browsing || m_editing))
107 return;
108
109 if (auto * subs = m_captionsOverlay.InitSubtitles(); subs)
110 {
111 auto newval = std::clamp(subs->GetDelay() + (Delta * 10), -5000ms, 5000ms);
112 // range of -5000ms..+5000ms, scale to 0..1000
113 UpdateOSDStatus(tr("Adjust Subtitle Delay"), tr("Subtitle Delay"),
114 QString::number(newval.count()), kOSDFunctionalType_SubtitleDelayAdjust,
115 "ms", (newval.count() / 10) + 500, kOSDTimeout_None);
117 subs->SetDelay(newval);
118 }
119
120}
121
123{
126}
127
129{
130 if (kTrackTypeCC608 == Type) return kDisplayCC608;
131 if (kTrackTypeCC708 == Type) return kDisplayCC708;
132 if (kTrackTypeSubtitle == Type) return kDisplayAVSubtitle;
135 if (kTrackTypeRawText == Type) return kDisplayRawTextSubtitle;
136 return 0;
137}
138
140{
141 if (kDisplayCC608 == Type) return kTrackTypeCC608;
142 if (kDisplayCC708 == Type) return kTrackTypeCC708;
143 if (kDisplayAVSubtitle == Type) return kTrackTypeSubtitle;
146 if (kDisplayRawTextSubtitle == Type) return kTrackTypeRawText;
147 return kTrackTypeUnknown;
148}
149
151{
152 auto oldcaptions = m_captionsState.m_textDisplayMode;
156 if (oldcaptions != m_captionsState.m_textDisplayMode)
159
160 QMutexLocker locker(&m_osdLock);
161
162 bool newTextDesired = (m_captionsState.m_textDisplayMode & kDisplayAllTextCaptions) != 0U;
163 // Only turn off textDesired if the Operator requested it.
164 if (UpdateOSD || newTextDesired)
165 m_textDesired = newTextDesired;
166
167 auto msg = (kDisplayNUVTeletextCaptions & Mode) ? tr("TXT CAP") : "";
169 {
170 if (auto track = GetTrack(kTrackTypeTeletextCaptions); (track > 1) && (m_decoder != nullptr))
171 msg += m_decoder->GetTrackDesc(kTrackTypeTeletextCaptions, static_cast<uint>(track));
173 }
177 if ((kDisplayCC608 & Mode) || (kDisplayCC708 & Mode) ||
179 {
180 if (uint type = toTrackType(Mode); m_decoder != nullptr)
181 if (auto track = GetTrack(type); track > -1)
182 msg += m_decoder->GetTrackDesc(type, static_cast<uint>(track));
183
185 }
186
188 {
189 msg += tr("Text subtitles");
191 }
192
193 if (!msg.isEmpty() && UpdateOSD)
194 {
195 msg += " " + tr("Off");
197 }
198}
199
201{
202 QMutexLocker locker(&m_osdLock);
203 bool newTextDesired = (Mode & kDisplayAllTextCaptions) != 0U;
204 // Only turn off textDesired if the Operator requested it.
205 if (UpdateOSD || newTextDesired)
206 m_textDesired = newTextDesired;
207 QString msg;
208 if ((kDisplayCC608 & Mode) || (kDisplayCC708 & Mode) ||
210 {
211 if (auto type = toTrackType(Mode); m_decoder != nullptr)
212 if (auto track = GetTrack(type); track > -1)
213 msg += m_decoder->GetTrackDesc(type, static_cast<uint>(track));
214
215 m_captionsOverlay.EnableSubtitles(static_cast<int>(Mode));
216 }
217
219 {
222 subs->m_needSync = true;
223 msg += tr("Text subtitles");
224 }
225
227 msg += tr("TXT %1").arg(m_ttPageNum, 3, 16);
228
229 if ((kDisplayTeletextCaptions & Mode) && (m_decoder != nullptr))
230 {
233
236
237 EnableTeletext(page);
238 }
239
240 msg += " " + tr("On");
241 LOG(VB_PLAYBACK, LOG_INFO, QString("EnableCaptions(%1) msg: %2").arg(Mode).arg(msg));
242
243 auto oldcaptions = m_captionsState.m_textDisplayMode;
247 if (oldcaptions != m_captionsState.m_textDisplayMode)
249 if (UpdateOSD)
251}
252
257{
259 SetCaptionsEnabled(true, false);
260}
261
263{
265 UpdateOSDMessage(m_allowForcedSubtitles ? tr("Forced Subtitles On") : tr("Forced Subtitles Off"));
266}
267
269{
271}
272
274{
275 QMutexLocker locker(&m_osdLock);
276 auto mode = toCaptionType(Type);
277 auto origmode = m_captionsState.m_textDisplayMode;
279 DisableCaptions(m_captionsState.m_textDisplayMode, (origmode & mode) != 0U);
280 if (origmode & mode)
281 return;
282 if (mode)
283 EnableCaptions(mode);
284}
285
286void MythPlayerCaptionsUI::SetCaptionsEnabled(bool Enable, bool UpdateOSD)
287{
288 QMutexLocker locker(&m_osdLock);
289 auto origmode = m_captionsState.m_textDisplayMode;
290
291 // Only turn off textDesired if the Operator requested it.
292 if (UpdateOSD || Enable)
293 m_textDesired = Enable;
294
295 if (!Enable)
296 {
297 DisableCaptions(origmode, UpdateOSD);
298 return;
299 }
300
303 {
304 DisableCaptions(origmode, false);
305 if (kDisplayNone == mode)
306 {
307 if (UpdateOSD)
308 UpdateOSDMessage(tr("No captions", "CC/Teletext/Subtitle text not available"), kOSDTimeout_Med);
309 LOG(VB_PLAYBACK, LOG_INFO, "No captions available yet to enable.");
310 }
311 else
312 {
313 EnableCaptions(mode, UpdateOSD);
314 }
315 }
316}
317
319{
320 if (m_decoder)
321 return m_decoder->GetTracks(Type);
322 return {};
323}
324
326{
327 if (m_decoder)
328 return m_decoder->GetTrackCount(Type);
329 return 0;
330}
331
333{
334 if (!m_decoder)
335 return;
336
337 m_decoder->SetTrack(Type, static_cast<int>(TrackNo));
338 if (kTrackTypeAudio == Type)
339 {
341 }
342 else if (auto subtype = toCaptionType(Type); subtype)
343 {
345 EnableCaptions(subtype, true);
346 if ((kDisplayCC708 == subtype || kDisplayCC608 == subtype) && m_decoder)
347 if (auto sid = m_decoder->GetTrackInfo(Type, TrackNo).m_stream_id; sid > 0)
348 (kDisplayCC708 == subtype) ? m_cc708.SetCurrentService(sid) : m_cc608.SetMode(sid);
349 }
350}
351
353{
355 m_osdLock.lock();
357 m_osdLock.unlock();
358}
359
361{
364 return;
365
366 m_osdLock.lock();
368 m_osdLock.unlock();
369}
370
372{
373 if (m_decoder)
374 return m_decoder->GetTrack(Type);
375 return -1;
376}
377
379{
380 if (!m_decoder)
381 return;
382 if (auto ret = m_decoder->ChangeTrack(Type, Direction); ret >= 0)
384}
385
387{
388 if (!m_decoder || (Direction < 0))
389 return;
390
394 {
396 if (GetTrack(tracktype) < m_decoder->NextTrack(tracktype))
397 {
398 SetTrack(tracktype, static_cast<uint>(m_decoder->NextTrack(tracktype)));
399 return;
400 }
401 }
403 if ((nextmode == kDisplayTextSubtitle) || (nextmode == kDisplayNUVTeletextCaptions) ||
404 (nextmode == kDisplayNone))
405 {
407 if (nextmode != kDisplayNone)
408 EnableCaptions(nextmode, true);
409 }
410 else
411 {
412 uint tracktype = toTrackType(nextmode);
413 uint tracks = m_decoder->GetTrackCount(tracktype);
414 if (tracks)
415 {
417 SetTrack(tracktype, 0);
418 }
419 }
420}
421
423{
424 if (Mode == kDisplayNone)
425 return false;
427 return true;
428 // External subtitles are now decoded with FFmpeg and are AVSubtitles.
430 return true;
432 return true;
433 return false;
434}
435
437{
438 // Text->TextStream->708->608->AVSubs->Teletext->NUV->None
439 // NUV only offerred if PAL
440 bool pal = (m_vbiMode == VBIMode::PAL_TT);
441 uint nextmode = kDisplayNone;
442
444 nextmode = kDisplayRawTextSubtitle;
445 else if (kDisplayRawTextSubtitle == Mode)
446 nextmode = kDisplayCC708;
447 else if (kDisplayCC708 == Mode)
448 nextmode = kDisplayCC608;
449 else if (kDisplayCC608 == Mode)
450 nextmode = kDisplayAVSubtitle;
451 else if (kDisplayAVSubtitle == Mode)
452 nextmode = kDisplayTeletextCaptions;
453 else if (kDisplayTeletextCaptions == Mode)
454 nextmode = pal ? kDisplayNUVTeletextCaptions : kDisplayNone;
455 else if ((kDisplayNUVTeletextCaptions == Mode) && pal)
456 nextmode = kDisplayNone;
457 else if (kDisplayNone == Mode)
458 nextmode = kDisplayTextSubtitle;
459
460 if (nextmode == kDisplayNone || HasCaptionTrack(nextmode))
461 return nextmode;
462
463 return NextCaptionTrack(nextmode);
464}
465
467{
468 QMutexLocker locker(&m_osdLock);
469 auto oldcaptions = m_captionsState.m_textDisplayMode;
473 if (oldcaptions != m_captionsState.m_textDisplayMode)
475}
476
478{
479 QMutexLocker locker(&m_osdLock);
481 auto oldcaptions = m_captionsState.m_textDisplayMode;
483 if (oldcaptions != m_captionsState.m_textDisplayMode)
485
486 // If subtitles were enabled before the teletext menu was displayed then re-enable them
489}
490
492{
493 QMutexLocker locker(&m_osdLock);
495}
496
500{
501 m_osdLock.lock();
503 auto oldcaptions = m_captionsState.m_textDisplayMode;
504 m_ttPageNum = static_cast<int>(Page);
506 m_captionsState.m_textDisplayMode &= static_cast<uint>(~kDisplayAllCaptions);
508 if (oldcaptions != m_captionsState.m_textDisplayMode)
510 m_osdLock.unlock();
511}
512
513void MythPlayerCaptionsUI::HandleTeletextAction(const QString& Action, bool &Handled)
514{
516 return;
517
518 bool exit = false;
519 m_osdLock.lock();
520 Handled = m_captionsOverlay.TeletextAction(Action, exit);
521 m_osdLock.unlock();
522 if (exit)
524}
525
527{
528#if CONFIG_MHEG
529 bool update = false;
530 {
531 QMutexLocker lock1(&m_osdLock);
532 QMutexLocker lock2(&m_itvLock);
534 {
535 m_interactiveTV = new InteractiveTV(this);
537 update = true;
538 }
539 }
540 if (update)
542#endif
543 return m_interactiveTV;
544}
545
553void MythPlayerCaptionsUI::ITVHandleAction([[maybe_unused]] const QString &Action,
554 [[maybe_unused]] bool& Handled)
555{
556#if CONFIG_MHEG
557 if (!GetInteractiveTV())
558 {
559 Handled = false;
560 return;
561 }
562
563 QMutexLocker locker(&m_itvLock);
564 Handled = m_interactiveTV->OfferKey(Action);
565#endif
566}
567
569void MythPlayerCaptionsUI::ITVRestart([[maybe_unused]] uint Chanid,
570 [[maybe_unused]] uint Cardid,
571 [[maybe_unused]] bool IsLiveTV)
572{
573#if CONFIG_MHEG
574 if (!GetInteractiveTV())
575 return;
576
577 QMutexLocker locker(&m_itvLock);
578 m_interactiveTV->Restart(static_cast<int>(Chanid), static_cast<int>(Cardid), IsLiveTV);
579 m_itvVisible = false;
580#endif
581}
582
591{
592 QMutexLocker locker(&m_decoderChangeLock);
593 if (m_decoder)
595 return false;
596}
597
603{
604 QMutexLocker locker(&m_decoderChangeLock);
605 if (m_decoder)
607 return false;
608}
609
611{
612 QMutexLocker locker(&m_decoderChangeLock);
613 if (!m_decoder)
614 return 25;
615 double fps = m_decoder->GetFPS();
616 return fps > 0 ? fps : 25.0;
617}
618
619void MythPlayerCaptionsUI::SetStream(const QString& Stream)
620{
621 // The stream name is empty if the stream is closing
622 LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("SetStream '%1'").arg(Stream));
623
624 // Stream will be changed by JumpToStream called from EventLoop
625 // If successful will call m_interactiveTV->StreamStarted();
626 m_newStream = Stream;
627
628 if (Stream.isEmpty() && m_playerCtx->m_tvchain && m_playerCtx->m_buffer->GetType() == kMythBufferMHEG)
629 {
630 // Restore livetv
632 m_playerCtx->m_tvchain->JumpToNext(false, 0s);
633 m_playerCtx->m_tvchain->JumpToNext(true, 0s);
634 }
635}
636
637// Called from the interactiveTV (MHIContext) thread
638std::chrono::milliseconds MythPlayerCaptionsUI::GetStreamPos()
639{
640 return millisecondsFromFloat((1000 * GetFramesPlayed()) / SafeFPS());
641}
642
643// Called from the interactiveTV (MHIContext) thread
644std::chrono::milliseconds MythPlayerCaptionsUI::GetStreamMaxPos()
645{
646 std::chrono::seconds maxsecs = m_totalDuration > 0s ? m_totalDuration : m_totalLength;
647 auto maxpos = duration_cast<std::chrono::milliseconds>(maxsecs);
648 auto pos = GetStreamPos();
649 return maxpos > pos ? maxpos : pos;
650}
651
652void MythPlayerCaptionsUI::SetStreamPos(std::chrono::milliseconds Position)
653{
654 auto frameNum = static_cast<uint64_t>((Position.count() * SafeFPS()) / 1000);
655 LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("SetStreamPos %1 mS = frame %2, now=%3")
656 .arg(Position.count()).arg(frameNum).arg(GetFramesPlayed()) );
657 JumpToFrame(frameNum);
658}
659
661{
662 if (Playing)
663 Play();
664 else
665 Pause();
666}
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 CaptionsStateChanged(MythCaptionsState &CaptionsState)
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)
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:318
bool m_disableForcedSubtitles
Definition: mythplayer.h:464
DecoderBase * m_decoder
Definition: mythplayer.h:362
virtual bool JumpToFrame(uint64_t frame)
Definition: mythplayer.cpp:892
QRecursiveMutex m_decoderChangeLock
Definition: mythplayer.h:363
bool m_allowForcedSubtitles
Definition: mythplayer.h:465
CC708Reader m_cc708
Definition: mythplayer.h:469
std::chrono::seconds m_totalDuration
Definition: mythplayer.h:427
uint64_t GetFramesPlayed(void) const
Definition: mythplayer.h:144
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:153
SubtitleReader m_subReader
Definition: mythplayer.h:458
bool Play(float speed=1.0, bool normal=true, bool unpauseaudio=true)
Definition: mythplayer.cpp:186
CC608Reader m_cc608
Definition: mythplayer.h:468
uint m_vbiMode
VBI decoder to use.
Definition: mythplayer.h:454
PlayerContext * m_playerCtx
Definition: mythplayer.h:366
std::chrono::seconds m_totalLength
Definition: mythplayer.h:426
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
@ 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
unsigned int uint
Definition: freesurround.h:24
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:65
@ kNoITV
Definition: mythplayer.h:75
#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:23
@ 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