FFmpeg
asfdec_o.c
Go to the documentation of this file.
1 /*
2  * Microsoft Advanced Streaming Format demuxer
3  * Copyright (c) 2014 Alexandra Hájková
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavutil/attributes.h"
23 #include "libavutil/avstring.h"
24 #include "libavutil/bswap.h"
25 #include "libavutil/common.h"
26 #include "libavutil/dict.h"
27 #include "libavutil/internal.h"
28 #include "libavutil/mathematics.h"
29 #include "libavutil/opt.h"
31 
32 #include "avformat.h"
33 #include "avio_internal.h"
34 #include "avlanguage.h"
35 #include "id3v2.h"
36 #include "internal.h"
37 #include "riff.h"
38 #include "asf.h"
39 #include "asfcrypt.h"
40 
41 #define ASF_BOOL 0x2
42 #define ASF_WORD 0x5
43 #define ASF_GUID 0x6
44 #define ASF_DWORD 0x3
45 #define ASF_QWORD 0x4
46 #define ASF_UNICODE 0x0
47 #define ASF_FLAG_BROADCAST 0x1
48 #define ASF_BYTE_ARRAY 0x1
49 #define ASF_TYPE_AUDIO 0x2
50 #define ASF_TYPE_VIDEO 0x1
51 #define ASF_STREAM_NUM 0x7F
52 #define ASF_MAX_STREAMS 128
53 #define BMP_HEADER_SIZE 40
54 #define ASF_NUM_OF_PAYLOADS 0x3F
55 #define ASF_ERROR_CORRECTION_LENGTH_TYPE 0x60
56 #define ASF_PACKET_ERROR_CORRECTION_DATA_SIZE 0x2
57 
58 typedef struct GUIDParseTable {
59  const char *name;
64 
65 typedef struct ASFPacket {
67  int64_t dts;
68  uint32_t frame_num; // ASF payloads with the same number are parts of the same frame
69  int flags;
70  int data_size;
71  int duration;
72  int size_left;
74 } ASFPacket;
75 
76 typedef struct ASFStream {
77  uint8_t stream_index; // from packet header
78  int index; // stream index in AVFormatContext, set in asf_read_stream_properties
79  int type;
80  int indexed; // added index entries from the Simple Index Object or not
81  int8_t span; // for deinterleaving
82  uint16_t virtual_pkt_len;
84  int16_t lang_idx;
86 } ASFStream;
87 
88 typedef struct ASFStreamData{
89  char langs[32];
90  AVDictionary *asf_met; // for storing per-stream metadata
93 
94 typedef struct ASFContext {
96  int is_simple_index; // is simple index present or not 1/0
97  int is_header;
98 
99  uint64_t preroll;
100  uint64_t nb_packets; // ASF packets
101  uint32_t packet_size;
102  int64_t send_time;
103  int duration;
104 
105  uint32_t b_flags; // flags with broadcast flag
106  uint32_t prop_flags; // file properties object flags
107 
108  uint64_t data_size; // data object size
109  uint64_t unknown_size; // size of the unknown object
110 
111  int64_t offset; // offset of the current object
112 
113  int64_t data_offset;
114  int64_t first_packet_offset; // packet offset
115  int64_t unknown_offset; // for top level header objects or subobjects without specified behavior
116 
117  // ASF file must not contain more than 128 streams according to the specification
121 
122  int stream_index; // from packet header, for the subpayload case
123 
124  // packet parameters
125  uint64_t sub_header_offset; // offset of subpayload header
126  int64_t sub_dts;
127  uint8_t dts_delta; // for subpayloads
128  uint32_t packet_size_internal; // packet size stored inside ASFPacket, can be 0
129  int64_t packet_offset; // offset of the current packet inside Data Object
130  uint32_t pad_len; // padding after payload
131  uint32_t rep_data_len;
132 
133  // packet state
134  uint64_t sub_left; // subpayloads left or not
135  unsigned int nb_sub; // number of subpayloads read so far from the current ASF packet
136  uint16_t mult_sub_len; // total length of subpayloads array inside multiple payload
137  uint64_t nb_mult_left; // multiple payloads left
139  enum {
144  } state;
145 } ASFContext;
146 
147 static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size);
148 static const GUIDParseTable *find_guid(ff_asf_guid guid);
149 
150 static int asf_probe(const AVProbeData *pd)
151 {
152  /* check file header */
153  if (!ff_guidcmp(pd->buf, &ff_asf_header))
154  return AVPROBE_SCORE_MAX/2;
155  else
156  return 0;
157 }
158 
159 static void swap_guid(ff_asf_guid guid)
160 {
161  FFSWAP(unsigned char, guid[0], guid[3]);
162  FFSWAP(unsigned char, guid[1], guid[2]);
163  FFSWAP(unsigned char, guid[4], guid[5]);
164  FFSWAP(unsigned char, guid[6], guid[7]);
165 }
166 
167 static void align_position(AVIOContext *pb, int64_t offset, uint64_t size)
168 {
169  if (size < INT64_MAX - offset && avio_tell(pb) != offset + size)
170  avio_seek(pb, offset + size, SEEK_SET);
171 }
172 
174 {
175  ASFContext *asf = s->priv_data;
176  AVIOContext *pb = s->pb;
177  uint64_t size = avio_rl64(pb);
178  int ret;
179 
180  if (size > INT64_MAX)
181  return AVERROR_INVALIDDATA;
182 
183  if (asf->is_header)
184  asf->unknown_size = size;
185  asf->is_header = 0;
186  if (!g->is_subobject) {
187  if (!(ret = strcmp(g->name, "Header Extension")))
188  avio_skip(pb, 22); // skip reserved fields and Data Size
190  asf->unknown_size)) < 0)
191  return ret;
192  } else {
193  if (size < 24) {
194  av_log(s, AV_LOG_ERROR, "Too small size %"PRIu64" (< 24).\n", size);
195  return AVERROR_INVALIDDATA;
196  }
197  avio_skip(pb, size - 24);
198  }
199 
200  return 0;
201 }
202 
203 static int get_asf_string(AVIOContext *pb, int maxlen, char *buf, int buflen)
204 {
205  char *q = buf;
206  int ret = 0;
207  if (buflen <= 0)
208  return AVERROR(EINVAL);
209  while (ret + 1 < maxlen) {
210  uint8_t tmp;
211  uint32_t ch;
212  GET_UTF16(ch, (ret += 2) <= maxlen ? avio_rl16(pb) : 0, break;);
213  PUT_UTF8(ch, tmp, if (q - buf < buflen - 1) *q++ = tmp;)
214  }
215  *q = 0;
216 
217  return ret;
218 }
219 
221 {
222  ASFContext *asf = s->priv_data;
223  AVIOContext *pb = s->pb;
224  uint64_t size = avio_rl64(pb);
225  int i, nb_markers, ret;
226  size_t len;
227  char name[1024];
228 
229  avio_skip(pb, 8);
230  avio_skip(pb, 8); // skip reserved GUID
231  nb_markers = avio_rl32(pb);
232  avio_skip(pb, 2); // skip reserved field
233  len = avio_rl16(pb);
234  for (i = 0; i < len; i++)
235  avio_skip(pb, 1);
236 
237  for (i = 0; i < nb_markers; i++) {
238  int64_t pts;
239 
240  avio_skip(pb, 8);
241  pts = avio_rl64(pb);
242  pts -= asf->preroll * 10000;
243  avio_skip(pb, 2); // entry length
244  avio_skip(pb, 4); // send time
245  avio_skip(pb, 4); // flags
246  len = avio_rl32(pb);
247 
248  if (avio_feof(pb))
249  return AVERROR_INVALIDDATA;
250 
251  if ((ret = avio_get_str16le(pb, len, name,
252  sizeof(name))) < len)
253  avio_skip(pb, len - ret);
254  avpriv_new_chapter(s, i, (AVRational) { 1, 10000000 }, pts,
256  }
257  align_position(pb, asf->offset, size);
258 
259  return 0;
260 }
261 
262 static int asf_read_metadata(AVFormatContext *s, const char *title, uint16_t len,
263  unsigned char *ch, uint16_t buflen)
264 {
265  AVIOContext *pb = s->pb;
266 
267  avio_get_str16le(pb, len, ch, buflen);
268  if (ch[0]) {
269  if (av_dict_set(&s->metadata, title, ch, 0) < 0)
270  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
271  }
272 
273  return 0;
274 }
275 
277  uint16_t val_len, int type, AVDictionary **met)
278 {
279  int ret;
280  uint8_t *value;
281  uint16_t buflen = 2 * val_len + 1;
282  AVIOContext *pb = s->pb;
283 
284  value = av_malloc(buflen);
285  if (!value)
286  return AVERROR(ENOMEM);
287  if (type == ASF_UNICODE) {
288  // get_asf_string reads UTF-16 and converts it to UTF-8 which needs longer buffer
289  if ((ret = get_asf_string(pb, val_len, value, buflen)) < 0)
290  goto failed;
291  if (av_dict_set(met, name, value, 0) < 0)
292  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
293  } else {
294  char buf[256];
295  if (val_len > sizeof(buf)) {
297  goto failed;
298  }
299  if ((ret = avio_read(pb, value, val_len)) < 0)
300  goto failed;
301  if (ret < 2 * val_len)
302  value[ret] = '\0';
303  else
304  value[2 * val_len - 1] = '\0';
305  snprintf(buf, sizeof(buf), "%s", value);
306  if (av_dict_set(met, name, buf, 0) < 0)
307  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
308  }
309  av_freep(&value);
310 
311  return 0;
312 
313 failed:
314  av_freep(&value);
315  return ret;
316 }
317 static int asf_read_generic_value(AVIOContext *pb, int type, uint64_t *value)
318 {
319 
320  switch (type) {
321  case ASF_BOOL:
322  *value = avio_rl16(pb);
323  break;
324  case ASF_DWORD:
325  *value = avio_rl32(pb);
326  break;
327  case ASF_QWORD:
328  *value = avio_rl64(pb);
329  break;
330  case ASF_WORD:
331  *value = avio_rl16(pb);
332  break;
333  default:
334  return AVERROR_INVALIDDATA;
335  }
336 
337  return 0;
338 }
339 
341  int type, AVDictionary **met)
342 {
343  AVIOContext *pb = s->pb;
344  uint64_t value;
345  char buf[32];
346  int ret;
347 
349  if (ret < 0)
350  return ret;
351 
352  snprintf(buf, sizeof(buf), "%"PRIu64, value);
353  if (av_dict_set(met, name, buf, 0) < 0)
354  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
355 
356  return 0;
357 }
358 
359 /* MSDN claims that this should be "compatible with the ID3 frame, APIC",
360  * but in reality this is only loosely similar */
362 {
363  ASFContext *asf = s->priv_data;
364  AVPacket pkt = { 0 };
365  const CodecMime *mime = ff_id3v2_mime_tags;
366  enum AVCodecID id = AV_CODEC_ID_NONE;
367  char mimetype[64];
368  uint8_t *desc = NULL;
369  AVStream *st = NULL;
370  int ret, type, picsize, desc_len;
371  ASFStream *asf_st;
372 
373  /* type + picsize + mime + desc */
374  if (len < 1 + 4 + 2 + 2) {
375  av_log(s, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", len);
376  return AVERROR_INVALIDDATA;
377  }
378 
379  /* picture type */
380  type = avio_r8(s->pb);
381  len--;
383  av_log(s, AV_LOG_WARNING, "Unknown attached picture type: %d.\n", type);
384  type = 0;
385  }
386 
387  /* picture data size */
388  picsize = avio_rl32(s->pb);
389  len -= 4;
390 
391  /* picture MIME type */
392  len -= avio_get_str16le(s->pb, len, mimetype, sizeof(mimetype));
393  while (mime->id != AV_CODEC_ID_NONE) {
394  if (!strncmp(mime->str, mimetype, sizeof(mimetype))) {
395  id = mime->id;
396  break;
397  }
398  mime++;
399  }
400  if (id == AV_CODEC_ID_NONE) {
401  av_log(s, AV_LOG_ERROR, "Unknown attached picture mimetype: %s.\n",
402  mimetype);
403  return 0;
404  }
405 
406  if (picsize >= len) {
407  av_log(s, AV_LOG_ERROR, "Invalid attached picture data size: %d >= %d.\n",
408  picsize, len);
409  return AVERROR_INVALIDDATA;
410  }
411 
412  /* picture description */
413  desc_len = (len - picsize) * 2 + 1;
414  desc = av_malloc(desc_len);
415  if (!desc)
416  return AVERROR(ENOMEM);
417  len -= avio_get_str16le(s->pb, len - picsize, desc, desc_len);
418 
419  ret = av_get_packet(s->pb, &pkt, picsize);
420  if (ret < 0)
421  goto fail;
422 
423  st = avformat_new_stream(s, NULL);
424  if (!st) {
425  ret = AVERROR(ENOMEM);
426  goto fail;
427  }
428  asf->asf_st[asf->nb_streams] = av_mallocz(sizeof(*asf_st));
429  asf_st = asf->asf_st[asf->nb_streams];
430  if (!asf_st) {
431  ret = AVERROR(ENOMEM);
432  goto fail;
433  }
434 
436  st->codecpar->codec_type = asf_st->type = AVMEDIA_TYPE_VIDEO;
437  st->codecpar->codec_id = id;
438  st->attached_pic = pkt;
439  st->attached_pic.stream_index = asf_st->index = st->index;
441 
442  asf->nb_streams++;
443 
444  if (*desc) {
445  if (av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL) < 0)
446  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
447  } else
448  av_freep(&desc);
449 
450  if (av_dict_set(&st->metadata, "comment", ff_id3v2_picture_types[type], 0) < 0)
451  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
452 
453  return 0;
454 
455 fail:
456  av_freep(&desc);
458  return ret;
459 }
460 
461 static void get_id3_tag(AVFormatContext *s, int len)
462 {
463  ID3v2ExtraMeta *id3v2_extra_meta = NULL;
464 
465  ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, len);
466  if (id3v2_extra_meta) {
467  ff_id3v2_parse_apic(s, &id3v2_extra_meta);
468  ff_id3v2_parse_chapters(s, &id3v2_extra_meta);
469  }
470  ff_id3v2_free_extra_meta(&id3v2_extra_meta);
471 }
472 
473 static int process_metadata(AVFormatContext *s, const uint8_t *name, uint16_t name_len,
474  uint16_t val_len, uint16_t type, AVDictionary **met)
475 {
476  int ret;
477  ff_asf_guid guid;
478 
479  if (val_len) {
480  switch (type) {
481  case ASF_UNICODE:
482  asf_read_value(s, name, val_len, type, met);
483  break;
484  case ASF_BYTE_ARRAY:
485  if (!strcmp(name, "WM/Picture")) // handle cover art
486  asf_read_picture(s, val_len);
487  else if (!strcmp(name, "ID3")) // handle ID3 tag
488  get_id3_tag(s, val_len);
489  else
490  asf_read_value(s, name, val_len, type, met);
491  break;
492  case ASF_GUID:
493  ff_get_guid(s->pb, &guid);
494  break;
495  default:
496  if ((ret = asf_set_metadata(s, name, type, met)) < 0)
497  return ret;
498  break;
499  }
500  }
501 
502  return 0;
503 }
504 
506 {
507  ASFContext *asf = s->priv_data;
508  AVIOContext *pb = s->pb;
509  uint64_t size = avio_rl64(pb);
510  uint16_t nb_desc = avio_rl16(pb);
511  int i, ret;
512 
513  for (i = 0; i < nb_desc; i++) {
514  uint16_t name_len, type, val_len;
515  uint8_t *name = NULL;
516 
517  name_len = avio_rl16(pb);
518  if (!name_len)
519  return AVERROR_INVALIDDATA;
520  name = av_malloc(name_len);
521  if (!name)
522  return AVERROR(ENOMEM);
523  avio_get_str16le(pb, name_len, name,
524  name_len);
525  type = avio_rl16(pb);
526  // BOOL values are 16 bits long in the Metadata Object
527  // but 32 bits long in the Extended Content Description Object
528  if (type == ASF_BOOL)
529  type = ASF_DWORD;
530  val_len = avio_rl16(pb);
531 
532  ret = process_metadata(s, name, name_len, val_len, type, &s->metadata);
533  av_freep(&name);
534  if (ret < 0)
535  return ret;
536  }
537 
538  align_position(pb, asf->offset, size);
539  return 0;
540 }
541 
542 static AVStream *find_stream(AVFormatContext *s, uint16_t st_num)
543 {
544  AVStream *st = NULL;
545  ASFContext *asf = s->priv_data;
546  int i;
547 
548  for (i = 0; i < asf->nb_streams; i++) {
549  if (asf->asf_st[i]->stream_index == st_num) {
550  st = s->streams[asf->asf_st[i]->index];
551  break;
552  }
553  }
554 
555  return st;
556 }
557 
559 {
560  ASFContext *asf = s->priv_data;
561  AVIOContext *pb = s->pb;
562  uint64_t value = 0;
563  int ret;
564 
566  if (ret < 0)
567  return ret;
568 
569  if (st_num < ASF_MAX_STREAMS) {
570  if (!strcmp(name, "AspectRatioX"))
571  asf->asf_sd[st_num].aspect_ratio.num = value;
572  else
573  asf->asf_sd[st_num].aspect_ratio.den = value;
574  }
575  return 0;
576 }
577 
579 {
580  ASFContext *asf = s->priv_data;
581  AVIOContext *pb = s->pb;
582  uint64_t size = avio_rl64(pb);
583  uint16_t nb_recs = avio_rl16(pb); // number of records in the Description Records list
584  int i, ret;
585 
586  for (i = 0; i < nb_recs; i++) {
587  uint16_t name_len, buflen, type, val_len, st_num;
588  uint8_t *name = NULL;
589 
590  avio_skip(pb, 2); // skip reserved field
591  st_num = avio_rl16(pb);
592  name_len = avio_rl16(pb);
593  buflen = 2 * name_len + 1;
594  if (!name_len)
595  break;
596  type = avio_rl16(pb);
597  val_len = avio_rl32(pb);
598  name = av_malloc(buflen);
599  if (!name)
600  return AVERROR(ENOMEM);
601  avio_get_str16le(pb, name_len, name,
602  buflen);
603  if (!strcmp(name, "AspectRatioX") || !strcmp(name, "AspectRatioY")) {
604  ret = asf_store_aspect_ratio(s, st_num, name, type);
605  if (ret < 0) {
606  av_freep(&name);
607  break;
608  }
609  } else {
610  if (st_num < ASF_MAX_STREAMS) {
611  if ((ret = process_metadata(s, name, name_len, val_len, type,
612  &asf->asf_sd[st_num].asf_met)) < 0) {
613  av_freep(&name);
614  break;
615  }
616  }
617  }
618  av_freep(&name);
619  }
620 
621  align_position(pb, asf->offset, size);
622  return 0;
623 }
624 
626 {
627  ASFContext *asf = s->priv_data;
628  AVIOContext *pb = s->pb;
629  int i;
630  static const char *const titles[] =
631  { "Title", "Author", "Copyright", "Description", "Rate" };
632  uint16_t len[5], buflen[5] = { 0 };
633  uint8_t *ch;
634  uint64_t size = avio_rl64(pb);
635 
636  for (i = 0; i < 5; i++) {
637  len[i] = avio_rl16(pb);
638  // utf8 string should be <= 2 * utf16 string, extra byte for the terminator
639  buflen[i] = 2 * len[i] + 1;
640  }
641 
642  for (i = 0; i < 5; i++) {
643  ch = av_malloc(buflen[i]);
644  if (!ch)
645  return(AVERROR(ENOMEM));
646  asf_read_metadata(s, titles[i], len[i], ch, buflen[i]);
647  av_freep(&ch);
648  }
649  align_position(pb, asf->offset, size);
650 
651  return 0;
652 }
653 
655 {
656  ASFContext *asf = s->priv_data;
657  AVIOContext *pb = s->pb;
658  time_t creation_time;
659 
660  avio_rl64(pb); // read object size
661  avio_skip(pb, 16); // skip File ID
662  avio_skip(pb, 8); // skip File size
663  creation_time = avio_rl64(pb);
664  if (!(asf->b_flags & ASF_FLAG_BROADCAST)) {
665  struct tm tmbuf;
666  struct tm *tm;
667  char buf[64];
668 
669  // creation date is in 100 ns units from 1 Jan 1601, conversion to s
670  creation_time /= 10000000;
671  // there are 11644473600 seconds between 1 Jan 1601 and 1 Jan 1970
672  creation_time -= 11644473600;
673  tm = gmtime_r(&creation_time, &tmbuf);
674  if (tm) {
675  if (!strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm))
676  buf[0] = '\0';
677  } else
678  buf[0] = '\0';
679  if (buf[0]) {
680  if (av_dict_set(&s->metadata, "creation_time", buf, 0) < 0)
681  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
682  }
683  }
684  asf->nb_packets = avio_rl64(pb);
685  asf->duration = avio_rl64(pb) / 10000; // stream duration
686  avio_skip(pb, 8); // skip send duration
687  asf->preroll = avio_rl64(pb);
688  asf->duration -= asf->preroll;
689  asf->b_flags = avio_rl32(pb);
690  avio_skip(pb, 4); // skip minimal packet size
691  asf->packet_size = avio_rl32(pb);
692  avio_skip(pb, 4); // skip max_bitrate
693 
694  return 0;
695 }
696 
698 {
699  uint16_t size_asf; // ASF-specific Format Data size
700  uint32_t size_bmp; // BMP_HEADER-specific Format Data size
701  unsigned int tag;
702 
703  st->codecpar->width = avio_rl32(pb);
704  st->codecpar->height = avio_rl32(pb);
705  avio_skip(pb, 1); // skip reserved flags
706  size_asf = avio_rl16(pb);
707  tag = ff_get_bmp_header(pb, st, &size_bmp);
708  st->codecpar->codec_tag = tag;
710  size_bmp = FFMAX(size_asf, size_bmp);
711 
712  if (size_bmp > BMP_HEADER_SIZE) {
713  int ret = ff_get_extradata(avfmt, st->codecpar, pb, size_bmp - BMP_HEADER_SIZE);
714 
715  if (ret < 0)
716  return ret;
717  }
718  return 0;
719 }
720 
722 {
723  ASFContext *asf = s->priv_data;
724  AVIOContext *pb = s->pb;
725  uint64_t size;
726  uint32_t err_data_len, ts_data_len; // type specific data length
727  uint16_t flags;
728  ff_asf_guid stream_type;
729  enum AVMediaType type;
730  int i, ret;
731  uint8_t stream_index;
732  AVStream *st;
733  ASFStream *asf_st;
734 
735  // ASF file must not contain more than 128 streams according to the specification
736  if (asf->nb_streams >= ASF_MAX_STREAMS)
737  return AVERROR_INVALIDDATA;
738 
739  size = avio_rl64(pb);
740  ff_get_guid(pb, &stream_type);
741  if (!ff_guidcmp(&stream_type, &ff_asf_audio_stream))
743  else if (!ff_guidcmp(&stream_type, &ff_asf_video_stream))
745  else if (!ff_guidcmp(&stream_type, &ff_asf_jfif_media))
747  else if (!ff_guidcmp(&stream_type, &ff_asf_command_stream))
749  else if (!ff_guidcmp(&stream_type,
752  else
753  return AVERROR_INVALIDDATA;
754 
755  ff_get_guid(pb, &stream_type); // error correction type
756  avio_skip(pb, 8); // skip the time offset
757  ts_data_len = avio_rl32(pb);
758  err_data_len = avio_rl32(pb);
759  flags = avio_rl16(pb); // bit 15 - Encrypted Content
760 
761  stream_index = flags & ASF_STREAM_NUM;
762  for (i = 0; i < asf->nb_streams; i++)
763  if (stream_index == asf->asf_st[i]->stream_index) {
765  "Duplicate stream found, this stream will be ignored.\n");
766  align_position(pb, asf->offset, size);
767  return 0;
768  }
769 
770  st = avformat_new_stream(s, NULL);
771  if (!st)
772  return AVERROR(ENOMEM);
773  avpriv_set_pts_info(st, 32, 1, 1000); // pts should be dword, in milliseconds
774  st->codecpar->codec_type = type;
775  asf->asf_st[asf->nb_streams] = av_mallocz(sizeof(*asf_st));
776  if (!asf->asf_st[asf->nb_streams])
777  return AVERROR(ENOMEM);
778  asf_st = asf->asf_st[asf->nb_streams];
779  asf->nb_streams++;
780  asf_st->stream_index = stream_index;
781  asf_st->index = st->index;
782  asf_st->indexed = 0;
783  st->id = flags & ASF_STREAM_NUM;
784  av_init_packet(&asf_st->pkt.avpkt);
785  asf_st->pkt.data_size = 0;
786  avio_skip(pb, 4); // skip reserved field
787 
788  switch (type) {
789  case AVMEDIA_TYPE_AUDIO:
790  asf_st->type = AVMEDIA_TYPE_AUDIO;
791  if ((ret = ff_get_wav_header(s, pb, st->codecpar, ts_data_len, 0)) < 0)
792  return ret;
793  break;
794  case AVMEDIA_TYPE_VIDEO:
795  asf_st->type = AVMEDIA_TYPE_VIDEO;
796  if ((ret = parse_video_info(s, pb, st)) < 0)
797  return ret;
798  break;
799  default:
800  avio_skip(pb, ts_data_len);
801  break;
802  }
803 
804  if (err_data_len) {
805  if (type == AVMEDIA_TYPE_AUDIO) {
806  uint8_t span = avio_r8(pb);
807  if (span > 1) {
808  asf_st->span = span;
809  asf_st->virtual_pkt_len = avio_rl16(pb);
810  asf_st->virtual_chunk_len = avio_rl16(pb);
811  if (!asf_st->virtual_chunk_len || !asf_st->virtual_pkt_len)
812  return AVERROR_INVALIDDATA;
813  avio_skip(pb, err_data_len - 5);
814  } else
815  avio_skip(pb, err_data_len - 1);
816  } else
817  avio_skip(pb, err_data_len);
818  }
819 
820  align_position(pb, asf->offset, size);
821 
822  return 0;
823 }
824 
825 static void set_language(AVFormatContext *s, const char *rfc1766, AVDictionary **met)
826 {
827  // language abbr should contain at least 2 chars
828  if (rfc1766 && strlen(rfc1766) > 1) {
829  const char primary_tag[3] = { rfc1766[0], rfc1766[1], '\0' }; // ignore country code if any
830  const char *iso6392 = ff_convert_lang_to(primary_tag,
832  if (iso6392)
833  if (av_dict_set(met, "language", iso6392, 0) < 0)
834  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
835  }
836 }
837 
839 {
840  ASFContext *asf = s->priv_data;
841  AVIOContext *pb = s->pb;
842  AVStream *st = NULL;
843  ff_asf_guid guid;
844  uint16_t nb_st_name, nb_pay_exts, st_num, lang_idx;
845  int i, ret;
846  uint32_t bitrate;
847  uint64_t start_time, end_time, time_per_frame;
848  uint64_t size = avio_rl64(pb);
849 
850  start_time = avio_rl64(pb);
851  end_time = avio_rl64(pb);
852  bitrate = avio_rl32(pb);
853  avio_skip(pb, 28); // skip some unused values
854  st_num = avio_rl16(pb);
855  st_num &= ASF_STREAM_NUM;
856  lang_idx = avio_rl16(pb); // Stream Language ID Index
857  for (i = 0; i < asf->nb_streams; i++) {
858  if (st_num == asf->asf_st[i]->stream_index) {
859  st = s->streams[asf->asf_st[i]->index];
860  asf->asf_st[i]->lang_idx = lang_idx;
861  break;
862  }
863  }
864  time_per_frame = avio_rl64(pb); // average time per frame
865  if (st) {
866  st->start_time = start_time;
867  st->duration = end_time - start_time;
868  st->codecpar->bit_rate = bitrate;
869  st->avg_frame_rate.num = 10000000;
870  st->avg_frame_rate.den = time_per_frame;
871  }
872  nb_st_name = avio_rl16(pb);
873  nb_pay_exts = avio_rl16(pb);
874  for (i = 0; i < nb_st_name; i++) {
875  uint16_t len;
876 
877  avio_rl16(pb); // Language ID Index
878  len = avio_rl16(pb);
879  avio_skip(pb, len);
880  }
881 
882  for (i = 0; i < nb_pay_exts; i++) {
883  uint32_t len;
884  avio_skip(pb, 16); // Extension System ID
885  avio_skip(pb, 2); // Extension Data Size
886  len = avio_rl32(pb);
887  avio_skip(pb, len);
888  }
889 
890  if ((ret = ff_get_guid(pb, &guid)) < 0) {
891  align_position(pb, asf->offset, size);
892 
893  return 0;
894  }
895 
896  g = find_guid(guid);
897  if (g && !(strcmp(g->name, "Stream Properties"))) {
898  if ((ret = g->read_object(s, g)) < 0)
899  return ret;
900  }
901 
902  align_position(pb, asf->offset, size);
903  return 0;
904 }
905 
907 {
908  ASFContext *asf = s->priv_data;
909  AVIOContext *pb = s->pb;
910  int i, ret;
911  uint64_t size = avio_rl64(pb);
912  uint16_t nb_langs = avio_rl16(pb);
913 
914  if (nb_langs < ASF_MAX_STREAMS) {
915  for (i = 0; i < nb_langs; i++) {
916  size_t len;
917  len = avio_r8(pb);
918  if (!len)
919  len = 6;
920  if ((ret = get_asf_string(pb, len, asf->asf_sd[i].langs,
921  sizeof(asf->asf_sd[i].langs))) < 0) {
922  return ret;
923  }
924  }
925  }
926 
927  align_position(pb, asf->offset, size);
928  return 0;
929 }
930 
931 // returns data object offset when reading this object for the first time
933 {
934  ASFContext *asf = s->priv_data;
935  AVIOContext *pb = s->pb;
936  uint64_t size = asf->data_size = avio_rl64(pb);
937  int i;
938 
939  if (!asf->data_reached) {
940  asf->data_reached = 1;
941  asf->data_offset = asf->offset;
942  }
943 
944  for (i = 0; i < asf->nb_streams; i++) {
945  if (!(asf->b_flags & ASF_FLAG_BROADCAST))
946  s->streams[i]->duration = asf->duration;
947  }
948  asf->nb_mult_left = 0;
949  asf->sub_left = 0;
950  asf->state = PARSE_PACKET_HEADER;
951  asf->return_subpayload = 0;
952  asf->packet_size_internal = 0;
953  avio_skip(pb, 16); // skip File ID
954  size = avio_rl64(pb); // Total Data Packets
955  if (size != asf->nb_packets)
957  "Number of Packets from File Properties Object is not equal to Total"
958  "Datapackets value! num of packets %"PRIu64" total num %"PRIu64".\n",
959  size, asf->nb_packets);
960  avio_skip(pb, 2); // skip reserved field
961  asf->first_packet_offset = avio_tell(pb);
962  if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !(asf->b_flags & ASF_FLAG_BROADCAST))
963  align_position(pb, asf->offset, asf->data_size);
964 
965  return 0;
966 }
967 
969 {
970  ASFContext *asf = s->priv_data;
971  AVIOContext *pb = s->pb;
972  AVStream *st = NULL;
973  uint64_t interval; // index entry time interval in 100 ns units, usually it's 1s
974  uint32_t pkt_num, nb_entries;
975  int32_t prev_pkt_num = -1;
976  int i;
977  int64_t offset;
978  uint64_t size = avio_rl64(pb);
979 
980  // simple index objects should be ordered by stream number, this loop tries to find
981  // the first not indexed video stream
982  for (i = 0; i < asf->nb_streams; i++) {
983  if ((asf->asf_st[i]->type == AVMEDIA_TYPE_VIDEO) && !asf->asf_st[i]->indexed) {
984  asf->asf_st[i]->indexed = 1;
985  st = s->streams[asf->asf_st[i]->index];
986  break;
987  }
988  }
989  if (!st) {
990  avio_skip(pb, size - 24); // if there's no video stream, skip index object
991  return 0;
992  }
993  avio_skip(pb, 16); // skip File ID
994  interval = avio_rl64(pb);
995  avio_skip(pb, 4);
996  nb_entries = avio_rl32(pb);
997  for (i = 0; i < nb_entries; i++) {
998  pkt_num = avio_rl32(pb);
999  offset = avio_skip(pb, 2);
1000  if (offset < 0) {
1001  av_log(s, AV_LOG_ERROR, "Skipping failed in asf_read_simple_index.\n");
1002  return offset;
1003  }
1004  if (prev_pkt_num != pkt_num) {
1006  pkt_num, av_rescale(interval, i, 10000),
1007  asf->packet_size, 0, AVINDEX_KEYFRAME);
1008  prev_pkt_num = pkt_num;
1009  }
1010  }
1011  asf->is_simple_index = 1;
1012  align_position(pb, asf->offset, size);
1013 
1014  return 0;
1015 }
1016 
1017 static const GUIDParseTable gdef[] = {
1018  { "Data", { 0x75, 0xB2, 0x26, 0x36, 0x66, 0x8E, 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_data, 1 },
1019  { "Simple Index", { 0x33, 0x00, 0x08, 0x90, 0xE5, 0xB1, 0x11, 0xCF, 0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB }, asf_read_simple_index, 1 },
1020  { "Content Description", { 0x75, 0xB2, 0x26, 0x33, 0x66 ,0x8E, 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_content_desc, 1 },
1021  { "Extended Content Description", { 0xD2, 0xD0, 0xA4, 0x40, 0xE3, 0x07, 0x11, 0xD2, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5e, 0xA8, 0x50 }, asf_read_ext_content, 1 },
1022  { "Stream Bitrate Properties", { 0x7B, 0xF8, 0x75, 0xCE, 0x46, 0x8D, 0x11, 0xD1, 0x8D, 0x82, 0x00, 0x60, 0x97, 0xC9, 0xA2, 0xB2 }, asf_read_unknown, 1 },
1023  { "File Properties", { 0x8C, 0xAB, 0xDC, 0xA1, 0xA9, 0x47, 0x11, 0xCF, 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_properties, 1 },
1024  { "Header Extension", { 0x5F, 0xBF, 0x03, 0xB5, 0xA9, 0x2E, 0x11, 0xCF, 0x8E, 0xE3, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_unknown, 0 },
1025  { "Stream Properties", { 0xB7, 0xDC, 0x07, 0x91, 0xA9, 0xB7, 0x11, 0xCF, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_stream_properties, 1 },
1026  { "Codec List", { 0x86, 0xD1, 0x52, 0x40, 0x31, 0x1D, 0x11, 0xD0, 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, asf_read_unknown, 1 },
1027  { "Marker", { 0xF4, 0x87, 0xCD, 0x01, 0xA9, 0x51, 0x11, 0xCF, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_marker, 1 },
1028  { "Script Command", { 0x1E, 0xFB, 0x1A, 0x30, 0x0B, 0x62, 0x11, 0xD0, 0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, asf_read_unknown, 1 },
1029  { "Language List", { 0x7C, 0x43, 0x46, 0xa9, 0xef, 0xe0, 0x4B, 0xFC, 0xB2, 0x29, 0x39, 0x3e, 0xde, 0x41, 0x5c, 0x85 }, asf_read_language_list, 1},
1030  { "Padding", { 0x18, 0x06, 0xD4, 0x74, 0xCA, 0xDF, 0x45, 0x09, 0xA4, 0xBA, 0x9A, 0xAB, 0xCB, 0x96, 0xAA, 0xE8 }, asf_read_unknown, 1 },
1031  { "DRMv1 Header", { 0x22, 0x11, 0xB3, 0xFB, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1032  { "DRMv2 Header", { 0x29, 0x8A, 0xE6, 0x14, 0x26, 0x22, 0x4C, 0x17, 0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9c }, asf_read_unknown, 1 },
1033  { "Index", { 0xD6, 0xE2, 0x29, 0xD3, 0x35, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1034  { "Media Object Index", { 0xFE, 0xB1, 0x03, 0xF8, 0x12, 0xAD, 0x4C, 0x64, 0x84, 0x0F, 0x2A, 0x1D, 0x2F, 0x7A, 0xD4, 0x8C }, asf_read_unknown, 1 },
1035  { "Timecode Index", { 0x3C, 0xB7, 0x3F, 0xD0, 0x0C, 0x4A, 0x48, 0x03, 0x95, 0x3D, 0xED, 0xF7, 0xB6, 0x22, 0x8F, 0x0C }, asf_read_unknown, 0 },
1036  { "Bitrate_Mutual_Exclusion", { 0xD6, 0xE2, 0x29, 0xDC, 0x35, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1037  { "Error Correction", { 0x75, 0xB2, 0x26, 0x35, 0x66, 0x8E, 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_unknown, 1 },
1038  { "Content Branding", { 0x22, 0x11, 0xB3, 0xFA, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1039  { "Content Encryption", { 0x22, 0x11, 0xB3, 0xFB, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1040  { "Extended Content Encryption", { 0x29, 0x8A, 0xE6, 0x14, 0x26, 0x22, 0x4C, 0x17, 0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9C }, asf_read_unknown, 1 },
1041  { "Digital Signature", { 0x22, 0x11, 0xB3, 0xFC, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1042  { "Extended Stream Properties", { 0x14, 0xE6, 0xA5, 0xCB, 0xC6, 0x72, 0x43, 0x32, 0x83, 0x99, 0xA9, 0x69, 0x52, 0x06, 0x5B, 0x5A }, asf_read_ext_stream_properties, 1 },
1043  { "Advanced Mutual Exclusion", { 0xA0, 0x86, 0x49, 0xCF, 0x47, 0x75, 0x46, 0x70, 0x8A, 0x16, 0x6E, 0x35, 0x35, 0x75, 0x66, 0xCD }, asf_read_unknown, 1 },
1044  { "Group Mutual Exclusion", { 0xD1, 0x46, 0x5A, 0x40, 0x5A, 0x79, 0x43, 0x38, 0xB7, 0x1B, 0xE3, 0x6B, 0x8F, 0xD6, 0xC2, 0x49 }, asf_read_unknown, 1},
1045  { "Stream Prioritization", { 0xD4, 0xFE, 0xD1, 0x5B, 0x88, 0xD3, 0x45, 0x4F, 0x81, 0xF0, 0xED, 0x5C, 0x45, 0x99, 0x9E, 0x24 }, asf_read_unknown, 1 },
1046  { "Bandwidth Sharing Object", { 0xA6, 0x96, 0x09, 0xE6, 0x51, 0x7B, 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, asf_read_unknown, 1 },
1047  { "Metadata", { 0xC5, 0xF8, 0xCB, 0xEA, 0x5B, 0xAF, 0x48, 0x77, 0x84, 0x67, 0xAA, 0x8C, 0x44, 0xFA, 0x4C, 0xCA }, asf_read_metadata_obj, 1 },
1048  { "Metadata Library", { 0x44, 0x23, 0x1C, 0x94, 0x94, 0x98, 0x49, 0xD1, 0xA1, 0x41, 0x1D, 0x13, 0x4E, 0x45, 0x70, 0x54 }, asf_read_metadata_obj, 1 },
1049  { "Audio Spread", { 0xBF, 0xC3, 0xCD, 0x50, 0x61, 0x8F, 0x11, 0xCF, 0x8B, 0xB2, 0x00, 0xAA, 0x00, 0xB4, 0xE2, 0x20 }, asf_read_unknown, 1 },
1050  { "Index Parameters", { 0xD6, 0xE2, 0x29, 0xDF, 0x35, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1051  { "Content Encryption System Windows Media DRM Network Devices",
1052  { 0x7A, 0x07, 0x9B, 0xB6, 0xDA, 0XA4, 0x4e, 0x12, 0xA5, 0xCA, 0x91, 0xD3, 0x8D, 0xC1, 0x1A, 0x8D }, asf_read_unknown, 1 },
1053  { "Mutex Language", { 0xD6, 0xE2, 0x2A, 0x00, 0x25, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1054  { "Mutex Bitrate", { 0xD6, 0xE2, 0x2A, 0x01, 0x25, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1055  { "Mutex Unknown", { 0xD6, 0xE2, 0x2A, 0x02, 0x25, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1056  { "Bandwidth Sharing Exclusive", { 0xAF, 0x60, 0x60, 0xAA, 0x51, 0x97, 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, asf_read_unknown, 1 },
1057  { "Bandwidth Sharing Partial", { 0xAF, 0x60, 0x60, 0xAB, 0x51, 0x97, 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, asf_read_unknown, 1 },
1058  { "Payload Extension System Timecode", { 0x39, 0x95, 0x95, 0xEC, 0x86, 0x67, 0x4E, 0x2D, 0x8F, 0xDB, 0x98, 0x81, 0x4C, 0xE7, 0x6C, 0x1E }, asf_read_unknown, 1 },
1059  { "Payload Extension System File Name", { 0xE1, 0x65, 0xEC, 0x0E, 0x19, 0xED, 0x45, 0xD7, 0xB4, 0xA7, 0x25, 0xCB, 0xD1, 0xE2, 0x8E, 0x9B }, asf_read_unknown, 1 },
1060  { "Payload Extension System Content Type", { 0xD5, 0x90, 0xDC, 0x20, 0x07, 0xBC, 0x43, 0x6C, 0x9C, 0xF7, 0xF3, 0xBB, 0xFB, 0xF1, 0xA4, 0xDC }, asf_read_unknown, 1 },
1061  { "Payload Extension System Pixel Aspect Ratio", { 0x1, 0x1E, 0xE5, 0x54, 0xF9, 0xEA, 0x4B, 0xC8, 0x82, 0x1A, 0x37, 0x6B, 0x74, 0xE4, 0xC4, 0xB8 }, asf_read_unknown, 1 },
1062  { "Payload Extension System Sample Duration", { 0xC6, 0xBD, 0x94, 0x50, 0x86, 0x7F, 0x49, 0x07, 0x83, 0xA3, 0xC7, 0x79, 0x21, 0xB7, 0x33, 0xAD }, asf_read_unknown, 1 },
1063  { "Payload Extension System Encryption Sample ID", { 0x66, 0x98, 0xB8, 0x4E, 0x0A, 0xFA, 0x43, 0x30, 0xAE, 0xB2, 0x1C, 0x0A, 0x98, 0xD7, 0xA4, 0x4D }, asf_read_unknown, 1 },
1064  { "Payload Extension System Degradable JPEG", { 0x00, 0xE1, 0xAF, 0x06, 0x7B, 0xEC, 0x11, 0xD1, 0xA5, 0x82, 0x00, 0xC0, 0x4F, 0xC2, 0x9C, 0xFB }, asf_read_unknown, 1 },
1065 };
1066 
1067 #define READ_LEN(flag, name, len) \
1068  do { \
1069  if ((flag) == name ## IS_BYTE) \
1070  len = avio_r8(pb); \
1071  else if ((flag) == name ## IS_WORD) \
1072  len = avio_rl16(pb); \
1073  else if ((flag) == name ## IS_DWORD) \
1074  len = avio_rl32(pb); \
1075  else \
1076  len = 0; \
1077  } while(0)
1078 
1079 static int asf_read_subpayload(AVFormatContext *s, AVPacket *pkt, int is_header)
1080 {
1081  ASFContext *asf = s->priv_data;
1082  AVIOContext *pb = s->pb;
1083  uint8_t sub_len;
1084  int ret, i;
1085 
1086  if (is_header) {
1087  asf->dts_delta = avio_r8(pb);
1088  if (asf->nb_mult_left) {
1089  asf->mult_sub_len = avio_rl16(pb); // total
1090  }
1091  asf->sub_header_offset = avio_tell(pb);
1092  asf->nb_sub = 0;
1093  asf->sub_left = 1;
1094  }
1095  sub_len = avio_r8(pb);
1096  if ((ret = av_get_packet(pb, pkt, sub_len)) < 0) // each subpayload is entire frame
1097  return ret;
1098  for (i = 0; i < asf->nb_streams; i++) {
1099  if (asf->stream_index == asf->asf_st[i]->stream_index) {
1100  pkt->stream_index = asf->asf_st[i]->index;
1101  break;
1102  }
1103  }
1104  asf->return_subpayload = 1;
1105  if (!sub_len)
1106  asf->return_subpayload = 0;
1107 
1108  if (sub_len)
1109  asf->nb_sub++;
1110  pkt->dts = asf->sub_dts + (asf->nb_sub - 1) * asf->dts_delta - asf->preroll;
1111  if (asf->nb_mult_left && (avio_tell(pb) >=
1112  (asf->sub_header_offset + asf->mult_sub_len))) {
1113  asf->sub_left = 0;
1114  asf->nb_mult_left--;
1115  }
1116  if (avio_tell(pb) >= asf->packet_offset + asf->packet_size - asf->pad_len) {
1117  asf->sub_left = 0;
1118  if (!asf->nb_mult_left) {
1119  avio_skip(pb, asf->pad_len);
1120  if (avio_tell(pb) != asf->packet_offset + asf->packet_size) {
1121  if (!asf->packet_size)
1122  return AVERROR_INVALIDDATA;
1124  "Position %"PRId64" wrong, should be %"PRId64"\n",
1125  avio_tell(pb), asf->packet_offset + asf->packet_size);
1126  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1127  }
1128  }
1129  }
1130 
1131  return 0;
1132 }
1133 
1134 static void reset_packet(ASFPacket *asf_pkt)
1135 {
1136  asf_pkt->size_left = 0;
1137  asf_pkt->data_size = 0;
1138  asf_pkt->duration = 0;
1139  asf_pkt->flags = 0;
1140  asf_pkt->dts = 0;
1141  asf_pkt->duration = 0;
1142  av_packet_unref(&asf_pkt->avpkt);
1143  av_init_packet(&asf_pkt->avpkt);
1144 }
1145 
1147 {
1148  ASFContext *asf = s->priv_data;
1149  AVIOContext *pb = s->pb;
1150  int ret, data_size;
1151 
1152  if (!asf_pkt->data_size) {
1153  data_size = avio_rl32(pb); // read media object size
1154  if (data_size <= 0)
1155  return AVERROR_INVALIDDATA;
1156  if ((ret = av_new_packet(&asf_pkt->avpkt, data_size)) < 0)
1157  return ret;
1158  asf_pkt->data_size = asf_pkt->size_left = data_size;
1159  } else
1160  avio_skip(pb, 4); // reading of media object size is already done
1161  asf_pkt->dts = avio_rl32(pb); // read presentation time
1162  if (asf->rep_data_len && (asf->rep_data_len >= 8))
1163  avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
1164 
1165  return 0;
1166 }
1167 
1169  ASFPacket *asf_pkt)
1170 {
1171  ASFContext *asf = s->priv_data;
1172  AVIOContext *pb = s->pb;
1173  uint16_t pay_len;
1174  unsigned char *p;
1175  int ret;
1176  int skip = 0;
1177 
1178  // if replicated length is 1, subpayloads are present
1179  if (asf->rep_data_len == 1) {
1180  asf->sub_left = 1;
1181  asf->state = READ_MULTI_SUB;
1182  pkt->flags = asf_pkt->flags;
1183  if ((ret = asf_read_subpayload(s, pkt, 1)) < 0)
1184  return ret;
1185  } else {
1186  if (asf->rep_data_len)
1187  if ((ret = asf_read_replicated_data(s, asf_pkt)) < 0)
1188  return ret;
1189  pay_len = avio_rl16(pb); // payload length should be WORD
1190  if (pay_len > asf->packet_size) {
1192  "Error: invalid data packet size, pay_len %"PRIu16", "
1193  "asf->packet_size %"PRIu32", offset %"PRId64".\n",
1194  pay_len, asf->packet_size, avio_tell(pb));
1195  return AVERROR_INVALIDDATA;
1196  }
1197  p = asf_pkt->avpkt.data + asf_pkt->data_size - asf_pkt->size_left;
1198  if (pay_len > asf_pkt->size_left) {
1200  "Error: invalid buffer size, pay_len %d, data size left %d.\n",
1201  pay_len, asf_pkt->size_left);
1202  skip = pay_len - asf_pkt->size_left;
1203  pay_len = asf_pkt->size_left;
1204  }
1205  if (asf_pkt->size_left <= 0)
1206  return AVERROR_INVALIDDATA;
1207  if ((ret = avio_read(pb, p, pay_len)) < 0)
1208  return ret;
1209  if (s->key && s->keylen == 20)
1210  ff_asfcrypt_dec(s->key, p, ret);
1211  avio_skip(pb, skip);
1212  asf_pkt->size_left -= pay_len;
1213  asf->nb_mult_left--;
1214  }
1215 
1216  return 0;
1217 }
1218 
1220 {
1221  ASFContext *asf = s->priv_data;
1222  AVIOContext *pb = s->pb;
1223  int64_t offset;
1224  uint64_t size;
1225  unsigned char *p;
1226  int ret, data_size;
1227 
1228  if (!asf_pkt->data_size) {
1229  data_size = avio_rl32(pb); // read media object size
1230  if (data_size <= 0)
1231  return AVERROR_EOF;
1232  if ((ret = av_new_packet(&asf_pkt->avpkt, data_size)) < 0)
1233  return ret;
1234  asf_pkt->data_size = asf_pkt->size_left = data_size;
1235  } else
1236  avio_skip(pb, 4); // skip media object size
1237  asf_pkt->dts = avio_rl32(pb); // read presentation time
1238  if (asf->rep_data_len >= 8)
1239  avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
1240  offset = avio_tell(pb);
1241 
1242  // size of the payload - size of the packet without header and padding
1243  if (asf->packet_size_internal)
1244  size = asf->packet_size_internal - offset + asf->packet_offset - asf->pad_len;
1245  else
1246  size = asf->packet_size - offset + asf->packet_offset - asf->pad_len;
1247  if (size > asf->packet_size) {
1249  "Error: invalid data packet size, offset %"PRId64".\n",
1250  avio_tell(pb));
1251  return AVERROR_INVALIDDATA;
1252  }
1253  p = asf_pkt->avpkt.data + asf_pkt->data_size - asf_pkt->size_left;
1254  if (size > asf_pkt->size_left || asf_pkt->size_left <= 0)
1255  return AVERROR_INVALIDDATA;
1256  if (asf_pkt->size_left > size)
1257  asf_pkt->size_left -= size;
1258  else
1259  asf_pkt->size_left = 0;
1260  if ((ret = avio_read(pb, p, size)) < 0)
1261  return ret;
1262  if (s->key && s->keylen == 20)
1263  ff_asfcrypt_dec(s->key, p, ret);
1264  if (asf->packet_size_internal)
1265  avio_skip(pb, asf->packet_size - asf->packet_size_internal);
1266  avio_skip(pb, asf->pad_len); // skip padding
1267 
1268  return 0;
1269 }
1270 
1272 {
1273  ASFContext *asf = s->priv_data;
1274  AVIOContext *pb = s->pb;
1275  int ret, i;
1276  ASFPacket *asf_pkt = NULL;
1277 
1278  if (!asf->sub_left) {
1279  uint32_t off_len, media_len;
1280  uint8_t stream_num;
1281 
1282  stream_num = avio_r8(pb);
1283  asf->stream_index = stream_num & ASF_STREAM_NUM;
1284  for (i = 0; i < asf->nb_streams; i++) {
1285  if (asf->stream_index == asf->asf_st[i]->stream_index) {
1286  asf_pkt = &asf->asf_st[i]->pkt;
1287  asf_pkt->stream_index = asf->asf_st[i]->index;
1288  break;
1289  }
1290  }
1291  if (!asf_pkt) {
1292  if (asf->packet_offset + asf->packet_size <= asf->data_offset + asf->data_size) {
1293  if (!asf->packet_size) {
1294  av_log(s, AV_LOG_ERROR, "Invalid packet size 0.\n");
1295  return AVERROR_INVALIDDATA;
1296  }
1297  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1298  av_log(s, AV_LOG_WARNING, "Skipping the stream with the invalid stream index %d.\n",
1299  asf->stream_index);
1300  return AVERROR(EAGAIN);
1301  } else
1302  return AVERROR_INVALIDDATA;
1303  }
1304 
1305  if (stream_num >> 7)
1306  asf_pkt->flags |= AV_PKT_FLAG_KEY;
1308  ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_, media_len);
1310  ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_, off_len);
1312  ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_, asf->rep_data_len);
1313  if (asf_pkt->size_left && (asf_pkt->frame_num != media_len)) {
1314  av_log(s, AV_LOG_WARNING, "Unfinished frame will be ignored\n");
1315  reset_packet(asf_pkt);
1316  }
1317  asf_pkt->frame_num = media_len;
1318  asf->sub_dts = off_len;
1319  if (asf->nb_mult_left) {
1320  if ((ret = asf_read_multiple_payload(s, pkt, asf_pkt)) < 0)
1321  return ret;
1322  } else if (asf->rep_data_len == 1) {
1323  asf->sub_left = 1;
1324  asf->state = READ_SINGLE;
1325  pkt->flags = asf_pkt->flags;
1326  if ((ret = asf_read_subpayload(s, pkt, 1)) < 0)
1327  return ret;
1328  } else {
1329  if ((ret = asf_read_single_payload(s, asf_pkt)) < 0)
1330  return ret;
1331  }
1332  } else {
1333  for (i = 0; i <= asf->nb_streams; i++) {
1334  if (asf->stream_index == asf->asf_st[i]->stream_index) {
1335  asf_pkt = &asf->asf_st[i]->pkt;
1336  break;
1337  }
1338  }
1339  if (!asf_pkt)
1340  return AVERROR_INVALIDDATA;
1341  pkt->flags = asf_pkt->flags;
1342  pkt->dts = asf_pkt->dts;
1343  pkt->stream_index = asf->asf_st[i]->index;
1344  if ((ret = asf_read_subpayload(s, pkt, 0)) < 0) // read subpayload without its header
1345  return ret;
1346  }
1347 
1348  return 0;
1349 }
1350 
1352 {
1353  ASFContext *asf = s->priv_data;
1354  AVIOContext *pb = s->pb;
1355  uint64_t size;
1356  uint32_t av_unused seq;
1357  unsigned char error_flags, len_flags, pay_flags;
1358 
1359  asf->packet_offset = avio_tell(pb);
1360  error_flags = avio_r8(pb); // read Error Correction Flags
1361  if (error_flags & ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT) {
1362  if (!(error_flags & ASF_ERROR_CORRECTION_LENGTH_TYPE)) {
1364  avio_skip(pb, size);
1365  }
1366  len_flags = avio_r8(pb);
1367  } else
1368  len_flags = error_flags;
1369  asf->prop_flags = avio_r8(pb);
1371  ASF_PPI_FLAG_PACKET_LENGTH_FIELD_, asf->packet_size_internal);
1373  ASF_PPI_FLAG_SEQUENCE_FIELD_, seq);
1375  ASF_PPI_FLAG_PADDING_LENGTH_FIELD_, asf->pad_len );
1376  asf->send_time = avio_rl32(pb); // send time
1377  avio_skip(pb, 2); // skip duration
1378  if (len_flags & ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT) { // Multiple Payloads present
1379  pay_flags = avio_r8(pb);
1380  asf->nb_mult_left = (pay_flags & ASF_NUM_OF_PAYLOADS);
1381  }
1382 
1383  return 0;
1384 }
1385 
1386 static int asf_deinterleave(AVFormatContext *s, ASFPacket *asf_pkt, int st_num)
1387 {
1388  ASFContext *asf = s->priv_data;
1389  ASFStream *asf_st = asf->asf_st[st_num];
1390  unsigned char *p = asf_pkt->avpkt.data;
1391  uint16_t pkt_len = asf->asf_st[st_num]->virtual_pkt_len;
1392  uint16_t chunk_len = asf->asf_st[st_num]->virtual_chunk_len;
1393  int nchunks = pkt_len / chunk_len;
1394  AVPacket pkt;
1395  int pos = 0, j, l, ret;
1396 
1397 
1398  if ((ret = av_new_packet(&pkt, asf_pkt->data_size)) < 0)
1399  return ret;
1400 
1401  while (asf_pkt->data_size >= asf_st->span * pkt_len + pos) {
1402  if (pos >= asf_pkt->data_size) {
1403  break;
1404  }
1405  for (l = 0; l < pkt_len; l++) {
1406  if (pos >= asf_pkt->data_size) {
1407  break;
1408  }
1409  for (j = 0; j < asf_st->span; j++) {
1410  if ((pos + chunk_len) >= asf_pkt->data_size)
1411  break;
1412  memcpy(pkt.data + pos,
1413  p + (j * nchunks + l) * chunk_len,
1414  chunk_len);
1415  pos += chunk_len;
1416  }
1417  }
1418  p += asf_st->span * pkt_len;
1419  if (p > asf_pkt->avpkt.data + asf_pkt->data_size)
1420  break;
1421  }
1422  av_packet_unref(&asf_pkt->avpkt);
1423  asf_pkt->avpkt = pkt;
1424 
1425  return 0;
1426 }
1427 
1429 {
1430  ASFContext *asf = s->priv_data;
1431  AVIOContext *pb = s->pb;
1432  int ret, i;
1433 
1434  if ((avio_tell(pb) >= asf->data_offset + asf->data_size) &&
1435  !(asf->b_flags & ASF_FLAG_BROADCAST))
1436  return AVERROR_EOF;
1437  while (!pb->eof_reached) {
1438  if (asf->state == PARSE_PACKET_HEADER) {
1440  if (pb->eof_reached)
1441  break;
1442  if (!asf->nb_mult_left)
1443  asf->state = READ_SINGLE;
1444  else
1445  asf->state = READ_MULTI;
1446  }
1447  ret = asf_read_payload(s, pkt);
1448  if (ret == AVERROR(EAGAIN)) {
1449  asf->state = PARSE_PACKET_HEADER;
1450  continue;
1451  }
1452  else if (ret < 0)
1453  return ret;
1454 
1455  switch (asf->state) {
1456  case READ_SINGLE:
1457  if (!asf->sub_left)
1458  asf->state = PARSE_PACKET_HEADER;
1459  break;
1460  case READ_MULTI_SUB:
1461  if (!asf->sub_left && !asf->nb_mult_left) {
1462  asf->state = PARSE_PACKET_HEADER;
1463  if (!asf->return_subpayload &&
1464  (avio_tell(pb) <= asf->packet_offset +
1465  asf->packet_size - asf->pad_len))
1466  avio_skip(pb, asf->pad_len); // skip padding
1467  if (asf->packet_offset + asf->packet_size > avio_tell(pb))
1468  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1469  } else if (!asf->sub_left)
1470  asf->state = READ_MULTI;
1471  break;
1472  case READ_MULTI:
1473  if (!asf->nb_mult_left) {
1474  asf->state = PARSE_PACKET_HEADER;
1475  if (!asf->return_subpayload &&
1476  (avio_tell(pb) <= asf->packet_offset +
1477  asf->packet_size - asf->pad_len))
1478  avio_skip(pb, asf->pad_len); // skip padding
1479  if (asf->packet_offset + asf->packet_size > avio_tell(pb))
1480  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1481  }
1482  break;
1483  }
1484  if (asf->return_subpayload) {
1485  asf->return_subpayload = 0;
1486  return 0;
1487  }
1488  for (i = 0; i < asf->nb_streams; i++) {
1489  ASFPacket *asf_pkt = &asf->asf_st[i]->pkt;
1490  if (asf_pkt && !asf_pkt->size_left && asf_pkt->data_size) {
1491  if (asf->asf_st[i]->span > 1 &&
1492  asf->asf_st[i]->type == AVMEDIA_TYPE_AUDIO)
1493  if ((ret = asf_deinterleave(s, asf_pkt, i)) < 0)
1494  return ret;
1495  av_packet_move_ref(pkt, &asf_pkt->avpkt);
1496  pkt->stream_index = asf->asf_st[i]->index;
1497  pkt->flags = asf_pkt->flags;
1498  pkt->dts = asf_pkt->dts - asf->preroll;
1499  asf_pkt->data_size = 0;
1500  asf_pkt->frame_num = 0;
1501  return 0;
1502  }
1503  }
1504  }
1505 
1506  if (pb->eof_reached)
1507  return AVERROR_EOF;
1508 
1509  return 0;
1510 }
1511 
1513 {
1514  ASFContext *asf = s->priv_data;
1515  int i;
1516 
1517  for (i = 0; i < ASF_MAX_STREAMS; i++) {
1518  av_dict_free(&asf->asf_sd[i].asf_met);
1519  if (i < asf->nb_streams) {
1520  av_packet_unref(&asf->asf_st[i]->pkt.avpkt);
1521  av_freep(&asf->asf_st[i]);
1522  }
1523  }
1524 
1525  asf->nb_streams = 0;
1526  return 0;
1527 }
1528 
1530 {
1531  ASFContext *asf = s->priv_data;
1532  int i;
1533 
1534  asf->state = PARSE_PACKET_HEADER;
1535  asf->offset = 0;
1536  asf->return_subpayload = 0;
1537  asf->sub_left = 0;
1538  asf->sub_header_offset = 0;
1539  asf->packet_offset = asf->first_packet_offset;
1540  asf->pad_len = 0;
1541  asf->rep_data_len = 0;
1542  asf->dts_delta = 0;
1543  asf->mult_sub_len = 0;
1544  asf->nb_mult_left = 0;
1545  asf->nb_sub = 0;
1546  asf->prop_flags = 0;
1547  asf->sub_dts = 0;
1548  for (i = 0; i < asf->nb_streams; i++) {
1549  ASFPacket *pkt = &asf->asf_st[i]->pkt;
1550  pkt->size_left = 0;
1551  pkt->data_size = 0;
1552  pkt->duration = 0;
1553  pkt->flags = 0;
1554  pkt->dts = 0;
1555  pkt->duration = 0;
1556  av_packet_unref(&pkt->avpkt);
1557  av_init_packet(&pkt->avpkt);
1558  }
1559 }
1560 
1561 /*
1562  * Find a timestamp for the requested position within the payload
1563  * where the pos (position) is the offset inside the Data Object.
1564  * When position is not on the packet boundary, asf_read_timestamp tries
1565  * to find the closest packet offset after this position. If this packet
1566  * is a key frame, this packet timestamp is read and an index entry is created
1567  * for the packet. If this packet belongs to the requested stream,
1568  * asf_read_timestamp upgrades pos to the packet beginning offset and
1569  * returns this packet's dts. So returned dts is the dts of the first key frame with
1570  * matching stream number after given position.
1571  */
1572 static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index,
1573  int64_t *pos, int64_t pos_limit)
1574 {
1575  ASFContext *asf = s->priv_data;
1576  int64_t pkt_pos = *pos, pkt_offset, dts = AV_NOPTS_VALUE, data_end;
1577  AVPacket pkt;
1578  int n;
1579 
1580  data_end = asf->data_offset + asf->data_size;
1581 
1582  n = (pkt_pos - asf->first_packet_offset + asf->packet_size - 1) /
1583  asf->packet_size;
1584  n = av_clip(n, 0, ((data_end - asf->first_packet_offset) / asf->packet_size - 1));
1585  pkt_pos = asf->first_packet_offset + n * asf->packet_size;
1586 
1587  avio_seek(s->pb, pkt_pos, SEEK_SET);
1588  pkt_offset = pkt_pos;
1589 
1591  while (avio_tell(s->pb) < data_end) {
1592 
1593  int i, ret, st_found;
1594 
1595  av_init_packet(&pkt);
1596  pkt_offset = avio_tell(s->pb);
1597  if ((ret = asf_read_packet(s, &pkt)) < 0) {
1598  dts = AV_NOPTS_VALUE;
1599  return ret;
1600  }
1601  // ASFPacket may contain fragments of packets belonging to different streams,
1602  // pkt_offset is the offset of the first fragment within it.
1603  if ((pkt_offset >= (pkt_pos + asf->packet_size)))
1604  pkt_pos += asf->packet_size;
1605  for (i = 0; i < asf->nb_streams; i++) {
1606  ASFStream *st = asf->asf_st[i];
1607 
1608  st_found = 0;
1609  if (pkt.flags & AV_PKT_FLAG_KEY) {
1610  dts = pkt.dts;
1611  if (dts) {
1612  av_add_index_entry(s->streams[pkt.stream_index], pkt_pos,
1613  dts, pkt.size, 0, AVINDEX_KEYFRAME);
1614  if (stream_index == st->index) {
1615  st_found = 1;
1616  break;
1617  }
1618  }
1619  }
1620  }
1621  if (st_found)
1622  break;
1623  av_packet_unref(&pkt);
1624  }
1625  *pos = pkt_pos;
1626 
1627  av_packet_unref(&pkt);
1628  return dts;
1629 }
1630 
1631 static int asf_read_seek(AVFormatContext *s, int stream_index,
1632  int64_t timestamp, int flags)
1633 {
1634  ASFContext *asf = s->priv_data;
1635  int idx, ret;
1636 
1637  if (s->streams[stream_index]->nb_index_entries && asf->is_simple_index) {
1638  idx = av_index_search_timestamp(s->streams[stream_index], timestamp, flags);
1639  if (idx < 0 || idx >= s->streams[stream_index]->nb_index_entries)
1640  return AVERROR_INVALIDDATA;
1641  avio_seek(s->pb, s->streams[stream_index]->index_entries[idx].pos, SEEK_SET);
1642  } else {
1643  if ((ret = ff_seek_frame_binary(s, stream_index, timestamp, flags)) < 0)
1644  return ret;
1645  }
1646 
1648 
1649  return 0;
1650 }
1651 
1653 {
1654  int j, ret;
1655  const GUIDParseTable *g;
1656 
1657  swap_guid(guid);
1658  g = gdef;
1659  for (j = 0; j < FF_ARRAY_ELEMS(gdef); j++) {
1660  if (!(ret = memcmp(guid, g->guid, sizeof(g->guid))))
1661  return g;
1662  g++;
1663  }
1664 
1665  return NULL;
1666 }
1667 
1668 static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size)
1669 {
1670  ASFContext *asf = s->priv_data;
1671  AVIOContext *pb = s->pb;
1672  const GUIDParseTable *g = NULL;
1673  ff_asf_guid guid;
1674  int ret;
1675 
1676  if (offset > INT64_MAX - size)
1677  return AVERROR_INVALIDDATA;
1678 
1679  while (avio_tell(pb) <= offset + size) {
1680  if (avio_tell(pb) == asf->offset)
1681  break;
1682  asf->offset = avio_tell(pb);
1683  if ((ret = ff_get_guid(pb, &guid)) < 0)
1684  return ret;
1685  g = find_guid(guid);
1686  if (g) {
1687  if ((ret = g->read_object(s, g)) < 0)
1688  return ret;
1689  } else {
1690  GUIDParseTable g2;
1691 
1692  g2.name = "Unknown";
1693  g2.is_subobject = 1;
1694  asf_read_unknown(s, &g2);
1695  }
1696  }
1697 
1698  return 0;
1699 }
1700 
1702 {
1703  ASFContext *asf = s->priv_data;
1704  AVIOContext *pb = s->pb;
1705  const GUIDParseTable *g = NULL;
1706  ff_asf_guid guid;
1707  int i, ret;
1708  uint64_t size;
1709 
1710  asf->preroll = 0;
1711  asf->is_simple_index = 0;
1712  ff_get_guid(pb, &guid);
1713  if (ff_guidcmp(&guid, &ff_asf_header))
1714  return AVERROR_INVALIDDATA;
1715  avio_skip(pb, 8); // skip header object size
1716  avio_skip(pb, 6); // skip number of header objects and 2 reserved bytes
1717  asf->data_reached = 0;
1718 
1719  /* 1 is here instead of pb->eof_reached because (when not streaming), Data are skipped
1720  * for the first time,
1721  * Index object is processed and got eof and then seeking back to the Data is performed.
1722  */
1723  while (1) {
1724  // for the cases when object size is invalid
1725  if (avio_tell(pb) == asf->offset)
1726  break;
1727  asf->offset = avio_tell(pb);
1728  if ((ret = ff_get_guid(pb, &guid)) < 0) {
1729  if (ret == AVERROR_EOF && asf->data_reached)
1730  break;
1731  else
1732  goto failed;
1733  }
1734  g = find_guid(guid);
1735  if (g) {
1736  asf->unknown_offset = asf->offset;
1737  asf->is_header = 1;
1738  if ((ret = g->read_object(s, g)) < 0)
1739  goto failed;
1740  } else {
1741  size = avio_rl64(pb);
1742  align_position(pb, asf->offset, size);
1743  }
1744  if (asf->data_reached &&
1745  (!(pb->seekable & AVIO_SEEKABLE_NORMAL) ||
1746  (asf->b_flags & ASF_FLAG_BROADCAST)))
1747  break;
1748  }
1749 
1750  if (!asf->data_reached) {
1751  av_log(s, AV_LOG_ERROR, "Data Object was not found.\n");
1753  goto failed;
1754  }
1755  if (pb->seekable & AVIO_SEEKABLE_NORMAL)
1756  avio_seek(pb, asf->first_packet_offset, SEEK_SET);
1757 
1758  for (i = 0; i < asf->nb_streams; i++) {
1759  const char *rfc1766 = asf->asf_sd[asf->asf_st[i]->lang_idx].langs;
1760  AVStream *st = s->streams[asf->asf_st[i]->index];
1761  set_language(s, rfc1766, &st->metadata);
1762  }
1763 
1764  for (i = 0; i < ASF_MAX_STREAMS; i++) {
1765  AVStream *st = NULL;
1766 
1767  st = find_stream(s, i);
1768  if (st) {
1770  if (asf->asf_sd[i].aspect_ratio.num > 0 && asf->asf_sd[i].aspect_ratio.den > 0) {
1773  }
1774  }
1775  }
1776 
1777  return 0;
1778 
1779 failed:
1780  asf_read_close(s);
1781  return ret;
1782 }
1783 
1785  .name = "asf_o",
1786  .long_name = NULL_IF_CONFIG_SMALL("ASF (Advanced / Active Streaming Format)"),
1787  .priv_data_size = sizeof(ASFContext),
1788  .read_probe = asf_probe,
1792  .read_timestamp = asf_read_timestamp,
1795 };
reset_packet
static void reset_packet(ASFPacket *asf_pkt)
Definition: asfdec_o.c:1134
ff_asf_ext_stream_embed_stream_header
const ff_asf_guid ff_asf_ext_stream_embed_stream_header
Definition: asf.c:100
ff_asf_jfif_media
const ff_asf_guid ff_asf_jfif_media
Definition: asf.c:57
ASFContext::sub_header_offset
uint64_t sub_header_offset
Definition: asfdec_o.c:125
get_id3_tag
static void get_id3_tag(AVFormatContext *s, int len)
Definition: asfdec_o.c:461
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
PUT_UTF8
#define PUT_UTF8(val, tmp, PUT_BYTE)
Definition: common.h:438
asf_read_replicated_data
static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt)
Definition: asfdec_o.c:1146
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
ff_get_guid
int ff_get_guid(AVIOContext *s, ff_asf_guid *g)
Definition: riffdec.c:32
opt.h
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4480
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3953
ff_get_extradata
int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0 and f...
Definition: utils.c:3327
ASFStreamData::langs
char langs[32]
Definition: asfdec_o.c:89
FFSWAP
#define FFSWAP(type, a, b)
Definition: common.h:99
asf_read_subpayload
static int asf_read_subpayload(AVFormatContext *s, AVPacket *pkt, int is_header)
Definition: asfdec_o.c:1079
n
int n
Definition: avisynth_c.h:760
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:838
ASFContext::PARSE_PACKET_HEADER
@ PARSE_PACKET_HEADER
Definition: asfdec_o.c:140
ch
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
ASFContext::data_offset
int64_t data_offset
Definition: asfdec_o.c:113
align_position
static void align_position(AVIOContext *pb, int64_t offset, uint64_t size)
Definition: asfdec_o.c:167
avlanguage.h
av_unused
#define av_unused
Definition: attributes.h:125
id3v2.h
ASFContext::packet_offset
int64_t packet_offset
Definition: asfdec_o.c:129
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
name
const char * name
Definition: avisynth_c.h:867
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:943
ASFStream::type
int type
Definition: asfdec_o.c:79
AV_DICT_IGNORE_SUFFIX
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
Definition: dict.h:70
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:1131
asfcrypt.h
asf_read_header
static int asf_read_header(AVFormatContext *s)
Definition: asfdec_o.c:1701
detect_unknown_subobject
static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size)
Definition: asfdec_o.c:1668
ff_asf_video_stream
const ff_asf_guid ff_asf_video_stream
Definition: asf.c:53
swap_guid
static void swap_guid(ff_asf_guid guid)
Definition: asfdec_o.c:159
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: avcodec.h:1495
ASF_GUID
#define ASF_GUID
Definition: asfdec_o.c:43
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: avcodec.h:3961
mathematics.h
AVDictionary
Definition: dict.c:30
ASFContext::state
enum ASFContext::@246 state
AVFMT_NOBINSEARCH
#define AVFMT_NOBINSEARCH
Format does not allow to fall back on binary search via read_timestamp.
Definition: avformat.h:473
process_metadata
static int process_metadata(AVFormatContext *s, const uint8_t *name, uint16_t name_len, uint16_t val_len, uint16_t type, AVDictionary **met)
Definition: asfdec_o.c:473
asf_read_ext_content
static int asf_read_ext_content(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:505
ASFContext::data_offset
uint64_t data_offset
beginning of the first data packet
Definition: asfdec_f.c:85
asf_read_properties
static int asf_read_properties(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:654
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1509
BMP_HEADER_SIZE
#define BMP_HEADER_SIZE
Definition: asfdec_o.c:53
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
ff_seek_frame_binary
int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
Perform a binary search using av_index_search_timestamp() and AVInputFormat.read_timestamp().
Definition: utils.c:2182
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:808
ASFContext::READ_SINGLE
@ READ_SINGLE
Definition: asfdec_o.c:141
ASFContext::dts_delta
uint8_t dts_delta
Definition: asfdec_o.c:127
ff_guidcmp
static av_always_inline int ff_guidcmp(const void *g1, const void *g2)
Definition: riff.h:118
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:458
CodecMime
Definition: internal.h:49
ASFPacket::size_left
int size_left
Definition: asfdec_o.c:72
ASFContext::stream_index
int stream_index
Definition: asfdec_f.c:110
ASFPacket::duration
int duration
Definition: asfdec_o.c:71
asf_read_data
static int asf_read_data(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:932
ASF_FLAG_BROADCAST
#define ASF_FLAG_BROADCAST
Definition: asfdec_o.c:47
ASFContext::offset
int64_t offset
Definition: asfdec_o.c:111
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:1153
ff_get_bmp_header
int ff_get_bmp_header(AVIOContext *pb, AVStream *st, uint32_t *size)
Read BITMAPINFOHEADER structure and set AVStream codec width, height and bits_per_encoded_sample fiel...
Definition: riffdec.c:211
asf_read_marker
static int asf_read_marker(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:220
GUIDParseTable::read_object
int(* read_object)(AVFormatContext *, const struct GUIDParseTable *)
Definition: asfdec_o.c:61
ASFStreamData::asf_met
AVDictionary * asf_met
Definition: asfdec_o.c:90
fail
#define fail()
Definition: checkasm.h:120
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: utils.c:2056
ASFContext::sub_left
uint64_t sub_left
Definition: asfdec_o.c:134
asf_read_simple_index
static int asf_read_simple_index(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:968
asf_read_value
static int asf_read_value(AVFormatContext *s, const uint8_t *name, uint16_t val_len, int type, AVDictionary **met)
Definition: asfdec_o.c:276
gmtime_r
#define gmtime_r
Definition: time_internal.h:34
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
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
pts
static int64_t pts
Definition: transcode_aac.c:647
ASF_NUM_OF_PAYLOADS
#define ASF_NUM_OF_PAYLOADS
Definition: asfdec_o.c:54
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:919
ff_asf_o_demuxer
AVInputFormat ff_asf_o_demuxer
Definition: asfdec_o.c:1784
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:753
AVRational::num
int num
Numerator.
Definition: rational.h:59
AVStream::attached_pic
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition: avformat.h:952
asf_read_metadata_obj
static int asf_read_metadata_obj(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:578
ASF_WORD
#define ASF_WORD
Definition: asfdec_o.c:42
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:74
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
asf_deinterleave
static int asf_deinterleave(AVFormatContext *s, ASFPacket *asf_pkt, int st_num)
Definition: asfdec_o.c:1386
buf
void * buf
Definition: avisynth_c.h:766
AVInputFormat
Definition: avformat.h:640
ID3v2ExtraMeta
Definition: id3v2.h:57
ASFStream::virtual_chunk_len
uint16_t virtual_chunk_len
Definition: asfdec_o.c:83
ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE
#define ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE
Definition: asf.h:148
ASFContext::asf_st
ASFStream * asf_st
currently decoded stream
Definition: asfdec_f.c:112
find_stream
static AVStream * find_stream(AVFormatContext *s, uint16_t st_num)
Definition: asfdec_o.c:542
avio_get_str16le
int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a UTF-16 string from pb and convert it to UTF-8.
ASFStream::index
int index
Definition: asfdec_o.c:78
GUIDParseTable::is_subobject
int is_subobject
Definition: asfdec_o.c:62
ASFContext::asf_sd
ASFStreamData asf_sd[ASF_MAX_STREAMS]
Definition: asfdec_o.c:119
s
#define s(width, name)
Definition: cbs_vp9.c:257
ASFContext::READ_MULTI
@ READ_MULTI
Definition: asfdec_o.c:142
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:86
ASFStream::indexed
int indexed
Definition: asfdec_o.c:80
ASFContext::b_flags
uint32_t b_flags
Definition: asfdec_o.c:105
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:645
g
const char * g
Definition: vf_curves.c:115
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:448
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
ASF_BYTE_ARRAY
#define ASF_BYTE_ARRAY
Definition: asfdec_o.c:48
AVCodecParameters::width
int width
Video only.
Definition: avcodec.h:4023
ASFContext::mult_sub_len
uint16_t mult_sub_len
Definition: asfdec_o.c:136
ASF_STREAM_NUM
#define ASF_STREAM_NUM
Definition: asfdec_o.c:51
ASF_ERROR_CORRECTION_LENGTH_TYPE
#define ASF_ERROR_CORRECTION_LENGTH_TYPE
Definition: asfdec_o.c:55
nb_streams
static int nb_streams
Definition: ffprobe.c:280
ASFContext::nb_sub
unsigned int nb_sub
Definition: asfdec_o.c:135
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
int32_t
int32_t
Definition: audio_convert.c:194
time_internal.h
if
if(ret)
Definition: filter_design.txt:179
AVFormatContext
Format I/O context.
Definition: avformat.h:1342
ASFContext::preroll
uint64_t preroll
Definition: asfdec_o.c:99
asf_read_seek
static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: asfdec_o.c:1631
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1017
AV_LANG_ISO639_2_BIBL
@ AV_LANG_ISO639_2_BIBL
Definition: avlanguage.h:31
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:530
NULL
#define NULL
Definition: coverity.c:32
ff_asf_guid
uint8_t ff_asf_guid[16]
Definition: riff.h:92
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
ff_asf_header
const ff_asf_guid ff_asf_header
Definition: asf.c:23
ASF_PPI_MASK_SEQUENCE_FIELD_SIZE
#define ASF_PPI_MASK_SEQUENCE_FIELD_SIZE
Definition: asf.h:132
ASF_QWORD
#define ASF_QWORD
Definition: asfdec_o.c:45
ASFContext::is_simple_index
int is_simple_index
Definition: asfdec_o.c:96
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
asf_read_metadata
static int asf_read_metadata(AVFormatContext *s, const char *title, uint16_t len, unsigned char *ch, uint16_t buflen)
Definition: asfdec_o.c:262
ASFContext::data_reached
int data_reached
Definition: asfdec_o.c:95
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:446
ASFPacket
Definition: asfdec_o.c:65
READ_LEN
#define READ_LEN(flag, name, len)
Definition: asfdec_o.c:1067
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:934
ASFContext::nb_packets
uint64_t nb_packets
how many packets are there in the file, invalid if broadcasting
Definition: asfdec_o.c:100
ASFContext::unknown_size
uint64_t unknown_size
Definition: asfdec_o.c:109
av_packet_move_ref
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition: avpacket.c:655
ff_id3v2_picture_types
const char *const ff_id3v2_picture_types[21]
Definition: id3v2.c:107
ff_id3v2_mime_tags
const CodecMime ff_id3v2_mime_tags[]
Definition: id3v2.c:131
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:215
ASFContext::pad_len
uint32_t pad_len
Definition: asfdec_o.c:130
ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE
#define ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE
Definition: asf.h:153
asf_read_multiple_payload
static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt, ASFPacket *asf_pkt)
Definition: asfdec_o.c:1168
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:769
desc
const char * desc
Definition: nvenc.c:68
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AVMediaType
AVMediaType
Definition: avutil.h:199
AVPacket::size
int size
Definition: avcodec.h:1478
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
id
enum AVCodecID id
Definition: extract_extradata_bsf.c:329
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:3146
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:260
asf_read_generic_value
static int asf_read_generic_value(AVIOContext *pb, int type, uint64_t *value)
Definition: asfdec_o.c:317
ASFContext::prop_flags
uint32_t prop_flags
Definition: asfdec_o.c:106
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:736
start_time
static int64_t start_time
Definition: ffplay.c:331
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
ASFContext::packet_size
uint32_t packet_size
Definition: asfdec_o.c:101
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4910
asf_store_aspect_ratio
static int asf_store_aspect_ratio(AVFormatContext *s, uint8_t st_num, uint8_t *name, int type)
Definition: asfdec_o.c:558
size
int size
Definition: twinvq_data.h:11134
ASFStreamData
Definition: asfdec_o.c:88
ID3v2_DEFAULT_MAGIC
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
Definition: id3v2.h:35
ASFContext::is_header
int is_header
Definition: asfdec_o.c:97
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
ASFContext::sub_dts
int64_t sub_dts
Definition: asfdec_o.c:126
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:200
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:932
ASFStreamData::aspect_ratio
AVRational aspect_ratio
Definition: asfdec_o.c:91
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: avcodec.h:1476
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:638
ASFStream::lang_idx
int16_t lang_idx
Definition: asfdec_o.c:84
parse_video_info
static int parse_video_info(AVFormatContext *avfmt, AVIOContext *pb, AVStream *st)
Definition: asfdec_o.c:697
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
GUIDParseTable::name
const char * name
Definition: asfdec_o.c:59
attributes.h
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:1483
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:203
asf_read_single_payload
static int asf_read_single_payload(AVFormatContext *s, ASFPacket *asf_pkt)
Definition: asfdec_o.c:1219
bitrate
int64_t bitrate
Definition: h264_levels.c:131
asf_read_payload
static int asf_read_payload(AVFormatContext *s, AVPacket *pkt)
Definition: asfdec_o.c:1271
gdef
static const GUIDParseTable gdef[]
Definition: asfdec_o.c:1017
ASFStream::pkt
AVPacket pkt
Definition: asfdec_f.c:51
ff_asf_command_stream
const ff_asf_guid ff_asf_command_stream
Definition: asf.c:65
ASF_DWORD
#define ASF_DWORD
Definition: asfdec_o.c:44
ASFPacket::frame_num
uint32_t frame_num
Definition: asfdec_o.c:68
asf_read_content_desc
static int asf_read_content_desc(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:625
ASFPacket::dts
int64_t dts
Definition: asfdec_o.c:67
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: avcodec.h:216
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
avio_internal.h
internal.h
AVCodecParameters::height
int height
Definition: avcodec.h:4024
set_language
static void set_language(AVFormatContext *s, const char *rfc1766, AVDictionary **met)
Definition: asfdec_o.c:825
avpriv_new_chapter
AVChapter * avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
Definition: utils.c:4608
common.h
value
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 default value
Definition: writing_filters.txt:86
uint8_t
uint8_t
Definition: audio_convert.c:194
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:410
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
asf_read_timestamp
static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit)
Definition: asfdec_o.c:1572
len
int len
Definition: vorbis_enc_data.h:452
ff_get_wav_header
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
Definition: riffdec.c:91
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
ASFContext::unknown_offset
int64_t unknown_offset
Definition: asfdec_o.c:115
ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE
#define ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE
Definition: asf.h:158
av_get_packet
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:313
AVStream::disposition
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:923
tag
uint32_t tag
Definition: movenc.c:1496
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:877
ret
ret
Definition: filter_design.txt:187
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
AVStream
Stream structure.
Definition: avformat.h:870
bswap.h
ASFContext::data_size
uint64_t data_size
Definition: asfdec_o.c:108
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:246
ASF_PACKET_ERROR_CORRECTION_DATA_SIZE
#define ASF_PACKET_ERROR_CORRECTION_DATA_SIZE
Definition: asfdec_o.c:56
ff_asf_audio_stream
const ff_asf_guid ff_asf_audio_stream
Definition: asf.c:39
ASFStream::stream_index
uint8_t stream_index
Definition: asfdec_o.c:77
ASFStream::virtual_pkt_len
uint16_t virtual_pkt_len
Definition: asfdec_o.c:82
ASFContext::first_packet_offset
int64_t first_packet_offset
Definition: asfdec_o.c:114
avformat.h
dict.h
ASFPacket::stream_index
uint8_t stream_index
Definition: asfdec_o.c:73
get_asf_string
static int get_asf_string(AVIOContext *pb, int maxlen, char *buf, int buflen)
Definition: asfdec_o.c:203
asf.h
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE
#define ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE
Definition: asf.h:137
ASFStream::pkt
ASFPacket pkt
Definition: asfdec_o.c:85
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:871
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:32
ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT
#define ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT
Definition: asf.h:127
GUIDParseTable
Definition: asfdec_o.c:58
asf_read_unknown
static int asf_read_unknown(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:173
GUIDParseTable::guid
ff_asf_guid guid
Definition: asfdec_o.c:60
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
ASFContext::rep_data_len
uint32_t rep_data_len
Definition: asfdec_o.c:131
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:40
AVRational::den
int den
Denominator.
Definition: rational.h:60
ASF_UNICODE
#define ASF_UNICODE
Definition: asfdec_o.c:46
ASFContext::duration
int duration
Definition: asfdec_o.c:103
AVFMT_NOGENSEARCH
#define AVFMT_NOGENSEARCH
Format does not allow to fall back on generic search.
Definition: avformat.h:474
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:647
asf_probe
static int asf_probe(const AVProbeData *pd)
Definition: asfdec_o.c:150
ASFContext::packet_size_internal
uint32_t packet_size_internal
Definition: asfdec_o.c:128
ASFStream::span
int8_t span
Definition: asfdec_o.c:81
asf_read_packet
static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: asfdec_o.c:1428
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:239
AVPacket::stream_index
int stream_index
Definition: avcodec.h:1479
ASF_BOOL
#define ASF_BOOL
Definition: asfdec_o.c:41
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:331
CodecMime::str
char str[32]
Definition: internal.h:50
ASF_MAX_STREAMS
#define ASF_MAX_STREAMS
Definition: asfdec_o.c:52
ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE
#define ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE
Definition: asf.h:142
CodecMime::id
enum AVCodecID id
Definition: internal.h:51
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
asf_read_close
static int asf_read_close(AVFormatContext *s)
Definition: asfdec_o.c:1512
ASFContext
Definition: asfdec_f.c:74
reset_packet_state
static void reset_packet_state(AVFormatContext *s)
Definition: asfdec_o.c:1529
ASFContext::return_subpayload
int return_subpayload
Definition: asfdec_o.c:138
find_guid
static const GUIDParseTable * find_guid(ff_asf_guid guid)
Definition: asfdec_o.c:1652
ASFPacket::avpkt
AVPacket avpkt
Definition: asfdec_o.c:66
asf_read_ext_stream_properties
static int asf_read_ext_stream_properties(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:838
ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT
#define ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT
Definition: asf.h:108
ASFContext::READ_MULTI_SUB
@ READ_MULTI_SUB
Definition: asfdec_o.c:143
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: avcodec.h:3957
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
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:70
riff.h
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:217
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:1137
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:777
ASFStream
Definition: asfdec_f.c:47
asf_read_stream_properties
static int asf_read_stream_properties(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:721
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
asf_read_picture
static int asf_read_picture(AVFormatContext *s, int len)
Definition: asfdec_o.c:361
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: avcodec.h:3986
ASFContext::send_time
int64_t send_time
Definition: asfdec_o.c:102
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
asf_read_language_list
static int asf_read_language_list(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:906
asf_set_metadata
static int asf_set_metadata(AVFormatContext *s, const uint8_t *name, int type, AVDictionary **met)
Definition: asfdec_o.c:340
ASFPacket::flags
int flags
Definition: asfdec_o.c:69
AVStream::start_time
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
Definition: avformat.h:909
avstring.h
ff_id3v2_parse_chapters
int ff_id3v2_parse_chapters(AVFormatContext *s, ID3v2ExtraMeta **extra_meta)
Create chapters for all CHAP tags found in the ID3v2 header.
Definition: id3v2.c:1193
int
int
Definition: ffmpeg_filter.c:191
snprintf
#define snprintf
Definition: snprintf.h:34
ASFContext::nb_mult_left
uint64_t nb_mult_left
Definition: asfdec_o.c:137
ASFContext::nb_streams
int nb_streams
Definition: asfdec_o.c:120
asf_read_packet_header
static int asf_read_packet_header(AVFormatContext *s)
Definition: asfdec_o.c:1351
ff_asfcrypt_dec
void ff_asfcrypt_dec(const uint8_t key[20], uint8_t *data, int len)
Definition: asfcrypt.c:147
ASFPacket::data_size
int data_size
Definition: asfdec_o.c:70
av_init_packet
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:33
av_index_search_timestamp
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
Definition: utils.c:2167
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:358