MythTV  0.25-pre
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Friends
RecorderBase Class Reference

This is the abstract base class for supporting recorder hardware. More...

#include <recorderbase.h>

Inheritance diagram for RecorderBase:
DTVRecorder ASIRecorder CetonRecorder DVBRecorder FirewireRecorder HDHRRecorder ImportRecorder IPTVRecorder V4LRecorder

List of all members.

Public Types

enum  AspectRatio {
  ASPECT_UNKNOWN = 0x00, ASPECT_1_1 = 0x01, ASPECT_4_3 = 0x02, ASPECT_16_9 = 0x03,
  ASPECT_2_21_1 = 0x04, ASPECT_CUSTOM = 0x05
}

Public Member Functions

 RecorderBase (TVRec *rec)
virtual ~RecorderBase ()
void SetFrameRate (double rate)
 Sets the video frame rate.
void SetRecording (const ProgramInfo *pginfo)
 Changes the Recording from the one set initially with SetOptionsFromProfile().
void SetRingBuffer (RingBuffer *rbuf)
 Tells recorder to use an externally created ringbuffer.
virtual void SetOption (const QString &opt, const QString &value)
 Set an specific option.
virtual void SetOption (const QString &opt, int value)
 Set an specific integer option.
virtual void SetVideoFilters (QString &filters)=0
 Tells recorder which filters to use.
virtual void SetOptionsFromProfile (RecordingProfile *profile, const QString &videodev, const QString &audiodev, const QString &vbidev)=0
 Sets basic recorder options.
virtual void SetNextRecording (const ProgramInfo *, RingBuffer *)=0
 Sets next recording info, to be applied as soon as practical.
virtual void Initialize (void)=0
 This is called between SetOptionsFromProfile() and run() to initialize any devices, etc.
virtual void run (void)=0
 run() starts the recording process, and does not exit until the recording is complete.
virtual void Reset (void)=0
 Reset the recorder to the startup state.
virtual bool IsErrored (void)=0
 Tells us whether an unrecoverable error has been encountered.
virtual long long GetFramesWritten (void)=0
 Returns number of frames written to disk.
virtual int GetVideoFd (void)=0
 Returns file descriptor of recorder device.
int64_t GetKeyframePosition (uint64_t desired) const
 Returns closest keyframe position before the desired frame.
bool GetKeyframePositions (int64_t start, int64_t end, frm_pos_map_t &) const
virtual void StopRecording (void)
 StopRecording() signals to the recorder that it should stop recording and exit cleanly.
virtual bool IsRecording (void)
 Tells whether the StartRecorder() loop is running.
virtual bool IsRecordingRequested (void)
 Tells us if StopRecording() has been called.
virtual RecordingQualityGetRecordingQuality (void) const
 Returns a report about the current recordings quality.
virtual void Pause (bool clear=true)
 Pause tells recorder to pause, it should not block.
virtual void Unpause (void)
 Unpause tells recorder to unpause.
virtual bool IsPaused (bool holding_lock=false) const
 Returns true iff recorder is paused.
virtual bool WaitForPause (int timeout=1000)
 WaitForPause blocks until recorder is actually paused, or timeout milliseconds elapse.
double GetFrameRate (void)
 Returns an approximation of the frame rate.
virtual void CheckForRingBufferSwitch (void)
 If requested, switch to new RingBuffer/ProgramInfo objects.
void SavePositionMap (bool force=false)
 Save the seektable to the DB.

Static Public Member Functions

static RecorderBaseCreateRecorder (TVRec *tvrec, ChannelBase *channel, const RecordingProfile &profile, const GeneralDBOptions &genOpt, const DVBDBOptions &dvbOpt)

Protected Member Functions

void SetIntOption (RecordingProfile *profile, const QString &name)
 Convenience function used to set integer options from a profile.
void SetStrOption (RecordingProfile *profile, const QString &name)
 Convenience function used to set QString options from a profile.
virtual bool PauseAndWait (int timeout=100)
 If request_pause is true, sets pause and blocks up to timeout milliseconds or until unpaused, whichever is sooner.
virtual void ResetForNewFile (void)=0
virtual void ClearStatistics (void)
virtual void FinishRecording (void)=0
virtual void StartNewFile (void)
void SetPositionMapType (MarkTypes type)
 Set seektable type.
