1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ITEM_TABLE_H_ 18 #define ITEM_TABLE_H_ 19 20 #include <set> 21 22 #include <media/stagefright/foundation/ADebug.h> 23 #include <utils/KeyedVector.h> 24 #include <utils/RefBase.h> 25 26 namespace android { 27 28 class DataSourceBase; 29 class MetaData; 30 31 namespace heif { 32 33 struct AssociationEntry; 34 struct ImageItem; 35 struct ExifItem; 36 struct ItemLoc; 37 struct ItemInfo; 38 struct ItemProperty; 39 struct ItemReference; 40 41 /* 42 * ItemTable keeps track of all image items (including coded images, grids and 43 * tiles) inside a HEIF still image (ISO/IEC FDIS 23008-12.2:2017(E)). 44 */ 45 46 class ItemTable : public RefBase { 47 public: 48 explicit ItemTable(DataSourceBase *source); 49 50 status_t parse(uint32_t type, off64_t offset, size_t size); 51 isValid()52 bool isValid() { return mImageItemsValid; } 53 uint32_t countImages() const; 54 sp<MetaData> getImageMeta(const uint32_t imageIndex); 55 status_t findImageItem(const uint32_t imageIndex, uint32_t *itemIndex); 56 status_t findThumbnailItem(const uint32_t imageIndex, uint32_t *itemIndex); 57 status_t getImageOffsetAndSize( 58 uint32_t *itemIndex, off64_t *offset, size_t *size); 59 status_t getExifOffsetAndSize(off64_t *offset, size_t *size); 60 61 protected: 62 ~ItemTable(); 63 64 private: 65 DataSourceBase *mDataSource; 66 67 KeyedVector<uint32_t, ItemLoc> mItemLocs; 68 Vector<ItemInfo> mItemInfos; 69 Vector<AssociationEntry> mAssociations; 70 Vector<sp<ItemProperty> > mItemProperties; 71 Vector<sp<ItemReference> > mItemReferences; 72 73 uint32_t mPrimaryItemId; 74 off64_t mIdatOffset; 75 size_t mIdatSize; 76 77 std::set<uint32_t> mRequiredBoxes; 78 std::set<uint32_t> mBoxesSeen; 79 80 bool mImageItemsValid; 81 uint32_t mCurrentItemIndex; 82 KeyedVector<uint32_t, ImageItem> mItemIdToItemMap; 83 KeyedVector<uint32_t, ExifItem> mItemIdToExifMap; 84 Vector<uint32_t> mDisplayables; 85 86 status_t parseIlocBox(off64_t offset, size_t size); 87 status_t parseIinfBox(off64_t offset, size_t size); 88 status_t parsePitmBox(off64_t offset, size_t size); 89 status_t parseIprpBox(off64_t offset, size_t size); 90 status_t parseIdatBox(off64_t offset, size_t size); 91 status_t parseIrefBox(off64_t offset, size_t size); 92 93 void attachProperty(const AssociationEntry &association); 94 status_t buildImageItemsIfPossible(uint32_t type); 95 96 DISALLOW_EVIL_CONSTRUCTORS(ItemTable); 97 }; 98 99 } // namespace heif 100 } // namespace android 101 102 #endif // ITEM_TABLE_H_ 103