注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

dp: 生活的脚步,进步的点滴...

Cam、DSP、FPGA、PM、Life、More ...

 
 
 

日志

 
 

实现RTP发送流数据包  

2012-06-19 18:06:21|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这是用RTP(RFC3350)按RFC2550封装MPEG ES流数据的发送程序。学习RTP的路真的辛苦。在网上收集的有关RTP的程序都是那种只负责RTP数据包发送的库,如jrtplib等,他们的DEMO程序都只是用来发发字符串,编编聊天程序,无论是国内还是国外,都没有结合真正的应用的DEMO。其实我的目的很简单,就是写发个视频流服务器,不用复杂,只用把基本原理弄懂,因为这样你才能有的放矢。与网上和RTP相关的库没有应用不一让,当你尝试以流媒体服务器、linux来baidu或google时,你搜出来完非就那么几类:

1.FFSERVER
     FFMPEG2的DEMO,说它有名只是因为这类程序太少了。FFMPEG2是很好用,我现在还在用,但这个DEMO就有很多“炒作”的嫌疑了。好像在做着FFMPEG2库的演示而不是真的视频流服务器。后来想想,这不正是作者想要的吗,但这不是我想要的。编解码部分我会很偏向FFMPEG这个“大杂会”,其它部分我会选择其它的“强者”

2.Darwin、Helix
     两个都是非常有名软件,也只能称之为软件了,因为就算Darwin有源码,这种代码规模,也不适合用于嵌入式。说回软件本身,真的很有名。它们都是很真真拿来商业化运行的软件,但我是研发人员,不是视频流服务商,对不起,Apple,对不起,Microsoft。

3.LIVE555
     如果说上面两个和我都相关性为零(当然了,也是困扰了N周以后痛苦得出的结论),那LIVE555真的给了我一条出路,它是一个代码规模非常合适,又非常强大的媒体解决方案(称之为方案是因为它功能非常的丰富)。有长一段时间,我想去弄懂它的源码,不过和网上的很多人一样,最后软下来了,毕竟,去把这么多东西揉在一起,框架会弄得很复杂,因为我们要把这些完全不同的东西不断一层一层的抽像,最后抽像成一样(哲学呀)。它结构复杂是我中断分析它原来的其中一个原因,但不是主要原因。它结构的复杂程度也没胡像很多人网上说的那样严重,如果你是一个C++的热忱爱好者,你反而会迷上这段代码,当然了,对C的爱好都来说,当然是一种折磨了。暂时把我自己归类在C++爱好者范畴吧,呵呵,我很欣赏这段原码。主要原因是我不希望被某一个库绑死。LIVE555是有编解码能力,但我更希望它只做服务器的工作。

     因此,最终后回来的老路上来,没有帮助,就得自己帮自己,从最基础的RFC看起。经过了N天(周)的英文,终于领会了如果在RTP承载MPEG数据包。在这个过程中很得到了一些LIVE555的帮助(通过对Ethereal捕捉的LIVE555数据包进行分析)。先把程序弄上来,原理性的以后有空再写,程序只有一个.cpp文件,在vs.net 2003下编译通过,播放的视频文件在http://www.cnitblog.com/Files/tinnal/ES流解释程序.rar  内,播放的客户端采用VLC,其下载地址为http://www.videolan.org/。选择打开网络串流,然后选择“UDP/RTP”端口,输入程序的输出端口1000,然后才运行程序,你将在VLC内看到测试的广播视频,IP不一样的话自己改改就行。其它所谓的原理性的,也就是看RFC 3350、RFC2550以及iso13818-2的一些重点地方。

   // MPEG2RTP.h实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
