20 #define PTSINDEX_ENTRIES 1024 37 void Put(uint32_t Pts,
int Index,
bool Independent);
76 uint32_t Delta = 0xFFFFFFFF;
78 for (
int i =
w; i !=
r; ) {
101 int UnplayedIFrame = 2;
102 for (
int i =
r; i !=
w && UnplayedIFrame; ) {
107 if (
pi[i].independent) {
115 if (
pi[i].independent)
120 return Valid ? FrameNumber :
FindIndex(Pts);
147 :
cThread(
"non blocking file reader")
233 #define PLAYERBUFSIZE (MAXFRAMESIZE * 5) 235 #define RESUMEBACKUP 10 // number of seconds to back up when resuming an interrupted replay session 236 #define MAXSTUCKATEOF 3 // max. number of seconds to wait in case the device doesn't play the last frame 266 bool NextFile(uint16_t FileNumber = 0, off_t FileOffset = -1);
271 virtual void Action(
void);
273 cDvbPlayer(
const char *FileName,
bool PauseLive);
283 void Goto(
int Position,
bool Still =
false);
286 virtual bool GetIndex(
int &Current,
int &Total,
bool SnapToIFrame =
false);
291 #define MAX_VIDEO_SLOWMOTION 63 // max. arg to pass to VIDEO_SLOWMOTION // TODO is this value correct? 292 #define NORMAL_SPEED 4 // the index of the '1' entry in the following array 293 #define MAX_SPEEDS 3 // the offset of the maximum speed from normal speed in either direction 294 #define SPEED_MULT 12 // the speed multiplier 319 isyslog(
"replay %s", FileName);
328 esyslog(
"ERROR: can't allocate index");
407 if (
index->
Get(Index, &FileNumber, &FileOffset) &&
NextFile(FileNumber, FileOffset))
463 if (
index->
Get(Index, &FileNumber, &FileOffset) &&
NextFile(FileNumber, FileOffset)) {
476 bool WaitingForData =
false;
477 time_t StuckAtEof = 0;
478 uint32_t LastStc = 0;
479 int LastReadFrame = -1;
480 int SwitchToPlayFrame = 0;
482 bool AtLastMark =
false;
519 if (NewIndex <= 0 && readIndex > 0)
529 if (!
NextFile(FileNumber, FileOffset))
544 if (m && (m->
Index() & 0x01) != 0) {
582 WaitingForData =
false;
589 WaitingForData =
true;
658 w =
PlayTs(p, pc, VideoOnly);
688 if (
eof || SwitchToPlayFrame) {
689 bool SwitchToPlay =
false;
693 else if (!StuckAtEof)
694 StuckAtEof = time(NULL);
703 if (Index >= LastReadFrame)
706 else if (Index <= 0 || SwitchToPlayFrame && Index >= SwitchToPlayFrame)
709 if (!SwitchToPlayFrame)
714 SwitchToPlayFrame = 0;
805 default:
esyslog(
"ERROR: unknown playMode %d (%s)",
playMode, __FUNCTION__);
857 default:
esyslog(
"ERROR: unknown playMode %d (%s)",
playMode, __FUNCTION__);
864 if (
index && Frames) {
867 int OldCurrent = Current;
872 return Current >= 0 ? Current : OldCurrent;
879 if (
index && Seconds) {
907 if (
NextFile(FileNumber, FileOffset)) {
950 Current = (abs(Current - i1) <= abs(Current - i2)) ? i1 : i2;
955 Current = Total = -1;
966 Current = Total = -1;
int FindIndex(uint32_t Pts)
cRingBufferFrame * ringBuffer
virtual void Activate(bool On)
ssize_t Read(void *Data, size_t Size)
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
bool Lock(cStateKey &StateKey, bool Write=false, int TimeoutMs=0) const
Tries to get a lock on this list and returns true if successful.
void Signal(void)
Signals a caller of Wait() that the condition it is waiting for is met.
int64_t PesGetPts(const uchar *p)
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
cNonBlockingFileReader * nonBlockingFileReader
void Goto(int Position, bool Still=false)
void SkipSeconds(int Seconds)
void Remove(bool IncState=true)
Removes this key from the lock it was previously used with.
bool Independent(void) const
static tThreadId IsMainThread(void)
cUnbufferedFile * NextFile(void)
bool PesHasPts(const uchar *p)
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
tPtsIndex pi[PTSINDEX_ENTRIES]
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
virtual bool GetIndex(int &Current, int &Total, bool SnapToIFrame=false)
cNonBlockingFileReader(void)
int PlayPes(const uchar *Data, int Length, bool VideoOnly=false)
virtual void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
bool DeviceHasIBPTrickSpeed(void)
void SetMarks(const cMarks *Marks)
void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
virtual double FramesPerSecond(void)
virtual ~cDvbPlayerControl()
cDvbPlayerControl(const char *FileName, bool PauseLive=false)
virtual bool GetReplayMode(bool &Play, bool &Forward, int &Speed)
const cMark * Get(int Position) const
int Result(uchar **Buffer)
void SetMarks(const cMarks *Marks)
bool NextFile(uint16_t FileNumber=0, off_t FileOffset=-1)
void DeviceStillPicture(const uchar *Data, int Length)
const cMark * GetNextBegin(const cMark *EndMark=NULL) const
Returns the next "begin" mark after EndMark, skipping any marks at the same position as EndMark.
static void SleepMs(int TimeoutMs)
Creates a cCondWait object and uses it to sleep for TimeoutMs milliseconds, immediately giving up the...
void bool Start(void)
Sets the description of this thread, which will be used when logging starting or stopping of the thre...
cDvbPlayer(const char *FileName, bool PauseLive)
cUnbufferedFile * Open(void)
bool Running(void)
Returns false if a derived cThread object shall leave its Action() function.
bool Wait(int TimeoutMs=0)
Waits at most TimeoutMs milliseconds for a call to Signal(), or forever if TimeoutMs is 0.
bool TimedWait(cMutex &Mutex, int TimeoutMs)
virtual bool GetFrameNumber(int &Current, int &Total)
void Request(cUnbufferedFile *File, int Length)
bool GetIndex(int &Current, int &Total, bool SnapToIFrame=false)
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
bool IsPesRecording(void) const
virtual void SetAudioTrack(eTrackType Type, const tTrackId *TrackId)
bool StoreResume(int Index)
bool DevicePoll(cPoller &Poller, int TimeoutMs=0)
bool GetReplayMode(bool &Play, bool &Forward, int &Speed)
static void SetBrokenLink(uchar *Data, int Length)
bool DeviceIsPlayingVideo(void)
int PlayTs(const uchar *Data, int Length, bool VideoOnly=false)
void DeviceTrickSpeed(int Speed, bool Forward)
uint64_t DeviceGetSTC(void)
int64_t TsGetPts(const uchar *p, int l)
int SecondsToFrames(int Seconds, double FramesPerSecond)
double FramesPerSecond(void) const
bool WaitForDataMs(int msToWait)
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL)
bool IsStillRecording(void)
void Goto(int Index, bool Still=false)
int SkipFrames(int Frames)
#define MAX_VIDEO_SLOWMOTION
~cNonBlockingFileReader()
bool GetFrameNumber(int &Current, int &Total)
void Put(uint32_t Pts, int Index, bool Independent)
int SkipFrames(int Frames)
void Cancel(int WaitSeconds=0)
Cancels the thread by first setting 'running' to false, so that the Action() loop can finish in an or...
void SkipSeconds(int Seconds)
void TrickSpeed(int Increment)
cUnbufferedFile * replayFile
int FindFrameNumber(uint32_t Pts)