1321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou/* 2321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * Copyright (C) 2012 The Android Open Source Project 3321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * 4321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * Licensed under the Apache License, Version 2.0 (the "License"); 5321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * you may not use this file except in compliance with the License. 6321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * You may obtain a copy of the License at 7321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * 8321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * http://www.apache.org/licenses/LICENSE-2.0 9321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * 10321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * Unless required by applicable law or agreed to in writing, software 11321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * distributed under the License is distributed on an "AS IS" BASIS, 12321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * See the License for the specific language governing permissions and 14321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou * limitations under the License. 15321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou */ 16321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou 17321e7c477a66df696b92d1617a33f6bafab7886dEarl Oupackage com.android.gallery3d.exif; 18321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou 1986ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ouimport android.util.Log; 2086ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou 21321e7c477a66df696b92d1617a33f6bafab7886dEarl Ouimport java.io.IOException; 22321e7c477a66df696b92d1617a33f6bafab7886dEarl Ouimport java.io.InputStream; 23321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou 244ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou/** 256e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * This class reads the EXIF header of a JPEG file and stores it in 266e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * {@link ExifData}. 274ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou */ 286e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunkclass ExifReader { 2986ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou private static final String TAG = "ExifReader"; 306e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk 316e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk private final ExifInterface mInterface; 326e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk 336e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk ExifReader(ExifInterface iRef) { 346e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk mInterface = iRef; 356e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk } 366e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk 374ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou /** 386e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * Parses the inputStream and and returns the EXIF data in an 396e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * {@link ExifData}. 406e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * 414ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou * @throws ExifInvalidFormatException 424ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou * @throws IOException 434ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou */ 446e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk protected ExifData read(InputStream inputStream) throws ExifInvalidFormatException, 45321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou IOException { 466e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk ExifParser parser = ExifParser.parse(inputStream, mInterface); 477973bc292dcacaa5e68eecaff533d19b5cffc1e8Earl Ou ExifData exifData = new ExifData(parser.getByteOrder()); 486e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk ExifTag tag = null; 49321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou 504ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou int event = parser.next(); 514ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou while (event != ExifParser.EVENT_END) { 524ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou switch (event) { 534ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou case ExifParser.EVENT_START_OF_IFD: 544ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou exifData.addIfdData(new IfdData(parser.getCurrentIfd())); 554ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou break; 564ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou case ExifParser.EVENT_NEW_TAG: 576e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk tag = parser.getTag(); 584ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou if (!tag.hasValue()) { 594ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou parser.registerForTagValue(tag); 60321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou } else { 614ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou exifData.getIfdData(tag.getIfd()).setTag(tag); 62321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou } 63321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou break; 644ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou case ExifParser.EVENT_VALUE_OF_REGISTERED_TAG: 654ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou tag = parser.getTag(); 664ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou if (tag.getDataType() == ExifTag.TYPE_UNDEFINED) { 6786ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou parser.readFullTagValue(tag); 68321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou } 694ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou exifData.getIfdData(tag.getIfd()).setTag(tag); 70321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou break; 71d83a3749f50a8b493a12dfc96aaa0da2f9a6d08bEarl Ou case ExifParser.EVENT_COMPRESSED_IMAGE: 72d83a3749f50a8b493a12dfc96aaa0da2f9a6d08bEarl Ou byte buf[] = new byte[parser.getCompressedImageSize()]; 7386ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou if (buf.length == parser.read(buf)) { 7486ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou exifData.setCompressedThumbnail(buf); 7586ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou } else { 7686ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou Log.w(TAG, "Failed to read the compressed thumbnail"); 7786ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou } 78d83a3749f50a8b493a12dfc96aaa0da2f9a6d08bEarl Ou break; 79d83a3749f50a8b493a12dfc96aaa0da2f9a6d08bEarl Ou case ExifParser.EVENT_UNCOMPRESSED_STRIP: 80d83a3749f50a8b493a12dfc96aaa0da2f9a6d08bEarl Ou buf = new byte[parser.getStripSize()]; 8186ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou if (buf.length == parser.read(buf)) { 8286ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou exifData.setStripBytes(parser.getStripIndex(), buf); 836e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk } else { 8486ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou Log.w(TAG, "Failed to read the strip bytes"); 8586ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou } 86d83a3749f50a8b493a12dfc96aaa0da2f9a6d08bEarl Ou break; 87321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou } 884ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou event = parser.next(); 89321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou } 904ae9b211fee74f801f003bc9ad716e214de1a4f0Earl Ou return exifData; 91321e7c477a66df696b92d1617a33f6bafab7886dEarl Ou } 9286ad9b7a1fa1e31cbb07d972d581386bc2b13a59Earl Ou} 93