diff options
author | Jay Wang <jaywang@codeaurora.org> | 2016-02-22 16:38:13 -0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-08-03 15:45:46 -0700 |
commit | 16ac0c5d1326a232624804a9d5697274186fcce4 (patch) | |
tree | a34dc6f2241382370ef469d8bfa9c086b4ae6ebe /src/com/android/camera/mpo/MpoInterface.java | |
parent | e5d300a3dc13848fe8a8920bafb5474c29b44213 (diff) | |
download | android_packages_apps_Snap-16ac0c5d1326a232624804a9d5697274186fcce4.tar.gz android_packages_apps_Snap-16ac0c5d1326a232624804a9d5697274186fcce4.tar.bz2 android_packages_apps_Snap-16ac0c5d1326a232624804a9d5697274186fcce4.zip |
SnapdragonCamera: Add support for outputting MPO format files
Add support for generating MPO formatted files from the application
layer.
CRs-Fixed: 993611
Change-Id: I9a78d33e1d80b7da748f9bc75446f49172342078
Diffstat (limited to 'src/com/android/camera/mpo/MpoInterface.java')
-rw-r--r-- | src/com/android/camera/mpo/MpoInterface.java | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/com/android/camera/mpo/MpoInterface.java b/src/com/android/camera/mpo/MpoInterface.java new file mode 100644 index 000000000..3e2d9a4e2 --- /dev/null +++ b/src/com/android/camera/mpo/MpoInterface.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Not a contribution. + * + * Copyright (C) 2013 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.camera.mpo; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import android.util.Log; + +import com.android.camera.exif.ExifInterface; +import com.android.camera.util.CameraUtil; + +public class MpoInterface { + private static final String TAG = "MpoInterface"; + private static final String NULL_ARGUMENT_STRING = "Argument is null"; + + // Index IFD + public static final int TAG_MP_FORMAT_VERSION = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_INDEX_IFD + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB000); + public static final int TAG_NUM_IMAGES = ExifInterface.defineTag(MpoIfdData.TYPE_MP_INDEX_IFD, + (short) 0xB001); + public static final int TAG_MP_ENTRY = ExifInterface.defineTag(MpoIfdData.TYPE_MP_INDEX_IFD, + (short) 0xB002); + public static final int TAG_IMAGE_UNIQUE_ID_LIST = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_INDEX_IFD, (short) 0xB003); + public static final int TAG_NUM_CAPTURED_FRAMES = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_INDEX_IFD, (short) 0xB004); + + // Attrib IFD + public static final int TAG_IMAGE_NUMBER = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB101); + public static final int TAG_PAN_ORIENTATION = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB201); + public static final int TAG_PAN_OVERLAP_H = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB202); + public static final int TAG_PAN_OVERLAP_V = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB203); + public static final int TAG_BASE_VIEWPOINT_NUM = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB204); + public static final int TAG_CONVERGE_ANGLE = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB205); + public static final int TAG_BASELINE_LEN = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB206); + public static final int TAG_DIVERGE_ANGLE = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB207); + public static final int TAG_AXIS_DISTANCE_X = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB208); + public static final int TAG_AXIS_DISTANCE_Y = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB209); + public static final int TAG_AXIS_DISTANCE_Z = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB20A); + public static final int TAG_YAW_ANGLE = ExifInterface.defineTag(MpoIfdData.TYPE_MP_ATTRIB_IFD, + (short) 0xB20B); + public static final int TAG_PITCH_ANGLE = ExifInterface.defineTag( + MpoIfdData.TYPE_MP_ATTRIB_IFD, (short) 0xB20C); + public static final int TAG_ROLL_ANGLE = ExifInterface.defineTag(MpoIfdData.TYPE_MP_ATTRIB_IFD, + (short) 0xB20D); + + public static int writeMpo(MpoData mpo, OutputStream out) { + if (mpo == null || out == null) + throw new IllegalArgumentException(NULL_ARGUMENT_STRING); + + MpoOutputStream s = getMpoWriterStream(out); + s.setMpoData(mpo); + + // check and write mpo file + try { + s.writeMpoFile(); + } catch (IOException e) { + CameraUtil.closeSilently(s); + Log.w(TAG, "IO Exception when writing mpo image"); + return -1; + } + + // close stream + CameraUtil.closeSilently(s); + return s.size(); + } + + public static int writeMpo(MpoData mpo, String outFilename) { + if (mpo == null || outFilename == null) + throw new IllegalArgumentException(NULL_ARGUMENT_STRING); + + return writeMpo(mpo, getFileWriterStream(outFilename)); + } + + /** + * Wraps an OutputStream object with an MpoOutputStream. + * + * @param outStream + * an OutputStream to wrap. + * @return an MpoOutputStream that wraps the outStream parameter, and adds + * mpo metadata. A jpeg image should be written to this stream. + */ + private static MpoOutputStream getMpoWriterStream(OutputStream outStream) { + if (outStream == null) { + throw new IllegalArgumentException(NULL_ARGUMENT_STRING); + } + MpoOutputStream mos = new MpoOutputStream(outStream); + return mos; + } + + /** + * Returns an FileOutputStream object that writes to a file. + * + * @param outFileName + * an String containing a filepath for a file. + * @return an FileOutputStream that writes to the outFileName file. + * @throws FileNotFoundException + */ + private static OutputStream getFileWriterStream(String outFileName) { + if (outFileName == null) { + throw new IllegalArgumentException(NULL_ARGUMENT_STRING); + } + OutputStream out = null; + try { + out = new FileOutputStream(outFileName); + } catch (FileNotFoundException e) { + CameraUtil.closeSilently(out); + Log.w(TAG, "File not found"); + } + return out; + } +} |