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

流媒体/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. 2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * qtime_bytestream.cpp - convert quicktime file to a bytestream
  23.  */
  24. #include "systems.h"
  25. #include "mpeg3_bytestream.h"
  26. #include "player_util.h"
  27. #include "mp4av/mp4av.h"
  28. #include <math.h>
  29. //#define DEBUG_MP4_FRAME 1
  30. /**************************************************************************
  31.  * Quicktime stream base class functions
  32.  **************************************************************************/
  33. CMpeg3VideoByteStream::CMpeg3VideoByteStream (mpeg3_t *file, int stream)
  34.   : COurInByteStream("mpeg3 video")
  35. {
  36. #ifdef OUTPUT_TO_FILE
  37.   m_output_file = fopen("raw.mp3v", "w");
  38. #endif
  39.   m_file = file;
  40.   m_stream = stream;
  41.   m_eof = 0;
  42.   m_frames_max = mpeg3_video_frames(m_file, m_stream);
  43.   m_frame_rate = mpeg3_frame_rate(m_file, m_stream);
  44.   m_max_time = m_frames_max;
  45.   m_max_time /= m_frame_rate;
  46.   mpeg3f_message(LOG_DEBUG, 
  47.  "Mpeg3 video frame rate %g frames %ld max time is %g", 
  48.  m_frame_rate, m_frames_max, m_max_time);
  49.   m_changed_time = 0;
  50. }
  51. CMpeg3VideoByteStream::~CMpeg3VideoByteStream()
  52. {
  53. #ifdef OUTPUT_TO_FILE
  54.   fclose(m_output_file);
  55. #endif
  56. }
  57. int CMpeg3VideoByteStream::eof(void)
  58. {
  59.   return m_eof != 0;
  60. }
  61. #include "mpeg3protos.h"
  62. void CMpeg3VideoByteStream::set_timebase (double time)
  63. {
  64.   double calc;
  65.   m_eof = 0;
  66.   m_frame_on = 0;
  67.   //mpeg3_seek_video_percentage(m_file, m_stream, time / m_max_time);
  68.   
  69.   calc = (time * m_frame_rate);
  70.   calc = ceil(calc);
  71.   m_frame_on = (long)(calc);
  72.   mpeg3_set_frame(m_file, m_frame_on, m_stream);
  73.   mpeg3f_message(LOG_DEBUG, "video seek frame is %ld %g %g", m_frame_on,
  74.  time, m_max_time);
  75. }
  76. void CMpeg3VideoByteStream::reset (void) 
  77. {
  78.   set_timebase(0.0);
  79.   m_this_frame_size = 0;
  80. }
  81. uint64_t CMpeg3VideoByteStream::start_next_frame (uint8_t **buffer, 
  82.   uint32_t *buflen,
  83.   void **ud)
  84. {
  85.   double ts;
  86.   uint64_t time;
  87.   if (m_eof) {
  88.     return 0;
  89.   }
  90.   uint8_t *buf;
  91.   long blen;
  92.   int ret = mpeg3_read_video_chunk_resize(m_file,
  93.   (unsigned char **)&buf,
  94.   &blen,
  95.   m_stream);
  96.   if (ret != 0) {
  97.     m_eof = 1;
  98.     return 0;
  99.   }
  100.   if (buffer != NULL) {
  101.     *buffer = buf;
  102.     *buflen = blen;
  103. #if 0
  104.     mpeg3f_message(LOG_DEBUG, "frame %ld: %02x %02x %02x %02x %02x %02x %02x %02x %02x",
  105.    m_frame_on,
  106.    buf[0],
  107.    buf[1],
  108.    buf[2],
  109.    buf[3],
  110.    buf[4],
  111.    buf[5],
  112.    buf[6],
  113.    buf[7],
  114.    buf[8]);
  115. #endif
  116.   }
  117.   ts = m_frame_on;
  118.   ts /= m_frame_rate;
  119.   ts *= 1000.0;
  120.   time = (uint64_t)ts;
  121.   //mpeg3f_message(LOG_DEBUG, "start next frame %ld %llu", blen, time);
  122.   m_frame_on++;
  123.   return time;
  124. }
  125. void CMpeg3VideoByteStream::used_bytes_for_frame (uint32_t bytes_used)
  126. {
  127.   mpeg3_read_video_chunk_cleanup(m_file, m_stream);
  128. }
  129. int CMpeg3VideoByteStream::skip_next_frame (uint64_t *pts, 
  130.      int *pSync,
  131.      uint8_t **buffer, 
  132.      uint32_t *buflen)
  133. {
  134.   uint64_t ts;
  135.   mpeg3_read_video_chunk_cleanup(m_file, m_stream);
  136.   ts = start_next_frame(buffer, buflen, NULL);
  137.   *pts = ts;
  138.   if (*buffer != NULL)
  139.     *pSync = MP4AV_Mpeg3FindGopOrPictHdr(*buffer, *buflen, NULL);
  140.   else 
  141.     *pSync = 0;
  142.   //*pSync = m_frame_on_has_sync;
  143.   return (1);
  144. }
  145. void CMpeg3VideoByteStream::set_start_time (uint64_t start)
  146. {
  147.   m_play_start_time = start;
  148.   double ts;
  149. #ifdef _WIN32
  150.   ts = (int64_t)start;
  151. #else
  152.   ts = start;
  153. #endif
  154.   ts /= 1000.0;
  155.   set_timebase(ts);
  156. }
  157. double CMpeg3VideoByteStream::get_max_playtime (void) 
  158. {
  159.   return (m_max_time);
  160. };
  161. CMpeg3AudioByteStream::CMpeg3AudioByteStream (mpeg3_t *file, int stream)
  162.   : COurInByteStream("mpeg3 audio")
  163. {
  164. #ifdef OUTPUT_TO_FILE
  165.   m_output_file = fopen("raw.mp3a", "w");
  166. #endif
  167.   m_file = file;
  168.   m_stream = stream;
  169.   m_buffer = NULL;
  170.   m_buffersize_max = 0;
  171.   m_this_frame_size = 0;
  172.   m_eof = 0;
  173.   m_samples_per_frame = mpeg3_audio_samples_per_frame(m_file, m_stream);
  174.   m_freq = mpeg3_sample_rate(m_file, m_stream);
  175.   m_max_time = mpeg3_audio_get_number_of_frames(m_file, m_stream);
  176.   m_max_time *= mpeg3_audio_samples_per_frame(m_file, m_stream);
  177.   m_max_time /= mpeg3_sample_rate(m_file, m_stream);
  178.   mpeg3f_message(LOG_DEBUG, "audio max time is %g", m_max_time);
  179.   m_changed_time = 0;
  180.   m_frame_on = 0;
  181. }
  182. CMpeg3AudioByteStream::~CMpeg3AudioByteStream()
  183. {
  184. #ifdef OUTPUT_TO_FILE
  185.   fclose(m_output_file);
  186. #endif
  187. }
  188. int CMpeg3AudioByteStream::eof(void)
  189. {
  190.   return m_eof != 0;
  191. }
  192. void CMpeg3AudioByteStream::set_timebase (double time)
  193. {
  194.   double calc;
  195.   m_eof = 0;
  196.   m_frame_on = 0;
  197.   mpeg3_seek_audio_percentage(m_file, m_stream, time / m_max_time);
  198.   
  199.   calc = (time * m_freq) / m_samples_per_frame;
  200.   calc = ceil(calc);
  201.   m_frame_on = (long)(calc);
  202.   mpeg3f_message(LOG_DEBUG, "audio seek frame is %ld %g %g", m_frame_on,
  203.  time, m_max_time);
  204. }
  205. void CMpeg3AudioByteStream::reset (void) 
  206. {
  207.   set_timebase(0.0);
  208.   m_this_frame_size = 0;
  209. }
  210. uint64_t CMpeg3AudioByteStream::start_next_frame (uint8_t **buffer, 
  211.   uint32_t *buflen,
  212.   void **ud)
  213. {
  214.   uint64_t ts;
  215.   if (m_eof) {
  216.     return 0;
  217.   }
  218.   int ret = mpeg3_read_audio_frame(m_file, 
  219.    (unsigned char **)&m_buffer, 
  220.    &m_this_frame_size,
  221.    &m_buffersize_max,
  222.    m_stream);
  223.   if (ret < 0) {
  224.     m_eof = 1;
  225.     return 0;
  226.   }
  227.   if (m_buffer != NULL) {
  228.     *buffer = m_buffer;
  229.     *buflen = m_this_frame_size;
  230. #ifdef OUTPUT_TO_FILE
  231.     fwrite(m_buffer, m_this_frame_size, 1, m_output_file);
  232. #endif
  233.   }
  234.   if (m_samples_per_frame == 0) {
  235.   }
  236.   if (m_freq == 0) {
  237.     return 0;
  238.   }
  239.   ts = m_frame_on;
  240.   ts *= m_samples_per_frame;
  241.   ts *= M_LLU;
  242.   ts /= m_freq;
  243.   m_frame_on++;
  244.   //mpeg3f_message(LOG_DEBUG, "audiostart %ld %llu %d", m_frame_on, ts, m_this_frame_size);
  245.   return ts;
  246. }
  247. void CMpeg3AudioByteStream::used_bytes_for_frame (uint32_t bytes_used)
  248. {
  249. }
  250. int CMpeg3AudioByteStream::skip_next_frame (uint64_t *pts, 
  251.      int *pSync,
  252.      uint8_t **buffer, 
  253.      uint32_t *buflen)
  254. {
  255.   uint64_t ts;
  256.   ts = start_next_frame(buffer, buflen, NULL);
  257.   *pts = ts;
  258.   *pSync = 0;
  259.   //*pSync = m_frame_on_has_sync;
  260.   return (1);
  261. }
  262. void CMpeg3AudioByteStream::set_start_time (uint64_t start)
  263. {
  264.   m_play_start_time = start;
  265.   double ts;
  266. #if _WIN32
  267.   ts = (int64_t)start;
  268. #else
  269.   ts = start;
  270. #endif
  271.   ts /= 1000.0;
  272.   set_timebase(ts);
  273. }
  274. double CMpeg3AudioByteStream::get_max_playtime (void) 
  275. {
  276.   return (m_max_time);
  277. };
  278. /* end file qtime_bytestream.cpp */