Loading graphics/java/android/view/PixelCopy.java +3 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,9 @@ public final class PixelCopy { public static void request(@NonNull Surface source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread) { validateBitmapDest(dest); if (!source.isValid()) { throw new IllegalArgumentException("Surface isn't valid, source.isValid() == false"); } // TODO: Make this actually async and fast and cool and stuff int result = ThreadedRenderer.copySurfaceInto(source, dest); listenerThread.post(new Runnable() { Loading tests/HwAccelerationTest/AndroidManifest.xml +9 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,15 @@ </intent-filter> </activity> <activity android:name="VideoViewCaptureActivity" android:label="SurfaceView/GetBitmap with Video source"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="com.android.test.hwui.TEST" /> </intent-filter> </activity> <activity android:name="GLTextureViewActivity" android:label="TextureView/OpenGL"> Loading tests/HwAccelerationTest/res/raw/colorgrid_video.mp4 0 → 100644 +24.6 KiB File added.No diff preview for this file type. View file tests/HwAccelerationTest/src/com/android/test/hwui/VideoViewCaptureActivity.java 0 → 100644 +89 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 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 com.android.test.hwui; import android.app.Activity; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.PixelCopy; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Toast; import android.widget.VideoView; import java.io.FileOutputStream; public class VideoViewCaptureActivity extends Activity { private VideoView mVideoView; private int mVideoWidth, mVideoHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mVideoView = new VideoView(this); mVideoView.setOnPreparedListener(mp -> { mp.setLooping(true); mVideoWidth = mp.getVideoWidth(); mVideoHeight = mp.getVideoHeight(); mVideoView.start(); }); Uri uri = Uri.parse("android.resource://com.android.test.hwui/" + R.raw.colorgrid_video); mVideoView.setVideoURI(uri); Button button = new Button(this); button.setText("Copy bitmap to /sdcard/surfaceview.png"); button.setOnClickListener((View v) -> { final Bitmap b = Bitmap.createBitmap( mVideoWidth, mVideoHeight, Bitmap.Config.ARGB_8888); PixelCopy.request(mVideoView, b, (int result) -> { if (result != PixelCopy.SUCCESS) { Toast.makeText(VideoViewCaptureActivity.this, "Failed to copy", Toast.LENGTH_SHORT).show(); return; } try { try (FileOutputStream out = new FileOutputStream( Environment.getExternalStorageDirectory() + "/surfaceview.png");) { b.compress(Bitmap.CompressFormat.PNG, 100, out); } } catch (Exception e) { // Ignore } }, mVideoView.getHandler()); }); FrameLayout content = new FrameLayout(this); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(button, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layout.addView(mVideoView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); content.addView(layout, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); setContentView(content); } } Loading
graphics/java/android/view/PixelCopy.java +3 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,9 @@ public final class PixelCopy { public static void request(@NonNull Surface source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread) { validateBitmapDest(dest); if (!source.isValid()) { throw new IllegalArgumentException("Surface isn't valid, source.isValid() == false"); } // TODO: Make this actually async and fast and cool and stuff int result = ThreadedRenderer.copySurfaceInto(source, dest); listenerThread.post(new Runnable() { Loading
tests/HwAccelerationTest/AndroidManifest.xml +9 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,15 @@ </intent-filter> </activity> <activity android:name="VideoViewCaptureActivity" android:label="SurfaceView/GetBitmap with Video source"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="com.android.test.hwui.TEST" /> </intent-filter> </activity> <activity android:name="GLTextureViewActivity" android:label="TextureView/OpenGL"> Loading
tests/HwAccelerationTest/res/raw/colorgrid_video.mp4 0 → 100644 +24.6 KiB File added.No diff preview for this file type. View file
tests/HwAccelerationTest/src/com/android/test/hwui/VideoViewCaptureActivity.java 0 → 100644 +89 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 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 com.android.test.hwui; import android.app.Activity; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.PixelCopy; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Toast; import android.widget.VideoView; import java.io.FileOutputStream; public class VideoViewCaptureActivity extends Activity { private VideoView mVideoView; private int mVideoWidth, mVideoHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mVideoView = new VideoView(this); mVideoView.setOnPreparedListener(mp -> { mp.setLooping(true); mVideoWidth = mp.getVideoWidth(); mVideoHeight = mp.getVideoHeight(); mVideoView.start(); }); Uri uri = Uri.parse("android.resource://com.android.test.hwui/" + R.raw.colorgrid_video); mVideoView.setVideoURI(uri); Button button = new Button(this); button.setText("Copy bitmap to /sdcard/surfaceview.png"); button.setOnClickListener((View v) -> { final Bitmap b = Bitmap.createBitmap( mVideoWidth, mVideoHeight, Bitmap.Config.ARGB_8888); PixelCopy.request(mVideoView, b, (int result) -> { if (result != PixelCopy.SUCCESS) { Toast.makeText(VideoViewCaptureActivity.this, "Failed to copy", Toast.LENGTH_SHORT).show(); return; } try { try (FileOutputStream out = new FileOutputStream( Environment.getExternalStorageDirectory() + "/surfaceview.png");) { b.compress(Bitmap.CompressFormat.PNG, 100, out); } } catch (Exception e) { // Ignore } }, mVideoView.getHandler()); }); FrameLayout content = new FrameLayout(this); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(button, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layout.addView(mVideoView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); content.addView(layout, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); setContentView(content); } }