It appears Solaris's cc is ignoring the signedness of bitfield types.
[xiph/unicode.git] / w3d / tarkin_enc.c
blob71f9336d56dc9e641ded5ef0a99cc90108f753d6
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
5 #include "mem.h"
6 #include "tarkin.h"
7 #include "pnm.h"
8 #include "w3dtypes.h"
11 static
12 void usage (const char *program_name)
14 printf ("\n"
15 " usage: %s <input filename format string> <bitrate> <a_m> <s_m>\n"
16 "\n"
17 " input ppm filename format: optional, \"%%i.ppm\" by default\n"
18 " bitrate: cut Y/U/V bitstream after limit bytes/frame\n"
19 " (something like 3000 makes sense here)\n"
20 " a_m, s_m: number of vanishing moments of the\n"
21 " analysis/synthesis filter, (2,2) by default\n"
22 "\n"
23 " The resulting stream.tarkin will have bitrate*frame+sizeof(header) bytes.\n"
24 "\n", program_name);
25 exit (-1);
28 TarkinError free_frame(void *s, void *ptr) {
29 FREE (ptr);
30 return(TARKIN_OK);
33 struct tarkin_enc {
34 ogg_stream_state os;
35 int fd;
38 TarkinError packet_out(void *stream, ogg_packet *op) {
39 ogg_page og;
40 TarkinStream *s = stream;
41 struct tarkin_enc *te = s->user_ptr;
42 ogg_stream_packetin(&te->os,op);
43 if(op->e_o_s){
44 ogg_stream_flush(&te->os, &og);
45 write(te->fd, og.header, og.header_len);
46 write(te->fd, og.body , og.body_len);
47 } else {
48 while(ogg_stream_pageout(&te->os,&og)){
49 write(te->fd, og.header, og.header_len);
50 write(te->fd, og.body , og.body_len);
53 return (TARKIN_OK);
56 int main (int argc, char **argv)
58 char *fmt = "%i.ppm";
59 char fname[256];
60 uint32_t frame = 0;
61 uint8_t *rgb;
62 struct tarkin_enc te;
63 TarkinStream *tarkin_stream;
64 TarkinVideoLayerDesc layer [] = { { 0, 0, 1, 5000, TARKIN_RGB24 } };
65 int type,i;
66 TarkinComment tc;
67 TarkinInfo ti;
68 ogg_page og;
69 ogg_packet op[3];
70 TarkinTime date;
73 if (argc == 1) {
74 layer[0].bitstream_len = 1000;
75 layer[0].a_moments = 2;
76 layer[0].s_moments = 2;
77 } else if (argc == 5) {
78 fmt = argv[1];
79 layer[0].bitstream_len = strtol (argv[2], 0, 0);
80 layer[0].a_moments = strtol (argv[3], 0, 0);
81 layer[0].s_moments = strtol (argv[4], 0, 0);
82 } else {
83 usage (argv[0]);
86 snprintf (fname, 256, fmt, 0);
87 type = read_pnm_header (fname, &layer[0].width, &layer[0].height);
89 if (type < 0) {
90 printf (" failed opening '%s' !!\n", fname);
91 exit (-1);
94 layer[0].format = (type == 3) ? TARKIN_RGB24 : TARKIN_GRAYSCALE;
97 if ((te.fd = open ("stream.ogg", O_CREAT | O_RDWR | O_TRUNC | O_BINARY, 0644)) < 0) {
98 printf ("error opening '%s' for writing !\n", "stream.ogg");
99 usage (argv[0]);
102 ogg_stream_init(&te.os,1);
103 tarkin_info_init(&ti);
105 ti.inter.numerator = 1;
106 ti.inter.denominator = 1;
108 tarkin_comment_init(&tc);
109 tarkin_comment_add_tag(&tc, "TITLE", "tarkin_enc produced file");
110 tarkin_comment_add_tag(&tc, "ARTIST", "C coders ;)");
111 tarkin_stream = tarkin_stream_new ();
112 tarkin_analysis_init(tarkin_stream, &ti, free_frame, packet_out,(void*)&te);
113 tarkin_analysis_add_layer(tarkin_stream, &layer[0]);
114 printf("n_layers: %d\n", tarkin_stream->n_layers);
115 tarkin_analysis_headerout(tarkin_stream, &tc, op, &op[1], &op[2]);
116 for(i=0;i<3;i++){
117 ogg_stream_packetin(&te.os, &op[i]);
119 ogg_stream_flush(&te.os,&og);
120 write(te.fd, og.header, og.header_len);
121 write(te.fd, og.body, og.body_len);
124 do {
125 rgb = (uint8_t*) MALLOC (layer[0].width * layer[0].height * type);
126 snprintf (fname, 256, fmt, frame);
127 printf ("read '");
128 printf (fname, frame);
129 printf ("'");
131 if (read_pnm (fname, rgb) < 0)
133 printf (" failed.\n");
134 break;
136 printf ("\n");
137 date.numerator = frame;
138 date.denominator = 1;
139 tarkin_analysis_framein (tarkin_stream, rgb, 0, &date);
140 frame++;
141 } while (1);
143 FREE (rgb);
144 tarkin_analysis_framein (tarkin_stream, NULL, 0, NULL); /* EOS */
145 tarkin_comment_clear (&tc);
146 tarkin_stream_destroy (tarkin_stream);
147 close (te.fd);
149 return 0;