Mercurial > mplayer.hg
annotate parser-mecmd.c @ 15533:ddf15d233d58
Do not switch to audio tracks whose codec private data differs from the main audio track's as this will most likely result in messed up audio output. Patch by Michael Behrisch <list () behrisch ! de>
author | mosu |
---|---|
date | Sat, 21 May 2005 06:50:08 +0000 |
parents | 4fdfe0860cc5 |
children | 55cbf0c204bc |
rev | line source |
---|---|
8164 | 1 #include "config.h" |
2 | |
3 #include <stdio.h> | |
4 #include <stdlib.h> | |
5 #include <string.h> | |
6 #include <errno.h> | |
7 | |
8 #ifdef MP_DEBUG | |
9 #include <assert.h> | |
10 #endif | |
11 | |
12 #include "mp_msg.h" | |
13 #include "m_option.h" | |
14 #include "m_config.h" | |
15 #include "parser-mecmd.h" | |
16 | |
17 void | |
18 m_entry_list_free(m_entry_t* lst) { | |
19 int i,j; | |
20 | |
21 for(i = 0 ; lst[i].name != NULL ; i++){ | |
22 free(lst[i].name); | |
23 for(j = 0 ; lst[i].opts[2*j] != NULL ; j++) { | |
24 free(lst[i].opts[2*j]); | |
25 free(lst[i].opts[2*j+1]); | |
26 } | |
27 free(lst[i].opts); | |
28 } | |
29 free(lst); | |
30 } | |
31 | |
32 int | |
33 m_entry_set_options(m_config_t *config, m_entry_t* entry) { | |
34 int i,r; | |
35 | |
36 for(i = 0 ; entry->opts[2*i] != NULL ; i++){ | |
37 r = m_config_set_option(config,entry->opts[2*i],entry->opts[2*i+1]); | |
38 if(r < 0) | |
39 return 0; | |
40 } | |
41 return 1; | |
42 } | |
43 | |
44 | |
45 | |
46 | |
47 m_entry_t* | |
48 m_config_parse_me_command_line(m_config_t *config, int argc, char **argv) | |
49 { | |
50 int i,nf = 0,no = 0; | |
51 int tmp; | |
52 char *opt; | |
53 int no_more_opts = 0; | |
54 m_entry_t *lst = NULL, *entry = NULL; | |
55 | |
56 #ifdef MP_DEBUG | |
57 assert(config != NULL); | |
58 assert(argv != NULL); | |
59 assert(argc >= 1); | |
60 #endif | |
61 | |
62 config->mode = M_COMMAND_LINE; | |
63 | |
64 lst = calloc(1,sizeof(m_entry_t)); | |
65 | |
66 for (i = 1; i < argc; i++) { | |
67 //next: | |
68 opt = argv[i]; | |
69 /* check for -- (no more options id.) except --help! */ | |
15245
4fdfe0860cc5
Make "mplayer -- --a" play the file --a instead of bailing out with a useless
reimar
parents:
14541
diff
changeset
|
70 if ((*opt == '-') && (*(opt+1) == '-') && (*(opt+2) == 0)) |
8164 | 71 { |
72 no_more_opts = 1; | |
73 if (i+1 >= argc) | |
74 { | |
14541 | 75 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "'--' indicates no more options, but no filename was given on the command line.\n"); |
8164 | 76 goto err_out; |
77 } | |
78 continue; | |
79 } | |
80 | |
81 if ((no_more_opts == 0) && (*opt == '-') && (*(opt+1) != 0)) /* option */ | |
82 { | |
83 m_option_t* mp_opt = NULL; | |
84 /* remove trailing '-' */ | |
85 opt++; | |
86 mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "this_opt = option: %s\n", opt); | |
87 mp_opt = m_config_get_option(config,opt); | |
88 if(!mp_opt) { | |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
89 tmp = M_OPT_UNKNOWN; |
9096 | 90 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "%s is not an MEncoder option\n",opt); |
8164 | 91 goto err_out; |
92 } | |
8893 | 93 if(!entry || (mp_opt->flags & M_OPT_GLOBAL)){ |
8164 | 94 tmp = m_config_set_option(config, opt, argv[i + 1]); |
8893 | 95 if(tmp < 0){ |
96 // mp_msg(MSGT_CFGPARSER, MSGL_ERR, "m_config_set_option() failed (%d)\n",tmp); | |
97 goto err_out; | |
98 } | |
99 } else { | |
8164 | 100 tmp = m_config_check_option(config, opt, argv[i + 1]); |
101 if(tmp >= 0) { | |
102 entry->opts = realloc(entry->opts,(no+2)*2*sizeof(char*)); | |
103 entry->opts[2*no] = strdup(opt); | |
104 entry->opts[2*no+1] = argv[i + 1] ? strdup(argv[i + 1]) : NULL; | |
105 entry->opts[2*no+2] = entry->opts[2*no+3] = NULL; | |
106 no++; | |
8893 | 107 } else { |
108 // mp_msg(MSGT_CFGPARSER, MSGL_ERR, "m_config_set_option() failed (%d)\n",tmp); | |
9792 | 109 if(tmp == M_OPT_EXIT) |
110 exit(0); | |
8893 | 111 goto err_out; |
8164 | 112 } |
113 } | |
114 i += tmp; | |
9747
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
115 } else {/* filename */ |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
116 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Adding file %s\n",argv[i]); |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
117 lst = realloc(lst,(nf+2)*sizeof(m_entry_t)); |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
118 lst[nf].name = strdup(argv[i]); |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
119 lst[nf].opts = calloc(2,sizeof(char*)); |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
120 entry = &lst[nf]; |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
121 no = 0; |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
122 memset(&lst[nf+1],0,sizeof(m_entry_t)); |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
123 nf++; |
264cb5f03131
Remove the hack used to pass -dvd, etc into the playlist
albeu
parents:
9096
diff
changeset
|
124 } |
8164 | 125 } |
126 | |
127 if(nf == 0) { | |
128 m_entry_list_free(lst); | |
129 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "No file given\n"); | |
130 return NULL; | |
131 } | |
132 return lst; | |
133 | |
134 err_out: | |
135 m_entry_list_free(lst); | |
136 return NULL; | |
137 } |