home *** CD-ROM | disk | FTP | other *** search
/ Netrunner 2004 October / NETRUNNER0410.ISO / regular / dctm.lzh / DCTM / source.lzh / source / TIMECODE.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  2003-02-08  |  2.9 KB  |  113 lines

  1. /*************************************************************************
  2.     TIMECODE.cpp
  3.  
  4.     03/02/08    Xiaohong
  5. *************************************************************************/
  6. #include "timecode.h"
  7. /*************************************************************************
  8.     Funktionen zu Time_Code Berechnungen im System Clock Reference Format
  9.  
  10.     Functions for Time_Code computations in System Clock Reference Format
  11. *************************************************************************/
  12. Timecode_struc::Timecode_struc()
  13. {
  14.     empty();
  15. }
  16.  
  17. void Timecode_struc::set(const unsigned long m,const unsigned long l)
  18. {
  19.     msb = m;
  20.     lsb = l;
  21. }
  22.  
  23. void Timecode_struc::empty(void)
  24. {
  25.     msb = 0;
  26.     lsb = 0;
  27. }
  28.  
  29. void Timecode_struc::make(double timestamp)
  30. {
  31.     if (timestamp > MAX_FFFFFFFF)
  32.     {
  33.         msb = 1;
  34.         timestamp -= MAX_FFFFFFFF;
  35.         lsb = (unsigned long)timestamp;
  36.     }
  37.     else
  38.     {
  39.         msb = 0;
  40.         lsb = (unsigned long)timestamp;
  41.     }
  42. }
  43.  
  44. void Timecode_struc::write_file(HANDLE hFile)
  45. {
  46.     DWORD dwResult;
  47.     WriteFile(hFile,&msb,sizeof(msb),&dwResult,NULL);
  48.     WriteFile(hFile,&lsb,sizeof(lsb),&dwResult,NULL);
  49.     //fwrite(&msb,sizeof(msb),1,fp);
  50.     //fwrite(&lsb,sizeof(lsb),1,fp);
  51. }
  52.  
  53. bool Timecode_struc::read_file(HANDLE hFile)
  54. {
  55. //    if(fread(&msb,1,sizeof(msb),fp) == sizeof(msb)
  56. //        &&fread(&lsb,1,sizeof(lsb),fp) == sizeof(lsb))
  57.     DWORD dwResult;
  58.     ReadFile(hFile,&msb,sizeof(msb),&dwResult,NULL);
  59.     if(dwResult<sizeof(msb))
  60.         return false;
  61.  
  62.     ReadFile(hFile,&lsb,sizeof(lsb),&dwResult,NULL);
  63.     if(dwResult<sizeof(lsb))
  64.         return false;
  65.  
  66.     return true;
  67. }
  68.  
  69. void Timecode_struc::buffer(const unsigned char marker,unsigned char** buffer)
  70. {
  71.     unsigned char temp;
  72.  
  73.     temp = (unsigned char)((marker << 4) | (msb <<3) | ((lsb >> 29) & 0x6) | 1);
  74.     *((*buffer)++)=temp;
  75.     temp = (unsigned char)((lsb & 0x3fc00000) >> 22);
  76.     *((*buffer)++)=temp;
  77.     temp = (unsigned char)(((lsb & 0x003f8000) >> 14) | 1);
  78.     *((*buffer)++)=temp;
  79.     temp = (unsigned char)((lsb & 0x7f80) >> 7);
  80.     *((*buffer)++)=temp;
  81.     temp = (unsigned char)(((lsb & 0x007f) << 1) | 1);
  82.     *((*buffer)++)=temp;
  83.  
  84. }
  85.  
  86. Timecode_struc& Timecode_struc::operator+(Timecode_struc& that)
  87. {
  88.     unsigned long des_msb = msb, des_lsb = lsb;
  89.     const unsigned long src_msb = that.get_msb();
  90.     const unsigned long src_lsb = that.get_lsb();
  91.     static Timecode_struc ret;
  92.     
  93.     des_msb = (src_msb ^ des_msb);
  94.  
  95.     if (((src_lsb & 0x80000000) & (des_lsb & 0x80000000))>>31)
  96.     {
  97.         des_msb = des_msb ^ 1;
  98.         des_lsb = (des_lsb & 0x7fffffff)+(src_lsb & 0x7fffffff);
  99.     }
  100.     else if (((src_lsb & 0x80000000) | (des_lsb & 0x80000000))>>31)
  101.     {
  102.         des_msb = des_msb ^ ((((src_lsb & 0x7fffffff)+(des_lsb & 0x7fffffff)) & 0x80000000)>>31);
  103.         des_lsb = ((des_lsb & 0x7fffffff)+(src_lsb & 0x7fffffff)^0x80000000);
  104.     }
  105.     else
  106.     {
  107.         des_lsb = des_lsb + src_lsb;
  108.     }
  109.     
  110.     ret.set(des_msb,des_lsb);
  111.  
  112.     return ret;
  113. }