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