package com.orangelabs.rcs.richcall;
import java.util.Vector;
import android.test.AndroidTestCase;
import com.orangelabs.rcs.core.ims.network.sip.SipUtils;
import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.H264Config;
import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.profiles.H264Profile1_2;
import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.profiles.H264Profile1b;
import com.orangelabs.rcs.core.ims.protocol.sdp.MediaDescription;
import com.orangelabs.rcs.core.ims.protocol.sdp.SdpParser;
import com.orangelabs.rcs.core.ims.service.richcall.video.VideoCodecManager;
import com.orangelabs.rcs.core.ims.service.richcall.video.VideoSdpBuilder;
import com.orangelabs.rcs.provider.settings.RcsSettings;
import com.orangelabs.rcs.service.api.client.media.MediaCodec;
import com.orangelabs.rcs.service.api.client.media.video.VideoCodec;
import com.orangelabs.rcs.utils.logger.Logger;
public class VideoSdpTest extends AndroidTestCase {
private static int RTP_PORT = 12345;
private static String videoSdp =
"v=tester" + SipUtils.CRLF +
"m=video 12345 RTP/AVP 99 98 97 96" + SipUtils.CRLF +
"a=framerate:15" + SipUtils.CRLF +
"a=rtpmap:99 H264/90000" + SipUtils.CRLF +
"a=framesize:99 352-288" + SipUtils.CRLF +
"a=fmtp:99 profile-level-id=42800c;packetization-mode=1" + SipUtils.CRLF +
"a=rtpmap:98 H264/90000" + SipUtils.CRLF +
"a=framesize:98 352-288" + SipUtils.CRLF +
"a=fmtp:98 profile-level-id=42800c;packetization-mode=1" + SipUtils.CRLF +
"a=rtpmap:97 H264/90000" + SipUtils.CRLF +
"a=framesize:97 320-240" + SipUtils.CRLF +
"a=fmtp:97 profile-level-id=42800c;packetization-mode=1" + SipUtils.CRLF +
"a=rtpmap:96 H264/90000" + SipUtils.CRLF +
"a=framesize:96 176-144" + SipUtils.CRLF +
"a=fmtp:96 profile-level-id=42900b;packetization-mode=1" + SipUtils.CRLF;
private static String videoSdp2 =
"v=tester" + SipUtils.CRLF +
"m=video 12345 RTP/AVP 99 98 97 96" + SipUtils.CRLF +
"b=AS:128" + SipUtils.CRLF +
"b=RS:256" + SipUtils.CRLF +
"b=RR:1024" + SipUtils.CRLF +
"a=rtpmap:99 H264/90000" + SipUtils.CRLF +
"a=framesize:99 352-288" + SipUtils.CRLF +
"a=framerate:99 15" + SipUtils.CRLF +
"a=fmtp:99 profile-level-id=42800c;packetization-mode=1" + SipUtils.CRLF +
"a=rtpmap:98 H264/90000" + SipUtils.CRLF +
"a=framesize:98 352-288" + SipUtils.CRLF +
"a=framerate:98 12" + SipUtils.CRLF +
"a=fmtp:98 profile-level-id=42800c;packetization-mode=1" + SipUtils.CRLF +
"a=rtpmap:97 H264/90000" + SipUtils.CRLF +
"a=framesize:97 320-240" + SipUtils.CRLF +
"a=framerate:97 12" + SipUtils.CRLF +
"a=fmtp:97 profile-level-id=42800c;packetization-mode=1" + SipUtils.CRLF +
"a=rtpmap:96 H264/90000" + SipUtils.CRLF +
"a=framesize:96 176-144" + SipUtils.CRLF +
"a=framerate:96 10" + SipUtils.CRLF +
"a=fmtp:96 profile-level-id=42900b;packetization-mode=1" + SipUtils.CRLF;
private MediaCodec[] codecs;
protected void setUp() throws Exception {
super.setUp();
RcsSettings.createInstance(getContext());
// Create list of codecs
codecs = new MediaCodec[4];
int payload_count = 95;
codecs[3] = new VideoCodec(H264Config.CODEC_NAME,
++payload_count,
H264Config.CLOCK_RATE,
H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1b.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1",
10,
96000,
H264Config.QCIF_WIDTH,
H264Config.QCIF_HEIGHT).getMediaCodec();
codecs[2] = new VideoCodec(H264Config.CODEC_NAME,
++payload_count,
H264Config.CLOCK_RATE,
H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1",
12,
256,
H264Config.QVGA_WIDTH,
H264Config.QVGA_HEIGHT).getMediaCodec();
codecs[1] = new VideoCodec(H264Config.CODEC_NAME,
++payload_count,
H264Config.CLOCK_RATE,
H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1",
12,
256,
H264Config.CIF_WIDTH,
H264Config.CIF_HEIGHT).getMediaCodec();
codecs[0] = new VideoCodec(H264Config.CODEC_NAME,
++payload_count,
H264Config.CLOCK_RATE,
H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1",
15,
396,
H264Config.CIF_WIDTH,
H264Config.CIF_HEIGHT).getMediaCodec();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testCreateSdp() {
// Create SDP
String createdSdp = "v=tester" + SipUtils.CRLF +
VideoSdpBuilder.buildSdpOfferWithoutOrientation(codecs, RTP_PORT);
// TEST SDP
assertEquals(createdSdp, videoSdp);
}
public void testParseSdp() {
// Parse the remote SDP part
SdpParser parser = new SdpParser(videoSdp2.getBytes());
// Test port
MediaDescription mediaVideo = parser.getMediaDescription("video");
int port = mediaVideo.port;
assertEquals(port, RTP_PORT);
// Test codecs
Vector<MediaDescription> medias = parser.getMediaDescriptions("video");
Vector<VideoCodec> proposedCodecs = VideoCodecManager.extractVideoCodecsFromSdp(medias);
assertEquals(proposedCodecs.size(), codecs.length);
for (int i = 0 ; i < proposedCodecs.size(); i++) {
VideoCodec codec = new VideoCodec(codecs[i]);
assertEquals(proposedCodecs.elementAt(i).getCodecName(), codec.getCodecName());
assertEquals(proposedCodecs.elementAt(i).getPayload(), codec.getPayload());
assertEquals(proposedCodecs.elementAt(i).getCodecParams(), codec.getCodecParams());
assertEquals(proposedCodecs.elementAt(i).getFramerate(), codec.getFramerate());
assertEquals(proposedCodecs.elementAt(i).getWidth(), codec.getWidth());
assertEquals(proposedCodecs.elementAt(i).getHeight(), codec.getHeight());
// Bitrate and order pref not tested because not in SDP
}
}
}