Home | History | Annotate | Download | only in include
      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 DataSource;
     29 class MetaData;
     30 
     31 namespace heif {
     32 
     33 struct AssociationEntry;
     34 struct ImageItem;
     35 struct ItemLoc;
     36 struct ItemInfo;
     37 struct ItemProperty;
     38 struct ItemReference;
     39 
     40 /*
     41  * ItemTable keeps track of all image items (including coded images, grids and
     42  * tiles) inside a HEIF still image (ISO/IEC FDIS 23008-12.2:2017(E)).
     43  */
     44 
     45 class ItemTable : public RefBase {
     46 public:
     47     explicit ItemTable(const sp<DataSource> &source);
     48 
     49     status_t parse(uint32_t type, off64_t offset, size_t size);
     50 
     51     bool isValid() { return mImageItemsValid; }
     52     sp<MetaData> getImageMeta();
     53     uint32_t countImages() const;
     54     status_t findPrimaryImage(uint32_t *imageIndex);
     55     status_t findThumbnail(uint32_t *thumbnailIndex);
     56     status_t getImageOffsetAndSize(
     57             uint32_t *imageIndex, off64_t *offset, size_t *size);
     58 
     59 protected:
     60     ~ItemTable();
     61 
     62 private:
     63     sp<DataSource> mDataSource;
     64 
     65     KeyedVector<uint32_t, ItemLoc> mItemLocs;
     66     Vector<ItemInfo> mItemInfos;
     67     Vector<AssociationEntry> mAssociations;
     68     Vector<sp<ItemProperty> > mItemProperties;
     69     Vector<sp<ItemReference> > mItemReferences;
     70 
     71     uint32_t mPrimaryItemId;
     72     off64_t mIdatOffset;
     73     size_t mIdatSize;
     74 
     75     std::set<uint32_t> mRequiredBoxes;
     76     std::set<uint32_t> mBoxesSeen;
     77 
     78     bool mImageItemsValid;
     79     uint32_t mCurrentImageIndex;
     80     KeyedVector<uint32_t, ImageItem> mItemIdToImageMap;
     81 
     82     status_t parseIlocBox(off64_t offset, size_t size);
     83     status_t parseIinfBox(off64_t offset, size_t size);
     84     status_t parsePitmBox(off64_t offset, size_t size);
     85     status_t parseIprpBox(off64_t offset, size_t size);
     86     status_t parseIdatBox(off64_t offset, size_t size);
     87     status_t parseIrefBox(off64_t offset, size_t size);
     88 
     89     void attachProperty(const AssociationEntry &association);
     90     status_t buildImageItemsIfPossible(uint32_t type);
     91 
     92     DISALLOW_EVIL_CONSTRUCTORS(ItemTable);
     93 };
     94 
     95 } // namespace heif
     96 } // namespace android
     97 
     98 #endif  // ITEM_TABLE_H_
     99