void AspectChange (uint ratio, long long frame)
 Note a change in aspect ratio in the recordedmark table.
void ResolutionChange (uint width, uint height, long long frame)
 Note a change in video size in the recordedmark table.
void FrameRateChange (uint framerate, long long frame)
 Note a change in video frame rate in the recordedmark table.
void SetDuration (uint64_t duration)
 Note the total duration in the recordedmark table.

Protected Attributes

TVRectvrec
RingBufferringBuffer
bool weMadeBuffer
QString videocodec
QString videodevice
bool ntsc
bool ntsc_framerate
double video_frame_rate
uint m_videoAspect
uint m_videoHeight
uint m_videoWidth
double m_frameRate
ProgramInfocurRecording
QMutex pauseLock
bool request_pause
bool paused
QWaitCondition pauseWait
QWaitCondition unpauseWait
bool request_recording
 True if API call has requested a recording be [re]started.
bool recording
 True while recording is actually being performed.
QWaitCondition recordingWait
QMutex nextRingBufferLock
RingBuffernextRingBuffer
ProgramInfonextRecording
MarkTypes positionMapType
QMutex positionMapLock
frm_pos_map_t positionMap
frm_pos_map_t positionMapDelta
MythTimer positionMapTimer
QMutex statisticsLock
QDateTime timeOfFirstData
QDateTime timeOfLatestData
RecordingGaps recordingGaps

Friends

class Transcode

Detailed Description

This is the abstract base class for supporting recorder hardware.

For a digital streams specialization, see the DTVRecorder. For a specialization for MPEG hardware encoded analog streams, see MpegRecorder. For a specialization for software encoding of frame grabber recorders, see NuppelVideoRecorder.

See also:
TVRec

Definition at line 41 of file recorderbase.h.


Member Enumeration Documentation

Enumerator:
ASPECT_UNKNOWN 
ASPECT_1_1 
ASPECT_4_3 
ASPECT_16_9 
ASPECT_2_21_1 
ASPECT_CUSTOM 

Definition at line 205 of file recorderbase.h.


Constructor & Destructor Documentation

Definition at line 39 of file recorderbase.cpp.

Definition at line 57 of file recorderbase.cpp.


Member Function Documentation

void RecorderBase::SetFrameRate ( double  rate) [inline]

Sets the video frame rate.

Definition at line 50 of file recorderbase.h.

Referenced by SetOption(), and Transcode::TranscodeFile().

Changes the Recording from the one set initially with SetOptionsFromProfile().

This method is useful for LiveTV, when we do not want to pause the recorder for a SetOptionsFromProfile() call just because a new program is comming on.

See also:
ChannelNameChanged(const QString&)

Definition at line 81 of file recorderbase.cpp.

Referenced by CheckForRingBufferSwitch(), TVRec::TuningNewRecorder(), TVRec::TuningRestartRecorder(), and ~RecorderBase().

Tells recorder to use an externally created ringbuffer.

If this an external RingBuffer is set, it should be before any Initialize(), Open(), or StartRecorder() calls. Externally created RingBuffers are not deleted in the Recorder's destructor.

Definition at line 67 of file recorderbase.cpp.

Referenced by CheckForRingBufferSwitch(), Transcode::TranscodeFile(), TVRec::TuningFrequency(), TVRec::TuningNewRecorder(), and TVRec::TuningRestartRecorder().

void RecorderBase::SetOption ( const QString &  opt,
const QString &  value 
) [virtual]

Set an specific option.

Base options include: codec, videodevice, tvformat (ntsc,ntsc-jp,pal-m), vbiformat ("none","pal teletext","ntsc").

Reimplemented in NuppelVideoRecorder, DTVRecorder, V4LRecorder, and MpegRecorder.

Definition at line 99 of file recorderbase.cpp.

Referenced by CreateRecorder(), SetIntOption(), and SetStrOption().

void RecorderBase::SetOption ( const QString &  opt,
int  value 
) [virtual]

Set an specific integer option.

There are no integer options in RecorderBase.

Reimplemented in NuppelVideoRecorder, ASIRecorder, DTVRecorder, V4LRecorder, and MpegRecorder.

Definition at line 138 of file recorderbase.cpp.

virtual void RecorderBase::SetVideoFilters ( QString &  filters) [pure virtual]

Tells recorder which filters to use.

