00001
00002 #ifndef RECORDERBASE_H_
00003 #define RECORDERBASE_H_
00004
00005 #include <qmutex.h>
00006 #include <qstring.h>
00007 #include <qmap.h>
00008 #include <qsqldatabase.h>
00009 #include <qwaitcondition.h>
00010
00011 #include <pthread.h>
00012
00013 #include "mythexp.h"
00014
00015 class TVRec;
00016 class RingBuffer;
00017 class ProgramInfo;
00018 class RecordingProfile;
00019
00032 class MPUBLIC RecorderBase
00033 {
00034 friend class Transcode;
00035
00036 public:
00037 RecorderBase(TVRec *rec);
00038 virtual ~RecorderBase();
00039
00041 void SetFrameRate(double rate)
00042 {
00043 video_frame_rate = rate;
00044 ntsc_framerate = (29.96 <= rate && 29.98 >= rate);
00045 }
00046
00056 void SetRecording(const ProgramInfo *pginfo);
00057
00064 void SetRingBuffer(RingBuffer *rbuf);
00065
00072 virtual void SetOption(const QString &opt, const QString &value);
00073
00078 virtual void SetOption(const QString &opt, int value);
00079
00086 virtual void SetVideoFilters(QString &filters) = 0;
00087
00094 virtual void SetOptionsFromProfile(RecordingProfile *profile,
00095 const QString &videodev,
00096 const QString &audiodev,
00097 const QString &vbidev) = 0;
00098
00109 virtual void SetNextRecording(const ProgramInfo*, RingBuffer*) = 0;
00110
00114 virtual void Initialize(void) = 0;
00115
00120 virtual void StartRecording(void) = 0;
00121
00127 virtual void StopRecording(void) = 0;
00128
00134 virtual void Reset(void) = 0;
00135
00137 virtual bool IsRecording(void) = 0;
00138
00140 virtual bool IsErrored(void) = 0;
00141
00147 virtual long long GetFramesWritten(void) = 0;
00148
00154 virtual bool Open(void) = 0;
00155
00164 virtual int GetVideoFd(void) = 0;
00165
00180 virtual long long GetKeyframePosition(long long desired) = 0;
00181
00189 virtual void Pause(bool clear = true)
00190 { (void) clear; request_pause = true; }
00191
00193 virtual void Unpause(void)
00194 { request_pause = false; unpauseWait.wakeAll(); }
00196 virtual bool IsPaused(void) const { return paused; }
00197 virtual bool WaitForPause(int timeout = 1000);
00198
00205 double GetFrameRate(void) { return video_frame_rate; }
00206
00209 virtual void CheckForRingBufferSwitch(void);
00210
00213 void SavePositionMap(bool force = false);
00214
00215 protected:
00219 void SetIntOption(RecordingProfile *profile, const QString &name);
00223 void SetStrOption(RecordingProfile *profile, const QString &name);
00224 virtual bool PauseAndWait(int timeout = 100);
00225
00226 virtual void ResetForNewFile(void) = 0;
00227 virtual void FinishRecording(void) = 0;
00228 virtual void StartNewFile(void) { }
00229
00232 void SetPositionMapType(int type) { positionMapType = type; }
00233
00234 TVRec *tvrec;
00235 RingBuffer *ringBuffer;
00236 bool weMadeBuffer;
00237
00238 QString videocodec;
00239 QString audiodevice;
00240 QString videodevice;
00241 QString vbidevice;
00242
00243 int vbimode;
00244 bool ntsc;
00245 bool ntsc_framerate;
00246 double video_frame_rate;
00247
00248 ProgramInfo *curRecording;
00249
00250
00251 bool request_pause;
00252 bool paused;
00253 QWaitCondition pauseWait;
00254 QWaitCondition unpauseWait;
00255
00256
00257 QMutex nextRingBufferLock;
00258 RingBuffer *nextRingBuffer;
00259 ProgramInfo *nextRecording;
00260
00261
00262 int positionMapType;
00263 QMutex positionMapLock;
00264 QMap<long long, long long> positionMap;
00265 QMap<long long, long long> positionMapDelta;
00266 };
00267
00268 #endif
00269
00270