[asterisk-commits] file: branch file/mf-attributes r417749 - /team/file/mf-attributes/res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jul 2 05:41:10 CDT 2014


Author: file
Date: Wed Jul  2 05:41:04 2014
New Revision: 417749

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=417749
Log:
Move res_format_attr_h264 over.

Modified:
    team/file/mf-attributes/res/res_format_attr_h264.c

Modified: team/file/mf-attributes/res/res_format_attr_h264.c
URL: http://svnview.digium.com/svn/asterisk/team/file/mf-attributes/res/res_format_attr_h264.c?view=diff&rev=417749&r1=417748&r2=417749
==============================================================================
--- team/file/mf-attributes/res/res_format_attr_h264.c (original)
+++ team/file/mf-attributes/res/res_format_attr_h264.c Wed Jul  2 05:41:04 2014
@@ -231,114 +231,79 @@
 	return cloned;
 }
 
-/*! \brief Helper function which converts a key enum into a string value for SDP */
-static const char *h264_attr_key_to_str(enum h264_attr_keys key)
-{
-	switch (key) {
-	case H264_ATTR_KEY_MAX_MBPS:
-		return "max-mbps";
-	case H264_ATTR_KEY_MAX_FS:
-		return "max-fs";
-	case H264_ATTR_KEY_MAX_CPB:
-		return "max-cpb";
-	case H264_ATTR_KEY_MAX_DPB:
-		return "max-dpb";
-	case H264_ATTR_KEY_MAX_BR:
-		return "max-br";
-	case H264_ATTR_KEY_MAX_SMBPS:
-		return "max-smbps";
-	case H264_ATTR_KEY_MAX_FPS:
-		return "max-fps";
-	case H264_ATTR_KEY_REDUNDANT_PIC_CAP:
-		return "redundant-pic-cap";
-	case H264_ATTR_KEY_PARAMETER_ADD:
-		return "parameter-add";
-	case H264_ATTR_KEY_PACKETIZATION_MODE:
-		return "packetization-mode";
-	case H264_ATTR_KEY_SPROP_INTERLEAVING_DEPTH:
-		return "sprop-interleaving-depth";
-	case H264_ATTR_KEY_SPROP_DEINT_BUF_REQ:
-		return "sprop-deint-buf-req";
-	case H264_ATTR_KEY_DEINT_BUF_CAP:
-		return "deint-buf-cap";
-	case H264_ATTR_KEY_SPROP_INIT_BUF_TIME:
-		return "sprop-init-buf-time";
-	case H264_ATTR_KEY_SPROP_MAX_DON_DIFF:
-		return "sprop-max-don-diff";
-	case H264_ATTR_KEY_MAX_RCMD_NALU_SIZE:
-		return "max-rcmd-nalu-size";
-	case H264_ATTR_KEY_LEVEL_ASYMMETRY_ALLOWED:
-		return "level-asymmetry-allowed";
-	default:
-		return NULL;
-	}
-
-	return NULL;
-}
-
-/*! \brief Helper function which determines if the value of an attribute can be placed into the SDP */
-static int h264_attr_key_addable(const struct ast_format_attr *format_attr, enum h264_attr_keys key)
-{
-	switch (key) {
-	case H264_ATTR_KEY_REDUNDANT_PIC_CAP:
-	case H264_ATTR_KEY_PARAMETER_ADD:
-	case H264_ATTR_KEY_PACKETIZATION_MODE:
-	case H264_ATTR_KEY_LEVEL_ASYMMETRY_ALLOWED:
-		return (format_attr->format_attr[key] != H264_ATTR_KEY_UNSET) ? 1 : 0;
-	default:
-		return format_attr->format_attr[key] ? 1 : 0;
-	}
-
-	return 1;
-}
-
-static void h264_format_attr_sdp_generate(const struct ast_format_attr *format_attr, unsigned int payload, struct ast_str **str)
-{
-	int i, added = 0;
-
-        for (i = H264_ATTR_KEY_PROFILE_IDC; i < H264_ATTR_KEY_END; i++) {
-                const char *name;
-
-		if (i == H264_ATTR_KEY_SPS && format_attr->format_attr[H264_ATTR_KEY_SPS] && format_attr->format_attr[H264_ATTR_KEY_PPS]) {
-			unsigned char spsdecoded[H264_MAX_SPS_PPS_SIZE] = { 0, }, ppsdecoded[H264_MAX_SPS_PPS_SIZE] = { 0, };
-			int pos;
-			char sps[H264_MAX_SPS_PPS_SIZE], pps[H264_MAX_SPS_PPS_SIZE];
-
-			for (pos = 0; pos < H264_MAX_SPS_PPS_SIZE; pos++) {
-				spsdecoded[pos] = format_attr->format_attr[H264_ATTR_KEY_SPS + pos];
-				ppsdecoded[pos] = format_attr->format_attr[H264_ATTR_KEY_PPS + pos];
-			}
-
-			ast_base64encode(sps, spsdecoded, format_attr->format_attr[H264_ATTR_KEY_SPS_LEN], H264_MAX_SPS_PPS_SIZE);
-			ast_base64encode(pps, ppsdecoded, format_attr->format_attr[H264_ATTR_KEY_PPS_LEN], H264_MAX_SPS_PPS_SIZE);
-
-			if (!added) {
-				ast_str_append(str, 0, "a=fmtp:%u sprop-parameter-sets=%s,%s", payload, sps, pps);
-				added = 1;
-			} else {
-				ast_str_append(str, 0, ";sprop-parameter-sets=%s,%s", sps, pps);
-			}
-		} else if (i == H264_ATTR_KEY_PROFILE_IDC && format_attr->format_attr[H264_ATTR_KEY_PROFILE_IDC] &&
-		    format_attr->format_attr[H264_ATTR_KEY_PROFILE_IOP] && format_attr->format_attr[H264_ATTR_KEY_LEVEL]) {
-			if (!added) {
-				ast_str_append(str, 0, "a=fmtp:%u profile-level-id=%02X%02X%02X", payload, format_attr->format_attr[H264_ATTR_KEY_PROFILE_IDC],
-					       format_attr->format_attr[H264_ATTR_KEY_PROFILE_IOP], format_attr->format_attr[H264_ATTR_KEY_LEVEL]);
-				added = 1;
-			} else {
-				ast_str_append(str, 0, ";profile-level-id=%02X%02X%02X", format_attr->format_attr[H264_ATTR_KEY_PROFILE_IDC],
-					       format_attr->format_attr[H264_ATTR_KEY_PROFILE_IOP], format_attr->format_attr[H264_ATTR_KEY_LEVEL]);
-			}
-		} else if ((name = h264_attr_key_to_str(i)) && h264_attr_key_addable(format_attr, i)) {
-			if (!added) {
-				ast_str_append(str, 0, "a=fmtp:%u %s=%u", payload, name, format_attr->format_attr[i]);
-				added = 1;
-			} else {
-				ast_str_append(str, 0, ";%s=%u", name, format_attr->format_attr[i]);
-			}
+#define APPEND_IF_NOT_H264_UNSET(field, str, name) do {		\
+	if (field != H264_ATTR_KEY_UNSET) {	\
+		if (added) {	\
+			ast_str_append(str, 0, ";");	\
+		} else {	\
+			added = 1;	\
+		}	\
+		ast_str_append(str, 0, "%s=%u", name, field);	\
+	}	\
+} while (0)
+
+#define APPEND_IF_NONZERO(field, str, name) do {		\
+	if (field) {	\
+		if (added) {	\
+			ast_str_append(str, 0, ";");	\
+		} else {	\
+			added = 1;	\
+		}	\
+		ast_str_append(str, 0, "%s=%u", name, field);	\
+	}	\
+} while (0)
+
+static void h264_sdp_generate(const struct ast_format *format, unsigned int payload, struct ast_str **str)
+{
+	struct h264_attr *attr = ast_format_get_attribute_data(format);
+	int added = 0;
+
+	if (!attr) {
+		return;
+	}
+
+	ast_str_append(str, 0, "a=fmtp:%u ", payload);
+
+	APPEND_IF_NONZERO(attr->MAX_MBPS, str, "max-mbps");
+	APPEND_IF_NONZERO(attr->MAX_FS, str, "max-fs");
+	APPEND_IF_NONZERO(attr->MAX_CPB, str, "max-cpb");
+	APPEND_IF_NONZERO(attr->MAX_DPB, str, "max-dpb");
+	APPEND_IF_NONZERO(attr->MAX_BR, str, "max-br");
+	APPEND_IF_NONZERO(attr->MAX_SMBPS, str, "max-smbps");
+	APPEND_IF_NONZERO(attr->MAX_FPS, str, "max-fps");
+	APPEND_IF_NONZERO(attr->SPROP_INTERLEAVING_DEPTH, str, "sprop-interleaving-depth");
+	APPEND_IF_NONZERO(attr->SPROP_DEINT_BUF_REQ, str, "sprop-deint-buf-req");
+	APPEND_IF_NONZERO(attr->DEINT_BUF_CAP, str, "deint-buf-cap");
+	APPEND_IF_NONZERO(attr->SPROP_INIT_BUF_TIME, str, "sprop-init-buf-time");
+	APPEND_IF_NONZERO(attr->SPROP_MAX_DON_DIFF, str, "sprop-max-don-diff");
+	APPEND_IF_NONZERO(attr->MAX_RCMD_NALU_SIZE, str, "max-rcmd-nalu-size");
+
+	APPEND_IF_NOT_H264_UNSET(attr->REDUNDANT_PIC_CAP, str, "redundant-pic-cap");
+	APPEND_IF_NOT_H264_UNSET(attr->PARAMETER_ADD, str, "parameter-add");
+	APPEND_IF_NOT_H264_UNSET(attr->PACKETIZATION_MODE, str, "packetization-mode");
+	APPEND_IF_NOT_H264_UNSET(attr->LEVEL_ASYMMETRY_ALLOWED, str, "level-asymmetry-allowed");
+
+	if (attr->PROFILE_IDC && attr->PROFILE_IOP && attr->LEVEL) {
+		if (added) {
+			ast_str_append(str, 0, ";");
+		} else {
+			added = 1;
 		}
-	}
-	
-	if (added) {
+		ast_str_append(str, 0, "profile-level-id=%02X%02X%02X", attr->PROFILE_IDC, attr->PROFILE_IOP, attr->LEVEL);
+	}
+
+	if (!ast_strlen_zero(attr->SPS) && !ast_strlen_zero(attr->PPS)) {
+		if (added) {
+			ast_str_append(str, 0, ";");
+		} else {
+			added = 1;
+		}
+		ast_str_append(str, 0, ";sprop-parameter-sets=%s,%s", attr->SPS, attr->PPS);
+	}
+
+	if (!added) {
+		ast_str_reset(*str);
+	} else {
 		ast_str_append(str, 0, "\r\n");
 	}
 




More information about the asterisk-commits mailing list