These filters are used by frame grabber encoders to lower the bitrate while keeping quality good. They must execute quickly so that frames are not lost by the recorder.

Implemented in NuppelVideoRecorder, DTVRecorder, and MpegRecorder.

Referenced by TVRec::SetVideoFiltersForChannel().

virtual void RecorderBase::SetOptionsFromProfile ( RecordingProfile profile,
const QString &  videodev,
const QString &  audiodev,
const QString &  vbidev 
) [pure virtual]

Sets basic recorder options.

SetOptionsFromProfile is used to tell the recorder about the recording profile as well as the devices to use.

Implemented in NuppelVideoRecorder, ASIRecorder, FirewireRecorder, DTVRecorder, IPTVRecorder, ImportRecorder, and MpegRecorder.

Referenced by CreateRecorder().

virtual void RecorderBase::SetNextRecording ( const ProgramInfo ,
RingBuffer  
) [pure virtual]

Sets next recording info, to be applied as soon as practical.

This should not lose any frames on the switchover, and should initialize the RingBuffer stream with headers as appropriate.

The switch does not have to happen immediately, but should happen soon. (i.e. it can wait for a key frame..)

This calls TVRec::RingBufferChanged() when the switch happens.

Implemented in NuppelVideoRecorder, and DTVRecorder.

Referenced by TVRec::SwitchLiveTVRingBuffer(), and TVRec::SwitchRecordingRingBuffer().

virtual void RecorderBase::Initialize ( void  ) [pure virtual]

This is called between SetOptionsFromProfile() and run() to initialize any devices, etc.

Implemented in NuppelVideoRecorder, DTVRecorder, and MpegRecorder.

Referenced by TVRec::TuningNewRecorder().

virtual void RecorderBase::run ( void  ) [pure virtual]

run() starts the recording process, and does not exit until the recording is complete.

See also:
StopRecording()

Implemented in NuppelVideoRecorder, ASIRecorder, FirewireRecorder, ImportRecorder, IPTVRecorder, MpegRecorder, DVBRecorder, CetonRecorder, and HDHRRecorder.

virtual void RecorderBase::Reset ( void  ) [pure virtual]

Reset the recorder to the startup state.

This is used after Pause(bool), WaitForPause() and after the RingBuffer's StopReads() method has been called.

Implemented in NuppelVideoRecorder, DTVRecorder, and MpegRecorder.

Referenced by TVRec::TuningRestartRecorder().

virtual bool RecorderBase::IsErrored ( void  ) [pure virtual]

Tells us whether an unrecoverable error has been encountered.

Implemented in DTVRecorder.

Referenced by TVRec::run(), and TVRec::TuningNewRecorder().

virtual long long RecorderBase::GetFramesWritten ( void  ) [pure virtual]

Returns number of frames written to disk.

It is not always safe to seek up to this frame in a player because frames may not be written in display order.

Implemented in NuppelVideoRecorder, and DTVRecorder.

Referenced by TVRec::GetFramesWritten().

virtual int RecorderBase::GetVideoFd ( void  ) [pure virtual]

Returns file descriptor of recorder device.

This is used by channel when only one open file descriptor is allowed on a device node. This is the case with video4linux devices and similar devices in BSD. It is not needed by newer drivers, such as those used for DVB.

Implemented in NuppelVideoRecorder, DTVRecorder, and MpegRecorder.

Referenced by TVRec::TuningNewRecorder(), and TVRec::TuningRestartRecorder().

Returns closest keyframe position before the desired frame.

This returns -1 if a keyframe position cannot be found for a frame. This could be true if the keyframe has not yet been seen by the recorder(unlikely), or if a keyframe map does not exist or is not up to date. The latter can happen because the video is an external video, because the database is corrupted, or because this is a live recording and it is being read by a remote frontend faster than the keyframes can be saved to the database.

Returns:
Closest prior keyframe, or -1 if there is no prior known keyframe.

Definition at line 344 of file recorderbase.cpp.

Referenced by TVRec::GetKeyframePosition().

Definition at line 364 of file recorderbase.cpp.

Referenced by TVRec::GetKeyframePositions().

StopRecording() signals to the recorder that it should stop recording and exit cleanly.

This function should block until recorder has finished up.

Reimplemented in MpegRecorder, and V4LRecorder.

Definition at line 170 of file recorderbase.cpp.

