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