| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // The contents of this file are subject to the Mozilla Public License |
| // Version 1.1 (the "License"); you may not use this file except in |
| // compliance with the License. You may obtain a copy of the License at |
| // http://www.mozilla.org/MPL/ |
| // |
| // Software distributed under the License is distributed on an "AS IS" |
| // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
| // License for the specific language governing rights and limitations |
| // under the License. |
| // |
| // The Original Code is MP4v2. |
| // |
| // The Initial Developer of the Original Code is Kona Blend. |
| // Portions created by Kona Blend are Copyright (C) 2008. |
| // All Rights Reserved. |
| // |
| // Contributors: |
| // Kona Blend, kona8lend@@gmail.com |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /* 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; |
| } |