Mercurial > mplayer.hg
annotate parser-mecmd.c @ 12337:6f1b4c989914
soft skipping for mencoder. rather than skipping decoding/filtering
frames that will be skipped, mencoded tells vf_softskip (if present)
that it should drop the next frame. this allows filters that need to
see every input frame (inverse telecine, denoise3d, ...) to see
skipped frames before they get dropped.
in principle, a smarter softskip filter could be written that would
buffer frames and choose to drop the one with least change, rather
than strictly dropping the next one.
author | rfelker |
---|---|
date | Wed, 28 Apr 2004 04:29:17 +0000 |
parents | 522afd56703c |
children | bef9d6dc2333 |
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! */ | |
70 if ((*opt == '-') && (*(opt+1) == '-') && (*(opt+2) != 'h')) | |
71 { | |
72 no_more_opts = 1; | |
73 if (i+1 >= argc) | |
74 { | |
75 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "You added '--' but no filenames presented!\n"); | |
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 } |