<stdio.h>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
<stdlib.h>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
<conio.h>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
<string.h>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
<winsock2.h>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
<winsock2.h>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//#include "mem.h"
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//< Start code or other signal>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define PACK_STARTCODE                     (unsigned int)0x000001ba
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define SYSTEM_HEADER_STARTCODE     (unsigned int)0x000001bb
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define PICTURE_START_CODE               (unsigned int)0x00000100
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define GROUP_START_CODE            (unsigned int)0x000000B8
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define ISO_11172_ENDCODE             (unsigned int)0x000001b9
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define SEQUENCE_HEADER_CODE        (unsigned int)0x000001b3
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define PACKET_BUFFER_END            (unsigned int)0x00000000
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define MAX_RTP_PKT_LENGTH     1440
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define HEADER_LENGTH        16
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define DEST_IP                "192.168.0.98"
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define DEST_PORT            1000
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define MPA                    14 /*MPEG PAYLOAD TYPE */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#define MPV                    32
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...typedef
struct 
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
/**//* byte 0 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char csrc_len:4;        /**//* expect 0 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char extension:1;        /**//* expect 1, see RTP_OP below */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char padding:1;        /**//* expect 0 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char version:2;        /**//* expect 2 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
/**//* byte 1 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char payload:7;        /**//* RTP_PAYLOAD_RTSP */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char marker:1;        /**//* expect 1 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
/**//* bytes 2, 3 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
short seq_no;           
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
/**//* bytes 4-7 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned 
long timestamp;       
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
/**//* bytes 8-11 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
long ssrc;            /**//* stream number is used here. */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}
RTP_FIXED_HEADER;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...typedef
struct 实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//byte 0
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    unsigned char TR_high2:2;    /**//* Temporal Reference high 2 bits*/
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char T:1;            /**//* video specific head extension flag */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char MBZ:5;        /**//* unused */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//byte1
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    unsigned char TR_low8:8;    /**//* Temporal Reference low 8 bits*/
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//byte3
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    unsigned char P:3;            /**//* picture type; 1=I,2=P,3=B,4=D */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char E:1;         /**//* set if last byte of payload is slice end code */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char B:1;            /**//* set if start of payload is slice start code */   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char S:1;            /**//* sequence header present flag */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char N:1;            /**//* N bit; used in MPEG 2 */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char AN:1;        /**//* Active N bit */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//byte4
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    unsigned char FFC:3;        /**//* forward_f_code */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char FFV:1;        /**//* full_pel_forward_vector */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char BFC:3;        /**//* backward_f_code */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char FBV:1;        /**//* full_pel_backward_vector */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}
MPEG_VID_SPECIFIC_HDR; /**//* 4 BYTES */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
enum reading_status 实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    SLICE_AGAIN,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    SLICE_BREAK,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    UNKNOWN,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    SLICE,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    SEQUENCE_HEADER,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    GROUP_START,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    PICTURE
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }
;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
void validate_file();
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
float frame_rate(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int read_picture_type(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int read_FBV(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int read_BFC(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int read_FFV(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int read_FFC(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int extract_temporal_reference(int buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int find_next_start_code(unsigned int *buffer_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
void reset_buffer_index(void);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...BOOL InitWinsock();
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...


实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...//MPEG2RTP.cpp
    //这个程序主要用于RTP封装MPEG2数据的学习和测试,不作任何其它用途
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//软件在VS.net 2003中编译通过,但在linux下作小量修改也应编译通过。
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//通过VLC测试,VLC能正确接收和解码由本程序发送的TEST.MPV编码流。
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//作者:冯富秋 Tinnal
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//邮箱:tinnal@163.com
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#include
"MPEG2RTP.h"
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...#pragma   comment(lib,
"Ws2_32")
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
char            buf[MAX_RTP_PKT_LENGTH + 4]; //input buffer
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
enum reading_status        state = SEQUENCE_HEADER;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int            g_index_in_packet_buffer = HEADER_LENGTH;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
static unsigned long    g_time_stamp = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
static unsigned long    g_time_stamp_current =0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
static float            g_frame_rate = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
static unsigned int        g_delay_time = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
static unsigned int        g_timetramp_increment = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...FILE   
*mpfd;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...SOCKET    socket1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...RTP_FIXED_HEADER       
*rtp_hdr;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...MPEG_VID_SPECIFIC_HDR   
*mpeg_hdr;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#if 0
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
void Send_RTP_Packet(unsigned char *buf,int bytes)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
int i = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
int count = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    printf(
"/nPacket length %d/n",bytes);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    printf(
"RTP Header: [M]:%s [sequence number]:0x%lx [timestamp]:0x%lx/n",
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->marker == 1?"TRUE":"FALSE",
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->seq_no,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->timestamp);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    printf(
" [TR]:%d [AN]:%d [N]:%d [Sequence Header]:%s /
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        /n [Begin Slice]:%s [End Slice]:%s /
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        /n [Pictute Type]:
%d /
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        /n [FBV]:
%d [BFC]:%d [FFV]:%d [FFC]:%d/n",
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        (mpeg_hdr->TR_high2 << 8 | mpeg_hdr->TR_low8),
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        mpeg_hdr
->AN, mpeg_hdr->N, mpeg_hdr->S == 1?"TRUE":"FALSE",
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        mpeg_hdr
->B ==1?"TRUE":"FALSE", mpeg_hdr->E ==1?"TRUE":"FALSE",
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        mpeg_hdr
->P,
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        mpeg_hdr
->FBV, mpeg_hdr->BFC, mpeg_hdr->FFV, mpeg_hdr->FFC);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
while(bytes --)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        printf(
"%02x ",buf[count++]);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
if(++i == 16)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            i
=0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            printf(
"/n");
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    printf(
"/n");
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#else
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...Send_RTP_Packet(unsigned
char *buf,int bytes)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return send( socket1,  (char*) buf, bytes, 0 );
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#endif
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
void main(int argc, char *argv[])
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int next_start_code;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int sent_bytes;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
short seq_num =0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
short stream_num = 10;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
struct sockaddr_in server;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
int len =sizeof(server);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#if 0
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    mpfd
= fopen("E://tinnal//live555//vc_proj//es//Debug//test.mpv", "rb"); 
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#else
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
if (argc < 2)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        printf(
"/nUSAGE: %s mpegfile/nExiting../n/n",argv[0]);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                exit(
0);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    mpfd
= fopen(argv[1], "rb");
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
#endif
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
if (mpfd == NULL )
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        printf(
"/nERROR: could not open input file %s/n/n",argv[1]);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        exit(
0);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    rtp_hdr
= (RTP_FIXED_HEADER*)&buf[0];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    mpeg_hdr
= (MPEG_VID_SPECIFIC_HDR*)&buf[12];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    memset((
void *)rtp_hdr,0,12); //zero-out the rtp fixed hdr
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    memset((void *)mpeg_hdr,0,4); //zero-out the video specific hdr
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    memset((void *)buf,0,MAX_RTP_PKT_LENGTH + 4);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    InitWinsock();
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    server.sin_family
=AF_INET;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    server.sin_port
=htons(DEST_PORT);          //server的监听端口
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    server.sin_addr.s_addr=inet_addr(DEST_IP); //server的地址
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    socket1
=socket(AF_INET,SOCK_DGRAM,0);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    connect(socket1, (
const sockaddr *)&server, len) ;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//read the first packet from the mpeg file
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//always read 4 extra bytes in (in case there's a startcode there)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//but dont send  more than MAX_RTP_PKT_LENGTH in one packet
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    fread(&(buf[HEADER_LENGTH]), MAX_RTP_PKT_LENGTH-HEADER_LENGTH+4, 1,mpfd);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    validate_file();
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
do
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
/**//* initialization of the two RTP headers */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->seq_no     = htons(seq_num ++);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->payload     = MPV;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->version     = 2;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->marker    = 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->ssrc        = htonl(stream_num);   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        mpeg_hdr
->S = mpeg_hdr->E = mpeg_hdr->B= 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
do实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            next_start_code
= find_next_start_code(&next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
if ((next_start_code >0x100) && (next_start_code<0x1b0) )
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< We reach the first slice start code in current packet buffer>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< Set the B flag of the mpeg special header>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SEQUENCE_HEADER
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
|| state ==GROUP_START
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
|| state ==PICTURE
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
|| state == UNKNOWN)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= SLICE;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    mpeg_hdr
->B = 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< We reach slice start code in current packet again>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< Set the E flag of the mpeg special header>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< and update the sent_bytes to the last slice data end>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                else if (state == SLICE ||state == SLICE_AGAIN)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= SLICE_AGAIN;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    mpeg_hdr
->E     = 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< We reach slice start codethe previous slice end>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< for a broken slice set the E flag>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< According to RFC we shouldnt put another slice data to this packet>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< instead of sent it out>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                else if (state == SLICE_BREAK)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= UNKNOWN;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    mpeg_hdr
->E     = 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            }
 
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
switch(next_start_code)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
case SEQUENCE_HEADER_CODE:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< SEQUENCE_HEADER_CODE after SLICE_START_CODE>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< we must sent the packet now so that the SEQUENCE_HEADER_CODE>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< will appear at the start of the next packet>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SLICE || state == SLICE_AGAIN)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= SEQUENCE_HEADER;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
//< Accord to RFC >
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
//< at the end of a frame we should set RTP marker bit to >
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                    rtp_hdr->marker = 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                state
= SEQUENCE_HEADER;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                g_frame_rate
= frame_rate(next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                g_delay_time
= (unsigned int)(1000.0 / g_frame_rate +0.5); //ms
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                g_timetramp_increment = (unsigned int)(90000.0 / g_frame_rate +0.5); //90K Hz
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                mpeg_hdr->S=1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
break;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
case GROUP_START_CODE:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< GROUP_START_CODE after SLICE_START_CODE>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< we must sent the packet now so that the GROUP_START_CODE>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< will appear at the start of the next packet>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SLICE || state == SLICE_AGAIN)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= GROUP_START;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
//< Accord to RFC >
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
//< at the end of a frame we should set RTP marker bit to >
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                    rtp_hdr->marker = 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }
   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                state
= GROUP_START;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
case PICTURE_START_CODE:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< PICTURE_START_CODE after PICTURE_START_CODE>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< we must sent the packet now so that the PICTURE_START_CODE>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< will appear at the start of the next packet>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SLICE || state == SLICE_AGAIN)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= PICTURE;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
//< Accord to RFC >
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
//< at the end of a frame we should set RTP marker bit to >
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                    rtp_hdr->marker = 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                state
= PICTURE;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                mpeg_hdr
->TR_high2    = (extract_temporal_reference(next_start_code_index) & 0x300 )>> 8;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                mpeg_hdr
->TR_low8     =  extract_temporal_reference(next_start_code_index) & 0xff;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                mpeg_hdr
->P             = read_picture_type(next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//now read the motion vectors information
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if( (mpeg_hdr->P==2) || (mpeg_hdr->P==3))
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{ //if B- or P-type picture, need forward mv
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                    mpeg_hdr->FFV = read_FFV(next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    mpeg_hdr
->FFC = read_FFC(next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
if( mpeg_hdr->P==3)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{ // if B-type pictue, need backward mv
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                    mpeg_hdr->FBV = read_FBV(next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    mpeg_hdr
->BFC = read_BFC(next_start_code_index);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< Time stamp only increate per frame>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< But I or P frame>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if( mpeg_hdr->P== 1 || mpeg_hdr->P == 2 )实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    g_time_stamp
+= g_timetramp_increment;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    g_time_stamp_current
= g_time_stamp;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }
else实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    g_time_stamp
+= g_timetramp_increment;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
break;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
case PACKET_BUFFER_END:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< There is one more slice in the packet buffer>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< Anyway we only sent the integrated slice>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SLICE_AGAIN) 实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= UNKNOWN;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< There is one Slice in the packet buffer>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< But the Slice is to big so we break the slice>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SLICE)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= SLICE_BREAK;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< There if a broke slice but in current packet buffer>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< we could not find the end of the slice>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
//< Let it in the broke state>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
                if(state == SLICE_BREAK )
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    state
= SLICE_BREAK;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                    sent_bytes
= next_start_code_index;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                   
goto Sent_Packet;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...                }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...               
break;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        }
while(next_start_code != PACKET_BUFFER_END);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...Sent_Packet:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        rtp_hdr
->timestamp = htonl(g_time_stamp_current);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        Send_RTP_Packet(buf, sent_bytes);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
//copy the tail data to the head of the packet buffer
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        memmove(&buf[HEADER_LENGTH], &buf[sent_bytes], MAX_RTP_PKT_LENGTH-sent_bytes);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
//reset the buffer index to zero
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        reset_buffer_index();
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
//reading data into buffer again
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        fread(&(buf[(MAX_RTP_PKT_LENGTH-sent_bytes)+HEADER_LENGTH]), sent_bytes -HEADER_LENGTH , 1,mpfd);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
// sleep g_delay_time msec for sending next picture data
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        if(rtp_hdr->marker ==1) Sleep( g_delay_time );
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }
while(!feof(mpfd));
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    closesocket(socket1);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    fclose(mpfd);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    printf(
"stream end./n");
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//==================================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int find_next_start_code(unsigned int *next_start_code_index) //NOTE: all start codes ARE byte-aligned
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int byte0=0,byte1=0,byte2=0,byte3=0,startcode=0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//while not startcode and have not exceeded max packet length
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    while (g_index_in_packet_buffer < MAX_RTP_PKT_LENGTH)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
if (buf[g_index_in_packet_buffer+0] == 0
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
&& buf[g_index_in_packet_buffer+1] == 0
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
&& buf[g_index_in_packet_buffer+2] ==1)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
//printf("FOUND startcode %d/n",indx);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
            byte0=(int)buf[g_index_in_packet_buffer+0];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            byte1
=(int)buf[g_index_in_packet_buffer+1];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            byte2
=(int)buf[g_index_in_packet_buffer+2];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            byte3
=(int)buf[g_index_in_packet_buffer+3];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            startcode
=(byte0 << 24) + (byte1 << 16) + (byte2 << 8) + byte3;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
*next_start_code_index = g_index_in_packet_buffer;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            g_index_in_packet_buffer
= g_index_in_packet_buffer+4;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
return(startcode);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
else
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            g_index_in_packet_buffer
++;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
//< reach the end of the packet buffer>
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    if (g_index_in_packet_buffer >= (MAX_RTP_PKT_LENGTH))
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
*next_start_code_index = g_index_in_packet_buffer -1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        g_index_in_packet_buffer
= HEADER_LENGTH;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return PACKET_BUFFER_END;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    printf(
"Error reading buffer../n");
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    exit(
-1);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return -1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
void reset_buffer_index(void)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    g_index_in_packet_buffer
= HEADER_LENGTH;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//========================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
float frame_rate(int buffer_index)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
char frame_rate_code;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    frame_rate_code
= (unsigned char)buf[buffer_index +7] & 0xf;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
switch(frame_rate_code)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x1:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 23.976;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x2:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 24.0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x3:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 25.0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x4:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 29.97;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x5:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 30.0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x6:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 50.0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x7:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 59.94;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
case 0x8:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 60.0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
default:
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return 0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//========================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
unsigned int extract_temporal_reference(int buffer_index) // 10 bits
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int low2bits=0,TR=0; // TR = temporal reference;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    TR
= (unsigned int) (buf[buffer_index+4]);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    TR
<<= 2;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    low2bits
= (unsigned int) (buf[buffer_index+5]);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    TR
|= (low2bits >> 6);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return(TR);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//========================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...unsigned
int read_picture_type(int buffer_index)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int pictype=0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    pictype
= (unsigned int) buf[buffer_index+5];
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    pictype
= (pictype >> 3) & (0x7);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return (pictype);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//=======================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
unsigned int read_FFV(int buffer_index) // 1 bit
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return( (int) ((buf[buffer_index+7] & (0x4)) >> 2));
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//=======================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
unsigned int read_FFC(int buffer_index) // 3 bits
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    unsigned
int FFC=0,lowbit=0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    FFC
= (int) (buf[buffer_index+7] & (0x3));
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    FFC
<<= 1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    lowbit
= (int) ((buf[buffer_index+8]) & (0x80));
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    FFC
= FFC | (lowbit >> 7 );
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return(FFC);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//=======================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
unsigned int read_FBV(int buffer_index) // 1 bit
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{      
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return( (int) ((buf[buffer_index+8] & (0x40))>>6) );
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
//=======================================================
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
unsigned int read_BFC(int buffer_index) // 3 bits
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{               
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return( (int) ( (buf[buffer_index+8] & (0x38) ) >> 3 ) );
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
void validate_file()
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
/**//* to validate the file, ensure the existance of a startcode */
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
int j=0,valid=0;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
while ((j++<MAX_RTP_PKT_LENGTH) && (!valid))
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
if (!((int)buf[j+0] + (int)buf[j+1]) && (((int)buf[j+2])==1))
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            valid
=1;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
if (!valid)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        printf(
"/nERROR: start code not found. /
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
               /nInput file must be a valid MPEG I file./n");
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
        exit(0);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }
          
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...BOOL InitWinsock()
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
int Error;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    WORD VersionRequested;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    WSADATA WsaData;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    VersionRequested
=MAKEWORD(2,2);
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    Error
=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...
    if(Error!=0)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
return FALSE;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
else
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...{
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...            WSACleanup();
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...           
return FALSE;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...        }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...       
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...    }

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...   
return TRUE;
实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...}

实现RTP发送流数据包 - dp - dp: 生活的脚步,进步的点滴...

 

      完成这个测试程序后,我有了很大的信心,又重复看了RFC3550几编,其实,如果你真看了程序,你发现我只发送了RTP,并没有发送RTCP数据包,因此,我们是不能同步多个RTP流的。我没去编码下去,因为我觉得已经够了。这里强调,没用说的RTP没有了RTCP就不行!接下来的工作,就是把这个程序的下层发包函数去掉,采用RTP库JRTPLIB,我觉得这才应该是JRTPLIB的DEMO!如果有人问,就这样的一个程序就能完成任务了,要JRTPLIB干嘛,其实,我不写RTCP相关代码的原因为多个:

    1.RTCP里头有很多关于RTCP发送简隔的时间计算,RTP信息的统计,这种操作不是难,而是烦,我不想去写
    2.RTCP和RTP一开始出来的时候并不是因为视频的点播等应用的,而是视频会议。RTCP有管理与会者的层面含义,这一功能在很多场合并不会用到。
    3.我想简单,没有写多个流间的同步,如一个影片的视频和音频流。这些其实是RTCP来完成的。

    我懒得去写,因为这些功作RTP的各个库类都做得很好。我觉得用库的最大优点就在这吧。

  评论这张
 
阅读(779)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016