RecorderBase Class Reference

#include <recorderbase.h>

Inheritance diagram for RecorderBase:

DTVRecorder NuppelVideoRecorder DVBRecorder FirewireRecorder HDHRRecorder ImportRecorder IPTVRecorder MpegRecorder

List of all members.


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 35 of file recorderbase.h.


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 StartRecording() to initialize any devices, etc.
virtual void StartRecording (void)=0
 StartRecording() starts the recording process, and does not exit until the recording is complete.
virtual void StopRecording (void)=0
 StopRecording() signals to the StartRecording() function that it should stop recording and exit cleanly.
virtual void Reset (void)=0
 Reset the recorder to the startup state.
virtual bool IsRecording (void)=0
 Tells whether the StartRecorder() loop is running.
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 bool Open (void)=0
 Open devices needed by recorder.
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 Pause (bool clear=true)
 Pause tells StartRecording() to pause, it should not block.
virtual void Unpause (void)
 Unpause tells StartRecording() to unpause, it should not block.
virtual bool IsPaused (void) const
 Returns true iff recorder is paused.
virtual bool WaitForPause (int timeout=1000)
 WaitForPause blocks until StartRecording() 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.

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 Paused and blocks up to timeout milliseconds.
virtual void ResetForNewFile (void)=0
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.

Protected Attributes

TVRectvrec
RingBufferringBuffer
bool weMadeBuffer
QString videocodec
QString audiodevice
QString videodevice
QString vbidevice
int vbimode
bool ntsc
bool ntsc_framerate
double video_frame_rate
uint m_videoAspect
uint m_videoHeight
uint m_videoWidth
double m_frameRate
ProgramInfocurRecording
bool request_pause
bool paused
QWaitCondition pauseWait
QWaitCondition unpauseWait
QMutex nextRingBufferLock
RingBuffernextRingBuffer
ProgramInfonextRecording
MarkTypes positionMapType
QMutex positionMapLock
frm_pos_map_t positionMap
frm_pos_map_t positionMapDelta
MythTimer positionMapTimer

Friends

class Transcode

Member Enumeration Documentation

Enumerator:
ASPECT_UNKNOWN 
ASPECT_1_1 
ASPECT_4_3 
ASPECT_16_9 
ASPECT_2_21_1 
ASPECT_CUSTOM 

Definition at line 220 of file recorderbase.h.


Constructor & Destructor Documentation

RecorderBase::RecorderBase ( TVRec rec  ) 

Definition at line 29 of file recorderbase.cpp.

RecorderBase::~RecorderBase ( void   )  [virtual]

Definition at line 47 of file recorderbase.cpp.


Member Function Documentation

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

Sets the video frame rate.

Definition at line 44 of file recorderbase.h.

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

void RecorderBase::SetRecording ( const ProgramInfo pginfo  ) 

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 70 of file recorderbase.cpp.

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

void RecorderBase::SetRingBuffer ( RingBuffer rbuf  ) 

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 57 of file recorderbase.cpp.

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

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

Set an specific option.

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

Reimplemented in DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Definition at line 88 of file recorderbase.cpp.

Referenced by SetIntOption(), NuppelVideoRecorder::SetOption(), MpegRecorder::SetOption(), DTVRecorder::SetOption(), SetStrOption(), and TVRec::SetupRecorder().

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

Set an specific integer option.

There are no integer options in RecorderBase.

Reimplemented in DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Definition at line 134 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 DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

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 DVBRecorder, FirewireRecorder, HDHRRecorder, ImportRecorder, IPTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Referenced by TVRec::SetupRecorder().

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 DTVRecorder, and NuppelVideoRecorder.

Referenced by TVRec::SwitchLiveTVRingBuffer().

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

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

Implemented in DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Referenced by TVRec::SetupRecorder().

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

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

See also:
StopRecording()

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

Referenced by TVRec::RecorderThread().

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

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

This function should block until StartRecording() has finished up.

Implemented in DTVRecorder, DVBRecorder, HDHRRecorder, ImportRecorder, IPTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Referenced by TVRec::TeardownRecorder().

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 DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Referenced by TVRec::TuningRestartRecorder().

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

Tells whether the StartRecorder() loop is running.

Implemented in DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

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

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

Tells us whether an unrecoverable error has been encountered.

Implemented in DTVRecorder, and NuppelVideoRecorder.

Referenced by TVRec::RunTV(), TVRec::SetupRecorder(), 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 DTVRecorder, and NuppelVideoRecorder.

Referenced by TVRec::GetFramesWritten().

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

Open devices needed by recorder.

This is usually called by StartRecording().

Returns:
true if device was successfully opened.

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

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 DTVRecorder, MpegRecorder, and NuppelVideoRecorder.

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

int64_t RecorderBase::GetKeyframePosition ( uint64_t  desired  )  const

Returns closest keyframe position before the desired frame.

This returns -1 if a keyframe position can not 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 250 of file recorderbase.cpp.

Referenced by TVRec::GetKeyframePosition().

bool RecorderBase::GetKeyframePositions ( int64_t  start,
int64_t  end,
frm_pos_map_t map 
) const

Definition at line 270 of file recorderbase.cpp.

Referenced by TVRec::GetKeyframePositions().

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

Pause tells StartRecording() to pause, it should not block.

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

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

Reimplemented in IPTVRecorder, MpegRecorder, and NuppelVideoRecorder.

Definition at line 194 of file recorderbase.h.

Referenced by IPTVRecorder::Pause(), and TVRec::PauseRecorder().

virtual void RecorderBase::Unpause ( void   )  [inline, virtual]

