Mercurial > mplayer.hg
annotate libmpdemux/asfheader.c @ 23803:ec1a81c77628
fixed bug introduced with the addition of get_ext_stream_properties()
that should close bug #843, too.
Patch by John Donaghy. Explanation:
The issue is that get_ext_stream_properties shouldnt be returning
false when no extended stream properties are found for the stream in
question because that is not an error condition ... extended stream
properties are optional. The only time this function should return
false is when the buffer overrun checks fail.
author | nicodvb |
---|---|
date | Wed, 18 Jul 2007 22:16:08 +0000 |
parents | 304beddf4700 |
children | 5fd33d4d5c3e |
rev | line source |
---|---|
1 | 1 // .asf fileformat docs from http://divx.euro.ru |
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 | 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 | 8 #include "config.h" |
21445 | 9 #include "libavutil/common.h" |
21454
f91f04764311
Use libavutil LE_* macros instead of pointer casts which can result
reimar
parents:
21445
diff
changeset
|
10 #include "libavutil/intreadwrite.h" |
1567 | 11 #include "mp_msg.h" |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
12 #include "help_mp.h" |
1567 | 13 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22409
diff
changeset
|
14 #include "stream/stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
15 #include "demuxer.h" |
2338 | 16 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
17 |
1342 | 18 #include "asf.h" |
833 | 19 |
1342 | 20 #ifdef ARCH_X86 |
21 #define ASF_LOAD_GUID_PREFIX(guid) (*(uint32_t *)(guid)) | |
22 #else | |
21945 | 23 #define ASF_LOAD_GUID_PREFIX(guid) AV_RL32(guid) |
1342 | 24 #endif |
1 | 25 |
1342 | 26 #define ASF_GUID_PREFIX_audio_stream 0xF8699E40 |
27 #define ASF_GUID_PREFIX_video_stream 0xBC19EFC0 | |
28 #define ASF_GUID_PREFIX_audio_conceal_none 0x49f1a440 | |
29 #define ASF_GUID_PREFIX_audio_conceal_interleave 0xbfc3cd50 | |
30 #define ASF_GUID_PREFIX_header 0x75B22630 | |
31 #define ASF_GUID_PREFIX_data_chunk 0x75b22636 | |
32 #define ASF_GUID_PREFIX_index_chunk 0x33000890 | |
33 #define ASF_GUID_PREFIX_stream_header 0xB7DC0791 | |
34 #define ASF_GUID_PREFIX_header_2_0 0xD6E229D1 | |
35 #define ASF_GUID_PREFIX_file_header 0x8CABDCA1 | |
36 #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
|
37 #define ASF_GUID_PREFIX_stream_group 0x7bf875ce |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
38 #define ASF_GUID_PREFIX_ext_audio_stream 0x31178C9D |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
39 #define ASF_GUID_PREFIX_ext_stream_embed_stream_header 0x3AFB65E2 |
23239 | 40 #define ASF_GUID_PREFIX_dvr_ms_timing_rep_data 0xFD3CC02A |
41 #define ASF_GUID_PREFIX_dvr_ms_vid_frame_rep_data 0xDD6432CC | |
1 | 42 |
14236
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_audio_stream_guid[16] = {0x40, 0x9e, 0x69, 0xf8, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
45 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
|
46 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
|
47 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
|
48 */ |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
49 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
|
50 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
|
51 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
|
52 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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 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
|
58 0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
59 const char asf_ext_stream_embed_stream_header[16] = {0xe2, 0x65, 0xfb, 0x3a, |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
60 0xef, 0x47, 0xf2, 0x40, 0xac, 0x2c, 0x70, 0xa9, 0x0d, 0x71, 0xd3, 0x43}; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
61 const char asf_ext_stream_audio[16] = {0x9d, 0x8c, 0x17, 0x31, |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
62 0xe1, 0x03, 0x28, 0x45, 0xb5, 0x82, 0x3d, 0xf9, 0xdb, 0x22, 0xf5, 0x03}; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
63 const char asf_ext_stream_header[16] = {0xCB, 0xA5, 0xE6, 0x14, |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
64 0x72, 0xC6, 0x32, 0x43, 0x83, 0x99, 0xA9, 0x69, 0x52, 0x06, 0x5B, 0x5A}; |
21610 | 65 const char asf_metadata_header[16] = {0xea, 0xcb, 0xf8, 0xc5, |
66 0xaf, 0x5b, 0x77, 0x48, 0x84, 0x67, 0xaa, 0x8c, 0x44, 0xfa, 0x4c, 0xca}; | |
22409 | 67 const char asf_content_encryption[16] = {0xfb, 0xb3, 0x11, 0x22, |
68 0x23, 0xbd, 0xd2, 0x11, 0xb4, 0xb7, 0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e}; | |
23239 | 69 const char asf_dvr_ms_timing_rep_data[16] = {0x2a, 0xc0, 0x3c,0xfd, |
70 0xdb, 0x06, 0xfa, 0x4c, 0x80, 0x1c, 0x72, 0x12, 0xd3, 0x87, 0x45, 0xe4}; | |
71 const char asf_dvr_ms_vid_frame_rep_data[16] = {0xcc, 0x32, 0x64, 0xdd, | |
72 0x29, 0xe2, 0xdb, 0x40, 0x80, 0xf6, 0xd2, 0x63, 0x28, 0xd2, 0x76, 0x1f}; | |
21610 | 73 |
74 typedef struct { | |
75 // must be 0 for metadata record, might be non-zero for metadata lib record | |
76 uint16_t lang_list_index; | |
77 uint16_t stream_num; | |
78 uint16_t name_length; | |
79 uint16_t data_type; | |
80 uint32_t data_length; | |
81 uint16_t* name; | |
82 void* data; | |
83 } ASF_meta_record_t; | |
1 | 84 |
21445 | 85 static char* get_ucs2str(const uint16_t* inbuf, uint16_t inlen) |
86 { | |
87 char* outbuf = calloc(inlen, 2); | |
88 char* q; | |
89 int i; | |
1 | 90 |
21445 | 91 if (!outbuf) { |
92 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed); | |
93 return NULL; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
94 } |
21445 | 95 q = outbuf; |
96 for (i = 0; i < inlen / 2; i++) { | |
97 uint8_t tmp; | |
23737
304beddf4700
fix unaligned memory access in asfheader.c, courtesy of Balatoni Denes
zuxy
parents:
23399
diff
changeset
|
98 PUT_UTF8(AV_RL16(&inbuf[i]), tmp, *q++ = tmp;) |
21445 | 99 } |
100 return outbuf; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
101 } |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
102 |
19108
5e767cabf4cd
marks several read-only string parameters and function return-values which can only be used read-only as const. Patch by Stefan Huehner, stefan _AT huener-org
reynaldo
parents:
19062
diff
changeset
|
103 static const char* asf_chunk_type(unsigned char* guid) { |
1342 | 104 static char tmp[60]; |
105 char *p; | |
106 int i; | |
107 | |
108 switch(ASF_LOAD_GUID_PREFIX(guid)){ | |
109 case ASF_GUID_PREFIX_audio_stream: | |
110 return "guid_audio_stream"; | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
111 case ASF_GUID_PREFIX_ext_audio_stream: |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
112 return "guid_ext_audio_stream"; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
113 case ASF_GUID_PREFIX_ext_stream_embed_stream_header: |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
114 return "guid_ext_stream_embed_stream_header"; |
1342 | 115 case ASF_GUID_PREFIX_video_stream: |
116 return "guid_video_stream"; | |
117 case ASF_GUID_PREFIX_audio_conceal_none: | |
118 return "guid_audio_conceal_none"; | |
119 case ASF_GUID_PREFIX_audio_conceal_interleave: | |
120 return "guid_audio_conceal_interleave"; | |
121 case ASF_GUID_PREFIX_header: | |
122 return "guid_header"; | |
123 case ASF_GUID_PREFIX_data_chunk: | |
124 return "guid_data_chunk"; | |
125 case ASF_GUID_PREFIX_index_chunk: | |
126 return "guid_index_chunk"; | |
127 case ASF_GUID_PREFIX_stream_header: | |
128 return "guid_stream_header"; | |
129 case ASF_GUID_PREFIX_header_2_0: | |
130 return "guid_header_2_0"; | |
131 case ASF_GUID_PREFIX_file_header: | |
132 return "guid_file_header"; | |
133 case ASF_GUID_PREFIX_content_desc: | |
134 return "guid_content_desc"; | |
23239 | 135 case ASF_GUID_PREFIX_dvr_ms_timing_rep_data: |
136 return "guid_dvr_ms_timing_rep_data"; | |
137 case ASF_GUID_PREFIX_dvr_ms_vid_frame_rep_data: | |
138 return "guid_dvr_ms_vid_frame_rep_data"; | |
1342 | 139 default: |
140 strcpy(tmp, "unknown guid "); | |
141 p = tmp + strlen(tmp); | |
142 for (i = 0; i < 16; i++) { | |
143 if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-'; | |
144 sprintf(p, "%02x", guid[i]); | |
145 p += 2; | |
146 } | |
147 return tmp; | |
1 | 148 } |
149 } | |
150 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
151 int asf_check_header(demuxer_t *demuxer){ |
1 | 152 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
|
153 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
|
154 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
|
155 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
|
156 le2me_ASF_header_t(&asf->header); // swap to machine endian |
1 | 157 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); |
158 // 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
|
159 if(memcmp(asfhdrguid,asf->header.objh.guid,16)){ |
1567 | 160 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
|
161 free(asf); |
1 | 162 return 0; // not ASF guid |
163 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
164 if(asf->header.cno>256){ |
18011 | 165 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asf->header.cno); |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
166 free(asf); |
1 | 167 return 0; // invalid header??? |
168 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
169 demuxer->priv = asf; |
16175 | 170 return DEMUXER_TYPE_ASF; |
1 | 171 } |
172 | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
173 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
|
174 extern void print_video_header(BITMAPINFOHEADER *h, int verbose_level); |
601 | 175 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
176 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
|
177 { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
178 int i; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
179 for (i = cur_pos; i < buf_len - 19; i++) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
180 if (memcmp(&buf[i], guid, 16) == 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
181 return i + 16 + 8; // point after guid + length |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
182 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
183 return -1; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
184 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
185 |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
186 static int find_backwards_asf_guid(char *buf, const char *guid, int cur_pos) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
187 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
188 int i; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
189 for (i=cur_pos-16; i>0; i--) { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
190 if (memcmp(&buf[i], guid, 16) == 0) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
191 return i + 16 + 8; // point after guid + length |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
192 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
193 return -1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
194 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
195 |
23239 | 196 static int get_ext_stream_properties(char *buf, int buf_len, int stream_num, struct asf_priv* asf, int is_video) |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
197 { |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
198 int pos=0; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
199 uint8_t *buffer = &buf[0]; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
200 uint64_t avg_ft; |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
201 unsigned bitrate; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
202 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
203 while ((pos = find_asf_guid(buf, asf_ext_stream_header, pos, buf_len)) >= 0) { |
23381
300e9b7c499f
Remove some unused variables, patch by timwoj ieee org.
diego
parents:
23357
diff
changeset
|
204 int this_stream_num, stnamect, payct, i; |
23239 | 205 int buf_max_index=pos+50; |
206 if (buf_max_index > buf_len) return 0; | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
207 buffer = &buf[pos]; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
208 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
209 // the following info is available |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
210 // some of it may be useful but we're skipping it for now |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
211 // starttime(8 bytes), endtime(8), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
212 // leak-datarate(4), bucket-datasize(4), init-bucket-fullness(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
213 // alt-leak-datarate(4), alt-bucket-datasize(4), alt-init-bucket-fullness(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
214 // max-object-size(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
215 // flags(4) (reliable,seekable,no_cleanpoints?,resend-live-cleanpoints, rest of bits reserved) |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
216 |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
217 buffer += 8+8; |
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
218 bitrate = AV_RL32(buffer); |
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
219 buffer += 8*4; |
21945 | 220 this_stream_num=AV_RL16(buffer);buffer+=2; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
221 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
222 if (this_stream_num == stream_num) { |
23239 | 223 buf_max_index+=14; |
224 if (buf_max_index > buf_len) return 0; | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
225 buffer+=2; //skip stream-language-id-index |
23311 | 226 avg_ft = AV_RL64(buffer); // provided in 100ns units |
23239 | 227 buffer+=8; |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
228 asf->bps = bitrate / 8; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
229 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
230 // after this are values for stream-name-count and |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
231 // payload-extension-system-count |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
232 // followed by associated info for each |
23239 | 233 stnamect = AV_RL16(buffer);buffer+=2; |
234 payct = AV_RL16(buffer);buffer+=2; | |
235 | |
236 // need to read stream names if present in order | |
237 // to get lengths - values are ignored for now | |
238 for (i=0; i<stnamect; i++) { | |
239 int stream_name_len; | |
240 buf_max_index+=4; | |
241 if (buf_max_index > buf_len) return 0; | |
242 buffer+=2; //language_id_index | |
243 stream_name_len = AV_RL16(buffer);buffer+=2; | |
244 buffer+=stream_name_len; //stream_name | |
245 buf_max_index+=stream_name_len; | |
246 if (buf_max_index > buf_len) return 0; | |
247 } | |
248 | |
249 if (is_video) { | |
250 asf->vid_repdata_count = payct; | |
251 asf->vid_repdata_sizes = malloc(payct*sizeof(int)); | |
252 } else { | |
253 asf->aud_repdata_count = payct; | |
254 asf->aud_repdata_sizes = malloc(payct*sizeof(int)); | |
255 } | |
256 | |
257 for (i=0; i<payct; i++) { | |
258 int payload_len; | |
259 buf_max_index+=22; | |
260 if (buf_max_index > buf_len) return 0; | |
261 // Each payload extension definition starts with a GUID. | |
262 // In dvr-ms files one of these indicates the presence an | |
263 // extension that contains pts values and this is always present | |
264 // in the video and audio streams. | |
265 // Another GUID indicates the presence of an extension | |
266 // that contains useful video frame demuxing information. | |
267 // Note that the extension data in each packet does not contain | |
268 // these GUIDs and that this header section defines the order the data | |
269 // will appear in. | |
270 if (memcmp(buffer, asf_dvr_ms_timing_rep_data, 16) == 0) { | |
271 if (is_video) | |
272 asf->vid_ext_timing_index = i; | |
273 else | |
274 asf->aud_ext_timing_index = i; | |
275 } else if (is_video && memcmp(buffer, asf_dvr_ms_vid_frame_rep_data, 16) == 0) | |
276 asf->vid_ext_frame_index = i; | |
277 buffer+=16; | |
278 | |
279 payload_len = AV_RL16(buffer);buffer+=2; | |
280 | |
281 if (is_video) | |
282 asf->vid_repdata_sizes[i] = payload_len; | |
283 else | |
284 asf->aud_repdata_sizes[i] = payload_len; | |
285 buffer+=4;//sys_len | |
286 } | |
287 | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
288 return 1; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
289 } |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
290 } |
23803
ec1a81c77628
fixed bug introduced with the addition of get_ext_stream_properties()
nicodvb
parents:
23737
diff
changeset
|
291 return 1; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
292 } |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
293 |
21610 | 294 #define CHECKDEC(l, n) if (((l) -= (n)) < 0) return 0 |
295 static char* read_meta_record(ASF_meta_record_t* dest, char* buf, | |
296 int* buf_len) | |
297 { | |
298 CHECKDEC(*buf_len, 2 + 2 + 2 + 2 + 4); | |
21945 | 299 dest->lang_list_index = AV_RL16(buf); |
300 dest->stream_num = AV_RL16(&buf[2]); | |
301 dest->name_length = AV_RL16(&buf[4]); | |
302 dest->data_type = AV_RL16(&buf[6]); | |
303 dest->data_length = AV_RL32(&buf[8]); | |
21610 | 304 buf += 2 + 2 + 2 + 2 + 4; |
305 CHECKDEC(*buf_len, dest->name_length); | |
306 dest->name = (uint16_t*)buf; | |
307 buf += dest->name_length; | |
308 CHECKDEC(*buf_len, dest->data_length); | |
309 dest->data = buf; | |
310 buf += dest->data_length; | |
311 return buf; | |
312 } | |
313 | |
314 static int get_meta(char *buf, int buf_len, int this_stream_num, | |
315 float* asp_ratio) | |
316 { | |
317 int pos = 0; | |
318 uint16_t records_count; | |
319 uint16_t x = 0, y = 0; | |
320 | |
321 if ((pos = find_asf_guid(buf, asf_metadata_header, pos, buf_len)) < 0) | |
322 return 0; | |
323 | |
324 CHECKDEC(buf_len, pos); | |
325 buf += pos; | |
326 CHECKDEC(buf_len, 2); | |
21945 | 327 records_count = AV_RL16(buf); |
21610 | 328 buf += 2; |
329 | |
330 while (records_count--) { | |
331 ASF_meta_record_t record_entry; | |
332 char* name; | |
333 | |
334 if (!(buf = read_meta_record(&record_entry, buf, &buf_len))) | |
335 return 0; | |
336 /* reserved, must be zero */ | |
337 if (record_entry.lang_list_index) | |
338 continue; | |
339 /* match stream number: 0 to match all */ | |
340 if (record_entry.stream_num && record_entry.stream_num != this_stream_num) | |
341 continue; | |
342 if (!(name = get_ucs2str(record_entry.name, record_entry.name_length))) { | |
343 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed); | |
344 continue; | |
345 } | |
346 if (strcmp(name, "AspectRatioX") == 0) | |
21945 | 347 x = AV_RL16(record_entry.data); |
21610 | 348 else if (strcmp(name, "AspectRatioY") == 0) |
21945 | 349 y = AV_RL16(record_entry.data); |
21610 | 350 free(name); |
351 } | |
352 if (x && y) { | |
353 *asp_ratio = (float)x / (float)y; | |
354 return 1; | |
355 } | |
356 return 0; | |
357 } | |
358 | |
22409 | 359 static int is_drm(char* buf, int buf_len) |
360 { | |
361 uint32_t data_len, type_len, key_len, url_len; | |
362 int pos = find_asf_guid(buf, asf_content_encryption, 0, buf_len); | |
363 | |
364 if (pos < 0) | |
365 return 0; | |
366 | |
367 CHECKDEC(buf_len, pos + 4); | |
368 buf += pos; | |
369 data_len = AV_RL32(buf); | |
370 buf += 4; | |
371 CHECKDEC(buf_len, data_len); | |
372 buf += data_len; | |
373 type_len = AV_RL32(buf); | |
374 if (type_len < 4) | |
375 return 0; | |
376 CHECKDEC(buf_len, 4 + type_len + 4); | |
377 buf += 4; | |
378 | |
379 if (buf[0] != 'D' || buf[1] != 'R' || buf[2] != 'M' || buf[3] != '\0') | |
380 return 0; | |
381 | |
382 buf += type_len; | |
383 key_len = AV_RL32(buf); | |
384 CHECKDEC(buf_len, key_len + 4); | |
385 buf += 4; | |
386 | |
387 buf[key_len - 1] = '\0'; | |
388 mp_msg(MSGT_HEADER, MSGL_V, "DRM Key ID: %s\n", buf); | |
389 | |
390 buf += key_len; | |
391 url_len = AV_RL32(buf); | |
392 CHECKDEC(buf_len, url_len); | |
393 buf += 4; | |
394 | |
395 buf[url_len - 1] = '\0'; | |
396 mp_msg(MSGT_HEADER, MSGL_INFO, MSGTR_MPDEMUX_ASFHDR_DRMLicenseURL, buf); | |
397 return 1; | |
398 } | |
399 | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
400 static int asf_init_audio_stream(demuxer_t *demuxer,struct asf_priv* asf, sh_audio_t* sh_audio, ASF_stream_header_t *streamh, int *ppos, uint8_t** buf, char *hdr, unsigned int hdr_len) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
401 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
402 uint8_t *buffer = *buf; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
403 int pos = *ppos; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
404 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
405 sh_audio->wf=calloc((streamh->type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh->type_size,1); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
406 memcpy(sh_audio->wf,buffer,streamh->type_size); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
407 le2me_WAVEFORMATEX(sh_audio->wf); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
408 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
409 if(ASF_LOAD_GUID_PREFIX(streamh->concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){ |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
410 buffer = &hdr[pos]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
411 pos += streamh->stream_size; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
412 if (pos > hdr_len) return 0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
413 asf->scrambling_h=buffer[0]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
414 asf->scrambling_w=(buffer[2]<<8)|buffer[1]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
415 asf->scrambling_b=(buffer[4]<<8)|buffer[3]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
416 if(asf->scrambling_b>0){ |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
417 asf->scrambling_w/=asf->scrambling_b; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
418 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
419 } else { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
420 asf->scrambling_b=asf->scrambling_h=asf->scrambling_w=1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
421 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
422 mp_msg(MSGT_HEADER,MSGL_V,"ASF: audio scrambling: %d x %d x %d\n",asf->scrambling_h,asf->scrambling_w,asf->scrambling_b); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
423 return 1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
424 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
425 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
426 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
|
427 int hdr_len = asf->header.objh.size - sizeof(asf->header); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
428 int hdr_skip = 0; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
429 char *hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
430 char guid_buffer[16]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
431 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
|
432 uint32_t* streams = NULL; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
433 int audio_streams=0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
434 int video_streams=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
435 uint16_t stream_count=0; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
436 int best_video = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
437 int best_audio = -1; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
438 uint64_t data_len; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
439 ASF_stream_header_t *streamh; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
440 uint8_t *buffer; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
441 int audio_pos=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
442 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
443 if(hdr_len < 0) { |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
444 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
|
445 return 0; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
446 } |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
447 |
15795
546b49d7147d
M$ puts whole FAQs in these headers, so they can get really big...
reimar
parents:
15572
diff
changeset
|
448 if (hdr_len > 1024 * 1024) { |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
449 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MPDEMUX_ASFHDR_HeaderSizeOver1MB, |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
450 hdr_len); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
451 hdr_skip = hdr_len - 1024 * 1024; |
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
452 hdr_len = 1024 * 1024; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
453 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
454 hdr = malloc(hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
455 if (!hdr) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
456 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
|
457 hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
458 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
459 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
460 stream_read(demuxer->stream, hdr, hdr_len); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
461 if (hdr_skip) |
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
462 stream_skip(demuxer->stream, hdr_skip); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
463 if (stream_eof(demuxer->stream)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
464 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
|
465 goto err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
466 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
467 |
22409 | 468 if (is_drm(hdr, hdr_len)) |
469 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_DRMProtected); | |
470 | |
19124 | 471 if ((pos = find_asf_guid(hdr, asf_ext_stream_audio, 0, hdr_len)) >= 0) |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
472 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
473 // Special case: found GUID for dvr-ms audio. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
474 // Now skip back to associated stream header. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
475 int sh_pos=0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
476 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
477 sh_pos = find_backwards_asf_guid(hdr, asf_stream_header_guid, pos); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
478 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
479 if (sh_pos > 0) { |
18670
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
480 sh_audio_t *sh_audio; |
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
481 |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
482 mp_msg(MSGT_HEADER, MSGL_V, "read_asf_header found dvr-ms audio stream header pos=%d\n", sh_pos); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
483 // found audio stream header - following code reads header and |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
484 // initializes audio stream. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
485 audio_pos = pos - 16 - 8; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
486 streamh = (ASF_stream_header_t *)&hdr[sh_pos]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
487 le2me_ASF_stream_header_t(streamh); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
488 audio_pos += 64; //16+16+4+4+4+16+4; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
489 buffer = &hdr[audio_pos]; |
18670
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
490 sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
491 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "asfheader", streamh->stream_no & 0x7F); |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
492 ++audio_streams; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
493 if (!asf_init_audio_stream(demuxer, asf, sh_audio, streamh, &audio_pos, &buffer, hdr, hdr_len)) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
494 goto len_err_out; |
23239 | 495 if (!get_ext_stream_properties(hdr, hdr_len, streamh->stream_no, asf, 0)) |
496 goto len_err_out; | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
497 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
498 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
499 // find stream headers |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
500 // only reset pos if we didnt find dvr_ms audio stream |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
501 // if we did find it then we want to avoid reading its header twice |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
502 if (audio_pos == 0) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
503 pos = 0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
504 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
505 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
|
506 { |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
507 streamh = (ASF_stream_header_t *)&hdr[pos]; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
508 pos += sizeof(ASF_stream_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
509 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
510 le2me_ASF_stream_header_t(streamh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
511 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
|
512 asf_chunk_type(streamh->type)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
513 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
|
514 asf_chunk_type(streamh->concealment)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
515 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
|
516 (int)streamh->type_size, (int)streamh->stream_size, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
517 (int)streamh->stream_no); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
518 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
|
519 (unsigned long)streamh->unk1, (unsigned int)streamh->unk2); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
520 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
|
521 // type-specific data: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
522 buffer = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
523 pos += streamh->type_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
524 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
525 switch(ASF_LOAD_GUID_PREFIX(streamh->type)){ |
1342 | 526 case ASF_GUID_PREFIX_audio_stream: { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
527 sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
528 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "asfheader", streamh->stream_no & 0x7F); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
529 ++audio_streams; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
530 if (!asf_init_audio_stream(demuxer, asf, sh_audio, streamh, &pos, &buffer, hdr, hdr_len)) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
531 goto len_err_out; |
426 | 532 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F; |
1 | 533 break; |
291 | 534 } |
1342 | 535 case ASF_GUID_PREFIX_video_stream: { |
23089 | 536 unsigned int len; |
537 float asp_ratio; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
538 sh_video_t* sh_video=new_sh_video(demuxer,streamh->stream_no & 0x7F); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
539 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "asfheader", streamh->stream_no & 0x7F); |
23089 | 540 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
|
541 ++video_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
542 // 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
|
543 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
|
544 memcpy(sh_video->bih,&buffer[4+4+1+2],len); |
1342 | 545 le2me_BITMAPINFOHEADER(sh_video->bih); |
21967 | 546 if (sh_video->bih->biSize > len && sh_video->bih->biSize > sizeof(BITMAPINFOHEADER)) |
547 sh_video->bih->biSize = len; | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
548 if (sh_video->bih->biCompression == mmioFOURCC('D', 'V', 'R', ' ')) { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
549 //mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_MPDEMUX_ASFHDR_DVRWantsLibavformat); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
550 //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
551 //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
552 asf->asf_frame_state=-1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
553 asf->asf_frame_start_found=0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
554 asf->asf_is_dvr_ms=1; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
555 asf->dvr_last_vid_pts=0.0; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
556 } else asf->asf_is_dvr_ms=0; |
23239 | 557 if (!get_ext_stream_properties(hdr, hdr_len, streamh->stream_no, asf, 1)) |
558 goto len_err_out; | |
21610 | 559 if (get_meta(hdr, hdr_len, streamh->stream_no, &asp_ratio)) { |
560 sh_video->aspect = asp_ratio * sh_video->bih->biWidth / | |
561 sh_video->bih->biHeight; | |
562 } | |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
563 sh_video->i_bps = asf->bps; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
564 |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
565 if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V); |
1 | 566 //asf_video_id=streamh.stream_no & 0x7F; |
426 | 567 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F; |
1 | 568 break; |
291 | 569 } |
1 | 570 } |
571 // stream-specific data: | |
572 // 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
|
573 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
574 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
575 // find file header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
576 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
|
577 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
578 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
|
579 pos += sizeof(ASF_file_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
580 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
581 le2me_ASF_file_header_t(fileh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
582 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
|
583 "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
|
584 "preroll: %d\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
585 (int)fileh->num_packets, (int)fileh->flags, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
586 (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
|
587 (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
|
588 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
|
589 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
|
590 asf->packetrate=fileh->max_bitrate/8.0/(double)asf->packetsize; |
23399
8a0062b81dcc
Use play duration instead of send duration to calculate the length
zuxy
parents:
23381
diff
changeset
|
591 asf->movielength=(fileh->play_duration-fileh->preroll)/10000000LL; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
592 } |
1 | 593 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
594 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
595 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
|
596 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
597 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
|
598 char *string=NULL; |
21445 | 599 uint16_t* wstring = NULL; |
600 uint16_t len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
601 pos += sizeof(ASF_content_description_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
602 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
603 le2me_ASF_content_description_t(contenth); |
1567 | 604 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
|
605 // extract the title |
21445 | 606 if((len = contenth->title_size) != 0) { |
607 wstring = (uint16_t*)&hdr[pos]; | |
608 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
609 if (pos > hdr_len) goto len_err_out; |
21445 | 610 if ((string = get_ucs2str(wstring, len))) { |
611 mp_msg(MSGT_HEADER,MSGL_V," Title: %s\n", string); | |
612 demux_info_add(demuxer, "name", string); | |
613 free(string); | |
614 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
615 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
616 // extract the author |
21445 | 617 if((len = contenth->author_size) != 0) { |
618 wstring = (uint16_t*)&hdr[pos]; | |
619 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
620 if (pos > hdr_len) goto len_err_out; |
21445 | 621 if ((string = get_ucs2str(wstring, len))) { |
622 mp_msg(MSGT_HEADER,MSGL_V," Author: %s\n", string); | |
623 demux_info_add(demuxer, "author", string); | |
624 free(string); | |
625 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
626 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
627 // extract the copyright |
21445 | 628 if((len = contenth->copyright_size) != 0) { |
629 wstring = (uint16_t*)&hdr[pos]; | |
630 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
631 if (pos > hdr_len) goto len_err_out; |
21445 | 632 if ((string = get_ucs2str(wstring, len))) { |
633 mp_msg(MSGT_HEADER,MSGL_V," Copyright: %s\n", string); | |
634 demux_info_add(demuxer, "copyright", string); | |
635 free(string); | |
636 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
637 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
638 // extract the comment |
21445 | 639 if((len = contenth->comment_size) != 0) { |
640 wstring = (uint16_t*)&hdr[pos]; | |
641 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
642 if (pos > hdr_len) goto len_err_out; |
21445 | 643 if ((string = get_ucs2str(wstring, len))) { |
644 mp_msg(MSGT_HEADER,MSGL_V," Comment: %s\n", string); | |
645 demux_info_add(demuxer, "comments", string); | |
646 free(string); | |
647 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
648 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
649 // extract the rating |
21445 | 650 if((len = contenth->rating_size) != 0) { |
651 wstring = (uint16_t*)&hdr[pos]; | |
652 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
653 if (pos > hdr_len) goto len_err_out; |
21445 | 654 if ((string = get_ucs2str(wstring, len))) { |
655 mp_msg(MSGT_HEADER,MSGL_V," Rating: %s\n", string); | |
656 free(string); | |
657 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
658 } |
1567 | 659 mp_msg(MSGT_HEADER,MSGL_V,"\n"); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
660 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
661 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
662 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
663 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
|
664 if (pos >= 0) { |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
665 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
|
666 uint32_t max_bitrate; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
667 char *ptr = &hdr[pos]; |
12219 | 668 mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == START ===\n"); |
21945 | 669 stream_count = AV_RL16(ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
670 ptr += sizeof(uint16_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
671 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
|
672 if(stream_count > 0) |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18809
diff
changeset
|
673 streams = malloc(2*stream_count*sizeof(uint32_t)); |
12219 | 674 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
|
675 for( i=0 ; i<stream_count ; i++ ) { |
21945 | 676 stream_id = AV_RL16(ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
677 ptr += sizeof(uint16_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
678 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
|
679 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
|
680 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
|
681 ptr += sizeof(uint32_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
682 if (ptr > &hdr[hdr_len]) goto len_err_out; |
12219 | 683 mp_msg(MSGT_HEADER,MSGL_V," stream id=[0x%x][%u]\n", stream_id, stream_id ); |
684 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
|
685 streams[2*i] = stream_id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
686 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
|
687 } |
12219 | 688 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
|
689 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
690 free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
691 hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
692 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
|
693 stream_read(demuxer->stream, guid_buffer, 16); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
694 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
|
695 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_NoDataChunkAfterHeader); |
18809 | 696 free(streams); |
697 streams = NULL; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
698 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
699 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
700 // read length of chunk |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
701 stream_read(demuxer->stream, (char *)&data_len, sizeof(data_len)); |
16149 | 702 data_len = le2me_64(data_len); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
703 demuxer->movi_start = stream_tell(demuxer->stream) + 26; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
704 demuxer->movi_end = start + data_len; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
705 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
|
706 (int)demuxer->movi_start, (int)demuxer->movi_end); |
1 | 707 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
708 if(streams) { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
709 // 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
|
710 // 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
|
711 #if 0 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
712 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
|
713 #ifdef MPLAYER_NETWORK |
6645
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
714 if( demuxer->stream->streaming_ctrl!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
715 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
|
716 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
|
717 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
|
718 } |
6666 | 719 } else |
720 #endif | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
721 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
|
722 uint32_t id = streams[2*i]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
723 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
|
724 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
|
725 vr = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
726 best_video = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
727 } 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
|
728 ar = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
729 best_audio = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
730 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
731 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
732 #endif |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
733 free(streams); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
734 streams = NULL; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
735 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
736 |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
737 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
|
738 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
|
739 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
|
740 if(!video_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
741 if(!audio_streams){ |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
742 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
|
743 return 0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
744 } |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
745 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
|
746 } 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
|
747 |
1 | 748 #if 0 |
17932 | 749 if( mp_msg_test(MSGT_HEADER,MSGL_V) ){ |
1 | 750 printf("ASF duration: %d\n",(int)fileh.duration); |
751 printf("ASF start pts: %d\n",(int)fileh.start_timestamp); | |
752 printf("ASF end pts: %d\n",(int)fileh.end_timestamp); | |
753 } | |
754 #endif | |
755 | |
756 return 1; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
757 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
758 len_err_out: |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
759 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
|
760 err_out: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
761 if (hdr) free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
762 if (streams) free(streams); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
763 return 0; |
1 | 764 } |