1ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong/* 2ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * Copyright (C) 2011 The Android Open Source Project 3ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * 4ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * Licensed under the Apache License, Version 2.0 (the "License"); 5ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * you may not use this file except in compliance with the License. 6ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * You may obtain a copy of the License at 7ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * 8ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * http://www.apache.org/licenses/LICENSE-2.0 9ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * 10ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * Unless required by applicable law or agreed to in writing, software 11ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * distributed under the License is distributed on an "AS IS" BASIS, 12ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * See the License for the specific language governing permissions and 14ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong * limitations under the License. 15ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong */ 16ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 17ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongpackage com.android.camera; 18ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 19ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport java.text.SimpleDateFormat; 20ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport java.util.Date; 21ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 22ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongpublic class PanoUtil { 23ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong public static String createName(String format, long dateTaken) { 24ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong Date date = new Date(dateTaken); 25ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong SimpleDateFormat dateFormat = new SimpleDateFormat(format); 26ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong return dateFormat.format(date); 27ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 28ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 29ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong // TODO: Add comments about the range of these two arguments. 30ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong public static double calculateDifferenceBetweenAngles(double firstAngle, 31ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong double secondAngle) { 32ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong double difference1 = (secondAngle - firstAngle) % 360; 33ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if (difference1 < 0) { 34ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong difference1 += 360; 35ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 36ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 37ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong double difference2 = (firstAngle - secondAngle) % 360; 38ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if (difference2 < 0) { 39ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong difference2 += 360; 40ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 41ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 42ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong return Math.min(difference1, difference2); 43ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 44ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 45ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong public static void decodeYUV420SPQuarterRes(int[] rgb, byte[] yuv420sp, int width, int height) { 46ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong final int frameSize = width * height; 47ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 48ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong for (int j = 0, ypd = 0; j < height; j += 4) { 49ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; 50ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong for (int i = 0; i < width; i += 4, ypd++) { 51ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong int y = (0xff & (yuv420sp[j * width + i])) - 16; 52ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if (y < 0) { 53ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong y = 0; 54ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 55ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if ((i & 1) == 0) { 56ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong v = (0xff & yuv420sp[uvp++]) - 128; 57ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong u = (0xff & yuv420sp[uvp++]) - 128; 58ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong uvp += 2; // Skip the UV values for the 4 pixels skipped in between 59ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 60ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong int y1192 = 1192 * y; 61ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong int r = (y1192 + 1634 * v); 62ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong int g = (y1192 - 833 * v - 400 * u); 63ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong int b = (y1192 + 2066 * u); 64ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 65ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if (r < 0) { 66ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong r = 0; 67ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } else if (r > 262143) { 68ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong r = 262143; 69ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 70ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if (g < 0) { 71ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong g = 0; 72ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } else if (g > 262143) { 73ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong g = 262143; 74ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 75ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong if (b < 0) { 76ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong b = 0; 77ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } else if (b > 262143) { 78ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong b = 262143; 79ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 80ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 81ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong rgb[ypd] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | 82ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong ((b >> 10) & 0xff); 83ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 84ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 85ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong } 86ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong} 87