Unpause tells StartRecording() to unpause, it should not block.

Reimplemented in IPTVRecorder, and NuppelVideoRecorder.

Definition at line 198 of file recorderbase.h.

Referenced by TVRec::TuningRestartRecorder(), and IPTVRecorder::Unpause().

virtual bool RecorderBase::IsPaused ( void   )  const [inline, virtual]

Returns true iff recorder is paused.

Reimplemented in NuppelVideoRecorder.

Definition at line 201 of file recorderbase.h.

Referenced by IPTVRecorder::AddData(), TVRec::HandleTuning(), and WaitForPause().

bool RecorderBase::WaitForPause ( int  timeout = 1000  )  [virtual]

WaitForPause blocks until StartRecording() is actually paused, or timeout milliseconds elapse.

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

Definition at line 167 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 210 of file recorderbase.h.

Referenced by TVRec::GetFramerate().

void RecorderBase::CheckForRingBufferSwitch ( void   )  [virtual]

If requested, switch to new RingBuffer/ProgramInfo objects.

Definition at line 220 of file recorderbase.cpp.

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

void RecorderBase::SavePositionMap ( bool  force = false  ) 

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:
force If true this forces a DB sync.

Definition at line 299 of file recorderbase.cpp.

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

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 141 of file recorderbase.cpp.

Referenced by 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 151 of file recorderbase.cpp.

Referenced by DVBRecorder::SetOptionsFromProfile().

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

If request_pause is true Paused and blocks up to timeout milliseconds.

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

Reimplemented in DVBRecorder, FirewireRecorder, HDHRRecorder, and MpegRecorder.

Definition at line 196 of file recorderbase.cpp.

Referenced by IPTVRecorder::StartRecording().

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

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

Implemented in DTVRecorder, and NuppelVideoRecorder.

Referenced by CheckForRingBufferSwitch().

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

Reimplemented in NuppelVideoRecorder.

Definition at line 242 of file recorderbase.h.

Referenced by CheckForRingBufferSwitch().

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

Set seektable type.

Definition at line 246 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 342 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 367 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 373 of file recorderbase.cpp.

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


Friends And Related Function Documentation

friend class Transcode [friend]

Definition at line 37 of file recorderbase.h.


Member Data Documentation

TVRec* RecorderBase::tvrec [protected]

Definition at line 261 of file recorderbase.h.

Referenced by HDHRRecorder::BufferedWrite(), DVBRecorder::BufferedWrite(), DTVRecorder::BufferedWrite(), CheckForRingBufferSwitch(), NuppelVideoRecorder::CreateNuppelFile(), DTVRecorder::FindAudioKeyframes(), DTVRecorder::FindH264Keyframes(), DTVRecorder::FindMPEG2Keyframes(), DTVRecorder::FindOtherKeyframes(), DTVRecorder::FindPSKeyFrames(), NuppelVideoRecorder::FinishRecording(), DTVRecorder::FinishRecording(), DTVRecorder::HandleKeyframe(), MpegRecorder::HandleSingleProgramPAT(), HDHRRecorder::HandleSingleProgramPAT(), DVBRecorder::HandleSingleProgramPAT(), MpegRecorder::HandleSingleProgramPMT(), HDHRRecorder::HandleSingleProgramPMT(), DVBRecorder::HandleSingleProgramPMT(), NuppelVideoRecorder::Initialize(), MpegRecorder::ProcessAudioTSPacket(), HDHRRecorder::ProcessAudioTSPacket(), DVBRecorder::ProcessAudioTSPacket(), MpegRecorder::ProcessVideoTSPacket(), HDHRRecorder::ProcessVideoTSPacket(), DVBRecorder::ProcessVideoTSPacket(), SavePositionMap(), NuppelVideoRecorder::SetNextRecording(), DTVRecorder::SetNextRecording(), SetRingBuffer(), NuppelVideoRecorder::StartRecording(), ImportRecorder::StartRecording(), NuppelVideoRecorder::UpdateSeekTable(), NuppelVideoRecorder::WriteAudio(), NuppelVideoRecorder::WriteFileHeader(), NuppelVideoRecorder::WriteFrameheader(), NuppelVideoRecorder::WriteHeader(), NuppelVideoRecorder::WriteKeyFrameAdjustTable(), NuppelVideoRecorder::WriteSeekTable(), NuppelVideoRecorder::WriteText(), NuppelVideoRecorder::WriteVideo(), NuppelVideoRecorder::~NuppelVideoRecorder(), and ~RecorderBase().

QString RecorderBase::videocodec [protected]

QString RecorderBase::audiodevice [protected]

QString RecorderBase::videodevice [protected]

QString RecorderBase::vbidevice [protected]

Definition at line 267 of file recorderbase.h.

Referenced by NuppelVideoRecorder::doVbiThread(), and SetOption().

int RecorderBase::vbimode [protected]

Definition at line 269 of file recorderbase.h.

bool RecorderBase::ntsc [protected]

double RecorderBase::video_frame_rate [protected]

double RecorderBase::m_frameRate [protected]

QWaitCondition RecorderBase::pauseWait [protected]

QWaitCondition RecorderBase::unpauseWait [protected]

Definition at line 294 of file recorderbase.h.

Referenced by SavePositionMap().

QMutex RecorderBase::positionMapLock [mutable, protected]

Definition at line 298 of file recorderbase.h.

Referenced by SavePositionMap().


The documentation for this class was generated from the following files:

Generated on Sat Sep 4 06:39:53 2010 for MythTV by  doxygen 1.5.5