Mercurial > mplayer.hg
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 |