[asterisk-commits] mjordan: branch group/media_formats-reviewed-trunk r417740 - in /team/group/m...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jul 1 20:15:15 CDT 2014


Author: mjordan
Date: Tue Jul  1 20:15:10 2014
New Revision: 417740

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=417740
Log:
rtp_engine: Update APIs/RTP stack to handle packetization

Primarily, this patch does the following:
(1) Removes ast_rtp_codecs_packetization_set. This call was effectively a NoOp
    with res_rtp_asterisk/res_rtp_multicast. The various channel drivers now
    call ast_rtp_codecs_set_framing where appropriate.
(2) A major overhaul of ast_rtp_codec and its corresponding APIs was done.
    This includes:
 (a) Storing the framing on the structure. This allows for the smoother in
     res_rtp_asterisk to easily get the framing specified without having to do
     major gyrations.
 (b) Payload types (which are ao2 ref counted objects) are no longer stored in
     an ao2_container. This container had two patterns of usage: lookups by an
     integer key value and iteration. Vectors work well for this type of access
     and - for relatively small numbers of items (which is generally the case
     for payload types), are much faster on both counts.
(3) The 'use_ptime' setting in res_pjsip_sdp_rtp now works. Packetization is
    also handled a little bit better, as both the RTP engine and format_cap API
    already do the job of managing the framing.

A variety of ref leaks were cleaned up as well along the way.

Review: https://reviewboard.asterisk.org/r/3687/

Modified:
    team/group/media_formats-reviewed-trunk/addons/chan_ooh323.c
    team/group/media_formats-reviewed-trunk/addons/ooh323cDriver.c
    team/group/media_formats-reviewed-trunk/bridges/bridge_native_rtp.c
    team/group/media_formats-reviewed-trunk/bridges/bridge_softmix.c
    team/group/media_formats-reviewed-trunk/channels/chan_gtalk.c
    team/group/media_formats-reviewed-trunk/channels/chan_h323.c
    team/group/media_formats-reviewed-trunk/channels/chan_iax2.c
    team/group/media_formats-reviewed-trunk/channels/chan_jingle.c
    team/group/media_formats-reviewed-trunk/channels/chan_motif.c
    team/group/media_formats-reviewed-trunk/channels/chan_sip.c
    team/group/media_formats-reviewed-trunk/channels/chan_skinny.c
    team/group/media_formats-reviewed-trunk/formats/format_h263.c
    team/group/media_formats-reviewed-trunk/formats/format_h264.c
    team/group/media_formats-reviewed-trunk/include/asterisk/format.h
    team/group/media_formats-reviewed-trunk/include/asterisk/format_cap.h
    team/group/media_formats-reviewed-trunk/include/asterisk/frame.h
    team/group/media_formats-reviewed-trunk/include/asterisk/rtp_engine.h
    team/group/media_formats-reviewed-trunk/include/asterisk/vector.h
    team/group/media_formats-reviewed-trunk/main/format.c
    team/group/media_formats-reviewed-trunk/main/format_cap.c
    team/group/media_formats-reviewed-trunk/main/rtp_engine.c
    team/group/media_formats-reviewed-trunk/res/res_fax.c
    team/group/media_formats-reviewed-trunk/res/res_pjsip_sdp_rtp.c
    team/group/media_formats-reviewed-trunk/res/res_rtp_asterisk.c
    team/group/media_formats-reviewed-trunk/res/res_speech.c
    team/group/media_formats-reviewed-trunk/tests/test_format_cap.c

Modified: team/group/media_formats-reviewed-trunk/addons/chan_ooh323.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/addons/chan_ooh323.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/addons/chan_ooh323.c (original)
+++ team/group/media_formats-reviewed-trunk/addons/chan_ooh323.c Tue Jul  1 20:15:10 2014
@@ -1548,12 +1548,7 @@
 	  		ast_verb(0, "Writeformat before update %s/%s\n", 
 			  ast_format_get_name(ast_channel_writeformat(p->owner)),
 			  ast_getformatname_multiple(formats, sizeof(formats), ast_channel_nativeformats(p->owner)));
-	  	/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-		if (txframes)
-			ast_codec_pref_setsize(&p->prefs, fmt, txframes);
-		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &p->prefs);
-#endif
+
 		if (p->dtmfmode & H323_DTMF_RFC2833 && p->dtmfcodec) {
 			ast_rtp_codecs_payloads_set_rtpmap_type(ast_rtp_instance_get_codecs(p->rtp),
 				 p->rtp, p->dtmfcodec, "audio", "telephone-event", 0);
@@ -1563,6 +1558,9 @@
 				 p->rtp, p->dtmfcodec, "audio", "cisco-telephone-event", 0);
 		}
 
+		if (txframes) {
+			ast_format_cap_set_framing(caps, txframes);
+		}
 		ast_format_cap_add(caps, fmt, 0);
 		ast_channel_nativeformats_set(p->owner, caps);
 		ao2_ref(caps, -1);
@@ -4591,10 +4589,10 @@
 	ast_channel_unlock(p->owner);
 
 	if (p->rtp) {
-	  	/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &p->prefs);
-#endif
+		if (p->cap) {
+			ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(p->rtp),
+				ast_format_cap_get_framing(p->cap));
+		}
 		if (p->nat) {
 			ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_NAT, 1);
 		}

