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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * avi_bytestream.cpp - convert quicktime file to a bytestream
  23.  */
  24. #include "systems.h"
  25. #include "avi_bytestream.h"
  26. #include "player_util.h"
  27. /**************************************************************************
  28.  * Quicktime stream base class functions
  29.  **************************************************************************/
  30. CAviByteStreamBase::CAviByteStreamBase (CAviFile *parent, const char *which)
  31.   : COurInByteStream(which)
  32. {
  33.   m_frame_on = 0;
  34.   m_frame_in_buffer = 0xffffffff;
  35.   m_parent = parent;
  36.   m_eof = 0;
  37.   m_max_frame_size = 16 * 1024;
  38.   m_buffer = (uint8_t *) malloc(m_max_frame_size * sizeof(char));
  39. }
  40. CAviByteStreamBase::~CAviByteStreamBase()
  41. {
  42.   if (m_buffer) {
  43.     free(m_buffer);
  44.     m_buffer = NULL;
  45.   }
  46. }
  47. int CAviByteStreamBase::eof(void)
  48. {
  49.   return m_eof != 0;
  50. }
  51. /**************************************************************************
  52.  * Quicktime video stream functions
  53.  **************************************************************************/
  54. void CAviVideoByteStream::video_set_timebase (long frame)
  55. {
  56.   m_eof = 0;
  57.   m_frame_on = frame;
  58.   read_frame(frame);
  59. }
  60. void CAviVideoByteStream::reset (void) 
  61. {
  62.   video_set_timebase(0);
  63. }
  64. uint64_t CAviVideoByteStream::start_next_frame (uint8_t **buffer, 
  65. uint32_t *buflen,
  66. void **ud)
  67. {
  68.   uint64_t ret;
  69.   double ftime;
  70.   
  71.   read_frame(m_frame_on);
  72.   ftime = (double)m_frame_on;
  73.   ftime *= 1000.0;
  74.   ftime /= m_frame_rate;
  75.   ret = (uint64_t)ftime;
  76.   *buffer = m_buffer;
  77.   *buflen = m_this_frame_size;
  78.   m_frame_on++;
  79.   if (m_frame_on > m_frames_max) m_eof = 1;
  80.   return (ret);
  81. }
  82. void CAviVideoByteStream::used_bytes_for_frame (uint32_t bytes)
  83. {
  84.   m_total += bytes;
  85. }
  86. /*
  87.  * read_frame for video - this will try to read the next frame - it
  88.  * tries to be smart about reading it 1 time if we've already read it
  89.  * while bookmarking
  90.  */
  91. void CAviVideoByteStream::read_frame (uint32_t frame_to_read)
  92. {
  93.   uint32_t next_frame_size;
  94.   if (m_frame_in_buffer == frame_to_read) {
  95.     m_byte_on = 0;
  96.     return;
  97.   }
  98.   // Haven't already read the next frame,  so - get the size, see if
  99.   // it fits, then read it into the appropriate buffer
  100.   m_parent->lock_file_mutex();
  101.   
  102.   long temp;
  103.   AVI_set_video_position(m_parent->get_file(), m_frame_on, &temp);
  104.   next_frame_size = temp;
  105.   if (next_frame_size > m_max_frame_size) {
  106.     m_max_frame_size = next_frame_size;
  107.     m_buffer = (uint8_t *)realloc(m_buffer, next_frame_size * sizeof(char) + 4);
  108.   }
  109.   m_this_frame_size = next_frame_size;
  110.   AVI_read_frame(m_parent->get_file(), (char *)m_buffer);
  111.   m_parent->unlock_file_mutex();
  112.   m_byte_on = 0;
  113. }
  114. void CAviVideoByteStream::set_start_time (uint64_t start)
  115. {
  116.   m_play_start_time = start;
  117.   double time = (double)
  118. #ifdef _WIN32
  119.   (int64_t)
  120. #endif
  121.   start;
  122.   time *= m_frame_rate;
  123.   time /= 1000;
  124. #if 0
  125.   player_debug_message("avi video frame " LLD , start);
  126. #endif
  127.   // we've got the position;
  128.   video_set_timebase((uint32_t)time);
  129. }
  130. /**************************************************************************
  131.  * Quicktime Audio stream functions
  132.  **************************************************************************/
  133. void CAviAudioByteStream::audio_set_timebase (long frame)
  134. {
  135.   m_file_pos = 0;
  136.   m_buffer_on = m_this_frame_size = 0;
  137. }
  138. void CAviAudioByteStream::reset (void) 
  139. {
  140.   audio_set_timebase(0);
  141. }
  142. uint64_t CAviAudioByteStream::start_next_frame (uint8_t **buffer, 
  143. uint32_t *buflen,
  144. void **ud)
  145. {
  146.   int value;
  147.   if (m_buffer_on < m_this_frame_size) {
  148.     value = m_this_frame_size - m_buffer_on;
  149.     memmove(m_buffer,
  150.     m_buffer + m_buffer_on,
  151.     m_this_frame_size - m_buffer_on);
  152.     m_this_frame_size -= m_buffer_on;
  153.   } else {
  154.     value = 0;
  155.     m_this_frame_size = 0;
  156.   }
  157.   m_buffer_on = 0;
  158.   m_parent->lock_file_mutex();
  159.   AVI_set_audio_position(m_parent->get_file(), m_file_pos);
  160.   int ret;
  161.   ret = AVI_read_audio(m_parent->get_file(), 
  162.        (char *)m_buffer + value, 
  163.        m_max_frame_size - m_this_frame_size);
  164.   m_parent->unlock_file_mutex();
  165.   //player_debug_message("return from avi read %d", ret);
  166.   m_this_frame_size += ret;
  167.   m_file_pos += ret;
  168.   if (m_file_pos >= AVI_audio_bytes(m_parent->get_file())) {
  169.     m_eof = 1;
  170.   }
  171.   *buffer = m_buffer;
  172.   *buflen = m_this_frame_size;
  173. #if 0
  174.   uint64_t ret;
  175.   ret = m_frame_on;
  176.   ret *= m_samples_per_frame;
  177.   ret *= 1000;
  178.   ret /= m_frame_rate;
  179.     player_debug_message("Start next frame "LLU " offset %u %u", 
  180.  ret, m_byte_on, m_this_frame_size);
  181.   return (ret);
  182. #endif
  183.   return 0;
  184. }
  185. void CAviAudioByteStream::used_bytes_for_frame (uint32_t bytes)
  186. {
  187.   //player_debug_message("Used %d audio bytes", bytes);
  188.   m_buffer_on += bytes;
  189.   if (m_buffer_on > m_this_frame_size) m_buffer_on = m_this_frame_size;
  190. }
  191. void CAviAudioByteStream::set_start_time (uint64_t start)
  192. {
  193.   m_play_start_time = start;
  194.   
  195. #if 0  
  196.   start *= m_frame_rate;
  197.   start /= 1000 * m_samples_per_frame;
  198.   player_debug_message("qtime audio frame " LLD, start);
  199. #endif
  200.   // we've got the position;
  201.   audio_set_timebase((uint32_t)start);
  202.   m_play_start_time = start;
  203. }
  204. /* end file qtime_bytestream.cpp */