Skip to content

Commit

Permalink
add interfaces to hide an item
Browse files Browse the repository at this point in the history
  • Loading branch information
podborski committed Feb 21, 2024
1 parent 7539781 commit a02f75d
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 0 deletions.
61 changes: 61 additions & 0 deletions IsoLib/libisomediafile/src/ISOMeta.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 11 additions & 0 deletions IsoLib/libisomediafile/src/ISOMovies.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 ‘.
Expand Down
10 changes: 10 additions & 0 deletions test/test_metadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit a02f75d

Please sign in to comment.