FFmpeg
id3v2.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2003 Fabrice Bellard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * ID3v2 header parser
24  *
25  * Specifications available at:
26  * http://id3.org/Developer_Information
27  */
28 
29 #include "config.h"
30 
31 #if CONFIG_ZLIB
32 #include <zlib.h>
33 #endif
34 
35 #include "libavutil/avstring.h"
36 #include "libavutil/bprint.h"
37 #include "libavutil/dict.h"
38 #include "libavutil/intreadwrite.h"
39 #include "libavutil/mem.h"
40 #include "libavcodec/png.h"
41 #include "avio_internal.h"
42 #include "demux.h"
43 #include "id3v1.h"
44 #include "id3v2.h"
45 
47  { "TALB", "album" },
48  { "TCOM", "composer" },
49  { "TCON", "genre" },
50  { "TCOP", "copyright" },
51  { "TENC", "encoded_by" },
52  { "TIT2", "title" },
53  { "TLAN", "language" },
54  { "TPE1", "artist" },
55  { "TPE2", "album_artist" },
56  { "TPE3", "performer" },
57  { "TPOS", "disc" },
58  { "TPUB", "publisher" },
59  { "TRCK", "track" },
60  { "TSSE", "encoder" },
61  { "USLT", "lyrics" },
62  { 0 }
63 };
64 
66  { "TCMP", "compilation" },
67  { "TDRC", "date" },
68  { "TDRL", "date" },
69  { "TDEN", "creation_time" },
70  { "TSOA", "album-sort" },
71  { "TSOP", "artist-sort" },
72  { "TSOT", "title-sort" },
73  { "TIT1", "grouping" },
74  { 0 }
75 };
76 
78  { "TAL", "album" },
79  { "TCO", "genre" },
80  { "TCP", "compilation" },
81  { "TT2", "title" },
82  { "TEN", "encoded_by" },
83  { "TP1", "artist" },
84  { "TP2", "album_artist" },
85  { "TP3", "performer" },
86  { "TRK", "track" },
87  { 0 }
88 };
89 
90 const char ff_id3v2_tags[][4] = {
91  "TALB", "TBPM", "TCOM", "TCON", "TCOP", "TDLY", "TENC", "TEXT",
92  "TFLT", "TIT1", "TIT2", "TIT3", "TKEY", "TLAN", "TLEN", "TMED",
93  "TOAL", "TOFN", "TOLY", "TOPE", "TOWN", "TPE1", "TPE2", "TPE3",
94  "TPE4", "TPOS", "TPUB", "TRCK", "TRSN", "TRSO", "TSRC", "TSSE",
95  { 0 },
96 };
97 
98 const char ff_id3v2_4_tags[][4] = {
99  "TDEN", "TDOR", "TDRC", "TDRL", "TDTG", "TIPL", "TMCL", "TMOO",
100  "TPRO", "TSOA", "TSOP", "TSOT", "TSST",
101  { 0 },
102 };
103 
104 const char ff_id3v2_3_tags[][4] = {
105  "TDAT", "TIME", "TORY", "TRDA", "TSIZ", "TYER",
106  { 0 },
107 };
108 
109 const char * const ff_id3v2_picture_types[21] = {
110  "Other",
111  "32x32 pixels 'file icon'",
112  "Other file icon",
113  "Cover (front)",
114  "Cover (back)",
115  "Leaflet page",
116  "Media (e.g. label side of CD)",
117  "Lead artist/lead performer/soloist",
118  "Artist/performer",
119  "Conductor",
120  "Band/Orchestra",
121  "Composer",
122  "Lyricist/text writer",
123  "Recording Location",
124  "During recording",
125  "During performance",
126  "Movie/video screen capture",
127  "A bright coloured fish",
128  "Illustration",
129  "Band/artist logotype",
130  "Publisher/Studio logotype",
131 };
132 
134  { "image/gif", AV_CODEC_ID_GIF },
135  { "image/jpeg", AV_CODEC_ID_MJPEG },
136  { "image/jpg", AV_CODEC_ID_MJPEG },
137  { "image/png", AV_CODEC_ID_PNG },
138  { "image/tiff", AV_CODEC_ID_TIFF },
139  { "image/bmp", AV_CODEC_ID_BMP },
140  { "image/webp", AV_CODEC_ID_WEBP },
141  { "JPG", AV_CODEC_ID_MJPEG }, /* ID3v2.2 */
142  { "PNG", AV_CODEC_ID_PNG }, /* ID3v2.2 */
143  { "", AV_CODEC_ID_NONE },
144 };
145 
146 int ff_id3v2_match(const uint8_t *buf, const char *magic)
147 {
148  return buf[0] == magic[0] &&
149  buf[1] == magic[1] &&
150  buf[2] == magic[2] &&
151  buf[3] != 0xff &&
152  buf[4] != 0xff &&
153  (buf[6] & 0x80) == 0 &&
154  (buf[7] & 0x80) == 0 &&
155  (buf[8] & 0x80) == 0 &&
156  (buf[9] & 0x80) == 0;
157 }
158 
159 int ff_id3v2_tag_len(const uint8_t *buf)
160 {
161  int len = ((buf[6] & 0x7f) << 21) +
162  ((buf[7] & 0x7f) << 14) +
163  ((buf[8] & 0x7f) << 7) +
164  (buf[9] & 0x7f) +
166  if (buf[5] & 0x10)
168  return len;
169 }
170 
171 static unsigned int get_size(AVIOContext *s, int len)
172 {
173  int v = 0;
174  while (len--)
175  v = (v << 7) + (avio_r8(s) & 0x7F);
176  return v;
177 }
178 
179 static unsigned int size_to_syncsafe(unsigned int size)
180 {
181  return (((size) & (0x7f << 0)) >> 0) +
182  (((size) & (0x7f << 8)) >> 1) +
183  (((size) & (0x7f << 16)) >> 2) +
184  (((size) & (0x7f << 24)) >> 3);
185 }
186 
187 /* No real verification, only check that the tag consists of
188  * a combination of capital alpha-numerical characters */
189 static int is_tag(const char *buf, unsigned int len)
190 {
191  if (!len)
192  return 0;
193 
194  while (len--)
195  if ((buf[len] < 'A' ||
196  buf[len] > 'Z') &&
197  (buf[len] < '0' ||
198  buf[len] > '9'))
199  return 0;
200 
201  return 1;
202 }
203 
204 /**
205  * Return 1 if the tag of length len at the given offset is valid, 0 if not, -1 on error
206  */
207 static int check_tag(AVIOContext *s, int offset, unsigned int len)
208 {
209  char tag[4];
210 
211  if (len > 4 ||
212  avio_seek(s, offset, SEEK_SET) < 0 ||
213  avio_read(s, tag, len) < (int)len)
214  return -1;
215  else if (!AV_RB32(tag) || is_tag(tag, len))
216  return 1;
217 
218  return 0;
219 }
220 
221 /**
222  * Free GEOB type extra metadata.
223  */
224 static void free_geobtag(void *obj)
225 {
226  ID3v2ExtraMetaGEOB *geob = obj;
227  av_freep(&geob->mime_type);
228  av_freep(&geob->file_name);
229  av_freep(&geob->description);
230  av_freep(&geob->data);
231 }
232 
233 /**
234  * Decode characters to UTF-8 according to encoding type. The decoded buffer is
235  * always null terminated. Stop reading when either *maxread bytes are read from
236  * pb or U+0000 character is found.
237  *
238  * @param dst Pointer where the address of the buffer with the decoded bytes is
239  * stored. Buffer must be freed by caller.
240  * @param maxread Pointer to maximum number of characters to read from the
241  * AVIOContext. After execution the value is decremented by the number of bytes
242  * actually read.
243  * @returns 0 if no error occurred, dst is uninitialized on error
244  */
245 static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding,
246  uint8_t **dst, int *maxread)
247 {
248  int ret;
249  uint8_t tmp;
250  uint32_t ch = 1;
251  int left = *maxread, dynsize;
252  unsigned int (*get)(AVIOContext*) = avio_rb16;
253  AVIOContext *dynbuf;
254 
255  if ((ret = avio_open_dyn_buf(&dynbuf)) < 0) {
256  av_log(s, AV_LOG_ERROR, "Error opening memory stream\n");
257  return ret;
258  }
259 
260  switch (encoding) {
262  while (left && ch) {
263  ch = avio_r8(pb);
264  PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);)
265  left--;
266  }
267  break;
268 
270  if ((left -= 2) < 0) {
271  av_log(s, AV_LOG_ERROR, "Cannot read BOM value, input too short\n");
272  ffio_free_dyn_buf(&dynbuf);
273  *dst = NULL;
274  return AVERROR_INVALIDDATA;
275  }
276  switch (avio_rb16(pb)) {
277  case 0xfffe:
278  get = avio_rl16;
279  case 0xfeff:
280  break;
281  default:
282  av_log(s, AV_LOG_ERROR, "Incorrect BOM value\n");
283  ffio_free_dyn_buf(&dynbuf);
284  *dst = NULL;
285  *maxread = left;
286  return AVERROR_INVALIDDATA;
287  }
288  // fall-through
289 
291  while ((left > 1) && ch) {
292  GET_UTF16(ch, ((left -= 2) >= 0 ? get(pb) : 0), break;)
293  PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);)
294  }
295  if (left < 0)
296  left += 2; /* did not read last char from pb */
297  break;
298 
299  case ID3v2_ENCODING_UTF8:
300  while (left && ch) {
301  ch = avio_r8(pb);
302  avio_w8(dynbuf, ch);
303  left--;
304  }
305  break;
306  default:
307  av_log(s, AV_LOG_WARNING, "Unknown encoding\n");
308  }
309 
310  if (ch)
311  avio_w8(dynbuf, 0);
312 
313  dynsize = avio_close_dyn_buf(dynbuf, dst);
314  if (dynsize <= 0) {
315  av_freep(dst);
316  return AVERROR(ENOMEM);
317  }
318  *maxread = left;
319 
320  return 0;
321 }
322 
323 /**
324  * Parse a text tag.
325  */
326 static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen,
327  AVDictionary **metadata, const char *key)
328 {
329  uint8_t *dst;
330  int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL;
331  unsigned genre;
332 
333  if (taglen < 1)
334  return;
335 
336  encoding = avio_r8(pb);
337  taglen--; /* account for encoding type byte */
338 
339  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
340  av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
341  return;
342  }
343 
344  if (!(strcmp(key, "TCON") && strcmp(key, "TCO")) &&
345  (sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) &&
346  genre <= ID3v1_GENRE_MAX) {
347  av_freep(&dst);
348  dst = av_strdup(ff_id3v1_genre_str[genre]);
349  } else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX"))) {
350  /* dst now contains the key, need to get value */
351  key = dst;
352  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
353  av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
354  av_freep(&key);
355  return;
356  }
357  dict_flags |= AV_DICT_DONT_STRDUP_KEY;
358  } else if (!*dst)
359  av_freep(&dst);
360 
361  if (dst)
362  av_dict_set(metadata, key, dst, dict_flags);
363 }
364 
365 static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen,
366  AVDictionary **metadata)
367 {
368  uint8_t lang[4];
369  uint8_t *descriptor = NULL; // 'Content descriptor'
370  uint8_t *text;
371  char *key;
372  int encoding;
373  int ok = 0;
374 
375  if (taglen < 4)
376  goto error;
377 
378  encoding = avio_r8(pb);
379  taglen--;
380 
381  if (avio_read(pb, lang, 3) < 3)
382  goto error;
383  lang[3] = '\0';
384  taglen -= 3;
385 
386  if (decode_str(s, pb, encoding, &descriptor, &taglen) < 0 || taglen < 0)
387  goto error;
388 
389  if (decode_str(s, pb, encoding, &text, &taglen) < 0 || taglen < 0)
390  goto error;
391 
392  // FFmpeg does not support hierarchical metadata, so concatenate the keys.
393  key = av_asprintf("lyrics-%s%s%s", descriptor[0] ? (char *)descriptor : "",
394  descriptor[0] ? "-" : "",
395  lang);
396  if (!key) {
397  av_free(text);
398  goto error;
399  }
400 
401  av_dict_set(metadata, key, text,
403 
404  ok = 1;
405 error:
406  if (!ok)
407  av_log(s, AV_LOG_ERROR, "Error reading lyrics, skipped\n");
408  av_free(descriptor);
409 }
410 
411 /**
412  * Parse a comment tag.
413  */
414 static void read_comment(AVFormatContext *s, AVIOContext *pb, int taglen,
415  AVDictionary **metadata)
416 {
417  const char *key = "comment";
418  uint8_t *dst;
419  int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL;
420  av_unused int language;
421 
422  if (taglen < 4)
423  return;
424 
425  encoding = avio_r8(pb);
426  language = avio_rl24(pb);
427  taglen -= 4;
428 
429  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
430  av_log(s, AV_LOG_ERROR, "Error reading comment frame, skipped\n");
431  return;
432  }
433 
434  if (dst && !*dst)
435  av_freep(&dst);
436 
437  if (dst) {
438  key = (const char *) dst;
439  dict_flags |= AV_DICT_DONT_STRDUP_KEY;
440  }
441 
442  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
443  av_log(s, AV_LOG_ERROR, "Error reading comment frame, skipped\n");
444  if (dict_flags & AV_DICT_DONT_STRDUP_KEY)
445  av_freep((void*)&key);
446  return;
447  }
448 
449  if (dst)
450  av_dict_set(metadata, key, (const char *) dst, dict_flags);
451 }
452 
453 typedef struct ExtraMetaList {
455 } ExtraMetaList;
456 
458 {
459  if (list->tail)
460  list->tail->next = new_elem;
461  else
462  list->head = new_elem;
463  list->tail = new_elem;
464 }
465 
466 /**
467  * Parse GEOB tag into a ID3v2ExtraMetaGEOB struct.
468  */
469 static void read_geobtag(AVFormatContext *s, AVIOContext *pb, int taglen,
470  const char *tag, ExtraMetaList *extra_meta, int isv34)
471 {
472  ID3v2ExtraMetaGEOB *geob_data = NULL;
473  ID3v2ExtraMeta *new_extra = NULL;
474  char encoding;
475  unsigned int len;
476 
477  if (taglen < 1)
478  return;
479 
480  new_extra = av_mallocz(sizeof(ID3v2ExtraMeta));
481  if (!new_extra) {
482  av_log(s, AV_LOG_ERROR, "Failed to alloc %"SIZE_SPECIFIER" bytes\n",
483  sizeof(ID3v2ExtraMeta));
484  return;
485  }
486 
487  geob_data = &new_extra->data.geob;
488 
489  /* read encoding type byte */
490  encoding = avio_r8(pb);
491  taglen--;
492 
493  /* read MIME type (always ISO-8859) */
494  if (decode_str(s, pb, ID3v2_ENCODING_ISO8859, &geob_data->mime_type,
495  &taglen) < 0 ||
496  taglen <= 0)
497  goto fail;
498 
499  /* read file name */
500  if (decode_str(s, pb, encoding, &geob_data->file_name, &taglen) < 0 ||
501  taglen <= 0)
502  goto fail;
503 
504  /* read content description */
505  if (decode_str(s, pb, encoding, &geob_data->description, &taglen) < 0 ||
506  taglen < 0)
507  goto fail;
508 
509  if (taglen) {
510  /* save encapsulated binary data */
511  geob_data->data = av_malloc(taglen);
512  if (!geob_data->data) {
513  av_log(s, AV_LOG_ERROR, "Failed to alloc %d bytes\n", taglen);
514  goto fail;
515  }
516  if ((len = avio_read(pb, geob_data->data, taglen)) < taglen)
518  "Error reading GEOB frame, data truncated.\n");
519  geob_data->datasize = len;
520  } else {
521  geob_data->data = NULL;
522  geob_data->datasize = 0;
523  }
524 
525  /* add data to the list */
526  new_extra->tag = "GEOB";
527  list_append(new_extra, extra_meta);
528 
529  return;
530 
531 fail:
532  av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", tag);
533  free_geobtag(geob_data);
534  av_free(new_extra);
535  return;
536 }
537 
538 static int is_number(const char *str)
539 {
540  while (*str >= '0' && *str <= '9')
541  str++;
542  return !*str;
543 }
544 
546 {
548  if ((t = av_dict_get(m, tag, NULL, AV_DICT_MATCH_CASE)) &&
549  strlen(t->value) == 4 && is_number(t->value))
550  return t;
551  return NULL;
552 }
553 
554 static void merge_date(AVDictionary **m)
555 {
557  char date[17] = { 0 }; // YYYY-MM-DD hh:mm
558 
559  if (!(t = get_date_tag(*m, "TYER")) &&
560  !(t = get_date_tag(*m, "TYE")))
561  return;
562  av_strlcpy(date, t->value, 5);
563  av_dict_set(m, "TYER", NULL, 0);
564  av_dict_set(m, "TYE", NULL, 0);
565 
566  if (!(t = get_date_tag(*m, "TDAT")) &&
567  !(t = get_date_tag(*m, "TDA")))
568  goto finish;
569  snprintf(date + 4, sizeof(date) - 4, "-%.2s-%.2s", t->value + 2, t->value);
570  av_dict_set(m, "TDAT", NULL, 0);
571  av_dict_set(m, "TDA", NULL, 0);
572 
573  if (!(t = get_date_tag(*m, "TIME")) &&
574  !(t = get_date_tag(*m, "TIM")))
575  goto finish;
576  snprintf(date + 10, sizeof(date) - 10,
577  " %.2s:%.2s", t->value, t->value + 2);
578  av_dict_set(m, "TIME", NULL, 0);
579  av_dict_set(m, "TIM", NULL, 0);
580 
581 finish:
582  if (date[0])
583  av_dict_set(m, "date", date, 0);
584 }
585 
586 static void free_apic(void *obj)
587 {
588  ID3v2ExtraMetaAPIC *apic = obj;
589  av_buffer_unref(&apic->buf);
590  av_freep(&apic->description);
591 }
592 
593 static void rstrip_spaces(char *buf)
594 {
595  size_t len = strlen(buf);
596  while (len > 0 && buf[len - 1] == ' ')
597  buf[--len] = 0;
598 }
599 
600 static void read_apic(AVFormatContext *s, AVIOContext *pb, int taglen,
601  const char *tag, ExtraMetaList *extra_meta, int isv34)
602 {
603  int enc, pic_type;
604  char mimetype[64] = {0};
605  const CodecMime *mime = ff_id3v2_mime_tags;
606  enum AVCodecID id = AV_CODEC_ID_NONE;
607  ID3v2ExtraMetaAPIC *apic = NULL;
608  ID3v2ExtraMeta *new_extra = NULL;
609  int64_t end = avio_tell(pb) + taglen;
610 
611  if (taglen <= 4 || (!isv34 && taglen <= 6))
612  goto fail;
613 
614  new_extra = av_mallocz(sizeof(*new_extra));
615  if (!new_extra)
616  goto fail;
617 
618  apic = &new_extra->data.apic;
619 
620  enc = avio_r8(pb);
621  taglen--;
622 
623  /* mimetype */
624  if (isv34) {
625  int ret = avio_get_str(pb, taglen, mimetype, sizeof(mimetype));
626  if (ret < 0 || ret >= taglen)
627  goto fail;
628  taglen -= ret;
629  } else {
630  if (avio_read(pb, mimetype, 3) < 0)
631  goto fail;
632 
633  mimetype[3] = 0;
634  taglen -= 3;
635  }
636 
637  while (mime->id != AV_CODEC_ID_NONE) {
638  if (!av_strncasecmp(mime->str, mimetype, sizeof(mimetype))) {
639  id = mime->id;
640  break;
641  }
642  mime++;
643  }
644  if (id == AV_CODEC_ID_NONE) {
646  "Unknown attached picture mimetype: %s, skipping.\n", mimetype);
647  goto fail;
648  }
649  apic->id = id;
650 
651  /* picture type */
652  pic_type = avio_r8(pb);
653  taglen--;
654  if (pic_type < 0 || pic_type >= FF_ARRAY_ELEMS(ff_id3v2_picture_types)) {
655  av_log(s, AV_LOG_WARNING, "Unknown attached picture type %d.\n",
656  pic_type);
657  pic_type = 0;
658  }
659  apic->type = ff_id3v2_picture_types[pic_type];
660 
661  /* description and picture data */
662  if (decode_str(s, pb, enc, &apic->description, &taglen) < 0) {
664  "Error decoding attached picture description.\n");
665  goto fail;
666  }
667 
669  if (!apic->buf || !taglen || avio_read(pb, apic->buf->data, taglen) != taglen)
670  goto fail;
671  memset(apic->buf->data + taglen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
672 
673  new_extra->tag = "APIC";
674 
675  // The description must be unique, and some ID3v2 tag writers add spaces
676  // to write several APIC entries with the same description.
677  rstrip_spaces(apic->description);
678  list_append(new_extra, extra_meta);
679 
680  return;
681 
682 fail:
683  if (apic)
684  free_apic(apic);
685  av_freep(&new_extra);
686  avio_seek(pb, end, SEEK_SET);
687 }
688 
689 static void free_chapter(void *obj)
690 {
691  ID3v2ExtraMetaCHAP *chap = obj;
692  av_freep(&chap->element_id);
693  av_dict_free(&chap->meta);
694 }
695 
697  const char *ttag, ExtraMetaList *extra_meta, int isv34)
698 {
699  int taglen;
700  char tag[5];
701  ID3v2ExtraMeta *new_extra = NULL;
702  ID3v2ExtraMetaCHAP *chap = NULL;
703 
704  new_extra = av_mallocz(sizeof(*new_extra));
705  if (!new_extra)
706  return;
707 
708  chap = &new_extra->data.chap;
709 
710  if (decode_str(s, pb, 0, &chap->element_id, &len) < 0)
711  goto fail;
712 
713  if (len < 16)
714  goto fail;
715 
716  chap->start = avio_rb32(pb);
717  chap->end = avio_rb32(pb);
718  avio_skip(pb, 8);
719 
720  len -= 16;
721  while (len > 10) {
722  if (avio_read(pb, tag, 4) < 4)
723  goto fail;
724  tag[4] = 0;
725  taglen = avio_rb32(pb);
726  avio_skip(pb, 2);
727  len -= 10;
728  if (taglen < 0 || taglen > len)
729  goto fail;
730  if (tag[0] == 'T')
731  read_ttag(s, pb, taglen, &chap->meta, tag);
732  else
733  avio_skip(pb, taglen);
734  len -= taglen;
735  }
736 
739 
740  new_extra->tag = "CHAP";
741  list_append(new_extra, extra_meta);
742 
743  return;
744 
745 fail:
746  free_chapter(chap);
747  av_freep(&new_extra);
748 }
749 
750 static void free_priv(void *obj)
751 {
752  ID3v2ExtraMetaPRIV *priv = obj;
753  av_freep(&priv->owner);
754  av_freep(&priv->data);
755 }
756 
757 static void read_priv(AVFormatContext *s, AVIOContext *pb, int taglen,
758  const char *tag, ExtraMetaList *extra_meta, int isv34)
759 {
760  ID3v2ExtraMeta *meta;
761  ID3v2ExtraMetaPRIV *priv;
762 
763  meta = av_mallocz(sizeof(*meta));
764  if (!meta)
765  return;
766 
767  priv = &meta->data.priv;
768 
769  if (decode_str(s, pb, ID3v2_ENCODING_ISO8859, &priv->owner, &taglen) < 0)
770  goto fail;
771 
772  priv->data = av_malloc(taglen);
773  if (!priv->data)
774  goto fail;
775 
776  priv->datasize = taglen;
777 
778  if (avio_read(pb, priv->data, priv->datasize) != priv->datasize)
779  goto fail;
780 
781  meta->tag = "PRIV";
782  list_append(meta, extra_meta);
783 
784  return;
785 
786 fail:
787  free_priv(priv);
788  av_freep(&meta);
789 }
790 
791 typedef struct ID3v2EMFunc {
792  const char *tag3;
793  const char *tag4;
794  void (*read)(AVFormatContext *s, AVIOContext *pb, int taglen,
795  const char *tag, ExtraMetaList *extra_meta,
796  int isv34);
797  void (*free)(void *obj);
798 } ID3v2EMFunc;
799 
801  { "GEO", "GEOB", read_geobtag, free_geobtag },
802  { "PIC", "APIC", read_apic, free_apic },
803  { "CHAP","CHAP", read_chapter, free_chapter },
804  { "PRIV","PRIV", read_priv, free_priv },
805  { NULL }
806 };
807 
808 /**
809  * Get the corresponding ID3v2EMFunc struct for a tag.
810  * @param isv34 Determines if v2.2 or v2.3/4 strings are used
811  * @return A pointer to the ID3v2EMFunc struct if found, NULL otherwise.
812  */
813 static const ID3v2EMFunc *get_extra_meta_func(const char *tag, int isv34)
814 {
815  int i = 0;
816  while (id3v2_extra_meta_funcs[i].tag3) {
817  if (tag && !memcmp(tag,
818  (isv34 ? id3v2_extra_meta_funcs[i].tag4 :
819  id3v2_extra_meta_funcs[i].tag3),
820  (isv34 ? 4 : 3)))
821  return &id3v2_extra_meta_funcs[i];
822  i++;
823  }
824  return NULL;
825 }
826 
827 static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
828  AVFormatContext *s, int len, uint8_t version,
829  uint8_t flags, ExtraMetaList *extra_meta)
830 {
831  int isv34, unsync;
832  unsigned tlen;
833  char tag[5];
834  int64_t next, end = avio_tell(pb);
835  int taghdrlen;
836  const char *reason = NULL;
837  FFIOContext pb_local;
838  AVIOContext *pbx;
839  unsigned char *buffer = NULL;
840  int buffer_size = 0;
841  const ID3v2EMFunc *extra_func = NULL;
842  unsigned char *uncompressed_buffer = NULL;
843  av_unused int uncompressed_buffer_size = 0;
844  const char *comm_frame;
845 
846  if (end > INT64_MAX - len - 10)
847  return;
848  end += len;
849 
850  av_log(s, AV_LOG_DEBUG, "id3v2 ver:%d flags:%02X len:%d\n", version, flags, len);
851 
852  switch (version) {
853  case 2:
854  if (flags & 0x40) {
855  reason = "compression";
856  goto error;
857  }
858  isv34 = 0;
859  taghdrlen = 6;
860  comm_frame = "COM";
861  break;
862 
863  case 3:
864  case 4:
865  isv34 = 1;
866  taghdrlen = 10;
867  comm_frame = "COMM";
868  break;
869 
870  default:
871  reason = "version";
872  goto error;
873  }
874 
875  unsync = flags & 0x80;
876 
877  if (isv34 && flags & 0x40) { /* Extended header present, just skip over it */
878  int extlen = get_size(pb, 4);
879  if (version == 4)
880  /* In v2.4 the length includes the length field we just read. */
881  extlen -= 4;
882 
883  if (extlen < 0) {
884  reason = "invalid extended header length";
885  goto error;
886  }
887  avio_skip(pb, extlen);
888  len -= extlen + 4;
889  if (len < 0) {
890  reason = "extended header too long.";
891  goto error;
892  }
893  }
894 
895  while (len >= taghdrlen) {
896  unsigned int tflags = 0;
897  int tunsync = 0;
898  int tcomp = 0;
899  int tencr = 0;
900  unsigned long av_unused dlen;
901 
902  if (isv34) {
903  if (avio_read(pb, tag, 4) < 4)
904  break;
905  tag[4] = 0;
906  if (version == 3) {
907  tlen = avio_rb32(pb);
908  } else {
909  /* some encoders incorrectly uses v3 sizes instead of syncsafe ones
910  * so check the next tag to see which one to use */
911  tlen = avio_rb32(pb);
912  if (tlen > 0x7f) {
913  if (tlen < len) {
914  int64_t cur = avio_tell(pb);
915 
916  if (ffio_ensure_seekback(pb, 2 /* tflags */ + tlen + 4 /* next tag */))
917  break;
918 
919  if (check_tag(pb, cur + 2 + size_to_syncsafe(tlen), 4) == 1)
920  tlen = size_to_syncsafe(tlen);
921  else if (check_tag(pb, cur + 2 + tlen, 4) != 1)
922  break;
923  avio_seek(pb, cur, SEEK_SET);
924  } else
925  tlen = size_to_syncsafe(tlen);
926  }
927  }
928  tflags = avio_rb16(pb);
929  tunsync = tflags & ID3v2_FLAG_UNSYNCH;
930  } else {
931  if (avio_read(pb, tag, 3) < 3)
932  break;
933  tag[3] = 0;
934  tlen = avio_rb24(pb);
935  }
936  if (tlen > (1<<28))
937  break;
938  len -= taghdrlen + tlen;
939 
940  if (len < 0)
941  break;
942 
943  next = avio_tell(pb) + tlen;
944 
945  if (!tlen) {
946  if (tag[0])
947  av_log(s, AV_LOG_DEBUG, "Invalid empty frame %s, skipping.\n",
948  tag);
949  continue;
950  }
951 
952  if (tflags & ID3v2_FLAG_DATALEN) {
953  if (tlen < 4)
954  break;
955  dlen = avio_rb32(pb);
956  tlen -= 4;
957  } else
958  dlen = tlen;
959 
960  tcomp = tflags & ID3v2_FLAG_COMPRESSION;
961  tencr = tflags & ID3v2_FLAG_ENCRYPTION;
962 
963  /* skip encrypted tags and, if no zlib, compressed tags */
964  if (tencr || (!CONFIG_ZLIB && tcomp)) {
965  const char *type;
966  if (!tcomp)
967  type = "encrypted";
968  else if (!tencr)
969  type = "compressed";
970  else
971  type = "encrypted and compressed";
972 
973  av_log(s, AV_LOG_WARNING, "Skipping %s ID3v2 frame %s.\n", type, tag);
974  avio_skip(pb, tlen);
975  /* check for text tag or supported special meta tag */
976  } else if (tag[0] == 'T' ||
977  !memcmp(tag, "USLT", 4) ||
978  !strcmp(tag, comm_frame) ||
979  (extra_meta &&
980  (extra_func = get_extra_meta_func(tag, isv34)))) {
981  pbx = pb;
982 
983  if (unsync || tunsync || tcomp) {
984  av_fast_malloc(&buffer, &buffer_size, tlen);
985  if (!buffer) {
986  av_log(s, AV_LOG_ERROR, "Failed to alloc %d bytes\n", tlen);
987  goto seek;
988  }
989  }
990  if (unsync || tunsync) {
991  uint8_t *b = buffer;
992  uint8_t *t = buffer;
993  uint8_t *end = t + tlen;
994 
995  if (avio_read(pb, buffer, tlen) != tlen) {
996  av_log(s, AV_LOG_ERROR, "Failed to read tag data\n");
997  goto seek;
998  }
999 
1000  while (t != end) {
1001  *b++ = *t++;
1002  if (t != end && t[-1] == 0xff && !t[0])
1003  t++;
1004  }
1005 
1006  ffio_init_read_context(&pb_local, buffer, b - buffer);
1007  tlen = b - buffer;
1008  pbx = &pb_local.pub; // read from sync buffer
1009  }
1010 
1011 #if CONFIG_ZLIB
1012  if (tcomp) {
1013  int err;
1014 
1015  av_log(s, AV_LOG_DEBUG, "Compresssed frame %s tlen=%d dlen=%ld\n", tag, tlen, dlen);
1016 
1017  if (tlen <= 0)
1018  goto seek;
1019  if (dlen / 32768 > tlen)
1020  goto seek;
1021 
1022  av_fast_malloc(&uncompressed_buffer, &uncompressed_buffer_size, dlen);
1023  if (!uncompressed_buffer) {
1024  av_log(s, AV_LOG_ERROR, "Failed to alloc %ld bytes\n", dlen);
1025  goto seek;
1026  }
1027 
1028  if (!(unsync || tunsync)) {
1029  err = avio_read(pb, buffer, tlen);
1030  if (err < 0) {
1031  av_log(s, AV_LOG_ERROR, "Failed to read compressed tag\n");
1032  goto seek;
1033  }
1034  tlen = err;
1035  }
1036 
1037  err = uncompress(uncompressed_buffer, &dlen, buffer, tlen);
1038  if (err != Z_OK) {
1039  av_log(s, AV_LOG_ERROR, "Failed to uncompress tag: %d\n", err);
1040  goto seek;
1041  }
1042  ffio_init_read_context(&pb_local, uncompressed_buffer, dlen);
1043  tlen = dlen;
1044  pbx = &pb_local.pub; // read from sync buffer
1045  }
1046 #endif
1047  if (tag[0] == 'T')
1048  /* parse text tag */
1049  read_ttag(s, pbx, tlen, metadata, tag);
1050  else if (!memcmp(tag, "USLT", 4))
1051  read_uslt(s, pbx, tlen, metadata);
1052  else if (!strcmp(tag, comm_frame))
1053  read_comment(s, pbx, tlen, metadata);
1054  else
1055  /* parse special meta tag */
1056  extra_func->read(s, pbx, tlen, tag, extra_meta, isv34);
1057  } else if (!tag[0]) {
1058  if (tag[1])
1059  av_log(s, AV_LOG_WARNING, "invalid frame id, assuming padding\n");
1060  avio_skip(pb, tlen);
1061  break;
1062  }
1063  /* Skip to end of tag */
1064 seek:
1065  avio_seek(pb, next, SEEK_SET);
1066  }
1067 
1068  /* Footer preset, always 10 bytes, skip over it */
1069  if (version == 4 && flags & 0x10)
1070  end += 10;
1071 
1072 error:
1073  if (reason)
1074  av_log(s, AV_LOG_INFO, "ID3v2.%d tag skipped, cannot handle %s\n",
1075  version, reason);
1076  avio_seek(pb, end, SEEK_SET);
1077  av_free(buffer);
1078  av_free(uncompressed_buffer);
1079  return;
1080 }
1081 
1082 static void id3v2_read_internal(AVIOContext *pb, AVDictionary **metadata,
1083  AVFormatContext *s, const char *magic,
1084  ID3v2ExtraMeta **extra_metap, int64_t max_search_size)
1085 {
1086  int len, ret;
1087  uint8_t buf[ID3v2_HEADER_SIZE];
1088  ExtraMetaList extra_meta = { NULL };
1089  int found_header;
1090  int64_t start, off;
1091 
1092  if (extra_metap)
1093  *extra_metap = NULL;
1094 
1095  if (max_search_size && max_search_size < ID3v2_HEADER_SIZE)
1096  return;
1097 
1098  start = avio_tell(pb);
1099  do {
1100  /* save the current offset in case there's nothing to read/skip */
1101  off = avio_tell(pb);
1102  if (max_search_size && off - start >= max_search_size - ID3v2_HEADER_SIZE) {
1103  avio_seek(pb, off, SEEK_SET);
1104  break;
1105  }
1106 
1108  if (ret >= 0)
1109  ret = avio_read(pb, buf, ID3v2_HEADER_SIZE);
1110  if (ret != ID3v2_HEADER_SIZE) {
1111  avio_seek(pb, off, SEEK_SET);
1112  break;
1113  }
1114  found_header = ff_id3v2_match(buf, magic);
1115  if (found_header) {
1116  /* parse ID3v2 header */
1117  len = ((buf[6] & 0x7f) << 21) |
1118  ((buf[7] & 0x7f) << 14) |
1119  ((buf[8] & 0x7f) << 7) |
1120  (buf[9] & 0x7f);
1121  id3v2_parse(pb, metadata, s, len, buf[3], buf[5],
1122  extra_metap ? &extra_meta : NULL);
1123  } else {
1124  avio_seek(pb, off, SEEK_SET);
1125  }
1126  } while (found_header);
1130  merge_date(metadata);
1131  if (extra_metap)
1132  *extra_metap = extra_meta.head;
1133 }
1134 
1136  const char *magic, ID3v2ExtraMeta **extra_meta)
1137 {
1138  id3v2_read_internal(pb, metadata, NULL, magic, extra_meta, 0);
1139 }
1140 
1141 void ff_id3v2_read(AVFormatContext *s, const char *magic,
1142  ID3v2ExtraMeta **extra_meta, unsigned int max_search_size)
1143 {
1144  id3v2_read_internal(s->pb, &s->metadata, s, magic, extra_meta, max_search_size);
1145 }
1146 
1148 {
1149  ID3v2ExtraMeta *current = *extra_meta, *next;
1150  const ID3v2EMFunc *extra_func;
1151 
1152  while (current) {
1153  if ((extra_func = get_extra_meta_func(current->tag, 1)))
1154  extra_func->free(&current->data);
1155  next = current->next;
1156  av_freep(&current);
1157  current = next;
1158  }
1159 
1160  *extra_meta = NULL;
1161 }
1162 
1164 {
1165  ID3v2ExtraMeta *cur;
1166 
1167  for (cur = extra_meta; cur; cur = cur->next) {
1168  ID3v2ExtraMetaAPIC *apic;
1169  AVStream *st;
1170  int ret;
1171 
1172  if (strcmp(cur->tag, "APIC"))
1173  continue;
1174  apic = &cur->data.apic;
1175 
1176  ret = ff_add_attached_pic(s, NULL, NULL, &apic->buf, 0);
1177  if (ret < 0)
1178  return ret;
1179  st = s->streams[s->nb_streams - 1];
1180  st->codecpar->codec_id = apic->id;
1181 
1182  if (AV_RB64(st->attached_pic.data) == PNGSIG)
1184 
1185  if (apic->description[0])
1186  av_dict_set(&st->metadata, "title", apic->description, 0);
1187 
1188  av_dict_set(&st->metadata, "comment", apic->type, 0);
1189  }
1190 
1191  return 0;
1192 }
1193 
1195 {
1196  AVRational time_base = {1, 1000};
1197  int ret;
1198 
1199  for (unsigned i = 0; cur; cur = cur->next) {
1200  ID3v2ExtraMetaCHAP *chap;
1201  AVChapter *chapter;
1202 
1203  if (strcmp(cur->tag, "CHAP"))
1204  continue;
1205 
1206  chap = &cur->data.chap;
1207  chapter = avpriv_new_chapter(s, i++, time_base, chap->start,
1208  chap->end, chap->element_id);
1209  if (!chapter)
1210  continue;
1211 
1212  if ((ret = av_dict_copy(&chapter->metadata, chap->meta, 0)) < 0)
1213  return ret;
1214  }
1215 
1216  return 0;
1217 }
1218 
1220 {
1221  ID3v2ExtraMeta *cur;
1223 
1224  for (cur = extra_meta; cur; cur = cur->next) {
1225  if (!strcmp(cur->tag, "PRIV")) {
1226  ID3v2ExtraMetaPRIV *priv = &cur->data.priv;
1227  AVBPrint bprint;
1228  char *escaped, *key;
1229  int i, ret;
1230 
1231  if ((key = av_asprintf(ID3v2_PRIV_METADATA_PREFIX "%s", priv->owner)) == NULL) {
1232  return AVERROR(ENOMEM);
1233  }
1234 
1235  av_bprint_init(&bprint, priv->datasize + 1, AV_BPRINT_SIZE_UNLIMITED);
1236 
1237  for (i = 0; i < priv->datasize; i++) {
1238  if (priv->data[i] < 32 || priv->data[i] > 126 || priv->data[i] == '\\') {
1239  av_bprintf(&bprint, "\\x%02x", priv->data[i]);
1240  } else {
1241  av_bprint_chars(&bprint, priv->data[i], 1);
1242  }
1243  }
1244 
1245  if ((ret = av_bprint_finalize(&bprint, &escaped)) < 0) {
1246  av_free(key);
1247  return ret;
1248  }
1249 
1250  if ((ret = av_dict_set(metadata, key, escaped, dict_flags)) < 0) {
1251  return ret;
1252  }
1253  }
1254  }
1255 
1256  return 0;
1257 }
1258 
1260 {
1261  return ff_id3v2_parse_priv_dict(&s->metadata, extra_meta);
1262 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
avpriv_new_chapter
AVChapter * avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
Definition: demux_utils.c:43
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
PUT_UTF8
#define PUT_UTF8(val, tmp, PUT_BYTE)
Definition: common.h:541
ID3v2ExtraMeta::geob
ID3v2ExtraMetaGEOB geob
Definition: id3v2.h:90
AVChapter::metadata
AVDictionary * metadata
Definition: avformat.h:1263
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
ID3v2ExtraMeta::next
struct ID3v2ExtraMeta * next
Definition: id3v2.h:86
free_chapter
static void free_chapter(void *obj)
Definition: id3v2.c:689
rstrip_spaces
static void rstrip_spaces(char *buf)
Definition: id3v2.c:593
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
free_geobtag
static void free_geobtag(void *obj)
Free GEOB type extra metadata.
Definition: id3v2.c:224
size_to_syncsafe
static unsigned int size_to_syncsafe(unsigned int size)
Definition: id3v2.c:179
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
int64_t
long long int64_t
Definition: coverity.c:34
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:115
ff_id3v2_4_tags
const char ff_id3v2_4_tags[][4]
ID3v2.4-only text information frames.
Definition: id3v2.c:98
av_unused
#define av_unused
Definition: attributes.h:131
id3v2.h
ff_metadata_conv
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
list_append
static void list_append(ID3v2ExtraMeta *new_elem, ExtraMetaList *list)
Definition: id3v2.c:457
ID3v1_GENRE_MAX
#define ID3v1_GENRE_MAX
Definition: id3v1.h:29
AVPacket::data
uint8_t * data
Definition: packet.h:539
b
#define b
Definition: input.c:41
ff_id3v2_read
void ff_id3v2_read(AVFormatContext *s, const char *magic, ID3v2ExtraMeta **extra_meta, unsigned int max_search_size)
Read an ID3v2 tag, including supported extra metadata.
Definition: id3v2.c:1141
AVMetadataConv
Definition: metadata.h:34
read_apic
static void read_apic(AVFormatContext *s, AVIOContext *pb, int taglen, const char *tag, ExtraMetaList *extra_meta, int isv34)
Definition: id3v2.c:600
ID3v2ExtraMetaAPIC::id
enum AVCodecID id
Definition: id3v2.h:69
read_ttag
static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, AVDictionary **metadata, const char *key)
Parse a text tag.
Definition: id3v2.c:326
AVDictionary
Definition: dict.c:34
ffio_init_read_context
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
Definition: aviobuf.c:99
ID3v2_FLAG_ENCRYPTION
#define ID3v2_FLAG_ENCRYPTION
Definition: id3v2.h:39
id3v1.h
FFIOContext
Definition: avio_internal.h:28
decode_str
static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding, uint8_t **dst, int *maxread)
Decode characters to UTF-8 according to encoding type.
Definition: id3v2.c:245
ID3v2ExtraMetaGEOB
Definition: id3v2.h:57
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
free_apic
static void free_apic(void *obj)
Definition: id3v2.c:586
ExtraMetaList
Definition: id3v2.c:453
CodecMime
Definition: internal.h:47
ID3v2EMFunc::tag3
const char * tag3
Definition: id3v2.c:792
finish
static void finish(void)
Definition: movenc.c:374
ExtraMetaList::tail
ID3v2ExtraMeta * tail
Definition: id3v2.c:454
fail
#define fail()
Definition: checkasm.h:193
check_tag
static int check_tag(AVIOContext *s, int offset, unsigned int len)
Return 1 if the tag of length len at the given offset is valid, 0 if not, -1 on error.
Definition: id3v2.c:207
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
AVChapter
Definition: avformat.h:1259
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
ID3v2ExtraMetaCHAP
Definition: id3v2.h:78
ID3v2ExtraMeta::apic
ID3v2ExtraMetaAPIC apic
Definition: id3v2.h:88
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:714
AVStream::attached_pic
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition: avformat.h:846
ff_id3v2_parse_chapters
int ff_id3v2_parse_chapters(AVFormatContext *s, ID3v2ExtraMeta *cur)
Create chapters for all CHAP tags found in the ID3v2 header.
Definition: id3v2.c:1194
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
ID3v2_PRIV_METADATA_PREFIX
#define ID3v2_PRIV_METADATA_PREFIX
Definition: id3v2.h:42
avio_close_dyn_buf
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1407
get_date_tag
static AVDictionaryEntry * get_date_tag(AVDictionary *m, const char *tag)
Definition: id3v2.c:545
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:761
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
read_chapter
static void read_chapter(AVFormatContext *s, AVIOContext *pb, int len, const char *ttag, ExtraMetaList *extra_meta, int isv34)
Definition: id3v2.c:696
ID3v2ExtraMeta
Definition: id3v2.h:84
ID3v2_ENCODING_UTF8
@ ID3v2_ENCODING_UTF8
Definition: id3v2.h:48
ID3v2ExtraMetaCHAP::element_id
uint8_t * element_id
Definition: id3v2.h:79
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:62
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1362
ff_add_attached_pic
int ff_add_attached_pic(AVFormatContext *s, AVStream *st, AVIOContext *pb, AVBufferRef **buf, int size)
Add an attached pic to an AVStream.
Definition: demux_utils.c:119
read_comment
static void read_comment(AVFormatContext *s, AVIOContext *pb, int taglen, AVDictionary **metadata)
Parse a comment tag.
Definition: id3v2.c:414
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_CODEC_ID_BMP
@ AV_CODEC_ID_BMP
Definition: codec_id.h:130
ID3v2_FLAG_UNSYNCH
#define ID3v2_FLAG_UNSYNCH
Definition: id3v2.h:38
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
ID3v2ExtraMetaAPIC::buf
AVBufferRef * buf
Definition: id3v2.h:66
free_priv
static void free_priv(void *obj)
Definition: id3v2.c:750
key
const char * key
Definition: hwcontext_opencl.c:189
ID3v2_FLAG_DATALEN
#define ID3v2_FLAG_DATALEN
Definition: id3v2.h:37
ID3v2ExtraMetaGEOB::datasize
uint32_t datasize
Definition: id3v2.h:58
AV_CODEC_ID_PNG
@ AV_CODEC_ID_PNG
Definition: codec_id.h:113
ID3v2ExtraMeta::tag
const char * tag
Definition: id3v2.h:85
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:771
id3v2_read_internal
static void id3v2_read_internal(AVIOContext *pb, AVDictionary **metadata, AVFormatContext *s, const char *magic, ID3v2ExtraMeta **extra_metap, int64_t max_search_size)
Definition: id3v2.c:1082
NULL
#define NULL
Definition: coverity.c:32
ID3v2EMFunc::free
void(* free)(void *obj)
Definition: id3v2.c:797
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
ID3v2ExtraMetaPRIV::data
uint8_t * data
Definition: id3v2.h:74
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
ID3v2ExtraMetaGEOB::mime_type
uint8_t * mime_type
Definition: id3v2.h:59
ff_id3v2_parse_apic
int ff_id3v2_parse_apic(AVFormatContext *s, ID3v2ExtraMeta *extra_meta)
Create a stream for each APIC (attached picture) extracted from the ID3v2 header.
Definition: id3v2.c:1163
ExtraMetaList::head
ID3v2ExtraMeta * head
Definition: id3v2.c:454
list
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
Definition: filter_design.txt:25
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:828
seek
static void BS_FUNC() seek(BSCTX *bc, unsigned pos)
Seek to the given bit position.
Definition: bitstream_template.h:399
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:179
get
static void get(const uint8_t *pixels, int stride, int16_t *block)
Definition: proresenc_anatoliy.c:317
ff_id3v2_picture_types
const char *const ff_id3v2_picture_types[21]
Definition: id3v2.c:109
ID3v2_HEADER_SIZE
#define ID3v2_HEADER_SIZE
Definition: id3v2.h:30
ff_id3v2_3_tags
const char ff_id3v2_3_tags[][4]
ID3v2.3-only text information frames.
Definition: id3v2.c:104
ff_id3v2_mime_tags
const CodecMime ff_id3v2_mime_tags[]
Definition: id3v2.c:133
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
ff_id3v2_tags
const char ff_id3v2_tags[][4]
A list of text information frames allowed in both ID3 v2.3 and v2.4 http://www.id3....
Definition: id3v2.c:90
av_strncasecmp
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
Definition: avstring.c:217
ID3v2ExtraMetaGEOB::file_name
uint8_t * file_name
Definition: id3v2.h:60
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
avio_rb24
unsigned int avio_rb24(AVIOContext *s)
Definition: aviobuf.c:754
get_size
static unsigned int get_size(AVIOContext *s, int len)
Definition: id3v2.c:171
is_number
static int is_number(const char *str)
Definition: id3v2.c:538
ID3v2_ENCODING_UTF16BOM
@ ID3v2_ENCODING_UTF16BOM
Definition: id3v2.h:46
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:240
ID3v2ExtraMetaCHAP::start
uint32_t start
Definition: id3v2.h:80
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
is_tag
static int is_tag(const char *buf, unsigned int len)
Definition: id3v2.c:189
avio_get_str
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
Definition: aviobuf.c:866
merge_date
static void merge_date(AVDictionary **m)
Definition: id3v2.c:554
size
int size
Definition: twinvq_data.h:10344
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
ff_id3v2_34_metadata_conv
const AVMetadataConv ff_id3v2_34_metadata_conv[]
Definition: id3v2.c:46
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:603
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1023
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:223
av_buffer_alloc
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:77
version
version
Definition: libkvazaar.c:321
ID3v2ExtraMetaAPIC
Definition: id3v2.h:65
ID3v2ExtraMeta::chap
ID3v2ExtraMetaCHAP chap
Definition: id3v2.h:89
PNGSIG
#define PNGSIG
Definition: png.h:49
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:220
AV_CODEC_ID_GIF
@ AV_CODEC_ID_GIF
Definition: codec_id.h:149
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:59
bprint.h
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
avio_rl24
unsigned int avio_rl24(AVIOContext *s)
Definition: aviobuf.c:722
avio_internal.h
ff_id3v2_read_dict
void ff_id3v2_read_dict(AVIOContext *pb, AVDictionary **metadata, const char *magic, ID3v2ExtraMeta **extra_meta)
Read an ID3v2 tag into specified dictionary and retrieve supported extra metadata.
Definition: id3v2.c:1135
ff_id3v1_genre_str
const char *const ff_id3v1_genre_str[ID3v1_GENRE_MAX+1]
ID3v1 genres.
Definition: id3v1.c:26
id3v2_parse
static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata, AVFormatContext *s, int len, uint8_t version, uint8_t flags, ExtraMetaList *extra_meta)
Definition: id3v2.c:827
GET_UTF16
#define GET_UTF16(val, GET_16BIT, ERROR)
Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
Definition: common.h:513
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
demux.h
AV_CODEC_ID_WEBP
@ AV_CODEC_ID_WEBP
Definition: codec_id.h:226
len
int len
Definition: vorbis_enc_data.h:426
ID3v2ExtraMetaPRIV::datasize
uint32_t datasize
Definition: id3v2.h:75
get_extra_meta_func
static const ID3v2EMFunc * get_extra_meta_func(const char *tag, int isv34)
Get the corresponding ID3v2EMFunc struct for a tag.
Definition: id3v2.c:813
ID3v2_ENCODING_UTF16BE
@ ID3v2_ENCODING_UTF16BE
Definition: id3v2.h:47
language
Undefined Behavior In the C language
Definition: undefined.txt:3
ff_id3v2_tag_len
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
Definition: id3v2.c:159
tag
uint32_t tag
Definition: movenc.c:1879
ffio_free_dyn_buf
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition: aviobuf.c:1435
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:231
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:746
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:99
dict.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
id
enum AVCodecID id
Definition: dts2pts.c:367
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
AV_DICT_MATCH_CASE
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
Definition: dict.h:74
ID3v2ExtraMetaGEOB::description
uint8_t * description
Definition: id3v2.h:61
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:129
ID3v2ExtraMetaAPIC::type
const char * type
Definition: id3v2.h:67
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
ff_id3v2_4_metadata_conv
const AVMetadataConv ff_id3v2_4_metadata_conv[]
Definition: id3v2.c:65
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:612
ID3v2ExtraMetaGEOB::data
uint8_t * data
Definition: id3v2.h:62
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:318
read_geobtag
static void read_geobtag(AVFormatContext *s, AVIOContext *pb, int taglen, const char *tag, ExtraMetaList *extra_meta, int isv34)
Parse GEOB tag into a ID3v2ExtraMetaGEOB struct.
Definition: id3v2.c:469
CodecMime::str
char str[32]
Definition: internal.h:48
ID3v2ExtraMeta::data
union ID3v2ExtraMeta::@394 data
CodecMime::id
enum AVCodecID id
Definition: internal.h:49
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
ID3v2_FLAG_COMPRESSION
#define ID3v2_FLAG_COMPRESSION
Definition: id3v2.h:40
mem.h
read_priv
static void read_priv(AVFormatContext *s, AVIOContext *pb, int taglen, const char *tag, ExtraMetaList *extra_meta, int isv34)
Definition: id3v2.c:757
ID3v2EMFunc
Definition: id3v2.c:791
id3v2_extra_meta_funcs
static const ID3v2EMFunc id3v2_extra_meta_funcs[]
Definition: id3v2.c:800
ID3v2ExtraMetaCHAP::end
uint32_t end
Definition: id3v2.h:80
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVDictionaryEntry
Definition: dict.h:89
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
png.h
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
av_fast_malloc
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition: mem.c:557
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:237
ff_id3v2_free_extra_meta
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta)
Free memory allocated parsing special (non-text) metadata.
Definition: id3v2.c:1147
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
ID3v2EMFunc::read
void(* read)(AVFormatContext *s, AVIOContext *pb, int taglen, const char *tag, ExtraMetaList *extra_meta, int isv34)
Definition: id3v2.c:794
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
ff_id3v2_parse_priv
int ff_id3v2_parse_priv(AVFormatContext *s, ID3v2ExtraMeta *extra_meta)
Add metadata for all PRIV tags in the ID3v2 header.
Definition: id3v2.c:1259
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
id3v2_2_metadata_conv
static const AVMetadataConv id3v2_2_metadata_conv[]
Definition: id3v2.c:77
av_bprint_chars
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
Definition: bprint.c:145
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:148
AVDictionaryEntry::value
char * value
Definition: dict.h:91
avstring.h
ID3v2EMFunc::tag4
const char * tag4
Definition: id3v2.c:793
ff_id3v2_parse_priv_dict
int ff_id3v2_parse_priv_dict(AVDictionary **metadata, ID3v2ExtraMeta *extra_meta)
Parse PRIV tags into a dictionary.
Definition: id3v2.c:1219
snprintf
#define snprintf
Definition: snprintf.h:34
ID3v2ExtraMetaCHAP::meta
AVDictionary * meta
Definition: id3v2.h:81
ID3v2ExtraMetaPRIV
Definition: id3v2.h:72
AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
Definition: bytestream.h:95
ID3v2ExtraMetaPRIV::owner
uint8_t * owner
Definition: id3v2.h:73
AV_DICT_DONT_STRDUP_KEY
#define AV_DICT_DONT_STRDUP_KEY
Take ownership of a key that's been allocated with av_malloc() or another memory allocation function.
Definition: dict.h:77
ID3v2_ENCODING_ISO8859
@ ID3v2_ENCODING_ISO8859
Definition: id3v2.h:45
ff_id3v2_match
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
Definition: id3v2.c:146
read_uslt
static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen, AVDictionary **metadata)
Definition: id3v2.c:365
ID3v2ExtraMetaAPIC::description
uint8_t * description
Definition: id3v2.h:68
ID3v2ExtraMeta::priv
ID3v2ExtraMetaPRIV priv
Definition: id3v2.h:91