| /* This is an example of iTMF Generic API. |
| * WARNING: this program will change/destroy certain tags in an mp4 file. |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include <mp4v2/mp4v2.h> |
| |
| int main( int argc, char** argv ) |
| { |
| if( argc != 2 ) { |
| printf( "usage: %s file.mp4\n", argv[0] ); |
| return 1; |
| } |
| |
| /* open file for modification */ |
| MP4FileHandle file = MP4Modify( argv[1], MP4_DETAILS_ERROR, 0 ); |
| if( file == MP4_INVALID_FILE_HANDLE ) { |
| printf( "MP4Modify failed\n" ); |
| return 1; |
| } |
| |
| /* show existing iTMF items */ |
| MP4ItmfItemList* list = MP4ItmfGetItems( file ); |
| printf( "list=%p\n", list ); |
| if( list ) { |
| printf( "list size=%u\n", list->size ); |
| uint32_t i; |
| for( i = 0; i < list->size; i++ ) { |
| MP4ItmfItem* item = &list->elements[i]; |
| printf( "item[%u] type=%s\n", i, item->code ); |
| |
| if( item->mean ) |
| printf( " mean=%s\n", item->mean ); |
| if( item->name ) |
| printf( " name=%s\n", item->name ); |
| |
| int j; |
| for( j = 0; j < item->dataList.size; j++ ) { |
| MP4ItmfData* data = &item->dataList.elements[j]; |
| printf( " data[%u] typeCode=%u valueSize=%u\n", j, data->typeCode, data->valueSize ); |
| } |
| } |
| |
| /* caller responsiblity to free */ |
| MP4ItmfItemListFree( list ); |
| } |
| |
| /* add bogus item to file */ |
| { |
| /* allocate item with 1 data element */ |
| MP4ItmfItem* bogus = MP4ItmfItemAlloc( "bogu", 1 ); |
| |
| const char* const hello = "hello one"; |
| |
| MP4ItmfData* data = &bogus->dataList.elements[0]; |
| data->typeCode = MP4_ITMF_BT_UTF8; |
| data->valueSize = strlen( hello ); |
| data->value = (uint8_t*)malloc( data->valueSize ); |
| memcpy( data->value, hello, data->valueSize ); |
| |
| /* add to mp4 file */ |
| MP4ItmfAddItem( file, bogus ); |
| |
| /* caller responsibility to free */ |
| MP4ItmfItemFree( bogus ); |
| } |
| |
| /* add bogus item with meaning and name to file */ |
| { |
| /* allocate item with 1 data element */ |
| MP4ItmfItem* bogus = MP4ItmfItemAlloc( "----", 1 ); |
| bogus->mean = strdup( "com.garden.Tomato" ); |
| bogus->name = strdup( "weight" ); |
| |
| const char* const hello = "hello two"; |
| |
| MP4ItmfData* data = &bogus->dataList.elements[0]; |
| data->typeCode = MP4_ITMF_BT_UTF8; |
| data->valueSize = strlen( hello ); |
| data->value = (uint8_t*)malloc( data->valueSize ); |
| memcpy( data->value, hello, data->valueSize ); |
| |
| /* add to mp4 file */ |
| MP4ItmfAddItem( file, bogus ); |
| |
| /* caller responsibility to free */ |
| MP4ItmfItemFree( bogus ); |
| } |
| |
| /* free memory associated with structure and close */ |
| MP4Close( file ); |
| |
| return 0; |
| } |