Modified: team/group/media_formats-reviewed-trunk/addons/ooh323cDriver.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/addons/ooh323cDriver.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/addons/ooh323cDriver.c (original)
+++ team/group/media_formats-reviewed-trunk/addons/ooh323cDriver.c Tue Jul  1 20:15:10 2014
@@ -415,7 +415,7 @@
             ast_verb(0, "\tAdding g711 ulaw capability to call(%s, %s)\n", 
                                               call->callType, call->callToken);
 	 }
-	 txframes = ast_format_cap_get_framing(cap, format);
+	 txframes = ast_format_cap_get_format_framing(cap, format);
          ret= ooCallAddG711Capability(call, OO_G711ULAW64K, txframes, 
                                       txframes, OORXANDTX, 
                                       &ooh323c_start_receive_channel,
@@ -429,7 +429,7 @@
             ast_verb(0, "\tAdding g711 alaw capability to call(%s, %s)\n",
                                             call->callType, call->callToken);
 	 }
-         txframes = ast_format_cap_get_framing(cap, format);
+         txframes = ast_format_cap_get_format_framing(cap, format);
          ret= ooCallAddG711Capability(call, OO_G711ALAW64K, txframes, 
                                      txframes, OORXANDTX, 
                                      &ooh323c_start_receive_channel,
@@ -444,7 +444,7 @@
             ast_verb(0, "\tAdding g726 capability to call (%s, %s)\n",
                                            call->callType, call->callToken);
 	 }
-	 txframes = ast_format_cap_get_framing(cap, format);
+	 txframes = ast_format_cap_get_format_framing(cap, format);
          ret = ooCallAddG726Capability(call, OO_G726, txframes, grxframes, FALSE,
                                      OORXANDTX, &ooh323c_start_receive_channel,
                                      &ooh323c_start_transmit_channel,
@@ -459,7 +459,7 @@
             ast_verb(0, "\tAdding g726aal2 capability to call (%s, %s)\n",
                                            call->callType, call->callToken);
 	 }
