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 
36 #include "libavutil/avstring.h"
37 #include "libavutil/bprint.h"
38 #include "libavutil/dict.h"
39 #include "libavutil/intreadwrite.h"
40 #include "libavutil/mem.h"
41 #include "libavcodec/png.h"
42 #include "avio_internal.h"
43 #include "demux.h"
44 #include "id3v1.h"
45 #include "id3v2.h"
46 
48  { "TALB", "album" },
49  { "TCOM", "composer" },
50  { "TCON", "genre" },
51  { "TCOP", "copyright" },
52  { "TENC", "encoded_by" },
53  { "TIT2", "title" },
54  { "TLAN", "language" },
55  { "TPE1", "artist" },
56  { "TPE2", "album_artist" },
57  { "TPE3", "performer" },
58  { "TPOS", "disc" },
59  { "TPUB", "publisher" },
60  { "TRCK", "track" },
61  { "TSSE", "encoder" },
62  { "USLT", "lyrics" },
63  { 0 }
64 };
65 
67  { "TCMP", "compilation" },
68  { "TDRC", "date" },
69  { "TDRL", "date" },
70  { "TDEN", "creation_time" },
71  { "TSOA", "album-sort" },
72  { "TSOP", "artist-sort" },
73  { "TSOT", "title-sort" },
74  { "TIT1", "grouping" },
75  { 0 }
76 };
77 
79  { "TAL", "album" },
80  { "TCO", "genre" },
81  { "TCP", "compilation" },
82  { "TT2", "title" },
83  { "TEN", "encoded_by" },
84  { "TP1", "artist" },
85  { "TP2", "album_artist" },
86  { "TP3", "performer" },
87  { "TRK", "track" },
88  { 0 }
89 };
90 
92  "TALB", "TBPM", "TCOM", "TCON", "TCOP", "TDLY", "TENC", "TEXT",
93  "TFLT", "TIT1", "TIT2", "TIT3", "TKEY", "TLAN", "TLEN", "TMED",
94  "TOAL", "TOFN", "TOLY", "TOPE", "TOWN", "TPE1", "TPE2", "TPE3",
95  "TPE4", "TPOS", "TPUB", "TRCK", "TRSN", "TRSO", "TSRC", "TSSE",
96  { 0 },
97 };
98 
100  "TDEN", "TDOR", "TDRC", "TDRL", "TDTG", "TIPL", "TMCL", "TMOO",
101  "TPRO", "TSOA", "TSOP", "TSOT", "TSST",
102  { 0 },
103 };
104 
106  "TDAT", "TIME", "TORY", "TRDA", "TSIZ", "TYER",
107  { 0 },
108 };
109 
110 const char * const ff_id3v2_picture_types[21] = {
111  "Other",
112  "32x32 pixels 'file icon'",
113  "Other file icon",
114  "Cover (front)",
115  "Cover (back)",
116  "Leaflet page",
117  "Media (e.g. label side of CD)",
118  "Lead artist/lead performer/soloist",
119  "Artist/performer",
120  "Conductor",
121  "Band/Orchestra",
122  "Composer",
123  "Lyricist/text writer",
124  "Recording Location",
125  "During recording",
126  "During performance",
127  "Movie/video screen capture",
128  "A bright coloured fish",
129  "Illustration",
130  "Band/artist logotype",
131  "Publisher/Studio logotype",
132 };
133 
135  { "image/gif", AV_CODEC_ID_GIF },
136  { "image/jpeg", AV_CODEC_ID_MJPEG },
137  { "image/jpg", AV_CODEC_ID_MJPEG },
138  { "image/png", AV_CODEC_ID_PNG },
139  { "image/tiff", AV_CODEC_ID_TIFF },
140  { "image/bmp", AV_CODEC_ID_BMP },
141  { "image/webp", AV_CODEC_ID_WEBP },
142  { "JPG", AV_CODEC_ID_MJPEG }, /* ID3v2.2 */
143  { "PNG", AV_CODEC_ID_PNG }, /* ID3v2.2 */
144  { "", AV_CODEC_ID_NONE },
145 };
146 
147 int ff_id3v2_match(const uint8_t *buf, const char *magic)
148 {
149  return buf[0] == magic[0] &&
150  buf[1] == magic[1] &&
151  buf[2] == magic[2] &&
152  buf[3] != 0xff &&
153  buf[4] != 0xff &&
154  (buf[6] & 0x80) == 0 &&
155  (buf[7] & 0x80) == 0 &&
156  (buf[8] & 0x80) == 0 &&
157  (buf[9] & 0x80) == 0;
158 }
159 
160 int ff_id3v2_tag_len(const uint8_t *buf)
161 {
162  int len = ((buf[6] & 0x7f) << 21) +
163  ((buf[7] & 0x7f) << 14) +
164  ((buf[8] & 0x7f) << 7) +
165  (buf[9] & 0x7f) +
167  if (buf[5] & 0x10)
169  return len;
170 }
171 
172 static unsigned int get_size(AVIOContext *s, int len)
173 {
174  int v = 0;
175  while (len--)
176  v = (v << 7) + (avio_r8(s) & 0x7F);
177  return v;
178 }
179 
180 static unsigned int size_to_syncsafe(unsigned int size)
181 {
182  return (((size) & (0x7f << 0)) >> 0) +
183  (((size) & (0x7f << 8)) >> 1) +
184  (((size) & (0x7f << 16)) >> 2) +
185  (((size) & (0x7f << 24)) >> 3);
186 }
187 
188 /* No real verification, only check that the tag consists of
189  * a combination of capital alpha-numerical characters */
190 static int is_tag(const char *buf, unsigned int len)
191 {
192  if (!len)
193  return 0;
194 
195  while (len--)
196  if ((buf[len] < 'A' ||
197  buf[len] > 'Z') &&
198  (buf[len] < '0' ||
199  buf[len] > '9'))
200  return 0;
201 
202  return 1;
203 }
204 
205 /**
206  * Return 1 if the tag of length len at the given offset is valid, 0 if not, -1 on error
207  */
208 static int check_tag(AVIOContext *s, int offset, unsigned int len)
209 {
210  char tag[4];
211 
212  if (len > 4 ||
213  avio_seek(s, offset, SEEK_SET) < 0 ||
214  avio_read(s, tag, len) < (int)len)
215  return -1;
216  else if (!AV_RB32(tag) || is_tag(tag, len))
217  return 1;
218 
219  return 0;
220 }
221 
222 /**
223  * Free GEOB type extra metadata.
224  */
225 static void free_geobtag(void *obj)
226 {
227  ID3v2ExtraMetaGEOB *geob = obj;
228  av_freep(&geob->mime_type);
229  av_freep(&geob->file_name);
230  av_freep(&geob->description);
231  av_freep(&geob->data);
232 }
233 
234 /**
235  * Decode characters to UTF-8 according to encoding type. The decoded buffer is
236  * always null terminated. Stop reading when either *maxread bytes are read from
237  * pb or U+0000 character is found.
238  *
239  * @param dst Pointer where the address of the buffer with the decoded bytes is
240  * stored. Buffer must be freed by caller.
241  * @param maxread Pointer to maximum number of characters to read from the
242  * AVIOContext. After execution the value is decremented by the number of bytes
243  * actually read.
244  * @returns 0 if no error occurred, dst is uninitialized on error
245  */
246 static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding,
247  uint8_t **dst, int *maxread)
248 {
249  int ret;
250  uint8_t tmp;
251  uint32_t ch = 1;
252  int left = *maxread, dynsize;
253  unsigned int (*get)(AVIOContext*) = avio_rb16;
254  AVIOContext *dynbuf;
255 
256  if ((ret = avio_open_dyn_buf(&dynbuf)) < 0) {
257  av_log(s, AV_LOG_ERROR, "Error opening memory stream\n");
258  return ret;
259  }
260 
261  if (left == 0)
262  goto end;
263 
264  switch (encoding) {
266  while (left && ch) {
267  ch = avio_r8(pb);
268  PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);)
269  left--;
270  }
271  break;
272 
274  if ((left -= 2) < 0) {
275  av_log(s, AV_LOG_ERROR, "Cannot read BOM value, input too short %d\n", left);
276  ffio_free_dyn_buf(&dynbuf);
277  *dst = NULL;
278  return AVERROR_INVALIDDATA;
279  }
280  uint16_t bom = avio_rb16(pb);
281  switch (bom) {
282  case 0xfffe:
283  get = avio_rl16;
284  case 0xfeff:
285  break;
286  case 0: // empty string without bom
287  goto end;
288  default:
289  av_log(s, AV_LOG_ERROR, "Incorrect BOM value: 0x%x\n", bom);
290  ffio_free_dyn_buf(&dynbuf);
291  *dst = NULL;
292  *maxread = left;
293  return AVERROR_INVALIDDATA;
294  }
295  // fall-through
296 
298  while ((left > 1) && ch) {
299  GET_UTF16(ch, ((left -= 2) >= 0 ? get(pb) : 0), break;)
300  PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);)
301  }
302  if (left < 0)
303  left += 2; /* did not read last char from pb */
304  break;
305 
306  case ID3v2_ENCODING_UTF8:
307  while (left && ch) {
308  ch = avio_r8(pb);
309  avio_w8(dynbuf, ch);
310  left--;
311  }
312  break;
313  default:
314  av_log(s, AV_LOG_WARNING, "Unknown encoding %d\n", encoding);
315  }
316 
317 end:
318  if (ch)
319  avio_w8(dynbuf, 0);
320 
321  dynsize = avio_close_dyn_buf(dynbuf, dst);
322  if (dynsize <= 0) {
323  av_freep(dst);
324  return AVERROR(ENOMEM);
325  }
326  *maxread = left;
327 
328  return 0;
329 }
330 
331 /**
332  * Parse a text tag.
333  */
334 static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen,
335  AVDictionary **metadata, const char *key)
336 {
337  uint8_t *dst;
338  int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL;
339  unsigned genre;
340 
341  if (taglen < 1)
342  return;
343 
344  encoding = avio_r8(pb);
345  taglen--; /* account for encoding type byte */
346 
347  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
348  av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
349  return;
350  }
351 
352  if (!(strcmp(key, "TCON") && strcmp(key, "TCO")) &&
353  (sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) &&
354  genre <= ID3v1_GENRE_MAX) {
355  av_freep(&dst);
356  dst = av_strdup(ff_id3v1_genre_str[genre]);
357  } else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX"))) {
358  /* dst now contains the key, need to get value */
359  key = dst;
360  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
361  av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
362  av_freep(&key);
363  return;
364  }
365  dict_flags |= AV_DICT_DONT_STRDUP_KEY;
366  } else if (!*dst)
367  av_freep(&dst);
368 
369  if (dst)
370  av_dict_set(metadata, key, dst, dict_flags);
371 }
372 
373 static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen,
375 {
376  uint8_t lang[4];
377  uint8_t *descriptor = NULL; // 'Content descriptor'
378  uint8_t *text;
379  char *key;
380  int encoding;
381  int ok = 0;
382 
383  if (taglen < 4)
384  goto error;
385 
386  encoding = avio_r8(pb);
387  taglen--;
388 
389  if (avio_read(pb, lang, 3) < 3)
390  goto error;
391  lang[3] = '\0';
392  taglen -= 3;
393 
394  if (decode_str(s, pb, encoding, &descriptor, &taglen) < 0 || taglen < 0)
395  goto error;
396 
397  if (decode_str(s, pb, encoding, &text, &taglen) < 0 || taglen < 0)
398  goto error;
399 
400  // FFmpeg does not support hierarchical metadata, so concatenate the keys.
401  key = av_asprintf("lyrics-%s%s%s", descriptor[0] ? (char *)descriptor : "",
402  descriptor[0] ? "-" : "",
403  lang);
404  if (!key) {
405  av_free(text);
406  goto error;
407  }
408 
409  av_dict_set(metadata, key, text,
411 
412  ok = 1;
413 error:
414  if (!ok)
415  av_log(s, AV_LOG_ERROR, "Error reading lyrics, skipped\n");
416  av_free(descriptor);
417 }
418 
419 /**
420  * Parse a comment tag.
421  */
422 static void read_comment(AVFormatContext *s, AVIOContext *pb, int taglen,
424 {
425  const char *key = "comment";
426  uint8_t *dst;
427  int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL;
428  av_unused int language;
429 
430  if (taglen < 4)
431  return;
432 
433  encoding = avio_r8(pb);
434  language = avio_rl24(pb);
435  taglen -= 4;
436 
437  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
438  av_log(s, AV_LOG_ERROR, "Error reading comment frame, skipped\n");
439  return;
440  }
441 
442  if (dst && !*dst)
443  av_freep(&dst);
444 
445  if (dst) {
446  key = (const char *) dst;
447  dict_flags |= AV_DICT_DONT_STRDUP_KEY;
448  }
449 
450  if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
451  av_log(s, AV_LOG_ERROR, "Error reading comment frame, skipped\n");
452  if (dict_flags & AV_DICT_DONT_STRDUP_KEY)
453  av_freep((void*)&key);
454  return;
455  }
456 
457  if (dst)
458  av_dict_set(metadata, key, (const char *) dst, dict_flags);
459 }
460 
461 typedef struct ExtraMetaList {
463 } ExtraMetaList;
464 
466 {
467  if (list->tail)
468  list->tail->next = new_elem;
469  else
470  list->head = new_elem;
471  list->tail = new_elem;
472 }
473 
474 /**
475  * Parse GEOB tag into a ID3v2ExtraMetaGEOB struct.
476  */
477 static void read_geobtag(AVFormatContext *s, AVIOContext *pb, int taglen,
478  const char *tag, ExtraMetaList *extra_meta, int isv34)
479 {
480  ID3v2ExtraMetaGEOB *geob_data = NULL;
481  ID3v2ExtraMeta *new_extra = NULL;
482  char encoding;
483  unsigned int len;
484 
485  if (taglen < 1)
486  return;
487 
488  new_extra = av_mallocz(sizeof(ID3v2ExtraMeta));
489  if (!new_extra) {
490  av_log(s, AV_LOG_ERROR, "Failed to alloc %zu bytes\n",
491  sizeof(ID3v2ExtraMeta));
492  return;
493  }
494 
495  geob_data = &new_extra->data.geob;
496 
497  /* read encoding type byte */
498  encoding = avio_r8(pb);
499  taglen--;
500 
501  /* read MIME type (always ISO-8859) */
502  if (decode_str(s, pb, ID3v2_ENCODING_ISO8859, &geob_data->mime_type,
503  &taglen) < 0 ||
504  taglen <= 0)
505  goto fail;
506 
507  /* read file name */
508  if (decode_str(s, pb, encoding, &geob_data->file_name, &taglen) < 0 ||
509  taglen <= 0)
510  goto fail;
511 
512  /* read content description */
513  if (decode_str(s, pb, encoding, &geob_data->description, &taglen) < 0 ||
514  taglen < 0)
515  goto fail;
516 
517  if (taglen) {
518  /* save encapsulated binary data */
519  geob_data->data = av_malloc(taglen);
520  if (!geob_data->data) {
521  av_log(s, AV_LOG_ERROR, "Failed to alloc %d bytes\n", taglen);
522  goto fail;
523  }
524  if ((len = avio_read(pb, geob_data->data, taglen)) < taglen)
526  "Error reading GEOB frame, data truncated.\n");
527  geob_data->datasize = len;
528  } else {
529  geob_data->data = NULL;
530  geob_data->datasize = 0;
531  }
532 
533  /* add data to the list */
534  new_extra->tag = "GEOB";
535  list_append(new_extra, extra_meta);
536 
537  return;
538 
539 fail:
540  av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", tag);
541  free_geobtag(geob_data);
542  av_free(new_extra);
543  return;
544 }
545 
546 static int is_number(const char *str)
547 {
548  while (*str >= '0' && *str <= '9')
549  str++;
550  return !*str;
551 }
552 
554 {
556  if ((t = av_dict_get(m, tag, NULL, AV_DICT_MATCH_CASE)) &&
557  strlen(t->value) == 4 && is_number(t->value))
558  return t;
559  return NULL;
560 }
561 
562 static void merge_date(AVDictionary **m)
563 {
565  char date[17] = { 0 }; // YYYY-MM-DD hh:mm
566 
567  if (!(t = get_date_tag(*m, "TYER")) &&
568  !(t = get_date_tag(*m, "TYE")))
569  return;
570  av_strlcpy(date, t->value, 5);
571  av_dict_set(m, "TYER", NULL, 0);
572  av_dict_set(m, "TYE", NULL, 0);
573 
574  if (!(t = get_date_tag(*m, "TDAT")) &&
575  !(t = get_date_tag(*m, "TDA")))
576  goto finish;
577  snprintf(date + 4, sizeof(date) - 4, "-%.2s-%.2s", t->value + 2, t->value);
578  av_dict_set(m, "TDAT", NULL, 0);
579  av_dict_set(m, "TDA", NULL, 0);
580 
581  if (!(t = get_date_tag(*m, "TIME")) &&
582  !(t = get_date_tag(*m, "TIM")))
583  goto finish;
584  snprintf(date + 10, sizeof(date) - 10,
585  " %.2s:%.2s", t->value, t->value + 2);
586  av_dict_set(m, "TIME", NULL, 0);
587  av_dict_set(m, "TIM", NULL, 0);
588 
589 finish:
590  if (date[0])
591  av_dict_set(m, "date", date, 0);
592 }
593 
594 static void free_apic(void *obj)
595 {
596  ID3v2ExtraMetaAPIC *apic = obj;
597  av_buffer_unref(&apic->buf);
598  av_freep(&apic->description);
599 }
600 
601 static void rstrip_spaces(char *buf)
602 {
603  size_t len = strlen(buf);
604  while (len > 0 && buf[len - 1] == ' ')
605  buf[--len] = 0;
606 }
607 
608 static void read_apic(AVFormatContext *s, AVIOContext *pb, int taglen,
609  const char *tag, ExtraMetaList *extra_meta, int isv34)
610 {
611  int enc, pic_type;
612  char mimetype[64] = {0};
613  const CodecMime *mime = ff_id3v2_mime_tags;
614  enum AVCodecID id = AV_CODEC_ID_NONE;
615  ID3v2ExtraMetaAPIC *apic = NULL;
616  ID3v2ExtraMeta *new_extra = NULL;
617  int64_t end = avio_tell(pb) + taglen;
618 
619  if (taglen <= 4 || (!isv34 && taglen <= 6))
620  goto fail;
621 
622  new_extra = av_mallocz(sizeof(*new_extra));
623  if (!new_extra)
624  goto fail;
625 
626  apic = &new_extra->data.apic;
627 
628  enc = avio_r8(pb);
629  taglen--;
630 
631  /* mimetype */
632  if (isv34) {
633  int ret = avio_get_str(pb, taglen, mimetype, sizeof(mimetype));
634  if (ret < 0 || ret >= taglen)
635  goto fail;
636  taglen -= ret;
637  } else {
638  if (avio_read(pb, mimetype, 3) < 0)
639  goto fail;
640 
641  mimetype[3] = 0;
642  taglen -= 3;
643  }
644 
645  while (mime->id != AV_CODEC_ID_NONE) {
646  if (!av_strncasecmp(mime->str, mimetype, sizeof(mimetype))) {
647  id = mime->id;
648  break;
649  }
650  mime++;
651  }
652  if (id == AV_CODEC_ID_NONE) {
654  "Unknown attached picture mimetype: %s, skipping.\n", mimetype);
655  goto fail;
656  }
657  apic->id = id;
658 
659  /* picture type */
660  pic_type = avio_r8(pb);
661  taglen--;
662  if (pic_type < 0 || pic_type >= FF_ARRAY_ELEMS(ff_id3v2_picture_types)) {
663  av_log(s, AV_LOG_WARNING, "Unknown attached picture type %d.\n",
664  pic_type);
665  pic_type = 0;
666  }
667  apic->type = ff_id3v2_picture_types[pic_type];
668 
669  /* description and picture data */
670  if (decode_str(s, pb, enc, &apic->description, &taglen) < 0) {
672  "Error decoding attached picture description.\n");
673  goto fail;
674  }
675 
677  if (!apic->buf || !taglen || avio_read(pb, apic->buf->data, taglen) != taglen)
678  goto fail;
679  memset(apic->buf->data + taglen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
680 
681  new_extra->tag = "APIC";
682 
683  // The description must be unique, and some ID3v2 tag writers add spaces
684  // to write several APIC entries with the same description.
685  rstrip_spaces(apic->description);
686  list_append(new_extra, extra_meta);
687 
688  return;
689 
690 fail:
691  if (apic)
692  free_apic(apic);
693  av_freep(&new_extra);
694  avio_seek(pb, end, SEEK_SET);
695 }
696 
697 static void free_chapter(void *obj)
698 {
699  ID3v2ExtraMetaCHAP *chap = obj;
700  av_freep(&chap->element_id);
701  av_dict_free(&chap->meta);
702 }
703 
705  const char *ttag, ExtraMetaList *extra_meta, int isv34)
706 {
707  int taglen;
708  char tag[5];
709  ID3v2ExtraMeta *new_extra = NULL;
710  ID3v2ExtraMetaCHAP *chap = NULL;
711 
712  new_extra = av_mallocz(sizeof(*new_extra));
713  if (!new_extra)
714  return;
715 
716  chap = &new_extra->data.chap;
717 
718  if (decode_str(s, pb, 0, &chap->element_id, &len) < 0)
719  goto fail;
720 
721  if (len < 16)
722  goto fail;
723 
724  chap->start = avio_rb32(pb);
725  chap->end = avio_rb32(pb);
726  avio_skip(pb, 8);
727 
728  len -= 16;
729  while (len > 10) {
730  if (avio_read(pb, tag, 4) < 4)
731  goto fail;
732  tag[4] = 0;
733  taglen = avio_rb32(pb);
734  avio_skip(pb, 2);
735  len -= 10;
736  if (taglen < 0 || taglen > len)
737  goto fail;
738  if (tag[0] == 'T')
739  read_ttag(s, pb, taglen, &chap->meta, tag);
740  else
741  avio_skip(pb, taglen);
742  len -= taglen;
743  }
744 
747 
748  new_extra->tag = "CHAP";
749  list_append(new_extra, extra_meta);
750 
751  return;
752 
753 fail:
754  free_chapter(chap);
755  av_freep(&new_extra);
756 }
757 
758 static void free_priv(void *obj)
759 {
760  ID3v2ExtraMetaPRIV *priv = obj;
761  av_freep(&priv->owner);
762  av_freep(&priv->data);
763 }
764 
765 static void read_priv(AVFormatContext *s, AVIOContext *pb, int taglen,
766  const char *tag, ExtraMetaList *extra_meta, int isv34)
767 {
768  ID3v2ExtraMeta *meta;
769  ID3v2ExtraMetaPRIV *priv;
770 
771  meta = av_mallocz(sizeof(*meta));
772  if (!meta)
773  return;
774 
775  priv = &meta->data.priv;
776 
777  if (decode_str(s, pb, ID3v2_ENCODING_ISO8859, &priv->owner, &taglen) < 0)
778  goto fail;
779 
780  priv->data = av_malloc(taglen);
781  if (!priv->data)
782  goto fail;
783 
784  priv->datasize = taglen;
785 
786  if (avio_read(pb, priv->data, priv->datasize) != priv->datasize)
787  goto fail;
788 
789  meta->tag = "PRIV";
790  list_append(meta, extra_meta);
791 
792  return;
793 
794 fail:
795  free_priv(priv);
796  av_freep(&meta);
797 }
798 
799 typedef struct ID3v2EMFunc {
800  const char *tag3;
801  const char *tag4;
802  void (*read)(AVFormatContext *s, AVIOContext *pb, int taglen,
803  const char *tag, ExtraMetaList *extra_meta,
804  int isv34);
805  void (*free)(void *obj);
806 } ID3v2EMFunc;
807 
809  { "GEO", "GEOB", read_geobtag, free_geobtag },
810  { "PIC", "APIC", read_apic, free_apic },
811  { "CHAP","CHAP", read_chapter, free_chapter },
812  { "PRIV","PRIV", read_priv, free_priv },
813  { NULL }
814 };
815 
816 /**
817  * Get the corresponding ID3v2EMFunc struct for a tag.
818  * @param isv34 Determines if v2.2 or v2.3/4 strings are used
819  * @return A pointer to the ID3v2EMFunc struct if found, NULL otherwise.
820  */
821 static const ID3v2EMFunc *get_extra_meta_func(const char *tag, int isv34)
822 {
823  int i = 0;
824  while (id3v2_extra_meta_funcs[i].tag3) {
825  if (tag && !memcmp(tag,
826  (isv34 ? id3v2_extra_meta_funcs[i].tag4 :
827  id3v2_extra_meta_funcs[i].tag3),
828  (isv34 ? 4 : 3)))
829  return &id3v2_extra_meta_funcs[i];
830  i++;
831  }
832  return NULL;
833 }
834 
836  AVFormatContext *s, int len, uint8_t version,
837  uint8_t flags, ExtraMetaList *extra_meta)
838 {
839  int isv34, unsync;
840  unsigned tlen;
841  char tag[5];
842  int64_t next, end = avio_tell(pb);
843  int taghdrlen;
844  const char *reason = NULL;
845  FFIOContext pb_local;
846  AVIOContext *pbx;
847  unsigned char *buffer = NULL;
848  int buffer_size = 0;
849  const ID3v2EMFunc *extra_func = NULL;
850  unsigned char *uncompressed_buffer = NULL;
851  av_unused int uncompressed_buffer_size = 0;
852  const char *comm_frame;
853 
854  if (end > INT64_MAX - len - 10)
855  return;
856  end += len;
857 
858  av_log(s, AV_LOG_DEBUG, "id3v2 ver:%d flags:%02X len:%d\n", version, flags, len);
859 
860  switch (version) {
861  case 2:
862  if (flags & 0x40) {
863  reason = "compression";
864  goto error;
865  }
866  isv34 = 0;
867  taghdrlen = 6;
868  comm_frame = "COM";
869  break;
870 
871  case 3:
872  case 4:
873  isv34 = 1;
874  taghdrlen = 10;
875  comm_frame = "COMM";
876  break;
877 
878  default:
879  reason = "version";
880  goto error;
881  }
882 
883  unsync = flags & 0x80;
884 
885  if (isv34 && flags & 0x40) { /* Extended header present, just skip over it */
886  int extlen = get_size(pb, 4);
887  if (version == 4)
888  /* In v2.4 the length includes the length field we just read. */
889  extlen -= 4;
890 
891  if (extlen < 0) {
892  reason = "invalid extended header length";
893  goto error;
894  }
895  avio_skip(pb, extlen);
896  len -= extlen + 4;
897  if (len < 0) {
898  reason = "extended header too long.";
899  goto error;
900  }
901  }
902 
903  while (len >= taghdrlen) {
904  unsigned int tflags = 0;
905  int tunsync = 0;
906  int tcomp = 0;
907  int tencr = 0;
908  av_unused unsigned long dlen;
909 
910  if (isv34) {
911  if (avio_read(pb, tag, 4) < 4)
912  break;
913  tag[4] = 0;
914  if (version == 3) {
915  tlen = avio_rb32(pb);
916  } else {
917  /* some encoders incorrectly uses v3 sizes instead of syncsafe ones
918  * so check the next tag to see which one to use */
919  tlen = avio_rb32(pb);
920  if (tlen > 0x7f) {
921  if (tlen < len) {
922  int64_t cur = avio_tell(pb);
923 
924  if (ffio_ensure_seekback(pb, 2 /* tflags */ + tlen + 4 /* next tag */))
925  break;
926 
927  if (check_tag(pb, cur + 2 + size_to_syncsafe(tlen), 4) == 1)
928  tlen = size_to_syncsafe(tlen);
929  else if (check_tag(pb, cur + 2 + tlen, 4) != 1)
930  break;
931  avio_seek(pb, cur, SEEK_SET);
932  } else
933  tlen = size_to_syncsafe(tlen);
934  }
935  }
936  tflags = avio_rb16(pb);
937  tunsync = tflags & ID3v2_FLAG_UNSYNCH;
938  } else {
939  if (avio_read(pb, tag, 3) < 3)
940  break;
941  tag[3] = 0;
942  tlen = avio_rb24(pb);
943  }
944  if (tlen > (1<<28))
945  break;
946  len -= taghdrlen + tlen;
947 
948  if (len < 0)
949  break;
950 
951  next = avio_tell(pb) + tlen;
952 
953  if (!tlen) {
954  if (tag[0])
955  av_log(s, AV_LOG_DEBUG, "Invalid empty frame %s, skipping.\n",
956  tag);
957  continue;
958  }
959 
960  if (tflags & ID3v2_FLAG_DATALEN) {
961  if (tlen < 4)
962  break;
963  dlen = avio_rb32(pb);
964  tlen -= 4;
965  } else
966  dlen = tlen;
967 
968  tcomp = tflags & ID3v2_FLAG_COMPRESSION;
969  tencr = tflags & ID3v2_FLAG_ENCRYPTION;
970 
971  /* skip encrypted tags and, if no zlib, compressed tags */
972  if (tencr || (!CONFIG_ZLIB && tcomp)) {
973  const char *type;
974  if (!tcomp)
975  type = "encrypted";
976  else if (!tencr)
977  type = "compressed";
978  else
979  type = "encrypted and compressed";
980 
981  av_log(s, AV_LOG_WARNING, "Skipping %s ID3v2 frame %s.\n", type, tag);
982  avio_skip(pb, tlen);
983  /* check for text tag or supported special meta tag */
984  } else if (tag[0] == 'T' ||
985  !memcmp(tag, "USLT", 4) ||
986  !strcmp(tag, comm_frame) ||
987  (extra_meta &&
988  (extra_func = get_extra_meta_func(tag, isv34)))) {
989  pbx = pb;
990 
991  if (unsync || tunsync || tcomp) {
992  av_fast_malloc(&buffer, &buffer_size, tlen);
993  if (!buffer) {
994  av_log(s, AV_LOG_ERROR, "Failed to alloc %d bytes\n", tlen);
995  goto seek;
996  }
997  }
998  if (unsync || tunsync) {
999  uint8_t *b = buffer;
1000  uint8_t *t = buffer;
1001  uint8_t *end = t + tlen;
1002 
1003  if (avio_read(pb, buffer, tlen) != tlen) {
1004  av_log(s, AV_LOG_ERROR, "Failed to read tag data\n");
1005  goto seek;
1006  }
1007 
1008  while (t != end) {
1009  *b++ = *t++;
1010  if (t != end && t[-1] == 0xff && !t[0])
1011  t++;
1012  }
1013 
1014  ffio_init_read_context(&pb_local, buffer, b - buffer);
1015  tlen = b - buffer;
1016  pbx = &pb_local.pub; // read from sync buffer
1017  }
1018 
1019 #if CONFIG_ZLIB
1020  if (tcomp) {
1021  int err;
1022 
1023  av_log(s, AV_LOG_DEBUG, "Compressed frame %s tlen=%d dlen=%ld\n", tag, tlen, dlen);
1024 
1025  if (tlen <= 0)
1026  goto seek;
1027  if (dlen / 32768 > tlen)
1028  goto seek;
1029 
1030  av_fast_malloc(&uncompressed_buffer, &uncompressed_buffer_size, dlen);
1031  if (!uncompressed_buffer) {
1032  av_log(s, AV_LOG_ERROR, "Failed to alloc %ld bytes\n", dlen);
1033  goto seek;
1034  }
1035 
1036  if (!(unsync || tunsync)) {
1037  err = avio_read(pb, buffer, tlen);
1038  if (err < 0) {
1039  av_log(s, AV_LOG_ERROR, "Failed to read compressed tag\n");
1040  goto seek;
1041  }
1042  tlen = err;
1043  }
1044 
1045  err = uncompress(uncompressed_buffer, &dlen, buffer, tlen);
1046  if (err != Z_OK) {
1047  av_log(s, AV_LOG_ERROR, "Failed to uncompress tag: %d\n", err);
1048  goto seek;
1049  }
1050  ffio_init_read_context(&pb_local, uncompressed_buffer, dlen);
1051  tlen = dlen;
1052  pbx = &pb_local.pub; // read from sync buffer
1053  }
1054 #endif
1055  if (tag[0] == 'T')
1056  /* parse text tag */
1057  read_ttag(s, pbx, tlen, metadata, tag);
1058  else if (!memcmp(tag, "USLT", 4))
1059  read_uslt(s, pbx, tlen, metadata);
1060  else if (!strcmp(tag, comm_frame))
1061  read_comment(s, pbx, tlen, metadata);
1062  else
1063  /* parse special meta tag */
1064  extra_func->read(s, pbx, tlen, tag, extra_meta, isv34);
1065  } else if (!tag[0]) {
1066  if (tag[1])
1067  av_log(s, AV_LOG_WARNING, "invalid frame id, assuming padding\n");
1068  avio_skip(pb, tlen);
1069  break;
1070  }
1071  /* Skip to end of tag */
1072 seek:
1073  avio_seek(pb, next, SEEK_SET);
1074  }
1075 
1076  /* Footer preset, always 10 bytes, skip over it */
1077  if (version == 4 && flags & 0x10)
1078  end += 10;
1079 
1080 error:
1081  if (reason)
1082  av_log(s, AV_LOG_INFO, "ID3v2.%d tag skipped, cannot handle %s\n",
1083  version, reason);
1084  avio_seek(pb, end, SEEK_SET);
1085  av_free(buffer);
1086  av_free(uncompressed_buffer);
1087  return;
1088 }
1089 
1091  AVFormatContext *s, const char *magic,
1092  ID3v2ExtraMeta **extra_metap, int64_t max_search_size)
1093 {
1094  int len, ret;
1095  uint8_t buf[ID3v2_HEADER_SIZE];
1096  ExtraMetaList extra_meta = { NULL };
1097  int found_header;
1098  int64_t start, off;
1099 
1100  if (extra_metap)
1101  *extra_metap = NULL;
1102 
1103  if (max_search_size && max_search_size < ID3v2_HEADER_SIZE)
1104  return;
1105 
1106  start = avio_tell(pb);
1107  do {
1108  /* save the current offset in case there's nothing to read/skip */
1109  off = avio_tell(pb);
1110  if (max_search_size && off - start >= max_search_size - ID3v2_HEADER_SIZE) {
1111  avio_seek(pb, off, SEEK_SET);
1112  break;
1113  }
1114 
1116  if (ret >= 0)
1117  ret = avio_read(pb, buf, ID3v2_HEADER_SIZE);
1118  if (ret != ID3v2_HEADER_SIZE) {
1119  avio_seek(pb, off, SEEK_SET);
1120  break;
1121  }
1122  found_header = ff_id3v2_match(buf, magic);
1123  if (found_header) {
1124  /* parse ID3v2 header */
1125  len = ((buf[6] & 0x7f) << 21) |
1126  ((buf[7] & 0x7f) << 14) |
1127  ((buf[8] & 0x7f) << 7) |
1128  (buf[9] & 0x7f);
1129  id3v2_parse(pb, metadata, s, len, buf[3], buf[5],
1130  extra_metap ? &extra_meta : NULL);
1131  } else {
1132  avio_seek(pb, off, SEEK_SET);
1133  }
1134  } while (found_header);
1139  if (extra_metap)
1140  *extra_metap = extra_meta.head;
1141 }
1142 
1144  const char *magic, ID3v2ExtraMeta **extra_meta)
1145 {
1146  id3v2_read_internal(pb, metadata, NULL, magic, extra_meta, 0);
1147 }
1148 
1149 void ff_id3v2_read(AVFormatContext *s, const char *magic,
1150  ID3v2ExtraMeta **extra_meta, unsigned int max_search_size)
1151 {
1152  id3v2_read_internal(s->pb, &s->metadata, s, magic, extra_meta, max_search_size);
1153 }
1154 
1156 {
1157  ID3v2ExtraMeta *current = *extra_meta, *next;
1158  const ID3v2EMFunc *extra_func;
1159 
1160  while (current) {
1161  if ((extra_func = get_extra_meta_func(current->tag, 1)))
1162  extra_func->free(&current->data);
1163  next = current->next;
1164  av_freep(&current);
1165  current = next;
1166  }
1167 
1168  *extra_meta = NULL;
1169 }
1170 
1172 {
1173  ID3v2ExtraMeta *cur;
1174 
1175  for (cur = extra_meta; cur; cur = cur->next) {
1176  ID3v2ExtraMetaAPIC *apic;
1177  AVStream *st;
1178  int ret;
1179 
1180  if (strcmp(cur->tag, "APIC"))
1181  continue;
1182  apic = &cur->data.apic;
1183 
1184  ret = ff_add_attached_pic(s, NULL, NULL, &apic->buf, 0);
1185  if (ret < 0)
1186  return ret;
1187  st = s->streams[s->nb_streams - 1];
1188  st->codecpar->codec_id = apic->id;
1189 
1190  if (AV_RB64(st->attached_pic.data) == PNGSIG)
1192 
1193  if (apic->description[0])
1194  av_dict_set(&st->metadata, "title", apic->description, 0);
1195 
1196  av_dict_set(&st->metadata, "comment", apic->type, 0);
1197  }
1198 
1199  return 0;
1200 }
1201 
1203 {
1204  AVRational time_base = {1, 1000};
1205  int ret;
1206 
1207  for (unsigned i = 0; cur; cur = cur->next) {
1208  ID3v2ExtraMetaCHAP *chap;
1209  AVChapter *chapter;
1210 
1211  if (strcmp(cur->tag, "CHAP"))
1212  continue;
1213 
1214  chap = &cur->data.chap;
1215  chapter = avpriv_new_chapter(s, i++, time_base, chap->start,
1216  chap->end, chap->element_id);
1217  if (!chapter)
1218  continue;
1219 
1220  if ((ret = av_dict_copy(&chapter->metadata, chap->meta, 0)) < 0)
1221  return ret;
1222  }
1223 
1224  return 0;
1225 }
1226 
1228 {
1229  ID3v2ExtraMeta *cur;
1231 
1232  for (cur = extra_meta; cur; cur = cur->next) {
1233  if (!strcmp(cur->tag, "PRIV")) {
1234  ID3v2ExtraMetaPRIV *priv = &cur->data.priv;
1235  AVBPrint bprint;
1236  char *escaped, *key;
1237  int i, ret;
1238 
1239  if ((key = av_asprintf(ID3v2_PRIV_METADATA_PREFIX "%s", priv->owner)) == NULL) {
1240  return AVERROR(ENOMEM);
1241  }
1242 
1243  av_bprint_init(&bprint, priv->datasize + 1, AV_BPRINT_SIZE_UNLIMITED);
1244 
1245  for (i = 0; i < priv->datasize; i++) {
1246  if (priv->data[i] < 32 || priv->data[i] > 126 || priv->data[i] == '\\') {
1247  av_bprintf(&bprint, "\\x%02x", priv->data[i]);
1248  } else {
1249  av_bprint_chars(&bprint, priv->data[i], 1);
1250  }
1251  }
1252 
1253  if ((ret = av_bprint_finalize(&bprint, &escaped)) < 0) {
1254  av_free(key);
1255  return ret;
1256  }
1257 
1258  if ((ret = av_dict_set(metadata, key, escaped, dict_flags)) < 0) {
1259  return ret;
1260  }
1261  }
1262  }
1263 
1264  return 0;
1265 }
1266 
1268 {
1269  return ff_id3v2_parse_priv_dict(&s->metadata, extra_meta);
1270 }
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
flags
const SwsFlags flags[]
Definition: swscale.c:61
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
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:1227
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:697
rstrip_spaces
static void rstrip_spaces(char *buf)
Definition: id3v2.c:601
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:225
size_to_syncsafe
static unsigned int size_to_syncsafe(unsigned int size)
Definition: id3v2.c:180
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
av_unused
#define av_unused
Definition: attributes.h:151
id3v2.h
ff_metadata_conv
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
list_append
static void list_append(ID3v2ExtraMeta *new_elem, ExtraMetaList *list)
Definition: id3v2.c:465
ID3v1_GENRE_MAX
#define ID3v1_GENRE_MAX
Definition: id3v1.h:29
AVPacket::data
uint8_t * data
Definition: packet.h:588
b
#define b
Definition: input.c:42
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:1149
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:608
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:334
AVDictionary
Definition: dict.c:32
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:246
ID3v2ExtraMetaGEOB
Definition: id3v2.h:57
free_apic
static void free_apic(void *obj)
Definition: id3v2.c:594
ExtraMetaList
Definition: id3v2.c:461
CodecMime
Definition: internal.h:47
ID3v2EMFunc::tag3
const char * tag3
Definition: id3v2.c:800
attribute_nonstring
#define attribute_nonstring
Definition: attributes_internal.h:42
finish
static void finish(void)
Definition: movenc.c:374
ExtraMetaList::tail
ID3v2ExtraMeta * tail
Definition: id3v2.c:462
fail
#define fail()
Definition: checkasm.h:218
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:208
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
AVChapter
Definition: avformat.h:1223
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:717
AVStream::attached_pic
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition: avformat.h:842
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:1202
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:1410
get_date_tag
static AVDictionaryEntry * get_date_tag(AVDictionary *m, const char *tag)
Definition: id3v2.c:553
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:764
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
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:704
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:60
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1365
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:107
read_comment
static void read_comment(AVFormatContext *s, AVIOContext *pb, int taglen, AVDictionary **metadata)
Parse a comment tag.
Definition: id3v2.c:422
attributes_internal.h
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:231
ff_id3v2_4_tags
const attribute_nonstring char ff_id3v2_4_tags[][4]
ID3v2.4-only text information frames.
Definition: id3v2.c:99
ID3v2ExtraMetaAPIC::buf
AVBufferRef * buf
Definition: id3v2.h:66
free_priv
static void free_priv(void *obj)
Definition: id3v2.c:758
key
const char * key
Definition: hwcontext_opencl.c:189
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
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:1264
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
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:1090
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
NULL
#define NULL
Definition: coverity.c:32
ID3v2EMFunc::free
void(* free)(void *obj)
Definition: id3v2.c:805
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:1171
ExtraMetaList::head
ID3v2ExtraMeta * head
Definition: id3v2.c:462
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:824
seek
static void BS_FUNC() seek(BSCTX *bc, unsigned pos)
Seek to the given bit position.
Definition: bitstream_template.h:407
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:184
get
static void get(const uint8_t *pixels, int stride, int16_t *block)
Definition: proresenc_anatoliy.c:318
ff_id3v2_picture_types
const char *const ff_id3v2_picture_types[21]
Definition: id3v2.c:110
ID3v2_HEADER_SIZE
#define ID3v2_HEADER_SIZE
Definition: id3v2.h:30
ff_id3v2_3_tags
const attribute_nonstring char ff_id3v2_3_tags[][4]
ID3v2.3-only text information frames.
Definition: id3v2.c:105
ff_id3v2_mime_tags
const CodecMime ff_id3v2_mime_tags[]
Definition: id3v2.c:134
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
av_strncasecmp
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
Definition: avstring.c:218
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:757
get_size
static unsigned int get_size(AVIOContext *s, int len)
Definition: id3v2.c:172
is_number
static int is_number(const char *str)
Definition: id3v2.c:546
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:235
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:87
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
is_tag
static int is_tag(const char *buf, unsigned int len)
Definition: id3v2.c:190
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:869
merge_date
static void merge_date(AVDictionary **m)
Definition: id3v2.c:562
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:47
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
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:1026
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:233
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:313
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:221
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:725
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:1143
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:835
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
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:821
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:160
tag
uint32_t tag
Definition: movenc.c:2032
ffio_free_dyn_buf
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition: aviobuf.c:1438
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:749
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
dict.h
ff_id3v2_tags
const attribute_nonstring 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:91
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
id
enum AVCodecID id
Definition: dts2pts.c:549
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
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:66
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
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:321
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:477
CodecMime::str
char str[32]
Definition: internal.h:48
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:765
ID3v2EMFunc
Definition: id3v2.c:799
id3v2_extra_meta_funcs
static const ID3v2EMFunc id3v2_extra_meta_funcs[]
Definition: id3v2.c:808
ID3v2ExtraMetaCHAP::end
uint32_t end
Definition: id3v2.h:80
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
png.h
ID3v2ExtraMeta::data
union ID3v2ExtraMeta::@458 data
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
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:86
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:247
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:1155
ID3v2EMFunc::read
void(* read)(AVFormatContext *s, AVIOContext *pb, int taglen, const char *tag, ExtraMetaList *extra_meta, int isv34)
Definition: id3v2.c:802
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:1267
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:78
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:130
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:148
AVDictionaryEntry::value
char * value
Definition: dict.h:92
avstring.h
ID3v2EMFunc::tag4
const char * tag4
Definition: id3v2.c:801
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:1227
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:147
bom
static const char * bom
Definition: microdvddec.c:78
read_uslt
static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen, AVDictionary **metadata)
Definition: id3v2.c:373
ID3v2ExtraMetaAPIC::description
uint8_t * description
Definition: id3v2.h:68
ID3v2ExtraMeta::priv
ID3v2ExtraMetaPRIV priv
Definition: id3v2.h:91