- id->psz_rtpmap = malloc( strlen( "mpeg4-generic/" ) + 12 );
- sprintf( id->psz_rtpmap, "mpeg4-generic/%d", p_fmt->audio.i_rate );
- id->pf_packetize = rtp_packetize_mp4a;
- id->psz_fmtp = malloc( 200 + 2 * p_fmt->i_extra );
- sprintf_hexa( hexa, p_fmt->p_extra, p_fmt->i_extra );
- sprintf( id->psz_fmtp,
- "streamtype=5; profile-level-id=15; mode=AAC-hbr; "
- "config=%s; SizeLength=13;IndexLength=3; "
- "IndexDeltaLength=3; Profile=1;", hexa );
+
+ if(!p_sys->b_rfc3016)
+ {
+ char hexa[2*p_fmt->i_extra +1];
+
+ id->psz_rtpmap = malloc( strlen( "mpeg4-generic/" ) + 12 );
+ sprintf( id->psz_rtpmap, "mpeg4-generic/%d", p_fmt->audio.i_rate );
+ id->pf_packetize = rtp_packetize_mp4a;
+ id->psz_fmtp = malloc( 200 + 2 * p_fmt->i_extra );
+ sprintf_hexa( hexa, p_fmt->p_extra, p_fmt->i_extra );
+ sprintf( id->psz_fmtp,
+ "streamtype=5; profile-level-id=15; mode=AAC-hbr; "
+ "config=%s; SizeLength=13;IndexLength=3; "
+ "IndexDeltaLength=3; Profile=1;", hexa );
+ }
+ else
+ {
+ char hexa[13];
+ int i;
+ unsigned char config[6];
+ unsigned int aacsrates[15] = {
+ 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
+ 16000, 12000, 11025, 8000, 7350, 0, 0 };
+
+ for( i = 0; i < 15; i++ )
+ if( p_fmt->audio.i_rate == aacsrates[i] )
+ break;
+
+ config[0]=0x40;
+ config[1]=0;
+ config[2]=0x20|i;
+ config[3]=p_fmt->audio.i_channels<<4;
+ config[4]=0x3f;
+ config[5]=0xc0;
+
+ asprintf( &id->psz_rtpmap, "MP4A-LATM/%d/%d",
+ p_fmt->audio.i_rate, p_fmt->audio.i_channels );
+ id->pf_packetize = rtp_packetize_mp4a_latm;
+ sprintf_hexa( hexa, config, 6 );
+ asprintf( &id->psz_fmtp, "profile-level-id=15; "
+ "object=2; cpresent=0; config=%s", hexa );
+ }