FFmpeg
asfdec_f.c
Go to the documentation of this file.
1 /*
2  * ASF compatible demuxer
3  * Copyright (c) 2000, 2001 Fabrice Bellard
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 <inttypes.h>
23 
24 #include "libavutil/attributes.h"
25 #include "libavutil/avassert.h"
26 #include "libavutil/avstring.h"
27 #include "libavutil/bswap.h"
28 #include "libavutil/common.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/mem.h"
33 #include "libavutil/opt.h"
34 #include "avformat.h"
35 #include "avio_internal.h"
36 #include "avlanguage.h"
37 #include "demux.h"
38 #include "internal.h"
39 #include "riff.h"
40 #include "asf.h"
41 #include "asfcrypt.h"
42 
43 typedef struct ASFPayload {
44  uint8_t type;
45  uint16_t size;
46 } ASFPayload;
47 
48 typedef struct ASFStream {
49  int num;
50  unsigned char seq;
51  /* use for reading */
55  int timestamp;
58  int pkt_clean;
59 
60  int ds_span; /* descrambling */
63 
65 
67 
69  uint32_t palette[256];
70 
73 } ASFStream;
74 
75 typedef struct ASFContext {
76  const AVClass *class;
77  int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID
78  ASFStream streams[128]; ///< it's max number and it's not that big
79  uint32_t stream_bitrates[128]; ///< max number of streams, bitrate for each (for streaming)
81  char stream_languages[128][6]; ///< max number of streams, language for each (RFC1766, e.g. en-US)
82  /* non streamed additonnal info */
83  /* packet filling */
85  /* only for reading */
86  uint64_t data_offset; ///< beginning of the first data packet
87  uint64_t data_object_offset; ///< data object offset (excl. GUID & size)
88  uint64_t data_object_size; ///< size of the data object
90 
92 
102  unsigned int packet_frag_offset;
103  unsigned int packet_frag_size;
110 
112 
113  ASFStream *asf_st; ///< currently decoded stream
114 
117 
119 } ASFContext;
120 
121 static const AVOption options[] = {
122  { "no_resync_search", "Don't try to resynchronize by looking for a certain optional start code", offsetof(ASFContext, no_resync_search), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
123  { "export_xmp", "Export full XMP metadata", offsetof(ASFContext, export_xmp), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
124  { NULL },
125 };
126 
127 static const AVClass asf_class = {
128  .class_name = "asf demuxer",
129  .item_name = av_default_item_name,
130  .option = options,
131  .version = LIBAVUTIL_VERSION_INT,
132 };
133 
134 #undef NDEBUG
135 #include <assert.h>
136 
137 #define ASF_MAX_STREAMS 127
138 #define FRAME_HEADER_SIZE 6
139 // Fix Me! FRAME_HEADER_SIZE may be different.
140 // (7 is known to be too large for GipsyGuitar.wmv)
141 
142 #ifdef DEBUG
143 static const ff_asf_guid stream_bitrate_guid = { /* (http://get.to/sdp) */
144  0xce, 0x75, 0xf8, 0x7b, 0x8d, 0x46, 0xd1, 0x11, 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2
145 };
146 
147 static const ff_asf_guid asf_audio_conceal_none = {
148  // 0x40, 0xa4, 0xf1, 0x49, 0x4ece, 0x11d0, 0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6
149  // New value lifted from avifile
150  0x00, 0x57, 0xfb, 0x20, 0x55, 0x5B, 0xCF, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b
151 };
152 
153 #define PRINT_IF_GUID(g, cmp) \
154  if (!ff_guidcmp(g, &(cmp))) \
155  av_log(NULL, AV_LOG_TRACE, "(GUID: %s) ", # cmp)
156 
157 static void print_guid(ff_asf_guid *g)
158 {
159  int i;
160  PRINT_IF_GUID(g, ff_asf_header);
161  else PRINT_IF_GUID(g, ff_asf_file_header);
162  else PRINT_IF_GUID(g, ff_asf_stream_header);
163  else PRINT_IF_GUID(g, ff_asf_audio_stream);
164  else PRINT_IF_GUID(g, asf_audio_conceal_none);
165  else PRINT_IF_GUID(g, ff_asf_video_stream);
166  else PRINT_IF_GUID(g, ff_asf_video_conceal_none);
167  else PRINT_IF_GUID(g, ff_asf_command_stream);
168  else PRINT_IF_GUID(g, ff_asf_comment_header);
169  else PRINT_IF_GUID(g, ff_asf_codec_comment_header);
170  else PRINT_IF_GUID(g, ff_asf_codec_comment1_header);
171  else PRINT_IF_GUID(g, ff_asf_data_header);
172  else PRINT_IF_GUID(g, ff_asf_simple_index_header);
173  else PRINT_IF_GUID(g, ff_asf_head1_guid);
174  else PRINT_IF_GUID(g, ff_asf_head2_guid);
175  else PRINT_IF_GUID(g, ff_asf_my_guid);
176  else PRINT_IF_GUID(g, ff_asf_ext_stream_header);
177  else PRINT_IF_GUID(g, ff_asf_extended_content_header);
178  else PRINT_IF_GUID(g, ff_asf_ext_stream_embed_stream_header);
179  else PRINT_IF_GUID(g, ff_asf_ext_stream_audio_stream);
180  else PRINT_IF_GUID(g, ff_asf_metadata_header);
181  else PRINT_IF_GUID(g, ff_asf_metadata_library_header);
182  else PRINT_IF_GUID(g, ff_asf_marker_header);
183  else PRINT_IF_GUID(g, stream_bitrate_guid);
184  else PRINT_IF_GUID(g, ff_asf_language_guid);
185  else
186  av_log(NULL, AV_LOG_TRACE, "(GUID: unknown) ");
187  for (i = 0; i < 16; i++)
188  av_log(NULL, AV_LOG_TRACE, " 0x%02x,", (*g)[i]);
189  av_log(NULL, AV_LOG_TRACE, "}\n");
190 }
191 #undef PRINT_IF_GUID
192 #else
193 #define print_guid(g) while(0)
194 #endif
195 
196 static int asf_probe(const AVProbeData *pd)
197 {
198  /* check file header */
199  if (!ff_guidcmp(pd->buf, &ff_asf_header))
200  return AVPROBE_SCORE_MAX;
201  else
202  return 0;
203 }
204 
205 static uint64_t get_value(AVIOContext *pb, int type)
206 {
207  switch (type) {
208  case ASF_BOOL:
209  return avio_rl16(pb);
210  case ASF_DWORD:
211  return avio_rl32(pb);
212  case ASF_QWORD:
213  return avio_rl64(pb);
214  case ASF_WORD:
215  return avio_rl16(pb);
216  default:
217  return 0;
218  }
219 }
220 
221 static void get_tag(AVFormatContext *s, const char *key, int type, int len)
222 {
223  ASFContext *asf = s->priv_data;
224  char *value = NULL;
225  int64_t off = avio_tell(s->pb);
226 #define LEN 22
227 
228  av_assert0((unsigned)len < (INT_MAX - LEN) / 2);
229 
230  if (!asf->export_xmp && !strncmp(key, "xmp", 3))
231  goto finish;
232 
233  value = av_malloc(2 * len + LEN);
234  if (!value)
235  goto finish;
236 
237  switch (type) {
238  case ASF_UNICODE:
239  avio_get_str16le(s->pb, len, value, 2 * len + 1);
240  break;
241  case -1:; // ASCII
242  int ret = ffio_read_size(s->pb, value, len);
243  if (ret < 0)
244  goto finish;
245  value[len]=0;
246  break;
247  case ASF_BYTE_ARRAY:
248  if (ff_asf_handle_byte_array(s, key, len) > 0)
249  av_log(s, AV_LOG_VERBOSE, "Unsupported byte array in tag %s.\n", key);
250  goto finish;
251  case ASF_BOOL:
252  case ASF_DWORD:
253  case ASF_QWORD:
254  case ASF_WORD: {
255  uint64_t num = get_value(s->pb, type);
256  snprintf(value, LEN, "%"PRIu64, num);
257  break;
258  }
259  case ASF_GUID:
260  av_log(s, AV_LOG_DEBUG, "Unsupported GUID value in tag %s.\n", key);
261  goto finish;
262  default:
264  "Unsupported value type %d in tag %s.\n", type, key);
265  goto finish;
266  }
267  if (*value)
268  av_dict_set(&s->metadata, key, value, 0);
269 
270 finish:
271  av_freep(&value);
272  avio_seek(s->pb, off + len, SEEK_SET);
273 }
274 
276 {
277  ASFContext *asf = s->priv_data;
278  AVIOContext *pb = s->pb;
279 
280  ff_get_guid(pb, &asf->hdr.guid);
281  asf->hdr.file_size = avio_rl64(pb);
282  asf->hdr.create_time = avio_rl64(pb);
283  avio_rl64(pb); /* number of packets */
284  asf->hdr.play_time = avio_rl64(pb);
285  asf->hdr.send_time = avio_rl64(pb);
286  asf->hdr.preroll = avio_rl32(pb);
287  asf->hdr.ignore = avio_rl32(pb);
288  asf->hdr.flags = avio_rl32(pb);
289  asf->hdr.min_pktsize = avio_rl32(pb);
290  asf->hdr.max_pktsize = avio_rl32(pb);
291  if (asf->hdr.min_pktsize >= (1U << 29))
292  return AVERROR_INVALIDDATA;
293  asf->hdr.max_bitrate = avio_rl32(pb);
294  s->packet_size = asf->hdr.max_pktsize;
295 
296  ff_dict_set_timestamp(&s->metadata, "creation_time", ff_asf_filetime_to_avtime(asf->hdr.create_time));
297  return 0;
298 }
299 
301 {
302  ASFContext *asf = s->priv_data;
303  AVIOContext *pb = s->pb;
304  AVStream *st;
305  FFStream *sti;
306  ASFStream *asf_st;
307  ff_asf_guid g;
308  enum AVMediaType type;
309  int type_specific_size, sizeX;
310  unsigned int tag1;
311  int64_t pos1, pos2, start_time;
312  int test_for_ext_stream_audio, is_dvr_ms_audio = 0;
313 
314  if (s->nb_streams == ASF_MAX_STREAMS) {
315  av_log(s, AV_LOG_ERROR, "too many streams\n");
316  return AVERROR(EINVAL);
317  }
318 
319  pos1 = avio_tell(pb);
320 
321  st = avformat_new_stream(s, NULL);
322  if (!st)
323  return AVERROR(ENOMEM);
324  sti = ffstream(st);
325  avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
326  start_time = asf->hdr.preroll;
327 
328  if (!(asf->hdr.flags & 0x01)) { // if we aren't streaming...
329  int64_t fsize = avio_size(pb);
330  if (fsize <= 0 || (int64_t)asf->hdr.file_size <= 0 ||
331  FFABS(fsize - (int64_t)asf->hdr.file_size) < FFMIN(fsize, asf->hdr.file_size)/20)
332  st->duration = asf->hdr.play_time /
333  (10000000 / 1000) - start_time;
334  }
335  ff_get_guid(pb, &g);
336 
337  test_for_ext_stream_audio = 0;
338  if (!ff_guidcmp(&g, &ff_asf_audio_stream)) {
340  } else if (!ff_guidcmp(&g, &ff_asf_video_stream)) {
342  } else if (!ff_guidcmp(&g, &ff_asf_jfif_media)) {
345  } else if (!ff_guidcmp(&g, &ff_asf_command_stream)) {
348  test_for_ext_stream_audio = 1;
350  } else {
351  return -1;
352  }
353  ff_get_guid(pb, &g);
354  avio_skip(pb, 8); /* total_size */
355  type_specific_size = avio_rl32(pb);
356  avio_rl32(pb);
357  st->id = avio_rl16(pb) & 0x7f; /* stream id */
358  // mapping of asf ID to AV stream ID;
359  asf->asfid2avid[st->id] = s->nb_streams - 1;
360  asf_st = &asf->streams[st->id];
361 
362  avio_rl32(pb);
363 
364  if (test_for_ext_stream_audio) {
365  ff_get_guid(pb, &g);
368  is_dvr_ms_audio = 1;
369  ff_get_guid(pb, &g);
370  avio_rl32(pb);
371  avio_rl32(pb);
372  avio_rl32(pb);
373  ff_get_guid(pb, &g);
374  avio_rl32(pb);
375  }
376  }
377 
378  st->codecpar->codec_type = type;
379  if (type == AVMEDIA_TYPE_AUDIO) {
380  int ret = ff_get_wav_header(s, pb, st->codecpar, type_specific_size, 0);
381  if (ret < 0)
382  return ret;
383  if (is_dvr_ms_audio) {
384  // codec_id and codec_tag are unreliable in dvr_ms
385  // files. Set them later by probing stream.
386  sti->request_probe = 1;
387  st->codecpar->codec_tag = 0;
388  }
389  if (st->codecpar->codec_id == AV_CODEC_ID_AAC)
391  else
393  /* We have to init the frame size at some point .... */
394  pos2 = avio_tell(pb);
395  if (size >= (pos2 + 8 - pos1 + 24)) {
396  asf_st->ds_span = avio_r8(pb);
397  asf_st->ds_packet_size = avio_rl16(pb);
398  asf_st->ds_chunk_size = avio_rl16(pb);
399  avio_rl16(pb); // ds_data_size
400  avio_r8(pb); // ds_silence_data
401  }
402  if (asf_st->ds_span > 1) {
403  if (!asf_st->ds_chunk_size ||
404  (asf_st->ds_packet_size / asf_st->ds_chunk_size <= 1) ||
405  asf_st->ds_packet_size % asf_st->ds_chunk_size)
406  asf_st->ds_span = 0; // disable descrambling
407  }
408  } else if (type == AVMEDIA_TYPE_VIDEO &&
409  size - (avio_tell(pb) - pos1 + 24) >= 51) {
410  avio_rl32(pb);
411  avio_rl32(pb);
412  avio_r8(pb);
413  avio_rl16(pb); /* size */
414  sizeX = avio_rl32(pb); /* size */
415  st->codecpar->width = avio_rl32(pb);
416  st->codecpar->height = avio_rl32(pb);
417  /* not available for asf */
418  avio_rl16(pb); /* panes */
419  st->codecpar->bits_per_coded_sample = avio_rl16(pb); /* depth */
420  tag1 = avio_rl32(pb);
421  avio_skip(pb, 20);
422  if (sizeX > 40) {
423  if (size < sizeX - 40 || sizeX - 40 > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
424  return AVERROR_INVALIDDATA;
425  st->codecpar->extradata_size = ffio_limit(pb, sizeX - 40);
428  if (!st->codecpar->extradata)
429  return AVERROR(ENOMEM);
431  }
432 
433  /* Extract palette from extradata if bpp <= 8 */
434  /* This code assumes that extradata contains only palette */
435  /* This is true for all paletted codecs implemented in libavcodec */
436  if (st->codecpar->extradata_size && (st->codecpar->bits_per_coded_sample <= 8)) {
437 #if HAVE_BIGENDIAN
438  int i;
439  for (i = 0; i < FFMIN(st->codecpar->extradata_size, AVPALETTE_SIZE) / 4; i++)
440  asf_st->palette[i] = av_bswap32(((uint32_t *)st->codecpar->extradata)[i]);
441 #else
442  memcpy(asf_st->palette, st->codecpar->extradata,
444 #endif
445  asf_st->palette_changed = 1;
446  }
447 
448  st->codecpar->codec_tag = tag1;
450  if (!st->codecpar->codec_id)
452  if (tag1 == MKTAG('D', 'V', 'R', ' ')) {
454  /* issue658 contains wrong w/h and MS even puts a fake seq header
455  * with wrong w/h in extradata while a correct one is in the stream.
456  * maximum lameness */
457  st->codecpar->width =
458  st->codecpar->height = 0;
459  av_freep(&st->codecpar->extradata);
460  st->codecpar->extradata_size = 0;
461  }
462  if (st->codecpar->codec_id == AV_CODEC_ID_H264)
464  if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4)
466  if (st->codecpar->codec_id == AV_CODEC_ID_HEVC)
468  }
469  pos2 = avio_tell(pb);
470  avio_skip(pb, size - (pos2 - pos1 + 24));
471 
472  return 0;
473 }
474 
476 {
477  ASFContext *asf = s->priv_data;
478  AVIOContext *pb = s->pb;
479  ff_asf_guid g;
480  int ext_len, payload_ext_ct, stream_ct, i;
481  uint32_t leak_rate, stream_num;
482  unsigned int stream_languageid_index;
483 
484  avio_rl64(pb); // starttime
485  avio_rl64(pb); // endtime
486  leak_rate = avio_rl32(pb); // leak-datarate
487  avio_rl32(pb); // bucket-datasize
488  avio_rl32(pb); // init-bucket-fullness
489  avio_rl32(pb); // alt-leak-datarate
490  avio_rl32(pb); // alt-bucket-datasize
491  avio_rl32(pb); // alt-init-bucket-fullness
492  avio_rl32(pb); // max-object-size
493  avio_rl32(pb); // flags (reliable,seekable,no_cleanpoints?,resend-live-cleanpoints, rest of bits reserved)
494  stream_num = avio_rl16(pb); // stream-num
495 
496  stream_languageid_index = avio_rl16(pb); // stream-language-id-index
497  if (stream_num < 128)
498  asf->streams[stream_num].stream_language_index = stream_languageid_index;
499 
500  avio_rl64(pb); // avg frametime in 100ns units
501  stream_ct = avio_rl16(pb); // stream-name-count
502  payload_ext_ct = avio_rl16(pb); // payload-extension-system-count
503 
504  if (stream_num < 128) {
505  asf->stream_bitrates[stream_num] = leak_rate;
506  asf->streams[stream_num].payload_ext_ct = 0;
507  }
508 
509  for (i = 0; i < stream_ct; i++) {
510  avio_rl16(pb);
511  ext_len = avio_rl16(pb);
512  avio_skip(pb, ext_len);
513  }
514 
515  for (i = 0; i < payload_ext_ct; i++) {
516  int size;
517  ff_get_guid(pb, &g);
518  size = avio_rl16(pb);
519  ext_len = avio_rl32(pb);
520  if (ext_len < 0)
521  return AVERROR_INVALIDDATA;
522  avio_skip(pb, ext_len);
523  if (stream_num < 128 && i < FF_ARRAY_ELEMS(asf->streams[stream_num].payload)) {
524  ASFPayload *p = &asf->streams[stream_num].payload[i];
525  p->type = g[0];
526  p->size = size;
527  av_log(s, AV_LOG_DEBUG, "Payload extension %x %d\n", g[0], p->size );
528  asf->streams[stream_num].payload_ext_ct ++;
529  }
530  }
531 
532  return 0;
533 }
534 
536 {
537  AVIOContext *pb = s->pb;
538  int len1, len2, len3, len4, len5;
539 
540  len1 = avio_rl16(pb);
541  len2 = avio_rl16(pb);
542  len3 = avio_rl16(pb);
543  len4 = avio_rl16(pb);
544  len5 = avio_rl16(pb);
545  get_tag(s, "title", 0, len1);
546  get_tag(s, "author", 0, len2);
547  get_tag(s, "copyright", 0, len3);
548  get_tag(s, "comment", 0, len4);
549  avio_skip(pb, len5);
550 
551  return 0;
552 }
553 
555 {
556  AVIOContext *pb = s->pb;
557  ASFContext *asf = s->priv_data;
558  int desc_count, i, ret;
559 
560  desc_count = avio_rl16(pb);
561  for (i = 0; i < desc_count; i++) {
562  int name_len, value_type, value_len;
563  char name[1024];
564 
565  name_len = avio_rl16(pb);
566  if (name_len % 2) // must be even, broken lavf versions wrote len-1
567  name_len += 1;
568  if ((ret = avio_get_str16le(pb, name_len, name, sizeof(name))) < name_len)
569  avio_skip(pb, name_len - ret);
570  value_type = avio_rl16(pb);
571  value_len = avio_rl16(pb);
572  if (!value_type && value_len % 2)
573  value_len += 1;
574  /* size of type 2 (BOOL) is 32bit for "Extended Content Description Object"
575  * but 16 bit for "Metadata Object" and "Metadata Library Object" */
576  if (value_type == ASF_BOOL)
577  value_type = ASF_DWORD;
578  /* My sample has that stream set to 0 maybe that mean the container.
579  * ASF stream count starts at 1. I am using 0 to the container value
580  * since it's unused. */
581  if (!strcmp(name, "AspectRatioX"))
582  asf->dar[0].num = get_value(s->pb, value_type);
583  else if (!strcmp(name, "AspectRatioY"))
584  asf->dar[0].den = get_value(s->pb, value_type);
585  else
586  get_tag(s, name, value_type, value_len);
587  }
588 
589  return 0;
590 }
591 
593 {
594  AVIOContext *pb = s->pb;
595  ASFContext *asf = s->priv_data;
596  int j, ret;
597  int stream_count = avio_rl16(pb);
598  for (j = 0; j < stream_count; j++) {
599  char lang[6];
600  unsigned int lang_len = avio_r8(pb);
601  if ((ret = avio_get_str16le(pb, lang_len, lang,
602  sizeof(lang))) < lang_len)
603  avio_skip(pb, lang_len - ret);
604  if (j < 128)
605  av_strlcpy(asf->stream_languages[j], lang,
606  sizeof(*asf->stream_languages));
607  }
608 
609  return 0;
610 }
611 
613 {
614  AVIOContext *pb = s->pb;
615  ASFContext *asf = s->priv_data;
616  int n, stream_num, name_len_utf16, name_len_utf8;
617  unsigned int value_len;
618  int ret, i;
619  n = avio_rl16(pb);
620 
621  for (i = 0; i < n; i++) {
622  uint8_t *name;
623  int value_type;
624 
625  avio_rl16(pb); // lang_list_index
626  stream_num = avio_rl16(pb);
627  name_len_utf16 = avio_rl16(pb);
628  value_type = avio_rl16(pb); /* value_type */
629  value_len = avio_rl32(pb);
630 
631  if (value_len >= (INT_MAX - LEN) / 2)
632  return AVERROR_INVALIDDATA;
633 
634  name_len_utf8 = 2*name_len_utf16 + 1;
635  name = av_malloc(name_len_utf8);
636  if (!name)
637  return AVERROR(ENOMEM);
638 
639  if ((ret = avio_get_str16le(pb, name_len_utf16, name, name_len_utf8)) < name_len_utf16)
640  avio_skip(pb, name_len_utf16 - ret);
641  av_log(s, AV_LOG_TRACE, "%d stream %d name_len %2d type %d len %4d <%s>\n",
642  i, stream_num, name_len_utf16, value_type, value_len, name);
643 
644  if (!strcmp(name, "AspectRatioX")){
645  int aspect_x = get_value(s->pb, value_type);
646  if(stream_num < 128)
647  asf->dar[stream_num].num = aspect_x;
648  } else if(!strcmp(name, "AspectRatioY")){
649  int aspect_y = get_value(s->pb, value_type);
650  if(stream_num < 128)
651  asf->dar[stream_num].den = aspect_y;
652  } else {
653  get_tag(s, name, value_type, value_len);
654  }
655  av_freep(&name);
656  }
657 
658  return 0;
659 }
660 
662 {
663  AVIOContext *pb = s->pb;
664  ASFContext *asf = s->priv_data;
665  int i, count, name_len, ret;
666  char name[1024];
667 
668  avio_rl64(pb); // reserved 16 bytes
669  avio_rl64(pb); // ...
670  count = avio_rl32(pb); // markers count
671  avio_rl16(pb); // reserved 2 bytes
672  name_len = avio_rl16(pb); // name length
673  avio_skip(pb, name_len);
674 
675  for (i = 0; i < count; i++) {
676  int64_t pres_time;
677 
678  if (avio_feof(pb))
679  return AVERROR_INVALIDDATA;
680 
681  avio_rl64(pb); // offset, 8 bytes
682  pres_time = avio_rl64(pb); // presentation time
683  pres_time = av_sat_sub64(pres_time, asf->hdr.preroll * 10000LL);
684  avio_rl16(pb); // entry length
685  avio_rl32(pb); // send time
686  avio_rl32(pb); // flags
687  name_len = avio_rl32(pb); // name length
688  if ((unsigned)name_len > INT_MAX / 2)
689  return AVERROR_INVALIDDATA;
690  if ((ret = avio_get_str16le(pb, name_len * 2, name,
691  sizeof(name))) < name_len)
692  avio_skip(pb, name_len - ret);
693  avpriv_new_chapter(s, i, (AVRational) { 1, 10000000 }, pres_time,
695  }
696 
697  return 0;
698 }
699 
701 {
702  ASFContext *asf = s->priv_data;
703  ff_asf_guid g;
704  AVIOContext *pb = s->pb;
705  int i;
706  int64_t gsize;
707 
708  ff_get_guid(pb, &g);
709  if (ff_guidcmp(&g, &ff_asf_header))
710  return AVERROR_INVALIDDATA;
711  avio_rl64(pb);
712  avio_rl32(pb);
713  avio_r8(pb);
714  avio_r8(pb);
715  memset(&asf->asfid2avid, -1, sizeof(asf->asfid2avid));
716 
717  for (i = 0; i<128; i++)
718  asf->streams[i].stream_language_index = 128; // invalid stream index means no language info
719 
720  for (;;) {
721  uint64_t gpos = avio_tell(pb);
722  int ret = 0;
723  ff_get_guid(pb, &g);
724  gsize = avio_rl64(pb);
725  print_guid(&g);
726  if (!ff_guidcmp(&g, &ff_asf_data_header)) {
727  asf->data_object_offset = avio_tell(pb);
728  /* If not streaming, gsize is not unlimited (how?),
729  * and there is enough space in the file.. */
730  if (!(asf->hdr.flags & 0x01) && gsize >= 100)
731  asf->data_object_size = gsize - 24;
732  else
733  asf->data_object_size = (uint64_t)-1;
734  break;
735  }
736  if (gsize < 24)
737  return AVERROR_INVALIDDATA;
738  if (!ff_guidcmp(&g, &ff_asf_file_header)) {
740  } else if (!ff_guidcmp(&g, &ff_asf_stream_header)) {
741  ret = asf_read_stream_properties(s, gsize);
742  } else if (!ff_guidcmp(&g, &ff_asf_comment_header)) {
744  } else if (!ff_guidcmp(&g, &ff_asf_language_guid)) {
746  } else if (!ff_guidcmp(&g, &ff_asf_extended_content_header)) {
748  } else if (!ff_guidcmp(&g, &ff_asf_metadata_header)) {
750  } else if (!ff_guidcmp(&g, &ff_asf_metadata_library_header)) {
752  } else if (!ff_guidcmp(&g, &ff_asf_ext_stream_header)) {
754 
755  // there could be an optional stream properties object to follow
756  // if so the next iteration will pick it up
757  continue;
758  } else if (!ff_guidcmp(&g, &ff_asf_head1_guid)) {
759  ff_get_guid(pb, &g);
760  avio_skip(pb, 6);
761  continue;
762  } else if (!ff_guidcmp(&g, &ff_asf_marker_header)) {
764  } else if (avio_feof(pb)) {
765  return AVERROR_EOF;
766  } else {
767  if (!s->keylen) {
770  unsigned int len;
772  "DRM protected stream detected, decoding will likely fail!\n");
773  len= avio_rl32(pb);
774  av_log(s, AV_LOG_DEBUG, "Secret data:\n");
775 
776  if ((ret = av_get_packet(pb, pkt, len)) < 0)
777  return ret;
780 
781  len= avio_rl32(pb);
782  if (len > UINT16_MAX)
783  return AVERROR_INVALIDDATA;
784  get_tag(s, "ASF_Protection_Type", -1, len);
785 
786  len= avio_rl32(pb);
787  if (len > UINT16_MAX)
788  return AVERROR_INVALIDDATA;
789  get_tag(s, "ASF_Key_ID", -1, len);
790 
791  len= avio_rl32(pb);
792  if (len > UINT16_MAX)
793  return AVERROR_INVALIDDATA;
794  get_tag(s, "ASF_License_URL", -1, len);
795  } else if (!ff_guidcmp(&g, &ff_asf_ext_content_encryption)) {
797  "Ext DRM protected stream detected, decoding will likely fail!\n");
798  av_dict_set(&s->metadata, "encryption", "ASF Extended Content Encryption", 0);
799  } else if (!ff_guidcmp(&g, &ff_asf_digital_signature)) {
800  av_log(s, AV_LOG_INFO, "Digital signature detected!\n");
801  }
802  }
803  }
804  if (ret < 0)
805  return ret;
806 
807  if (avio_tell(pb) != gpos + gsize)
809  "gpos mismatch our pos=%"PRIu64", end=%"PRId64"\n",
810  avio_tell(pb) - gpos, gsize);
811  avio_seek(pb, gpos + gsize, SEEK_SET);
812  }
813  ff_get_guid(pb, &g);
814  avio_rl64(pb);
815  avio_r8(pb);
816  avio_r8(pb);
817  if (avio_feof(pb))
818  return AVERROR_EOF;
819  asf->data_offset = avio_tell(pb);
820  asf->packet_size_left = 0;
821 
822  for (i = 0; i < 128; i++) {
823  int stream_num = asf->asfid2avid[i];
824  if (stream_num >= 0) {
825  AVStream *st = s->streams[stream_num];
826  if (!st->codecpar->bit_rate)
827  st->codecpar->bit_rate = asf->stream_bitrates[i];
828  if (asf->dar[i].num > 0 && asf->dar[i].den > 0) {
831  asf->dar[i].num, asf->dar[i].den, INT_MAX);
832  } else if ((asf->dar[0].num > 0) && (asf->dar[0].den > 0) &&
833  // Use ASF container value if the stream doesn't set AR.
837  asf->dar[0].num, asf->dar[0].den, INT_MAX);
838 
839  av_log(s, AV_LOG_TRACE, "i=%d, st->codecpar->codec_type:%d, asf->dar %d:%d sar=%d:%d\n",
840  i, st->codecpar->codec_type, asf->dar[i].num, asf->dar[i].den,
842 
843  // copy and convert language codes to the frontend
844  if (asf->streams[i].stream_language_index < 128) {
845  const char *rfc1766 = asf->stream_languages[asf->streams[i].stream_language_index];
846  if (rfc1766 && strlen(rfc1766) > 1) {
847  const char primary_tag[3] = { rfc1766[0], rfc1766[1], '\0' }; // ignore country code if any
848  const char *iso6392 = ff_convert_lang_to(primary_tag,
850  if (iso6392)
851  av_dict_set(&st->metadata, "language", iso6392, 0);
852  }
853  }
854  }
855  }
856 
858 
859  return 0;
860 }
861 
862 #define DO_2BITS(bits, var, defval) \
863  switch (bits & 3) { \
864  case 3: \
865  var = avio_rl32(pb); \
866  rsize += 4; \
867  break; \
868  case 2: \
869  var = avio_rl16(pb); \
870  rsize += 2; \
871  break; \
872  case 1: \
873  var = avio_r8(pb); \
874  rsize++; \
875  break; \
876  default: \
877  var = defval; \
878  break; \
879  }
880 
881 /**
882  * Load a single ASF packet into the demuxer.
883  * @param s demux context
884  * @param pb context to read data from
885  * @return 0 on success, <0 on error
886  */
888 {
889  ASFContext *asf = s->priv_data;
890  uint32_t packet_length, padsize;
891  int rsize = 8;
892  int c, d, e, off;
893 
894  if (asf->uses_std_ecc > 0) {
895  // if we do not know packet size, allow skipping up to 32 kB
896  off = 32768;
897  if (asf->no_resync_search)
898  off = 3;
899 // else if (s->packet_size > 0 && !asf->uses_std_ecc)
900 // off = (avio_tell(pb) - ffformatcontext(s)->data_offset) % s->packet_size + 3;
901 
902  c = d = e = -1;
903  while (off-- > 0) {
904  c = d;
905  d = e;
906  e = avio_r8(pb);
907  if (c == 0x82 && !d && !e)
908  break;
909  }
910 
911  if (c != 0x82) {
912  /* This code allows handling of -EAGAIN at packet boundaries (i.e.
913  * if the packet sync code above triggers -EAGAIN). This does not
914  * imply complete -EAGAIN handling support at random positions in
915  * the stream. */
916  if (pb->error == AVERROR(EAGAIN))
917  return AVERROR(EAGAIN);
918  if (!avio_feof(pb))
920  "ff asf bad header %x at:%"PRId64"\n", c, avio_tell(pb));
921  }
922  if ((c & 0x8f) == 0x82) {
923  if (d || e) {
924  if (!avio_feof(pb))
925  av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
926  return AVERROR_INVALIDDATA;
927  }
928  c = avio_r8(pb);
929  d = avio_r8(pb);
930  rsize += 3;
931  } else if(!avio_feof(pb)) {
932  avio_seek(pb, -1, SEEK_CUR); // FIXME
933  }
934  } else {
935  c = avio_r8(pb);
936  if (c & 0x80) {
937  rsize ++;
938  if (!(c & 0x60)) {
939  d = avio_r8(pb);
940  e = avio_r8(pb);
941  avio_seek(pb, (c & 0xF) - 2, SEEK_CUR);
942  rsize += c & 0xF;
943  }
944 
945  if (c != 0x82)
946  avpriv_request_sample(s, "Invalid ECC byte");
947 
948  if (!asf->uses_std_ecc)
949  asf->uses_std_ecc = (c == 0x82 && !d && !e) ? 1 : -1;
950 
951  c = avio_r8(pb);
952  } else
953  asf->uses_std_ecc = -1;
954  d = avio_r8(pb);
955  }
956 
957  asf->packet_flags = c;
958  asf->packet_property = d;
959 
960  DO_2BITS(asf->packet_flags >> 5, packet_length, s->packet_size);
961  DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored
962  DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length
963 
964  // the following checks prevent overflows and infinite loops
965  if (!packet_length || packet_length >= (1U << 29)) {
967  "invalid packet_length %"PRIu32" at:%"PRId64"\n",
968  packet_length, avio_tell(pb));
969  return AVERROR_INVALIDDATA;
970  }
971  if (padsize >= packet_length) {
973  "invalid padsize %"PRIu32" at:%"PRId64"\n", padsize, avio_tell(pb));
974  return AVERROR_INVALIDDATA;
975  }
976 
977  asf->packet_timestamp = avio_rl32(pb);
978  avio_rl16(pb); /* duration */
979  // rsize has at least 11 bytes which have to be present
980 
981  if (asf->packet_flags & 0x01) {
982  asf->packet_segsizetype = avio_r8(pb);
983  rsize++;
984  asf->packet_segments = asf->packet_segsizetype & 0x3f;
985  } else {
986  asf->packet_segments = 1;
987  asf->packet_segsizetype = 0x80;
988  }
989  if (rsize > packet_length - padsize) {
990  asf->packet_size_left = 0;
992  "invalid packet header length %d for pktlen %"PRIu32"-%"PRIu32" at %"PRId64"\n",
993  rsize, packet_length, padsize, avio_tell(pb));
994  return AVERROR_INVALIDDATA;
995  }
996  asf->packet_size_left = packet_length - padsize - rsize;
997  if (packet_length < asf->hdr.min_pktsize)
998  padsize += asf->hdr.min_pktsize - packet_length;
999  asf->packet_padsize = padsize;
1000  av_log(s, AV_LOG_TRACE, "packet: size=%d padsize=%d left=%d\n",
1001  s->packet_size, asf->packet_padsize, asf->packet_size_left);
1002  return 0;
1003 }
1004 
1005 /**
1006  *
1007  * @return <0 if error
1008  */
1010 {
1011  ASFContext *asf = s->priv_data;
1012  ASFStream *asfst;
1013  int rsize = 1;
1014  int num = avio_r8(pb);
1015  int i;
1016  int64_t ts0, ts1 av_unused;
1017 
1018  asf->packet_segments--;
1019  asf->packet_key_frame = num >> 7;
1020  asf->stream_index = asf->asfid2avid[num & 0x7f];
1021  asfst = &asf->streams[num & 0x7f];
1022  // sequence should be ignored!
1023  DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);
1024  DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);
1026  av_log(asf, AV_LOG_TRACE, "key:%d stream:%d seq:%d offset:%d replic_size:%d num:%X packet_property %X\n",
1027  asf->packet_key_frame, asf->stream_index, asf->packet_seq,
1028  asf->packet_frag_offset, asf->packet_replic_size, num, asf->packet_property);
1029  if (rsize+(int64_t)asf->packet_replic_size > asf->packet_size_left) {
1030  av_log(s, AV_LOG_ERROR, "packet_replic_size %d is invalid\n", asf->packet_replic_size);
1031  return AVERROR_INVALIDDATA;
1032  }
1033  if (asf->packet_replic_size >= 8) {
1034  int64_t end = avio_tell(pb) + asf->packet_replic_size;
1035  AVRational aspect;
1036  asfst->packet_obj_size = avio_rl32(pb);
1037  if (asfst->packet_obj_size >= (1 << 24) || asfst->packet_obj_size < 0) {
1038  av_log(s, AV_LOG_ERROR, "packet_obj_size %d invalid\n", asfst->packet_obj_size);
1039  asfst->packet_obj_size = 0;
1040  return AVERROR_INVALIDDATA;
1041  }
1042  asf->packet_frag_timestamp = avio_rl32(pb); // timestamp
1043 
1044  for (i = 0; i < asfst->payload_ext_ct; i++) {
1045  ASFPayload *p = &asfst->payload[i];
1046  int size = p->size;
1047  int64_t payend;
1048  if (size == 0xFFFF)
1049  size = avio_rl16(pb);
1050  payend = avio_tell(pb) + size;
1051  if (payend > end) {
1052  av_log(s, AV_LOG_ERROR, "too long payload\n");
1053  break;
1054  }
1055  switch (p->type) {
1056  case 0x50:
1057 // duration = avio_rl16(pb);
1058  break;
1059  case 0x54:
1060  aspect.num = avio_r8(pb);
1061  aspect.den = avio_r8(pb);
1062  if (aspect.num > 0 && aspect.den > 0 && asf->stream_index >= 0) {
1063  s->streams[asf->stream_index]->sample_aspect_ratio = aspect;
1064  }
1065  break;
1066  case 0x2A:
1067  avio_skip(pb, 8);
1068  ts0 = avio_rl64(pb);
1069  ts1 = avio_rl64(pb);
1070  if (ts0!= -1) asf->packet_frag_timestamp = ts0/10000;
1072  asf->ts_is_pts = 1;
1073  break;
1074  case 0x5B:
1075  case 0xB7:
1076  case 0xCC:
1077  case 0xC0:
1078  case 0xA0:
1079  //unknown
1080  break;
1081  }
1082  avio_seek(pb, payend, SEEK_SET);
1083  }
1084 
1085  avio_seek(pb, end, SEEK_SET);
1086  rsize += asf->packet_replic_size; // FIXME - check validity
1087  } else if (asf->packet_replic_size == 1) {
1088  // multipacket - frag_offset is beginning timestamp
1090  asf->packet_frag_offset = 0;
1092 
1093  asf->packet_time_delta = avio_r8(pb);
1094  rsize++;
1095  } else if (asf->packet_replic_size != 0) {
1096  av_log(s, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n",
1097  asf->packet_replic_size);
1098  return AVERROR_INVALIDDATA;
1099  }
1100  if (asf->packet_flags & 0x01) {
1101  DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); // 0 is illegal
1102  if (rsize > asf->packet_size_left) {
1103  av_log(s, AV_LOG_ERROR, "packet_replic_size is invalid\n");
1104  return AVERROR_INVALIDDATA;
1105  } else if (asf->packet_frag_size > asf->packet_size_left - rsize) {
1106  if (asf->packet_frag_size > asf->packet_size_left - rsize + asf->packet_padsize) {
1107  av_log(s, AV_LOG_ERROR, "packet_frag_size is invalid (%d>%d-%d+%d)\n",
1108  asf->packet_frag_size, asf->packet_size_left, rsize, asf->packet_padsize);
1109  return AVERROR_INVALIDDATA;
1110  } else {
1111  int diff = asf->packet_frag_size - (asf->packet_size_left - rsize);
1112  asf->packet_size_left += diff;
1113  asf->packet_padsize -= diff;
1114  }
1115  }
1116  } else {
1117  asf->packet_frag_size = asf->packet_size_left - rsize;
1118  }
1119  if (asf->packet_replic_size == 1) {
1120  asf->packet_multi_size = asf->packet_frag_size;
1121  if (asf->packet_multi_size > asf->packet_size_left)
1122  return AVERROR_INVALIDDATA;
1123  }
1124  asf->packet_size_left -= rsize;
1125 
1126  return 0;
1127 }
1128 
1129 /**
1130  * Parse data from individual ASF packets (which were previously loaded
1131  * with asf_get_packet()).
1132  * @param s demux context
1133  * @param pb context to read data from
1134  * @param pkt pointer to store packet data into
1135  * @return 0 if data was stored in pkt, <0 on error or 1 if more ASF
1136  * packets need to be loaded (through asf_get_packet())
1137  */
1139 {
1140  ASFContext *asf = s->priv_data;
1141  ASFStream *asf_st = 0;
1142  for (;;) {
1143  int read;
1144  if (avio_feof(pb))
1145  return AVERROR_EOF;
1146  if (asf->packet_size_left < FRAME_HEADER_SIZE ||
1147  asf->packet_segments < 1 && asf->packet_time_start == 0) {
1148  int ret = asf->packet_size_left + asf->packet_padsize;
1149 
1151  av_log(s, AV_LOG_WARNING, "Skip due to FRAME_HEADER_SIZE\n");
1152 
1153  assert(ret >= 0);
1154  /* fail safe */
1155  avio_skip(pb, ret);
1156 
1157  asf->packet_pos = avio_tell(pb);
1158  if (asf->data_object_size != (uint64_t)-1 &&
1159  (asf->packet_pos - asf->data_object_offset >= asf->data_object_size))
1160  return AVERROR_EOF; /* Do not exceed the size of the data object */
1161  return 1;
1162  }
1163  if (asf->packet_time_start == 0) {
1164  if (asf_read_frame_header(s, pb) < 0) {
1165  asf->packet_time_start = asf->packet_segments = 0;
1166  continue;
1167  }
1168  if (asf->stream_index < 0 ||
1169  s->streams[asf->stream_index]->discard >= AVDISCARD_ALL ||
1170  (!asf->packet_key_frame &&
1171  (s->streams[asf->stream_index]->discard >= AVDISCARD_NONKEY || asf->streams[s->streams[asf->stream_index]->id].skip_to_key))) {
1172  asf->packet_time_start = 0;
1173  /* unhandled packet (should not happen) */
1174  avio_skip(pb, asf->packet_frag_size);
1175  asf->packet_size_left -= asf->packet_frag_size;
1176  if (asf->stream_index < 0)
1177  av_log(s, AV_LOG_ERROR, "ff asf skip %d (unknown stream)\n",
1178  asf->packet_frag_size);
1179  continue;
1180  }
1181  asf->asf_st = &asf->streams[s->streams[asf->stream_index]->id];
1182  if (!asf->packet_frag_offset)
1183  asf->asf_st->skip_to_key = 0;
1184  }
1185  asf_st = asf->asf_st;
1186  av_assert0(asf_st);
1187 
1188  if (!asf_st->frag_offset && asf->packet_frag_offset) {
1189  av_log(s, AV_LOG_TRACE, "skipping asf data pkt with fragment offset for "
1190  "stream:%d, expected:%d but got %d from pkt)\n",
1191  asf->stream_index, asf_st->frag_offset,
1192  asf->packet_frag_offset);
1193  avio_skip(pb, asf->packet_frag_size);
1194  asf->packet_size_left -= asf->packet_frag_size;
1195  continue;
1196  }
1197 
1198  if (asf->packet_replic_size == 1) {
1199  // frag_offset is here used as the beginning timestamp
1201  asf->packet_time_start += asf->packet_time_delta;
1202  asf_st->packet_obj_size = asf->packet_frag_size = avio_r8(pb);
1203  asf->packet_size_left--;
1204  asf->packet_multi_size--;
1205  if (asf->packet_multi_size < asf_st->packet_obj_size) {
1206  asf->packet_time_start = 0;
1207  avio_skip(pb, asf->packet_multi_size);
1208  asf->packet_size_left -= asf->packet_multi_size;
1209  continue;
1210  }
1211  asf->packet_multi_size -= asf_st->packet_obj_size;
1212  }
1213 
1214  if (asf_st->pkt.size != asf_st->packet_obj_size ||
1215  // FIXME is this condition sufficient?
1216  asf_st->frag_offset + asf->packet_frag_size > asf_st->pkt.size) {
1217  int ret;
1218 
1219  if (asf_st->pkt.data) {
1220  av_log(s, AV_LOG_INFO,
1221  "freeing incomplete packet size %d, new %d\n",
1222  asf_st->pkt.size, asf_st->packet_obj_size);
1223  asf_st->frag_offset = 0;
1224  av_packet_unref(&asf_st->pkt);
1225  }
1226  /* new packet */
1227  if ((ret = av_new_packet(&asf_st->pkt, asf_st->packet_obj_size)) < 0)
1228  return ret;
1229  asf_st->seq = asf->packet_seq;
1230  if (asf->packet_frag_timestamp != AV_NOPTS_VALUE) {
1231  if (asf->ts_is_pts) {
1232  asf_st->pkt.pts = asf->packet_frag_timestamp - asf->hdr.preroll;
1233  } else
1234  asf_st->pkt.dts = asf->packet_frag_timestamp - asf->hdr.preroll;
1235  }
1236  asf_st->pkt.stream_index = asf->stream_index;
1237  asf_st->pkt.pos = asf_st->packet_pos = asf->packet_pos;
1238  asf_st->pkt_clean = 0;
1239 
1240  if (asf_st->pkt.data && asf_st->palette_changed) {
1241  uint8_t *pal;
1243  AVPALETTE_SIZE);
1244  if (!pal) {
1245  av_log(s, AV_LOG_ERROR, "Cannot append palette to packet\n");
1246  } else {
1247  memcpy(pal, asf_st->palette, AVPALETTE_SIZE);
1248  asf_st->palette_changed = 0;
1249  }
1250  }
1251  av_log(asf, AV_LOG_TRACE, "new packet: stream:%d key:%d packet_key:%d audio:%d size:%d\n",
1252  asf->stream_index, asf->packet_key_frame,
1253  asf_st->pkt.flags & AV_PKT_FLAG_KEY,
1254  s->streams[asf->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO,
1255  asf_st->packet_obj_size);
1256  if (s->streams[asf->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
1257  asf->packet_key_frame = 1;
1258  if (asf->packet_key_frame)
1259  asf_st->pkt.flags |= AV_PKT_FLAG_KEY;
1260  }
1261 
1262  /* read data */
1263  av_log(asf, AV_LOG_TRACE, "READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n",
1264  s->packet_size, asf_st->pkt.size, asf->packet_frag_offset,
1265  asf_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data);
1266  asf->packet_size_left -= asf->packet_frag_size;
1267  if (asf->packet_size_left < 0)
1268  continue;
1269 
1270  if (asf->packet_frag_offset >= asf_st->pkt.size ||
1271  asf->packet_frag_size > asf_st->pkt.size - asf->packet_frag_offset) {
1273  "packet fragment position invalid %u,%u not in %u\n",
1275  asf_st->pkt.size);
1276  continue;
1277  }
1278 
1279  if (asf->packet_frag_offset != asf_st->frag_offset && !asf_st->pkt_clean) {
1280  memset(asf_st->pkt.data + asf_st->frag_offset, 0, asf_st->pkt.size - asf_st->frag_offset);
1281  asf_st->pkt_clean = 1;
1282  }
1283 
1284  read = avio_read(pb, asf_st->pkt.data + asf->packet_frag_offset,
1285  asf->packet_frag_size);
1286  if (read != asf->packet_frag_size) {
1287  if (read < 0 || asf->packet_frag_offset + read == 0)
1288  return read < 0 ? read : AVERROR_EOF;
1289 
1290  if (asf_st->ds_span > 1) {
1291  // scrambling, we can either drop it completely or fill the remainder
1292  // TODO: should we fill the whole packet instead of just the current
1293  // fragment?
1294  memset(asf_st->pkt.data + asf->packet_frag_offset + read, 0,
1295  asf->packet_frag_size - read);
1296  read = asf->packet_frag_size;
1297  } else {
1298  // no scrambling, so we can return partial packets
1299  av_shrink_packet(&asf_st->pkt, asf->packet_frag_offset + read);
1300  }
1301  }
1302  if (s->key && s->keylen == 20)
1303  ff_asfcrypt_dec(s->key, asf_st->pkt.data + asf->packet_frag_offset,
1304  read);
1305  asf_st->frag_offset += read;
1306  /* test if whole packet is read */
1307  if (asf_st->frag_offset == asf_st->pkt.size) {
1308  // workaround for macroshit radio DVR-MS files
1309  if (s->streams[asf->stream_index]->codecpar->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
1310  asf_st->pkt.size > 100) {
1311  int i;
1312  for (i = 0; i < asf_st->pkt.size && !asf_st->pkt.data[i]; i++)
1313  ;
1314  if (i == asf_st->pkt.size) {
1315  av_log(s, AV_LOG_DEBUG, "discarding ms fart\n");
1316  asf_st->frag_offset = 0;
1317  av_packet_unref(&asf_st->pkt);
1318  continue;
1319  }
1320  }
1321 
1322  /* return packet */
1323  if (asf_st->ds_span > 1) {
1324  if (asf_st->pkt.size != asf_st->ds_packet_size * asf_st->ds_span) {
1326  "pkt.size != ds_packet_size * ds_span (%d %d %d)\n",
1327  asf_st->pkt.size, asf_st->ds_packet_size,
1328  asf_st->ds_span);
1329  } else {
1330  /* packet descrambling */
1331  AVBufferRef *buf = av_buffer_alloc(asf_st->pkt.size +
1333  if (buf) {
1334  uint8_t *newdata = buf->data;
1335  int offset = 0;
1336  memset(newdata + asf_st->pkt.size, 0,
1338  while (offset < asf_st->pkt.size) {
1339  int off = offset / asf_st->ds_chunk_size;
1340  int row = off / asf_st->ds_span;
1341  int col = off % asf_st->ds_span;
1342  int idx = row + col * asf_st->ds_packet_size / asf_st->ds_chunk_size;
1343  assert(offset + asf_st->ds_chunk_size <= asf_st->pkt.size);
1344  assert(idx + 1 <= asf_st->pkt.size / asf_st->ds_chunk_size);
1345  memcpy(newdata + offset,
1346  asf_st->pkt.data + idx * asf_st->ds_chunk_size,
1347  asf_st->ds_chunk_size);
1348  offset += asf_st->ds_chunk_size;
1349  }
1350  av_buffer_unref(&asf_st->pkt.buf);
1351  asf_st->pkt.buf = buf;
1352  asf_st->pkt.data = buf->data;
1353  }
1354  }
1355  }
1356  asf_st->frag_offset = 0;
1357  *pkt = asf_st->pkt;
1358  asf_st->pkt.buf = 0;
1359  asf_st->pkt.size = 0;
1360  asf_st->pkt.data = 0;
1361  asf_st->pkt.side_data_elems = 0;
1362  asf_st->pkt.side_data = NULL;
1363  break; // packet completed
1364  }
1365  }
1366  return 0;
1367 }
1368 
1370 {
1371  ASFContext *asf = s->priv_data;
1372 
1373  for (;;) {
1374  int ret;
1375 
1376  /* parse cached packets, if any */
1377  if ((ret = asf_parse_packet(s, s->pb, pkt)) <= 0)
1378  return ret;
1379  if ((ret = asf_get_packet(s, s->pb)) < 0)
1380  assert(asf->packet_size_left < FRAME_HEADER_SIZE ||
1381  asf->packet_segments < 1);
1382  asf->packet_time_start = 0;
1383  }
1384 }
1385 
1386 // Added to support seeking after packets have been read
1387 // If information is not reset, read_packet fails due to
1388 // leftover information from previous reads
1390 {
1391  ASFContext *asf = s->priv_data;
1392  ASFStream *asf_st;
1393  int i;
1394 
1395  asf->packet_size_left = 0;
1396  asf->packet_flags = 0;
1397  asf->packet_property = 0;
1398  asf->packet_timestamp = 0;
1399  asf->packet_segsizetype = 0;
1400  asf->packet_segments = 0;
1401  asf->packet_seq = 0;
1402  asf->packet_replic_size = 0;
1403  asf->packet_key_frame = 0;
1404  asf->packet_padsize = 0;
1405  asf->packet_frag_offset = 0;
1406  asf->packet_frag_size = 0;
1407  asf->packet_frag_timestamp = 0;
1408  asf->packet_multi_size = 0;
1409  asf->packet_time_delta = 0;
1410  asf->packet_time_start = 0;
1411 
1412  for (i = 0; i < 128; i++) {
1413  asf_st = &asf->streams[i];
1414  av_packet_unref(&asf_st->pkt);
1415  asf_st->packet_obj_size = 0;
1416  asf_st->frag_offset = 0;
1417  asf_st->seq = 0;
1418  }
1419  asf->asf_st = NULL;
1420 }
1421 
1423 {
1424  ASFContext *asf = s->priv_data;
1425  int i;
1426 
1427  for (i = 0; i < 128; i++) {
1428  int j = asf->asfid2avid[i];
1429  ASFStream *asf_st = &asf->streams[i];
1430  if (j < 0 || s->streams[j]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
1431  continue;
1432 
1433  asf_st->skip_to_key = 1;
1434  }
1435 }
1436 
1438 {
1440 
1441  return 0;
1442 }
1443 
1444 static int64_t asf_read_pts(AVFormatContext *s, int stream_index,
1445  int64_t *ppos, int64_t pos_limit)
1446 {
1447  FFFormatContext *const si = ffformatcontext(s);
1448  ASFContext *asf = s->priv_data;
1449  AVPacket pkt1, *pkt = &pkt1;
1450  ASFStream *asf_st;
1451  int64_t pts;
1452  int64_t pos = *ppos;
1453  int i;
1454  int64_t start_pos[ASF_MAX_STREAMS];
1455 
1456  for (i = 0; i < s->nb_streams; i++)
1457  start_pos[i] = pos;
1458 
1459  if (s->packet_size > 0)
1460  pos = (pos + s->packet_size - 1 - si->data_offset) /
1461  s->packet_size * s->packet_size +
1462  si->data_offset;
1463  *ppos = pos;
1464  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
1465  return AV_NOPTS_VALUE;
1466 
1469  for (;;) {
1470  if (av_read_frame(s, pkt) < 0) {
1471  av_log(s, AV_LOG_INFO, "asf_read_pts failed\n");
1472  return AV_NOPTS_VALUE;
1473  }
1474 
1475  pts = pkt->dts;
1476 
1477  if (pkt->flags & AV_PKT_FLAG_KEY) {
1478  i = pkt->stream_index;
1479 
1480  asf_st = &asf->streams[s->streams[i]->id];
1481 
1482 // assert((asf_st->packet_pos - s->data_offset) % s->packet_size == 0);
1483  pos = asf_st->packet_pos;
1484  av_assert1(pkt->pos == asf_st->packet_pos);
1485 
1486  av_add_index_entry(s->streams[i], pos, pts, pkt->size,
1487  pos - start_pos[i] + 1, AVINDEX_KEYFRAME);
1488  start_pos[i] = asf_st->packet_pos + 1;
1489 
1490  if (pkt->stream_index == stream_index) {
1492  break;
1493  }
1494  }
1496  }
1497 
1498  *ppos = pos;
1499  return pts;
1500 }
1501 
1502 static int asf_build_simple_index(AVFormatContext *s, int stream_index)
1503 {
1504  ff_asf_guid g;
1505  ASFContext *asf = s->priv_data;
1506  int64_t current_pos = avio_tell(s->pb);
1507  int64_t ret;
1508 
1509  if((ret = avio_seek(s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET)) < 0) {
1510  return ret;
1511  }
1512 
1513  if ((ret = ff_get_guid(s->pb, &g)) < 0)
1514  goto end;
1515 
1516  /* the data object can be followed by other top-level objects,
1517  * skip them until the simple index object is reached */
1519  int64_t gsize = avio_rl64(s->pb);
1520  if (gsize < 24 || avio_feof(s->pb)) {
1521  goto end;
1522  }
1523  avio_skip(s->pb, gsize - 24);
1524  if ((ret = ff_get_guid(s->pb, &g)) < 0)
1525  goto end;
1526  }
1527 
1528  {
1529  int64_t itime, last_pos = -1;
1530  int pct, ict;
1531  int i;
1532  av_unused int64_t gsize = avio_rl64(s->pb);
1533  if ((ret = ff_get_guid(s->pb, &g)) < 0)
1534  goto end;
1535  itime = avio_rl64(s->pb);
1536  pct = avio_rl32(s->pb);
1537  ict = avio_rl32(s->pb);
1539  "itime:0x%"PRIx64", pct:%d, ict:%d\n", itime, pct, ict);
1540 
1541  for (i = 0; i < ict; i++) {
1542  int pktnum = avio_rl32(s->pb);
1543  int pktct = avio_rl16(s->pb);
1544  int64_t pos = ffformatcontext(s)->data_offset + s->packet_size * (int64_t)pktnum;
1545  int64_t index_pts = FFMAX(av_rescale(itime, i, 10000) - asf->hdr.preroll, 0);
1546 
1547  if (avio_feof(s->pb)) {
1549  goto end;
1550  }
1551 
1552  if (pos != last_pos) {
1553  av_log(s, AV_LOG_DEBUG, "pktnum:%d, pktct:%d pts: %"PRId64"\n",
1554  pktnum, pktct, index_pts);
1555  av_add_index_entry(s->streams[stream_index], pos, index_pts,
1556  s->packet_size, 0, AVINDEX_KEYFRAME);
1557  last_pos = pos;
1558  }
1559  }
1560  asf->index_read = ict > 1;
1561  }
1562 end:
1563 // if (avio_feof(s->pb)) {
1564 // ret = 0;
1565 // }
1566  avio_seek(s->pb, current_pos, SEEK_SET);
1567  return ret;
1568 }
1569 
1570 static int asf_read_seek(AVFormatContext *s, int stream_index,
1571  int64_t pts, int flags)
1572 {
1573  ASFContext *asf = s->priv_data;
1574  AVStream *st = s->streams[stream_index];
1575  FFStream *const sti = ffstream(st);
1576  int ret = 0;
1577 
1578  if (s->packet_size <= 0)
1579  return -1;
1580 
1581  /* Try using the protocol's read_seek if available */
1582  if (s->pb) {
1583  int64_t ret64 = avio_seek_time(s->pb, stream_index, pts, flags);
1584  if (ret64 >= 0)
1586  if (ret64 != AVERROR(ENOSYS))
1587  return ret64;
1588  }
1589 
1590  /* explicitly handle the case of seeking to 0 */
1591  if (!pts) {
1593  avio_seek(s->pb, ffformatcontext(s)->data_offset, SEEK_SET);
1594  return 0;
1595  }
1596 
1597  if (!asf->index_read) {
1598  ret = asf_build_simple_index(s, stream_index);
1599  if (ret < 0)
1600  asf->index_read = -1;
1601  }
1602 
1603  if (asf->index_read > 0 && sti->index_entries) {
1605  if (index >= 0) {
1606  /* find the position */
1607  uint64_t pos = sti->index_entries[index].pos;
1608 
1609  /* do the seek */
1610  av_log(s, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos);
1611  if(avio_seek(s->pb, pos, SEEK_SET) < 0)
1612  return -1;
1614  skip_to_key(s);
1615  return 0;
1616  }
1617  }
1618  /* no index or seeking by index failed */
1619  if (ff_seek_frame_binary(s, stream_index, pts, flags) < 0)
1620  return -1;
1622  skip_to_key(s);
1623  return 0;
1624 }
1625 
1627  .p.name = "asf",
1628  .p.long_name = NULL_IF_CONFIG_SMALL("ASF (Advanced / Active Streaming Format)"),
1629  .p.flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH,
1630  .p.priv_class = &asf_class,
1631  .priv_data_size = sizeof(ASFContext),
1632  .read_probe = asf_probe,
1638 };
avpriv_new_chapter
AVChapter * avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
Definition: demux_utils.c:43
flags
const SwsFlags flags[]
Definition: swscale.c:85
asf_class
static const AVClass asf_class
Definition: asfdec_f.c:127
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
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:71
ASF_MAX_STREAMS
#define ASF_MAX_STREAMS
Definition: asfdec_f.c:137
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
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
opt.h
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:53
ASF_WORD
@ ASF_WORD
Definition: asf.h:35
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:123
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
ASFMainHeader::send_time
uint64_t send_time
time to send file, in 100-nanosecond units invalid if broadcasting (could be ignored)
Definition: asf.h:47
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
int64_t
long long int64_t
Definition: coverity.c:34
avlanguage.h
ff_asf_audio_stream
const ff_asf_guid ff_asf_audio_stream
Definition: asf_tags.c:39
ASFContext::packet_segsizetype
int packet_segsizetype
Definition: asfdec_f.c:96
skip_to_key
static void skip_to_key(AVFormatContext *s)
Definition: asfdec_f.c:1422
asf_parse_packet
static int asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
Parse data from individual ASF packets (which were previously loaded with asf_get_packet()).
Definition: asfdec_f.c:1138
ASFStream::palette_changed
int palette_changed
Definition: asfdec_f.c:68
ff_asf_simple_index_header
const ff_asf_guid ff_asf_simple_index_header
Definition: asf_tags.c:90
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:62
ff_metadata_conv
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
asf_read_ext_stream_properties
static int asf_read_ext_stream_properties(AVFormatContext *s)
Definition: asfdec_f.c:475
ASFMainHeader::preroll
uint32_t preroll
timestamp of the first packet, in milliseconds if nonzero - subtract from time
Definition: asf.h:49
AVPacket::data
uint8_t * data
Definition: packet.h:603
AVOption
AVOption.
Definition: opt.h:428
asf_build_simple_index
static int asf_build_simple_index(AVFormatContext *s, int stream_index)
Definition: asfdec_f.c:1502
ASFStream::skip_to_key
int skip_to_key
Definition: asfdec_f.c:57
LEN
#define LEN
ASF_BOOL
@ ASF_BOOL
Definition: asf.h:32
AVIOContext::error
int error
contains the error code or 0 if no error happened
Definition: avio.h:239
asfcrypt.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
ff_codec_bmp_tags_unofficial
const AVCodecTag ff_codec_bmp_tags_unofficial[]
Definition: riff.c:519
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:61
mathematics.h
ASF_UNICODE
@ ASF_UNICODE
Definition: asf.h:30
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1588
ASFContext::packet_padsize
int packet_padsize
Definition: asfdec_f.c:101
AVFMT_NOBINSEARCH
#define AVFMT_NOBINSEARCH
Format does not allow to fall back on binary search via read_timestamp.
Definition: avformat.h:485
ff_read_frame_flush
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
Definition: seek.c:716
ASFContext::data_offset
uint64_t data_offset
beginning of the first data packet
Definition: asfdec_f.c:86
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:326
asf_read_content_desc
static int asf_read_content_desc(AVFormatContext *s)
Definition: asfdec_f.c:535
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:650
asf_read_file_properties
static int asf_read_file_properties(AVFormatContext *s)
Definition: asfdec_f.c:275
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:609
asf_get_packet
static int asf_get_packet(AVFormatContext *s, AVIOContext *pb)
Load a single ASF packet into the demuxer.
Definition: asfdec_f.c:887
ff_guidcmp
static av_always_inline int ff_guidcmp(const void *g1, const void *g2)
Definition: riff.h:122
ASFContext::packet_frag_size
unsigned int packet_frag_size
Definition: asfdec_f.c:103
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:464
ASFContext::stream_index
int stream_index
Definition: asfdec_f.c:111
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
finish
static void finish(void)
Definition: movenc.c:374
ASFContext::hdr
ASFMainHeader hdr
Definition: asfdec_f.c:91
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: packet.h:47
ASFMainHeader::flags
uint32_t flags
0x01 - broadcast 0x02 - seekable rest is reserved should be 0
Definition: asf.h:52
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:358
ASFContext::stream_bitrates
uint32_t stream_bitrates[128]
max number of streams, bitrate for each (for streaming)
Definition: asfdec_f.c:79
ASFContext::streams
ASFStream streams[128]
it's max number and it's not that big
Definition: asfdec_f.c:78
ASFContext::uses_std_ecc
int uses_std_ecc
Definition: asfdec_f.c:118
avio_seek_time
int64_t avio_seek_time(AVIOContext *h, int stream_index, int64_t timestamp, int flags)
Seek to a given timestamp relative to some component stream.
Definition: aviobuf.c:1235
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:151
av_shrink_packet
void av_shrink_packet(AVPacket *pkt, int size)
Reduce packet size, correctly zeroing padding.
Definition: packet.c:113
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
AVSTREAM_PARSE_FULL_ONCE
@ AVSTREAM_PARSE_FULL_ONCE
full parsing and repack of the first frame only, only implemented for H.264 currently
Definition: avformat.h:595
ASFContext::data_object_size
uint64_t data_object_size
size of the data object
Definition: asfdec_f.c:88
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
ff_asf_demuxer
const FFInputFormat ff_asf_demuxer
Definition: asfdec_f.c:1626
ASFContext::ts_is_pts
int ts_is_pts
Definition: asfdec_f.c:105
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
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:806
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
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
ASFMainHeader::create_time
uint64_t create_time
time of creation, in 100-nanosecond units since 1.1.1601 invalid if broadcasting
Definition: asf.h:43
ff_asf_ext_stream_header
const ff_asf_guid ff_asf_ext_stream_header
Definition: asf_tags.c:35
asf_read_stream_properties
static int asf_read_stream_properties(AVFormatContext *s, int64_t size)
Definition: asfdec_f.c:300
avassert.h
ASFStream::pkt_clean
int pkt_clean
Definition: asfdec_f.c:58
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
asf_read_close
static int asf_read_close(AVFormatContext *s)
Definition: asfdec_f.c:1437
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
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.
ASFContext::packet_frag_timestamp
int64_t packet_frag_timestamp
Definition: asfdec_f.c:104
ASFStream::duration
int64_t duration
Definition: asfdec_f.c:56
asf_read_seek
static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags)
Definition: asfdec_f.c:1570
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
ff_asf_language_guid
const ff_asf_guid ff_asf_language_guid
Definition: asf_tags.c:124
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:551
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::packet_pos
int64_t packet_pos
Definition: asfdec_f.c:109
ff_asf_video_stream
const ff_asf_guid ff_asf_video_stream
Definition: asf_tags.c:47
DO_2BITS
#define DO_2BITS(bits, var, defval)
Definition: asfdec_f.c:862
ASFContext::dar
AVRational dar[128]
Definition: asfdec_f.c:80
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
asf_probe
static int asf_probe(const AVProbeData *pd)
Definition: asfdec_f.c:196
ASFContext::packet_property
int packet_property
Definition: asfdec_f.c:94
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ASFContext::packet_frag_offset
unsigned int packet_frag_offset
Definition: asfdec_f.c:102
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:89
asf_read_packet
static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: asfdec_f.c:1369
ASF_BYTE_ARRAY
@ ASF_BYTE_ARRAY
Definition: asf.h:31
asf_read_marker
static int asf_read_marker(AVFormatContext *s)
Definition: asfdec_f.c:661
ff_asf_codec_comment1_header
const ff_asf_guid ff_asf_codec_comment1_header
Definition: asf_tags.c:70
key
const char * key
Definition: hwcontext_opencl.c:189
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
fsize
static int64_t fsize(FILE *f)
Definition: audiomatch.c:29
ASFStream::timestamp
int timestamp
Definition: asfdec_f.c:55
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:77
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
ASFMainHeader
Definition: asf.h:39
FFFormatContext
Definition: internal.h:64
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:314
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1314
ASF_QWORD
@ ASF_QWORD
Definition: asf.h:34
internal.h
ff_asf_extended_content_header
const ff_asf_guid ff_asf_extended_content_header
Definition: asf_tags.c:86
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:586
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
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
ASFStream::ds_packet_size
int ds_packet_size
Definition: asfdec_f.c:61
ASFMainHeader::guid
ff_asf_guid guid
generated by client computer
Definition: asf.h:40
NULL
#define NULL
Definition: coverity.c:32
ff_asf_guid
uint8_t ff_asf_guid[16]
Definition: riff.h:96
ASFPayload::size
uint16_t size
Definition: asfdec_f.c:45
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
ASFStream::seq
unsigned char seq
Definition: asfdec_f.c:50
ff_asf_metadata_conv
const AVMetadataConv ff_asf_metadata_conv[]
Definition: asf.c:28
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
ff_asf_head1_guid
const ff_asf_guid ff_asf_head1_guid
Definition: asf_tags.c:78
AVPALETTE_SIZE
#define AVPALETTE_SIZE
Definition: pixfmt.h:32
AVSTREAM_PARSE_NONE
@ AVSTREAM_PARSE_NONE
Definition: avformat.h:591
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
ASFMainHeader::ignore
uint32_t ignore
preroll is 64 bits - but let's just ignore it
Definition: asf.h:51
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:452
options
Definition: swscale.c:50
ASFContext::stream_languages
char stream_languages[128][6]
max number of streams, language for each (RFC1766, e.g. en-US)
Definition: asfdec_f.c:81
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:827
ASFContext::index_read
int index_read
Definition: asfdec_f.c:89
ASFMainHeader::play_time
uint64_t play_time
play time, in 100-nanosecond units invalid if broadcasting
Definition: asf.h:45
ff_asf_data_header
const ff_asf_guid ff_asf_data_header
Definition: asf_tags.c:74
attributes.h
ASFContext::packet_size_left
int packet_size_left
Definition: asfdec_f.c:84
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
index
int index
Definition: gxfenc.c:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ASFContext::packet_seq
int packet_seq
Definition: asfdec_f.c:98
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:75
ASFStream::packet_pos
int64_t packet_pos
Definition: asfdec_f.c:64
ASFStream::ds_chunk_size
int ds_chunk_size
Definition: asfdec_f.c:62
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:454
options
static const AVOption options[]
Definition: asfdec_f.c:121
av_sat_sub64
#define av_sat_sub64
Definition: common.h:142
ff_asf_file_header
const ff_asf_guid ff_asf_file_header
Definition: asf_tags.c:27
ff_asf_video_conceal_none
const ff_asf_guid ff_asf_video_conceal_none
Definition: asf_tags.c:55
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:733
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:231
get_tag
static void get_tag(AVFormatContext *s, const char *key, int type, int len)
Definition: asfdec_f.c:221
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
FFFormatContext::parse_pkt
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition: internal.h:104
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:143
FFStream
Definition: internal.h:128
ASFContext::packet_time_delta
int packet_time_delta
Definition: asfdec_f.c:107
av_bswap32
#define av_bswap32
Definition: bswap.h:47
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
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
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
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
ASFPayload::type
uint8_t type
Definition: asfdec_f.c:44
ASFMainHeader::min_pktsize
uint32_t min_pktsize
size of a data packet invalid if broadcasting
Definition: asf.h:55
ASFStream::ds_span
int ds_span
Definition: asfdec_f.c:60
ASFMainHeader::max_pktsize
uint32_t max_pktsize
shall be the same as for min_pktsize invalid if broadcasting
Definition: asf.h:57
FRAME_HEADER_SIZE
#define FRAME_HEADER_SIZE
Definition: asfdec_f.c:138
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
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
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
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
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:609
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:574
ASFContext::data_object_offset
uint64_t data_object_offset
data object offset (excl. GUID & size)
Definition: asfdec_f.c:87
av_buffer_alloc
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:77
ASFStream::payload
ASFPayload payload[8]
Definition: asfdec_f.c:72
ff_asf_digital_signature
const ff_asf_guid ff_asf_digital_signature
Definition: asf_tags.c:136
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
ASFContext::packet_time_start
int64_t packet_time_start
Definition: asfdec_f.c:108
ASFStream::pkt
AVPacket pkt
Definition: asfdec_f.c:52
ffio_limit
int ffio_limit(AVIOContext *s, int size)
Definition: aviobuf.c:1064
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:57
ff_asf_comment_header
const ff_asf_guid ff_asf_comment_header
Definition: asf_tags.c:63
ASFContext::packet_flags
int packet_flags
Definition: asfdec_f.c:93
print_guid
#define print_guid(g)
Definition: asfdec_f.c:193
ff_asf_jfif_media
const ff_asf_guid ff_asf_jfif_media
Definition: asf_tags.c:51
ff_asf_ext_stream_audio_stream
const ff_asf_guid ff_asf_ext_stream_audio_stream
Definition: asf_tags.c:98
asf_read_ext_content_desc
static int asf_read_ext_content_desc(AVFormatContext *s)
Definition: asfdec_f.c:554
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:596
ff_asf_ext_stream_embed_stream_header
const ff_asf_guid ff_asf_ext_stream_embed_stream_header
Definition: asf_tags.c:94
avio_internal.h
ff_asf_my_guid
const ff_asf_guid ff_asf_my_guid
Definition: asf_tags.c:120
internal.h
ff_asf_codec_comment_header
const ff_asf_guid ff_asf_codec_comment_header
Definition: asf_tags.c:67
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
ASFStream::stream_language_index
uint16_t stream_language_index
Definition: asfdec_f.c:66
ASFContext::packet_key_frame
int packet_key_frame
Definition: asfdec_f.c:100
ASFStream::frag_offset
int frag_offset
Definition: asfdec_f.c:53
common.h
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:223
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
asf_read_pts
static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: asfdec_f.c:1444
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ff_asf_content_encryption
const ff_asf_guid ff_asf_content_encryption
Definition: asf_tags.c:128
asf_read_frame_header
static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb)
Definition: asfdec_f.c:1009
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
ff_asf_head2_guid
const ff_asf_guid ff_asf_head2_guid
Definition: asf_tags.c:82
ASFStream::palette
uint32_t palette[256]
Definition: asfdec_f.c:69
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
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
bswap.h
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
av_hex_dump_log
void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
Send a nice hexadecimal dump of a buffer to the log.
Definition: dump.c:88
ASFStream::packet_obj_size
int packet_obj_size
Definition: asfdec_f.c:54
ASFMainHeader::file_size
uint64_t file_size
in bytes invalid if broadcasting
Definition: asf.h:41
ff_asf_stream_header
const ff_asf_guid ff_asf_stream_header
Definition: asf_tags.c:31
pos
unsigned int pos
Definition: spdifenc.c:414
avformat.h
asf_read_metadata
static int asf_read_metadata(AVFormatContext *s)
Definition: asfdec_f.c:612
dict.h
AVPacket::side_data
AVPacketSideData * side_data
Additional packet data that can be provided by the container.
Definition: packet.h:614
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
asf.h
U
#define U(x)
Definition: vpx_arith.h:37
ASFContext::asfid2avid
int asfid2avid[128]
conversion table from asf ID 2 AVStream ID
Definition: asfdec_f.c:77
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:36
ASFContext::packet_timestamp
int packet_timestamp
Definition: asfdec_f.c:95
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: packet.c:231
AVRational::den
int den
Denominator.
Definition: rational.h:60
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
ASFStream::num
int num
Definition: asfdec_f.c:49
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:602
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
asf_reset_header
static void asf_reset_header(AVFormatContext *s)
Definition: asfdec_f.c:1389
AVPacket::stream_index
int stream_index
Definition: packet.h:605
ASFContext::packet_multi_size
int packet_multi_size
Definition: asfdec_f.c:106
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:321
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:184
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:355
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:113
ASFContext
Definition: asfdec_f.c:75
mem.h
ff_asf_marker_header
const ff_asf_guid ff_asf_marker_header
Definition: asf_tags.c:110
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
ASFMainHeader::max_bitrate
uint32_t max_bitrate
bandwidth of stream in bps should be the sum of bitrates of the individual media streams
Definition: asf.h:59
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
FFStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: internal.h:198
ff_asf_ext_content_encryption
const ff_asf_guid ff_asf_ext_content_encryption
Definition: asf_tags.c:132
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_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:326
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
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:623
ff_asf_metadata_library_header
const ff_asf_guid ff_asf_metadata_library_header
Definition: asf_tags.c:106
FFInputFormat
Definition: demux.h:66
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:741
ff_asf_metadata_header
const ff_asf_guid ff_asf_metadata_header
Definition: asf_tags.c:102
ASFStream
Definition: asfdec_f.c:48
ASFContext::no_resync_search
int no_resync_search
Definition: asfdec_f.c:115
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:592
ff_asf_filetime_to_avtime
static int64_t ff_asf_filetime_to_avtime(int64_t filetime)
Definition: asf.h:123
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:99
get_value
static uint64_t get_value(AVIOContext *pb, int type)
Definition: asfdec_f.c:205
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
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
ffio_read_size
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:665
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
ff_asf_header
const ff_asf_guid ff_asf_header
Definition: asf_tags.c:23
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
avstring.h
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:52
snprintf
#define snprintf
Definition: snprintf.h:34
ASFPayload
Definition: asfdec_f.c:43
asf_read_language_list
static int asf_read_language_list(AVFormatContext *s)
Definition: asfdec_f.c:592
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:239
ASFContext::packet_replic_size
int packet_replic_size
Definition: asfdec_f.c:99
ff_asfcrypt_dec
void ff_asfcrypt_dec(const uint8_t key[20], uint8_t *data, int len)
Definition: asfcrypt.c:148
ASFContext::packet_segments
int packet_segments
Definition: asfdec_f.c:97
asf_read_header
static int asf_read_header(AVFormatContext *s)
Definition: asfdec_f.c:700
AVPacket::side_data_elems
int side_data_elems
Definition: packet.h:615
ASFStream::payload_ext_ct
int payload_ext_ct
Definition: asfdec_f.c:71
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
ASFContext::export_xmp
int export_xmp
Definition: asfdec_f.c:116
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349