linphone中h264的 RTP打包

原创 2012年03月23日 18:03:35
    今天发现一个奇怪的问题,用上位机的linphone客户端拨打下位机的sip客户端能够正常工作,但是反过来就出问题了。 抓包发现linphone发送了大量的IP fragmentation 数据包,google才知道,当发现的数据大于MTU时就发产生IP分片的数据包。RTP打包时不是已经进行了分片操作了吗?正常情况应该不会出现这种情况才对。
    linphone对h264进行RTP打包在rfc3984.c中进行,打包函数如下:
void rfc3984_pack(Rfc3984Context *ctx, MSQueue *naluq, MSQueue *rtpq, uint32_t ts){
	switch(ctx->mode){
		case 0:
			rfc3984_pack_mode_0(ctx,naluq,rtpq,ts);
			break;
		case 1:
			rfc3984_pack_mode_1(ctx,naluq,rtpq,ts);
			break;
		default:
			ms_error("Bad or unsupported mode %i",ctx->mode);
	}
}

看来程序中定义了两种打包模式,看看两种模式有什么区别
static void rfc3984_pack_mode_0(Rfc3984Context *ctx, MSQueue *naluq, MSQueue *rtpq, uint32_t ts){
	mblk_t *m;
	bool_t end;
	int size;
	while((m=ms_queue_get(naluq))!=NULL){
		end=ms_queue_empty(naluq);
		size=m->b_wptr-m->b_rptr;
		if (size>ctx->maxsz){
			ms_warning("This H264 packet does not fit into mtu: size=%i",size);
		}
		send_packet(rtpq,ts,m,end);
	}
}

/*process NALUs and pack them into rtp payloads */
static void rfc3984_pack_mode_1(Rfc3984Context *ctx, MSQueue *naluq, MSQueue *rtpq, uint32_t ts){
	mblk_t *m,*prevm=NULL;
	int prevsz=0,sz;
	bool_t end;
	while((m=ms_queue_get(naluq))!=NULL){
		end=ms_queue_empty(naluq);
		sz=m->b_wptr-m->b_rptr;
		if (ctx->stap_a_allowed){
			if (prevm!=NULL){
				if ((prevsz+sz)<(ctx->maxsz-2)){
					prevm=concat_nalus(prevm,m);
					m=NULL;
					prevsz+=sz+2;/*+2 for the stapa size field*/
					continue;
				}else{
					/*send prevm packet: either single nal or STAP-A*/
					if (prevm->b_cont!=NULL){
						ms_debug("Sending STAP-A");
					}else
						ms_debug("Sending previous msg as single NAL");
					send_packet(rtpq,ts,prevm,FALSE);
					prevm=NULL;
					prevsz=0;
				}
			}
			if (sz<(ctx->maxsz/2)){
				/*try to aggregate it with next packet*/
				prevm=m;
				prevsz=sz+3; /*STAP-A header + size*/
				m=NULL;
			}else{
				
				/*send as single nal or FU-A*/
				if (sz>ctx->maxsz){
					ms_debug("Sending FU-A packets");
					frag_nalu_and_send(rtpq,ts,m,end, ctx->maxsz);
				}else{
					ms_debug("Sending Single NAL");
					send_packet(rtpq,ts,m,end);
				}
			}
		}else{
			if (sz>ctx->maxsz){
				ms_debug("Sending FU-A packets");
				frag_nalu_and_send(rtpq,ts,m,end, ctx->maxsz);
			}else{
				ms_debug("Sending Single NAL");
				send_packet(rtpq,ts,m,end);
			}
		}
	}
	if (prevm){
		ms_debug("Sending Single NAL (2)");
		send_packet(rtpq,ts,prevm,TRUE);
	}
}

模式0竟然没有RTP打包分片操作,而是直接send出去了,难怪IP协议自动进行了分片处理。于是想到,将RTP打包模式设置为1应该就可以了,后来发现可以直接通过SDP中的packetization-mode指定RTP打包模式。项目中出现的奇怪问题是因为,linphone默认使用了模式1打包,而下位机发送的SDP信息中没有指定packetization-mode。 在正位的发送的SDP中将packetization-mode指定为1,问题就解决了。


用实例分析H264 RTP payload

H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved)应用程序可以使用第一个字节来识别。在SDP中也说明了本次会话的属性SDP 参数 ...
  • zblue78
  • zblue78
  • 2010年10月18日 13:44
  • 25338

RTP Payload Format--- Packetization Modes

http://tools.ietf.org/html/rfc6184 打包模式 5.4. Packetization Modes This memo specif...
  • commshare
  • commshare
  • 2013年10月13日 11:38
  • 985

linphone呼叫流程分析

首先是到linphonecore_jni.cc -> linphone_core_invite_address_with_params(...) 然后到linphonecore.c -> linpho...
  • luck_apple
  • luck_apple
  • 2016年08月24日 21:06
  • 2410

linphone函数拨号过程分析

extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_inviteAddress(JNIEnv* env ,jobjec...
  • forest_world
  • forest_world
  • 2016年07月04日 16:48
  • 1028

H264中的SPS、PPS提取与作用

牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++...
  • sunnylgz
  • sunnylgz
  • 2012年06月20日 16:37
  • 75542

自己动手写RTP服务器——用RTP协议传输TS流

1.自己动手写RTP服务器——关于RTP协议 http://www.cnblogs.com/lidabo/p/4160138.html 2.自己动手写RTP服务器——用RTP协议传输T...
  • wishfly
  • wishfly
  • 2017年06月19日 18:14
  • 570

linphone中h264的 RTP打包(二)

今天发现一个奇怪的问题,用上位机的linphone客户端拨打下位机的sip客户端能够正常工作,但是反过来就出问题了。 抓包发现linphone发送了大量的IP fragmentation 数据包,go...
  • sphone89
  • sphone89
  • 2013年02月19日 13:43
  • 2833

linphone-linphone没有视频H264编码分析过程-正确分析正确的方法

本篇是上一篇的彩蛋篇正确找到H264编码之间,进行的代码追踪工作。其中将linphone启动的来龙去脉走了一遍,给人印象深刻。所以贴到这里,进行一下纪念。为什么有的有H264编码,有的没有H264编码...
  • AdrianAndroid
  • AdrianAndroid
  • 2017年04月11日 10:27
  • 1235

linphone-解决3.2.5版本在Android5.0以前的系统没有H264编码的问题

我下载当时最新版linphone,tag版本是3.2.5。不知道从哪个版本开始,linphone改了整体的编译方式。重新用python进行编译的方式和部分文件的生成。 这都不是问题,但是,在andr...
  • AdrianAndroid
  • AdrianAndroid
  • 2017年04月11日 10:11
  • 1419

基于Linux开源VOIP系统LinPhone[一]

LinPhone是一个网络电话或者IP语音电话(VOIP),是一款遵循GPL的开源的网络视频电话系统,其主要如下: 使用linphone,我们可以在互联网上随意的通信,通过语音、视频、即时文本消息。 ...
  • wavemcu
  • wavemcu
  • 2013年01月26日 11:56
  • 13912
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linphone中h264的 RTP打包
举报原因:
原因补充:

(最多只允许输入30个字)