summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-03 05:14:51 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-03 05:14:51 -0700
commitaedea98b0a5a0d5abf80c14c0dae4cbf2e75553a (patch)
tree650d6733f24e92abb3bce7b4d5ead58c6f9ab854
parent8d79690e30a4134f133a5a04bcb6f808c08a0b7b (diff)
parent399e6e41c6c65fbf0d5915309b6b6b344511b269 (diff)
downloadandroid_packages_apps_Gallery2-aedea98b0a5a0d5abf80c14c0dae4cbf2e75553a.tar.gz
android_packages_apps_Gallery2-aedea98b0a5a0d5abf80c14c0dae4cbf2e75553a.tar.bz2
android_packages_apps_Gallery2-aedea98b0a5a0d5abf80c14c0dae4cbf2e75553a.zip
Merge "Gallery2: Fix for bug in mpo parsing"
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java34
-rw-r--r--src/com/android/gallery3d/filtershow/category/CategoryPanel.java1
-rw-r--r--src/com/android/gallery3d/filtershow/category/MainPanel.java5
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java5
-rw-r--r--src/com/android/gallery3d/mpo/MpoParser.java83
5 files changed, 90 insertions, 38 deletions
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index cfce7c54a..890458b4b 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -19,8 +19,8 @@ package com.android.gallery3d.filtershow;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
-import java.util.Vector;
import java.util.Locale;
+import java.util.Vector;
import android.app.ActionBar;
import android.app.AlertDialog;
@@ -62,10 +62,10 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
-import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewPropertyAnimator;
+import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
@@ -917,6 +917,11 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
mParseMpoTask.execute();
} else {
MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED);
+ Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
+ if (currentPanel instanceof MainPanel) {
+ MainPanel mainPanel = (MainPanel) currentPanel;
+ mainPanel.updateDualCameraButton();
+ }
}
}
@@ -1190,26 +1195,32 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
}
}
- private class ParseMpoDataTask extends AsyncTask<Void, Void, byte[]> {
+ private class ParseMpoDataTask extends AsyncTask<Void, Void, Void> {
+ private byte[] mPrimaryImgData = null;
+ private byte[] mAuxImgData = null;
+
@Override
protected void onPreExecute() {
MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_PARSING);
}
@Override
- protected byte[] doInBackground(Void... params) {
+ protected Void doInBackground(Void... params) {
MpoParser parser = MpoParser.parse(FilterShowActivity.this, MasterImage.getImage().getUri());
- return parser.readImgData(false);
+ mPrimaryImgData = parser.readImgData(true);
+ mAuxImgData = parser.readImgData(false);
+ return null;
}
@Override
- protected void onPostExecute(byte[] result) {
- if(result == null) {
+ protected void onPostExecute(Void result) {
+ if(mPrimaryImgData == null ||
+ mAuxImgData == null) {
// parse failed
MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED);
} else {
mLoadMpoTask = new LoadMpoDataTask();
- mLoadMpoTask.execute(result);
+ mLoadMpoTask.execute(mPrimaryImgData, mAuxImgData);
}
Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
@@ -1228,12 +1239,17 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
@Override
protected Boolean doInBackground(byte[]... params) {
- return MasterImage.getImage().loadMpo(params[0]);
+ return MasterImage.getImage().loadMpo(params[0], params[1]);
}
@Override
protected void onPostExecute(Boolean result) {
MasterImage.getImage().setDepthMapLoadingStatus(result?DdmStatus.DDM_LOADED:DdmStatus.DDM_FAILED);
+ Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
+ if (currentPanel instanceof MainPanel) {
+ MainPanel mainPanel = (MainPanel) currentPanel;
+ mainPanel.updateDualCameraButton();
+ }
stopLoadingIndicator();
}
}
diff --git a/src/com/android/gallery3d/filtershow/category/CategoryPanel.java b/src/com/android/gallery3d/filtershow/category/CategoryPanel.java
index cbe38c8e6..87f347586 100644
--- a/src/com/android/gallery3d/filtershow/category/CategoryPanel.java
+++ b/src/com/android/gallery3d/filtershow/category/CategoryPanel.java
@@ -88,6 +88,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener {
mAdapter.initializeSelection(MainPanel.DUALCAM);
}
activity.updateCategories();
+ break;
}
case MainPanel.TRUESCANNER: {
mAdapter = activity.getCategoryTrueScannerAdapter();
diff --git a/src/com/android/gallery3d/filtershow/category/MainPanel.java b/src/com/android/gallery3d/filtershow/category/MainPanel.java
index f4b22e37b..6571c46a3 100644
--- a/src/com/android/gallery3d/filtershow/category/MainPanel.java
+++ b/src/com/android/gallery3d/filtershow/category/MainPanel.java
@@ -38,6 +38,7 @@ import com.android.gallery3d.filtershow.filters.SimpleMakeupImageFilter;
import com.android.gallery3d.filtershow.filters.TrueScannerActs;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.state.StatePanel;
+import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine.DdmStatus;
public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelegate {
@@ -171,6 +172,10 @@ public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelega
geometryButton = (ImageButton) bottomPanel.findViewById(R.id.geometryButton);
filtersButton = (ImageButton) bottomPanel.findViewById(R.id.colorsButton);
dualCamButton = (ImageButton) bottomPanel.findViewById(R.id.dualCamButton);
+ if(!DualCameraNativeEngine.getInstance().isLibLoaded()) {
+ dualCamButton.setVisibility(View.GONE);
+ }
+
if (SimpleMakeupImageFilter.HAS_TS_MAKEUP) {
makeupButton = (ImageButton) bottomPanel.findViewById(R.id.makeupButton);
makeupButton.setVisibility(View.VISIBLE);
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index fa82989bb..09bf27bd9 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -53,7 +53,6 @@ import com.android.gallery3d.filtershow.pipeline.SharedPreset;
import com.android.gallery3d.filtershow.state.StateAdapter;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine.DdmStatus;
-import com.android.gallery3d.mpo.MpoParser;
public class MasterImage implements RenderingRequestCaller {
@@ -957,11 +956,11 @@ public class MasterImage implements RenderingRequestCaller {
return mPreset.contains(FilterRepresentation.TYPE_TINYPLANET);
}
- public boolean loadMpo(byte[] auxiliaryMpoData) {
+ public boolean loadMpo(byte[] primaryMpoData, byte[] auxiliaryMpoData) {
boolean loaded = false;
if(auxiliaryMpoData != null) {
- Bitmap primaryBm = ImageLoader.loadBitmap(getActivity(), getUri(), null);
+ Bitmap primaryBm = BitmapFactory.decodeByteArray(primaryMpoData, 0, primaryMpoData.length);
if(primaryBm == null) {
return false;
diff --git a/src/com/android/gallery3d/mpo/MpoParser.java b/src/com/android/gallery3d/mpo/MpoParser.java
index d859c05b4..b872db640 100644
--- a/src/com/android/gallery3d/mpo/MpoParser.java
+++ b/src/com/android/gallery3d/mpo/MpoParser.java
@@ -37,6 +37,8 @@ import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.HashMap;
import android.content.ContentResolver;
import android.content.Context;
@@ -62,12 +64,13 @@ public class MpoParser {
private int mMpHeaderOffset;
private int mIfd1Offset;
private int mMpEntryOffset;
- private MpEntry mPrimaryEntry;
- private MpEntry mSecondaryEntry;
+ private HashMap<Short, MpoTag> mTags = new HashMap<Short, MpoTag>();
+ private ArrayList<MpEntry> mMpEntries = new ArrayList<MpEntry>();
private MpoParser(Context context, Uri uri) {
mContentResolver = context.getContentResolver();
mUri = uri;
+ mTags.clear();
InputStream is = null;
try {
@@ -136,41 +139,61 @@ public class MpoParser {
mDataStream.skipTo(mIfd1Offset);
int count = mDataStream.readShort();
// add 6 (2 for count, 4 for offset to next IFD)
+ for(int i=0; i<count; i++) {
+ MpoTag tag = readMpoTag();
+ mTags.put(tag.mId, tag);
+ }
+
mMpEntryOffset = mIfd1Offset + (count*MP_INDEX_FIELD_SIZE_BYTES) + 6;
}
- private MpEntry readMpEntryData() {
- try {
- mDataStream.skipTo(mMpEntryOffset);
-
- mPrimaryEntry = new MpEntry();
- mPrimaryEntry.mImgAttribute = mDataStream.readInt();
- mPrimaryEntry.mImgSize = mDataStream.readInt();
- mPrimaryEntry.mImgDataOffset = mDataStream.readInt();
- mPrimaryEntry.mDepImg1Entry = mDataStream.readShort();
- mPrimaryEntry.mDepImg2Entry = mDataStream.readShort();
-
- mSecondaryEntry = new MpEntry();
- mSecondaryEntry.mImgAttribute = mDataStream.readInt();
- mSecondaryEntry.mImgSize = mDataStream.readInt();
- mSecondaryEntry.mImgDataOffset = mDataStream.readInt();
- mSecondaryEntry.mDepImg1Entry = mDataStream.readShort();
- mSecondaryEntry.mDepImg2Entry = mDataStream.readShort();
- } catch (IOException e) {
- e.printStackTrace();
- }
+ private MpoTag readMpoTag() throws IOException {
+ MpoTag tag = new MpoTag();
+ tag.mId = mDataStream.readShort();
+ tag.mType = mDataStream.readShort();
+ tag.mCount = mDataStream.readInt();
+ tag.mData = mDataStream.readInt();
+ return tag;
+ }
+
+ private void readMpEntryData() throws IOException {
+ MpoTag numImagesTag = mTags.get((short)0xB001);
+ int numImages = numImagesTag.mData;
- return mPrimaryEntry;
+ mDataStream.skipTo(mMpEntryOffset);
+
+ for(int i=0; i<numImages; i++) {
+ MpEntry mpEntry = new MpEntry();
+ mpEntry.mImgAttribute = mDataStream.readInt();
+ mpEntry.mImgSize = mDataStream.readInt();
+ mpEntry.mImgDataOffset = mDataStream.readInt();
+ mpEntry.mDepImg1Entry = mDataStream.readShort();
+ mpEntry.mDepImg2Entry = mDataStream.readShort();
+ mMpEntries.add(mpEntry);
+ }
}
public byte[] readImgData(boolean primary) {
MpEntry mpEntry = null;
byte[] data = null;
+ if(mMpEntries.size() < 2){
+ // not enough entries were read.
+ return null;
+ }
+
if(primary) {
- mpEntry = mPrimaryEntry;
+ if(mMpEntries.size() > 2) {
+ mpEntry = mMpEntries.get(1);
+ } else {
+ mpEntry = mMpEntries.get(0);
+ }
} else {
- mpEntry = mSecondaryEntry;
+ if(mMpEntries.size() > 2) {
+ mpEntry = mMpEntries.get(2);
+ } else {
+ mpEntry = mMpEntries.get(1);
+ }
}
if(mpEntry == null)
@@ -288,4 +311,12 @@ public class MpoParser {
short mDepImg1Entry;
short mDepImg2Entry;
}
-} \ No newline at end of file
+
+ class MpoTag {
+ short mId;
+ short mType;
+ int mCount;
+ int mData;
+ }
+}
+