Skip to content

Commit 8430efa

Browse files
committed
GUACAMOLE-1729: Support for non-legally encumbered video codec format in guacenc
1 parent add7ce3 commit 8430efa

1 file changed

Lines changed: 43 additions & 4 deletions

File tree

src/guacenc/guacenc.c

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,22 @@
3333

3434
int main(int argc, char* argv[]) {
3535

36-
int i;
36+
int i, size;
37+
bool codec_valid = false;
38+
char* codec_names[] = { "mpeg4", "libvpx" };
39+
char* codec_suffixes[] = { "m4v", "avi" };
3740

3841
/* Load defaults */
3942
bool force = false;
4043
int width = GUACENC_DEFAULT_WIDTH;
4144
int height = GUACENC_DEFAULT_HEIGHT;
4245
int bitrate = GUACENC_DEFAULT_BITRATE;
46+
int codec_suffix = 0;
47+
char* codec_name = codec_names[codec_suffix];
4348

4449
/* Parse arguments */
4550
int opt;
46-
while ((opt = getopt(argc, argv, "s:r:f")) != -1) {
51+
while ((opt = getopt(argc, argv, "s:r:f:c:")) != -1) {
4752

4853
/* -s: Dimensions (WIDTHxHEIGHT) */
4954
if (opt == 's') {
@@ -65,6 +70,25 @@ int main(int argc, char* argv[]) {
6570
else if (opt == 'f')
6671
force = true;
6772

73+
/* -c: Codec */
74+
else if (opt == 'c') {
75+
codec_name = optarg;
76+
77+
size = sizeof(codec_names) / sizeof(codec_names[0]);
78+
for (i = 0; i < size; i++) {
79+
if (strcmp(codec_name, codec_names[i]) == 0) {
80+
codec_valid = true;
81+
codec_suffix = i;
82+
break;
83+
}
84+
}
85+
86+
if (codec_valid != true) {
87+
guacenc_log(GUAC_LOG_ERROR, "Invalid codec.");
88+
goto invalid_codecs;
89+
}
90+
}
91+
6892
/* Invalid option */
6993
else {
7094
goto invalid_options;
@@ -108,7 +132,8 @@ int main(int argc, char* argv[]) {
108132

109133
/* Generate output filename */
110134
char out_path[4096];
111-
int len = snprintf(out_path, sizeof(out_path), "%s.m4v", path);
135+
int len = snprintf(out_path, sizeof(out_path), "%s.%s", path,
136+
codec_suffixes[codec_suffix]);
112137

113138
/* Do not write if filename exceeds maximum length */
114139
if (len >= sizeof(out_path)) {
@@ -118,7 +143,7 @@ int main(int argc, char* argv[]) {
118143
}
119144

120145
/* Attempt encoding, log granular success/failure at debug level */
121-
if (guacenc_encode(path, out_path, "mpeg4",
146+
if (guacenc_encode(path, out_path, codec_name,
122147
width, height, bitrate, force)) {
123148
failures++;
124149
guacenc_log(GUAC_LOG_DEBUG,
@@ -148,9 +173,23 @@ int main(int argc, char* argv[]) {
148173
" [-s WIDTHxHEIGHT]"
149174
" [-r BITRATE]"
150175
" [-f]"
176+
" [-c CODEC]"
151177
" [FILE]...\n", argv[0]);
152178

153179
return 1;
154180

181+
invalid_codecs:
182+
183+
fprintf(stderr, "ERROR: Unsupported codec! Supported codecs are: ");
184+
185+
size = sizeof(codec_names) / sizeof(codec_names[0]);
186+
for (i = 0; i < size; i++) {
187+
fprintf(stderr, "%s ", codec_names[i]);
188+
}
189+
190+
fprintf(stderr, "\n");
191+
192+
return 1;
193+
155194
}
156195

0 commit comments

Comments
 (0)