44 uint32_t stream_bitrates[128];
46 char stream_languages[128][6];
98 #define ASF_MAX_STREAMS 127
99 #define FRAME_HEADER_SIZE 17
103 0x90, 0x08, 0x00, 0x33, 0xb1, 0xe5, 0xcf, 0x11, 0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb
108 0xce, 0x75, 0xf8, 0x7b, 0x8d, 0x46, 0xd1, 0x11, 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2
111 #define PRINT_IF_GUID(g, cmp) \
112 if (!ff_guidcmp(g, &cmp)) \
113 av_dlog(NULL, "(GUID: %s) ", # cmp)
141 else PRINT_IF_GUID(g, stream_bitrate_guid);
145 for (i = 0; i < 16; i++)
151 #define print_guid(g)
191 int ret, type, picsize, desc_len;
194 if (len < 1 + 4 + 2 + 2) {
214 if (!strncmp(mime->
str, mimetype,
sizeof(mimetype))) {
226 if (picsize >= len) {
233 desc_len = (len - picsize) * 2 + 1;
275 if (id3v2_extra_meta)
285 if ((
unsigned)len >= (UINT_MAX - 1) / 2)
294 }
else if (type == 1) {
295 if (!strcmp(key,
"WM/Picture")) {
297 }
else if (!strcmp(key,
"ID3")) {
303 }
else if (type > 1 && type <= 5) {
305 snprintf(value, len,
"%"PRIu64, num);
306 }
else if (type == 6) {
311 "Unsupported value type %d in tag %s.\n", type, key);
354 int type_specific_size, sizeX;
357 int test_for_ext_stream_audio, is_dvr_ms_audio = 0;
381 (10000000 / 1000) - start_time;
385 test_for_ext_stream_audio = 0;
396 test_for_ext_stream_audio = 1;
411 if (test_for_ext_stream_audio) {
430 if (is_dvr_ms_audio) {
442 if (size >= (pos2 + 8 - pos1 + 24)) {
456 size - (
avio_tell(pb) - pos1 + 24) >= 51) {
493 if (tag1 ==
MKTAG(
'D',
'V',
'R',
' ')) {
507 avio_skip(pb, size - (pos2 - pos1 + 24));
517 int ext_len, payload_ext_ct, stream_ct, i;
518 uint32_t leak_rate, stream_num;
519 unsigned int stream_languageid_index;
534 if (stream_num < 128)
541 if (stream_num < 128)
544 for (i = 0; i < stream_ct; i++) {
550 for (i = 0; i < payload_ext_ct; i++) {
563 int len1, len2, len3, len4, len5;
570 get_tag(s,
"title", 0, len1, 32);
571 get_tag(s,
"author", 0, len2, 32);
572 get_tag(s,
"copyright", 0, len3, 32);
573 get_tag(s,
"comment", 0, len4, 32);
583 int desc_count, i, ret;
586 for (i = 0; i < desc_count; i++) {
587 int name_len, value_type, value_len;
597 if (!value_type && value_len % 2)
602 if (!strcmp(name,
"AspectRatioX"))
604 else if (!strcmp(name,
"AspectRatioY"))
607 get_tag(s, name, value_type, value_len, 32);
619 for (j = 0; j < stream_count; j++) {
621 unsigned int lang_len =
avio_r8(pb);
623 sizeof(lang))) < lang_len)
637 int n, stream_num, name_len, value_len;
641 for (i = 0; i < n; i++) {
653 av_dlog(s,
"%d stream %d name_len %2d type %d len %4d <%s>\n",
654 i, stream_num, name_len, value_type, value_len, name);
656 if (!strcmp(name,
"AspectRatioX")){
659 asf->
dar[stream_num].
num = aspect_x;
660 }
else if(!strcmp(name,
"AspectRatioY")){
663 asf->
dar[stream_num].
den = aspect_y;
665 get_tag(s, name, value_type, value_len, 16);
676 int i, count, name_len, ret;
684 for (i = 0; i < name_len; i++)
687 for (i = 0; i < count; i++) {
699 sizeof(name))) < name_len)
733 if (!(asf->
hdr.
flags & 0x01) && gsize >= 100)
777 "DRM protected stream detected, decoding will likely fail!\n");
780 "Ext DRM protected stream detected, decoding will likely fail!\n");
783 "Digital signature detected, decoding will likely fail!\n");
789 "gpos mismatch our pos=%"PRIu64
", end=%"PRId64
"\n",
802 for (i = 0; i < 128; i++) {
804 if (stream_num >= 0) {
812 }
else if ((asf->
dar[0].
num > 0) && (asf->
dar[0].
den > 0) &&
819 av_dlog(s,
"i=%d, st->codec->codec_type:%d, asf->dar %d:%d sar=%d:%d\n",
826 if (rfc1766 && strlen(rfc1766) > 1) {
827 const char primary_tag[3] = { rfc1766[0], rfc1766[1],
'\0' };
842 #define DO_2BITS(bits, var, defval) \
843 switch (bits & 3) { \
845 var = avio_rl32(pb); \
849 var = avio_rl16(pb); \
870 uint32_t packet_length, padsize;
886 if (c == 0x82 && !d && !e)
899 "ff asf bad header %x at:%"PRId64
"\n", c,
avio_tell(pb));
901 if ((c & 0x8f) == 0x82) {
922 if (!packet_length || packet_length >= (1
U << 29)) {
924 "invalid packet_length %d at:%"PRId64
"\n",
928 if (padsize >= packet_length) {
930 "invalid padsize %d at:%"PRId64
"\n", padsize,
avio_tell(pb));
946 if (rsize > packet_length - padsize) {
949 "invalid packet header length %d for pktlen %d-%d at %"PRId64
"\n",
950 rsize, packet_length, padsize,
avio_tell(pb));
954 if (packet_length < asf->hdr.min_pktsize)
957 av_dlog(s,
"packet: size=%d padsize=%d left=%d\n",
980 av_dlog(asf,
"key:%d stream:%d seq:%d offset:%d replic_size:%d\n",
1107 av_dlog(s,
"skipping asf data pkt with fragment offset for "
1108 "stream:%d, expected:%d but got %d from pkt)\n",
1144 "freeing incomplete packet size %d, new %d\n",
1167 av_dlog(asf,
"new packet: stream:%d key:%d packet_key:%d audio:%d size:%d\n",
1179 av_dlog(asf,
"READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n",
1189 "packet fragment position invalid %u,%u not in %u\n",
1198 if (ret < 0 || asf->packet_frag_offset + ret == 0)
1237 "pkt.size != ds_packet_size * ds_span (%d %d %d)\n",
1247 memset(newdata + asf_st->
pkt.
size, 0,
1249 while (offset < asf_st->pkt.
size) {
1251 int row = off / asf_st->
ds_span;
1252 int col = off % asf_st->
ds_span;
1256 memcpy(newdata + offset,
1269 #if FF_API_DESTRUCT_PACKET
1349 int64_t *ppos, int64_t pos_limit)
1354 int64_t pos = *ppos;
1415 if (gsize < 24 || s->pb->eof_reached) {
1424 int64_t itime, last_pos = -1;
1433 "itime:0x%"PRIx64
", pct:%d, ict:%d\n", itime, pct, ict);
1435 for (i = 0; i < ict; i++) {
1441 if (pos != last_pos) {
1443 pktnum, pktct, index_pts);
1459 int64_t pts,
int flags)
1519 .priv_class = &asf_class,