comparison mplayer.c @ 4045:898caa690c0b

playtree support. replaces old playlist and multifile mess. patch by Alban Bedel <albeu@free.fr>
author arpi
date Tue, 08 Jan 2002 02:01:04 +0000
parents e8e7ca8995a1
children 505f206d80d1
comparison
equal deleted inserted replaced
4044:5db51705d5c7 4045:898caa690c0b
87 #include "libmpdemux/tv.h" 87 #include "libmpdemux/tv.h"
88 88
89 extern int tv_param_on; 89 extern int tv_param_on;
90 extern tvi_handle_t *tv_handler; 90 extern tvi_handle_t *tv_handler;
91 #endif 91 #endif
92
93 //**************************************************************************//
94 // Playtree
95 //**************************************************************************//
96 #include "playtree.h"
97
98 play_tree_t* playtree;
92 99
93 //**************************************************************************// 100 //**************************************************************************//
94 // Config file 101 // Config file
95 //**************************************************************************// 102 //**************************************************************************//
96 103
405 412
406 static sh_audio_t *sh_audio=NULL; 413 static sh_audio_t *sh_audio=NULL;
407 static sh_video_t *sh_video=NULL; 414 static sh_video_t *sh_video=NULL;
408 415
409 // for multifile support: 416 // for multifile support:
417 play_tree_iter_t* playtree_iter = NULL;
410 char **filenames=NULL; 418 char **filenames=NULL;
411 int num_filenames=0; 419 int num_filenames=0;
412 int curr_filename=0; 420 int curr_filename=0;
413 421
414 char* filename=NULL; //"MI2-Trailer.avi"; 422 char* filename=NULL; //"MI2-Trailer.avi";
417 int delay_corrected=1; 425 int delay_corrected=1;
418 char* title="MPlayer"; 426 char* title="MPlayer";
419 427
420 // movie info: 428 // movie info:
421 int out_fmt=0; 429 int out_fmt=0;
430 int eof=0;
422 431
423 int osd_visible=100; 432 int osd_visible=100;
424 int osd_function=OSD_PLAY; 433 int osd_function=OSD_PLAY;
425 int osd_last_pts=-303; 434 int osd_last_pts=-303;
426 int osd_show_av_delay = 0; 435 int osd_show_av_delay = 0;
482 (strrchr(argv[0],'/') && !strcmp(strrchr(argv[0],'/'),"/gmplayer") ) ) 491 (strrchr(argv[0],'/') && !strcmp(strrchr(argv[0],'/'),"/gmplayer") ) )
483 use_gui=1; 492 use_gui=1;
484 493
485 parse_cfgfiles(); 494 parse_cfgfiles();
486 num_filenames=parse_command_line(conf, argc, argv, envp, &filenames); 495 num_filenames=parse_command_line(conf, argc, argv, envp, &filenames);
487 496 if(num_filenames<0) exit(1); // error parsing cmdline
488 if(playlist_file!=NULL) 497
489 { 498 playtree = play_tree_new();
490 FILE *playlist_f;
491 char *playlist_linebuffer = (char*)malloc(256);
492 char *playlist_line;
493 if(!strcmp(playlist_file,"-"))
494 { 499 {
495 playlist_f = fopen("/dev/stdin","r"); 500 play_tree_t* list = NULL;
496 } 501 int i;
497 else 502 play_tree_t *entry = NULL, *tree = play_tree_new();
498 playlist_f = fopen(playlist_file,"r"); 503 for(i= 0; i < num_filenames ; i++) {
499 if(playlist_f != NULL) 504 entry = entry != NULL ? play_tree_new() : tree;
500 { 505 play_tree_add_file(entry,filenames[i]);
501 while(!feof(playlist_f)) 506 play_tree_append_entry(tree,entry);
502 { 507 }
503 memset(playlist_linebuffer,0,255); 508
504 fgets(playlist_linebuffer,255,playlist_f); 509 entry = play_tree_new();
505 if(strlen(playlist_linebuffer)==0) 510 play_tree_set_child(entry,tree);
506 break; 511 list = entry;
507 playlist_linebuffer[strlen(playlist_linebuffer)-1] = 0; 512 if(playlist_file!=NULL) {
508 playlist_line = (char*)malloc(strlen(playlist_linebuffer)+1); 513 entry = parse_playlist_file(playlist_file);
509 memset(playlist_line,0,strlen(playlist_linebuffer)+1); 514 if(entry != NULL){
510 strcpy(playlist_line,playlist_linebuffer); 515 if(list) play_tree_append_entry(list,entry);
511 if (!(filenames = (char **) realloc(filenames, sizeof(*filenames) * (num_filenames + 2)))) 516 else list = entry;
512 exit(3); 517 }
513 filenames[num_filenames++] = playlist_line; 518 }
514 } 519 if(list) play_tree_set_child(playtree,list);
515 fclose(playlist_f); 520 }
516 } 521 playtree = play_tree_cleanup(playtree);
517 } 522 if(playtree) {
518 523 playtree_iter = play_tree_iter_new(playtree);
519 524 if(playtree_iter) {
520 if(num_filenames<0) exit(1); // error parsing cmdline 525 if(play_tree_iter_step(playtree_iter,0,0) != PLAY_TREE_ITER_ENTRY) {
521 526 play_tree_iter_free(playtree_iter);
527 playtree_iter = NULL;
528 }
529 filename = play_tree_iter_get_file(playtree_iter,1);
530 }
531 }
532
522 #ifndef HAVE_NEW_GUI 533 #ifndef HAVE_NEW_GUI
523 if(use_gui){ 534 if(use_gui){
524 mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_NoGui); 535 mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_NoGui);
525 use_gui=0; 536 use_gui=0;
526 } 537 }
578 printf("\n"); 589 printf("\n");
579 exit(0); 590 exit(0);
580 } 591 }
581 592
582 593
583 if(!num_filenames && !vcd_track && !dvd_title && !tv_param_on){ 594 if(!filename && !vcd_track && !dvd_title && !tv_param_on){
584 if(!use_gui){ 595 if(!use_gui){
585 // no file/vcd/dvd -> show HELP: 596 // no file/vcd/dvd -> show HELP:
586 printf("%s",help_text); 597 printf("%s",help_text);
587 exit(0); 598 exit(0);
588 } else gui_no_filename=1; 599 } else gui_no_filename=1;
594 for(i=1;i<argc;i++)printf(" '%s'",argv[i]); 605 for(i=1;i<argc;i++)printf(" '%s'",argv[i]);
595 printf("\n"); 606 printf("\n");
596 printf("num_filenames: %d\n",num_filenames); 607 printf("num_filenames: %d\n",num_filenames);
597 } 608 }
598 609
599 mp_msg_init(verbose+MSGL_STATUS);
600 610
601 //------ load global data first ------ 611 //------ load global data first ------
602 612
603 613
604 // check font 614 // check font
675 signal(SIGFPE,exit_sighandler); // floating point exc. 685 signal(SIGFPE,exit_sighandler); // floating point exc.
676 signal(SIGABRT,exit_sighandler); // abort() 686 signal(SIGABRT,exit_sighandler); // abort()
677 687
678 // ******************* Now, let's see the per-file stuff ******************** 688 // ******************* Now, let's see the per-file stuff ********************
679 689
680 curr_filename=0;
681 play_next_file: 690 play_next_file:
682 filename=(num_filenames>0)?filenames[curr_filename]:NULL;
683 691
684 #ifdef HAVE_NEW_GUI 692 #ifdef HAVE_NEW_GUI
685 if ( use_gui ) { 693 if ( use_gui ) {
686 694
687 #ifdef USE_DVDREAD 695 #ifdef USE_DVDREAD
828 } 836 }
829 } 837 }
830 838
831 current_module="open_stream"; 839 current_module="open_stream";
832 stream=open_stream(filename,vcd_track,&file_format); 840 stream=open_stream(filename,vcd_track,&file_format);
833 if(!stream) goto goto_next_file;// exit_player(MSGTR_Exit_error); // error... 841 if(!stream) { // error...
842 uninit_player(inited_flags-(INITED_GUI+INITED_LIRC));
843 goto goto_next_file_src;
844 }
834 inited_flags|=INITED_STREAM; 845 inited_flags|=INITED_STREAM;
846 if(stream->type == STREAMTYPE_PLAYLIST) {
847 play_tree_t* entry;
848 // Handle playlist
849 mp_msg(MSGT_CPLAYER,MSGL_V,"Parsing playlist %s...\n",filename);
850 entry = parse_playtree(stream);
851 if(!entry) {
852 entry = playtree_iter->tree;
853 if(play_tree_iter_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY)
854 goto goto_next_file;
855 if(playtree_iter->tree == entry) { // Loop with a single file
856 if(play_tree_iter_up_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY)
857 goto goto_next_file;
858 }
859 play_tree_remove(entry,1,1);
860 uninit_player(inited_flags-(INITED_GUI+INITED_LIRC));
861 goto goto_next_file_src;
862 }
863 play_tree_insert_entry(playtree_iter->tree,entry);
864 entry = playtree_iter->tree;
865 if(play_tree_iter_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY)
866 goto goto_next_file;
867 play_tree_remove(entry,1,1);
868 uninit_player(inited_flags-(INITED_GUI+INITED_LIRC));
869 goto goto_next_file_src;
870 }
835 stream->start_pos+=seek_to_byte; 871 stream->start_pos+=seek_to_byte;
836 872
837 if(stream_dump_type==5){ 873 if(stream_dump_type==5){
838 unsigned char buf[4096]; 874 unsigned char buf[4096];
839 int len; 875 int len;
1242 { 1278 {
1243 1279
1244 //int frame_corr_num=0; // 1280 //int frame_corr_num=0; //
1245 //float v_frame=0; // Video 1281 //float v_frame=0; // Video
1246 float time_frame=0; // Timer 1282 float time_frame=0; // Timer
1247 int eof=0;
1248 int force_redraw=0; 1283 int force_redraw=0;
1249 //float num_frames=0; // number of frames played 1284 //float num_frames=0; // number of frames played
1250 int grab_frames=0; 1285 int grab_frames=0;
1251 char osd_text_buffer[64]; 1286 char osd_text_buffer[64];
1252 int drop_frame=0; 1287 int drop_frame=0;
1904 // pause 1939 // pause
1905 case 'p': 1940 case 'p':
1906 case ' ': 1941 case ' ':
1907 osd_function=OSD_PAUSE; 1942 osd_function=OSD_PAUSE;
1908 break; 1943 break;
1944 case KEY_HOME:
1945 {
1946 play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter);
1947 if(play_tree_iter_step(i,1,0) == PLAY_TREE_ITER_ENTRY)
1948 eof = 1;
1949 play_tree_iter_free(i);
1950 }
1951 break;
1952 case KEY_END:
1953 {
1954 play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter);
1955 if(play_tree_iter_step(i,-1,0) == PLAY_TREE_ITER_ENTRY)
1956 eof = -1;
1957 play_tree_iter_free(i);
1958 }
1959 break;
1960 case KEY_INS:
1961 if(playtree_iter->num_files > 1 && playtree_iter->file < playtree_iter->num_files)
1962 eof = 2;
1963 break;
1964 case KEY_DEL:
1965 if(playtree_iter->num_files > 1 && playtree_iter->file > 1)
1966 eof = -2;
1967 break;
1909 case 'o': // toggle OSD 1968 case 'o': // toggle OSD
1910 osd_level=(osd_level+1)%3; 1969 osd_level=(osd_level+1)%3;
1911 break; 1970 break;
1912 case 'z': 1971 case 'z':
1913 sub_delay -= 0.1; 1972 sub_delay -= 0.1;
2233 2292
2234 } 2293 }
2235 2294
2236 goto_next_file: // don't jump here after ao/vo/getch initialization! 2295 goto_next_file: // don't jump here after ao/vo/getch initialization!
2237 2296
2238 if(curr_filename+1<num_filenames || use_gui){ 2297 if(eof == 1 || eof == -1) {
2239 // partial uninit: 2298 if(play_tree_iter_step(playtree_iter,eof,0) == PLAY_TREE_ITER_ENTRY) {
2240 2299 uninit_player(INITED_ALL-(INITED_GUI+INITED_LIRC));
2241 uninit_player(INITED_ALL-(INITED_GUI+INITED_LIRC)); 2300 eof = 1;
2242 2301 } else {
2243 } 2302 play_tree_iter_free(playtree_iter);
2303 playtree_iter = NULL;
2304 }
2305 } else {
2306 uninit_player(INITED_ALL-(INITED_GUI+INITED_LIRC));
2307 eof = eof == -2 ? -1 : 1;
2308 }
2309
2310 goto_next_file_src: // When we have multiple src for file
2311
2312 if(eof == 0) eof = 1;
2244 2313
2245 #ifdef HAVE_NEW_GUI 2314 #ifdef HAVE_NEW_GUI
2246 if(use_gui) 2315 if(use_gui)
2247 { 2316 {
2248 #ifdef USE_DVDREAD 2317 #ifdef USE_DVDREAD
2250 #endif 2319 #endif
2251 mplStop(); 2320 mplStop();
2252 } 2321 }
2253 #endif 2322 #endif
2254 2323
2255 if(use_gui || ++curr_filename<num_filenames 2324 while(playtree_iter != NULL) {
2325 filename = play_tree_iter_get_file(playtree_iter,eof);
2326 if(filename == NULL) {
2327 if( play_tree_iter_step(playtree_iter,eof,0) != PLAY_TREE_ITER_ENTRY) {
2328 play_tree_iter_free(playtree_iter);
2329 playtree_iter = NULL;
2330 };
2331 } else
2332 break;
2333 }
2334
2335 if(use_gui || playtree_iter != NULL
2256 #if defined( HAVE_NEW_GUI ) && defined( USE_DVDREAD ) 2336 #if defined( HAVE_NEW_GUI ) && defined( USE_DVDREAD )
2257 || (mplShMem && mplShMem->DVDChanged) 2337 || (mplShMem && mplShMem->DVDChanged)
2258 #endif 2338 #endif
2259 ){ 2339 ){
2260 2340
2275 vo_sub=NULL; 2355 vo_sub=NULL;
2276 } 2356 }
2277 2357
2278 video_out=NULL; 2358 video_out=NULL;
2279 audio_out=NULL; 2359 audio_out=NULL;
2280 2360 eof = 0;
2281 goto play_next_file; 2361 goto play_next_file;
2282 } 2362 }
2283 2363
2284 exit_player(MSGTR_Exit_eof); 2364 exit_player(MSGTR_Exit_eof);
2285 2365