-	 txframes = ast_format_cap_get_framing(cap, format);
+	 txframes = ast_format_cap_get_format_framing(cap, format);
          ret = ooCallAddG726Capability(call, OO_G726AAL2, txframes, grxframes, FALSE,
                                      OORXANDTX, &ooh323c_start_receive_channel,
                                      &ooh323c_start_transmit_channel,
@@ -471,7 +471,7 @@
       if(ast_format_cmp(format, ast_format_g729) == AST_FORMAT_CMP_EQUAL)
       {
       
-         txframes = (ast_format_cap_get_framing(cap, format))/10;
+         txframes = (ast_format_cap_get_format_framing(cap, format))/10;
          if (gH323Debug) {
             ast_verb(0, "\tAdding g729A capability to call(%s, %s)\n",
                                             call->callType, call->callToken);

Modified: team/group/media_formats-reviewed-trunk/bridges/bridge_native_rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/bridges/bridge_native_rtp.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/bridges/bridge_native_rtp.c (original)
+++ team/group/media_formats-reviewed-trunk/bridges/bridge_native_rtp.c Tue Jul  1 20:15:10 2014
@@ -383,10 +383,10 @@
 		return 0;
 	}
 
-	read_ptime0 = ast_format_cap_get_framing(cap0, ast_channel_rawreadformat(c0->chan));
-	read_ptime1 = ast_format_cap_get_framing(cap1, ast_channel_rawreadformat(c1->chan));
-	write_ptime0 = ast_format_cap_get_framing(cap0, ast_channel_rawwriteformat(c0->chan));
-	write_ptime1 = ast_format_cap_get_framing(cap1, ast_channel_rawwriteformat(c1->chan));
+	read_ptime0 = ast_format_cap_get_format_framing(cap0, ast_channel_rawreadformat(c0->chan));
+	read_ptime1 = ast_format_cap_get_format_framing(cap1, ast_channel_rawreadformat(c1->chan));
+	write_ptime0 = ast_format_cap_get_format_framing(cap0, ast_channel_rawwriteformat(c0->chan));
+	write_ptime1 = ast_format_cap_get_format_framing(cap1, ast_channel_rawwriteformat(c1->chan));
 
 	if (read_ptime0 != write_ptime1 || read_ptime1 != write_ptime0) {
 		ast_debug(1, "Packetization differs between RTP streams (%d != %d or %d != %d). Cannot native bridge in RTP\n",

Modified: team/group/media_formats-reviewed-trunk/bridges/bridge_softmix.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/bridges/bridge_softmix.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/bridges/bridge_softmix.c (original)
+++ team/group/media_formats-reviewed-trunk/bridges/bridge_softmix.c Tue Jul  1 20:15:10 2014
@@ -511,7 +511,7 @@
 		ast_mutex_lock(&sc->lock);
 		ast_bridge_update_talker_src_video_mode(bridge, bridge_channel->chan,
 			sc->video_talker.energy_average,
-			frame->subclass.video.frame_ending);
+			frame->subclass.frame_ending);
 		ast_mutex_unlock(&sc->lock);
 		video_src_priority = ast_bridge_is_video_src(bridge, bridge_channel->chan);
 		if (video_src_priority == 1) {

Modified: team/group/media_formats-reviewed-trunk/channels/chan_gtalk.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_gtalk.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_gtalk.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_gtalk.c Tue Jul  1 20:15:10 2014
@@ -658,10 +658,6 @@
 			continue;
 		}
 
-		ast_rtp_codecs_payloads_set_m_type(
-			ast_rtp_instance_get_codecs(tmp->rtp),
-			tmp->rtp,
-			atoi(codec_id));
 		ast_rtp_codecs_payloads_set_rtpmap_type(
 			ast_rtp_instance_get_codecs(tmp->rtp),
 			tmp->rtp,
@@ -1156,16 +1152,14 @@
 		what = global_capability;
 	}
 
-	/* Set Frame packetization */
-// BUGBUG
-//	if (i->rtp) {
-//		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(i->rtp), i->rtp, &i->prefs);
-//	}
-
 	tmpfmt = ast_format_cap_get_format(what, 0);
 	ast_format_cap_add(caps, tmpfmt, 0);
 	ast_format_cap_append_by_type(caps, i->jointcap, AST_MEDIA_TYPE_VIDEO);
 	ast_channel_nativeformats_set(tmp, caps);
+	if (i->rtp) {
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(i->rtp),
+			ast_format_cap_get_format_framing(caps, tmpfmt));
+	}
 	ao2_ref(caps, -1);
 
 	if (i->rtp) {
@@ -1375,10 +1369,6 @@
 			continue;
 		}
 		if (!strcmp(S_OR(iks_name(codec), ""), "vid:payload-type") && p->vrtp) {
-			ast_rtp_codecs_payloads_set_m_type(
-				ast_rtp_instance_get_codecs(p->vrtp),
-				p->vrtp,
-				atoi(codec_id));
 			ast_rtp_codecs_payloads_set_rtpmap_type(
 				ast_rtp_instance_get_codecs(p->vrtp),
 				p->vrtp,
@@ -1387,10 +1377,6 @@
 				codec_name,
 				0);
 		} else {
-			ast_rtp_codecs_payloads_set_m_type(
-				ast_rtp_instance_get_codecs(p->rtp),
-				p->rtp,
-				atoi(codec_id));
 			ast_rtp_codecs_payloads_set_rtpmap_type(
 				ast_rtp_instance_get_codecs(p->rtp),
 				p->rtp,

Modified: team/group/media_formats-reviewed-trunk/channels/chan_h323.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_h323.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_h323.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_h323.c Tue Jul  1 20:15:10 2014
@@ -1046,11 +1046,17 @@
 	if (pvt->dtmf_pt[1] > 0)
 		ast_rtp_codecs_payloads_set_rtpmap_type(ast_rtp_instance_get_codecs(pvt->rtp), pvt->rtp, pvt->dtmf_pt[1], "audio", "cisco-telephone-event", 0);
 
-	/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-	if (pvt->peercapability)
-		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(pvt->rtp), pvt->rtp, &pvt->peer_prefs);
-#endif
+	if (pvt->peercapability) {
+		unsigned int framing = UINT_MAX;
+
+		for (i = 0; i < AST_CODEC_PREF_SIZE; ++i) {
+			if (pvt->peer_prefs.framing[i]) {
+				framing = MIN(framing, pvt->peer_prefs.framing[i]);
+			}
+		}
+
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(pvt->rtp), framing);
+	}
 
 	if (pvt->owner && !ast_channel_trylock(pvt->owner)) {
 		ast_jb_configure(pvt->owner, &global_jbconf);
@@ -2129,13 +2135,14 @@
 	/* Change native format to reflect information taken from OLC/OLCAck */
 	nativeformats_changed = 0;
 	if (pt != 128 && pvt->rtp) {	/* Payload type is invalid, so try to use previously decided */
-		struct ast_rtp_payload_type rtptype = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(pvt->rtp), pt);
-		if (rtptype.asterisk_format) {
-			if (pvt->nativeformats != ast_format_compatibility_format2bitfield(&rtptype.format)) {
-				pvt->nativeformats = ast_format_compatibility_format2bitfield(&rtptype.format);
+		struct ast_rtp_payload_type *rtptype = ast_rtp_codecs_get_payload(ast_rtp_instance_get_codecs(pvt->rtp), pt);
+		if (rtptype && rtptype->asterisk_format) {
+			if (pvt->nativeformats != ast_format_compatibility_format2bitfield(&rtptype->format)) {
+				pvt->nativeformats = ast_format_compatibility_format2bitfield(&rtptype->format);
 				nativeformats_changed = 1;
 			}
 		}
+		ao2_cleanup(rtptype);
 	} else if (h323debug)
 		ast_log(LOG_NOTICE, "Payload type is unknown, formats isn't changed\n");
 
@@ -2603,25 +2610,29 @@
 		if (h323debug) {
 			int i;
 			struct ast_format *fmt;
-			for (i = 0; i < 32; ++i) {
+			for (i = 0; i < AST_CODEC_PREF_SIZE; ++i) {
 				if (!prefs->order[i])
 					break;
 				ast_debug(1, "prefs[%d]=%s\n", i, ast_format_get_name(ast_codec_pref_index(prefs, i, &fmt)));
 			}
 		}
 		if (pvt->rtp) {
-			if (pvt->options.autoframing) {
-				ast_debug(2, "Autoframing option set, using peer's packetization settings\n");
-				/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-				ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(pvt->rtp), pvt->rtp, &pvt->peer_prefs);
-#endif
-			} else {
-				ast_debug(2, "Autoframing option not set, ignoring peer's packetization settings\n");
-				/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-				ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(pvt->rtp), pvt->rtp, &pvt->options.prefs);
-#endif
+			struct ast_codec_pref *framing_prefs = pvt->options.autoframing ? &pvt->peer_prefs : &pvt->options.prefs;
+			int i;
+			unsigned int framing = UINT_MAX;
+
+			for (i = 0; i < AST_CODEC_PREF_SIZE; ++i) {
+				if (framing_prefs->framing[i]) {
+					framing = MIN(framing, framing_prefs->framing[i]);
+				}
+			}
+
+			if (framing != UINT_MAX && pvt->options.autoframing) {
+				ast_debug(2, "Autoframing option set, using peer's packetization settings (%d)\n", framing);
+				ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(pvt->rtp), framing);
+			} else if (framing != UINT_MAX) {
+				ast_debug(2, "Autoframing option not set, ignoring peer's packetization settings (%d)\n", framing);
+				ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(pvt->rtp), framing);
 			}
 		}
 	}

Modified: team/group/media_formats-reviewed-trunk/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_iax2.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_iax2.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_iax2.c Tue Jul  1 20:15:10 2014
@@ -1887,8 +1887,7 @@
 
 	for (i = 0; i < ast_format_cap_count(cap); i++) {
 		struct ast_format *fmt = ast_format_cap_get_format(cap, i);
-
-		ast_codec_pref_append(pref, fmt, ast_format_cap_get_framing(cap, fmt));
+		ast_codec_pref_append(pref, fmt, ast_format_cap_get_format_framing(cap, fmt));
 		ao2_ref(fmt, -1);
 	}
 
@@ -4626,8 +4625,7 @@
 			for (i = 0; i < ast_format_cap_count(ast_channel_nativeformats(c)); i++) {
 				struct ast_format *format = ast_format_cap_get_format(
 					ast_channel_nativeformats(c), i);
-
-				ast_codec_pref_prepend(&ourprefs, format, ast_format_cap_get_framing(ast_channel_nativeformats(c), format), 1);
+				ast_codec_pref_prepend(&ourprefs, format, ast_format_cap_get_format_framing(ast_channel_nativeformats(c), format), 1);
 				ao2_ref(format, -1);
 			}
 		}
