blob: b8b6e992814bc53d07a3e84df042d150b9de341b [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
// 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 Tags convenience API.
* WARNING: this program will change/destroy many tags in an mp4 file.
*/
#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;
}
/* allocate */
const MP4Tags* tags = MP4TagsAlloc();
/* fetch data from MP4 file and populate structure */
MP4TagsFetch( tags, file );
/***************************************************************************
* print various tag values
*/
if( tags->name )
printf( "name: %s\n", tags->name );
if( tags->artist )
printf( "artist: %s\n", tags->artist );
if( tags->albumArtist )
printf( "albumArtist: %s\n", tags->albumArtist );
if( tags->album )
printf( "album: %s\n", tags->album );
if( tags->grouping )
printf( "grouping: %s\n", tags->grouping );
if( tags->composer )
printf( "composer: %s\n", tags->composer );
if( tags->comments )
printf( "comments: %s\n", tags->comments );
if( tags->genre )
printf( "genre: %s\n", tags->genre );
if( tags->genreType )
printf( "genreType: %u\n", *tags->genreType );
if( tags->releaseDate )
printf( "releaseDate: %s\n", tags->releaseDate );
if( tags->track )
printf( "track: index=%u total=%u\n", tags->track->index, tags->track->total );
if( tags->disk )
printf( "disk: index=%u total=%u\n", tags->disk->index, tags->disk->total );
if( tags->tempo )
printf( "tempo: %u\n", *tags->tempo );
if( tags->compilation )
printf( "compilation: %u\n", *tags->compilation );
if( tags->tvShow )
printf( "tvShow: %s\n", tags->tvShow );
if( tags->tvNetwork )
printf( "tvNetwork: %s\n", tags->tvNetwork );
if( tags->tvEpisodeID )
printf( "tvEpisodeID: %s\n", tags->tvEpisodeID );
if( tags->tvSeason )
printf( "tvSeason: %u\n", *tags->tvSeason );
if( tags->tvEpisode )
printf( "tvEpisode: %u\n", *tags->tvEpisode );
if( tags->description )
printf( "description: %s\n", tags->description );
if( tags->longDescription )
printf( "longDescription: %s\n", tags->longDescription );
if( tags->lyrics )
printf( "lyrics: %s\n", tags->lyrics );
if( tags->sortName )
printf( "sortName: %s\n", tags->sortName );
if( tags->sortArtist )
printf( "sortArtist: %s\n", tags->sortArtist );
if( tags->sortAlbumArtist )
printf( "sortAlbumArtist: %s\n", tags->sortAlbumArtist );
if( tags->sortAlbum )
printf( "sortAlbum: %s\n", tags->sortAlbum );
if( tags->sortComposer )
printf( "sortComposer: %s\n", tags->sortComposer );
if( tags->sortTVShow )
printf( "sortTVShow: %s\n", tags->sortTVShow );
if( tags->artworkCount ) {
const MP4TagArtwork* art = tags->artwork; /* artwork != NULL when artworkCount > 0 */
uint32_t i;
for( i = 0; i < tags->artworkCount; i++, art++ )
printf( "art[%d]: type=%d size=%u data=%p\n", i, art->type, art->size, art->data );
}
if( tags->copyright )
printf( "copyright: %s\n", tags->copyright );
if( tags->encodingTool )
printf( "encodingTool: %s\n", tags->encodingTool );
if( tags->encodedBy )
printf( "encodedBy: %s\n", tags->encodedBy );
if( tags->purchaseDate )
printf( "purchaseDate: %s\n", tags->purchaseDate );
if( tags->podcast )
printf( "podcast: %u\n", *tags->podcast );
if( tags->keywords )
printf( "keywords: %s\n", tags->keywords );
if( tags->category )
printf( "category: %s\n", tags->category );
if( tags->hdVideo )
printf( "hdVideo: %u\n", *tags->hdVideo );
if( tags->mediaType )
printf( "mediaType: %u\n", *tags->mediaType );
if( tags->contentRating )
printf( "contentRating: %u\n", *tags->contentRating );
if( tags->gapless )
printf( "gapless: %u\n", *tags->gapless );
if( tags->contentID )
printf( "contentID: %u\n", *tags->contentID );
if( tags->artistID )
printf( "artistID: %u\n", *tags->artistID );
if( tags->playlistID )
printf( "playlistID: %llu\n", *tags->playlistID );
if( tags->genreID )
printf( "genreID: %u\n", *tags->genreID );
if( tags->xid )
printf( "xid: %s\n", tags->xid );
if( tags->iTunesAccount )
printf( "iTunesAccount: %s\n", tags->iTunesAccount );
if( tags->iTunesAccountType )
printf( "iTunesAccountType: %u\n", *tags->iTunesAccountType );
if( tags->iTunesCountry )
printf( "iTunesCountry: %u\n", *tags->iTunesCountry );
/**************************************************************************
* modify various tags values
*/
uint8_t n8;
uint16_t n16;
uint32_t n32;
uint64_t n64;
MP4TagTrack dtrack;
dtrack.index = 1;
dtrack.total = 1;
MP4TagDisk ddisk;
ddisk.index = 1;
ddisk.total = 1;
MP4TagsSetName ( tags, "my name" );
MP4TagsSetArtist ( tags, "my artist" );
MP4TagsSetAlbumArtist ( tags, "my albumArtist" );
MP4TagsSetAlbum ( tags, "my album" );
MP4TagsSetGrouping ( tags, "my grouping" );
MP4TagsSetComposer ( tags, "my composer" );
MP4TagsSetComments ( tags, "my comments" );
MP4TagsSetGenre ( tags, "my genre" );
n16 = 5; /* disco */
MP4TagsSetGenreType ( tags, &n16 );
MP4TagsSetReleaseDate ( tags, "my releaseDate" );
MP4TagsSetTrack ( tags, &dtrack );
MP4TagsSetDisk ( tags, &ddisk );
n16 = 60; /* bpm */
MP4TagsSetTempo ( tags, &n16 );
n8 = 0; /* false */
MP4TagsSetCompilation ( tags, &n8 );
MP4TagsSetTVShow ( tags, "my tvShow" );
MP4TagsSetTVNetwork ( tags, "my tvNetwork" );
MP4TagsSetTVEpisodeID ( tags, "my tvEpisodeID" );
n32 = 0;
MP4TagsSetTVSeason ( tags, &n32 );
n32 = 0;
MP4TagsSetTVEpisode ( tags, &n32 );
MP4TagsSetDescription ( tags, "my description" );
MP4TagsSetLongDescription ( tags, "my longDescription" );
MP4TagsSetLyrics ( tags, "my lyrics" );
MP4TagsSetSortName ( tags, "my sortName" );
MP4TagsSetSortArtist ( tags, "my sortArtist" );
MP4TagsSetSortAlbumArtist ( tags, "my sortAlbumArtist" );
MP4TagsSetSortAlbum ( tags, "my sortAlbum" );
MP4TagsSetSortComposer ( tags, "my sortComposer" );
MP4TagsSetSortTVShow ( tags, "my sortTVShow" );
MP4TagsSetCopyright ( tags, "my copyright" );
MP4TagsSetEncodingTool ( tags, "my encodingTool" );
MP4TagsSetEncodedBy ( tags, "my encodedBy" );
MP4TagsSetPurchaseDate ( tags, "my purchaseDate" );
n8 = 0; /* false */
MP4TagsSetPodcast ( tags, &n8 );
MP4TagsSetKeywords ( tags, "my keywords" );
MP4TagsSetCategory ( tags, "my category" );
n8 = 0; /* false */
MP4TagsSetHDVideo ( tags, &n8 ); // false
n8 = 9; /* movie */
MP4TagsSetMediaType ( tags, &n8 ); // movie
n8 = 0; /* none */
MP4TagsSetContentRating ( tags, &n8 ); // none
n8 = 0; /* false */
MP4TagsSetGapless ( tags, &n8 ); // false
MP4TagsSetITunesAccount ( tags, "my iTunesAccount" );
n8 = 0; /* iTunes */
MP4TagsSetITunesAccountType ( tags, &n8 );
n32 = 143441; /* USA */
MP4TagsSetITunesCountry ( tags, &n32 );
n32 = 0;
MP4TagsSetContentID ( tags, &n32 );
n32 = 0;
MP4TagsSetArtistID ( tags, &n32 );
n64 = 0;
MP4TagsSetPlaylistID ( tags, &n64 );
n32 = 0;
MP4TagsSetGenreID ( tags, &n32 );
n32 = 0;
MP4TagsSetComposerID ( tags, &n32 );
MP4TagsSetXID ( tags, "my prefix:my scheme:my identifier" );
/* push data to mp4 file */
MP4TagsStore( tags, file );
/* free memory associated with structure and close */
MP4TagsFree( tags );
MP4Close( file );
return 0;
}