diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-08-03 05:14:51 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-03 05:14:51 -0700 |
| commit | aedea98b0a5a0d5abf80c14c0dae4cbf2e75553a (patch) | |
| tree | 650d6733f24e92abb3bce7b4d5ead58c6f9ab854 | |
| parent | 8d79690e30a4134f133a5a04bcb6f808c08a0b7b (diff) | |
| parent | 399e6e41c6c65fbf0d5915309b6b6b344511b269 (diff) | |
| download | android_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"
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; + } +} + |