@@ -4660,8 +4658,7 @@
 		for (i = 0; i < ast_format_cap_count(ast_channel_nativeformats(c)); i++) {
 			struct ast_format *tmpfmt = ast_format_cap_get_format(
 				ast_channel_nativeformats(c), i);
-
-			ast_codec_pref_prepend(&ourprefs, tmpfmt, ast_format_cap_get_framing(ast_channel_nativeformats(c), tmpfmt), 1);
+			ast_codec_pref_prepend(&ourprefs, tmpfmt, ast_format_cap_get_format_framing(ast_channel_nativeformats(c), tmpfmt), 1);
 			ao2_ref(tmpfmt, -1);
 		}
 	}
@@ -6592,7 +6589,7 @@
 
 		if (fr->af.frametype == AST_FRAME_VIDEO) {
 			iax2_format tmpfmt = ast_format_compatibility_format2bitfield(fr->af.subclass.format);
-			tmpfmt |= fr->af.subclass.video.frame_ending ? 0x1LL : 0;
+			tmpfmt |= fr->af.subclass.frame_ending ? 0x1LL : 0;
 			fh->csub = compress_subclass(tmpfmt | ((tmpfmt & 0x1LL) << 6));
 		} else if (fr->af.frametype == AST_FRAME_VOICE) {
 			fh->csub = compress_subclass(ast_format_compatibility_format2bitfield(fr->af.subclass.format));
@@ -6651,7 +6648,7 @@
 			vh = (struct ast_iax2_video_hdr *)(fr->af.data.ptr - sizeof(struct ast_iax2_video_hdr));
 			vh->zeros = 0;
 			vh->callno = htons(0x8000 | fr->callno);
-			vh->ts = htons((fr->ts & 0x7FFF) | (fr->af.subclass.video.frame_ending ? 0x8000 : 0));
+			vh->ts = htons((fr->ts & 0x7FFF) | (fr->af.subclass.frame_ending ? 0x8000 : 0));
 			fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_video_hdr);
 			fr->data = vh;
 			fr->retries = -1;
