fposrec.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:2k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "systems.h"
  2. #include "fposrec.h"
  3. CFilePosRecorder::CFilePosRecorder (void)
  4. {
  5.   m_first = m_last = NULL;
  6. }
  7. CFilePosRecorder::~CFilePosRecorder (void)
  8. {
  9.   frame_file_pos_t *ptr;
  10.   while (m_first != NULL) {
  11.     ptr = m_first;
  12.     m_first = m_first->next;
  13.     free(ptr);
  14.   }
  15.   m_last = NULL;
  16. }
  17. void CFilePosRecorder::record_point (long file_position,
  18.      uint64_t ts, 
  19.      uint64_t frame)
  20. {
  21.   frame_file_pos_t *ptr;
  22.   if (m_first == NULL) {
  23.     m_first = m_last = (frame_file_pos_t *)malloc(sizeof(frame_file_pos_t));
  24.     ptr = m_first;
  25.     ptr->next = NULL;
  26.   } else {
  27.     if (ts == m_last->timestamp) {
  28.       return;
  29.     } else if (ts > m_last->timestamp) {
  30.       m_last->next = (frame_file_pos_t *)malloc(sizeof(frame_file_pos_t));
  31.       m_last = m_last->next;
  32.       ptr = m_last;
  33.       ptr->next = NULL;
  34.     } else if (ts == m_first->timestamp) {
  35.       return;
  36.     } else if (ts < m_first->timestamp) {
  37.       ptr = (frame_file_pos_t *)malloc(sizeof(frame_file_pos_t));
  38.       ptr->next = m_first;
  39.       m_first = ptr;
  40.     } else {
  41.       frame_file_pos_t *p, *q;
  42.       ptr = NULL;
  43.       q = m_first;
  44.       p = m_first->next;
  45.       while (ptr == NULL) {
  46. if (ts == p->timestamp)
  47.   return;
  48. if (ts < p->timestamp) {
  49.   ptr = (frame_file_pos_t *)malloc(sizeof(frame_file_pos_t));
  50.   q->next = ptr;
  51.   ptr->next = p;
  52. } else {
  53.   q = p;
  54.   p = p->next;
  55. }
  56.       }
  57.     }
  58.   }
  59.   ptr->timestamp = ts;
  60.   ptr->file_position = file_position;
  61.   ptr->frames = frame;
  62. }
  63. const frame_file_pos_t *CFilePosRecorder::find_closest_point (uint64_t ts)
  64. {
  65.   frame_file_pos_t *p, *q;
  66.   if (m_first == NULL) {
  67.     return NULL;
  68.   }
  69.   if (m_last->timestamp <= ts) {
  70.     return m_last;
  71.   }
  72.   if (m_first->timestamp >= ts) return m_first;
  73.   q = m_first;
  74.   p = m_first->next;
  75.   while (p != NULL) {
  76.     if (ts < p->timestamp) {
  77.       return q;
  78.     }
  79.     q = p;
  80.     p = p->next;
  81.   }
  82.   return NULL;
  83. }