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