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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1 #include "config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
2
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
3 #include <stdio.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
4 #include <stdlib.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
5 #include <string.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
6 #include <errno.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
7
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
8 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
9 #include <assert.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
10 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
11
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
12 #include "mp_msg.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
13 #include "m_option.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
14 #include "m_config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
15 #include "parser-mecmd.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
16
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
17 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
18 m_entry_list_free(m_entry_t* lst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
19 int i,j;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
20
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
21 for(i = 0 ; lst[i].name != NULL ; i++){
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
22 free(lst[i].name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
23 for(j = 0 ; lst[i].opts[2*j] != NULL ; j++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
24 free(lst[i].opts[2*j]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
25 free(lst[i].opts[2*j+1]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
26 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
27 free(lst[i].opts);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
28 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
29 free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
30 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
31
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
32 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
33 m_entry_set_options(m_config_t *config, m_entry_t* entry) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
34 int i,r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
35
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
36 for(i = 0 ; entry->opts[2*i] != NULL ; i++){
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
37 r = m_config_set_option(config,entry->opts[2*i],entry->opts[2*i+1]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
38 if(r < 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
39 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
40 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
41 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
42 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
43
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
44
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
45
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
46
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
47 m_entry_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
48 m_config_parse_me_command_line(m_config_t *config, int argc, char **argv)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
49 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
50 int i,nf = 0,no = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
51 int tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
52 char *opt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
53 int no_more_opts = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
54 m_entry_t *lst = NULL, *entry = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
55
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
56 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
57 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
58 assert(argv != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
59 assert(argc >= 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
60 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
61
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
62 config->mode = M_COMMAND_LINE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
63
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
64 lst = calloc(1,sizeof(m_entry_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
65
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
66 for (i = 1; i < argc; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
67 //next:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
68 opt = argv[i];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
69 /* check for -- (no more options id.) except --help! */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
70 if ((*opt == '-') && (*(opt+1) == '-') && (*(opt+2) != 'h'))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
71 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
72 no_more_opts = 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
73 if (i+1 >= argc)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
74 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
75 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "You added '--' but no filenames presented!\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
76 goto err_out;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
77 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
78 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
79 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
80
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
81 if ((no_more_opts == 0) && (*opt == '-') && (*(opt+1) != 0)) /* option */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
82 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
83 m_option_t* mp_opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
84 /* remove trailing '-' */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
85 opt++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
86 mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "this_opt = option: %s\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 mp_opt = m_config_get_option(config,opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
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
a5eb26ca31d0 fix a typo
colin
parents: 8893
diff changeset
90 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "%s is not an MEncoder option\n",opt);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
91 goto err_out;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
92 }
8893
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
93 if(!entry || (mp_opt->flags & M_OPT_GLOBAL)){
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
94 tmp = m_config_set_option(config, opt, argv[i + 1]);
8893
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
95 if(tmp < 0){
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
96 // mp_msg(MSGT_CFGPARSER, MSGL_ERR, "m_config_set_option() failed (%d)\n",tmp);
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
97 goto err_out;
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
98 }
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
99 } else {
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
100 tmp = m_config_check_option(config, opt, argv[i + 1]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
101 if(tmp >= 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
102 entry->opts = realloc(entry->opts,(no+2)*2*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
103 entry->opts[2*no] = strdup(opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
104 entry->opts[2*no+1] = argv[i + 1] ? strdup(argv[i + 1]) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
105 entry->opts[2*no+2] = entry->opts[2*no+3] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
106 no++;
8893
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
107 } else {
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
108 // mp_msg(MSGT_CFGPARSER, MSGL_ERR, "m_config_set_option() failed (%d)\n",tmp);
9792
4c34dc17e43d Exit when the option parser return M_OPT_EXIT
albeu
parents: 9747
diff changeset
109 if(tmp == M_OPT_EXIT)
4c34dc17e43d Exit when the option parser return M_OPT_EXIT
albeu
parents: 9747
diff changeset
110 exit(0);
8893
268b3fbc35b7 cosmetics
arpi
parents: 8164
diff changeset
111 goto err_out;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
112 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
125 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
126
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
127 if(nf == 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
128 m_entry_list_free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
129 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "No file given\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
130 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
131 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
132 return lst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
133
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
134 err_out:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
135 m_entry_list_free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 }