From a02f75de3ed7bbe761e00ad00d9d17d6bd200fd3 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 10:32:57 -0800 Subject: [PATCH] add interfaces to hide an item --- IsoLib/libisomediafile/src/ISOMeta.c | 61 ++++++++++++++++++++++++++ IsoLib/libisomediafile/src/ISOMovies.h | 11 +++++ test/test_metadata.cpp | 10 +++++ 3 files changed, 82 insertions(+) diff --git a/IsoLib/libisomediafile/src/ISOMeta.c b/IsoLib/libisomediafile/src/ISOMeta.c index 2d2b919..8e73c57 100644 --- a/IsoLib/libisomediafile/src/ISOMeta.c +++ b/IsoLib/libisomediafile/src/ISOMeta.c @@ -1176,6 +1176,67 @@ ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char return err; } +ISO_EXTERN(ISOErr) ISOHideItem(ISOMetaItem item) +{ + MP4Err err; + ISOMetaAtomPtr myMeta; + MetaItemLocationPtr myItem; + ISOItemInfoAtomPtr iinf; + ISOPrimaryItemAtomPtr pitm; + ISOItemInfoEntryAtomPtr infe; + + err = MP4NoErr; + myItem = (MetaItemLocationPtr)item; + myMeta = (ISOMetaAtomPtr)myItem->meta; + iinf = (ISOItemInfoAtomPtr)myMeta->iinf; + pitm = (ISOPrimaryItemAtomPtr)myMeta->pitm; + + if(!iinf) BAILWITHERROR(MP4InvalidMediaErr); + + if(pitm->item_ID == myItem->item_ID) BAILWITHERROR(MP4InvalidMediaErr); + + infe = NULL; + err = iinf->getEntry(iinf, myItem->item_ID, &infe); + if(err) goto bail; + + if(infe == NULL) BAILWITHERROR(MP4InvalidMediaErr); + + infe->flags |= 1U; + +bail: + TEST_RETURN(err); + return err; +} + +ISO_EXTERN(ISOErr) ISOIsItemHidden(ISOMetaItem item) +{ + MP4Err err; + ISOMetaAtomPtr myMeta; + MetaItemLocationPtr myItem; + ISOItemInfoAtomPtr iinf; + ISOItemInfoEntryAtomPtr infe; + + err = MP4NoErr; + myItem = (MetaItemLocationPtr)item; + myMeta = (ISOMetaAtomPtr)myItem->meta; + iinf = (ISOItemInfoAtomPtr)myMeta->iinf; + + if(!iinf) BAILWITHERROR(MP4InvalidMediaErr); + + infe = NULL; + err = iinf->getEntry(iinf, myItem->item_ID, &infe); + if(err) goto bail; + + if(infe == NULL) BAILWITHERROR(MP4InvalidMediaErr); + + err = MP4NotFoundErr; + if(infe->flags & 1U) err = MP4NoErr; + +bail: + TEST_RETURN(err); + return err; +} + ISO_EXTERN(ISOErr) ISOGetItemInfoItemType(ISOMetaItem item, u32 *item_type, char **item_uri_type) { MP4Err err; diff --git a/IsoLib/libisomediafile/src/ISOMovies.h b/IsoLib/libisomediafile/src/ISOMovies.h index a393a57..54896db 100644 --- a/IsoLib/libisomediafile/src/ISOMovies.h +++ b/IsoLib/libisomediafile/src/ISOMovies.h @@ -1101,6 +1101,17 @@ extern "C" * @param item_uri_type can be NULL, if the item_type is not ‘uri ‘ */ ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char *item_uri_type); + /** + * @brief Hide item by setting the (flags & 1) = 1 + * @param item Item to hide + */ + ISO_EXTERN(ISOErr) ISOHideItem(ISOMetaItem item); + /** + * @brief Check if item is hiden + * @param item Item to check + * @return MP4NoErr if item is hidden, MP4NotFoundErr if not, MP4InvalidMediaErr otherwise + */ + ISO_EXTERN(ISOErr) ISOIsItemHidden(ISOMetaItem item); /** * @brief Gets an item info item type from an existing item info entry. * @param item_uri_type could be NULL, if the item_type is not ‘uri ‘. diff --git a/test/test_metadata.cpp b/test/test_metadata.cpp index 4655125..69950fa 100644 --- a/test/test_metadata.cpp +++ b/test/test_metadata.cpp @@ -251,6 +251,10 @@ TEST_CASE("metadata") err = ISOSetPrimaryItem(meta, item1); CHECK(err == MP4NoErr); + // it is not allowed to hide a primary item + err = ISOHideItem(item1); + CHECK(err == MP4InvalidMediaErr); + // item 2 ISOAddMetaItem(meta, &item2, 0, 0); err = ISOAddItemExtentUsingItemData(item2, itemDataHandle2); @@ -259,6 +263,8 @@ TEST_CASE("metadata") CHECK(err == MP4NoErr); err = ISOSetItemInfoItemType(item2, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), NULL); CHECK(err == MP4NoErr); + err = ISOHideItem(item2); + CHECK(err == MP4NoErr); // item 3 ISOAddMetaItem(meta, &item3, 0, 0); @@ -316,6 +322,8 @@ TEST_CASE("metadata") memcpy(*propHandle, prop->data, prop->dataSize); err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC)); CHECK(err == MP4NoErr); + err = ISOIsItemHidden(item1); + CHECK(err == MP4NotFoundErr); // check second item err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), &items, &cnt); @@ -330,6 +338,8 @@ TEST_CASE("metadata") memcpy(*propHandle, prop->data, prop->dataSize); err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC)); CHECK(err == MP4NoErr); + err = ISOIsItemHidden(item2); + CHECK(err == MP4NoErr); // check tirhd item err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('u', 'r', 'i', ' '), &items, &cnt);