/******************************************************************************* * 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.ri.richcall; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; 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.H264Profile1_3; import com.orangelabs.rcs.core.ims.protocol.rtp.codec.video.h264.profiles.H264Profile1b; import com.orangelabs.rcs.ri.R; import com.orangelabs.rcs.service.api.client.media.MediaCodec; import com.orangelabs.rcs.service.api.client.media.video.VideoCodec; /** * Video settings display * * @author hlxn7157 */ public class VideoSettings extends PreferenceActivity implements Preference.OnPreferenceChangeListener { /** * Codecs size */ public static final int CODECS_SIZE = 4; /** * Default codecs * 3G -> level 1.B: PAYLOAD=96, profile-level-id=42900b, frame_rate=12, frame_size=QCIF, bit_rate=96k * 3G+ -> level 1.2: profile-level-id=42800c, frame_rate=10, frame_size=QVGA, bit_rate=176k * 3G+ -> level 1.2: profile-level-id=42800c, frame_rate=10, frame_size=CIF, bit_rate=176k * WIFI -> level 1.3:profile-level-id=42800d, frame_rate=15, frame_size=CIF, bit_rate=384k */ public static final MediaCodec[] CODECS = { new VideoCodec(H264Config.CODEC_NAME, 99, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1b.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1", 12, 96000, H264Config.QCIF_WIDTH, H264Config.QCIF_HEIGHT).getMediaCodec(), new VideoCodec(H264Config.CODEC_NAME, 98, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1", 15, 384000, H264Config.QVGA_WIDTH, H264Config.QVGA_HEIGHT).getMediaCodec(), new VideoCodec(H264Config.CODEC_NAME, 97, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_2.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1", 15, 384000, H264Config.CIF_WIDTH, H264Config.CIF_HEIGHT).getMediaCodec(), new VideoCodec(H264Config.CODEC_NAME, 96, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + H264Profile1_3.BASELINE_PROFILE_ID + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1", 15, 384000, H264Config.CIF_WIDTH, H264Config.CIF_HEIGHT).getMediaCodec() }; /** * CheckBoxPreference "managed_by_stack" */ private CheckBoxPreference managed; /** * Codecs CheckBoxPreference */ private CheckBoxPreference codec0; private CheckBoxPreference codec1; private CheckBoxPreference codec2; private CheckBoxPreference codec3; private CheckBoxPreference codec4; private ListPreference customLevel; private ListPreference customSize; private ListPreference customFramerate; private ListPreference customBitrate; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.video_settings); setTitle(R.string.menu_video_settings); managed = (CheckBoxPreference)findPreference("managed_by_stack"); managed.setOnPreferenceChangeListener(this); codec0 = (CheckBoxPreference)findPreference("codec0"); codec0.setEnabled(!managed.isChecked()); codec0.setOnPreferenceChangeListener(this); codec1 = (CheckBoxPreference)findPreference("codec1"); codec1.setEnabled(!managed.isChecked()); codec2 = (CheckBoxPreference)findPreference("codec2"); codec2.setEnabled(!managed.isChecked()); codec3 = (CheckBoxPreference)findPreference("codec3"); codec3.setEnabled(!managed.isChecked()); codec4 = (CheckBoxPreference)findPreference("codec4"); codec4.setEnabled(!managed.isChecked()); codec4.setOnPreferenceChangeListener(this); customLevel = (ListPreference)findPreference("custom_level"); customLevel.setEnabled(codec4.isChecked()); customSize = (ListPreference)findPreference("custom_size"); customSize.setEnabled(codec4.isChecked()); customFramerate = (ListPreference)findPreference("custom_framerate"); customFramerate.setEnabled(codec4.isChecked()); customBitrate = (ListPreference)findPreference("custom_bitrate"); customBitrate.setEnabled(codec4.isChecked()); } @Override public boolean onPreferenceChange(Preference preference, Object objValue) { if (preference.getKey().equals("managed_by_stack")) { Boolean state = (Boolean)objValue; codec0.setEnabled(!state); codec1.setEnabled(!state); codec2.setEnabled(!state); codec3.setEnabled(!state); codec4.setEnabled(!state); return true; } else if (preference.getKey().equals("codec0")) { // Codec 0 must always be enabled return false; } else if (preference.getKey().equals("codec4")) { Boolean state = (Boolean)objValue; customLevel.setEnabled(state); customSize.setEnabled(state); customFramerate.setEnabled(state); customBitrate.setEnabled(state); return true; } return false; } /** * isCodecsManagedByStack * * @param context the application context * @return value of the preference */ public static boolean isCodecsManagedByStack(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return prefs.getBoolean("managed_by_stack", true); } /** * getCodecsList * * @param context the application context * @return value of the preference */ public static boolean[] getCodecsList(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return new boolean[] { prefs.getBoolean("codec0", false), prefs.getBoolean("codec1", false), prefs.getBoolean("codec2", false), prefs.getBoolean("codec3", false), prefs.getBoolean("codec4", false) }; } /** * getCustomCodec * * @param context the application context * @return the custom codec */ public static MediaCodec getCustomCodec(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int framerate = Integer.parseInt(prefs.getString("custom_framerate","10")); int bitrate = 1000 * Integer.parseInt(prefs.getString("custom_bitrate", "128")); String level = ""; switch (Integer.parseInt(prefs.getString("custom_level", "0"))) { case 0 : level = H264Profile1b.BASELINE_PROFILE_ID; break; case 1 : level = H264Profile1_2.BASELINE_PROFILE_ID; break; case 2 : level = H264Profile1_3.BASELINE_PROFILE_ID; break; } int width = 0; int height = 0; switch (Integer.parseInt(prefs.getString("custom_size", "0"))) { case 0 : width = 176; height = 144; break; case 1 : width = 320; height = 240; break; case 2 : width = 352; height = 288; break; case 3 : width = 0; height = 0; break; } return new VideoCodec(H264Config.CODEC_NAME, 100, H264Config.CLOCK_RATE, H264Config.CODEC_PARAM_PROFILEID + "=" + level + ";" + H264Config.CODEC_PARAM_PACKETIZATIONMODE + "=1", framerate, bitrate, width, height).getMediaCodec(); } }