Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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. /**
  77.  * Detect ID3v2 Header.
  78.  * @param buf   must be ID3v2_HEADER_SIZE byte long
  79.  * @param magic magic bytes to identify the header.
  80.  * If in doubt, use ID3v2_DEFAULT_MAGIC.
  81.  */
  82. int ff_id3v2_match(const uint8_t *buf, const char *magic);
  83.  
  84. /**
  85.  * Get the length of an ID3v2 tag.
  86.  * @param buf must be ID3v2_HEADER_SIZE bytes long and point to the start of an
  87.  * already detected ID3v2 tag
  88.  */
  89. int ff_id3v2_tag_len(const uint8_t *buf);
  90.  
  91. /**
  92.  * Read an ID3v2 tag, including supported extra metadata
  93.  * @param extra_meta If not NULL, extra metadata is parsed into a list of
  94.  * ID3v2ExtraMeta structs and *extra_meta points to the head of the list
  95.  */
  96. void ff_id3v2_read(AVFormatContext *s, const char *magic, ID3v2ExtraMeta **extra_meta);
  97.  
  98. /**
  99.  * Initialize an ID3v2 tag.
  100.  */
  101. void ff_id3v2_start(ID3v2EncContext *id3, AVIOContext *pb, int id3v2_version,
  102.                     const char *magic);
  103.  
  104. /**
  105.  * Convert and write all global metadata from s into an ID3v2 tag.
  106.  */
  107. int ff_id3v2_write_metadata(AVFormatContext *s, ID3v2EncContext *id3);
  108.  
  109. /**
  110.  * Write an attached picture from pkt into an ID3v2 tag.
  111.  */
  112. int ff_id3v2_write_apic(AVFormatContext *s, ID3v2EncContext *id3, AVPacket *pkt);
  113.  
  114. /**
  115.  * Finalize an opened ID3v2 tag.
  116.  */
  117. void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb);
  118.  
  119. /**
  120.  * Write an ID3v2 tag containing all global metadata from s.
  121.  * @param id3v2_version Subversion of ID3v2; supported values are 3 and 4
  122.  * @param magic magic bytes to identify the header
  123.  * If in doubt, use ID3v2_DEFAULT_MAGIC.
  124.  */
  125. int ff_id3v2_write_simple(struct AVFormatContext *s, int id3v2_version, const char *magic);
  126.  
  127. /**
  128.  * Free memory allocated parsing special (non-text) metadata.
  129.  * @param extra_meta Pointer to a pointer to the head of a ID3v2ExtraMeta list, *extra_meta is set to NULL.
  130.  */
  131. void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta);
  132.  
  133. /**
  134.  * Create a stream for each APIC (attached picture) extracted from the
  135.  * ID3v2 header.
  136.  */
  137. int ff_id3v2_parse_apic(AVFormatContext *s, ID3v2ExtraMeta **extra_meta);
  138.  
  139. extern const AVMetadataConv ff_id3v2_34_metadata_conv[];
  140. extern const AVMetadataConv ff_id3v2_4_metadata_conv[];
  141.  
  142. /**
  143.  * A list of text information frames allowed in both ID3 v2.3 and v2.4
  144.  * http://www.id3.org/id3v2.4.0-frames
  145.  * http://www.id3.org/id3v2.4.0-changes
  146.  */
  147. extern const char ff_id3v2_tags[][4];
  148.  
  149. /**
  150.  * ID3v2.4-only text information frames.
  151.  */
  152. extern const char ff_id3v2_4_tags[][4];
  153.  
  154. /**
  155.  * ID3v2.3-only text information frames.
  156.  */
  157. extern const char ff_id3v2_3_tags[][4];
  158.  
  159. extern const CodecMime ff_id3v2_mime_tags[];
  160.  
  161. extern const char *ff_id3v2_picture_types[21];
  162.  
  163. #endif /* AVFORMAT_ID3V2_H */
  164.