Skip to content

Commit a02f75d

Browse files
committed
add interfaces to hide an item
1 parent 7539781 commit a02f75d

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

IsoLib/libisomediafile/src/ISOMeta.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,67 @@ ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char
11761176
return err;
11771177
}
11781178

1179+
ISO_EXTERN(ISOErr) ISOHideItem(ISOMetaItem item)
1180+
{
1181+
MP4Err err;
1182+
ISOMetaAtomPtr myMeta;
1183+
MetaItemLocationPtr myItem;
1184+
ISOItemInfoAtomPtr iinf;
1185+
ISOPrimaryItemAtomPtr pitm;
1186+
ISOItemInfoEntryAtomPtr infe;
1187+
1188+
err = MP4NoErr;
1189+
myItem = (MetaItemLocationPtr)item;
1190+
myMeta = (ISOMetaAtomPtr)myItem->meta;
1191+
iinf = (ISOItemInfoAtomPtr)myMeta->iinf;
1192+
pitm = (ISOPrimaryItemAtomPtr)myMeta->pitm;
1193+
1194+
if(!iinf) BAILWITHERROR(MP4InvalidMediaErr);
1195+
1196+
if(pitm->item_ID == myItem->item_ID) BAILWITHERROR(MP4InvalidMediaErr);
1197+
1198+
infe = NULL;
1199+
err = iinf->getEntry(iinf, myItem->item_ID, &infe);
1200+
if(err) goto bail;
1201+
1202+
if(infe == NULL) BAILWITHERROR(MP4InvalidMediaErr);
1203+
1204+
infe->flags |= 1U;
1205+
1206+
bail:
1207+
TEST_RETURN(err);
1208+
return err;
1209+
}
1210+
1211+
ISO_EXTERN(ISOErr) ISOIsItemHidden(ISOMetaItem item)
1212+
{
1213+
MP4Err err;
1214+
ISOMetaAtomPtr myMeta;
1215+
MetaItemLocationPtr myItem;
1216+
ISOItemInfoAtomPtr iinf;
1217+
ISOItemInfoEntryAtomPtr infe;
1218+
1219+
err = MP4NoErr;
1220+
myItem = (MetaItemLocationPtr)item;
1221+
myMeta = (ISOMetaAtomPtr)myItem->meta;
1222+
iinf = (ISOItemInfoAtomPtr)myMeta->iinf;
1223+
1224+
if(!iinf) BAILWITHERROR(MP4InvalidMediaErr);
1225+
1226+
infe = NULL;
1227+
err = iinf->getEntry(iinf, myItem->item_ID, &infe);
1228+
if(err) goto bail;
1229+
1230+
if(infe == NULL) BAILWITHERROR(MP4InvalidMediaErr);
1231+
1232+
err = MP4NotFoundErr;
1233+
if(infe->flags & 1U) err = MP4NoErr;
1234+
1235+
bail:
1236+
TEST_RETURN(err);
1237+
return err;
1238+
}
1239+
11791240
ISO_EXTERN(ISOErr) ISOGetItemInfoItemType(ISOMetaItem item, u32 *item_type, char **item_uri_type)
11801241
{
11811242
MP4Err err;

IsoLib/libisomediafile/src/ISOMovies.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,17 @@ extern "C"
11011101
* @param item_uri_type can be NULL, if the item_type is not ‘uri ‘
11021102
*/
11031103
ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char *item_uri_type);
1104+
/**
1105+
* @brief Hide item by setting the (flags & 1) = 1
1106+
* @param item Item to hide
1107+
*/
1108+
ISO_EXTERN(ISOErr) ISOHideItem(ISOMetaItem item);
1109+
/**
1110+
* @brief Check if item is hiden
1111+
* @param item Item to check
1112+
* @return MP4NoErr if item is hidden, MP4NotFoundErr if not, MP4InvalidMediaErr otherwise
1113+
*/
1114+
ISO_EXTERN(ISOErr) ISOIsItemHidden(ISOMetaItem item);
11041115
/**
11051116
* @brief Gets an item info item type from an existing item info entry.
11061117
* @param item_uri_type could be NULL, if the item_type is not ‘uri ‘.

test/test_metadata.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ TEST_CASE("metadata")
251251
err = ISOSetPrimaryItem(meta, item1);
252252
CHECK(err == MP4NoErr);
253253

254+
// it is not allowed to hide a primary item
255+
err = ISOHideItem(item1);
256+
CHECK(err == MP4InvalidMediaErr);
257+
254258
// item 2
255259
ISOAddMetaItem(meta, &item2, 0, 0);
256260
err = ISOAddItemExtentUsingItemData(item2, itemDataHandle2);
@@ -259,6 +263,8 @@ TEST_CASE("metadata")
259263
CHECK(err == MP4NoErr);
260264
err = ISOSetItemInfoItemType(item2, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), NULL);
261265
CHECK(err == MP4NoErr);
266+
err = ISOHideItem(item2);
267+
CHECK(err == MP4NoErr);
262268

263269
// item 3
264270
ISOAddMetaItem(meta, &item3, 0, 0);
@@ -316,6 +322,8 @@ TEST_CASE("metadata")
316322
memcpy(*propHandle, prop->data, prop->dataSize);
317323
err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC));
318324
CHECK(err == MP4NoErr);
325+
err = ISOIsItemHidden(item1);
326+
CHECK(err == MP4NotFoundErr);
319327

320328
// check second item
321329
err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), &items, &cnt);
@@ -330,6 +338,8 @@ TEST_CASE("metadata")
330338
memcpy(*propHandle, prop->data, prop->dataSize);
331339
err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC));
332340
CHECK(err == MP4NoErr);
341+
err = ISOIsItemHidden(item2);
342+
CHECK(err == MP4NoErr);
333343

334344
// check tirhd item
335345
err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('u', 'r', 'i', ' '), &items, &cnt);

0 commit comments

Comments
 (0)