⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtp_packetizer.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
			builder->slMap.DTSDeltaLength = 0;		/*RAP*/		if (builder->sl_config.useRandomAccessPointFlag && (builder->flags & GP_RTP_PCK_SIGNAL_RAP)) {			builder->slMap.RandomAccessIndication = 1;		} else {			builder->slMap.RandomAccessIndication = 0;		}		/*TODO: stream state*/		goto check_header;	}	/*this is the avg samples we can store per RTP packet*/	k = PathMTU / avgSize;	if (k<=1) {		builder->flags &= ~GP_RTP_PCK_USE_MULTI;		/*keep TS signaling for B-frames (eg never default to M4V-ES when B-frames are present)*/		//builder->flags &= ~GP_RTP_PCK_SIGNAL_TS;		builder->flags &= ~GP_RTP_PCK_SIGNAL_SIZE;		builder->flags &= ~GP_RTP_PCK_SIGNAL_AU_IDX;		builder->flags &= ~GP_RTP_PCK_USE_INTERLEAVING;		builder->flags &= ~GP_RTP_PCK_KEY_IDX_PER_AU;		gf_rtp_builder_init(builder, PayloadType, PathMTU, max_ptime, StreamType, OTI, PL_ID, avgSize, maxSize, avgTS, maxDTS, IV_length, KI_length, pref_mode);		return;	}	/*multiple SL per RTP - check if we have to send TS*/	builder->slMap.ConstantDuration = builder->sl_config.CUDuration;	if (!builder->slMap.ConstantDuration) {		builder->flags |= GP_RTP_PCK_SIGNAL_TS;	}	/*if we have a constant duration and are not writting TSs, make sure we write AU IDX when interleaving*/	else if (! (builder->flags & GP_RTP_PCK_SIGNAL_TS) && (builder->flags & GP_RTP_PCK_USE_INTERLEAVING)) {		builder->flags |= GP_RTP_PCK_SIGNAL_AU_IDX;	}	if (builder->flags & GP_RTP_PCK_SIGNAL_TS) {		/*compute CTS delta*/		totDelta = k*avgTS;		builder->slMap.CTSDeltaLength = gf_get_bit_size(k*avgTS);		/*compute DTS delta. Delta is ALWAYS from the CTS of the same sample*/ 		if (maxDTS) 			builder->slMap.DTSDeltaLength = gf_get_bit_size(maxDTS);		else			builder->slMap.DTSDeltaLength = 0;	}	if ((builder->flags & GP_RTP_PCK_SIGNAL_AU_IDX) && builder->sl_config.AUSeqNumLength) {		builder->slMap.IndexLength = builder->sl_config.AUSeqNumLength;		/*and k-1 AUs in Delta*/		builder->slMap.IndexDeltaLength = (builder->flags & GP_RTP_PCK_USE_INTERLEAVING) ? gf_get_bit_size(k-1) : 0;	}	/*RAP*/	if (builder->sl_config.useRandomAccessPointFlag && (builder->flags & GP_RTP_PCK_SIGNAL_RAP)) {		builder->slMap.RandomAccessIndication = 1;	} else {		builder->slMap.RandomAccessIndication = 0;	}check_header:	/*IV delta only if interleaving (otherwise reconstruction from IV is trivial)*/	if (IV_length && (builder->flags & GP_RTP_PCK_USE_INTERLEAVING)) {		builder->slMap.IV_delta_length = gf_get_bit_size(maxSize);	}	/*ISMACryp video mode*/	if ((builder->slMap.StreamType==GF_STREAM_VISUAL) && (builder->slMap.ObjectTypeIndication==0x20)		&& (builder->flags & GP_RTP_PCK_SIGNAL_RAP) && builder->slMap.IV_length 		&& !(builder->flags & GP_RTP_PCK_SIGNAL_AU_IDX) && !(builder->flags & GP_RTP_PCK_SIGNAL_SIZE)		/*shall have SignalTS*/		&& (builder->flags & GP_RTP_PCK_SIGNAL_TS) && !(builder->flags & GP_RTP_PCK_USE_MULTI)	) {		strcpy(builder->slMap.mode, "mpeg4-video");	}	/*ISMACryp AVC video mode*/	else if ((builder->slMap.StreamType==GF_STREAM_VISUAL) && (builder->slMap.ObjectTypeIndication==0x21)		&& (builder->flags & GP_RTP_PCK_SIGNAL_RAP) && builder->slMap.IV_length 		&& !(builder->flags & GP_RTP_PCK_SIGNAL_AU_IDX) && !(builder->flags & GP_RTP_PCK_SIGNAL_SIZE)		/*shall have SignalTS*/		&& (builder->flags & GP_RTP_PCK_SIGNAL_TS) && !(builder->flags & GP_RTP_PCK_USE_MULTI)	) {		strcpy(builder->slMap.mode, "avc-video");	}	/*check if we use AU header or not*/	if (!builder->slMap.SizeLength 		&& !builder->slMap.IndexLength 		&& !builder->slMap.IndexDeltaLength		&& !builder->slMap.DTSDeltaLength  		&& !builder->slMap.CTSDeltaLength		&& !builder->slMap.RandomAccessIndication		&& !builder->slMap.IV_length		&& !builder->slMap.KI_length	) {		builder->has_AU_header= 0;	} else {		builder->has_AU_header = 1;	}}void gp_rtp_builder_set_cryp_info(GP_RTPPacketizer *builder, u64 IV, char *key_indicator, Bool is_encrypted){	if (!key_indicator) {		if (builder->key_indicator) {			/*force flush if no provision for keyIndicator per AU*/			builder->force_flush = (builder->flags & GP_RTP_PCK_KEY_IDX_PER_AU) ? 0 : 1;			free(builder->key_indicator);			builder->key_indicator = NULL;		}	} else if (!builder->key_indicator		||		memcmp(builder->key_indicator, key_indicator, sizeof(char)*builder->slMap.KI_length)	) {		/*force flush if no provision for keyIndicator per AU*/		builder->force_flush = (builder->flags & GP_RTP_PCK_KEY_IDX_PER_AU) ? 0 : 1;		if (!builder->key_indicator) builder->key_indicator = (char *) malloc(sizeof(char)*builder->slMap.KI_length);		memcpy(builder->key_indicator, key_indicator, sizeof(char)*builder->slMap.KI_length);	}	if (builder->IV != IV) {		builder->IV = IV;		if (builder->slMap.IV_delta_length && (builder->slMap.IV_delta_length < gf_get_bit_size((u32) (IV - builder->first_AU_IV) ))) {			builder->first_AU_IV = IV;			builder->force_flush = 1;		}	}	builder->is_encrypted = is_encrypted;}GF_EXPORTBool gf_rtp_builder_get_payload_name(GP_RTPPacketizer *rtpb, char *szPayloadName, char *szMediaName){	u32 flags = rtpb->flags;	switch (rtpb->rtp_payt) {	case GF_RTP_PAYT_MPEG4:		if ((rtpb->slMap.StreamType==GF_STREAM_VISUAL) && (rtpb->slMap.ObjectTypeIndication==0x20)) {			strcpy(szMediaName, "video");			/*ISMACryp video*/			if ( (flags & GP_RTP_PCK_SIGNAL_RAP) && rtpb->slMap.IV_length				&& !(flags & GP_RTP_PCK_SIGNAL_AU_IDX) && !(flags & GP_RTP_PCK_SIGNAL_SIZE)				&& (flags & GP_RTP_PCK_SIGNAL_TS) && !(flags & GP_RTP_PCK_USE_MULTI)				) 			{				strcpy(szPayloadName, "enc-mpeg4-generic");				return 1;			}			/*mpeg4-generic*/			if ( (flags & GP_RTP_PCK_SIGNAL_RAP) || (flags & GP_RTP_PCK_SIGNAL_AU_IDX) || (flags & GP_RTP_PCK_SIGNAL_SIZE) 				|| (flags & GP_RTP_PCK_SIGNAL_TS) || (flags & GP_RTP_PCK_USE_MULTI) ) {				strcpy(szPayloadName, "mpeg4-generic");				return 1;			} else {				strcpy(szPayloadName, "MP4V-ES");				return 1;			} 		}		/*for all other types*/		if (rtpb->slMap.StreamType==GF_STREAM_AUDIO) strcpy(szMediaName, "audio");		else if (rtpb->slMap.StreamType==GF_STREAM_MPEGJ) strcpy(szMediaName, "application");		else strcpy(szMediaName, "video");		strcpy(szPayloadName, rtpb->slMap.IV_length ? "enc-mpeg4-generic" : "mpeg4-generic");		return 1;	case GF_RTP_PAYT_MPEG12_VIDEO:		strcpy(szMediaName, "video");		strcpy(szPayloadName, "MPV");		return 1;	case GF_RTP_PAYT_MPEG12_AUDIO:		strcpy(szMediaName, "audio");		strcpy(szPayloadName, "MPA");		return 1;	case GF_RTP_PAYT_H263:		strcpy(szMediaName, "video");		strcpy(szPayloadName, "H263-1998");		return 1;	case GF_RTP_PAYT_AMR:		strcpy(szMediaName, "audio");		strcpy(szPayloadName, "AMR");		return 1;	case GF_RTP_PAYT_AMR_WB:		strcpy(szMediaName, "audio");		strcpy(szPayloadName, "AMR-WB");		return 1;	case GF_RTP_PAYT_3GPP_TEXT:		strcpy(szMediaName, "text");		strcpy(szPayloadName, "3gpp-tt");		return 1;	case GF_RTP_PAYT_H264_AVC:		strcpy(szMediaName, "video");		strcpy(szPayloadName, "H264");		return 1;	case GF_RTP_PAYT_QCELP:		strcpy(szMediaName, "audio");		strcpy(szPayloadName, "QCELP");		return 1;	case GF_RTP_PAYT_EVRC_SMV:		strcpy(szMediaName, "audio");		strcpy(szPayloadName, (rtpb->slMap.ObjectTypeIndication==0xA0) ? "EVRC" : "SMV");		/*header-free version*/		if (rtpb->auh_size<=1) strcat(szPayloadName, "0");		return 1;	case GF_RTP_PAYT_LATM: 		strcpy(szMediaName, "audio"); 		strcpy(szPayloadName, "MP4A-LATM"); 		return 1; 	default:		strcpy(szMediaName, "");		strcpy(szPayloadName, "");		return 0;	}	return 0;}GF_EXPORTGF_Err gf_rtp_builder_format_sdp(GP_RTPPacketizer *builder, char *payload_name, char *sdpLine, char *dsi, u32 dsi_size){	char buffer[20000], dsiString[20000];	u32 i, k;	Bool is_first = 1;	if ((builder->rtp_payt!=GF_RTP_PAYT_MPEG4) && (builder->rtp_payt!=GF_RTP_PAYT_LATM) ) return GF_BAD_PARAM;	#define SDP_ADD_INT(_name, _val) { if (!is_first) strcat(sdpLine, "; "); sprintf(buffer, "%s=%d", _name, _val); strcat(sdpLine, buffer); is_first = 0;}#define SDP_ADD_STR(_name, _val) { if (!is_first) strcat(sdpLine, "; "); sprintf(buffer, "%s=%s", _name, _val); strcat(sdpLine, buffer); is_first = 0;}	sprintf(sdpLine, "a=fmtp:%d ", builder->PayloadType);		/*mandatory fields*/	if (builder->slMap.PL_ID) SDP_ADD_INT("profile-level-id", builder->slMap.PL_ID);	if (builder->rtp_payt == GF_RTP_PAYT_LATM) SDP_ADD_INT("cpresent", 0); 		if (dsi && dsi_size) {		k = 0;		for (i=0; i<dsi_size; i++) {			sprintf(&dsiString[k], "%02x", (unsigned char) dsi[i]);			k+=2;		}		dsiString[k] = 0;		SDP_ADD_STR("config", dsiString);	}	if (!strcmp(payload_name, "MP4V-ES") || (builder->rtp_payt == GF_RTP_PAYT_LATM) ) return GF_OK;	SDP_ADD_INT("streamType", builder->slMap.StreamType);	if (strcmp(builder->slMap.mode, "") && strcmp(builder->slMap.mode, "default")) {		SDP_ADD_STR("mode", builder->slMap.mode);	} else {		SDP_ADD_STR("mode", "generic");	}	/*optional fields*/	if (builder->slMap.ObjectTypeIndication) SDP_ADD_INT("objectType", builder->slMap.ObjectTypeIndication);	if (builder->slMap.ConstantSize) SDP_ADD_INT("constantSize", builder->slMap.ConstantSize);	if (builder->slMap.ConstantDuration) SDP_ADD_INT("constantDuration", builder->slMap.ConstantDuration);	if (builder->slMap.maxDisplacement) SDP_ADD_INT("maxDisplacement", builder->slMap.maxDisplacement);	if (builder->slMap.deinterleaveBufferSize) SDP_ADD_INT("de-interleaveBufferSize", builder->slMap.deinterleaveBufferSize);	if (builder->slMap.SizeLength) SDP_ADD_INT("sizeLength", builder->slMap.SizeLength);	if (builder->slMap.IndexLength) SDP_ADD_INT("indexLength", builder->slMap.IndexLength);	if (builder->slMap.IndexDeltaLength) SDP_ADD_INT("indexDeltaLength", builder->slMap.IndexDeltaLength);	if (builder->slMap.CTSDeltaLength) SDP_ADD_INT("CTSDeltaLength", builder->slMap.CTSDeltaLength);	if (builder->slMap.DTSDeltaLength) SDP_ADD_INT("DTSDeltaLength", builder->slMap.DTSDeltaLength);	if (builder->slMap.RandomAccessIndication) SDP_ADD_INT("randomAccessIndication", builder->slMap.RandomAccessIndication);	if (builder->slMap.StreamStateIndication) SDP_ADD_INT("streamStateIndication", builder->slMap.StreamStateIndication);	if (builder->slMap.AuxiliaryDataSizeLength) SDP_ADD_INT("auxiliaryDataSizeLength", builder->slMap.AuxiliaryDataSizeLength);	/*ISMACryp config*/	if (builder->slMap.IV_length) {		/*don't write default*/		/*SDP_ADD_STR("ISMACrypCryptoSuite", "AES_CTR_128");*/		if (builder->flags & GP_RTP_PCK_SELECTIVE_ENCRYPTION) SDP_ADD_INT("ISMACrypSelectiveEncryption", 1);		SDP_ADD_INT("ISMACrypIVLength", builder->slMap.IV_length);		if (builder->slMap.IV_delta_length) SDP_ADD_INT("ISMACrypDeltaIVLength", builder->slMap.IV_delta_length);		if (builder->slMap.KI_length) SDP_ADD_INT("ISMACrypKeyIndicatorLength", builder->slMap.KI_length);		if (builder->flags & GP_RTP_PCK_KEY_IDX_PER_AU) SDP_ADD_INT("ISMACrypKeyIndicatorPerAU", 1);	}	return GF_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -