| class QTimeCode | .h |
| constructor | QTimeCode(int _type)Create a timecode keeper Timecode types are directly mapped to SGI's definitions Default type is TC_PAL25 (no dropframe) |
| destructor | ~QTimeCode() |
| ToString | bool ToString(string d)Generate a string in the form 00:00:00:00 |
| FromString | bool FromString(cstring src) |
| GetString | cstring GetString()Returns static string representation of timecode (convenience) |
| Reset | void Reset()Reset to 0 |
| Set | bool Set(int frames)Set timecode to exact frame |
| Add | bool Add(QTimeCode *tc,int *overflow)Adds two timecodes If 'overflow' is passed, any overflow is stored there |
| Add | bool Add(int frames,int *overunderflow)Adds the number of frames to the timecode (frames may be <0) If 'overunderflow' is passed, any over/underflow is stored there |
| FramesBetween | int FramesBetween(QTimeCode *tc) |
| DbgPrint | void DbgPrint(cstring s) |
/*
* QTimeCode - audio/video timecodes
* 31-03-2000: Created! (13:24:01)
* NOTES:
* - A wrapper around SGI's dmTC routines
* - A DMtimecode (sys/dmcommon.h) contains hour,minute,second,frame,tc_type
* (C) MarketGraph/RvG
*/
#include <qlib/timecode.h>
#pragma hdrstop
#include <qlib/debug.h>
DEBUG_ENABLE
QTimeCode::QTimeCode(int _type)
// Create a timecode keeper
// Timecode types are directly mapped to SGI's definitions
// Default type is TC_PAL25 (no dropframe)
{
type=_type;
memset(&ostc,0,sizeof(ostc));
ostc.tc_type=type;
}
QTimeCode::~QTimeCode()
{
}
/**********
* TEXTUAL *
**********/
bool QTimeCode::ToString(string d)
// Generate a string in the form 00:00:00:00
{
DMstatus r;
r=dmTCToString(d,&ostc);
if(r==DM_FAILURE)
{ qwarn("QTimeCode:ToString() failed");
}
return r==DM_SUCCESS;
}
bool QTimeCode::FromString(cstring src)
{
DMstatus r;
r=dmTCFromString(&ostc,src,type);
return r==DM_SUCCESS;
}
cstring QTimeCode::GetString()
// Returns static string representation of timecode (convenience)
{
static char buf[12];
if(!ToString(buf))
strcpy(buf,"00:00:00:00");
return buf;
}
/*******
* MATH *
*******/
void QTimeCode::Reset()
// Reset to 0
{
ostc.hour=0;
ostc.minute=0;
ostc.second=0;
ostc.frame=0;
}
bool QTimeCode::Set(int frames)
// Set timecode to exact frame
{
bool r;
Reset();
r=Add(frames);
return r;
}
bool QTimeCode::Add(QTimeCode *tc,int *overflow)
// Adds two timecodes
// If 'overflow' is passed, any overflow is stored there
{
DMstatus r;
int dummy;
r=dmTCAddTC(&ostc,&ostc,tc->GetOSTC(),overflow?overflow:&dummy);
if(r==DM_FAILURE)
{ qwarn("QTimeCode:Add(tc) failed");
}
return r==DM_SUCCESS;
}
bool QTimeCode::Add(int frames,int *overunderflow)
// Adds the number of frames to the timecode (frames may be <0)
// If 'overunderflow' is passed, any over/underflow is stored there
{
DMstatus r;
int dummy;
r=dmTCAddFrames(&ostc,&ostc,frames,overunderflow?overunderflow:&dummy);
if(r==DM_FAILURE)
{ qwarn("QTimeCode:Add(frames) failed");
}
return r==DM_SUCCESS;
}
int QTimeCode::FramesBetween(QTimeCode *tc)
{
DMstatus r;
int frames;
r=dmTCFramesBetween(&frames,&ostc,tc->GetOSTC());
if(r==DM_FAILURE)
{ // Error
frames=0;
}
return frames;
}
void QTimeCode::DbgPrint(cstring s)
{
qdbg("%s: %02d:%02d:%02d:%02d\n",s,ostc.hour,ostc.minute,ostc.second,
ostc.frame);
}