12523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan/* 22523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Copyright (C) 2012 The Android Open Source Project 32523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * 42523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License"); 52523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * you may not use this file except in compliance with the License. 62523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * You may obtain a copy of the License at 72523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * 82523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * http://www.apache.org/licenses/LICENSE-2.0 92523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * 102523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Unless required by applicable law or agreed to in writing, software 112523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS, 122523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * See the License for the specific language governing permissions and 142523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * limitations under the License. 152523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 162523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 17a16e7b50f3148f581439509279f242092e254309ztenghuipackage com.android.camera.exif; 182523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 192523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyanimport java.util.HashMap; 202523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyanimport java.util.Map; 212523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 222523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan/** 232523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * This class stores all the tags in an IFD. 242523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * 252523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see ExifData 262523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see ExifTag 272523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 282523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyanclass IfdData { 292523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 302523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan private final int mIfdId; 312523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan private final Map<Short, ExifTag> mExifTags = new HashMap<Short, ExifTag>(); 322523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan private int mOffsetToNextIfd = 0; 33c274ded801f745d6318186958107622e7a4fef33Ruben Brunk private static final int[] sIfds = { 34c274ded801f745d6318186958107622e7a4fef33Ruben Brunk IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_1, IfdId.TYPE_IFD_EXIF, 35c274ded801f745d6318186958107622e7a4fef33Ruben Brunk IfdId.TYPE_IFD_INTEROPERABILITY, IfdId.TYPE_IFD_GPS 36c274ded801f745d6318186958107622e7a4fef33Ruben Brunk }; 372523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 382523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Creates an IfdData with given IFD ID. 392523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * 402523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_0 412523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_1 422523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_EXIF 432523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_GPS 442523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_INTEROPERABILITY 452523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 46c274ded801f745d6318186958107622e7a4fef33Ruben Brunk IfdData(int ifdId) { 472523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan mIfdId = ifdId; 482523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 492523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 50c274ded801f745d6318186958107622e7a4fef33Ruben Brunk static protected int[] getIfds() { 51c274ded801f745d6318186958107622e7a4fef33Ruben Brunk return sIfds; 52c274ded801f745d6318186958107622e7a4fef33Ruben Brunk } 53c274ded801f745d6318186958107622e7a4fef33Ruben Brunk 542523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 552523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Get a array the contains all {@link ExifTag} in this IFD. 562523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 57c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected ExifTag[] getAllTags() { 582523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return mExifTags.values().toArray(new ExifTag[mExifTags.size()]); 592523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 602523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 612523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 622523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Gets the ID of this IFD. 632523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * 642523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_0 652523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_1 662523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_EXIF 672523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_GPS 682523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * @see IfdId#TYPE_IFD_INTEROPERABILITY 692523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 70c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected int getId() { 712523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return mIfdId; 722523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 732523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 742523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 75c274ded801f745d6318186958107622e7a4fef33Ruben Brunk * Gets the {@link ExifTag} with given tag id. Return null if there is no 76c274ded801f745d6318186958107622e7a4fef33Ruben Brunk * such tag. 772523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 78c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected ExifTag getTag(short tagId) { 792523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return mExifTags.get(tagId); 802523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 812523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 822523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 832523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Adds or replaces a {@link ExifTag}. 842523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 85c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected ExifTag setTag(ExifTag tag) { 86c274ded801f745d6318186958107622e7a4fef33Ruben Brunk tag.setIfd(mIfdId); 87c274ded801f745d6318186958107622e7a4fef33Ruben Brunk return mExifTags.put(tag.getTagId(), tag); 88c274ded801f745d6318186958107622e7a4fef33Ruben Brunk } 89c274ded801f745d6318186958107622e7a4fef33Ruben Brunk 90c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected boolean checkCollision(short tagId) { 91c274ded801f745d6318186958107622e7a4fef33Ruben Brunk return mExifTags.get(tagId) != null; 922523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 932523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 942523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 95c06c8045b159d68f8fda051d59a0eb82215067eeEarl Ou * Removes the tag of the given ID 96c06c8045b159d68f8fda051d59a0eb82215067eeEarl Ou */ 97c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected void removeTag(short tagId) { 98c06c8045b159d68f8fda051d59a0eb82215067eeEarl Ou mExifTags.remove(tagId); 99c06c8045b159d68f8fda051d59a0eb82215067eeEarl Ou } 100c06c8045b159d68f8fda051d59a0eb82215067eeEarl Ou 101c06c8045b159d68f8fda051d59a0eb82215067eeEarl Ou /** 1022523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Gets the tags count in the IFD. 1032523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 104c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected int getTagCount() { 1052523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return mExifTags.size(); 1062523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 1072523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 1082523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 1092523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Sets the offset of next IFD. 1102523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 111c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected void setOffsetToNextIfd(int offset) { 1122523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan mOffsetToNextIfd = offset; 1132523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 1142523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 1152523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 1162523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Gets the offset of next IFD. 1172523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 118c274ded801f745d6318186958107622e7a4fef33Ruben Brunk protected int getOffsetToNextIfd() { 1192523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return mOffsetToNextIfd; 1202523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 1212523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan 1222523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan /** 123c274ded801f745d6318186958107622e7a4fef33Ruben Brunk * Returns true if all tags in this two IFDs are equal. Note that tags of 124c274ded801f745d6318186958107622e7a4fef33Ruben Brunk * IFDs offset or thumbnail offset will be ignored. 1252523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */ 1262523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan @Override 1272523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan public boolean equals(Object obj) { 128c274ded801f745d6318186958107622e7a4fef33Ruben Brunk if (this == obj) { 129c274ded801f745d6318186958107622e7a4fef33Ruben Brunk return true; 130c274ded801f745d6318186958107622e7a4fef33Ruben Brunk } 131c274ded801f745d6318186958107622e7a4fef33Ruben Brunk if (obj == null) { 132c274ded801f745d6318186958107622e7a4fef33Ruben Brunk return false; 133c274ded801f745d6318186958107622e7a4fef33Ruben Brunk } 1342523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan if (obj instanceof IfdData) { 1352523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan IfdData data = (IfdData) obj; 1362523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan if (data.getId() == mIfdId && data.getTagCount() == getTagCount()) { 1372523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan ExifTag[] tags = data.getAllTags(); 138c274ded801f745d6318186958107622e7a4fef33Ruben Brunk for (ExifTag tag : tags) { 139c274ded801f745d6318186958107622e7a4fef33Ruben Brunk if (ExifInterface.isOffsetTag(tag.getTagId())) { 140c274ded801f745d6318186958107622e7a4fef33Ruben Brunk continue; 141c274ded801f745d6318186958107622e7a4fef33Ruben Brunk } 1422523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan ExifTag tag2 = mExifTags.get(tag.getTagId()); 143c274ded801f745d6318186958107622e7a4fef33Ruben Brunk if (!tag.equals(tag2)) { 144c274ded801f745d6318186958107622e7a4fef33Ruben Brunk return false; 145c274ded801f745d6318186958107622e7a4fef33Ruben Brunk } 1462523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 1472523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return true; 1482523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 1492523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 1502523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan return false; 1512523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan } 152c274ded801f745d6318186958107622e7a4fef33Ruben Brunk} 153