From 9cd5721ea88d24549a2946e1aaaef04993bc94d6 Mon Sep 17 00:00:00 2001 From: Byunghun Jeon Date: Tue, 10 May 2016 16:59:33 -0700 Subject: SnapdragonCamera: Add video to Camera2 module Add video to Camera2 module and combine the UI Change-Id: I0bcd86eb6b95fe2180856780ddd794682259e799 --- src/com/android/camera/util/CameraUtil.java | 59 +++++++++++ .../android/camera/util/SettingTranslation.java | 117 +++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 src/com/android/camera/util/SettingTranslation.java (limited to 'src/com/android/camera/util') diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java index 9b728b642..b89e13675 100644 --- a/src/com/android/camera/util/CameraUtil.java +++ b/src/com/android/camera/util/CameraUtil.java @@ -36,6 +36,7 @@ import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.location.Location; +import android.media.MediaRecorder; import android.net.Uri; import android.os.Handler; import android.os.ParcelFileDescriptor; @@ -1223,4 +1224,62 @@ public class CameraUtil { return retRatio; } + public static String millisecondToTimeString(long milliSeconds, boolean displayCentiSeconds) { + long seconds = milliSeconds / 1000; // round down to compute seconds + long minutes = seconds / 60; + long hours = minutes / 60; + long remainderMinutes = minutes - (hours * 60); + long remainderSeconds = seconds - (minutes * 60); + + StringBuilder timeStringBuilder = new StringBuilder(); + + // Hours + if (hours > 0) { + if (hours < 10) { + timeStringBuilder.append('0'); + } + timeStringBuilder.append(hours); + + timeStringBuilder.append(':'); + } + + // Minutes + if (remainderMinutes < 10) { + timeStringBuilder.append('0'); + } + timeStringBuilder.append(remainderMinutes); + timeStringBuilder.append(':'); + + // Seconds + if (remainderSeconds < 10) { + timeStringBuilder.append('0'); + } + timeStringBuilder.append(remainderSeconds); + + // Centi seconds + if (displayCentiSeconds) { + timeStringBuilder.append('.'); + long remainderCentiSeconds = (milliSeconds - seconds * 1000) / 10; + if (remainderCentiSeconds < 10) { + timeStringBuilder.append('0'); + } + timeStringBuilder.append(remainderCentiSeconds); + } + + return timeStringBuilder.toString(); + } + + public static String convertOutputFormatToMimeType(int outputFileFormat) { + if (outputFileFormat == MediaRecorder.OutputFormat.MPEG_4) { + return "video/mp4"; + } + return "video/3gpp"; + } + + public static String convertOutputFormatToFileExt(int outputFileFormat) { + if (outputFileFormat == MediaRecorder.OutputFormat.MPEG_4) { + return ".mp4"; + } + return ".3gp"; + } } diff --git a/src/com/android/camera/util/SettingTranslation.java b/src/com/android/camera/util/SettingTranslation.java new file mode 100644 index 000000000..6aee0ede0 --- /dev/null +++ b/src/com/android/camera/util/SettingTranslation.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.android.camera.util; + +import android.hardware.camera2.CameraMetadata; +import android.media.MediaRecorder; + +import java.util.HashMap; +import java.util.Map; + +public class SettingTranslation { + public static final int NOT_FOUND = -1; + private static final TwoWayMap VIDEO_ENCODER_TABLE = new TwoWayMap(); + private static final TwoWayMap AUDIO_ENCODER_TABLE = new TwoWayMap(); + private static final TwoWayMap NOISE_REDUCTION_TABLE = new TwoWayMap(); + + static { + VIDEO_ENCODER_TABLE.put("default", MediaRecorder.VideoEncoder.DEFAULT); + VIDEO_ENCODER_TABLE.put("h263", MediaRecorder.VideoEncoder.H263); + VIDEO_ENCODER_TABLE.put("h264", MediaRecorder.VideoEncoder.H264); + int h265 = ApiHelper.getIntFieldIfExists(MediaRecorder.VideoEncoder.class, + "HEVC", null, MediaRecorder.VideoEncoder.DEFAULT); + if (h265 == MediaRecorder.VideoEncoder.DEFAULT) { + h265 = ApiHelper.getIntFieldIfExists(MediaRecorder.VideoEncoder.class, + "H265", null, MediaRecorder.VideoEncoder.DEFAULT); + } + VIDEO_ENCODER_TABLE.put("h265", h265); + VIDEO_ENCODER_TABLE.put("mpeg-4-sp", MediaRecorder.VideoEncoder.MPEG_4_SP); + VIDEO_ENCODER_TABLE.put("vp8", MediaRecorder.VideoEncoder.VP8); + + AUDIO_ENCODER_TABLE.put("aac", MediaRecorder.AudioEncoder.AAC); + AUDIO_ENCODER_TABLE.put("aac-eld", MediaRecorder.AudioEncoder.AAC_ELD); + AUDIO_ENCODER_TABLE.put("amr-nb", MediaRecorder.AudioEncoder.AMR_NB); + AUDIO_ENCODER_TABLE.put("amr-wb", MediaRecorder.AudioEncoder.AMR_WB); + AUDIO_ENCODER_TABLE.put("default", MediaRecorder.AudioEncoder.DEFAULT); + AUDIO_ENCODER_TABLE.put("he-aac", MediaRecorder.AudioEncoder.HE_AAC); + AUDIO_ENCODER_TABLE.put("vorbis", MediaRecorder.AudioEncoder.VORBIS); + + NOISE_REDUCTION_TABLE.put("off", CameraMetadata.NOISE_REDUCTION_MODE_OFF); + NOISE_REDUCTION_TABLE.put("fast", CameraMetadata.NOISE_REDUCTION_MODE_FAST); + NOISE_REDUCTION_TABLE.put("high-quality", CameraMetadata + .NOISE_REDUCTION_MODE_HIGH_QUALITY); + NOISE_REDUCTION_TABLE.put("minimal", CameraMetadata.NOISE_REDUCTION_MODE_MINIMAL); + NOISE_REDUCTION_TABLE.put("zero-shutter-lag", CameraMetadata + .NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG); + } + + public static int getVideoEncoder(String key) { + return VIDEO_ENCODER_TABLE.get(key); + } + + public static String getVideoEncoder(int key) { + return VIDEO_ENCODER_TABLE.get(key); + } + + public static int getAudioEncoder(String key) { + return AUDIO_ENCODER_TABLE.get(key); + } + + public static String getAudioEncoder(int key) { + return AUDIO_ENCODER_TABLE.get(key); + } + + public static int getNoiseReduction(String key) { + return NOISE_REDUCTION_TABLE.get(key); + } + + public static String getNoiseReduction(int key) { + return NOISE_REDUCTION_TABLE.get(key); + } + + private static class TwoWayMap { + private Map strToInt = new HashMap<>(); + private Map intToStr = new HashMap<>(); + + public void put(String key, int value) { + strToInt.put(key, value); + intToStr.put(value, key); + } + + public int get(String key) { + Integer res = strToInt.get(key); + if (res != null) return res; + else return NOT_FOUND; + } + + public String get(int key) { + return intToStr.get(key); + } + } +} -- cgit v1.2.3