annotate libmpdemux/asfheader.c @ 18001:a2683ee7cb5a

fix descrambling of asf file, where signed buffer could cause erroneous values to be filled in descrable variables, add misssing check for one of these variables and restore sign of these variables as insurance that these checks will work even in such case.
author iive
date Thu, 30 Mar 2006 23:06:18 +0000
parents 2545bbd91450
children 11c9dfbe120c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 // .asf fileformat docs from http://divx.euro.ru
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
3
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
4 #include <stdio.h>
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
5 #include <stdlib.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1342
diff changeset
6 #include <unistd.h>
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
7
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
8 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
9 #include "mp_msg.h"
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
10 #include "help_mp.h"
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
11
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
12 #include "stream.h"
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
13 #include "demuxer.h"
2338
4f3e8c8ea32f includes cleanup
arpi
parents: 2310
diff changeset
14 #include "stheader.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
15
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
16 #include "asf.h"
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
17
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
18 #ifdef ARCH_X86
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
19 #define ASF_LOAD_GUID_PREFIX(guid) (*(uint32_t *)(guid))
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
20 #else
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
21 #define ASF_LOAD_GUID_PREFIX(guid) \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
22 ((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0])
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
23 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
25 #define ASF_GUID_PREFIX_audio_stream 0xF8699E40
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
26 #define ASF_GUID_PREFIX_video_stream 0xBC19EFC0
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
27 #define ASF_GUID_PREFIX_audio_conceal_none 0x49f1a440
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
28 #define ASF_GUID_PREFIX_audio_conceal_interleave 0xbfc3cd50
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
29 #define ASF_GUID_PREFIX_header 0x75B22630
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
30 #define ASF_GUID_PREFIX_data_chunk 0x75b22636
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
31 #define ASF_GUID_PREFIX_index_chunk 0x33000890
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
32 #define ASF_GUID_PREFIX_stream_header 0xB7DC0791
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
33 #define ASF_GUID_PREFIX_header_2_0 0xD6E229D1
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
34 #define ASF_GUID_PREFIX_file_header 0x8CABDCA1
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
35 #define ASF_GUID_PREFIX_content_desc 0x75b22633
4333
c67d50d4a889 Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents: 4288
diff changeset
36 #define ASF_GUID_PREFIX_stream_group 0x7bf875ce
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
38 /*
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
39 const char asf_audio_stream_guid[16] = {0x40, 0x9e, 0x69, 0xf8,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
40 0x4d, 0x5b, 0xcf, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b};
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
41 const char asf_video_stream_guid[16] = {0xc0, 0xef, 0x19, 0xbc,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
42 0x4d, 0x5b, 0xcf, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b};
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
43 */
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
44 const char asf_stream_header_guid[16] = {0x91, 0x07, 0xdc, 0xb7,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
45 0xb7, 0xa9, 0xcf, 0x11, 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65};
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
46 const char asf_file_header_guid[16] = {0xa1, 0xdc, 0xab, 0x8c,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
47 0x47, 0xa9, 0xcf, 0x11, 0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65};
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
48 const char asf_content_desc_guid[16] = {0x33, 0x26, 0xb2, 0x75,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
49 0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c};
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
50 const char asf_stream_group_guid[16] = {0xce, 0x75, 0xf8, 0x7b,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
51 0x8d, 0x46, 0xd1, 0x11, 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2};
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
52 const char asf_data_chunk_guid[16] = {0x36, 0x26, 0xb2, 0x75,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
53 0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c};
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
56 // the variable string is modify in this function
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
57 void pack_asf_string(char* string, int length) {
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
58 int i,j;
843
a88b87750b8a Fixed crashing while reading the content description for some ASF file.
bertrand
parents: 838
diff changeset
59 if( string==NULL ) return;
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
60 for( i=0, j=0; i<length && string[i]!='\0'; i+=2, j++) {
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
61 string[j]=string[i];
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
62 }
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
63 string[j]='\0';
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
64 }
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
65
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
66 // the variable string is modify in this function
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
67 void print_asf_string(const char* name, char* string, int length) {
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 816
diff changeset
68 pack_asf_string(string, length);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
69 mp_msg(MSGT_HEADER,MSGL_V,"%s%s\n", name, string);
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
70 }
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
71
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
72 static char* asf_chunk_type(unsigned char* guid) {
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
73 static char tmp[60];
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
74 char *p;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
75 int i;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
76
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
77 switch(ASF_LOAD_GUID_PREFIX(guid)){
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
78 case ASF_GUID_PREFIX_audio_stream:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
79 return "guid_audio_stream";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
80 case ASF_GUID_PREFIX_video_stream:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
81 return "guid_video_stream";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
82 case ASF_GUID_PREFIX_audio_conceal_none:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
83 return "guid_audio_conceal_none";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
84 case ASF_GUID_PREFIX_audio_conceal_interleave:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
85 return "guid_audio_conceal_interleave";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
86 case ASF_GUID_PREFIX_header:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
87 return "guid_header";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
88 case ASF_GUID_PREFIX_data_chunk:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
89 return "guid_data_chunk";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
90 case ASF_GUID_PREFIX_index_chunk:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
91 return "guid_index_chunk";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
92 case ASF_GUID_PREFIX_stream_header:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
93 return "guid_stream_header";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
94 case ASF_GUID_PREFIX_header_2_0:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
95 return "guid_header_2_0";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
96 case ASF_GUID_PREFIX_file_header:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
97 return "guid_file_header";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
98 case ASF_GUID_PREFIX_content_desc:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
99 return "guid_content_desc";
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
100 default:
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
101 strcpy(tmp, "unknown guid ");
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
102 p = tmp + strlen(tmp);
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
103 for (i = 0; i < 16; i++) {
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
104 if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-';
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
105 sprintf(p, "%02x", guid[i]);
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
106 p += 2;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
107 }
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
108 return tmp;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 432
diff changeset
112 int asf_check_header(demuxer_t *demuxer){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
114 struct asf_priv* asf = calloc(1,sizeof(*asf));
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
115 asf->scrambling_h=asf->scrambling_w=asf->scrambling_b=1;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
116 stream_read(demuxer->stream,(char*) &asf->header,sizeof(asf->header)); // header obj
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
117 le2me_ASF_header_t(&asf->header); // swap to machine endian
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 // for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n");
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
120 if(memcmp(asfhdrguid,asf->header.objh.guid,16)){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
121 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: not ASF guid!\n");
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
122 free(asf);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 return 0; // not ASF guid
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
125 if(asf->header.cno>256){
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
126 free(asf);
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
127 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asf->header.cno);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 return 0; // invalid header???
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
130 demuxer->priv = asf;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16149
diff changeset
131 return DEMUXER_TYPE_ASF;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
134 extern void print_wave_header(WAVEFORMATEX *h, int verbose_level);
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
135 extern void print_video_header(BITMAPINFOHEADER *h, int verbose_level);
601
2d3a4339bb5a warnings killed
szabii
parents: 600
diff changeset
136
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
137 int find_asf_guid(char *buf, const char *guid, int cur_pos, int buf_len)
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
138 {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
139 int i;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
140 for (i = cur_pos; i < buf_len - 19; i++) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
141 if (memcmp(&buf[i], guid, 16) == 0)
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
142 return i + 16 + 8; // point after guid + length
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
143 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
144 return -1;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
145 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
146
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
147 int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf){
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
148 int hdr_len = asf->header.objh.size - sizeof(asf->header);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
149 char *hdr = NULL;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
150 char guid_buffer[16];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
151 int pos, start = stream_tell(demuxer->stream);
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
152 uint32_t* streams = NULL;
4349
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
153 int audio_streams=0;
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
154 int video_streams=0;
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
155 uint16_t stream_count=0;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
156 int best_video = -1;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
157 int best_audio = -1;
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
158 uint64_t data_len;
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
159
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
160 if(hdr_len < 0) {
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
161 mp_msg(MSGT_HEADER, MSGL_FATAL, "Header size is too small.\n");
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
162 return 0;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
163 }
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
164
15795
546b49d7147d M$ puts whole FAQs in these headers, so they can get really big...
reimar
parents: 15572
diff changeset
165 if (hdr_len > 1024 * 1024) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
166 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_HeaderSizeOver1MB,
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
167 hdr_len);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
168 return 0;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
169 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
170 hdr = malloc(hdr_len);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
171 if (!hdr) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
172 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_HeaderMallocFailed,
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
173 hdr_len);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
174 return 0;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
175 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
176 stream_read(demuxer->stream, hdr, hdr_len);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
177 if (stream_eof(demuxer->stream)) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
178 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_EOFWhileReadingHeader);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
179 goto err_out;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
180 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
181
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
182 // find stream headers
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
183 pos = 0;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
184 while ((pos = find_asf_guid(hdr, asf_stream_header_guid, pos, hdr_len)) >= 0)
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
185 {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
186 ASF_stream_header_t *streamh = (ASF_stream_header_t *)&hdr[pos];
18001
a2683ee7cb5a fix descrambling of asf file,
iive
parents: 17992
diff changeset
187 uint8_t *buffer;
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
188 pos += sizeof(ASF_stream_header_t);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
189 if (pos > hdr_len) goto len_err_out;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
190 le2me_ASF_stream_header_t(streamh);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
191 mp_msg(MSGT_HEADER, MSGL_V, "stream type: %s\n",
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
192 asf_chunk_type(streamh->type));
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
193 mp_msg(MSGT_HEADER, MSGL_V, "stream concealment: %s\n",
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
194 asf_chunk_type(streamh->concealment));
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
195 mp_msg(MSGT_HEADER, MSGL_V, "type: %d bytes, stream: %d bytes ID: %d\n",
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
196 (int)streamh->type_size, (int)streamh->stream_size,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
197 (int)streamh->stream_no);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
198 mp_msg(MSGT_HEADER, MSGL_V, "unk1: %lX unk2: %X\n",
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
199 (unsigned long)streamh->unk1, (unsigned int)streamh->unk2);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
200 mp_msg(MSGT_HEADER, MSGL_V, "FILEPOS=0x%X\n", pos + start);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
201 // type-specific data:
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
202 buffer = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
203 pos += streamh->type_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
204 if (pos > hdr_len) goto len_err_out;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
205 switch(ASF_LOAD_GUID_PREFIX(streamh->type)){
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
206 case ASF_GUID_PREFIX_audio_stream: {
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
207 sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
208 ++audio_streams;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
209 sh_audio->wf=calloc((streamh->type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh->type_size,1);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
210 memcpy(sh_audio->wf,buffer,streamh->type_size);
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
211 le2me_WAVEFORMATEX(sh_audio->wf);
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
212 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
213 if(ASF_LOAD_GUID_PREFIX(streamh->concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
214 buffer = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
215 pos += streamh->stream_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
216 if (pos > hdr_len) goto len_err_out;
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
217 asf->scrambling_h=buffer[0];
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
218 asf->scrambling_w=(buffer[2]<<8)|buffer[1];
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
219 asf->scrambling_b=(buffer[4]<<8)|buffer[3];
18001
a2683ee7cb5a fix descrambling of asf file,
iive
parents: 17992
diff changeset
220 if(asf->scrambling_b>0){
a2683ee7cb5a fix descrambling of asf file,
iive
parents: 17992
diff changeset
221 asf->scrambling_w/=asf->scrambling_b;
a2683ee7cb5a fix descrambling of asf file,
iive
parents: 17992
diff changeset
222 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 } else {
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
224 asf->scrambling_b=asf->scrambling_h=asf->scrambling_w=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
226 mp_msg(MSGT_HEADER,MSGL_V,"ASF: audio scrambling: %d x %d x %d\n",asf->scrambling_h,asf->scrambling_w,asf->scrambling_b);
426
26e513f392b2 new stream selection code
arpi_esp
parents: 340
diff changeset
227 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 break;
291
da98e96499bb sh_audio/sh_video added, general codec cleanup
arpi_esp
parents: 109
diff changeset
229 }
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
230 case ASF_GUID_PREFIX_video_stream: {
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
231 sh_video_t* sh_video=new_sh_video(demuxer,streamh->stream_no & 0x7F);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
232 unsigned int len=streamh->type_size-(4+4+1+2);
4349
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
233 ++video_streams;
432
5251b0c57e39 sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents: 426
diff changeset
234 // sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize);
5251b0c57e39 sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents: 426
diff changeset
235 sh_video->bih=calloc((len<sizeof(BITMAPINFOHEADER))?sizeof(BITMAPINFOHEADER):len,1);
5251b0c57e39 sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents: 426
diff changeset
236 memcpy(sh_video->bih,&buffer[4+4+1+2],len);
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1289
diff changeset
237 le2me_BITMAPINFOHEADER(sh_video->bih);
15572
5d738acd664c support DVR format
reimar
parents: 14236
diff changeset
238 if (sh_video->bih->biCompression == mmioFOURCC('D', 'V', 'R', ' '))
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
239 mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_MPDEMUX_ASFHDR_DVRWantsLibavformat);
426
26e513f392b2 new stream selection code
arpi_esp
parents: 340
diff changeset
240 //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
26e513f392b2 new stream selection code
arpi_esp
parents: 340
diff changeset
241 //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
242 if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 //asf_video_id=streamh.stream_no & 0x7F;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 340
diff changeset
244 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 break;
291
da98e96499bb sh_audio/sh_video added, general codec cleanup
arpi_esp
parents: 109
diff changeset
246 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 // stream-specific data:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 // stream_read(demuxer->stream,(char*) buffer,streamh.stream_size);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
250 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
251
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
252 // find file header
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
253 pos = find_asf_guid(hdr, asf_file_header_guid, 0, hdr_len);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
254 if (pos >= 0) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
255 ASF_file_header_t *fileh = (ASF_file_header_t *)&hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
256 pos += sizeof(ASF_file_header_t);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
257 if (pos > hdr_len) goto len_err_out;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
258 le2me_ASF_file_header_t(fileh);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
259 mp_msg(MSGT_HEADER, MSGL_V, "ASF: packets: %d flags: %d "
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
260 "max_packet_size: %d min_packet_size: %d max_bitrate: %d "
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
261 "preroll: %d\n",
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
262 (int)fileh->num_packets, (int)fileh->flags,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
263 (int)fileh->min_packet_size, (int)fileh->max_packet_size,
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
264 (int)fileh->max_bitrate, (int)fileh->preroll);
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
265 asf->packetsize=fileh->max_packet_size;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
266 asf->packet=malloc(asf->packetsize); // !!!
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
267 asf->packetrate=fileh->max_bitrate/8.0/(double)asf->packetsize;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17977
diff changeset
268 asf->movielength=fileh->send_duration/10000000LL;
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
269 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
271 // find content header
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
272 pos = find_asf_guid(hdr, asf_content_desc_guid, 0, hdr_len);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
273 if (pos >= 0) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
274 ASF_content_description_t *contenth = (ASF_content_description_t *)&hdr[pos];
1003
26579d6e6c38 Initialisation of ptr string to NULL to avoid gcc warning.
bertrand
parents: 848
diff changeset
275 char *string=NULL;
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
276 pos += sizeof(ASF_content_description_t);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
277 if (pos > hdr_len) goto len_err_out;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
278 le2me_ASF_content_description_t(contenth);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
279 mp_msg(MSGT_HEADER,MSGL_V,"\n");
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
280 // extract the title
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
281 if( contenth->title_size!=0 ) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
282 string = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
283 pos += contenth->title_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
284 if (pos > hdr_len) goto len_err_out;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16882
diff changeset
285 if( mp_msg_test(MSGT_HEADER,MSGL_V) )
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
286 print_asf_string(" Title: ", string, contenth->title_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
287 else
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
288 pack_asf_string(string, contenth->title_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
289 demux_info_add(demuxer, "name", string);
843
a88b87750b8a Fixed crashing while reading the content description for some ASF file.
bertrand
parents: 838
diff changeset
290 }
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
291 // extract the author
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
292 if( contenth->author_size!=0 ) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
293 string = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
294 pos += contenth->author_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
295 if (pos > hdr_len) goto len_err_out;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16882
diff changeset
296 if( mp_msg_test(MSGT_HEADER,MSGL_V) )
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
297 print_asf_string(" Author: ", string, contenth->author_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
298 else
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
299 pack_asf_string(string, contenth->author_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
300 demux_info_add(demuxer, "author", string);
843
a88b87750b8a Fixed crashing while reading the content description for some ASF file.
bertrand
parents: 838
diff changeset
301 }
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
302 // extract the copyright
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
303 if( contenth->copyright_size!=0 ) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
304 string = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
305 pos += contenth->copyright_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
306 if (pos > hdr_len) goto len_err_out;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16882
diff changeset
307 if( mp_msg_test(MSGT_HEADER,MSGL_V) )
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
308 print_asf_string(" Copyright: ", string, contenth->copyright_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
309 else
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
310 pack_asf_string(string, contenth->copyright_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
311 demux_info_add(demuxer, "copyright", string);
843
a88b87750b8a Fixed crashing while reading the content description for some ASF file.
bertrand
parents: 838
diff changeset
312 }
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
313 // extract the comment
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
314 if( contenth->comment_size!=0 ) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
315 string = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
316 pos += contenth->comment_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
317 if (pos > hdr_len) goto len_err_out;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16882
diff changeset
318 if( mp_msg_test(MSGT_HEADER,MSGL_V) )
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
319 print_asf_string(" Comment: ", string, contenth->comment_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
320 else
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
321 pack_asf_string(string, contenth->comment_size);
3070
dee70d05a406 added demux_info support
alex
parents: 2338
diff changeset
322 demux_info_add(demuxer, "comments", string);
843
a88b87750b8a Fixed crashing while reading the content description for some ASF file.
bertrand
parents: 838
diff changeset
323 }
816
6d72528d56ff ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents: 692
diff changeset
324 // extract the rating
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
325 if( contenth->rating_size!=0 ) {
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
326 string = &hdr[pos];
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
327 pos += contenth->rating_size;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
328 if (pos > hdr_len) goto len_err_out;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16882
diff changeset
329 if( mp_msg_test(MSGT_HEADER,MSGL_V) )
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
330 print_asf_string(" Rating: ", string, contenth->rating_size);
843
a88b87750b8a Fixed crashing while reading the content description for some ASF file.
bertrand
parents: 838
diff changeset
331 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
332 mp_msg(MSGT_HEADER,MSGL_V,"\n");
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
333 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
334
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
335 // find content header
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
336 pos = find_asf_guid(hdr, asf_stream_group_guid, 0, hdr_len);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
337 if (pos >= 0) {
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
338 uint16_t stream_id, i;
4333
c67d50d4a889 Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents: 4288
diff changeset
339 uint32_t max_bitrate;
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
340 char *ptr = &hdr[pos];
12219
768f87d536f3 less verbosity + printf --> mp_msg
diego
parents: 10121
diff changeset
341 mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == START ===\n");
5618
f02b9bec4eed Changed the big handling to make it use mplayer's endian macros.
bertrand
parents: 5597
diff changeset
342 stream_count = le2me_16(*(uint16_t*)ptr);
4333
c67d50d4a889 Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents: 4288
diff changeset
343 ptr += sizeof(uint16_t);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
344 if (ptr > &hdr[hdr_len]) goto len_err_out;
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
345 if(stream_count > 0)
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
346 streams = (uint32_t*)malloc(2*stream_count*sizeof(uint32_t));
12219
768f87d536f3 less verbosity + printf --> mp_msg
diego
parents: 10121
diff changeset
347 mp_msg(MSGT_HEADER,MSGL_V," stream count=[0x%x][%u]\n", stream_count, stream_count );
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
348 for( i=0 ; i<stream_count ; i++ ) {
5618
f02b9bec4eed Changed the big handling to make it use mplayer's endian macros.
bertrand
parents: 5597
diff changeset
349 stream_id = le2me_16(*(uint16_t*)ptr);
4333
c67d50d4a889 Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents: 4288
diff changeset
350 ptr += sizeof(uint16_t);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
351 if (ptr > &hdr[hdr_len]) goto len_err_out;
6187
50858d90c8d0 On the sun all int32 objects have to be aligned on 32 bit boundaries. With
arpi
parents: 5618
diff changeset
352 memcpy(&max_bitrate, ptr, sizeof(uint32_t));// workaround unaligment bug on sparc
50858d90c8d0 On the sun all int32 objects have to be aligned on 32 bit boundaries. With
arpi
parents: 5618
diff changeset
353 max_bitrate = le2me_32(max_bitrate);
4333
c67d50d4a889 Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents: 4288
diff changeset
354 ptr += sizeof(uint32_t);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
355 if (ptr > &hdr[hdr_len]) goto len_err_out;
12219
768f87d536f3 less verbosity + printf --> mp_msg
diego
parents: 10121
diff changeset
356 mp_msg(MSGT_HEADER,MSGL_V," stream id=[0x%x][%u]\n", stream_id, stream_id );
768f87d536f3 less verbosity + printf --> mp_msg
diego
parents: 10121
diff changeset
357 mp_msg(MSGT_HEADER,MSGL_V," max bitrate=[0x%x][%u]\n", max_bitrate, max_bitrate );
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
358 streams[2*i] = stream_id;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
359 streams[2*i+1] = max_bitrate;
4333
c67d50d4a889 Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents: 4288
diff changeset
360 }
12219
768f87d536f3 less verbosity + printf --> mp_msg
diego
parents: 10121
diff changeset
361 mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == END ===\n");
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
362 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
363 free(hdr);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
364 hdr = NULL;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
365 start = stream_tell(demuxer->stream); // start of first data chunk
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
366 stream_read(demuxer->stream, guid_buffer, 16);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
367 if (memcmp(guid_buffer, asf_data_chunk_guid, 16) != 0) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
368 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_NoDataChunkAfterHeader);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
369 return 0;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
370 }
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
371 // read length of chunk
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
372 stream_read(demuxer->stream, (char *)&data_len, sizeof(data_len));
16149
5a97461d9ada 10l, incorrect usage of le2me_*
reimar
parents: 15795
diff changeset
373 data_len = le2me_64(data_len);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
374 demuxer->movi_start = stream_tell(demuxer->stream) + 26;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
375 demuxer->movi_end = start + data_len;
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
376 mp_msg(MSGT_HEADER, MSGL_V, "Found movie at 0x%X - 0x%X\n",
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
377 (int)demuxer->movi_start, (int)demuxer->movi_end);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
379 if(streams) {
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
380 // stream selection is done in the network code, it shouldn't be done here
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
381 // as the servers often do not care about what we requested.
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
382 #if 0
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
383 uint32_t vr = 0, ar = 0,i;
10121
d42177a0da2a Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents: 8208
diff changeset
384 #ifdef MPLAYER_NETWORK
6645
fc2de514a140 If network is used, take the streams id that were requested.
bertrand
parents: 6187
diff changeset
385 if( demuxer->stream->streaming_ctrl!=NULL ) {
fc2de514a140 If network is used, take the streams id that were requested.
bertrand
parents: 6187
diff changeset
386 if( demuxer->stream->streaming_ctrl->bandwidth!=0 && demuxer->stream->streaming_ctrl->data!=NULL ) {
fc2de514a140 If network is used, take the streams id that were requested.
bertrand
parents: 6187
diff changeset
387 best_audio = ((asf_http_streaming_ctrl_t*)demuxer->stream->streaming_ctrl->data)->audio_id;
fc2de514a140 If network is used, take the streams id that were requested.
bertrand
parents: 6187
diff changeset
388 best_video = ((asf_http_streaming_ctrl_t*)demuxer->stream->streaming_ctrl->data)->video_id;
fc2de514a140 If network is used, take the streams id that were requested.
bertrand
parents: 6187
diff changeset
389 }
6666
349138a7b414 Fix -bandwidth if no streaming available, 10l ;)
atmos4
parents: 6645
diff changeset
390 } else
349138a7b414 Fix -bandwidth if no streaming available, 10l ;)
atmos4
parents: 6645
diff changeset
391 #endif
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
392 for(i = 0; i < stream_count; i++) {
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
393 uint32_t id = streams[2*i];
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
394 uint32_t rate = streams[2*i+1];
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
395 if(demuxer->v_streams[id] && rate > vr) {
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
396 vr = rate;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
397 best_video = id;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
398 } else if(demuxer->a_streams[id] && rate > ar) {
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
399 ar = rate;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
400 best_audio = id;
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
401 }
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
402 }
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
403 #endif
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
404 free(streams);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
405 streams = NULL;
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
406 }
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
407
4349
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
408 mp_msg(MSGT_HEADER,MSGL_V,"ASF: %d audio and %d video streams found\n",audio_streams,video_streams);
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
409 if(!audio_streams) demuxer->audio->id=-2; // nosound
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
410 else if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio;
4349
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
411 if(!video_streams){
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
412 if(!audio_streams){
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
413 mp_msg(MSGT_HEADER,MSGL_ERR,MSGTR_MPDEMUX_ASFHDR_AudioVideoHeaderNotFound);
4349
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
414 return 0;
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
415 }
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
416 demuxer->video->id=-2; // audio-only
4538
354048e506ab Added auto selection of the best streams and fixed a few compiler
albeu
parents: 4349
diff changeset
417 } else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video;
4349
266cb1a68519 pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents: 4333
diff changeset
418
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 #if 0
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16882
diff changeset
420 if( mp_msg_test(MSGT_HEADER,MSGL_V) ){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 printf("ASF duration: %d\n",(int)fileh.duration);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422 printf("ASF start pts: %d\n",(int)fileh.start_timestamp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
423 printf("ASF end pts: %d\n",(int)fileh.end_timestamp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
424 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
427 return 1;
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
428
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
429 len_err_out:
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 16175
diff changeset
430 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_InvalidLengthInASFHeader);
14236
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
431 err_out:
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
432 if (hdr) free(hdr);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
433 if (streams) free(streams);
2dc4595c3998 fix stream selection and -bandwidth for mms-over-http.
reimar
parents: 12219
diff changeset
434 return 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435 }