~epii/+junk/encenv

« back to all changes in this revision

Viewing changes to ffpreset/ffpreset.c

  • Committer: epii
  • Date: 2010-09-16 08:56:09 UTC
  • Revision ID: public.epii@gmail.com-20100916085609-gxirky9icbnf6gb6
added ffpreset, simple frontend for ffmpeg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#include <stdlib.h>
 
3
#include <string.h>
 
4
#include <unistd.h>
 
5
#include <errno.h>
 
6
 
 
7
#include "config.h"
 
8
 
 
9
#define TRUE 1
 
10
#define FALSE 0
 
11
 
 
12
typedef struct FFArgs{
 
13
        char name[20];
 
14
        char value[1000];
 
15
} FFArgs;
 
16
 
 
17
static FFArgs ffargs[1000];
 
18
static int nffargs = 0;
 
19
 
 
20
/**
 
21
 * exit with error code 1
 
22
 */
 
23
static void error_exit(const char *msg){
 
24
        fprintf(stderr, "E: %s\n", msg);
 
25
        exit(1);
 
26
}
 
27
 
 
28
/**
 
29
 * print usage
 
30
 */
 
31
static void print_credits(int argc, char *argv[]){
 
32
        printf("%s version %s\n", PACKAGE, VERSION);
 
33
        printf("Usage: %s [OPTIONS] -- PRESET INFILE OUTFILE\n", argv[0]);
 
34
        printf("\n");
 
35
}
 
36
 
 
37
/**
 
38
 * set ffargs
 
39
 */
 
40
static void ffargs_set(const char *name, const char *value, int force){
 
41
        /* check the length */
 
42
        if(strlen(name) >= sizeof(ffargs[0].name))
 
43
                error_exit("too long argument name detected");
 
44
        if(strlen(value) >= sizeof(ffargs[0].value))
 
45
                error_exit("too long argument value detected");
 
46
        /* check if this argument is already added or not */
 
47
        int index = nffargs;
 
48
        for(int i=0; i<nffargs; i++){
 
49
                if(strcmp(ffargs[i].name, name) == 0){
 
50
                        if(!force){
 
51
                                return;
 
52
                        }
 
53
                        index = i;
 
54
                        nffargs--;
 
55
                        break;
 
56
                }
 
57
        }
 
58
        nffargs++;
 
59
        if(index >= sizeof(ffargs))
 
60
                error_exit("too match arguments specified");
 
61
        /* set */
 
62
        strcpy(ffargs[index].name, name);
 
63
        strcpy(ffargs[index].value, value);
 
64
}
 
65
 
 
66
static int preset_read(char *filename){
 
67
        char line[1000];
 
68
        char name[1000];
 
69
        char value[1000];
 
70
        FILE *f = NULL;
 
71
        f = fopen(filename, "r");
 
72
        if(!f)
 
73
                return FALSE;
 
74
        for(;!feof(f);){
 
75
                if(fscanf(f, "%999[^\n]\n", line) != 1)
 
76
                        error_exit("too match characters in one line");
 
77
                if(line[0] == '#')
 
78
                        continue;
 
79
                if(sscanf(line, "%999[^=]=%999[^\n]\n", name, value) != 2)
 
80
                        error_exit("invalid syntax");
 
81
                ffargs_set(name, value, FALSE);
 
82
        }
 
83
        fclose(f);
 
84
        return TRUE;
 
85
}
 
86
 
 
87
/**
 
88
 * main function
 
89
 */
 
90
int main(int argc, char *argv[]){
 
91
        
 
92
        print_credits(argc, argv);
 
93
        
 
94
        /* parse options */
 
95
        int extras = -1;
 
96
        for(int i=0; i<argc; i++){
 
97
                if(strcmp(argv[i], "--") == 0){
 
98
                        extras = i + 1;
 
99
                        break;
 
100
                }
 
101
                if(argv[i][0] == '-'){
 
102
                        if(i+1 >= argc)
 
103
                                break;
 
104
                        /* argument without value */
 
105
                        if(argv[i+1][0] == '-'){
 
106
                                ffargs_set(argv[i]+1, "", TRUE);
 
107
                        }else{
 
108
                                ffargs_set(argv[i]+1, argv[i+1], TRUE);
 
109
                                i++;
 
110
                        }
 
111
                }
 
112
        }
 
113
        if(extras < 0)
 
114
                error_exit("'--' was not found");
 
115
        
 
116
        /* read from preset files */
 
117
        char filename[1000];
 
118
        if(extras + 3 > argc)
 
119
                error_exit("OUTFILE is not specified");
 
120
        do{
 
121
                /* current directory */
 
122
                char cwd[1000];
 
123
                getcwd(cwd, sizeof(cwd));
 
124
                snprintf(filename, sizeof(filename), "%s/%s.ffpreset", cwd, argv[extras]);
 
125
                if(preset_read(filename)) break;
 
126
                /* $HOME/.ffpreset/PRESET.ffpreset */
 
127
                snprintf(filename, sizeof(filename), "%s/%s.ffpreset", getenv("HOME"), argv[extras]);
 
128
                if(preset_read(filename)) break;
 
129
                /* DATADIR/ */
 
130
                snprintf(filename, sizeof(filename), "%s/%s/%s.ffpreset", DATADIR, PACKAGE, argv[extras]);
 
131
                if(preset_read(filename)) break;
 
132
                /* not found */
 
133
                error_exit("preset file not found");
 
134
        }while(FALSE);
 
135
        
 
136
        /* output configuration */
 
137
        char cmd[1000];
 
138
        snprintf(cmd, sizeof(cmd), "ffmpeg -i \"%s\"", argv[extras+1]);
 
139
        for(int i=0; i<nffargs; i++){
 
140
                char tmp[1000];
 
141
                strcpy(tmp, cmd);
 
142
                snprintf(cmd, sizeof(cmd), "%s -%s %s", tmp, ffargs[i].name, ffargs[i].value);
 
143
        }
 
144
        {
 
145
                char tmp[1000];
 
146
                strcpy(tmp, cmd);
 
147
                snprintf(cmd, sizeof(cmd), "%s \"%s\"", tmp, argv[extras+2]);
 
148
        }
 
149
        printf("Executing:\n%s\n", cmd);
 
150
        system(cmd);
 
151
        return 0;
 
152
}
 
153