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 }