blob: 9bc186c514d3e2d0a43176c0e3ea685b0a5cd607 [file] [log] [blame]
#ifndef MP4V2_ITMF_TAGS_H
#define MP4V2_ITMF_TAGS_H
/**************************************************************************//**
*
* @defgroup mp4_itmf_tags MP4v2 iTMF (iTunes Metadata Format) Tags
* @{
*
*****************************************************************************/
/** Enumeration of possible MP4TagArtwork::type values. */
typedef enum MP4TagArtworkType_e
{
MP4_ART_UNDEFINED = 0,
MP4_ART_BMP = 1,
MP4_ART_GIF = 2,
MP4_ART_JPEG = 3,
MP4_ART_PNG = 4,
} MP4TagArtworkType;
/** Data object representing a single piece of artwork. */
typedef struct MP4TagArtwork_s
{
const void* data; /**< raw picture data */
uint32_t size; /**< data size in bytes */
MP4TagArtworkType type; /**< data type */
} MP4TagArtwork;
typedef struct MP4TagTrack_s
{
uint16_t index;
uint16_t total;
} MP4TagTrack;
typedef struct MP4TagDisk_s
{
uint16_t index;
uint16_t total;
} MP4TagDisk;
/** Tags <b>convenience</b> structure.
*
* This structure is used in the tags convenience API which allows for
* simplified retrieval and modification of the majority of known tags.
*
* This is a read-only structure and each tag is present if and only if the
* pointer is a <b>non-NULL</b> value. The actual data is backed by a hidden
* data cache which is only updated when the appropriate metadata <b>set</b>
* function is used, or if MP4TagsFetch() is invoked. Thus, if other API
* is used to manipulate relevent atom structure of the MP4 file, the user
* is responsible for re-fetching the data in this structure.
*/
typedef struct MP4Tags_s
{
void* __handle; /* internal use only */
const char* name;
const char* artist;
const char* albumArtist;
const char* album;
const char* grouping;
const char* composer;
const char* comments;
const char* genre;
const uint16_t* genreType;
const char* releaseDate;
const MP4TagTrack* track;
const MP4TagDisk* disk;
const uint16_t* tempo;
const uint8_t* compilation;
const char* tvShow;
const char* tvNetwork;
const char* tvEpisodeID;
const uint32_t* tvSeason;
const uint32_t* tvEpisode;
const char* description;
const char* longDescription;
const char* lyrics;
const char* sortName;
const char* sortArtist;
const char* sortAlbumArtist;
const char* sortAlbum;
const char* sortComposer;
const char* sortTVShow;
const MP4TagArtwork* artwork;
uint32_t artworkCount;
const char* copyright;
const char* encodingTool;
const char* encodedBy;
const char* purchaseDate;
const uint8_t* podcast;
const char* keywords; /* TODO: Needs testing */
const char* category;
const uint8_t* hdVideo;
const uint8_t* mediaType;
const uint8_t* contentRating;
const uint8_t* gapless;
const char* iTunesAccount;
const uint8_t* iTunesAccountType;
const uint32_t* iTunesCountry;
const uint32_t* cnID;
const uint32_t* atID;
const uint64_t* plID;
const uint32_t* geID;
} MP4Tags;
/** Allocate tags convenience structure for reading and settings tags.
*
* This function allocates a new structure which represents a snapshot
* of all the tags therein, tracking if the tag is missing,
* or present and with value. It is the caller's responsibility to free
* the structure with MP4TagsFree().
*
* @return structure with all tags missing.
*/
MP4V2_EXPORT
const MP4Tags* MP4TagsAlloc();
/** Fetch data from mp4 file and populate structure.
*
* The tags structure and its hidden data-cache is updated to
* reflect the actual tags values found in the <b>hFile</b>.
*
* @param tags structure to fetch (write) into.
* @param hFile handle of file to fetch data from.
*/
MP4V2_EXPORT
void MP4TagsFetch( const MP4Tags* tags, MP4FileHandle hFile );
/** Store data to mp4 file from structure.
*
* The tags structure is pushed out to the mp4 file,
* adding tags if needed, removing tags if needed, and updating
* the values to modified tags.
*
* @param tags structure to store (read) from.
* @param hFile handle of file to store data to.
*/
MP4V2_EXPORT
void MP4TagsStore( const MP4Tags* tags, MP4FileHandle hFile );
/** Free tags convenience structure.
*
* This function frees memory associated with the structure.
*
* @param tags structure to destroy.
*/
MP4V2_EXPORT
void MP4TagsFree( const MP4Tags* tags );
MP4V2_EXPORT void MP4TagsSetName ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetArtist ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetAlbumArtist ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetAlbum ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetGrouping ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetComposer ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetComments ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetGenre ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetGenreType ( const MP4Tags*, const uint16_t* );
MP4V2_EXPORT void MP4TagsSetReleaseDate ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetTrack ( const MP4Tags*, const MP4TagTrack* );
MP4V2_EXPORT void MP4TagsSetDisk ( const MP4Tags*, const MP4TagDisk* );
MP4V2_EXPORT void MP4TagsSetTempo ( const MP4Tags*, const uint16_t* );
MP4V2_EXPORT void MP4TagsSetCompilation ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetTVShow ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetTVNetwork ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetTVEpisodeID ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetTVSeason ( const MP4Tags*, const uint32_t* );
MP4V2_EXPORT void MP4TagsSetTVEpisode ( const MP4Tags*, const uint32_t* );
MP4V2_EXPORT void MP4TagsSetDescription ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetLongDescription ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetLyrics ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetSortName ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetSortArtist ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetSortAlbumArtist ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetSortAlbum ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetSortComposer ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetSortTVShow ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsAddArtwork ( const MP4Tags*, MP4TagArtwork* );
MP4V2_EXPORT void MP4TagsSetArtwork ( const MP4Tags*, uint32_t, MP4TagArtwork* );
MP4V2_EXPORT void MP4TagsRemoveArtwork ( const MP4Tags*, uint32_t );
MP4V2_EXPORT void MP4TagsSetCopyright ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetEncodingTool ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetEncodedBy ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetPurchaseDate ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetPodcast ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetKeywords ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetCategory ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetHDVideo ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetMediaType ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetContentRating ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetGapless ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetITunesAccount ( const MP4Tags*, const char* );
MP4V2_EXPORT void MP4TagsSetITunesAccountType ( const MP4Tags*, const uint8_t* );
MP4V2_EXPORT void MP4TagsSetITunesCountry ( const MP4Tags*, const uint32_t* );
MP4V2_EXPORT void MP4TagsSetCNID ( const MP4Tags*, const uint32_t* );
MP4V2_EXPORT void MP4TagsSetATID ( const MP4Tags*, const uint32_t* );
MP4V2_EXPORT void MP4TagsSetPLID ( const MP4Tags*, const uint64_t* );
MP4V2_EXPORT void MP4TagsSetGEID ( const MP4Tags*, const uint32_t* );
/** @} ***********************************************************************/
#endif /* MP4V2_ITMF_TAGS_H */