@@ -10106,7 +10103,7 @@
 		if (f.frametype == AST_FRAME_VIDEO) {
 			f.subclass.format = ast_format_compatibility_bitfield2format(uncompress_subclass(fh->csub & ~0x40));
 			if ((fh->csub >> 6) & 0x1) {
-				f.subclass.video.frame_ending = 1;
+				f.subclass.frame_ending = 1;
 			}
 		} else if (f.frametype == AST_FRAME_VOICE) {
 			f.subclass.format = ast_format_compatibility_bitfield2format(uncompress_subclass(fh->csub));
@@ -11702,7 +11699,7 @@
 		f.frametype = AST_FRAME_VIDEO;
 		if (iaxs[fr->callno]->videoformat > 0) {
 			if (ntohs(vh->ts) & 0x8000LL) {
-				f.subclass.video.frame_ending = 1;
+				f.subclass.frame_ending = 1;
 			}
 			f.subclass.format = ast_format_compatibility_bitfield2format(iaxs[fr->callno]->videoformat);
 		} else {

Modified: team/group/media_formats-reviewed-trunk/channels/chan_jingle.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_jingle.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_jingle.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_jingle.c Tue Jul  1 20:15:10 2014
@@ -876,15 +876,13 @@
 	else
 		what = global_capability;
 
-	/* Set Frame packetization */
-// BUGBUG
-//	if (i->rtp)
-//		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(i->rtp), i->rtp, &i->prefs);
-
 	tmpfmt = ast_format_cap_get_format(what, 0);
 	ast_format_cap_add(caps, tmpfmt, 0);
 	ast_format_cap_append_by_type(caps, i->jointcap, AST_MEDIA_TYPE_VIDEO);
 	ast_channel_nativeformats_set(tmp, caps);
+	if (i->rtp) {
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(i->rtp), ast_format_cap_get_format_framing(i->cap, tmpfmt));
+	}
 	ao2_ref(caps, -1);
 
 	if (i->rtp) {
@@ -1084,7 +1082,6 @@
 		        ast_copy_string(p->audio_content_name, iks_find_attrib(content, "name"), sizeof(p->audio_content_name));
 
 			while (codec) {
-				ast_rtp_codecs_payloads_set_m_type(ast_rtp_instance_get_codecs(p->rtp), p->rtp, atoi(iks_find_attrib(codec, "id")));
 				ast_rtp_codecs_payloads_set_rtpmap_type(ast_rtp_instance_get_codecs(p->rtp), p->rtp, atoi(iks_find_attrib(codec, "id")), "audio", iks_find_attrib(codec, "name"), 0);
 				codec = iks_next(codec);
 			}
@@ -1100,7 +1097,6 @@
 		        ast_copy_string(p->video_content_name, iks_find_attrib(content, "name"), sizeof(p->video_content_name));
 
 			while (codec) {
-				ast_rtp_codecs_payloads_set_m_type(ast_rtp_instance_get_codecs(p->rtp), p->rtp, atoi(iks_find_attrib(codec, "id")));
 				ast_rtp_codecs_payloads_set_rtpmap_type(ast_rtp_instance_get_codecs(p->rtp), p->rtp, atoi(iks_find_attrib(codec, "id")), "audio", iks_find_attrib(codec, "name"), 0);
 				codec = iks_next(codec);
 			}

Modified: team/group/media_formats-reviewed-trunk/channels/chan_motif.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_motif.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_motif.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_motif.c Tue Jul  1 20:15:10 2014
@@ -693,8 +693,8 @@
 	ast_rtp_instance_set_channel_id(session->vrtp, ast_channel_uniqueid(session->owner));
 	ast_channel_set_fd(session->owner, 2, ast_rtp_instance_fd(session->vrtp, 0));
 	ast_channel_set_fd(session->owner, 3, ast_rtp_instance_fd(session->vrtp, 1));
-//	ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(session->vrtp), session->vrtp, &session->prefs);
-
+	ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(session->vrtp),
+		ast_format_cap_get_framing(session->cap));
 	if (session->transport == JINGLE_TRANSPORT_GOOGLE_V2 && (ice = ast_rtp_instance_get_ice(session->vrtp))) {
 		ice->stop(session->vrtp);
 	}
@@ -801,14 +801,13 @@
 	ast_channel_nativeformats_set(chan, caps);
 	ao2_ref(caps, -1);
 
-	tmpfmt = ast_format_cap_get_format(session->cap, 0);
-
 	if (session->rtp) {
 		struct ast_rtp_engine_ice *ice;
 
 		ast_channel_set_fd(chan, 0, ast_rtp_instance_fd(session->rtp, 0));
 		ast_channel_set_fd(chan, 1, ast_rtp_instance_fd(session->rtp, 1));
-//		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(session->rtp), session->rtp, &session->prefs);
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(session->rtp),
+			ast_format_cap_get_framing(session->cap));
 
 		if (((session->transport == JINGLE_TRANSPORT_GOOGLE_V2) ||
 		     (session->transport == JINGLE_TRANSPORT_GOOGLE_V1)) &&
@@ -824,11 +823,11 @@
 
 	ast_channel_adsicpe_set(chan, AST_ADSI_UNAVAILABLE);
 
+	tmpfmt = ast_format_cap_get_format(session->cap, 0);
 	ast_channel_set_writeformat(chan, tmpfmt);
 	ast_channel_set_rawwriteformat(chan, tmpfmt);
 	ast_channel_set_readformat(chan, tmpfmt);
 	ast_channel_set_rawreadformat(chan, tmpfmt);
-
 	ao2_ref(tmpfmt, -1);
 
 	ao2_lock(endpoint);
@@ -2093,8 +2092,6 @@
 		int rtp_id, rtp_clockrate;
 
 		if (!ast_strlen_zero(id) && !ast_strlen_zero(name) && (sscanf(id, "%30d", &rtp_id) == 1)) {
-			ast_rtp_codecs_payloads_set_m_type(&codecs, NULL, rtp_id);
-
 			if (!ast_strlen_zero(clockrate) && (sscanf(clockrate, "%30d", &rtp_clockrate) == 1)) {
 				ast_rtp_codecs_payloads_set_rtpmap_type_rate(&codecs, NULL, rtp_id, media, name, 0, rtp_clockrate);
 			} else {

Modified: team/group/media_formats-reviewed-trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_sip.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_sip.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_sip.c Tue Jul  1 20:15:10 2014
@@ -6106,11 +6106,8 @@
 		ast_rtp_instance_set_prop(dialog->rtp, AST_RTP_PROPERTY_DTMF, ast_test_flag(&dialog->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833);
 		ast_rtp_instance_set_prop(dialog->rtp, AST_RTP_PROPERTY_DTMF_COMPENSATE, ast_test_flag(&dialog->flags[1], SIP_PAGE2_RFC2833_COMPENSATE));
 		/* Set Frame packetization */
-		/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(dialog->rtp), dialog->rtp, &dialog->prefs);
-#endif
 		dialog->autoframing = peer->autoframing;
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(dialog->rtp), ast_format_cap_get_framing(dialog->caps));
 	}
 
 	/* XXX TODO: get fields directly from peer only as they are needed using dialog->relatedpeer */
@@ -10084,7 +10081,9 @@
 
 	int peernoncodeccapability = 0, vpeernoncodeccapability = 0, tpeernoncodeccapability = 0;
 
-	struct ast_rtp_codecs newaudiortp = { 0, }, newvideortp = { 0, }, newtextrtp = { 0, };
+	struct ast_rtp_codecs newaudiortp = AST_RTP_CODECS_NULL_INIT;
+	struct ast_rtp_codecs newvideortp = AST_RTP_CODECS_NULL_INIT;
+	struct ast_rtp_codecs newtextrtp = AST_RTP_CODECS_NULL_INIT;
 	struct ast_format_cap *newjointcapability = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT); /* Negotiated capability */
 	struct ast_format_cap *newpeercapability = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 	int newnoncodeccapability;
@@ -10766,7 +10765,7 @@
 			unsigned int framing;
 
 			tmp_fmt = ast_format_cap_get_format(p->jointcaps, 0);
-			framing = ast_format_cap_get_framing(p->jointcaps, tmp_fmt);
+			framing = ast_format_cap_get_format_framing(p->jointcaps, tmp_fmt);
 			ast_format_cap_remove_bytype(p->jointcaps, AST_MEDIA_TYPE_UNKNOWN);
 			ast_format_cap_add(p->jointcaps, tmp_fmt, framing);
 			ao2_ref(tmp_fmt, -1);
@@ -10945,16 +10944,16 @@
 				ast_getformatname_multiple(s2, SIPBUFSIZE, ast_channel_nativeformats(p->owner)));
 		}
 
