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