Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aedea98b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Gallery2: Fix for bug in mpo parsing"

parents 8d79690e 399e6e41
Loading
Loading
Loading
Loading
+25 −9
Original line number Diff line number Diff line
@@ -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();
        }
    }
+1 −0
Original line number Diff line number Diff line
@@ -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();
+5 −0
Original line number Diff line number Diff line
@@ -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);
+2 −3
Original line number Diff line number Diff line
@@ -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;
+57 −26
Original line number Diff line number Diff line
@@ -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 {
    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;

        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();
        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);
        }

        return mPrimaryEntry;
    }

    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 {
            if(mMpEntries.size() > 2) {
                mpEntry = mMpEntries.get(2);
            } else {
            mpEntry = mSecondaryEntry;
                mpEntry = mMpEntries.get(1);
            }
        }

        if(mpEntry == null)
@@ -288,4 +311,12 @@ public class MpoParser {
        short mDepImg1Entry;
        short mDepImg2Entry;
    }

    class MpoTag {
        short mId;
        short mType;
        int mCount;
        int mData;
    }
}