-		tmp_fmt = ast_format_cap_get_format(p->jointcaps, 0);
-		framing = ast_format_cap_get_framing(p->jointcaps, tmp_fmt);
-
 		caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 		if (caps) {
+			tmp_fmt = ast_format_cap_get_format(p->jointcaps, 0);
+			framing = ast_format_cap_get_format_framing(p->jointcaps, tmp_fmt);
 			ast_format_cap_add(caps, tmp_fmt, framing);
 			ast_format_cap_append_by_type(caps, vpeercapability, AST_MEDIA_TYPE_VIDEO);
 			ast_format_cap_append_by_type(caps, tpeercapability, AST_MEDIA_TYPE_TEXT);
 			ast_channel_nativeformats_set(p->owner, caps);
 			ao2_ref(caps, -1);
+			ao2_ref(tmp_fmt, -1);
 		}
 
 		ast_set_read_format(p->owner, ast_channel_readformat(p->owner));
@@ -11246,21 +11245,11 @@
 				ast_debug(1, "Can't read framing from SDP: %s\n", a);
 			}
 		}
-	/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
+
 		if (framing && p->autoframing) {
-			struct ast_codec_pref *pref = &ast_rtp_instance_get_codecs(p->rtp)->pref;
-			int codec_n;
-			for (codec_n = 0; codec_n < AST_RTP_MAX_PT; codec_n++) {
-				struct ast_rtp_payload_type format = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(p->rtp), codec_n);
-				if (!format.asterisk_format)	/* non-codec or not found */
-					continue;
-				ast_debug(1, "Setting framing for %s to %ld\n", ast_getformatname(&format.format), framing);
-				ast_codec_pref_setsize(pref, &format.format, framing);
-			}
-			ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, pref);
-		}
-#endif
+			ast_debug(1, "Setting framing to %ld\n", framing);
+			ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(p->rtp), framing);
+		}
 		found = TRUE;
 	} else if (sscanf(a, "rtpmap: %30u %127[^/]/%30u", &codec, mimeSubtype, &sample_rate) == 3) {
 		/* We have a rtpmap to handle */
@@ -12950,7 +12939,7 @@
 
 	ast_format_sdp_generate(format, rtp_code, a_buf);
 
-	framing = ast_format_cap_get_framing(p->caps, format);
+	framing = ast_format_cap_get_format_framing(p->caps, format);
 
 	if (ast_format_cmp(format, ast_format_g729) == AST_FORMAT_CMP_EQUAL) {
 		/* Indicate that we don't support VAD (G.729 annex B) */
@@ -13820,10 +13809,7 @@
 	if (p->rtp) {
 		if (!p->autoframing && !ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
 			ast_debug(1, "Setting framing from config on incoming call\n");
-			/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-			ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &p->prefs);
-#endif
+			ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(p->rtp), ast_format_cap_get_framing(p->caps));
 		}
 		ast_rtp_instance_activate(p->rtp);
 		try_suggested_sip_codec(p);
@@ -18501,13 +18487,9 @@
 			peer->name, of, ast_sockaddr_stringify(&p->recv));
 	}
 
-	/* XXX what about p->prefs = peer->prefs; ? */
 	/* Set Frame packetization */
 	if (p->rtp) {
-		/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &peer->prefs);
-#endif
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(p->rtp), ast_format_cap_get_framing(peer->caps));
 		p->autoframing = peer->autoframing;
 	}
 
