12 void usage (const char *program_name
)
15 " usage: %s <input filename format string> <bitrate> <a_m> <s_m>\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"
23 " The resulting stream.tarkin will have bitrate*frame+sizeof(header) bytes.\n"
28 TarkinError
free_frame(void *s
, void *ptr
) {
38 TarkinError
packet_out(void *stream
, ogg_packet
*op
) {
40 TarkinStream
*s
= stream
;
41 struct tarkin_enc
*te
= s
->user_ptr
;
42 ogg_stream_packetin(&te
->os
,op
);
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
);
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
);
56 int main (int argc
, char **argv
)
63 TarkinStream
*tarkin_stream
;
64 TarkinVideoLayerDesc layer
[] = { { 0, 0, 1, 5000, TARKIN_RGB24
} };
74 layer
[0].bitstream_len
= 1000;
75 layer
[0].a_moments
= 2;
76 layer
[0].s_moments
= 2;
77 } else if (argc
== 5) {
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);
86 snprintf (fname
, 256, fmt
, 0);
87 type
= read_pnm_header (fname
, &layer
[0].width
, &layer
[0].height
);
90 printf (" failed opening '%s' !!\n", fname
);
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");
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]);
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
);
125 rgb
= (uint8_t*) MALLOC (layer
[0].width
* layer
[0].height
* type
);
126 snprintf (fname
, 256, fmt
, frame
);
128 printf (fname
, frame
);
131 if (read_pnm (fname
, rgb
) < 0)
133 printf (" failed.\n");
137 date
.numerator
= frame
;
138 date
.denominator
= 1;
139 tarkin_analysis_framein (tarkin_stream
, rgb
, 0, &date
);
144 tarkin_analysis_framein (tarkin_stream
, NULL
, 0, NULL
); /* EOS */
145 tarkin_comment_clear (&tc
);
146 tarkin_stream_destroy (tarkin_stream
);