Referenced by TVRec::TeardownRecorder(), DTVRecorder::~DTVRecorder(), and IPTVRecorder::~IPTVRecorder().

Tells whether the StartRecorder() loop is running.

Reimplemented in NuppelVideoRecorder, and MpegRecorder.

Definition at line 189 of file recorderbase.cpp.

Referenced by TVRec::IsReallyRecording(), and TVRec::TuningNewRecorder().

Returns a report about the current recordings quality.

Reimplemented in DTVRecorder.

Definition at line 336 of file recorderbase.cpp.

Referenced by CheckForRingBufferSwitch(), and TVRec::TeardownRecorder().

void RecorderBase::Pause ( bool  clear = true) [virtual]

Pause tells recorder to pause, it should not block.

Once paused the recorder calls tvrec->RecorderPaused().

Parameters:
clearif true any generated timecodes should be reset.
See also:
Unpause(), WaitForPause()

Reimplemented in NuppelVideoRecorder, and MpegRecorder.

Definition at line 209 of file recorderbase.cpp.

Referenced by TVRec::PauseRecorder().

void RecorderBase::Unpause ( void  ) [virtual]

Unpause tells recorder to unpause.

This is an asynchronous call it should not wait block waiting for the command to be processed.

Definition at line 220 of file recorderbase.cpp.

Referenced by TVRec::TuningRestartRecorder().

bool RecorderBase::IsPaused ( bool  holding_lock = false) const [virtual]
bool RecorderBase::WaitForPause ( int  timeout = 1000) [virtual]

WaitForPause blocks until recorder is actually paused, or timeout milliseconds elapse.

Parameters:
timeoutnumber of milliseconds to wait defaults to 1000.
Returns:
true iff pause happened within timeout period.

Definition at line 244 of file recorderbase.cpp.

double RecorderBase::GetFrameRate ( void  ) [inline]

Returns an approximation of the frame rate.

Bug:
This can be off by at least half, our non-frame grabber based recorders do not not try to approximate the frame rate. So a 720p recording at 60fps will report a frame-rate of 25fps.

Definition at line 195 of file recorderbase.h.

Referenced by TVRec::GetFramerate().

If requested, switch to new RingBuffer/ProgramInfo objects.

Definition at line 297 of file recorderbase.cpp.

Referenced by NuppelVideoRecorder::doWriteThread(), DTVRecorder::HandleH264Keyframe(), DTVRecorder::HandleKeyframe(), and TVRec::SwitchLiveTVRingBuffer().

Save the seektable to the DB.

This saves the postition map delta to the database if force is true or there are 30 frames in the map or there are five frames in the map with less than 30 frames in the non-delta position map.

Parameters:
forceIf true this forces a DB sync.

Definition at line 393 of file recorderbase.cpp.

Referenced by DTVRecorder::FinishRecording(), NuppelVideoRecorder::FinishRecording(), TVRec::run(), DTVRecorder::SetNextRecording(), and NuppelVideoRecorder::SetNextRecording().

RecorderBase * RecorderBase::CreateRecorder ( TVRec tvrec,
ChannelBase channel,
const RecordingProfile profile,
const GeneralDBOptions genOpt,
const DVBDBOptions dvbOpt 
) [static]

Definition at line 479 of file recorderbase.cpp.

Referenced by TVRec::TuningNewRecorder().

void RecorderBase::SetIntOption ( RecordingProfile profile,
const QString &  name 
) [protected]

Convenience function used to set integer options from a profile.

See also:
SetOption(const QString&, int)

Reimplemented in MpegRecorder.

Definition at line 145 of file recorderbase.cpp.

Referenced by ASIRecorder::SetOptionsFromProfile(), NuppelVideoRecorder::SetOptionsFromProfile(), and Transcode::TranscodeFile().

void RecorderBase::SetStrOption ( RecordingProfile profile,
const QString &  name 
) [protected]

Convenience function used to set QString options from a profile.

See also:
SetOption(const QString&, const QString&)

Reimplemented in MpegRecorder.

Definition at line 155 of file recorderbase.cpp.

Referenced by DTVRecorder::SetOptionsFromProfile().

bool RecorderBase::PauseAndWait ( int  timeout = 100) [protected, virtual]

If request_pause is true, sets pause and blocks up to timeout milliseconds or until unpaused, whichever is sooner.