@@ -18652,10 +18634,7 @@
 		p->rtpkeepalive = peer->rtpkeepalive;
 		if (!dialog_initialize_rtp(p)) {
 			if (p->rtp) {
-				/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-				ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &peer->prefs);
-#endif
+				ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(p->rtp), ast_format_cap_get_framing(peer->caps));
 				p->autoframing = peer->autoframing;
 			}
 		} else {

Modified: team/group/media_formats-reviewed-trunk/channels/chan_skinny.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_skinny.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_skinny.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_skinny.c Tue Jul  1 20:15:10 2014
@@ -2653,7 +2653,7 @@
 		return;
 
 	tmpfmt = ast_format_cap_get_format(l->cap, 0);
-	framing = ast_format_cap_get_framing(l->cap, tmpfmt);
+	framing = ast_format_cap_get_format_framing(l->cap, tmpfmt);
 
 	req->data.openreceivechannel.conferenceId = htolel(sub->callid);
 	req->data.openreceivechannel.partyId = htolel(sub->callid);
@@ -3667,7 +3667,7 @@
 		SKINNY_DEBUG(DEBUG_AUDIO, 4, "Peerip = %s:%d\n", ast_inet_ntoa(them.sin_addr), ntohs(them.sin_port));
 
 		tmpfmt = ast_format_cap_get_format(l->cap, 0);
-		framing = ast_format_cap_get_framing(l->cap, tmpfmt);
+		framing = ast_format_cap_get_format_framing(l->cap, tmpfmt);
 
 		SKINNY_DEBUG(DEBUG_AUDIO, 4, "Setting payloadType to '%s' (%d ms)\n", ast_format_get_name(tmpfmt), framing);
 
@@ -4790,17 +4790,14 @@
 	if (sub->rtp) {
 		ast_rtp_instance_set_qos(sub->rtp, qos.tos_audio, qos.cos_audio, "Skinny RTP");
 		ast_rtp_instance_set_prop(sub->rtp, AST_RTP_PROPERTY_NAT, l->nat);
+		/* Set frame packetization */
+		ast_rtp_codecs_set_framing(ast_rtp_instance_get_codecs(sub->rtp),
+			ast_format_cap_get_framing(l->cap));
 	}
 	if (sub->vrtp) {
 		ast_rtp_instance_set_qos(sub->vrtp, qos.tos_video, qos.cos_video, "Skinny VRTP");
 		ast_rtp_instance_set_prop(sub->vrtp, AST_RTP_PROPERTY_NAT, l->nat);
 	}
-	/* Set Frame packetization */
-	/* BUGBUG: RTP - Needs to be updated if API changes */
-#if 0
-	if (sub->rtp)
-		ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(sub->rtp), sub->rtp, &l->prefs);
-#endif
 
 	/* Create the RTP connection */
 	transmit_connect(d, sub);
@@ -6922,7 +6919,7 @@
 	SKINNY_DEBUG(DEBUG_PACKET, 4, "asterisk ipaddr = %s:%d\n", ast_inet_ntoa(us.sin_addr), ntohs(us.sin_port));
 
 	tmpfmt = ast_format_cap_get_format(l->cap, 0);
-	framing = ast_format_cap_get_framing(l->cap, tmpfmt);
+	framing = ast_format_cap_get_format_framing(l->cap, tmpfmt);
 
 	SKINNY_DEBUG(DEBUG_PACKET, 4, "Setting payloadType to '%s' (%d ms)\n", ast_format_get_name(tmpfmt), framing);
 

Modified: team/group/media_formats-reviewed-trunk/formats/format_h263.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/formats/format_h263.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/formats/format_h263.c (original)
+++ team/group/media_formats-reviewed-trunk/formats/format_h263.c Tue Jul  1 20:15:10 2014
@@ -49,6 +49,8 @@
  * ridiculously large). */
 #define	BUF_SIZE	32768	/* Four real h.263 Frames */
 
+#define FRAME_ENDED 0x8000
+
 struct h263_desc {
 	unsigned int lastts;
 };
@@ -77,7 +79,7 @@
 	if ((res = fread(&len, 1, sizeof(len), s->f)) < 1)
 		return NULL;
 	len = ntohs(len);
-	mark = (len & 0x8000) ? 1 : 0;
+	mark = (len & FRAME_ENDED) ? 1 : 0;
 	len &= 0x7fff;
 	if (len > BUF_SIZE) {
 		ast_log(LOG_WARNING, "Length %d is too long\n", len);
@@ -91,7 +93,7 @@
 	}
 	s->fr.samples = fs->lastts;	/* XXX what ? */
 	s->fr.datalen = len;
