Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * ID3v2 header parser
  3.  * Copyright (c) 2003 Fabrice Bellard
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. #ifndef AVFORMAT_ID3V2_H
  23. #define AVFORMAT_ID3V2_H
  24.  
  25. #include <stdint.h>
  26. #include "avformat.h"
  27. #include "internal.h"
  28. #include "metadata.h"
  29.  
  30. #define ID3v2_HEADER_SIZE 10
  31.  
  32. /**
  33.  * Default magic bytes for ID3v2 header: "ID3"
  34.  */
  35. #define ID3v2_DEFAULT_MAGIC "ID3"
  36.  
  37. #define ID3v2_FLAG_DATALEN     0x0001
  38. #define ID3v2_FLAG_UNSYNCH     0x0002
  39. #define ID3v2_FLAG_ENCRYPTION  0x0004
  40. #define ID3v2_FLAG_COMPRESSION 0x0008
  41.  
  42. enum ID3v2Encoding {
  43.     ID3v2_ENCODING_ISO8859  = 0,
  44.     ID3v2_ENCODING_UTF16BOM = 1,
  45.     ID3v2_ENCODING_UTF16BE  = 2,
  46.     ID3v2_ENCODING_UTF8     = 3,
  47. };
  48.  
  49. typedef struct ID3v2EncContext {
  50.     int      version;       ///< ID3v2 minor version, either 3 or 4
  51.     int64_t size_pos;       ///< offset of the tag total size
  52.     int          len;       ///< size of the tag written so far
  53. } ID3v2EncContext;
  54.  
  55. typedef struct ID3v2ExtraMeta {
  56.     const char *tag;
  57.     void *data;
  58.     struct ID3v2ExtraMeta *next;
  59. } ID3v2ExtraMeta;
  60.  
  61. typedef struct ID3v2ExtraMetaGEOB {
  62.     uint32_t datasize;
  63.     uint8_t *mime_type;
  64.     uint8_t *file_name;
  65.     uint8_t *description;
  66.     uint8_t *data;
  67. } ID3v2ExtraMetaGEOB;
  68.  
  69. typedef struct ID3v2ExtraMetaAPIC {
  70.     AVBufferRef *buf;
  71.     const char  *type;
  72.     uint8_t     *description;
  73.     enum AVCodecID id;
  74. } ID3v2ExtraMetaAPIC;
  75.  
  76. typedef struct ID3v2ExtraMetaPRIV {
  77.     uint8_t *owner;
  78.     uint8_t *data;
  79.     uint32_t datasize;
  80. } ID3v2ExtraMetaPRIV;
  81.  
  82. /**
  83.  * Detect ID3v2 Header.
  84.  * @param buf   must be ID3v2_HEADER_SIZE byte long
  85.  * @param magic magic bytes to identify the header.
  86.  * If in doubt, use ID3v2_DEFAULT_MAGIC.
  87.  */
  88. int ff_id3v2_match(const uint8_t *buf, const char *magic);
  89.  
  90. /**
  91.  * Get the length of an ID3v2 tag.
  92.  * @param buf must be ID3v2_HEADER_SIZE bytes long and point to the start of an
  93.  * already detected ID3v2 tag
  94.  */
  95. int ff_id3v2_tag_len(const uint8_t *buf);
  96.  
  97. /**
  98.  * Read an ID3v2 tag into specified dictionary and retrieve supported extra metadata.
  99.  *
  100.  * Chapters are not currently read by this variant.
  101.  *
  102.  * @param metadata Parsed metadata is stored here
  103.  * @param extra_meta If not NULL, extra metadata is parsed into a list of
  104.  * ID3v2ExtraMeta structs and *extra_meta points to the head of the list
  105.  */
  106. void ff_id3v2_read_dict(AVIOContext *pb, AVDictionary **metadata, const char *magic, ID3v2ExtraMeta **extra_meta);
  107.  
  108. /**
  109.  * Read an ID3v2 tag, including supported extra metadata and chapters.
  110.  *
  111.  * Data is read from and stored to AVFormatContext.
  112.  *
  113.  * @param extra_meta If not NULL, extra metadata is parsed into a list of
  114.  * ID3v2ExtraMeta structs and *extra_meta points to the head of the list
  115.  * @param[opt] max_search_search restrict ID3 magic number search (bytes from start)
  116.  */
  117. void ff_id3v2_read(AVFormatContext *s, const char *magic, ID3v2ExtraMeta **extra_meta,
  118.                    unsigned int max_search_size);
  119.  
  120. /**
  121.  * Initialize an ID3v2 tag.
  122.  */
  123. void ff_id3v2_start(ID3v2EncContext *id3, AVIOContext *pb, int id3v2_version,
  124.                     const char *magic);
  125.  
  126. /**
  127.  * Convert and write all global metadata from s into an ID3v2 tag.
  128.  */
  129. int ff_id3v2_write_metadata(AVFormatContext *s, ID3v2EncContext *id3);
  130.  
  131. /**
  132.  * Write an attached picture from pkt into an ID3v2 tag.
  133.  */
  134. int ff_id3v2_write_apic(AVFormatContext *s, ID3v2EncContext *id3, AVPacket *pkt);
  135.  
  136. /**
  137.  * Finalize an opened ID3v2 tag.
  138.  */
  139. void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb, int padding_bytes);
  140.  
  141. /**
  142.  * Write an ID3v2 tag containing all global metadata from s.
  143.  * @param id3v2_version Subversion of ID3v2; supported values are 3 and 4
  144.  * @param magic magic bytes to identify the header
  145.  * If in doubt, use ID3v2_DEFAULT_MAGIC.
  146.  */
  147. int ff_id3v2_write_simple(struct AVFormatContext *s, int id3v2_version, const char *magic);
  148.  
  149. /**
  150.  * Free memory allocated parsing special (non-text) metadata.
  151.  * @param extra_meta Pointer to a pointer to the head of a ID3v2ExtraMeta list, *extra_meta is set to NULL.
  152.  */
  153. void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta);
  154.  
  155. /**
  156.  * Create a stream for each APIC (attached picture) extracted from the
  157.  * ID3v2 header.
  158.  */
  159. int ff_id3v2_parse_apic(AVFormatContext *s, ID3v2ExtraMeta **extra_meta);
  160.  
  161. extern const AVMetadataConv ff_id3v2_34_metadata_conv[];
  162. extern const AVMetadataConv ff_id3v2_4_metadata_conv[];
  163.  
  164. /**
  165.  * A list of text information frames allowed in both ID3 v2.3 and v2.4
  166.  * http://www.id3.org/id3v2.4.0-frames
  167.  * http://www.id3.org/id3v2.4.0-changes
  168.  */
  169. extern const char ff_id3v2_tags[][4];
  170.  
  171. /**
  172.  * ID3v2.4-only text information frames.
  173.  */
  174. extern const char ff_id3v2_4_tags[][4];
  175.  
  176. /**
  177.  * ID3v2.3-only text information frames.
  178.  */
  179. extern const char ff_id3v2_3_tags[][4];
  180.  
  181. extern const CodecMime ff_id3v2_mime_tags[];
  182.  
  183. extern const char *ff_id3v2_picture_types[21];
  184.  
  185. #endif /* AVFORMAT_ID3V2_H */
  186.