This is the where we actually do the pausing. For most recorders that need to do something special on pause, this is the method to overide.

Parameters:
timeoutnumber of milliseconds to wait defaults to 100.
Returns:
true if recorder is paused.

Reimplemented in FirewireRecorder, IPTVRecorder, MpegRecorder, CetonRecorder, HDHRRecorder, and DVBRecorder.

Definition at line 272 of file recorderbase.cpp.

Referenced by ASIRecorder::run(), and V4LRecorder::RunVBIDevice().

virtual void RecorderBase::ResetForNewFile ( void  ) [protected, pure virtual]

Implemented in NuppelVideoRecorder, and DTVRecorder.

Referenced by CheckForRingBufferSwitch().

void RecorderBase::ClearStatistics ( void  ) [protected, virtual]

Reimplemented in DTVRecorder.

Definition at line 328 of file recorderbase.cpp.

Referenced by RecorderBase().

virtual void RecorderBase::FinishRecording ( void  ) [protected, pure virtual]

Implemented in NuppelVideoRecorder, and DTVRecorder.

Referenced by CheckForRingBufferSwitch().

virtual void RecorderBase::StartNewFile ( void  ) [inline, protected, virtual]

Reimplemented in NuppelVideoRecorder.

Definition at line 235 of file recorderbase.h.

Referenced by CheckForRingBufferSwitch().

void RecorderBase::SetPositionMapType ( MarkTypes  type) [inline, protected]

Set seektable type.

Definition at line 239 of file recorderbase.h.

Referenced by DTVRecorder::DTVRecorder(), and NuppelVideoRecorder::NuppelVideoRecorder().

void RecorderBase::AspectChange ( uint  ratio,
long long  frame 
) [protected]

Note a change in aspect ratio in the recordedmark table.

Definition at line 436 of file recorderbase.cpp.

Referenced by DTVRecorder::FindH264Keyframes(), DTVRecorder::FindMPEG2Keyframes(), DTVRecorder::FindPSKeyFrames(), and NuppelVideoRecorder::UpdateResolutions().

void RecorderBase::ResolutionChange ( uint  width,
uint  height,
long long  frame 
) [protected]

Note a change in video size in the recordedmark table.

Definition at line 459 of file recorderbase.cpp.

Referenced by DTVRecorder::FindH264Keyframes(), DTVRecorder::FindMPEG2Keyframes(), DTVRecorder::FindPSKeyFrames(), and NuppelVideoRecorder::UpdateResolutions().

void RecorderBase::FrameRateChange ( uint  framerate,
long long  frame 
) [protected]

Note a change in video frame rate in the recordedmark table.

Definition at line 465 of file recorderbase.cpp.

Referenced by DTVRecorder::FindH264Keyframes(), DTVRecorder::FindMPEG2Keyframes(), DTVRecorder::FindPSKeyFrames(), and NuppelVideoRecorder::UpdateResolutions().

void RecorderBase::SetDuration ( uint64_t  duration) [protected]

Note the total duration in the recordedmark table.

Definition at line 471 of file recorderbase.cpp.


Friends And Related Function Documentation

friend class Transcode [friend]

Definition at line 43 of file recorderbase.h.


Member Data Documentation

TVRec* RecorderBase::tvrec [protected]
QString RecorderBase::videocodec [protected]
QString RecorderBase::videodevice [protected]
bool RecorderBase::ntsc [protected]

Definition at line 265 of file recorderbase.h.

Referenced by NuppelVideoRecorder::BufferIt().

double RecorderBase::video_frame_rate [protected]
double RecorderBase::m_frameRate [protected]
QMutex RecorderBase::pauseLock [mutable, protected]
QWaitCondition RecorderBase::pauseWait [protected]
QWaitCondition RecorderBase::unpauseWait [protected]
QWaitCondition RecorderBase::recordingWait [protected]

Definition at line 295 of file recorderbase.h.

Referenced by SavePositionMap().

QMutex RecorderBase::positionMapLock [mutable, protected]

Definition at line 299 of file recorderbase.h.

Referenced by SavePositionMap().

QMutex RecorderBase::statisticsLock [mutable, protected]
QDateTime RecorderBase::timeOfFirstData [protected]
QDateTime RecorderBase::timeOfLatestData [protected]

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends