home *** CD-ROM | disk | FTP | other *** search
- /*************************************************************************
- TIMECODE.cpp
-
- 03/02/08 Xiaohong
- *************************************************************************/
- #include "timecode.h"
- /*************************************************************************
- Funktionen zu Time_Code Berechnungen im System Clock Reference Format
-
- Functions for Time_Code computations in System Clock Reference Format
- *************************************************************************/
- Timecode_struc::Timecode_struc()
- {
- empty();
- }
-
- void Timecode_struc::set(const unsigned long m,const unsigned long l)
- {
- msb = m;
- lsb = l;
- }
-
- void Timecode_struc::empty(void)
- {
- msb = 0;
- lsb = 0;
- }
-
- void Timecode_struc::make(double timestamp)
- {
- if (timestamp > MAX_FFFFFFFF)
- {
- msb = 1;
- timestamp -= MAX_FFFFFFFF;
- lsb = (unsigned long)timestamp;
- }
- else
- {
- msb = 0;
- lsb = (unsigned long)timestamp;
- }
- }
-
- void Timecode_struc::write_file(HANDLE hFile)
- {
- DWORD dwResult;
- WriteFile(hFile,&msb,sizeof(msb),&dwResult,NULL);
- WriteFile(hFile,&lsb,sizeof(lsb),&dwResult,NULL);
- //fwrite(&msb,sizeof(msb),1,fp);
- //fwrite(&lsb,sizeof(lsb),1,fp);
- }
-
- bool Timecode_struc::read_file(HANDLE hFile)
- {
- // if(fread(&msb,1,sizeof(msb),fp) == sizeof(msb)
- // &&fread(&lsb,1,sizeof(lsb),fp) == sizeof(lsb))
- DWORD dwResult;
- ReadFile(hFile,&msb,sizeof(msb),&dwResult,NULL);
- if(dwResult<sizeof(msb))
- return false;
-
- ReadFile(hFile,&lsb,sizeof(lsb),&dwResult,NULL);
- if(dwResult<sizeof(lsb))
- return false;
-
- return true;
- }
-
- void Timecode_struc::buffer(const unsigned char marker,unsigned char** buffer)
- {
- unsigned char temp;
-
- temp = (unsigned char)((marker << 4) | (msb <<3) | ((lsb >> 29) & 0x6) | 1);
- *((*buffer)++)=temp;
- temp = (unsigned char)((lsb & 0x3fc00000) >> 22);
- *((*buffer)++)=temp;
- temp = (unsigned char)(((lsb & 0x003f8000) >> 14) | 1);
- *((*buffer)++)=temp;
- temp = (unsigned char)((lsb & 0x7f80) >> 7);
- *((*buffer)++)=temp;
- temp = (unsigned char)(((lsb & 0x007f) << 1) | 1);
- *((*buffer)++)=temp;
-
- }
-
- Timecode_struc& Timecode_struc::operator+(Timecode_struc& that)
- {
- unsigned long des_msb = msb, des_lsb = lsb;
- const unsigned long src_msb = that.get_msb();
- const unsigned long src_lsb = that.get_lsb();
- static Timecode_struc ret;
-
- des_msb = (src_msb ^ des_msb);
-
- if (((src_lsb & 0x80000000) & (des_lsb & 0x80000000))>>31)
- {
- des_msb = des_msb ^ 1;
- des_lsb = (des_lsb & 0x7fffffff)+(src_lsb & 0x7fffffff);
- }
- else if (((src_lsb & 0x80000000) | (des_lsb & 0x80000000))>>31)
- {
- des_msb = des_msb ^ ((((src_lsb & 0x7fffffff)+(des_lsb & 0x7fffffff)) & 0x80000000)>>31);
- des_lsb = ((des_lsb & 0x7fffffff)+(src_lsb & 0x7fffffff)^0x80000000);
- }
- else
- {
- des_lsb = des_lsb + src_lsb;
- }
-
- ret.set(des_msb,des_lsb);
-
- return ret;
- }