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