Go to the documentation of this file.
3 #undef HAVE_AV_CONFIG_H
15 #include <QCoreApplication>
20 #include <QtCore/qnumeric.h>
25 #include "mythconfig.h"
53 #include "libavcodec/avcodec.h"
59 #define round(x) ((int) ((x) + 0.5))
64 #define LOC QString("Player(%1): ").arg(dbg_ident(this),0,36)
86 : m_playerCtx(Context),
89 m_cc608(this), m_cc708(this),
95 m_playerThreadId = gettid();
108 uint tmp = mypage.toInt(&valid, 16);
163 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Waited 100ms to get pause lock.");
170 return already_paused;
189 return already_paused;
195 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
196 QString(
"Play(%1, normal %2, unpause audio %3)")
197 .
arg(speed,5,
'f',1).
arg(normal).
arg(unpauseaudio));
201 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Ignoring Play(), in edit mode.");
261 if (wait_in_msec != 0ms)
267 while ((wait_for !=
m_playing) && (
t.elapsed() < wait_in_msec))
270 &
m_playingLock, std::max(0ms,wait_in_msec -
t.elapsed()).count());
283 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Cannot create a video renderer without a decoder.");
292 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Couldn't create VideoOutput instance. Exiting..");
293 SetErrored(tr(
"Failed to initialize video output"));
303 bool aspect_only =
false;
312 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to Reinitialize Video. Exiting..");
313 SetErrored(tr(
"Failed to reinitialize video output"));
328 float aspect,
bool ForceUpdate,
329 int ReferenceFrames,
FrameScanType ,
const QString& codecName)
331 bool paramsChanged = ForceUpdate;
333 if (width >= 0 && height >= 0)
335 paramsChanged =
true;
337 m_videoAspect = aspect > 0.0F ? aspect :
static_cast<float>(width) / height;
340 if (!qIsNaN(fps) && fps > 0.0 && fps < 121.0)
342 paramsChanged =
true;
357 if (!codecName.isEmpty())
360 paramsChanged =
true;
363 if (ReferenceFrames > 0)
366 paramsChanged =
true;
453 int testreadsize = 2048;
458 std::chrono::milliseconds
timeout =
459 std::max(500ms * (Retries + 1), 30000ms);
462 testbuf.resize(testreadsize);
471 LOG(VB_GENERAL, LOG_ERR,
LOC +
472 QString(
"OpenFile(): Could not read first %1 bytes of '%2'")
475 SetErrored(tr(
"Could not read first %1 bytes").
arg(testreadsize));
478 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"OpenFile() waiting on data");
479 std::this_thread::sleep_for(50ms);
493 LOG(VB_GENERAL, LOG_ERR,
LOC +
494 QString(
"Couldn't find an A/V decoder for: '%1'")
496 SetErrored(tr(
"Could not find an A/V decoder"));
503 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Could not initialize A/V decoder.");
505 SetErrored(tr(
"Could not initialize A/V decoder"));
522 LOG(VB_GENERAL, LOG_ERR, QString(
"Couldn't open decoder for: %1")
599 std::chrono::milliseconds timecode,
677 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"SetFrameInterval Interval:%1 Speed:%2 Scan:%3 (Multiplier: %4)")
691 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Waiting for video buffers...");
729 if (framesLeft < margin)
733 LOG(VB_PLAYBACK, LOG_NOTICE,
LOC +
"Pause to allow live tv catch up");
734 LOG(VB_PLAYBACK, LOG_NOTICE,
LOC + QString(
"Played: %1 Avail: %2 Buffered: %3 Margin: %4")
742 auto waited_for = std::chrono::milliseconds(
m_bufferingStart.msecsTo(QTime::currentTime()));
743 auto last_msg = std::chrono::milliseconds(
m_bufferingLastMsg.msecsTo(QTime::currentTime()));
747 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
748 "To see more buffering messages use -v playback");
751 LOG(VB_PLAYBACK, LOG_NOTICE,
LOC +
752 QString(
"Waited %1ms for video buffers %2")
757 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
758 QString(
"Waited %1ms for video buffers %2")
766 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
"Music Choice program detected - disabling AV Sync.");
774 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
"Resetting audio buffer");
782 std::chrono::milliseconds msecs { 500ms };
787 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
788 "Timed out waiting for frames, and"
789 "\n\t\t\tthere are not enough free frames. "
790 "Discarding buffered frames.");
798 if (waited_for > msecs)
800 LOG(VB_GENERAL, LOG_ERR,
LOC +
801 "Waited too long for decoder to fill video buffers. Exiting..");
802 SetErrored(tr(
"Video frame buffering failed too many times."));
921 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"FileChangedCallback");
927 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"StopPlaying - begin"));
938 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"StopPlaying - end"));
963 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Waited 100ms for decoder to pause");
990 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Waited 100ms for decoder to unpause");
1003 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Decoder thread already running");
1026 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
1027 "Waited 100ms for decoder loop to stop");
1030 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to stop decoder loop.");
1032 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Exited decoder loop.");
1090 std::this_thread::sleep_for(1ms);
1128 std::this_thread::sleep_for(1ms);
1173 long long target_frame = cur_frame + real_skip;
1197 LOG(VB_GENERAL, LOG_ERR,
LOC +
1198 "Decoder timed out waiting for free video buffers.");
1201 SetErrored(
"Decoder timed out waiting for free video buffers.");
1205 std::this_thread::sleep_for(1ms);
1252 QThread::usleep(10000);
1275 uint64_t bookmark = 0;
1285 bookmark = pi->QueryBookmark();
1287 if (bookmark == 0 && !pi->HasCutlist())
1288 bookmark = pi->QueryProgStart();
1290 bookmark = pi->QueryLastPlayPos();
1300 bool skip_changed =
false;
1315 skip_changed =
true;
1334 return skip_changed;
1353 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Play speed: " +
1354 QString(
"rate: %1 speed: %2 skip: %3 => new interval %4")
1373 uint64_t number = frames + 1;
1380 uint64_t seeksnap_wanted = UINT64_MAX;
1382 seeksnap_wanted = frames * inaccuracy;
1417 float maxtime = 1.0;
1424 long long ret = ffframes;
1445 if ((ff + secsPlayed) > secsWritten)
1454 float behind = secsWritten - secsPlayed;
1456 if (behind < maxtime)
1458 else if (behind - ff <= maxtime)
1464 if (behind < maxtime * 3)
1469 uint64_t lastFrame =
1476 float secsMax = secsWritten - 2.F * maxtime;
1479 else if (secsMax < secsPlayed + ff)
1525 uint64_t framesLeft = 0;
1532 framesLeft = (frameCount > framesRead) ? frameCount - framesRead : 0;
1533 return (framesLeft < (uint64_t)margin);
1548 if (framesLeft < (uint64_t)margin)
1552 return (framesLeft < (uint64_t)margin);
1560 uint64_t number = (frames ? frames - 1 : 0);
1566 if (desiredFrame > endcheck)
1567 desiredFrame = endcheck;
1570 uint64_t seeksnap_wanted = UINT64_MAX;
1572 seeksnap_wanted = frames * inaccuracy;
1612 bool needclear =
false;
1623 std::this_thread::sleep_for(50ms);
1651 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"ClearAfterSeek(%1)")
1652 .
arg(clearvideobuffers));
1682 #ifdef USING_MEDIACODEC
1683 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"ClearBeforeSeek: decoder %1 frames %2 recording %3 livetv %4")
1756 std::chrono::milliseconds position_ms = 0ms;
1757 auto offset_ms = std::chrono::milliseconds(llroundf(fabsf(offset) * 1000));
1759 if (signbit(offset))
1773 position_ms = (offset_ms > length_ms) ? 0ms : length_ms - offset_ms;
1777 position_ms = offset_ms;
1778 if (offset_ms > length_ms)
1782 (length_ms < offset_ms))
1784 long long framesWritten =
1790 position_ms = std::min(position_ms, length_ms);
1800 bool use_cutlist)
const
1803 if (position == UINT64_MAX &&
1807 if (recorderFrameRate > 0)
1808 frameRate = recorderFrameRate;
1837 int64_t desiredFrame = -1;
1841 if (chapter < 0 || chapter > total)
1847 if (chapter < 0) chapter = 0;
1849 else if (chapter > total)
1852 if (chapter > total) chapter = total;
1857 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
1858 QString(
"DoJumpChapter: current %1 want %2 (frame %3)")
1861 if (desiredFrame < 0)
1863 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
"DoJumpChapter failed."));
1890 LOG(VB_GENERAL, LOG_INFO,
LOC +
"Waited 10ms for decoder lock");
1916 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
1917 QString(
"Filling position map from %1 to %2") .
arg(start).
arg(
"end"));
1938 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"%1").
arg(reason));
1991 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
1992 QString(
"Stretch Factor %1, %2 passthru ")
2013 static QMutex s_dbgLock;
2014 static unsigned s_dbgNextIdent = 0;
2015 using DbgMapType = QHash<const MythPlayer*, unsigned>;
2016 static DbgMapType s_dbgIdent;
2018 QMutexLocker locker(&s_dbgLock);
2019 DbgMapType::iterator it = s_dbgIdent.find(player);
2020 if (it != s_dbgIdent.end())
2022 return s_dbgIdent[player] = s_dbgNextIdent++;
bool IsNearEnd(void)
Returns true iff near end of recording.
void SetPlayerContext(PlayerContext *ctx)
virtual int GetCurrentChapter(long long)
virtual bool DoFastForward(long long desiredFrame, bool discardFrames=true)
Skips ahead or rewinds to desiredFrame.
std::enable_if_t< std::is_floating_point_v< T >, std::chrono::seconds > secondsFromFloat(T value)
Helper function for convert a floating point number to a duration.
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
static unsigned dbg_ident(const MythPlayer *)
TVState GetState(void) const
bool m_enableForcedSubtitles
int GetCurPos(void) const
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
const int kDecoderProbeBufferSize
virtual bool InputChanged(QSize VideoDim, QSize VideoDispDim, float VideoAspect, MythCodecID CodecID, bool &AspectChanged, int ReferenceFrames, bool ForceChange)
Tells video output to discard decoded frames and wait for new ones.
long long GetFramesPlayed(void) const
void SetFileLength(std::chrono::seconds total, int frames)
void UnlockPlayingInfo(const char *file, int line) const
static MythVideoOutputNull * Create(QSize VideoDim, QSize VideoDispDim, float VideoAspect, MythCodecID CodecID)
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...
int GetRecorderNumber(void) const
void SetEof(EofState eof)
bool m_inJumpToProgramPause
bool UpdateFFRewSkip(void)
CommBreakMap m_commBreakMap
virtual void ChangeSpeed(void)
MythDecoderThread * m_decoderThread
void TrackerReset(uint64_t frame)
Resets the internal state tracker.
void SetPlayingInfo(const ProgramInfo *info)
assign programinfo to the context
A QElapsedTimer based timer to replace use of QTime as a timer.
static const int kNightModeContrastAdjustment
QWaitCondition m_decoderThreadUnpause
void SeekingSlow(int Count)
MythPlayerAVSync m_avSync
virtual void DecoderPauseCheck(void)
int FreeVideoFrames()
Returns number of frames available for decoding onto.
std::chrono::microseconds m_frameInterval
always adjusted for play_speed
void FillDurationMap(int64_t start, int64_t end, frm_pos_map_t &durationMap)
VideoErrorState GetError() const
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
virtual int OpenFile(int Retries=4)
std::chrono::milliseconds TranslatePositionFrameToMs(uint64_t position, float fallback_framerate, bool use_cutlist) const
static bool SetStartChannel(uint inputid, const QString &channum)
virtual bool PrebufferEnoughFrames(int min_buffers=0)
std::chrono::seconds m_totalDuration
void SetTracker(uint64_t framesPlayed)
virtual bool PrepareAudioSample(std::chrono::milliseconds &timecode)
int m_videobufRetries
How often we have tried to wait for a video output buffer and failed.
bool IsPaused(void) const
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
bool m_forcePositionMapSync
virtual bool HasReachedEof(void) const
virtual void AudioEnd(void)
bool IsDatabaseIgnored(void) const
/brief Returns true if database is being ignored.
std::enable_if_t< std::is_floating_point_v< T >, std::chrono::microseconds > microsecondsFromFloat(T value)
Helper function for convert a floating point number to a duration.
arg(title).arg(filename).arg(doDelete))
QString GetChannelSchedulingID(void) const
This is the unique programming identifier of a channel.
void SetStretchFactor(float factor)
QMap< uint64_t, MarkTypes > frm_dir_map_t
Frame # -> Mark map.
void syncWithAudioStretch()
QString m_errorMsg
Reason why NVP exited with a error.
bool IsBufferAlmostFull(void)
void SaveTotalFrames(void)
bool IsErrored(void) const
long long GetFramesWritten(void)
Returns number of frames written to disk by TVRec's RecorderBase instance.
void SetTTPageNum(int page)
float GetFrameRate(void) const
void start(void)
starts measuring elapsed time.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
uint64_t GetCurrentFrameCount(void) const
bool IsPlaying(std::chrono::milliseconds wait_in_msec=0ms, bool wait_for=true) const
bool HasAudioOut(void) const
static uint Parse(const QString &vbiformat)
bool is_current_thread(MThread *thread)
Use this to determine if you are in the named thread.
virtual void SetFramesPlayed(long long FramesPlayed)
long long CalcRWTime(long long rw) const
CalcRWTime(rw): rewind rw frames back.
EofState GetEof(void) const
bool IsValidRecorder(void) const
virtual uint64_t GetBookmark(void)
virtual MythCodecID GetVideoCodecID(void) const =0
void SetMap(const frm_dir_map_t &newMap, uint64_t framesPlayed)
def scan(profile, smoonURL, gate)
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
void SetErrored(const QString &reason)
QString GetEncodingType(void) const
void DiscardVideoFrames(bool KeyFrame, bool Flushed)
Places frames in the available frames queue.
bool TrackerWantsToJump(uint64_t frame, uint64_t &to) const
Returns true if the given frame has passed the last cut point start and provides the frame number of ...
void SetDecoder(DecoderBase *dec)
Sets the stream decoder, deleting any existing recorder.
static const double kInaccuracyNone
void SetPrebuffering(bool Normal)
Sets whether to use a normal number of buffers or fewer buffers.
bool ResetAVSyncForLiveTV(AudioPlayer *Audio)
virtual long long GetChapter(int)
bool HasTVChainNext(void) const
bool GetRawAudioState(void) const
virtual void GetChapterTimes(QList< std::chrono::seconds > &)
void PauseChanged(bool Paused)
void SaveTotalDuration(void)
float ComputeSecs(uint64_t position, bool use_cutlist) const
long long GetCachedFramesWritten(void) const
Return value last returned by GetFramesWritten().
virtual void ForceSetupAudioStream(void)
static const int kNightModeBrightenssAdjustment
virtual int64_t GetChapter(int chapter)
#define codec_is_mediacodec(id)
virtual int ValidVideoFrames() const
Returns number of frames that are fully decoded.
long long m_ffTime
If m_ffTime>0, number of frames to seek forward.
void ClearBeforeSeek(uint64_t Frames)
Discard video frames prior to seeking.
ProgramInfo * m_playingInfo
Currently playing info.
bool DecoderGetFrame(DecodeType decodetype, bool unsafe=false)
void SetPlayingInfo(const ProgramInfo &pginfo)
virtual void ClearAfterSeek()
Tells video output to toss decoded buffers due to a seek.
bool m_captionsEnabledbyDefault
This allows us to enable captions/subtitles later if the streams are not immediately available when t...
virtual void DeLimboFrame(MythVideoFrame *Frame)
Releases a frame for reuse if it is in limbo.
float GetFrameRate(void)
Returns recordering frame rate set by nvr.
void LockPlayingInfo(const char *file, int line) const
uint64_t FindFrame(float offset, bool use_cutlist) const
std::chrono::milliseconds m_timecode
int GetfpsMultiplier(void) const
virtual bool DoJumpChapter(int chapter)
QString GetFrameStatus() const
Returns string with status of each frame for debugging.
void SetDuration(std::chrono::seconds duration)
MythVideoOutput * m_videoOutput
bool m_hasFullPositionMap
bool IsInDelete(uint64_t frame)
MythMediaBuffer * m_buffer
friend class MythDecoderThread
MythPlayer(PlayerContext *Context, PlayerFlags Flags=kNoFlags)
QString ScanTypeToString(FrameScanType Scan)
QMutex m_decoderPauseLock
bool GetAVSyncAudioPause() const
virtual MythVideoFrame * GetNextFreeFrame()
Blocks until it is possible to return a frame for decoding onto.
virtual bool InitVideo(void)
void WrapTimecode(std::chrono::milliseconds &timecode, TCTypes tc_type)
bool IsInDelete(uint64_t frame) const
Returns true if the given frame is deemed to be within a region that should be cut.
void ResetTotalDuration(void)
void ClearAfterSeek(bool clearvideobuffers=true)
This is to support seeking...
int m_ttPageNum
VBI page to display when in PAL vbimode.
void SetBuffering(bool new_buffering)
void LoadMap(const QString &undoMessage="")
Loads the delete map from the database.
virtual void ResetPlaying(bool resetframes=true)
void SetAVSyncMusicChoice(AudioPlayer *Audio)
double m_videoFrameRate
Video (input) Frame Rate (often inaccurate)
QString get_encoding_type(MythCodecID codecid)
virtual long long GetFramesPlayed()
std::vector< char > TestBufferVec
virtual QString GetXDS(const QString &) const
PlayerContext * m_playerCtx
virtual double GetFPS(void) const
float m_forcedVideoAspect
QSize m_videoDispDim
Video (input) width & height.
void DeLimboFrame(MythVideoFrame *frame)
virtual void DiscardFrames(bool KeyFrame, bool Flushed)
Releases all frames not being actively displayed from any queue onto the queue of frames ready for de...
QString m_codecName
Codec Name - used by playback profile.
bool PosMapFromEnc(uint64_t start, frm_pos_map_t &posMap, frm_pos_map_t &durMap)
std::chrono::milliseconds m_latestVideoTimecode
bool m_disableForcedSubtitles
uint m_keyframeDist
Video (input) Number of frames between key frames (often inaccurate)
static bool preBufferDebug
void RequestResetCaptions()
bool GetEditMode(void) const
void EnableForcedSubtitles(bool enable)
virtual void GetChapterTimes(QList< std::chrono::seconds > ×)
int m_fpsMultiplier
used to detect changes
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
PlayerFlags m_playerFlags
void UnpauseDecoder(void)
virtual bool GetRawAudioState(void) const
int GetNumSetting(const QString &key, int defaultval=0)
uint m_vbiMode
VBI decoder to use.
virtual void VideoEnd(void)
bool DoFastForward(uint64_t frames, double inaccuracy)
virtual bool DecoderGetFrameREW(void)
virtual void DecoderEnd(void)
virtual bool SyncPositionMap(void)
Updates the position map used for skipping frames.
virtual void ReinitVideo(bool ForceUpdate)
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
std::chrono::milliseconds TranslatePositionFrameToMs(uint64_t position, bool use_cutlist) const
bool EnoughFreeFrames()
Returns true iff enough frames are available to decode onto.
void DoJumpToFrame(uint64_t frame, double inaccuracy)
virtual void SetVideoParams(int w, int h, double fps, float aspect, bool ForceUpdate, int ReferenceFrames, FrameScanType=kScan_Ignore, const QString &codecName=QString())
void JumpChapter(int chapter)
virtual void ReleaseFrame(MythVideoFrame *Frame)
Releases a frame from the ready for decoding queue onto the queue of frames ready for display.
void SetSeekSnap(uint64_t snap)
virtual int GetNumChapters(void)
virtual int GetNumChapters(void)
bool GetBoolSetting(const QString &key, bool defaultval=false)
virtual void InitFrameInterval()
QString GetError(void) const
virtual void SetWatchingRecording(bool mode)
@ kState_WatchingPreRecorded
Watching Pre-recorded is a TV only state for when we are watching a pre-existing recording.
void SetTranscoding(bool value)
virtual bool GetFrame(DecodeType Type, bool &Retry)=0
Demux, preprocess and possibly decode a frame of video/audio.
void ResetAVSyncClockBase()
virtual void CreateDecoder(TestBufferVec &TestBuffer)
QString GetInputType(int pos=-1) const
virtual long long CalcMaxFFTime(long long ff, bool setjump=true) const
CalcMaxFFTime(ffframes): forward ffframes forward.
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
AutoExpireType QueryAutoExpire(void) const
Returns "autoexpire" field from "recorded" table.
void SetKeyframeDistance(int keyframedistance)
virtual void UpdateFramesPlayed(void)
virtual void DiscardFrame(MythVideoFrame *Frame)
Releases frame from any queue onto the queue of frames ready for decoding onto.
void SetWatchingRecording(bool mode)
Holds information on recordings and videos.
bool IsReallyNearEnd(void) const
Returns true iff really near end of recording.
bool IsWatchingInprogress(void) const
QWaitCondition m_decoderThreadPause
void SetFramesPlayed(uint64_t played)
void FileChangedCallback()
int m_maxReferenceFrames
Number of reference frames used in the video stream.
void WaitForSeek(uint64_t frame, uint64_t seeksnap_wanted)
int GetFreeVideoFrames(void) const
Returns the number of frames available for decoding onto.
void SetRenderFormats(const VideoFrameTypes *RenderFormats)
#define setpriority(x, y, z)
void SetDisablePassThrough(bool disabled)
static const double kInaccuracyEditor
uint64_t TranslatePositionMsToFrame(std::chrono::milliseconds position, bool use_cutlist) const
void SetPlaying(bool is_playing)
MythVideoFrame * GetNextVideoFrame(void)
Removes a frame from the available queue for decoding onto.
void FillPositionMap(int64_t start, int64_t end, frm_pos_map_t &positionMap)
void SetFrameRate(double fps)
void ResetTotalDuration(void)
std::chrono::seconds m_totalLength
void SetFrameInterval(FrameScanType scan, double frame_period)
bool isRunning(void) const
void SetCommBreakMap(const frm_dir_map_t &NewMap)
QSize m_videoDim
Video (input) buffer width & height.
float GetStretchFactor(void) const
virtual void SetDisablePassThrough(bool disable)
Disables AC3/DTS pass through.
float m_videoAspect
Video (input) Apect Ratio.
void ForceSetupAudioStream(void)
virtual bool DecoderGetFrameFFREW(void)
static const double kInaccuracyFull
virtual bool JumpToFrame(uint64_t frame)
virtual void StopPlaying(void)
void SaveTotalDuration(void)
virtual int OpenFile(MythMediaBuffer *Buffer, bool novideo, TestBufferVec &testbuf)=0
QMutex m_decoderChangeLock
virtual bool IsInStillFrame() const
QString GetXDS(const QString &key) const
void SaveSetting(const QString &key, int newValue)
RemoteEncoder * m_recorder
virtual void Reset(bool reset_video_data, bool seek_reset, bool reset_file)
uint64_t GetLastFrame(void) const
Returns the number of the last frame in the video that is not in a cut sequence.
bool EnoughDecodedFrames()
Returns true iff there are plenty of decoded frames ready for display.
virtual void DecoderLoop(bool pause)
virtual void SetEofState(EofState eof)
bool m_disablePassthrough
void SetLiveTVMode(bool live)
bool DoRewind(uint64_t frames, double inaccuracy)
static const double kInaccuracyDefault
virtual bool FastForward(float seconds)
long long GetFramesRead(void) const
virtual bool DoRewind(long long desiredFrame, bool discardFrames=true)
bool IsEditing(void) const
bool DoGetFrame(DecodeType DecodeType)
Get one frame from the decoder.
bool Play(float speed=1.0, bool normal=true, bool unpauseaudio=true)
QWaitCondition m_playingWaitCond
virtual void SetVideoFrameRate(float VideoFrameRate)
const VideoFrameTypes * m_renderFormats
bool volatile m_killDecoder
virtual void ReleaseNextVideoFrame(MythVideoFrame *buffer, std::chrono::milliseconds timecode, bool wrap=true)
Places frame on the queue of frames ready for display.
QString GetSetting(const QString &key, const QString &defaultval="")
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.
virtual void DecoderStart(bool start_paused)
void SaveTotalFrames(void)
virtual bool Rewind(float seconds)
virtual int GetCurrentChapter(void)
void DiscardVideoFrame(MythVideoFrame *buffer)
Places frame in the available frames queue.