qtime_bytestream.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/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.  * qtime_bytestream.h - provides bytestream access to quicktime files
  23.  */
  24. #ifndef __QTIME_BYTESTREAM_H__
  25. #define __QTIME_BYTESTREAM_H__
  26. #include <mp4/quicktime.h>
  27. #include "our_bytestream.h"
  28. #include "qtime_file.h"
  29. /*
  30.  * CQTByteStreamBase provides base class access to quicktime files.
  31.  * Most functions are shared between audio and video.
  32.  */
  33. class CQTByteStreamBase : public COurInByteStream
  34. {
  35.  public:
  36.   CQTByteStreamBase(CQtimeFile *parent,
  37.     int track,
  38.     const char *name);
  39.   ~CQTByteStreamBase();
  40.   int eof(void);
  41.   virtual void reset(void) = 0;
  42.   virtual uint64_t start_next_frame (uint8_t **buffer,
  43.      uint32_t *buflen,
  44.      void **ud) = 0;
  45.   void used_bytes_for_frame(uint32_t bytes);
  46.   void check_for_end_of_frame(void);
  47.  protected:
  48.   virtual void read_frame(uint32_t frame) = 0;
  49.   CQtimeFile *m_parent;
  50.   int m_eof;
  51.   int m_track;
  52.   uint32_t m_frame_on;
  53.   uint32_t m_frames_max;
  54.   uint32_t m_frame_rate;
  55.   uint32_t m_max_frame_size;
  56.   uint32_t m_frame_in_buffer;
  57.   uint8_t *m_buffer;
  58.   uint32_t m_byte_on;
  59.   uint32_t m_this_frame_size;
  60.   uint64_t m_total;
  61. };
  62. /*
  63.  * CQTVideoByteStream is for video streams.  It is inherited from
  64.  * CQTByteStreamBase.
  65.  */
  66. class CQTVideoByteStream : public CQTByteStreamBase
  67. {
  68.  public:
  69.   CQTVideoByteStream(CQtimeFile *parent,
  70.      int track) :
  71.     CQTByteStreamBase(parent, track, "video")
  72.     {
  73.     read_frame(0);
  74.     };
  75.   void reset(void);
  76.   uint64_t start_next_frame(uint8_t **buffer,
  77.     uint32_t *buflen, void **ud);
  78.   int can_skip_frame(void) { return 1; };
  79.   int skip_next_frame (uint64_t *ts, int *hasSync, uint8_t **buffer,
  80.        uint32_t *buflen);
  81.   void set_start_time(uint64_t start);
  82.   double get_max_playtime(void);
  83.   void config(long num_frames, float frate, int time_scale);
  84.  protected:
  85.   void read_frame(uint32_t frame);
  86.  private:
  87.   void video_set_timebase(long frame);
  88.   int m_time_scale;
  89.   double m_max_time;
  90. };
  91. /*
  92.  * CQTAudioByteStream is for audio streams.  It is inherited from
  93.  * CQTByteStreamBase.
  94.  */
  95. class CQTAudioByteStream : public CQTByteStreamBase
  96. {
  97.  public:
  98.   CQTAudioByteStream(CQtimeFile *parent,
  99.      int track) :
  100.     CQTByteStreamBase(parent, track, "audio")
  101.     {
  102.       read_frame(0);
  103.     };
  104.   void reset(void);
  105.   uint64_t start_next_frame(uint8_t **buffer,
  106.     uint32_t *buflen,
  107.     void **ud);
  108.   void set_start_time(uint64_t start);
  109.   double get_max_playtime (void) {
  110.     double ret = m_frames_max * m_samples_per_frame;
  111.     ret /= m_frame_rate;
  112.     return (ret);
  113.   };
  114.   void config(long num_frames, uint32_t frate, int duration) {
  115.     m_frames_max = num_frames;
  116.     m_frame_rate = frate;
  117.     m_samples_per_frame = duration;
  118.   };
  119.  protected:
  120.   void read_frame(uint32_t frame);
  121.  private:
  122.   void audio_set_timebase(long frame);
  123.   int m_samples_per_frame;
  124. };
  125. #endif