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

流媒体/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. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * mp3_rtp_bytestream.h - provides an RTP bytestream for the codecs
  23.  * to access
  24.  */
  25. #include "mp3_rtp_bytestream.h"
  26. #include <rtp/memory.h>
  27. //#define DEBUG_RTP_PAKS 1
  28. #ifdef _WIN32
  29. DEFINE_MESSAGE_MACRO(mp3_rtp_message, "mp3rtpbyst")
  30. #else
  31. #define mp3_rtp_message(loglevel, fmt...) message(loglevel, "mp3rtpbyst", fmt)
  32. #endif
  33. CMP3RtpByteStream::CMP3RtpByteStream (unsigned int rtp_pt,
  34.       format_list_t *fmt,
  35.       int ondemand,
  36.       uint64_t tps,
  37.       rtp_packet **head, 
  38.       rtp_packet **tail,
  39.       int rtp_seq_set, 
  40.       uint16_t rtp_seq,
  41.       int rtp_ts_set,
  42.       uint32_t rtp_base_ts,
  43.       int rtcp_received,
  44.       uint32_t ntp_frac,
  45.       uint32_t ntp_sec,
  46.       uint32_t rtp_ts) :
  47.   CRtpByteStream("mp3", 
  48.  fmt,
  49.  rtp_pt,
  50.  ondemand,
  51.  tps,
  52.  head, 
  53.  tail,
  54.  rtp_seq_set,
  55.  rtp_seq,
  56.  rtp_ts_set,
  57.  rtp_base_ts,
  58.  rtcp_received,
  59.  ntp_frac,
  60.  ntp_sec,
  61.  rtp_ts)
  62. {
  63.   m_pak_on = NULL;
  64.   set_skip_on_advance(4);
  65.   init();
  66. }
  67. CMP3RtpByteStream::~CMP3RtpByteStream(void)
  68. {
  69. }
  70. int CMP3RtpByteStream::have_no_data (void)
  71. {
  72.   if (m_head == NULL) return TRUE;
  73.   return FALSE;
  74. }
  75. int CMP3RtpByteStream::check_rtp_frame_complete_for_payload_type (void)
  76. {
  77.   return m_head != NULL;
  78. }
  79. void CMP3RtpByteStream::reset(void)
  80. {
  81.   m_buffer_len = m_bytes_used = 0;
  82.   CRtpByteStream::reset();
  83. }
  84. uint64_t CMP3RtpByteStream::start_next_frame (uint8_t **buffer, 
  85.       uint32_t *buflen,
  86.       void **userdata)
  87. {
  88.   uint64_t timetick;
  89.   int32_t diff;
  90.   diff = m_buffer_len - m_bytes_used;
  91.   m_doing_add = 0;
  92.   if (diff > 2) {
  93.     // Still bytes in the buffer...
  94.     *buffer = m_mp3_frame + m_bytes_used;
  95.     *buflen = diff;
  96. #ifdef DEBUG_RTP_PAKS
  97.     mp3_rtp_message(LOG_DEBUG, "%s Still left - %d bytes", m_name, *buflen);
  98. #endif
  99.     return (m_last_realtime);
  100.   } else {
  101.     m_buffer_len = 0;
  102.     if (m_pak_on != NULL) {
  103.       xfree(m_pak_on);
  104.     }
  105.     m_pak_on = m_head;
  106.     remove_packet_rtp_queue(m_pak_on, 0);
  107.       
  108.     m_mp3_frame = (uint8_t *)m_pak_on->rtp_data;
  109.     m_buffer_len = m_pak_on->rtp_data_len;
  110.     m_ts = m_pak_on->rtp_pak_ts;
  111.     m_bytes_used = m_skip_on_advance_bytes;
  112.     *buffer = m_mp3_frame + m_bytes_used;
  113.     *buflen = m_buffer_len - m_bytes_used;
  114. #ifdef DEBUG_RTP_PAKS
  115.     mp3_rtp_message(LOG_DEBUG, "%s buffer len %d", m_name, m_buffer_len);
  116. #endif
  117.   }
  118.   timetick = rtp_ts_to_msec(m_ts, m_wrap_offset);
  119.   
  120.   return (timetick);
  121. }