/******************************************************************************* * Software Name : RCS IMS Stack * * Copyright (C) 2010 France Telecom S.A. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.orangelabs.rcs.utils; import java.util.Vector; import com.orangelabs.rcs.core.ims.protocol.rtp.codec.audio.amr.AMRWBConfig; import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.H264Config; import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.JavaPacketizer; 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.H264Profile1_3; import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.profiles.H264Profile1b; import com.orangelabs.rcs.core.ims.protocol.rtp.format.audio.AmrWbAudioFormat; import com.orangelabs.rcs.core.ims.protocol.rtp.format.video.H264VideoFormat; import com.orangelabs.rcs.service.api.client.media.MediaCodec; import com.orangelabs.rcs.service.api.client.media.audio.AudioCodec; import com.orangelabs.rcs.service.api.client.media.video.VideoCodec; /** * Codecs utility functions * * @author hlxn7157 * @author yplo6403 * */ public class CodecsUtils { /** * Get list of supported video codecs according to current network * * @return Codecs list */ public static MediaCodec[] getRendererCodecList() { return getSupportedCodecList(); } /** * Get list of supported video codecs according to current network * * @return Codecs list */ public static MediaCodec[] getPlayerCodecList() { return getSupportedCodecList(); } /** * Get list of supported video codecs according to current network * * @param cif true if available * @param qvga true if available * @return Codecs list */ private static MediaCodec[] getSupportedCodecList() { int networkLevel = NetworkUtils.getNetworkAccessType(); int payload_count = H264VideoFormat.PAYLOAD - 1; Vector<MediaCodec> list = new Vector<MediaCodec>(); // Add codecs settings (ordered list) /* * 3G/3g+ -> level 1.B: profile-level-id=42900b, frame_rate=15, frame_size=QCIF, bit_rate=96k * * WIFI -> level 1.2: profile-level-id=42800c, frame_rate=15, frame_size=QVGA, bit_rate=384k * WIFI -> level 1.2: profile-level-id=42800c, frame_rate=15, frame_size=CIF, bit_rate=384k * WIFI -> level 1.3: profile-level-id=42800d, frame_rate=15, frame_size=CIF, bit_rate=384k */ if (networkLevel == NetworkUtils.NETWORK_ACCESS_WIFI || networkLevel == NetworkUtils.NETWORK_ACCESS_4G) { list.add(new VideoCodec(H264Config.CODEC_NAME, ++payload_count, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_3.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=" + JavaPacketizer.H264_ENABLED_PACKETIZATION_MODE, 15, 256000, H264Config.CIF_WIDTH, H264Config.CIF_HEIGHT).getMediaCodec()); list.add(new VideoCodec(H264Config.CODEC_NAME, ++payload_count, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=" + JavaPacketizer.H264_ENABLED_PACKETIZATION_MODE, 15, 176000, H264Config.CIF_WIDTH, H264Config.CIF_HEIGHT).getMediaCodec()); list.add(new VideoCodec(H264Config.CODEC_NAME, ++payload_count, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=" + JavaPacketizer.H264_ENABLED_PACKETIZATION_MODE, 15, 176000, H264Config.QVGA_WIDTH, H264Config.QVGA_HEIGHT).getMediaCodec()); } list.add(new VideoCodec(H264Config.CODEC_NAME, ++payload_count, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1b.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=" + JavaPacketizer.H264_ENABLED_PACKETIZATION_MODE, 15, 96000, H264Config.QCIF_WIDTH, H264Config.QCIF_HEIGHT).getMediaCodec()); return (MediaCodec[]) list.toArray(new MediaCodec[list.size()]); } /** * Get list of supported audio codecs * * @return Codecs list */ public static MediaCodec[] getSupportedAudioCodecList() { int i = -1; // Set number of codecs int size = 1; // default MediaCodec[] supportedMediaCodecs = new MediaCodec[size]; // Add codecs settings (ordered list) supportedMediaCodecs[++i] = new AudioCodec(AMRWBConfig.CODEC_NAME, AmrWbAudioFormat.PAYLOAD, "", AMRWBConfig.SAMPLE_RATE).getMediaCodec(); return supportedMediaCodecs; } /** * Retrieve the video codec with profile 1B from list of media codecs * * @param mediaCodecs * list of media codecs * @return the video codec with profile 1B or null */ public static VideoCodec getVideoCodecProfile1b(MediaCodec[] mediaCodecs) { for (MediaCodec mediaCodec : mediaCodecs) { VideoCodec videoCodec = new VideoCodec(mediaCodec); if (H264Profile1b.BASELINE_PROFILE_ID .compareToIgnoreCase(H264Config.getCodecProfileLevelId(videoCodec.getCodecParams())) == 0) { return videoCodec; } } return null; } }