-
Notifications
You must be signed in to change notification settings - Fork 1
/
y4m2patch.c
67 lines (53 loc) · 1.41 KB
/
y4m2patch.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* y4m2patch.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jd_pretty.h>
#include "yuv4mpeg2.h"
typedef struct {
y4m2_parameters *parms;
y4m2_output *out;
} output_ctx;
static y4m2_parameters *merge_parms(output_ctx *oc,
const y4m2_parameters *parms) {
y4m2_parameters *p = y4m2_clone_parms(parms);
y4m2_merge_parms(p, oc->parms);
return p;
}
static void callback(y4m2_reason reason, const y4m2_parameters *parms,
y4m2_frame *frame, void *ctx) {
output_ctx *oc = (output_ctx *)ctx;
y4m2_parameters *merged = NULL;
switch (reason) {
case Y4M2_START:
merged = merge_parms(oc, parms);
y4m2_emit_start(oc->out, merged);
break;
case Y4M2_FRAME:
merged = merge_parms(oc, parms);
y4m2_emit_frame(oc->out, merged, frame);
break;
case Y4M2_END:
y4m2_emit_end(oc->out);
break;
}
y4m2_free_parms(merged);
}
int main(int argc, char *argv[]) {
output_ctx ctx;
int argn;
ctx.out = y4m2_output_file(stdout);
ctx.parms = y4m2_new_parms();
for (argn = 1; argn < argc; argn++) {
y4m2_parameters *p = y4m2_new_parms();
y4m2__parse_parms(p, argv[argn]);
ctx.parms = y4m2_merge_parms(ctx.parms, p);
y4m2_free_parms(p);
}
y4m2_output *out = y4m2_output_next(callback, &ctx);
y4m2_parse(stdin, out);
y4m2_free_parms(ctx.parms);
return 0;
}
/* vim:ts=2:sw=2:sts=2:et:ft=c
*/