diff options
| -rw-r--r-- | api/9.xml | 23 | ||||
| -rw-r--r-- | api/current.xml | 10 | ||||
| -rw-r--r-- | core/java/android/hardware/Camera.java | 24 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 12 | ||||
| -rw-r--r-- | core/java/android/view/ViewRoot.java | 4 | ||||
| -rw-r--r--[-rwxr-xr-x] | core/res/res/drawable-hdpi/textfield_pressed.9.png | bin | 1020 -> 591 bytes | |||
| -rw-r--r-- | core/res/res/drawable-mdpi/textfield_pressed.9.png | bin | 820 -> 584 bytes | |||
| -rw-r--r-- | docs/html/sdk/index.jd | 55 | ||||
| -rw-r--r-- | docs/html/sdk/installing.jd | 8 | ||||
| -rw-r--r-- | include/private/media/VideoFrame.h | 1 | ||||
| -rw-r--r-- | libs/ui/Region.cpp | 2 | ||||
| -rw-r--r-- | media/jni/android_media_MediaMetadataRetriever.cpp | 59 | ||||
| -rw-r--r-- | media/libmediaplayerservice/MetadataRetrieverClient.cpp | 2 | ||||
| -rw-r--r-- | media/libstagefright/StagefrightMetadataRetriever.cpp | 6 |
14 files changed, 116 insertions, 90 deletions
@@ -73399,16 +73399,6 @@ visibility="public" > </field> -<field name="CAMERA_ID_DEFAULT" - type="int" - transient="false" - volatile="false" - static="true" - final="false" - deprecated="not deprecated" - visibility="public" -> -</field> </class> <interface name="Camera.AutoFocusCallback" abstract="true" @@ -86967,6 +86957,19 @@ <parameter name="listener" type="android.media.MediaRecorder.OnInfoListener"> </parameter> </method> +<method name="setOrientationHint" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="degrees" type="int"> +</parameter> +</method> <method name="setOutputFile" return="void" abstract="false" diff --git a/api/current.xml b/api/current.xml index ac92b7a..fb3b998 100644 --- a/api/current.xml +++ b/api/current.xml @@ -73399,16 +73399,6 @@ visibility="public" > </field> -<field name="CAMERA_ID_DEFAULT" - type="int" - transient="false" - volatile="false" - static="true" - final="false" - deprecated="not deprecated" - visibility="public" -> -</field> </class> <interface name="Camera.AutoFocusCallback" abstract="true" diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 275e2eb..378189e 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -211,8 +211,7 @@ public class Camera { * blocking the main application UI thread. * * @param cameraId the hardware camera to access, between 0 and - * {@link #getNumberOfCameras()}-1. Use {@link #CAMERA_ID_DEFAULT} - * to access the default camera. + * {@link #getNumberOfCameras()}-1. * @return a new Camera object, connected, locked and ready for use. * @throws RuntimeException if connection to the camera service fails (for * example, if the camera is in use by another process). @@ -222,18 +221,21 @@ public class Camera { } /** - * The id for the default camera. - * @see #open(int) - */ - public static int CAMERA_ID_DEFAULT = 0; - - /** - * Equivalent to Camera.open(Camera.CAMERA_ID_DEFAULT). - * Creates a new Camera object to access the default camera. + * Creates a new Camera object to access the first back-facing camera on the + * device. If the device does not have a back-facing camera, this returns + * null. * @see #open(int) */ public static Camera open() { - return new Camera(CAMERA_ID_DEFAULT); + int numberOfCameras = getNumberOfCameras(); + CameraInfo cameraInfo = new CameraInfo(); + for (int i = 0; i < numberOfCameras; i++) { + getCameraInfo(i, cameraInfo); + if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { + return new Camera(i); + } + } + return null; } Camera(int cameraId) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index acda3e1..6590497 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6533,11 +6533,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility final int drawingCacheBackgroundColor = mDrawingCacheBackgroundColor; final boolean opaque = drawingCacheBackgroundColor != 0 || isOpaque(); - final boolean translucentWindow = attachInfo != null && attachInfo.mTranslucentWindow; + final boolean use32BitCache = attachInfo != null && attachInfo.mUse32BitDrawingCache; if (width <= 0 || height <= 0 || // Projected bitmap size in bytes - (width * height * (opaque && !translucentWindow ? 2 : 4) > + (width * height * (opaque && !use32BitCache ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) { destroyDrawingCache(); return; @@ -6567,7 +6567,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } else { // Optimization for translucent windows // If the window is translucent, use a 32 bits bitmap to benefit from memcpy() - quality = translucentWindow ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; + quality = use32BitCache ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; } // Try to cleanup memory @@ -6581,7 +6581,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } else { mUnscaledDrawingCache = new SoftReference<Bitmap>(bitmap); } - if (opaque && translucentWindow) bitmap.setHasAlpha(false); + if (opaque && use32BitCache) bitmap.setHasAlpha(false); } catch (OutOfMemoryError e) { // If there is not enough memory to create the bitmap cache, just // ignore the issue as bitmap caches are not required to draw the @@ -9315,9 +9315,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility int mWindowTop; /** - * Indicates whether the window is translucent/transparent + * Indicates whether views need to use 32-bit drawing caches */ - boolean mTranslucentWindow; + boolean mUse32BitDrawingCache; /** * For windows that are full-screen but using insets to layout inside diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 9c249ce..c58207e 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -754,7 +754,8 @@ public final class ViewRoot extends Handler implements ViewParent, // object is not initialized to its backing store, but soon it // will be (assuming the window is visible). attachInfo.mSurface = mSurface; - attachInfo.mTranslucentWindow = PixelFormat.formatHasAlpha(lp.format); + attachInfo.mUse32BitDrawingCache = PixelFormat.formatHasAlpha(lp.format) || + lp.format == PixelFormat.RGBX_8888; attachInfo.mHasWindowFocus = false; attachInfo.mWindowVisibility = viewVisibility; attachInfo.mRecomputeGlobalAttributes = false; @@ -1301,6 +1302,7 @@ public final class ViewRoot extends Handler implements ViewParent, // Need to make sure we re-evaluate the window attributes next // time around, to ensure the window has the correct format. mWindowAttributesChanged = true; + requestLayout(); } } diff --git a/core/res/res/drawable-hdpi/textfield_pressed.9.png b/core/res/res/drawable-hdpi/textfield_pressed.9.png Binary files differindex 296d3da..6537be0 100755..100644 --- a/core/res/res/drawable-hdpi/textfield_pressed.9.png +++ b/core/res/res/drawable-hdpi/textfield_pressed.9.png diff --git a/core/res/res/drawable-mdpi/textfield_pressed.9.png b/core/res/res/drawable-mdpi/textfield_pressed.9.png Binary files differindex 6d03e1e..9524fec 100644 --- a/core/res/res/drawable-mdpi/textfield_pressed.9.png +++ b/core/res/res/drawable-mdpi/textfield_pressed.9.png diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index 2812ae8..3dda5ee 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -19,52 +19,15 @@ sdk.linux_checksum=TODO @jd:body +<p>Here's an overview of the steps you must follow to set up the Android SDK:</p> -<h2 id="quickstart">Quick Start</h2> +<ol> + <li>Prepare your development computer and ensure it meets the system requirements.</li> + <li>Install the SDK starter package from the table above.</li> + <li>Install the ADT Plugin for Eclipse (if you'll be developing in Eclipse).</li> + <li>Add Android platforms and other components to your SDK.</li> + <li>Explore the contents of the Android SDK (optional).</li> +</ol> -<p><strong>1. Prepare your development computer</strong></p> - -<p>Read the <a href="{@docRoot}sdk/requirements.html">System Requirements</a> -document and make sure that your development computer meets the hardware and -software requirements for the Android SDK. Install any additional software -needed before downloading the Android SDK. In particular, you may need to -install the <a href="http://java.sun.com/javase/downloads/index.jsp">JDK</a> - (version 5 or 6 required) and <a href="http://www.eclipse.org/downloads/">Eclipse</a> - (version 3.4 or 3.5, needed only if you want develop using the ADT Plugin). - -<p><strong>2. Download and install the SDK starter package</strong></p> - -<p>Download a starter package from the table above onto your development computer. -If you're using Windows, we recommend that you download the installer (the {@code .exe} file), -which will launch a Wizard to guide you through the installation and check your computer for -required software. Otherwise, download the SDK starter package ({@code .zip} or {@code .tgz}) -appropriate for your system, unpack it to a safe location, then add the location to your PATH -environment variable. </p> - -<p><strong>3. Install the ADT Plugin for Eclipse</strong></p> - -<p>If you are developing in Eclipse, add a new remote update site with the URL -<code>https://dl-ssl.google.com/android/eclipse/</code>. Install the Android -Development Tools (ADT) Plugin from that site, restart Eclipse, and set the "Android" -preferences in Eclipse to point to the Android SDK directory (installed in the previous step). For -detailed instructions to setup Eclipse, see <a href="{@docRoot}sdk/eclipse-adt.html">ADT Plugin -for Eclipse</a>.</p> - -<p><strong>4. Add Android platforms and other components to your SDK</strong></p> - -<p>Launch the <em>Android SDK and AVD Manager</em> by executing {@code SDK Manager.exe} (Windows) or -{@code android} (Mac/Linux) from the SDK's {@code tools/} directory (if you used the Windows -installer, this is launched for you when the Wizard is complete). Add some Android platforms -(such as Android 1.6 and Android 2.3) and other components (such as documentation) to your SDK. If -you aren't sure what to add, see <a -href="installing.html#which">Recommended Components</a></p> - -<p><strong>Done!</strong></p> - -<p>To write your first Android application, see the <a -href="{@docRoot}resources/tutorials/hello-world.html">Hello World</a> tutorial. Also see <a -href="{@docRoot}sdk/installing.html#NextSteps">Next -Steps</a> for other suggestions about how to get started.</p> - -<p>For a more detailed guide to installing and setting up the SDK, read <a +<p>To get started, download the appropriate package from the table above, then read the guide to <a href="installing.html">Installing the SDK</a>.</p> diff --git a/docs/html/sdk/installing.jd b/docs/html/sdk/installing.jd index 5b5c4f4..2f19181 100644 --- a/docs/html/sdk/installing.jd +++ b/docs/html/sdk/installing.jd @@ -58,7 +58,7 @@ function toggleDiv(link) { <ol> <li><a href="#which">Recommended Components</a></li> </ol></li> - <li><a href="#sdkContents">5. Exploring the SDK</a></li> + <li><a href="#sdkContents">5. Exploring the SDK (Optional)</a></li> <li><a href="#NextSteps">Next Steps</a></li> <li><a href="#troubleshooting">Troubleshooting</a></li> </ol> @@ -112,7 +112,7 @@ RCP version of Eclipse is recommended.</p> development environment—it includes only the core SDK Tools, which you can use to download the rest of the SDK components (such as the latest Android platform).</p> -<p>You can get the latest version of the SDK starter package from the <a +<p>If you haven't already, get the latest version of the SDK starter package from the <a href="{@docRoot}sdk/index.html">SDK download page</a>.</p> <p>If you downloaded a {@code .zip} or {@code .tgz} package (instead of the SDK installer), unpack @@ -379,10 +379,10 @@ you with the components you've just installed.</p> href="{@docRoot}sdk/adding-components.html">Adding SDK Components</a> document. </p> -<h2 id="sdkContents">Step 5. Exploring the SDK</h2> +<h2 id="sdkContents">Step 5. Exploring the SDK (Optional)</h2> <p>Once you've installed the SDK and downloaded the platforms, documentation, -and add-ons that you need, open the SDK directory and take a look at what's +and add-ons that you need, we suggest that you open the SDK directory and take a look at what's inside.</p> <p>The table below describes the full SDK directory contents, with components diff --git a/include/private/media/VideoFrame.h b/include/private/media/VideoFrame.h index 9c35274ba..3aff0c6 100644 --- a/include/private/media/VideoFrame.h +++ b/include/private/media/VideoFrame.h @@ -120,6 +120,7 @@ public: uint32_t mDisplayHeight; uint32_t mSize; // Number of bytes in mData uint8_t* mData; // Actual binary data + int32_t mRotationAngle; // rotation angle, clockwise }; }; // namespace android diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp index 12db908..1994f6a 100644 --- a/libs/ui/Region.cpp +++ b/libs/ui/Region.cpp @@ -289,7 +289,7 @@ private: void flushSpan() { bool merge = false; if (tail-head == ssize_t(span.size())) { - Rect const* p = cur; + Rect const* p = span.editArray(); Rect const* q = head; if (p->top == q->bottom) { merge = true; diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index efea802..63e9dc8 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -36,6 +36,7 @@ struct fields_t { jfieldID context; jclass bitmapClazz; jmethodID bitmapConstructor; + jmethodID createBitmapMethod; }; static fields_t fields; @@ -174,6 +175,41 @@ static jobject android_media_MediaMetadataRetriever_captureFrame(JNIEnv *env, jo return NULL; } + jobject matrix = NULL; + if (videoFrame->mRotationAngle != 0) { + LOGD("Create a rotation matrix: %d degrees", videoFrame->mRotationAngle); + jclass matrixClazz = env->FindClass("android/graphics/Matrix"); + if (matrixClazz == NULL) { + jniThrowException(env, "java/lang/RuntimeException", + "Can't find android/graphics/Matrix"); + return NULL; + } + jmethodID matrixConstructor = + env->GetMethodID(matrixClazz, "<init>", "()V"); + if (matrixConstructor == NULL) { + jniThrowException(env, "java/lang/RuntimeException", + "Can't find Matrix constructor"); + return NULL; + } + matrix = + env->NewObject(matrixClazz, matrixConstructor); + if (matrix == NULL) { + LOGE("Could not create a Matrix object"); + return NULL; + } + + LOGV("Rotate the matrix: %d degrees", videoFrame->mRotationAngle); + jmethodID setRotateMethod = + env->GetMethodID(matrixClazz, "setRotate", "(F)V"); + if (setRotateMethod == NULL) { + jniThrowException(env, "java/lang/RuntimeException", + "Can't find Matrix setRotate method"); + return NULL; + } + env->CallVoidMethod(matrix, setRotateMethod, 1.0 * videoFrame->mRotationAngle); + env->DeleteLocalRef(matrixClazz); + } + // Create a SkBitmap to hold the pixels SkBitmap *bitmap = new SkBitmap(); if (bitmap == NULL) { @@ -191,7 +227,19 @@ static jobject android_media_MediaMetadataRetriever_captureFrame(JNIEnv *env, jo // Since internally SkBitmap uses reference count to manage the reference to // its pixels, it is important that the pixels (along with SkBitmap) be // available after creating the Bitmap is returned to Java app. - return env->NewObject(fields.bitmapClazz, fields.bitmapConstructor, (int) bitmap, true, NULL, -1); + jobject jSrcBitmap = env->NewObject(fields.bitmapClazz, + fields.bitmapConstructor, (int) bitmap, true, NULL, -1); + + LOGV("Return a new bitmap constructed with the rotation matrix"); + return env->CallStaticObjectMethod( + fields.bitmapClazz, fields.createBitmapMethod, + jSrcBitmap, // source Bitmap + 0, // x + 0, // y + videoFrame->mDisplayWidth, // width + videoFrame->mDisplayHeight, // height + matrix, // transform matrix + false); // filter } static jbyteArray android_media_MediaMetadataRetriever_extractAlbumArt(JNIEnv *env, jobject thiz) @@ -291,6 +339,15 @@ static void android_media_MediaMetadataRetriever_native_init(JNIEnv *env) jniThrowException(env, "java/lang/RuntimeException", "Can't find Bitmap constructor"); return; } + fields.createBitmapMethod = + env->GetStaticMethodID(fields.bitmapClazz, "createBitmap", + "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)" + "Landroid/graphics/Bitmap;"); + if (fields.createBitmapMethod == NULL) { + jniThrowException(env, "java/lang/RuntimeException", + "Can't find Bitmap.createBitmap method"); + return; + } } static void android_media_MediaMetadataRetriever_native_setup(JNIEnv *env, jobject thiz) diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp index ca229fa..39fce81 100644 --- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp +++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp @@ -253,6 +253,8 @@ sp<IMemory> MetadataRetrieverClient::captureFrame() frameCopy->mDisplayWidth = frame->mDisplayWidth; frameCopy->mDisplayHeight = frame->mDisplayHeight; frameCopy->mSize = frame->mSize; + frameCopy->mRotationAngle = frame->mRotationAngle; + LOGV("rotation: %d", frameCopy->mRotationAngle); frameCopy->mData = (uint8_t *)frameCopy + sizeof(VideoFrame); memcpy(frameCopy->mData, frame->mData, frame->mSize); delete frame; // Fix memory leakage diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index a800a93..9b2dec9 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -191,6 +191,11 @@ static VideoFrame *extractVideoFrameWithCodecFlags( CHECK(meta->findInt32(kKeyWidth, &width)); CHECK(meta->findInt32(kKeyHeight, &height)); + int32_t rotationAngle; + if (!trackMeta->findInt32(kKeyRotation, &rotationAngle)) { + rotationAngle = 0; // By default, no rotation + } + VideoFrame *frame = new VideoFrame; frame->mWidth = width; frame->mHeight = height; @@ -198,6 +203,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags( frame->mDisplayHeight = height; frame->mSize = width * height * 2; frame->mData = new uint8_t[frame->mSize]; + frame->mRotationAngle = rotationAngle; int32_t srcFormat; CHECK(meta->findInt32(kKeyColorFormat, &srcFormat)); |
