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  AVPacket pkt = { 0 };
364  const CodecMime *mime = ff_id3v2_mime_tags;
365  enum AVCodecID id = AV_CODEC_ID_NONE;
366  char mimetype[64];
367  uint8_t *desc = NULL;
368  AVStream *st = NULL;
369  int ret, type, picsize, desc_len;
370 
371  /* type + picsize + mime + desc */
372  if (len < 1 + 4 + 2 + 2) {
373  av_log(s, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", len);
374  return AVERROR_INVALIDDATA;
375  }
376 
377  /* picture type */
378  type = avio_r8(s->pb);
379  len--;
381  av_log(s, AV_LOG_WARNING, "Unknown attached picture type: %d.\n", type);
382  type = 0;
383  }
384 
385  /* picture data size */
386  picsize = avio_rl32(s->pb);
387  len -= 4;
388 
389  /* picture MIME type */
390  len -= avio_get_str16le(s->pb, len, mimetype, sizeof(mimetype));
391  while (mime->id != AV_CODEC_ID_NONE) {
392  if (!strncmp(mime->str, mimetype, sizeof(mimetype))) {
393  id = mime->id;
394  break;
395  }
396  mime++;
397  }
398  if (id == AV_CODEC_ID_NONE) {
399  av_log(s, AV_LOG_ERROR, "Unknown attached picture mimetype: %s.\n",
400  mimetype);
401  return 0;
402  }
403 
404  if (picsize >= len) {
405  av_log(s, AV_LOG_ERROR, "Invalid attached picture data size: %d >= %d.\n",
406  picsize, len);
407  return AVERROR_INVALIDDATA;
408  }
409 
410  /* picture description */
411  desc_len = (len - picsize) * 2 + 1;
412  desc = av_malloc(desc_len);
413  if (!desc)
414  return AVERROR(ENOMEM);
415  len -= avio_get_str16le(s->pb, len - picsize, desc, desc_len);
416 
417  ret = av_get_packet(s->pb, &pkt, picsize);
418  if (ret < 0)
419  goto fail;
420 
421  st = avformat_new_stream(s, NULL);
422  if (!st) {
423  ret = AVERROR(ENOMEM);
424  goto fail;
425  }
426 
429  st->codecpar->codec_id = id;
430  st->attached_pic = pkt;
431  st->attached_pic.stream_index = st->index;
433 
434  if (*desc) {
435  if (av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL) < 0)
436  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
437  } else
438  av_freep(&desc);
439 
440  if (av_dict_set(&st->metadata, "comment", ff_id3v2_picture_types[type], 0) < 0)
441  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
442 
443  return 0;
444 
445 fail:
446  av_freep(&desc);
448  return ret;
449 }
450 
451 static void get_id3_tag(AVFormatContext *s, int len)
452 {
453  ID3v2ExtraMeta *id3v2_extra_meta = NULL;
454 
455  ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, len);
456  if (id3v2_extra_meta) {
457  ff_id3v2_parse_apic(s, id3v2_extra_meta);
458  ff_id3v2_parse_chapters(s, id3v2_extra_meta);
459  }
460  ff_id3v2_free_extra_meta(&id3v2_extra_meta);
461 }
462 
463 static int process_metadata(AVFormatContext *s, const uint8_t *name, uint16_t name_len,
464  uint16_t val_len, uint16_t type, AVDictionary **met)
465 {
466  int ret;
467  ff_asf_guid guid;
468 
469  if (val_len) {
470  switch (type) {
471  case ASF_UNICODE:
472  asf_read_value(s, name, val_len, type, met);
473  break;
474  case ASF_BYTE_ARRAY:
475  if (!strcmp(name, "WM/Picture")) // handle cover art
476  asf_read_picture(s, val_len);
477  else if (!strcmp(name, "ID3")) // handle ID3 tag
478  get_id3_tag(s, val_len);
479  else
480  asf_read_value(s, name, val_len, type, met);
481  break;
482  case ASF_GUID:
483  ff_get_guid(s->pb, &guid);
484  break;
485  default:
486  if ((ret = asf_set_metadata(s, name, type, met)) < 0)
487  return ret;
488  break;
489  }
490  }
491 
492  return 0;
493 }
494 
496 {
497  ASFContext *asf = s->priv_data;
498  AVIOContext *pb = s->pb;
499  uint64_t size = avio_rl64(pb);
500  uint16_t nb_desc = avio_rl16(pb);
501  int i, ret;
502 
503  for (i = 0; i < nb_desc; i++) {
504  uint16_t name_len, type, val_len;
505  uint8_t *name = NULL;
506 
507  name_len = avio_rl16(pb);
508  if (!name_len)
509  return AVERROR_INVALIDDATA;
510  name = av_malloc(name_len);
511  if (!name)
512  return AVERROR(ENOMEM);
513  avio_get_str16le(pb, name_len, name,
514  name_len);
515  type = avio_rl16(pb);
516  // BOOL values are 16 bits long in the Metadata Object
517  // but 32 bits long in the Extended Content Description Object
518  if (type == ASF_BOOL)
519  type = ASF_DWORD;
520  val_len = avio_rl16(pb);
521 
522  ret = process_metadata(s, name, name_len, val_len, type, &s->metadata);
523  av_freep(&name);
524  if (ret < 0)
525  return ret;
526  }
527 
528  align_position(pb, asf->offset, size);
529  return 0;
530 }
531 
532 static AVStream *find_stream(AVFormatContext *s, uint16_t st_num)
533 {
534  AVStream *st = NULL;
535  ASFContext *asf = s->priv_data;
536  int i;
537 
538  for (i = 0; i < asf->nb_streams; i++) {
539  if (asf->asf_st[i]->stream_index == st_num) {
540  st = s->streams[asf->asf_st[i]->index];
541  break;
542  }
543  }
544 
545  return st;
546 }
547 
549 {
550  ASFContext *asf = s->priv_data;
551  AVIOContext *pb = s->pb;
552  uint64_t value = 0;
553  int ret;
554 
556  if (ret < 0)
557  return ret;
558 
559  if (st_num < ASF_MAX_STREAMS) {
560  if (!strcmp(name, "AspectRatioX"))
561  asf->asf_sd[st_num].aspect_ratio.num = value;
562  else
563  asf->asf_sd[st_num].aspect_ratio.den = value;
564  }
565  return 0;
566 }
567 
569 {
570  ASFContext *asf = s->priv_data;
571  AVIOContext *pb = s->pb;
572  uint64_t size = avio_rl64(pb);
573  uint16_t nb_recs = avio_rl16(pb); // number of records in the Description Records list
574  int i, ret;
575 
576  for (i = 0; i < nb_recs; i++) {
577  uint16_t name_len, buflen, type, val_len, st_num;
578  uint8_t *name = NULL;
579 
580  avio_skip(pb, 2); // skip reserved field
581  st_num = avio_rl16(pb);
582  name_len = avio_rl16(pb);
583  buflen = 2 * name_len + 1;
584  if (!name_len)
585  break;
586  type = avio_rl16(pb);
587  val_len = avio_rl32(pb);
588  name = av_malloc(buflen);
589  if (!name)
590  return AVERROR(ENOMEM);
591  avio_get_str16le(pb, name_len, name,
592  buflen);
593  if (!strcmp(name, "AspectRatioX") || !strcmp(name, "AspectRatioY")) {
594  ret = asf_store_aspect_ratio(s, st_num, name, type);
595  if (ret < 0) {
596  av_freep(&name);
597  break;
598  }
599  } else {
600  if (st_num < ASF_MAX_STREAMS) {
601  if ((ret = process_metadata(s, name, name_len, val_len, type,
602  st_num ? &asf->asf_sd[st_num].asf_met
603  : &s->metadata)) < 0) {
604  av_freep(&name);
605  break;
606  }
607  }
608  }
609  av_freep(&name);
610  }
611 
612  align_position(pb, asf->offset, size);
613  return 0;
614 }
615 
617 {
618  ASFContext *asf = s->priv_data;
619  AVIOContext *pb = s->pb;
620  int i;
621  static const char *const titles[] =
622  { "Title", "Author", "Copyright", "Description", "Rate" };
623  uint16_t len[5], buflen[5] = { 0 };
624  uint8_t *ch;
625  uint64_t size = avio_rl64(pb);
626 
627  for (i = 0; i < 5; i++) {
628  len[i] = avio_rl16(pb);
629  // utf8 string should be <= 2 * utf16 string, extra byte for the terminator
630  buflen[i] = 2 * len[i] + 1;
631  }
632 
633  for (i = 0; i < 5; i++) {
634  ch = av_malloc(buflen[i]);
635  if (!ch)
636  return(AVERROR(ENOMEM));
637  asf_read_metadata(s, titles[i], len[i], ch, buflen[i]);
638  av_freep(&ch);
639  }
640  align_position(pb, asf->offset, size);
641 
642  return 0;
643 }
644 
646 {
647  ASFContext *asf = s->priv_data;
648  AVIOContext *pb = s->pb;
649  time_t creation_time;
650 
651  avio_rl64(pb); // read object size
652  avio_skip(pb, 16); // skip File ID
653  avio_skip(pb, 8); // skip File size
654  creation_time = avio_rl64(pb);
655  if (!(asf->b_flags & ASF_FLAG_BROADCAST)) {
656  struct tm tmbuf;
657  struct tm *tm;
658  char buf[64];
659 
660  // creation date is in 100 ns units from 1 Jan 1601, conversion to s
661  creation_time /= 10000000;
662  // there are 11644473600 seconds between 1 Jan 1601 and 1 Jan 1970
663  creation_time -= 11644473600;
664  tm = gmtime_r(&creation_time, &tmbuf);
665  if (tm) {
666  if (!strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm))
667  buf[0] = '\0';
668  } else
669  buf[0] = '\0';
670  if (buf[0]) {
671  if (av_dict_set(&s->metadata, "creation_time", buf, 0) < 0)
672  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
673  }
674  }
675  asf->nb_packets = avio_rl64(pb);
676  asf->duration = avio_rl64(pb) / 10000; // stream duration
677  avio_skip(pb, 8); // skip send duration
678  asf->preroll = avio_rl64(pb);
679  asf->duration -= asf->preroll;
680  asf->b_flags = avio_rl32(pb);
681  avio_skip(pb, 4); // skip minimal packet size
682  asf->packet_size = avio_rl32(pb);
683  avio_skip(pb, 4); // skip max_bitrate
684 
685  return 0;
686 }
687 
689 {
690  uint16_t size_asf; // ASF-specific Format Data size
691  uint32_t size_bmp; // BMP_HEADER-specific Format Data size
692  unsigned int tag;
693 
694  st->codecpar->width = avio_rl32(pb);
695  st->codecpar->height = avio_rl32(pb);
696  avio_skip(pb, 1); // skip reserved flags
697  size_asf = avio_rl16(pb);
698  tag = ff_get_bmp_header(pb, st, &size_bmp);
699  st->codecpar->codec_tag = tag;
701  size_bmp = FFMAX(size_asf, size_bmp);
702 
703  if (size_bmp > BMP_HEADER_SIZE) {
704  int ret = ff_get_extradata(avfmt, st->codecpar, pb, size_bmp - BMP_HEADER_SIZE);
705 
706  if (ret < 0)
707  return ret;
708  }
709  return 0;
710 }
711 
713 {
714  ASFContext *asf = s->priv_data;
715  AVIOContext *pb = s->pb;
716  uint64_t size;
717  uint32_t err_data_len, ts_data_len; // type specific data length
718  uint16_t flags;
719  ff_asf_guid stream_type;
720  enum AVMediaType type;
721  int i, ret;
722  uint8_t stream_index;
723  AVStream *st;
724  ASFStream *asf_st;
725 
726  // ASF file must not contain more than 128 streams according to the specification
727  if (asf->nb_streams >= ASF_MAX_STREAMS)
728  return AVERROR_INVALIDDATA;
729 
730  size = avio_rl64(pb);
731  ff_get_guid(pb, &stream_type);
732  if (!ff_guidcmp(&stream_type, &ff_asf_audio_stream))
734  else if (!ff_guidcmp(&stream_type, &ff_asf_video_stream))
736  else if (!ff_guidcmp(&stream_type, &ff_asf_jfif_media))
738  else if (!ff_guidcmp(&stream_type, &ff_asf_command_stream))
740  else if (!ff_guidcmp(&stream_type,
743  else
744  return AVERROR_INVALIDDATA;
745 
746  ff_get_guid(pb, &stream_type); // error correction type
747  avio_skip(pb, 8); // skip the time offset
748  ts_data_len = avio_rl32(pb);
749  err_data_len = avio_rl32(pb);
750  flags = avio_rl16(pb); // bit 15 - Encrypted Content
751 
752  stream_index = flags & ASF_STREAM_NUM;
753  for (i = 0; i < asf->nb_streams; i++)
754  if (stream_index == asf->asf_st[i]->stream_index) {
756  "Duplicate stream found, this stream will be ignored.\n");
757  align_position(pb, asf->offset, size);
758  return 0;
759  }
760 
761  st = avformat_new_stream(s, NULL);
762  if (!st)
763  return AVERROR(ENOMEM);
764  avpriv_set_pts_info(st, 32, 1, 1000); // pts should be dword, in milliseconds
765  st->codecpar->codec_type = type;
766  asf->asf_st[asf->nb_streams] = av_mallocz(sizeof(*asf_st));
767  if (!asf->asf_st[asf->nb_streams])
768  return AVERROR(ENOMEM);
769  asf_st = asf->asf_st[asf->nb_streams];
770  asf->nb_streams++;
771  asf_st->stream_index = stream_index;
772  asf_st->index = st->index;
773  asf_st->indexed = 0;
774  st->id = flags & ASF_STREAM_NUM;
775  asf_st->pkt.data_size = 0;
776  asf_st->pkt.avpkt = av_packet_alloc();
777  if (!asf_st->pkt.avpkt)
778  return AVERROR(ENOMEM);
779  avio_skip(pb, 4); // skip reserved field
780 
781  switch (type) {
782  case AVMEDIA_TYPE_AUDIO:
783  asf_st->type = AVMEDIA_TYPE_AUDIO;
784  if ((ret = ff_get_wav_header(s, pb, st->codecpar, ts_data_len, 0)) < 0)
785  return ret;
786  break;
787  case AVMEDIA_TYPE_VIDEO:
788  asf_st->type = AVMEDIA_TYPE_VIDEO;
789  if ((ret = parse_video_info(s, pb, st)) < 0)
790  return ret;
791  break;
792  default:
793  avio_skip(pb, ts_data_len);
794  break;
795  }
796 
797  if (err_data_len) {
798  if (type == AVMEDIA_TYPE_AUDIO) {
799  uint8_t span = avio_r8(pb);
800  if (span > 1) {
801  asf_st->span = span;
802  asf_st->virtual_pkt_len = avio_rl16(pb);
803  asf_st->virtual_chunk_len = avio_rl16(pb);
804  if (!asf_st->virtual_chunk_len || !asf_st->virtual_pkt_len)
805  return AVERROR_INVALIDDATA;
806  avio_skip(pb, err_data_len - 5);
807  } else
808  avio_skip(pb, err_data_len - 1);
809  } else
810  avio_skip(pb, err_data_len);
811  }
812 
813  align_position(pb, asf->offset, size);
814 
815  return 0;
816 }
817 
818 static void set_language(AVFormatContext *s, const char *rfc1766, AVDictionary **met)
819 {
820  // language abbr should contain at least 2 chars
821  if (rfc1766 && strlen(rfc1766) > 1) {
822  const char primary_tag[3] = { rfc1766[0], rfc1766[1], '\0' }; // ignore country code if any
823  const char *iso6392 = ff_convert_lang_to(primary_tag,
825  if (iso6392)
826  if (av_dict_set(met, "language", iso6392, 0) < 0)
827  av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
828  }
829 }
830 
832 {
833  ASFContext *asf = s->priv_data;
834  AVIOContext *pb = s->pb;
835  AVStream *st = NULL;
836  ff_asf_guid guid;
837  uint16_t nb_st_name, nb_pay_exts, st_num, lang_idx;
838  int i, ret;
839  uint32_t bitrate;
840  uint64_t start_time, end_time, time_per_frame;
841  uint64_t size = avio_rl64(pb);
842 
843  start_time = avio_rl64(pb);
844  end_time = avio_rl64(pb);
845  bitrate = avio_rl32(pb);
846  avio_skip(pb, 28); // skip some unused values
847  st_num = avio_rl16(pb);
848  st_num &= ASF_STREAM_NUM;
849  lang_idx = avio_rl16(pb); // Stream Language ID Index
850  if (lang_idx >= ASF_MAX_STREAMS)
851  return AVERROR_INVALIDDATA;
852  for (i = 0; i < asf->nb_streams; i++) {
853  if (st_num == asf->asf_st[i]->stream_index) {
854  st = s->streams[asf->asf_st[i]->index];
855  asf->asf_st[i]->lang_idx = lang_idx;
856  break;
857  }
858  }
859  time_per_frame = avio_rl64(pb); // average time per frame
860  if (st) {
861  st->start_time = start_time;
862  st->duration = end_time - start_time;
863  st->codecpar->bit_rate = bitrate;
864  st->avg_frame_rate.num = 10000000;
865  st->avg_frame_rate.den = time_per_frame;
866  }
867  nb_st_name = avio_rl16(pb);
868  nb_pay_exts = avio_rl16(pb);
869  for (i = 0; i < nb_st_name; i++) {
870  uint16_t len;
871 
872  avio_rl16(pb); // Language ID Index
873  len = avio_rl16(pb);
874  avio_skip(pb, len);
875  }
876 
877  for (i = 0; i < nb_pay_exts; i++) {
878  uint32_t len;
879  avio_skip(pb, 16); // Extension System ID
880  avio_skip(pb, 2); // Extension Data Size
881  len = avio_rl32(pb);
882  avio_skip(pb, len);
883  }
884 
885  if ((ret = ff_get_guid(pb, &guid)) < 0) {
886  align_position(pb, asf->offset, size);
887 
888  return 0;
889  }
890 
891  g = find_guid(guid);
892  if (g && !(strcmp(g->name, "Stream Properties"))) {
893  if ((ret = g->read_object(s, g)) < 0)
894  return ret;
895  }
896 
897  align_position(pb, asf->offset, size);
898  return 0;
899 }
900 
902 {
903  ASFContext *asf = s->priv_data;
904  AVIOContext *pb = s->pb;
905  int i, ret;
906  uint64_t size = avio_rl64(pb);
907  uint16_t nb_langs = avio_rl16(pb);
908 
909  if (nb_langs < ASF_MAX_STREAMS) {
910  for (i = 0; i < nb_langs; i++) {
911  size_t len;
912  len = avio_r8(pb);
913  if (!len)
914  len = 6;
915  if ((ret = get_asf_string(pb, len, asf->asf_sd[i].langs,
916  sizeof(asf->asf_sd[i].langs))) < 0) {
917  return ret;
918  }
919  }
920  }
921 
922  align_position(pb, asf->offset, size);
923  return 0;
924 }
925 
926 // returns data object offset when reading this object for the first time
928 {
929  ASFContext *asf = s->priv_data;
930  AVIOContext *pb = s->pb;
931  uint64_t size = asf->data_size = avio_rl64(pb);
932  int i;
933 
934  if (!asf->data_reached) {
935  asf->data_reached = 1;
936  asf->data_offset = asf->offset;
937  }
938 
939  for (i = 0; i < asf->nb_streams; i++) {
940  if (!(asf->b_flags & ASF_FLAG_BROADCAST))
941  s->streams[i]->duration = asf->duration;
942  }
943  asf->nb_mult_left = 0;
944  asf->sub_left = 0;
945  asf->state = PARSE_PACKET_HEADER;
946  asf->return_subpayload = 0;
947  asf->packet_size_internal = 0;
948  avio_skip(pb, 16); // skip File ID
949  size = avio_rl64(pb); // Total Data Packets
950  if (size != asf->nb_packets)
952  "Number of Packets from File Properties Object is not equal to Total"
953  "Datapackets value! num of packets %"PRIu64" total num %"PRIu64".\n",
954  size, asf->nb_packets);
955  avio_skip(pb, 2); // skip reserved field
956  asf->first_packet_offset = avio_tell(pb);
957  if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !(asf->b_flags & ASF_FLAG_BROADCAST))
958  align_position(pb, asf->offset, asf->data_size);
959 
960  return 0;
961 }
962 
964 {
965  ASFContext *asf = s->priv_data;
966  AVIOContext *pb = s->pb;
967  AVStream *st = NULL;
968  uint64_t interval; // index entry time interval in 100 ns units, usually it's 1s
969  uint32_t pkt_num, nb_entries;
970  int32_t prev_pkt_num = -1;
971  int i;
972  int64_t offset;
973  uint64_t size = avio_rl64(pb);
974 
975  // simple index objects should be ordered by stream number, this loop tries to find
976  // the first not indexed video stream
977  for (i = 0; i < asf->nb_streams; i++) {
978  if ((asf->asf_st[i]->type == AVMEDIA_TYPE_VIDEO) && !asf->asf_st[i]->indexed) {
979  asf->asf_st[i]->indexed = 1;
980  st = s->streams[asf->asf_st[i]->index];
981  break;
982  }
983  }
984  if (!st) {
985  avio_skip(pb, size - 24); // if there's no video stream, skip index object
986  return 0;
987  }
988  avio_skip(pb, 16); // skip File ID
989  interval = avio_rl64(pb);
990  avio_skip(pb, 4);
991  nb_entries = avio_rl32(pb);
992  for (i = 0; i < nb_entries; i++) {
993  pkt_num = avio_rl32(pb);
994  offset = avio_skip(pb, 2);
995  if (offset < 0) {
996  av_log(s, AV_LOG_ERROR, "Skipping failed in asf_read_simple_index.\n");
997  return offset;
998  }
999  if (prev_pkt_num != pkt_num) {
1001  pkt_num, av_rescale(interval, i, 10000),
1002  asf->packet_size, 0, AVINDEX_KEYFRAME);
1003  prev_pkt_num = pkt_num;
1004  }
1005  }
1006  asf->is_simple_index = 1;
1007  align_position(pb, asf->offset, size);
1008 
1009  return 0;
1010 }
1011 
1012 static const GUIDParseTable gdef[] = {
1013  { "Data", { 0x75, 0xB2, 0x26, 0x36, 0x66, 0x8E, 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_data, 1 },
1014  { "Simple Index", { 0x33, 0x00, 0x08, 0x90, 0xE5, 0xB1, 0x11, 0xCF, 0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB }, asf_read_simple_index, 1 },
1015  { "Content Description", { 0x75, 0xB2, 0x26, 0x33, 0x66 ,0x8E, 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_content_desc, 1 },
1016  { "Extended Content Description", { 0xD2, 0xD0, 0xA4, 0x40, 0xE3, 0x07, 0x11, 0xD2, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5e, 0xA8, 0x50 }, asf_read_ext_content, 1 },
1017  { "Stream Bitrate Properties", { 0x7B, 0xF8, 0x75, 0xCE, 0x46, 0x8D, 0x11, 0xD1, 0x8D, 0x82, 0x00, 0x60, 0x97, 0xC9, 0xA2, 0xB2 }, asf_read_unknown, 1 },
1018  { "File Properties", { 0x8C, 0xAB, 0xDC, 0xA1, 0xA9, 0x47, 0x11, 0xCF, 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_properties, 1 },
1019  { "Header Extension", { 0x5F, 0xBF, 0x03, 0xB5, 0xA9, 0x2E, 0x11, 0xCF, 0x8E, 0xE3, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_unknown, 0 },
1020  { "Stream Properties", { 0xB7, 0xDC, 0x07, 0x91, 0xA9, 0xB7, 0x11, 0xCF, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_stream_properties, 1 },
1021  { "Codec List", { 0x86, 0xD1, 0x52, 0x40, 0x31, 0x1D, 0x11, 0xD0, 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, asf_read_unknown, 1 },
1022  { "Marker", { 0xF4, 0x87, 0xCD, 0x01, 0xA9, 0x51, 0x11, 0xCF, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, asf_read_marker, 1 },
1023  { "Script Command", { 0x1E, 0xFB, 0x1A, 0x30, 0x0B, 0x62, 0x11, 0xD0, 0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, asf_read_unknown, 1 },
1024  { "Language List", { 0x7C, 0x43, 0x46, 0xa9, 0xef, 0xe0, 0x4B, 0xFC, 0xB2, 0x29, 0x39, 0x3e, 0xde, 0x41, 0x5c, 0x85 }, asf_read_language_list, 1},
1025  { "Padding", { 0x18, 0x06, 0xD4, 0x74, 0xCA, 0xDF, 0x45, 0x09, 0xA4, 0xBA, 0x9A, 0xAB, 0xCB, 0x96, 0xAA, 0xE8 }, asf_read_unknown, 1 },
1026  { "DRMv1 Header", { 0x22, 0x11, 0xB3, 0xFB, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1027  { "DRMv2 Header", { 0x29, 0x8A, 0xE6, 0x14, 0x26, 0x22, 0x4C, 0x17, 0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9c }, asf_read_unknown, 1 },
1028  { "Index", { 0xD6, 0xE2, 0x29, 0xD3, 0x35, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1029  { "Media Object Index", { 0xFE, 0xB1, 0x03, 0xF8, 0x12, 0xAD, 0x4C, 0x64, 0x84, 0x0F, 0x2A, 0x1D, 0x2F, 0x7A, 0xD4, 0x8C }, asf_read_unknown, 1 },
1030  { "Timecode Index", { 0x3C, 0xB7, 0x3F, 0xD0, 0x0C, 0x4A, 0x48, 0x03, 0x95, 0x3D, 0xED, 0xF7, 0xB6, 0x22, 0x8F, 0x0C }, asf_read_unknown, 0 },
1031  { "Bitrate_Mutual_Exclusion", { 0xD6, 0xE2, 0x29, 0xDC, 0x35, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1032  { "Error Correction", { 0x75, 0xB2, 0x26, 0x35, 0x66, 0x8E, 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_unknown, 1 },
1033  { "Content Branding", { 0x22, 0x11, 0xB3, 0xFA, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1034  { "Content Encryption", { 0x22, 0x11, 0xB3, 0xFB, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1035  { "Extended Content Encryption", { 0x29, 0x8A, 0xE6, 0x14, 0x26, 0x22, 0x4C, 0x17, 0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9C }, asf_read_unknown, 1 },
1036  { "Digital Signature", { 0x22, 0x11, 0xB3, 0xFC, 0xBD, 0x23, 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, asf_read_unknown, 1 },
1037  { "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 },
1038  { "Advanced Mutual Exclusion", { 0xA0, 0x86, 0x49, 0xCF, 0x47, 0x75, 0x46, 0x70, 0x8A, 0x16, 0x6E, 0x35, 0x35, 0x75, 0x66, 0xCD }, asf_read_unknown, 1 },
1039  { "Group Mutual Exclusion", { 0xD1, 0x46, 0x5A, 0x40, 0x5A, 0x79, 0x43, 0x38, 0xB7, 0x1B, 0xE3, 0x6B, 0x8F, 0xD6, 0xC2, 0x49 }, asf_read_unknown, 1},
1040  { "Stream Prioritization", { 0xD4, 0xFE, 0xD1, 0x5B, 0x88, 0xD3, 0x45, 0x4F, 0x81, 0xF0, 0xED, 0x5C, 0x45, 0x99, 0x9E, 0x24 }, asf_read_unknown, 1 },
1041  { "Bandwidth Sharing Object", { 0xA6, 0x96, 0x09, 0xE6, 0x51, 0x7B, 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, asf_read_unknown, 1 },
1042  { "Metadata", { 0xC5, 0xF8, 0xCB, 0xEA, 0x5B, 0xAF, 0x48, 0x77, 0x84, 0x67, 0xAA, 0x8C, 0x44, 0xFA, 0x4C, 0xCA }, asf_read_metadata_obj, 1 },
1043  { "Metadata Library", { 0x44, 0x23, 0x1C, 0x94, 0x94, 0x98, 0x49, 0xD1, 0xA1, 0x41, 0x1D, 0x13, 0x4E, 0x45, 0x70, 0x54 }, asf_read_metadata_obj, 1 },
1044  { "Audio Spread", { 0xBF, 0xC3, 0xCD, 0x50, 0x61, 0x8F, 0x11, 0xCF, 0x8B, 0xB2, 0x00, 0xAA, 0x00, 0xB4, 0xE2, 0x20 }, asf_read_unknown, 1 },
1045  { "Index Parameters", { 0xD6, 0xE2, 0x29, 0xDF, 0x35, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1046  { "Content Encryption System Windows Media DRM Network Devices",
1047  { 0x7A, 0x07, 0x9B, 0xB6, 0xDA, 0XA4, 0x4e, 0x12, 0xA5, 0xCA, 0x91, 0xD3, 0x8D, 0xC1, 0x1A, 0x8D }, asf_read_unknown, 1 },
1048  { "Mutex Language", { 0xD6, 0xE2, 0x2A, 0x00, 0x25, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1049  { "Mutex Bitrate", { 0xD6, 0xE2, 0x2A, 0x01, 0x25, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1050  { "Mutex Unknown", { 0xD6, 0xE2, 0x2A, 0x02, 0x25, 0xDA, 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },
1051  { "Bandwidth Sharing Exclusive", { 0xAF, 0x60, 0x60, 0xAA, 0x51, 0x97, 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, asf_read_unknown, 1 },
1052  { "Bandwidth Sharing Partial", { 0xAF, 0x60, 0x60, 0xAB, 0x51, 0x97, 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, asf_read_unknown, 1 },
1053  { "Payload Extension System Timecode", { 0x39, 0x95, 0x95, 0xEC, 0x86, 0x67, 0x4E, 0x2D, 0x8F, 0xDB, 0x98, 0x81, 0x4C, 0xE7, 0x6C, 0x1E }, asf_read_unknown, 1 },
1054  { "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 },
1055  { "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 },
1056  { "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 },
1057  { "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 },
1058  { "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 },
1059  { "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 },
1060 };
1061 
1062 #define READ_LEN(flag, name, len) \
1063  do { \
1064  if ((flag) == name ## IS_BYTE) \
1065  len = avio_r8(pb); \
1066  else if ((flag) == name ## IS_WORD) \
1067  len = avio_rl16(pb); \
1068  else if ((flag) == name ## IS_DWORD) \
1069  len = avio_rl32(pb); \
1070  else \
1071  len = 0; \
1072  } while(0)
1073 
1074 static int asf_read_subpayload(AVFormatContext *s, AVPacket *pkt, int is_header)
1075 {
1076  ASFContext *asf = s->priv_data;
1077  AVIOContext *pb = s->pb;
1078  uint8_t sub_len;
1079  int ret, i;
1080 
1081  if (is_header) {
1082  asf->dts_delta = avio_r8(pb);
1083  if (asf->nb_mult_left) {
1084  asf->mult_sub_len = avio_rl16(pb); // total
1085  }
1086  asf->sub_header_offset = avio_tell(pb);
1087  asf->nb_sub = 0;
1088  asf->sub_left = 1;
1089  }
1090  sub_len = avio_r8(pb);
1091  if ((ret = av_get_packet(pb, pkt, sub_len)) < 0) // each subpayload is entire frame
1092  return ret;
1093  for (i = 0; i < asf->nb_streams; i++) {
1094  if (asf->stream_index == asf->asf_st[i]->stream_index) {
1095  pkt->stream_index = asf->asf_st[i]->index;
1096  break;
1097  }
1098  }
1099  asf->return_subpayload = 1;
1100  if (!sub_len)
1101  asf->return_subpayload = 0;
1102 
1103  if (sub_len)
1104  asf->nb_sub++;
1105  pkt->dts = asf->sub_dts + (asf->nb_sub - 1) * asf->dts_delta - asf->preroll;
1106  if (asf->nb_mult_left && (avio_tell(pb) >=
1107  (asf->sub_header_offset + asf->mult_sub_len))) {
1108  asf->sub_left = 0;
1109  asf->nb_mult_left--;
1110  }
1111  if (avio_tell(pb) >= asf->packet_offset + asf->packet_size - asf->pad_len) {
1112  asf->sub_left = 0;
1113  if (!asf->nb_mult_left) {
1114  avio_skip(pb, asf->pad_len);
1115  if (avio_tell(pb) != asf->packet_offset + asf->packet_size) {
1116  if (!asf->packet_size)
1117  return AVERROR_INVALIDDATA;
1119  "Position %"PRId64" wrong, should be %"PRId64"\n",
1120  avio_tell(pb), asf->packet_offset + asf->packet_size);
1121  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1122  }
1123  }
1124  }
1125 
1126  return 0;
1127 }
1128 
1129 static void reset_packet(ASFPacket *asf_pkt)
1130 {
1131  asf_pkt->size_left = 0;
1132  asf_pkt->data_size = 0;
1133  asf_pkt->duration = 0;
1134  asf_pkt->flags = 0;
1135  asf_pkt->dts = 0;
1136  av_packet_unref(asf_pkt->avpkt);
1137 }
1138 
1140 {
1141  ASFContext *asf = s->priv_data;
1142  AVIOContext *pb = s->pb;
1143  int ret, data_size;
1144 
1145  if (!asf_pkt->data_size) {
1146  data_size = avio_rl32(pb); // read media object size
1147  if (data_size <= 0)
1148  return AVERROR_INVALIDDATA;
1149  if ((ret = av_new_packet(asf_pkt->avpkt, data_size)) < 0)
1150  return ret;
1151  asf_pkt->data_size = asf_pkt->size_left = data_size;
1152  } else
1153  avio_skip(pb, 4); // reading of media object size is already done
1154  asf_pkt->dts = avio_rl32(pb); // read presentation time
1155  if (asf->rep_data_len >= 8)
1156  avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
1157 
1158  return 0;
1159 }
1160 
1162  ASFPacket *asf_pkt)
1163 {
1164  ASFContext *asf = s->priv_data;
1165  AVIOContext *pb = s->pb;
1166  uint16_t pay_len;
1167  unsigned char *p;
1168  int ret;
1169  int skip = 0;
1170 
1171  // if replicated length is 1, subpayloads are present
1172  if (asf->rep_data_len == 1) {
1173  asf->sub_left = 1;
1174  asf->state = READ_MULTI_SUB;
1175  pkt->flags = asf_pkt->flags;
1176  if ((ret = asf_read_subpayload(s, pkt, 1)) < 0)
1177  return ret;
1178  } else {
1179  if (asf->rep_data_len)
1180  if ((ret = asf_read_replicated_data(s, asf_pkt)) < 0)
1181  return ret;
1182  pay_len = avio_rl16(pb); // payload length should be WORD
1183  if (pay_len > asf->packet_size) {
1185  "Error: invalid data packet size, pay_len %"PRIu16", "
1186  "asf->packet_size %"PRIu32", offset %"PRId64".\n",
1187  pay_len, asf->packet_size, avio_tell(pb));
1188  return AVERROR_INVALIDDATA;
1189  }
1190  p = asf_pkt->avpkt->data + asf_pkt->data_size - asf_pkt->size_left;
1191  if (pay_len > asf_pkt->size_left) {
1193  "Error: invalid buffer size, pay_len %d, data size left %d.\n",
1194  pay_len, asf_pkt->size_left);
1195  skip = pay_len - asf_pkt->size_left;
1196  pay_len = asf_pkt->size_left;
1197  }
1198  if (asf_pkt->size_left <= 0)
1199  return AVERROR_INVALIDDATA;
1200  if ((ret = avio_read(pb, p, pay_len)) < 0)
1201  return ret;
1202  if (s->key && s->keylen == 20)
1203  ff_asfcrypt_dec(s->key, p, ret);
1204  avio_skip(pb, skip);
1205  asf_pkt->size_left -= pay_len;
1206  asf->nb_mult_left--;
1207  }
1208 
1209  return 0;
1210 }
1211 
1213 {
1214  ASFContext *asf = s->priv_data;
1215  AVIOContext *pb = s->pb;
1216  int64_t offset;
1217  uint64_t size;
1218  unsigned char *p;
1219  int ret, data_size;
1220 
1221  if (!asf_pkt->data_size) {
1222  data_size = avio_rl32(pb); // read media object size
1223  if (data_size <= 0)
1224  return AVERROR_EOF;
1225  if ((ret = av_new_packet(asf_pkt->avpkt, data_size)) < 0)
1226  return ret;
1227  asf_pkt->data_size = asf_pkt->size_left = data_size;
1228  } else
1229  avio_skip(pb, 4); // skip media object size
1230  asf_pkt->dts = avio_rl32(pb); // read presentation time
1231  if (asf->rep_data_len >= 8)
1232  avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
1233  offset = avio_tell(pb);
1234 
1235  // size of the payload - size of the packet without header and padding
1236  if (asf->packet_size_internal)
1237  size = asf->packet_size_internal - offset + asf->packet_offset - asf->pad_len;
1238  else
1239  size = asf->packet_size - offset + asf->packet_offset - asf->pad_len;
1240  if (size > asf->packet_size) {
1242  "Error: invalid data packet size, offset %"PRId64".\n",
1243  avio_tell(pb));
1244  return AVERROR_INVALIDDATA;
1245  }
1246  p = asf_pkt->avpkt->data + asf_pkt->data_size - asf_pkt->size_left;
1247  if (size > asf_pkt->size_left || asf_pkt->size_left <= 0)
1248  return AVERROR_INVALIDDATA;
1249  if (asf_pkt->size_left > size)
1250  asf_pkt->size_left -= size;
1251  else
1252  asf_pkt->size_left = 0;
1253  if ((ret = avio_read(pb, p, size)) < 0)
1254  return ret;
1255  if (s->key && s->keylen == 20)
1256  ff_asfcrypt_dec(s->key, p, ret);
1257  if (asf->packet_size_internal)
1258  avio_skip(pb, asf->packet_size - asf->packet_size_internal);
1259  avio_skip(pb, asf->pad_len); // skip padding
1260 
1261  return 0;
1262 }
1263 
1265 {
1266  ASFContext *asf = s->priv_data;
1267  AVIOContext *pb = s->pb;
1268  int ret, i;
1269  ASFPacket *asf_pkt = NULL;
1270 
1271  if (!asf->sub_left) {
1272  uint32_t off_len, media_len;
1273  uint8_t stream_num;
1274 
1275  stream_num = avio_r8(pb);
1276  asf->stream_index = stream_num & ASF_STREAM_NUM;
1277  for (i = 0; i < asf->nb_streams; i++) {
1278  if (asf->stream_index == asf->asf_st[i]->stream_index) {
1279  asf_pkt = &asf->asf_st[i]->pkt;
1280  asf_pkt->stream_index = asf->asf_st[i]->index;
1281  break;
1282  }
1283  }
1284  if (!asf_pkt) {
1285  if (asf->packet_offset + asf->packet_size <= asf->data_offset + asf->data_size) {
1286  if (!asf->packet_size) {
1287  av_log(s, AV_LOG_ERROR, "Invalid packet size 0.\n");
1288  return AVERROR_INVALIDDATA;
1289  }
1290  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1291  av_log(s, AV_LOG_WARNING, "Skipping the stream with the invalid stream index %d.\n",
1292  asf->stream_index);
1293  return AVERROR(EAGAIN);
1294  } else
1295  return AVERROR_INVALIDDATA;
1296  }
1297 
1298  if (stream_num >> 7)
1299  asf_pkt->flags |= AV_PKT_FLAG_KEY;
1301  ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_, media_len);
1303  ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_, off_len);
1305  ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_, asf->rep_data_len);
1306  if (asf_pkt->size_left && (asf_pkt->frame_num != media_len)) {
1307  av_log(s, AV_LOG_WARNING, "Unfinished frame will be ignored\n");
1308  reset_packet(asf_pkt);
1309  }
1310  asf_pkt->frame_num = media_len;
1311  asf->sub_dts = off_len;
1312  if (asf->nb_mult_left) {
1313  if ((ret = asf_read_multiple_payload(s, pkt, asf_pkt)) < 0)
1314  return ret;
1315  } else if (asf->rep_data_len == 1) {
1316  asf->sub_left = 1;
1317  asf->state = READ_SINGLE;
1318  pkt->flags = asf_pkt->flags;
1319  if ((ret = asf_read_subpayload(s, pkt, 1)) < 0)
1320  return ret;
1321  } else {
1322  if ((ret = asf_read_single_payload(s, asf_pkt)) < 0)
1323  return ret;
1324  }
1325  } else {
1326  for (i = 0; i <= asf->nb_streams; i++) {
1327  if (asf->stream_index == asf->asf_st[i]->stream_index) {
1328  asf_pkt = &asf->asf_st[i]->pkt;
1329  break;
1330  }
1331  }
1332  if (!asf_pkt)
1333  return AVERROR_INVALIDDATA;
1334  pkt->flags = asf_pkt->flags;
1335  pkt->dts = asf_pkt->dts;
1336  pkt->stream_index = asf->asf_st[i]->index;
1337  if ((ret = asf_read_subpayload(s, pkt, 0)) < 0) // read subpayload without its header
1338  return ret;
1339  }
1340 
1341  return 0;
1342 }
1343 
1345 {
1346  ASFContext *asf = s->priv_data;
1347  AVIOContext *pb = s->pb;
1348  uint64_t size;
1349  uint32_t av_unused seq;
1350  unsigned char error_flags, len_flags, pay_flags;
1351 
1352  asf->packet_offset = avio_tell(pb);
1353  error_flags = avio_r8(pb); // read Error Correction Flags
1354  if (error_flags & ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT) {
1355  if (!(error_flags & ASF_ERROR_CORRECTION_LENGTH_TYPE)) {
1357  avio_skip(pb, size);
1358  }
1359  len_flags = avio_r8(pb);
1360  } else
1361  len_flags = error_flags;
1362  asf->prop_flags = avio_r8(pb);
1364  ASF_PPI_FLAG_PACKET_LENGTH_FIELD_, asf->packet_size_internal);
1366  ASF_PPI_FLAG_SEQUENCE_FIELD_, seq);
1368  ASF_PPI_FLAG_PADDING_LENGTH_FIELD_, asf->pad_len );
1369  asf->send_time = avio_rl32(pb); // send time
1370  avio_skip(pb, 2); // skip duration
1371  if (len_flags & ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT) { // Multiple Payloads present
1372  pay_flags = avio_r8(pb);
1373  asf->nb_mult_left = (pay_flags & ASF_NUM_OF_PAYLOADS);
1374  }
1375 
1376  return 0;
1377 }
1378 
1379 static int asf_deinterleave(AVFormatContext *s, ASFPacket *asf_pkt, int st_num)
1380 {
1381  ASFContext *asf = s->priv_data;
1382  ASFStream *asf_st = asf->asf_st[st_num];
1383  unsigned char *p = asf_pkt->avpkt->data;
1384  uint16_t pkt_len = asf->asf_st[st_num]->virtual_pkt_len;
1385  uint16_t chunk_len = asf->asf_st[st_num]->virtual_chunk_len;
1386  int nchunks = pkt_len / chunk_len;
1387  uint8_t *data;
1388  int pos = 0, j, l, ret;
1389 
1390 
1392  if (!data)
1393  return AVERROR(ENOMEM);
1394  memset(data + asf_pkt->data_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1395 
1396  while (asf_pkt->data_size >= asf_st->span * pkt_len + pos) {
1397  if (pos >= asf_pkt->data_size) {
1398  break;
1399  }
1400  for (l = 0; l < pkt_len; l++) {
1401  if (pos >= asf_pkt->data_size) {
1402  break;
1403  }
1404  for (j = 0; j < asf_st->span; j++) {
1405  if ((pos + chunk_len) >= asf_pkt->data_size)
1406  break;
1407  memcpy(data + pos,
1408  p + (j * nchunks + l) * chunk_len,
1409  chunk_len);
1410  pos += chunk_len;
1411  }
1412  }
1413  p += asf_st->span * pkt_len;
1414  if (p > asf_pkt->avpkt->data + asf_pkt->data_size)
1415  break;
1416  }
1417  av_packet_unref(asf_pkt->avpkt);
1418  ret = av_packet_from_data(asf_pkt->avpkt, data, asf_pkt->data_size);
1419  if (ret < 0)
1420  av_free(data);
1421 
1422  return ret;
1423 }
1424 
1426 {
1427  ASFContext *asf = s->priv_data;
1428  AVIOContext *pb = s->pb;
1429  int ret, i;
1430 
1431  if ((avio_tell(pb) >= asf->data_offset + asf->data_size) &&
1432  !(asf->b_flags & ASF_FLAG_BROADCAST))
1433  return AVERROR_EOF;
1434  while (!pb->eof_reached) {
1435  if (asf->state == PARSE_PACKET_HEADER) {
1437  if (pb->eof_reached)
1438  break;
1439  if (!asf->nb_mult_left)
1440  asf->state = READ_SINGLE;
1441  else
1442  asf->state = READ_MULTI;
1443  }
1444  ret = asf_read_payload(s, pkt);
1445  if (ret == AVERROR(EAGAIN)) {
1446  asf->state = PARSE_PACKET_HEADER;
1447  continue;
1448  }
1449  else if (ret < 0)
1450  return ret;
1451 
1452  switch (asf->state) {
1453  case READ_SINGLE:
1454  if (!asf->sub_left)
1455  asf->state = PARSE_PACKET_HEADER;
1456  break;
1457  case READ_MULTI_SUB:
1458  if (!asf->sub_left && !asf->nb_mult_left) {
1459  asf->state = PARSE_PACKET_HEADER;
1460  if (!asf->return_subpayload &&
1461  (avio_tell(pb) <= asf->packet_offset +
1462  asf->packet_size - asf->pad_len))
1463  avio_skip(pb, asf->pad_len); // skip padding
1464  if (asf->packet_offset + asf->packet_size > avio_tell(pb))
1465  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1466  } else if (!asf->sub_left)
1467  asf->state = READ_MULTI;
1468  break;
1469  case READ_MULTI:
1470  if (!asf->nb_mult_left) {
1471  asf->state = PARSE_PACKET_HEADER;
1472  if (!asf->return_subpayload &&
1473  (avio_tell(pb) <= asf->packet_offset +
1474  asf->packet_size - asf->pad_len))
1475  avio_skip(pb, asf->pad_len); // skip padding
1476  if (asf->packet_offset + asf->packet_size > avio_tell(pb))
1477  avio_seek(pb, asf->packet_offset + asf->packet_size, SEEK_SET);
1478  }
1479  break;
1480  }
1481  if (asf->return_subpayload) {
1482  asf->return_subpayload = 0;
1483  return 0;
1484  }
1485  for (i = 0; i < asf->nb_streams; i++) {
1486  ASFPacket *asf_pkt = &asf->asf_st[i]->pkt;
1487  if (asf_pkt && !asf_pkt->size_left && asf_pkt->data_size) {
1488  if (asf->asf_st[i]->span > 1 &&
1489  asf->asf_st[i]->type == AVMEDIA_TYPE_AUDIO)
1490  if ((ret = asf_deinterleave(s, asf_pkt, i)) < 0)
1491  return ret;
1492  av_packet_move_ref(pkt, asf_pkt->avpkt);
1493  pkt->stream_index = asf->asf_st[i]->index;
1494  pkt->flags = asf_pkt->flags;
1495  pkt->dts = asf_pkt->dts - asf->preroll;
1496  asf_pkt->data_size = 0;
1497  asf_pkt->frame_num = 0;
1498  return 0;
1499  }
1500  }
1501  }
1502 
1503  if (pb->eof_reached)
1504  return AVERROR_EOF;
1505 
1506  return 0;
1507 }
1508 
1510 {
1511  ASFContext *asf = s->priv_data;
1512  int i;
1513 
1514  for (i = 0; i < ASF_MAX_STREAMS; i++) {
1515  av_dict_free(&asf->asf_sd[i].asf_met);
1516  if (i < asf->nb_streams) {
1517  av_packet_free(&asf->asf_st[i]->pkt.avpkt);
1518  av_freep(&asf->asf_st[i]);
1519  }
1520  }
1521 
1522  asf->nb_streams = 0;
1523  return 0;
1524 }
1525 
1527 {
1528  ASFContext *asf = s->priv_data;
1529  int i;
1530 
1531  asf->state = PARSE_PACKET_HEADER;
1532  asf->offset = 0;
1533  asf->return_subpayload = 0;
1534  asf->sub_left = 0;
1535  asf->sub_header_offset = 0;
1536  asf->packet_offset = asf->first_packet_offset;
1537  asf->pad_len = 0;
1538  asf->rep_data_len = 0;
1539  asf->dts_delta = 0;
1540  asf->mult_sub_len = 0;
1541  asf->nb_mult_left = 0;
1542  asf->nb_sub = 0;
1543  asf->prop_flags = 0;
1544  asf->sub_dts = 0;
1545  for (i = 0; i < asf->nb_streams; i++) {
1546  ASFPacket *pkt = &asf->asf_st[i]->pkt;
1547  reset_packet(pkt);
1548  }
1549 }
1550 
1551 /*
1552  * Find a timestamp for the requested position within the payload
1553  * where the pos (position) is the offset inside the Data Object.
1554  * When position is not on the packet boundary, asf_read_timestamp tries
1555  * to find the closest packet offset after this position. If this packet
1556  * is a key frame, this packet timestamp is read and an index entry is created
1557  * for the packet. If this packet belongs to the requested stream,
1558  * asf_read_timestamp upgrades pos to the packet beginning offset and
1559  * returns this packet's dts. So returned dts is the dts of the first key frame with
1560  * matching stream number after given position.
1561  */
1562 static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index,
1563  int64_t *pos, int64_t pos_limit)
1564 {
1565  ASFContext *asf = s->priv_data;
1566  int64_t pkt_pos = *pos, pkt_offset, dts = AV_NOPTS_VALUE, data_end;
1568  int n;
1569 
1570  if (!pkt)
1571  return AVERROR(ENOMEM);
1572 
1573  data_end = asf->data_offset + asf->data_size;
1574 
1575  n = (pkt_pos - asf->first_packet_offset + asf->packet_size - 1) /
1576  asf->packet_size;
1577  n = av_clip(n, 0, ((data_end - asf->first_packet_offset) / asf->packet_size - 1));
1578  pkt_pos = asf->first_packet_offset + n * asf->packet_size;
1579 
1580  avio_seek(s->pb, pkt_pos, SEEK_SET);
1581  pkt_offset = pkt_pos;
1582 
1584  while (avio_tell(s->pb) < data_end) {
1585 
1586  int i, ret, st_found;
1587 
1588  pkt_offset = avio_tell(s->pb);
1589  if ((ret = asf_read_packet(s, pkt)) < 0) {
1590  av_packet_free(&pkt);
1591  dts = AV_NOPTS_VALUE;
1592  return ret;
1593  }
1594  // ASFPacket may contain fragments of packets belonging to different streams,
1595  // pkt_offset is the offset of the first fragment within it.
1596  if ((pkt_offset >= (pkt_pos + asf->packet_size)))
1597  pkt_pos += asf->packet_size;
1598  for (i = 0; i < asf->nb_streams; i++) {
1599  ASFStream *st = asf->asf_st[i];
1600 
1601  st_found = 0;
1602  if (pkt->flags & AV_PKT_FLAG_KEY) {
1603  dts = pkt->dts;
1604  if (dts) {
1605  av_add_index_entry(s->streams[pkt->stream_index], pkt_pos,
1606  dts, pkt->size, 0, AVINDEX_KEYFRAME);
1607  if (stream_index == st->index) {
1608  st_found = 1;
1609  break;
1610  }
1611  }
1612  }
1613  }
1614  if (st_found)
1615  break;
1617  }
1618  *pos = pkt_pos;
1619 
1620  av_packet_free(&pkt);
1621  return dts;
1622 }
1623 
1624 static int asf_read_seek(AVFormatContext *s, int stream_index,
1625  int64_t timestamp, int flags)
1626 {
1627  ASFContext *asf = s->priv_data;
1628  int idx, ret;
1629 
1630  if (s->streams[stream_index]->nb_index_entries && asf->is_simple_index) {
1631  idx = av_index_search_timestamp(s->streams[stream_index], timestamp, flags);
1632  if (idx < 0 || idx >= s->streams[stream_index]->nb_index_entries)
1633  return AVERROR_INVALIDDATA;
1634  avio_seek(s->pb, s->streams[stream_index]->index_entries[idx].pos, SEEK_SET);
1635  } else {
1636  if ((ret = ff_seek_frame_binary(s, stream_index, timestamp, flags)) < 0)
1637  return ret;
1638  }
1639 
1641 
1642  return 0;
1643 }
1644 
1646 {
1647  int j, ret;
1648  const GUIDParseTable *g;
1649 
1650  swap_guid(guid);
1651  g = gdef;
1652  for (j = 0; j < FF_ARRAY_ELEMS(gdef); j++) {
1653  if (!(ret = memcmp(guid, g->guid, sizeof(g->guid))))
1654  return g;
1655  g++;
1656  }
1657 
1658  return NULL;
1659 }
1660 
1661 static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size)
1662 {
1663  ASFContext *asf = s->priv_data;
1664  AVIOContext *pb = s->pb;
1665  const GUIDParseTable *g = NULL;
1666  ff_asf_guid guid;
1667  int ret;
1668 
1669  if (offset > INT64_MAX - size)
1670  return AVERROR_INVALIDDATA;
1671 
1672  while (avio_tell(pb) <= offset + size) {
1673  if (avio_tell(pb) == asf->offset)
1674  break;
1675  asf->offset = avio_tell(pb);
1676  if ((ret = ff_get_guid(pb, &guid)) < 0)
1677  return ret;
1678  g = find_guid(guid);
1679  if (g) {
1680  if ((ret = g->read_object(s, g)) < 0)
1681  return ret;
1682  } else {
1683  GUIDParseTable g2;
1684 
1685  g2.name = "Unknown";
1686  g2.is_subobject = 1;
1687  asf_read_unknown(s, &g2);
1688  }
1689  }
1690 
1691  return 0;
1692 }
1693 
1695 {
1696  ASFContext *asf = s->priv_data;
1697  AVIOContext *pb = s->pb;
1698  const GUIDParseTable *g = NULL;
1699  ff_asf_guid guid;
1700  int i, ret;
1701  uint64_t size;
1702 
1703  asf->preroll = 0;
1704  asf->is_simple_index = 0;
1705  ff_get_guid(pb, &guid);
1706  if (ff_guidcmp(&guid, &ff_asf_header))
1707  return AVERROR_INVALIDDATA;
1708  avio_skip(pb, 8); // skip header object size
1709  avio_skip(pb, 6); // skip number of header objects and 2 reserved bytes
1710  asf->data_reached = 0;
1711 
1712  /* 1 is here instead of pb->eof_reached because (when not streaming), Data are skipped
1713  * for the first time,
1714  * Index object is processed and got eof and then seeking back to the Data is performed.
1715  */
1716  while (1) {
1717  // for the cases when object size is invalid
1718  if (avio_tell(pb) == asf->offset)
1719  break;
1720  asf->offset = avio_tell(pb);
1721  if ((ret = ff_get_guid(pb, &guid)) < 0) {
1722  if (ret == AVERROR_EOF && asf->data_reached)
1723  break;
1724  else
1725  goto failed;
1726  }
1727  g = find_guid(guid);
1728  if (g) {
1729  asf->unknown_offset = asf->offset;
1730  asf->is_header = 1;
1731  if ((ret = g->read_object(s, g)) < 0)
1732  goto failed;
1733  } else {
1734  size = avio_rl64(pb);
1735  align_position(pb, asf->offset, size);
1736  }
1737  if (asf->data_reached &&
1738  (!(pb->seekable & AVIO_SEEKABLE_NORMAL) ||
1739  (asf->b_flags & ASF_FLAG_BROADCAST)))
1740  break;
1741  }
1742 
1743  if (!asf->data_reached) {
1744  av_log(s, AV_LOG_ERROR, "Data Object was not found.\n");
1746  goto failed;
1747  }
1748  if (pb->seekable & AVIO_SEEKABLE_NORMAL)
1749  avio_seek(pb, asf->first_packet_offset, SEEK_SET);
1750 
1751  for (i = 0; i < asf->nb_streams; i++) {
1752  const char *rfc1766 = asf->asf_sd[asf->asf_st[i]->lang_idx].langs;
1753  AVStream *st = s->streams[asf->asf_st[i]->index];
1754  set_language(s, rfc1766, &st->metadata);
1755  }
1756 
1757  for (i = 0; i < ASF_MAX_STREAMS; i++) {
1758  AVStream *st = NULL;
1759 
1760  st = find_stream(s, i);
1761  if (st) {
1763  if (asf->asf_sd[i].aspect_ratio.num > 0 && asf->asf_sd[i].aspect_ratio.den > 0) {
1766  }
1767  }
1768  }
1769 
1770  return 0;
1771 
1772 failed:
1773  asf_read_close(s);
1774  return ret;
1775 }
1776 
1778  .name = "asf_o",
1779  .long_name = NULL_IF_CONFIG_SMALL("ASF (Advanced / Active Streaming Format)"),
1780  .priv_data_size = sizeof(ASFContext),
1781  .read_probe = asf_probe,
1785  .read_timestamp = asf_read_timestamp,
1788 };
reset_packet
static void reset_packet(ASFPacket *asf_pkt)
Definition: asfdec_o.c:1129
ff_asf_ext_stream_embed_stream_header
const ff_asf_guid ff_asf_ext_stream_embed_stream_header
Definition: asf.c:94
ff_asf_jfif_media
const ff_asf_guid ff_asf_jfif_media
Definition: asf.c:51
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:451
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:634
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
PUT_UTF8
#define PUT_UTF8(val, tmp, PUT_BYTE)
Definition: common.h:552
asf_read_replicated_data
static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt)
Definition: asfdec_o.c:1139
name
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 minimum maximum flags name is the option name
Definition: writing_filters.txt:88
av_clip
#define av_clip
Definition: common.h:122
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:4509
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
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:3332
ASFStreamData::langs
char langs[32]
Definition: asfdec_o.c:89
FFSWAP
#define FFSWAP(type, a, b)
Definition: common.h:108
asf_read_subpayload
static int asf_read_subpayload(AVFormatContext *s, AVPacket *pkt, int is_header)
Definition: asfdec_o.c:1074
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:841
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:131
id3v2.h
ASFContext::packet_offset
int64_t packet_offset
Definition: asfdec_o.c:129
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:27
AVPacket::data
uint8_t * data
Definition: packet.h:369
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:946
data
const char data[16]
Definition: mxf.c:142
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:1120
asfcrypt.h
asf_read_header
static int asf_read_header(AVFormatContext *s)
Definition: asfdec_o.c:1694
detect_unknown_subobject
static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size)
Definition: asfdec_o.c:1661
ff_asf_video_stream
const ff_asf_guid ff_asf_video_stream
Definition: asf.c:47
swap_guid
static void swap_guid(ff_asf_guid guid)
Definition: asfdec_o.c:159
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: codec_par.h:64
mathematics.h
AVDictionary
Definition: dict.c:30
AVFMT_NOBINSEARCH
#define AVFMT_NOBINSEARCH
Format does not allow to fall back on binary search via read_timestamp.
Definition: avformat.h:468
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:463
asf_read_ext_content
static int asf_read_ext_content(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:495
ASFContext::data_offset
uint64_t data_offset
beginning of the first data packet
Definition: asfdec_f.c:85
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:1182
asf_read_properties
static int asf_read_properties(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:645
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:410
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: avpacket.c:75
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:2145
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:811
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:122
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:453
CodecMime
Definition: internal.h:47
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:927
ASF_FLAG_BROADCAST
#define ASF_FLAG_BROADCAST
Definition: asfdec_o.c:47
ASFContext::offset
int64_t offset
Definition: asfdec_o.c:111
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:209
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:133
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:2013
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:963
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:652
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:922
ff_asf_o_demuxer
AVInputFormat ff_asf_o_demuxer
Definition: asfdec_o.c:1777
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:734
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:955
asf_read_metadata_obj
static int asf_read_metadata_obj(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:568
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
ASFContext::READ_MULTI
@ READ_MULTI
Definition: asfdec_o.c:142
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
asf_deinterleave
static int asf_deinterleave(AVFormatContext *s, ASFPacket *asf_pkt, int st_num)
Definition: asfdec_o.c:1379
AVInputFormat
Definition: avformat.h:640
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
ID3v2ExtraMeta
Definition: id3v2.h:84
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:147
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:532
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
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:99
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:117
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:443
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: codec_par.h:126
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:283
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:1232
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:1624
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1038
AV_LANG_ISO639_2_BIBL
@ AV_LANG_ISO639_2_BIBL
Definition: avlanguage.h:28
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:527
NULL
#define NULL
Definition: coverity.c:32
ff_asf_guid
uint8_t ff_asf_guid[16]
Definition: riff.h:96
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:131
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
ASFPacket::avpkt
AVPacket * avpkt
Definition: asfdec_o.c:66
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
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:1142
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:441
ASFPacket
Definition: asfdec_o.c:65
READ_LEN
#define READ_LEN(flag, name, len)
Definition: asfdec_o.c:1062
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:937
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:690
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: codec_id.h:46
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:152
asf_read_multiple_payload
static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt, ASFPacket *asf_pkt)
Definition: asfdec_o.c:1161
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:750
av_packet_from_data
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
Initialize a reference-counted packet from av_malloc()ed data.
Definition: avpacket.c:166
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AVMediaType
AVMediaType
Definition: avutil.h:199
AVPacket::size
int size
Definition: packet.h:370
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:117
id
enum AVCodecID id
Definition: extract_extradata_bsf.c:325
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:3131
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:332
FFMAX
#define FFMAX(a, b)
Definition: common.h:103
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:4945
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:548
size
int size
Definition: twinvq_data.h:10344
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:935
ASFContext::PARSE_PACKET_HEADER
@ PARSE_PACKET_HEADER
Definition: asfdec_o.c:140
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: packet.h:368
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:624
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:688
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: packet.h:375
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: avpacket.c:64
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:1212
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:1264
gdef
static const GUIDParseTable gdef[]
Definition: asfdec_o.c:1012
ASFContext::READ_SINGLE
@ READ_SINGLE
Definition: asfdec_o.c:141
ASFStream::pkt
AVPacket pkt
Definition: asfdec_f.c:51
ff_asf_command_stream
const ff_asf_guid ff_asf_command_stream
Definition: asf.c:59
ASF_DWORD
#define ASF_DWORD
Definition: asfdec_o.c:44
ASFPacket::frame_num
uint32_t frame_num
Definition: asfdec_o.c:68
i
int i
Definition: input.c:407
asf_read_content_desc
static int asf_read_content_desc(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:616
ASFPacket::dts
int64_t dts
Definition: asfdec_o.c:67
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:47
avio_internal.h
internal.h
AVCodecParameters::height
int height
Definition: codec_par.h:127
set_language
static void set_language(AVFormatContext *s, const char *rfc1766, AVDictionary **met)
Definition: asfdec_o.c:818
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:524
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:237
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:1562
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
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: utils.c:4641
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::state
enum ASFContext::@243 state
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:157
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:310
AVStream::disposition
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:926
tag
uint32_t tag
Definition: movenc.c:1611
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:880
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:873
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:253
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
pos
unsigned int pos
Definition: spdifenc.c:412
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
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: avcodec.h:215
asf.h
ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE
#define ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE
Definition: asf.h:136
ASFStream::pkt
ASFPacket pkt
Definition: asfdec_o.c:85
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:874
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:33
ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT
#define ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT
Definition: asf.h:126
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
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:469
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:633
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:1425
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: packet.h:371
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:337
CodecMime::str
char str[32]
Definition: internal.h:48
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:141
CodecMime::id
enum AVCodecID id
Definition: internal.h:49
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
asf_read_close
static int asf_read_close(AVFormatContext *s)
Definition: asfdec_o.c:1509
ASFContext
Definition: asfdec_f.c:74
reset_packet_state
static void reset_packet_state(AVFormatContext *s)
Definition: asfdec_o.c:1526
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:1645
asf_read_ext_stream_properties
static int asf_read_ext_stream_properties(AVFormatContext *s, const GUIDParseTable *g)
Definition: asfdec_o.c:831
ASFContext::READ_MULTI_SUB
@ READ_MULTI_SUB
Definition: asfdec_o.c:143
ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT
#define ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT
Definition: asf.h:107
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
AVPacket
This structure stores compressed data.
Definition: packet.h:346
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:1126
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:758
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:712
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
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: codec_par.h:89
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:901
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:912
avstring.h
int
int
Definition: ffmpeg_filter.c:170
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:1344
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_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:2130
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:364