aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2015-04-12 14:00:10 -0700
committerEino-Ville Talvala <etalvala@google.com>2015-04-13 10:13:24 -0700
commit1134f70e714f227487581dc06aa4fb7bf931a6c2 (patch)
tree6936351d1de28dbfcadc4719a1ce551c1d9ba2a4
parent36dcae7c5cbc7ea8bef1e14d0be005c8c8c75ecf (diff)
downloadpdk-1134f70e714f227487581dc06aa4fb7bf931a6c2.tar.gz
TestingCamera2: Add prepare button to target control pane
Triggers the CameraCaptureSession prepare call for the target Surface. Also fix reading past the end of the ByteBuffer for YUV_420_888 with semiplanar formats. Change-Id: I529400a0ecd9acc00c584c77a70c34f55fcb67d1
-rw-r--r--apps/TestingCamera2/res/layout/target_pane.xml10
-rw-r--r--apps/TestingCamera2/res/values/strings.xml1
-rw-r--r--apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java19
-rw-r--r--apps/TestingCamera2/src/com/android/testingcamera2/ImageReaderSubPane.java6
-rw-r--r--apps/TestingCamera2/src/com/android/testingcamera2/TargetControlPane.java17
5 files changed, 48 insertions, 5 deletions
diff --git a/apps/TestingCamera2/res/layout/target_pane.xml b/apps/TestingCamera2/res/layout/target_pane.xml
index 9c241a6..4efcc31 100644
--- a/apps/TestingCamera2/res/layout/target_pane.xml
+++ b/apps/TestingCamera2/res/layout/target_pane.xml
@@ -28,15 +28,21 @@
android:id="@+id/target_pane_camera_spinner"
android:layout_width="0px"
android:layout_height="wrap_content"
- android:layout_weight="1"
+ android:layout_weight="2"
android:prompt="@string/target_pane_camera_prompt" />
<ToggleButton
android:id="@+id/target_pane_configure_toggle"
android:layout_width="0px"
android:layout_height="wrap_content"
- android:layout_weight="1"
+ android:layout_weight="2"
android:textOn="@string/target_pane_configure_button_on"
android:textOff="@string/target_pane_configure_button_off" />
+ <Button
+ android:id="@+id/target_pane_prepare_button"
+ android:layout_width="0px"
+ android:layout_height="wrap_content"
+ android:text="@string/target_pane_prepare_button"
+ android:layout_weight="1" />
</LinearLayout>
<Spinner
android:id="@+id/target_pane_output_spinner"
diff --git a/apps/TestingCamera2/res/values/strings.xml b/apps/TestingCamera2/res/values/strings.xml
index dcca6bb..5f749aa 100644
--- a/apps/TestingCamera2/res/values/strings.xml
+++ b/apps/TestingCamera2/res/values/strings.xml
@@ -59,6 +59,7 @@
<string name="target_pane_output_prompt">Output</string>
<string name="target_pane_configure_button_off">Not configured</string>
<string name="target_pane_configure_button_on">Will be configured</string>
+ <string name="target_pane_prepare_button">Prep</string>
<string name="target_subpane_texture_view_size_prompt">Size</string>
<string name="target_subpane_surface_view_size_prompt">Size</string>
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java b/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java
index b220328..594d161 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java
@@ -297,6 +297,19 @@ public class CameraControlPane extends ControlPane {
return null;
}
+ public void prepareSurface(Surface target) {
+ if (mCurrentCaptureSession != null) {
+ try {
+ TLog.i("Preparing Surface " + target);
+ mCurrentCaptureSession.prepare(target);
+ } catch (CameraAccessException e) {
+ TLog.e("Unable to prepare surface for camera %s.", e, mCurrentCameraId);
+ } catch (IllegalArgumentException e) {
+ TLog.e("Bad Surface passed to prepare", e);
+ }
+ }
+ }
+
private CaptureCallback mResultListener = new CaptureCallback() {
public void onCaptureCompleted(
CameraCaptureSession session,
@@ -513,6 +526,12 @@ public class CameraControlPane extends ControlPane {
}
setSessionState(SessionState.CLOSED);
}
+
+ @Override
+ public void onSurfacePrepared(CameraCaptureSession session, Surface surface) {
+ TLog.i("Surface preparation complete for Surface " + surface);
+ }
+
};
private final CameraDevice.StateCallback mCameraListener = new CameraDevice.StateCallback() {
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/ImageReaderSubPane.java b/apps/TestingCamera2/src/com/android/testingcamera2/ImageReaderSubPane.java
index 4b4d978..24233ca 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/ImageReaderSubPane.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/ImageReaderSubPane.java
@@ -345,8 +345,8 @@ public class ImageReaderSubPane extends TargetSubPane {
int uPStride = img.getPlanes()[1].getPixelStride();
int vPStride = img.getPlanes()[2].getPixelStride();
byte[] row = new byte[mConfiguredSize.getWidth()];
- byte[] uRow = new byte[mConfiguredSize.getWidth()/2*uPStride];
- byte[] vRow = new byte[mConfiguredSize.getWidth()/2*vPStride];
+ byte[] uRow = new byte[(mConfiguredSize.getWidth()/2-1)*uPStride + 1];
+ byte[] vRow = new byte[(mConfiguredSize.getWidth()/2-1)*vPStride + 1];
int[] imgArray = new int[w * h];
for (int y = 0, j = 0, rowStart = 0, uRowStart = 0, vRowStart = 0; y < h;
y++, rowStart += stride*SCALE_FACTOR) {
@@ -669,7 +669,7 @@ public class ImageReaderSubPane extends TargetSubPane {
}
} else {
// Need to pack rows
- byte[] row = new byte[colorW * colorPlane.getPixelStride()];
+ byte[] row = new byte[(colorW - 1) * colorPlane.getPixelStride() + 1];
byte[] packedRow = new byte[colorW];
ByteBuffer packedRowBuffer = ByteBuffer.wrap(packedRow);
for (int y = 0, rowStart = 0; y < colorH;
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/TargetControlPane.java b/apps/TestingCamera2/src/com/android/testingcamera2/TargetControlPane.java
index a8fe4f8..b2343f4 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/TargetControlPane.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/TargetControlPane.java
@@ -25,6 +25,7 @@ import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
+import android.widget.Button;
import android.widget.ToggleButton;
import org.xmlpull.v1.XmlPullParser;
@@ -75,6 +76,7 @@ public class TargetControlPane extends ControlPane {
private Spinner mCameraSpinner;
private ToggleButton mCameraConfigureToggle;
+ private Button mPrepareButton;
private Spinner mOutputSpinner;
@@ -136,6 +138,7 @@ public class TargetControlPane extends ControlPane {
boolean isMyTarget =
paneName.equals(mCameraSpinner.getSelectedItem()) &&
mCameraConfigureToggle.isChecked();
+ mPrepareButton.setEnabled(isMyTarget);
return isMyTarget ? mCurrentOutput.getOutputSurface() : null;
}
@@ -177,6 +180,9 @@ public class TargetControlPane extends ControlPane {
mCameraSpinner.setOnItemSelectedListener(mCameraSpinnerListener);
mCameraConfigureToggle = (ToggleButton) findViewById(R.id.target_pane_configure_toggle);
mCameraConfigureToggle.setChecked(true);
+ mPrepareButton = (Button) findViewById(R.id.target_pane_prepare_button);
+ mPrepareButton.setEnabled(false);
+ mPrepareButton.setOnClickListener(mPrepareButtonListener);
mOutputSpinner = (Spinner) findViewById(R.id.target_pane_output_spinner);
mOutputSpinner.setOnItemSelectedListener(mOutputSpinnerListener);
@@ -226,9 +232,19 @@ public class TargetControlPane extends ControlPane {
}
};
+ private final OnClickListener mPrepareButtonListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ CameraControlPane currentCameraPane = mCameraPanes.get(
+ mCameraSpinner.getSelectedItemPosition());
+ currentCameraPane.prepareSurface(mCurrentOutput.getOutputSurface());
+ }
+ };
+
private OnItemSelectedListener mOutputSpinnerListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+ mPrepareButton.setEnabled(false);
if (mCurrentOutput != null) {
TargetControlPane.this.removeView(mCurrentOutput);
}
@@ -244,6 +260,7 @@ public class TargetControlPane extends ControlPane {
@Override
public void onNothingSelected(AdapterView<?> arg0) {
+ mPrepareButton.setEnabled(false);
if (mCurrentOutput != null) {
TargetControlPane.this.removeView(mCurrentOutput);
mCurrentOutput = null;