diff options
-rw-r--r-- | api/current.xml | 104 | ||||
-rw-r--r-- | core/java/android/hardware/Camera.java | 62 | ||||
-rw-r--r-- | core/jni/android/graphics/YuvToJpegEncoder.cpp | 4 | ||||
-rw-r--r-- | core/jni/android_graphics_PixelFormat.cpp | 26 | ||||
-rw-r--r-- | graphics/java/android/graphics/ImageFormat.java | 76 | ||||
-rw-r--r-- | graphics/java/android/graphics/PixelFormat.java | 31 | ||||
-rw-r--r-- | graphics/java/android/graphics/YuvImage.java | 24 |
7 files changed, 263 insertions, 64 deletions
diff --git a/api/current.xml b/api/current.xml index 96220c6..6b277f3 100644 --- a/api/current.xml +++ b/api/current.xml @@ -60412,6 +60412,102 @@ </parameter> </constructor> </class> +<class name="ImageFormat" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="ImageFormat" + type="android.graphics.ImageFormat" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</constructor> +<method name="getBitsPerPixel" + return="int" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="format" type="int"> +</parameter> +</method> +<field name="JPEG" + type="int" + transient="false" + volatile="false" + value="256" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="NV16" + type="int" + transient="false" + volatile="false" + value="16" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="NV21" + type="int" + transient="false" + volatile="false" + value="17" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RGB_565" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="UNKNOWN" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="YUY2" + type="int" + transient="false" + volatile="false" + value="20" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> <class name="Interpolator" extends="java.lang.Object" abstract="false" @@ -64473,7 +64569,7 @@ value="256" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </field> @@ -64627,7 +64723,7 @@ value="17" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </field> @@ -64638,7 +64734,7 @@ value="20" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </field> @@ -64649,7 +64745,7 @@ value="16" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </field> diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index c0bff66..6dba94d 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -26,7 +26,7 @@ import java.io.IOException; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; -import android.graphics.PixelFormat; +import android.graphics.ImageFormat; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -192,7 +192,7 @@ public class Camera { * The callback that delivers the preview frames. * * @param data The contents of the preview frame in the format defined - * by {@link android.graphics.PixelFormat}, which can be queried + * by {@link android.graphics.ImageFormat}, which can be queried * with {@link android.hardware.Camera.Parameters#getPreviewFormat()}. * If {@link android.hardware.Camera.Parameters#setPreviewFormat(int)} * is never called, the default will be the YCbCr_420_SP @@ -276,7 +276,7 @@ public class Camera { * Adds a pre-allocated buffer to the callback buffer queue. * Preview width and height can be determined from getPreviewSize, and bitsPerPixel can be * found from from {@link android.hardware.Camera.Parameters#getPreviewFormat()} and - * {@link android.graphics.PixelFormat#getPixelFormatInfo(int, PixelFormat)} + * {@link android.graphics.ImageFormat#getBitsPerPixel(int)} * * Alternatively, a buffer from a previous callback may be passed in or used * to determine the size of new preview frame buffers. @@ -1086,15 +1086,15 @@ public class Camera { /** * Sets the image format for preview pictures. * <p>If this is never called, the default format will be - * {@link android.graphics.PixelFormat#YCbCr_420_SP}, which + * {@link android.graphics.ImageFormat#NV21}, which * uses the NV21 encoding format.</p> * * @param pixel_format the desired preview picture format, defined - * by one of the {@link android.graphics.PixelFormat} constants. - * (E.g., <var>PixelFormat.YCbCr_420_SP</var> (default), - * <var>PixelFormat.RGB_565</var>, or - * <var>PixelFormat.JPEG</var>) - * @see android.graphics.PixelFormat + * by one of the {@link android.graphics.ImageFormat} constants. + * (E.g., <var>ImageFormat.NV21</var> (default), + * <var>ImageFormat.RGB_565</var>, or + * <var>ImageFormat.JPEG</var>) + * @see android.graphics.ImageFormat */ public void setPreviewFormat(int pixel_format) { String s = cameraFormatForPixelFormat(pixel_format); @@ -1110,7 +1110,7 @@ public class Camera { * Returns the image format for preview pictures got from * {@link PreviewCallback}. * - * @return the {@link android.graphics.PixelFormat} int representing + * @return the {@link android.graphics.ImageFormat} int representing * the preview picture format. */ public int getPreviewFormat() { @@ -1128,7 +1128,7 @@ public class Camera { ArrayList<Integer> formats = new ArrayList<Integer>(); for (String s : split(str)) { int f = pixelFormatForCameraFormat(s); - if (f == PixelFormat.UNKNOWN) continue; + if (f == ImageFormat.UNKNOWN) continue; formats.add(f); } return formats; @@ -1171,10 +1171,10 @@ public class Camera { * Sets the image format for pictures. * * @param pixel_format the desired picture format - * (<var>PixelFormat.YCbCr_420_SP (NV21)</var>, - * <var>PixelFormat.RGB_565</var>, or - * <var>PixelFormat.JPEG</var>) - * @see android.graphics.PixelFormat + * (<var>ImageFormat.NV21</var>, + * <var>ImageFormat.RGB_565</var>, or + * <var>ImageFormat.JPEG</var>) + * @see android.graphics.ImageFormat */ public void setPictureFormat(int pixel_format) { String s = cameraFormatForPixelFormat(pixel_format); @@ -1189,7 +1189,7 @@ public class Camera { /** * Returns the image format for pictures. * - * @return the PixelFormat int representing the picture format + * @return the ImageFormat int representing the picture format */ public int getPictureFormat() { return pixelFormatForCameraFormat(get(KEY_PICTURE_FORMAT)); @@ -1198,7 +1198,7 @@ public class Camera { /** * Gets the supported picture formats. * - * @return a List of Integer objects (values are PixelFormat.XXX). This + * @return a List of Integer objects (values are ImageFormat.XXX). This * method will always return a list with at least one element. */ public List<Integer> getSupportedPictureFormats() { @@ -1206,7 +1206,7 @@ public class Camera { ArrayList<Integer> formats = new ArrayList<Integer>(); for (String s : split(str)) { int f = pixelFormatForCameraFormat(s); - if (f == PixelFormat.UNKNOWN) continue; + if (f == ImageFormat.UNKNOWN) continue; formats.add(f); } return formats; @@ -1214,35 +1214,35 @@ public class Camera { private String cameraFormatForPixelFormat(int pixel_format) { switch(pixel_format) { - case PixelFormat.YCbCr_422_SP: return PIXEL_FORMAT_YUV422SP; - case PixelFormat.YCbCr_420_SP: return PIXEL_FORMAT_YUV420SP; - case PixelFormat.YCbCr_422_I: return PIXEL_FORMAT_YUV422I; - case PixelFormat.RGB_565: return PIXEL_FORMAT_RGB565; - case PixelFormat.JPEG: return PIXEL_FORMAT_JPEG; - default: return null; + case ImageFormat.NV16: return PIXEL_FORMAT_YUV422SP; + case ImageFormat.NV21: return PIXEL_FORMAT_YUV420SP; + case ImageFormat.YUY2: return PIXEL_FORMAT_YUV422I; + case ImageFormat.RGB_565: return PIXEL_FORMAT_RGB565; + case ImageFormat.JPEG: return PIXEL_FORMAT_JPEG; + default: return null; } } private int pixelFormatForCameraFormat(String format) { if (format == null) - return PixelFormat.UNKNOWN; + return ImageFormat.UNKNOWN; if (format.equals(PIXEL_FORMAT_YUV422SP)) - return PixelFormat.YCbCr_422_SP; + return ImageFormat.NV16; if (format.equals(PIXEL_FORMAT_YUV420SP)) - return PixelFormat.YCbCr_420_SP; + return ImageFormat.NV21; if (format.equals(PIXEL_FORMAT_YUV422I)) - return PixelFormat.YCbCr_422_I; + return ImageFormat.YUY2; if (format.equals(PIXEL_FORMAT_RGB565)) - return PixelFormat.RGB_565; + return ImageFormat.RGB_565; if (format.equals(PIXEL_FORMAT_JPEG)) - return PixelFormat.JPEG; + return ImageFormat.JPEG; - return PixelFormat.UNKNOWN; + return ImageFormat.UNKNOWN; } /** diff --git a/core/jni/android/graphics/YuvToJpegEncoder.cpp b/core/jni/android/graphics/YuvToJpegEncoder.cpp index e6a1872..819cce8 100644 --- a/core/jni/android/graphics/YuvToJpegEncoder.cpp +++ b/core/jni/android/graphics/YuvToJpegEncoder.cpp @@ -7,9 +7,9 @@ #include <jni.h> YuvToJpegEncoder* YuvToJpegEncoder::create(int format, int* strides) { - // Only PIXEL_FORMAT_YCbCr_420_SP and PIXEl_FOMAT_YCbCr_422_I are supported + // Only ImageFormat.NV21 and ImageFormat.YUY2 are supported // for now. - if (format == HAL_PIXEL_FORMAT_YCbCr_420_SP) { + if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP) { return new Yuv420SpToJpegEncoder(strides); } else if (format == HAL_PIXEL_FORMAT_YCbCr_422_I) { return new Yuv422IToJpegEncoder(strides); diff --git a/core/jni/android_graphics_PixelFormat.cpp b/core/jni/android_graphics_PixelFormat.cpp index 0643622..5b8363c 100644 --- a/core/jni/android_graphics_PixelFormat.cpp +++ b/core/jni/android_graphics_PixelFormat.cpp @@ -48,11 +48,35 @@ static void android_graphics_getPixelFormatInfo( JNIEnv* env, jobject clazz, jint format, jobject pixelFormatObject) { PixelFormatInfo info; - status_t err = getPixelFormatInfo(format, &info); + status_t err; + + // we need this for backward compatibility with PixelFormat's + // deprecated constants + switch (format) { + case HAL_PIXEL_FORMAT_YCbCr_422_SP: + // defined as the bytes per pixel of the Y plane + info.bytesPerPixel = 1; + info.bitsPerPixel = 16; + goto done; + case HAL_PIXEL_FORMAT_YCrCb_420_SP: + // defined as the bytes per pixel of the Y plane + info.bytesPerPixel = 1; + info.bitsPerPixel = 12; + goto done; + case HAL_PIXEL_FORMAT_YCbCr_422_I: + // defined as the bytes per pixel of the Y plane + info.bytesPerPixel = 1; + info.bitsPerPixel = 16; + goto done; + } + + err = getPixelFormatInfo(format, &info); if (err < 0) { doThrow(env, "java/lang/IllegalArgumentException"); return; } + +done: env->SetIntField(pixelFormatObject, offsets.bytesPerPixel, info.bytesPerPixel); env->SetIntField(pixelFormatObject, offsets.bitsPerPixel, info.bitsPerPixel); } diff --git a/graphics/java/android/graphics/ImageFormat.java b/graphics/java/android/graphics/ImageFormat.java new file mode 100644 index 0000000..f126374 --- /dev/null +++ b/graphics/java/android/graphics/ImageFormat.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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 android.graphics; + +public class ImageFormat +{ + /* these constants are chosen to be binary compatible with + * their previous location in PixelFormat.java */ + + public static final int UNKNOWN = 0; + + /** RGB format used for pictures encoded as RGB_565 + * see {@link android.hardware.Camera.Parameters#setPictureFormat(int)}. + */ + public static final int RGB_565 = 4; + + /** + * YCbCr formats, used for video. These are not necessarily supported + * by the hardware. + */ + public static final int NV16 = 0x10; + + + /** YCrCb format used for images, which uses the NV21 encoding format. + * This is the default format for camera preview images, when not + * otherwise set with + * {@link android.hardware.Camera.Parameters#setPreviewFormat(int)}. + */ + public static final int NV21 = 0x11; + + + /** YCbCr format used for images, which uses YUYV (YUY2) encoding format. + * This is an alternative format for camera preview images. Whether this + * format is supported by the camera hardware can be determined by + * {@link android.hardware.Camera.Parameters#getSupportedPreviewFormats()}. + */ + public static final int YUY2 = 0x14; + + + /** + * Encoded formats. These are not necessarily supported by the hardware. + */ + public static final int JPEG = 0x100; + + + /** + * Use this function to retrieve the number of bits per pixel of + * an ImageFormat. + * @param format + * @return the number of bits per pixel of the given format or -1 if the + * format doesn't exist or is not supported. + */ + public static int getBitsPerPixel(int format) { + switch (format) { + case RGB_565: return 16; + case NV16: return 16; + case NV21: return 12; + case YUY2: return 16; + } + return -1; + } +} diff --git a/graphics/java/android/graphics/PixelFormat.java b/graphics/java/android/graphics/PixelFormat.java index c76cee7..182f14d 100644 --- a/graphics/java/android/graphics/PixelFormat.java +++ b/graphics/java/android/graphics/PixelFormat.java @@ -18,8 +18,7 @@ package android.graphics; public class PixelFormat { - /* these constants need to match those - in ui/PixelFormat.h & pixelflinger/format.h */ + /* these constants need to match those in hardware/hardware.h */ public static final int UNKNOWN = 0; @@ -46,30 +45,34 @@ public class PixelFormat public static final int L_8 = 9; public static final int LA_88 = 0xA; public static final int RGB_332 = 0xB; - + + /** - * YCbCr formats, used for video. These are not necessarily supported - * by the hardware. + * @deprecated use {@link android.graphics.ImageFormat#NV16 + * ImageFormat.NV16} instead. */ + @Deprecated public static final int YCbCr_422_SP= 0x10; - /** YCbCr format used for images, which uses the NV21 encoding format. - * This is the default format for camera preview images, when not - * otherwise set with - * {@link android.hardware.Camera.Parameters#setPreviewFormat(int)}. + /** + * @deprecated use {@link android.graphics.ImageFormat#NV21 + * ImageFormat.NV21} instead. */ + @Deprecated public static final int YCbCr_420_SP= 0x11; - /** YCbCr format used for images, which uses YUYV (YUY2) encoding format. - * This is an alternative format for camera preview images. Whether this - * format is supported by the camera hardware can be determined by - * {@link android.hardware.Camera.Parameters#getSupportedPreviewFormats()}. + /** + * @deprecated use {@link android.graphics.ImageFormat#YUY2 + * ImageFormat.YUY2} instead. */ + @Deprecated public static final int YCbCr_422_I = 0x14; /** - * Encoded formats. These are not necessarily supported by the hardware. + * @deprecated use {@link android.graphics.ImageFormat#JPEG + * ImageFormat.JPEG} instead. */ + @Deprecated public static final int JPEG = 0x100; /* diff --git a/graphics/java/android/graphics/YuvImage.java b/graphics/java/android/graphics/YuvImage.java index 5a4531b..9368da6 100644 --- a/graphics/java/android/graphics/YuvImage.java +++ b/graphics/java/android/graphics/YuvImage.java @@ -22,7 +22,7 @@ import java.io.OutputStream; * YuvImage contains YUV data and provides a method that compresses a region of * the YUV data to a Jpeg. The YUV data should be provided as a single byte * array irrespective of the number of image planes in it. - * Currently only PixelFormat.YCbCr_420_SP and PixelFormat.YCbCr_422_I are supported. + * Currently only ImageFormat.NV21 and ImageFormat.YUY2 are supported. * * To compress a rectangle region in the YUV data, users have to specify the * region by left, top, width and height. @@ -77,11 +77,11 @@ public class YuvImage { * null. */ public YuvImage(byte[] yuv, int format, int width, int height, int[] strides) { - if (format != PixelFormat.YCbCr_420_SP && - format != PixelFormat.YCbCr_422_I) { + if (format != ImageFormat.NV21 && + format != ImageFormat.YUY2) { throw new IllegalArgumentException( - "only support PixelFormat.YCbCr_420_SP " + - "and PixelFormat.YCbCr_422_I for now"); + "only support ImageFormat.NV21 " + + "and ImageFormat.YUY2 for now"); } if (width <= 0 || height <= 0) { @@ -107,7 +107,7 @@ public class YuvImage { /** * Compress a rectangle region in the YuvImage to a jpeg. - * Only PixelFormat.YCbCr_420_SP and PixelFormat.YCbCr_422_I + * Only ImageFormat.NV21 and ImageFormat.YUY2 * are supported for now. * * @param rectangle The rectangle region to be compressed. The medthod checks if rectangle is @@ -181,14 +181,14 @@ public class YuvImage { int[] calculateOffsets(int left, int top) { int[] offsets = null; - if (mFormat == PixelFormat.YCbCr_420_SP) { + if (mFormat == ImageFormat.NV21) { offsets = new int[] {top * mStrides[0] + left, mHeight * mStrides[0] + top / 2 * mStrides[1] + left / 2 * 2 }; return offsets; } - if (mFormat == PixelFormat.YCbCr_422_I) { + if (mFormat == ImageFormat.YUY2) { offsets = new int[] {top * mStrides[0] + left / 2 * 4}; return offsets; } @@ -198,12 +198,12 @@ public class YuvImage { private int[] calculateStrides(int width, int format) { int[] strides = null; - if (format == PixelFormat.YCbCr_420_SP) { + if (format == ImageFormat.NV21) { strides = new int[] {width, width}; return strides; } - if (format == PixelFormat.YCbCr_422_I) { + if (format == ImageFormat.YUY2) { strides = new int[] {width * 2}; return strides; } @@ -214,7 +214,7 @@ public class YuvImage { private void adjustRectangle(Rect rect) { int width = rect.width(); int height = rect.height(); - if (mFormat == PixelFormat.YCbCr_420_SP) { + if (mFormat == ImageFormat.NV21) { // Make sure left, top, width and height are all even. width &= ~1; height &= ~1; @@ -224,7 +224,7 @@ public class YuvImage { rect.bottom = rect.top + height; } - if (mFormat == PixelFormat.YCbCr_422_I) { + if (mFormat == ImageFormat.YUY2) { // Make sure left and width are both even. width &= ~1; rect.left &= ~1; |