-	s->fr.subclass.video.frame_ending = mark;
+	s->fr.subclass.frame_ending = mark;
 	if ((res = fread(&ts, 1, sizeof(ts), s->f)) == sizeof(ts)) {
 		fs->lastts = ntohl(ts);
 		*whennext = fs->lastts * 4/45;
@@ -106,7 +108,7 @@
 	unsigned int ts;
 	unsigned short len;
 	uint32_t mark = 0;
-	mark = f->subclass.video.frame_ending ? 0x8000 : 0;
+	mark = f->subclass.frame_ending ? FRAME_ENDED : 0;
 	ts = htonl(f->samples);
 	if ((res = fwrite(&ts, 1, sizeof(ts), fs->f)) != sizeof(ts)) {
 			ast_log(LOG_WARNING, "Bad write (%d/4): %s\n", res, strerror(errno));

Modified: team/group/media_formats-reviewed-trunk/formats/format_h264.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/formats/format_h264.c?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/formats/format_h264.c (original)
+++ team/group/media_formats-reviewed-trunk/formats/format_h264.c Tue Jul  1 20:15:10 2014
@@ -42,6 +42,8 @@
 /* Portions of the conversion code are by guido at sienanet.it */
 /*! \todo Check this buf size estimate, it may be totally wrong for large frame video */
 
+#define FRAME_ENDED	0x8000
+
 #define BUF_SIZE	4096	/* Two Real h264 Frames */
 struct h264_desc {
 	unsigned int lastts;
@@ -69,7 +71,7 @@
 	if ((res = fread(&len, 1, sizeof(len), s->f)) < 1)
 		return NULL;
 	len = ntohs(len);
-	mark = (len & 0x8000) ? 1 : 0;
+	mark = (len & FRAME_ENDED) ? 1 : 0;
 	len &= 0x7fff;
 	if (len > BUF_SIZE) {
 		ast_log(LOG_WARNING, "Length %d is too long\n", len);
@@ -83,7 +85,7 @@
 	}
 	s->fr.samples = fs->lastts;
 	s->fr.datalen = len;
-	s->fr.subclass.video.frame_ending = mark;
+	s->fr.subclass.frame_ending = mark;
 	if ((res = fread(&ts, 1, sizeof(ts), s->f)) == sizeof(ts)) {
 		fs->lastts = ntohl(ts);
 		*whennext = fs->lastts * 4/45;
@@ -99,7 +101,7 @@
 	unsigned short len;
 	int mark;
 
-	mark = f->subclass.video.frame_ending ? 0x8000 : 0;
+	mark = f->subclass.frame_ending ? FRAME_ENDED : 0;
 	ts = htonl(f->samples);
 	if ((res = fwrite(&ts, 1, sizeof(ts), s->f)) != sizeof(ts)) {
 		ast_log(LOG_WARNING, "Bad write (%d/4): %s\n", res, strerror(errno));

Modified: team/group/media_formats-reviewed-trunk/include/asterisk/format.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/include/asterisk/format.h?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/include/asterisk/format.h (original)
+++ team/group/media_formats-reviewed-trunk/include/asterisk/format.h Tue Jul  1 20:15:10 2014
@@ -297,6 +297,15 @@
 unsigned int ast_format_get_maximum_ms(const struct ast_format *format);
 
 /*!
+ * \brief Get the minimum number of bytes expected in a frame for this format
+ *
+ * \param format The media format
+ *
+ * \return minimum expected bytes in a frame for this format
+ */
+unsigned int ast_format_get_minimum_bytes(const struct ast_format *format);
+
+/*!
  * \brief Get the sample rate of a media format
  *
  * \param format The media format

Modified: team/group/media_formats-reviewed-trunk/include/asterisk/format_cap.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/include/asterisk/format_cap.h?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/include/asterisk/format_cap.h (original)
+++ team/group/media_formats-reviewed-trunk/include/asterisk/format_cap.h Tue Jul  1 20:15:10 2014
@@ -54,9 +54,25 @@
  * \param cap The capabilities structure.
  * \param framing The framing value (in milliseconds).
  *
- * \note This is used if a format does not provide a framing itself.
+ * \note This is used if a format does not provide a framing itself. Note that
+ *       adding subsequent formats to the \c ast_format_cap structure may
+ *       override this value, if the framing they require is less than the
+ *       value set by this function.
  */
 void ast_format_cap_set_framing(struct ast_format_cap *cap, unsigned int framing);
+
+/*!
+ * \brief Get the global framing.
+ *
+ * \param cap The capabilities structure.
+ *
+ * \retval 0 if no formats are in the structure and no framing has been provided
+ * \retval The global framing value (in milliseconds)
+ *
+ * \note This will be the minimum framing allowed across all formats in the
+ *       capabilities structure, or an overridden value
+ */
+unsigned int ast_format_cap_get_framing(const struct ast_format_cap *cap);
 
 /*!
  * \brief Add format capability to capabilities structure.
@@ -141,7 +157,7 @@
  *
  * \return the framing (in milliseconds)
  */
-unsigned int ast_format_cap_get_framing(const struct ast_format_cap *cap, const struct ast_format *format);
+unsigned int ast_format_cap_get_format_framing(const struct ast_format_cap *cap, const struct ast_format *format);
 
 /*!
  * \brief Remove format capability from capability structure.

Modified: team/group/media_formats-reviewed-trunk/include/asterisk/frame.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/include/asterisk/frame.h?view=diff&rev=417740&r1=417739&r2=417740
==============================================================================
--- team/group/media_formats-reviewed-trunk/include/asterisk/frame.h (original)
+++ team/group/media_formats-reviewed-trunk/include/asterisk/frame.h Tue Jul  1 20:15:10 2014
@@ -135,15 +135,13 @@
 	AST_FRFLAG_HAS_TIMING_INFO = (1 << 0),
 };
 
-struct ast_frame_video {
+struct ast_frame_subclass {
+	/*! A frame specific code */
+	int integer;
+	/*! The asterisk media format */
 	struct ast_format *format;
+	/*! For video formats, an indication that a frame ended */
 	unsigned int frame_ending;
-};
-
-union ast_frame_subclass {
-	int integer;
-	struct ast_format *format;
-	struct ast_frame_video video;
 };
 

[... 1218 lines stripped ...]



More information about the asterisk-commits mailing list