📄 rtp_packetizer.c
字号:
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 + -