mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-06 15:49:50 +08:00
id3v2: add support for non-text and GEOB type tag frames
This extends the ID3v2 parser to allow for reading of non-text (i.e. other than T***) meta tag frames providing a ff_id3v2_read_all() function. An additional data structure 'ID3v2ExtraMeta' is introduced for these tags since AVDictionary is string oriented and unsuitable for binary data. A parser for tag frames of type GEOB is implemented, which is needed to extract keyring information from encrypted OMA files. GEOB data is parsed into 'ID3v2ExtraMetaGEOB' data structures. The routine to decode characters from different encodings to UTF-8, formerly part of the read_ttag() function, is moved to its own function. Because some tag frames contain subparts of unknown length, the function is now also able to read until a null character is found. In addition, the function now takes care of allocating a buffer long enough to hold the decoded characters. Signed-off-by: David Goldwich <david.goldwich@gmail.com> Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:

committed by
Anton Khirnov

parent
b3e144a7df
commit
7a019dffe5
@ -45,6 +45,27 @@ enum ID3v2Encoding {
|
||||
ID3v2_ENCODING_UTF8 = 3,
|
||||
};
|
||||
|
||||
typedef struct ID3v2ExtraMeta {
|
||||
const char *tag;
|
||||
void *data;
|
||||
struct ID3v2ExtraMeta *next;
|
||||
} ID3v2ExtraMeta;
|
||||
|
||||
typedef struct ID3v2ExtraMetaGEOB {
|
||||
uint32_t datasize;
|
||||
uint8_t *mime_type;
|
||||
uint8_t *file_name;
|
||||
uint8_t *description;
|
||||
uint8_t *data;
|
||||
} ID3v2ExtraMetaGEOB;
|
||||
|
||||
typedef struct ID3v2EMFunc {
|
||||
const char *tag3;
|
||||
const char *tag4;
|
||||
void (*read)(AVFormatContext*, AVIOContext*, int, char*, ID3v2ExtraMeta **);
|
||||
void (*free)();
|
||||
} ID3v2EMFunc;
|
||||
|
||||
/**
|
||||
* Detect ID3v2 Header.
|
||||
* @param buf must be ID3v2_HEADER_SIZE byte long
|
||||
@ -61,10 +82,25 @@ int ff_id3v2_match(const uint8_t *buf, const char *magic);
|
||||
int ff_id3v2_tag_len(const uint8_t *buf);
|
||||
|
||||
/**
|
||||
* Read an ID3v2 tag
|
||||
* Read an ID3v2 tag (text tags only)
|
||||
*/
|
||||
void ff_id3v2_read(AVFormatContext *s, const char *magic);
|
||||
|
||||
/**
|
||||
* Read an ID3v2 tag, including supported extra metadata (currently only GEOB)
|
||||
* @param extra_meta If not NULL, extra metadata is parsed into a list of
|
||||
* ID3v2ExtraMeta structs and *extra_meta points to the head of the list
|
||||
*/
|
||||
void ff_id3v2_read_all(AVFormatContext *s, const char *magic, ID3v2ExtraMeta **extra_meta);
|
||||
|
||||
/**
|
||||
* Free memory allocated parsing special (non-text) metadata.
|
||||
* @param extra_meta Pointer to a pointer to the head of a ID3v2ExtraMeta list, *extra_meta is set to NULL.
|
||||
*/
|
||||
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta);
|
||||
|
||||
extern const ID3v2EMFunc ff_id3v2_extra_meta_funcs[];
|
||||
|
||||
extern const AVMetadataConv ff_id3v2_34_metadata_conv[];
|
||||
extern const AVMetadataConv ff_id3v2_4_metadata_conv[];
|
||||
extern const AVMetadataConv ff_id3v2_2_metadata_conv[];
|
||||
|
Reference in New Issue
Block a user