Mercurial > mplayer.hg
comparison libmpdemux/asf_mmst_streaming.c @ 7880:5bb4d8801a2c
- fixed several 10l bugs
- using get_media_packet impl. from mmsclient 0.0.3
- buffering code simplified/fixed
author | arpi |
---|---|
date | Wed, 23 Oct 2002 20:39:49 +0000 |
parents | c4434bdf6e51 |
children | 60624e692b95 |
comparison
equal
deleted
inserted
replaced
7879:f5458f7d2e5a | 7880:5bb4d8801a2c |
---|---|
10 #include <stdio.h> | 10 #include <stdio.h> |
11 #include <stdlib.h> | 11 #include <stdlib.h> |
12 #include <string.h> | 12 #include <string.h> |
13 #include <unistd.h> | 13 #include <unistd.h> |
14 #include <errno.h> | 14 #include <errno.h> |
15 #include <inttypes.h> | |
15 | 16 |
16 #include "config.h" | 17 #include "config.h" |
17 | 18 |
18 #include "url.h" | 19 #include "url.h" |
19 #include "asf.h" | 20 #include "asf.h" |
20 | 21 |
21 #include "stream.h" | 22 #include "stream.h" |
22 | 23 |
23 #include "network.h" | 24 #include "network.h" |
24 | 25 |
25 int data_length = 0; | |
26 int packet_length1; | |
27 int media_padding; | |
28 int to_skip = 0; | |
29 | |
30 #include <inttypes.h> | |
31 | |
32 #define BUF_SIZE 102400 | 26 #define BUF_SIZE 102400 |
33 int checknum =1; | |
34 | 27 |
35 typedef struct | 28 typedef struct |
36 { | 29 { |
37 uint8_t buf[BUF_SIZE]; | 30 uint8_t buf[BUF_SIZE]; |
38 int num_bytes; | 31 int num_bytes; |
39 | 32 |
40 } command_t; | 33 } command_t; |
41 | 34 |
42 int seq_num; | 35 static int seq_num; |
43 int num_stream_ids; | 36 static int num_stream_ids; |
44 int stream_ids[20]; | 37 static int stream_ids[20]; |
45 int output_fh; | |
46 | 38 |
47 static int get_data (int s, char *buf, size_t count); | 39 static int get_data (int s, char *buf, size_t count); |
48 int store_data(int s, int size, char *buffer) | |
49 { | |
50 // printf("data_length %d, media_padding %d, size %d \n", data_length, media_padding, size ); | |
51 if(data_length >= size) | |
52 { | |
53 if (!get_data (s, buffer, size)) | |
54 { | |
55 printf ("media data read failed\n"); | |
56 return 0; | |
57 } | |
58 data_length -= size; | |
59 return size; | |
60 } | |
61 else | |
62 { | |
63 int temp_size, media_temp_padding; | |
64 if(data_length) | |
65 { | |
66 if (!get_data (s, buffer, data_length)) | |
67 { | |
68 printf ("media data read failed\n"); | |
69 return 0; | |
70 } | |
71 } | |
72 if(media_padding) | |
73 { | |
74 if(media_padding > size - data_length) | |
75 { | |
76 memset(buffer+data_length,0,(size - data_length)); | |
77 media_padding -= (size - data_length); | |
78 data_length = 0; | |
79 return size; | |
80 } | |
81 else | |
82 { | |
83 memset(buffer+data_length,0,media_padding); | |
84 media_temp_padding = media_padding; | |
85 media_padding = 0; | |
86 temp_size =data_length; | |
87 data_length = 0; | |
88 return (temp_size + media_temp_padding); | |
89 } | |
90 } | |
91 temp_size = data_length; | |
92 data_length = 0; | |
93 return temp_size; | |
94 } | |
95 } | |
96 | 40 |
97 static void put_32 (command_t *cmd, uint32_t value) | 41 static void put_32 (command_t *cmd, uint32_t value) |
98 { | 42 { |
99 cmd->buf[cmd->num_bytes ] = value % 256; | 43 cmd->buf[cmd->num_bytes ] = value % 256; |
100 value = value >> 8; | 44 value = value >> 8; |
254 | 198 |
255 } | 199 } |
256 | 200 |
257 } else { | 201 } else { |
258 | 202 |
259 char packet_len; | 203 int packet_len; |
260 int command; | 204 int command; |
261 char data[BUF_SIZE]; | 205 char data[BUF_SIZE]; |
262 | 206 |
263 if (!get_data (s, &packet_len, 4)) { | 207 if (!get_data (s, &packet_len, 4)) { |
264 printf ("packet_len read failed\n"); | 208 printf ("packet_len read failed\n"); |
285 | 229 |
286 // printf ("get header packet succ\n"); | 230 // printf ("get header packet succ\n"); |
287 } | 231 } |
288 } | 232 } |
289 | 233 |
290 int interp_header (uint8_t *header, int header_len) | 234 static int interp_header (uint8_t *header, int header_len) |
291 { | 235 { |
292 int i; | 236 int i; |
293 int packet_length=-1; | 237 int packet_length=-1; |
294 | 238 |
295 /* | 239 /* |
356 return packet_length; | 300 return packet_length; |
357 | 301 |
358 } | 302 } |
359 | 303 |
360 | 304 |
361 static int get_media_packet (int s, int padding, char *buffer, int size) | 305 static int get_media_packet (int s, int padding, streaming_ctrl_t *stream_ctrl) { |
362 { | |
363 unsigned char pre_header[8]; | 306 unsigned char pre_header[8]; |
307 int i; | |
364 char data[BUF_SIZE]; | 308 char data[BUF_SIZE]; |
365 int CheckInnerData = 1; | 309 |
366 int CheckOuterData = 1; | 310 if (!get_data (s, pre_header, 8)) { |
367 | 311 printf ("pre-header read failed\n"); |
368 | 312 return 0; |
369 while(CheckOuterData) | 313 } |
370 { | 314 |
371 int a; | 315 // for (i=0; i<8; i++) |
372 if(media_padding ==0 && data_length == 0) | 316 // printf ("pre_header[%d] = %02x (%d)\n", |
373 { | 317 // i, pre_header[i], pre_header[i]); |
374 while(CheckInnerData) | 318 |
375 { | 319 if (pre_header[4] == 0x04) { |
376 if (!get_data (s, pre_header, 8)) { | 320 |
377 printf ("pre-header read failed\n"); | 321 int packet_len; |
378 return 0; | 322 |
379 } | 323 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8; |
380 | 324 |
381 if (pre_header[4] == 0x04) | 325 // printf ("asf media packet detected, len=%d\n", packet_len); |
382 { | 326 |
383 data_length = (pre_header[7] << 8 | pre_header[6]) - 8; | 327 if (!get_data (s, data, packet_len)) { |
384 media_padding = packet_length1 - data_length; | 328 printf ("media data read failed\n"); |
385 if(to_skip) | 329 return 0; |
386 { | 330 } |
387 a = store_data(s, size - to_skip, buffer + to_skip); | 331 |
388 to_skip = 0; | 332 streaming_bufferize(stream_ctrl, data, padding); |
389 } | 333 |
390 else | 334 } else { |
391 { | 335 |
392 a = store_data(s, size, buffer); | 336 int packet_len, command; |
393 } | 337 |
394 // printf("a inner %d \n", size); | 338 if (!get_data (s, &packet_len, 4)) { |
395 return size; | 339 printf ("packet_len read failed\n"); |
396 } | 340 return 0; |
397 else | 341 } |
398 { | 342 |
399 int command; | 343 packet_len = get_32 (&packet_len, 0) + 4; |
400 char packet_len; | 344 |
401 if (!get_data (s, &packet_len, 4)) | 345 if (!get_data (s, data, packet_len)) { |
402 { | 346 printf ("command data read failed\n"); |
403 printf ("packet_len read failed\n"); | 347 return 0; |
404 return 0; | 348 } |
405 } | 349 |
406 packet_len = get_32 (&packet_len, 0) + 4; | 350 if ( (pre_header[7] != 0xb0) || (pre_header[6] != 0x0b) |
407 | 351 || (pre_header[5] != 0xfa) || (pre_header[4] != 0xce) ) { |
408 if (!get_data (s, data, packet_len)) | 352 |
409 { | 353 printf ("missing signature\n"); |
410 printf ("command data read failed\n"); | 354 return -1; |
411 return 0; | 355 } |
412 } | 356 |
413 if ( (pre_header[7] != 0xb0) || (pre_header[6] != 0x0b) || (pre_header[5] != 0xfa) || (pre_header[4] != 0xce) ) | 357 command = get_32 (data, 24) & 0xFFFF; |
414 { | 358 |
415 printf ("missing signature\n"); | 359 printf ("\ncommand packet detected, len=%d cmd=0x%X\n", packet_len, command); |
416 return -1; | 360 |
417 } | 361 if (command == 0x1b) |
418 command = get_32 (data, 24) & 0xFFFF; | 362 send_command (s, 0x1b, 0, 0, 0, data); |
419 | 363 else if (command == 0x1e) { |
420 if (command == 0x1b) | 364 printf ("everything done. Thank you for downloading a media file containing proprietary and patentend technology.\n"); |
421 { | 365 return 0; |
422 send_command (s, 0x1b, 0, 0, 0, data); | 366 } |
423 } | 367 else if (command == 0x21 ) { |
424 else if (command == 0x1e) | 368 // Looks like it's new in WMS9 |
425 { | 369 // Unknown command, but ignoring it seems to work. |
426 printf ("everything done. Thank you for downloading a media file containing proprietary and patentend technology.\n"); | 370 return 0; |
427 return 0; | 371 } |
428 } | 372 else if (command != 0x05) { |
429 else if (command == 0x21 ) | 373 printf ("unknown command %02x\n", command); |
430 { | 374 return -1; |
431 // Looks like it's new in WMS9 | 375 } |
432 // Unknown command, but ignoring it seems to work. | 376 } |
433 return 0; | 377 |
434 } | 378 // printf ("get media packet succ\n"); |
435 else if (command != 0x05) | 379 |
436 { | 380 return 1; |
437 printf ("unknown command %02x\n", command); | 381 } |
438 return -1; | 382 |
439 } | 383 |
440 } | 384 static int packet_length1; |
441 } | |
442 } | |
443 if(to_skip) | |
444 { | |
445 a = store_data(s, size - to_skip, buffer+to_skip ); | |
446 to_skip = 0; | |
447 } | |
448 else | |
449 { | |
450 a = store_data(s, size, buffer); | |
451 } | |
452 | |
453 if(a == size) | |
454 { | |
455 // printf("a outer %d", a ); | |
456 return a; | |
457 } | |
458 else | |
459 to_skip = a; | |
460 | |
461 } | |
462 return 0; // is this ok? | |
463 } | |
464 | 385 |
465 int | 386 int |
466 asf_mmst_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) | 387 asf_mmst_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) |
467 { | 388 { |
468 int len = 0; | 389 int len; |
469 if( stream_ctrl->buffer_size!=0 ) { | 390 |
470 int buffer_len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos; | 391 while( stream_ctrl->buffer_size==0 ) { |
471 len = (size<buffer_len)?size:buffer_len; | 392 // buffer is empty - fill it! |
393 int ret = get_media_packet( fd, packet_length1, stream_ctrl); | |
394 if( ret<0 ) { | |
395 printf("get_media_packet error : %s\n",strerror(errno)); | |
396 return -1; | |
397 } | |
398 } | |
399 | |
400 len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos; | |
401 if(len>size) len=size; | |
472 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len ); | 402 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len ); |
473 stream_ctrl->buffer_pos += len; | 403 stream_ctrl->buffer_pos += len; |
474 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) { | 404 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) { |
475 free( stream_ctrl->buffer ); | 405 free( stream_ctrl->buffer ); |
476 stream_ctrl->buffer = NULL; | 406 stream_ctrl->buffer = NULL; |
477 stream_ctrl->buffer_size = 0; | 407 stream_ctrl->buffer_size = 0; |
478 stream_ctrl->buffer_pos = 0; | 408 stream_ctrl->buffer_pos = 0; |
479 } | 409 } |
480 | 410 return len; |
481 } | 411 |
482 | |
483 if( len<size ) { | |
484 | |
485 int ret; | |
486 | |
487 ret = get_media_packet( fd, size - len, buffer+len, size-len ); | |
488 | |
489 if( ret<0 ) { | |
490 | |
491 printf("get_media_packet error : %s\n",strerror(errno)); | |
492 return -1; | |
493 | |
494 } | |
495 | |
496 len += ret; | |
497 | |
498 //printf("read %d bytes from network\n", len ); | |
499 | |
500 } | |
501 | |
502 return len; | |
503 } | 412 } |
504 | 413 |
505 int | 414 int |
506 asf_mmst_streaming_seek( int fd, off_t pos, streaming_ctrl_t *streaming_ctrl ) | 415 asf_mmst_streaming_seek( int fd, off_t pos, streaming_ctrl_t *streaming_ctrl ) |
507 { | 416 { |
513 char str[1024]; | 422 char str[1024]; |
514 char data[1024]; | 423 char data[1024]; |
515 uint8_t asf_header[8192]; | 424 uint8_t asf_header[8192]; |
516 int asf_header_len; | 425 int asf_header_len; |
517 int len, i, packet_length; | 426 int len, i, packet_length; |
518 char host[256]; | |
519 char *path; | 427 char *path; |
520 URL_t *url1 = stream->streaming_ctrl->url; | 428 URL_t *url1 = stream->streaming_ctrl->url; |
521 int s = stream->fd; | 429 int s; |
522 | 430 |
523 if( s>0 ) { | 431 if( s>0 ) { |
524 close( stream->fd ); | 432 close( stream->fd ); |
525 stream->fd = -1; | 433 stream->fd = -1; |
526 } | 434 } |
532 s = connect2Server( url1->hostname, url1->port ); | 440 s = connect2Server( url1->hostname, url1->port ); |
533 if( s<0 ) { | 441 if( s<0 ) { |
534 return s; | 442 return s; |
535 } | 443 } |
536 printf ("connected\n"); | 444 printf ("connected\n"); |
445 | |
446 seq_num=0; | |
537 | 447 |
538 /* | 448 /* |
539 * Send the initial connect info including player version no. Client GUID (random) and the host address being connected to. | 449 * Send the initial connect info including player version no. Client GUID (random) and the host address being connected to. |
540 * This command is sent at the very start of protocol initiation. It sends local information to the serve | 450 * This command is sent at the very start of protocol initiation. It sends local information to the serve |
541 * cmd 1 0x01 | 451 * cmd 1 0x01 |
542 * */ | 452 * */ |
543 | 453 |
544 sprintf (str, "\034\003NSPlayer/7.0.0.1956; {33715801-BAB3-9D85-24E9-03B90328270A}; Host: %s", host); | 454 sprintf (str, "\034\003NSPlayer/7.0.0.1956; {33715801-BAB3-9D85-24E9-03B90328270A}; Host: %s", url1->hostname); |
545 string_utf16 (data, str, strlen(str)+2); | 455 string_utf16 (data, str, strlen(str)+2); |
546 // send_command(s, commandno ....) | 456 // send_command(s, commandno ....) |
547 send_command (s, 1, 0, 0x0004000b, strlen(str) * 2+8, data); | 457 send_command (s, 1, 0, 0x0004000b, strlen(str) * 2+8, data); |
548 | 458 |
549 len = read (s, data, BUF_SIZE) ; | 459 len = read (s, data, BUF_SIZE) ; |
626 | 536 |
627 data[20] = 0x04; | 537 data[20] = 0x04; |
628 | 538 |
629 send_command (s, 0x07, 1, 0xFFFF | stream_ids[0] << 16, 24, data); | 539 send_command (s, 0x07, 1, 0xFFFF | stream_ids[0] << 16, 24, data); |
630 | 540 |
631 | 541 stream->fd = s; |
632 stream->fd = s; | 542 stream->streaming_ctrl->streaming_read = asf_mmst_streaming_read; |
633 stream->streaming_ctrl->streaming_read = asf_mmst_streaming_read; | 543 stream->streaming_ctrl->streaming_seek = asf_mmst_streaming_seek; |
634 stream->streaming_ctrl->streaming_seek = asf_mmst_streaming_seek; | 544 stream->streaming_ctrl->buffering = 1; |
635 stream->streaming_ctrl->buffering = 1; | 545 stream->streaming_ctrl->status = streaming_playing_e; |
636 | 546 |
637 stream->streaming_ctrl->status = streaming_playing_e; | 547 packet_length1 = packet_length; |
638 stream->streaming_ctrl->buffering = 1; | 548 printf("mmst packet_length = %d\n",packet_length); |
639 | |
640 packet_length1 = packet_length; | |
641 | 549 |
642 return 0; | 550 return 0; |
643 } | 551 } |