Print summary timing information at the end of encoder_example runs.
[theora.git] / examples / libtheora_info.c
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2010                *
9  * by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
10  *                                                                  *
11  ********************************************************************
12
13   function: example of querying various library parameters.
14   last mod: $Id$
15
16  ********************************************************************/
17
18 #ifdef HAVE_CONFIG_H
19 # include <config.h>
20 #endif
21
22 #include <stdio.h>
23 #include <stdlib.h>
24
25 #include "theora/theoraenc.h"
26
27
28 /* Print the library's bitstream version number
29    This is the highest supported bitstream version number,
30    not the version number of the implementation itself. */
31 int print_version(void)
32 {
33     unsigned version = th_version_number();
34
35     fprintf(stdout, "Bitstream: %d.%d.%d (0x%06X)\n",
36         (version >> 16) & 0xff, (version >> 8) & 0xff, (version) & 0xff,
37         version);
38
39     return 0;
40 }
41
42 /* Print the library's own version string
43    This is generally the same at the vendor string embedded
44    in encoded files. */
45 int print_version_string(void)
46 {
47     const char *version = th_version_string();
48
49     if (version == NULL) {
50       fprintf(stderr, "Error querying libtheora version string.\n");
51       return -1;
52     }
53
54     fprintf(stdout, "Version: %s\n", version);
55
56     return 0;
57 }
58
59 /* Generate a dummy encoder context for use in th_encode_ctl queries */
60 th_enc_ctx *dummy_encode_ctx(void)
61 {
62     th_enc_ctx *ctx;
63     th_info info;
64
65     /* set the minimal video parameters */
66     th_info_init(&info);
67     info.frame_width=320;
68     info.frame_height=240;
69     info.fps_numerator=1;
70     info.fps_denominator=1;
71
72     /* allocate and initialize a context object */
73     ctx = th_encode_alloc(&info);
74     if (ctx == NULL) {
75         fprintf(stderr, "Error allocating encoder context.\n");
76     }
77
78     /* clear the info struct */
79     th_info_clear(&info);
80
81     return ctx;
82 }
83
84 /* Query the current and maximum values for the 'speed level' setting.
85    This can be used to ask the encoder to trade off encoding quality
86    vs. performance cost, for example to adapt to realtime constraints. */
87 int check_speed_level(th_enc_ctx *ctx, int *current, int *max)
88 {
89     int ret;
90
91     /* query the current speed level */
92     ret = th_encode_ctl(ctx, TH_ENCCTL_GET_SPLEVEL, current, sizeof(int));
93     if (ret) {
94         fprintf(stderr, "Error %d getting current speed level.\n", ret);
95         return ret;
96     }
97     /* query the maximum speed level, which varies by encoder version */
98     ret = th_encode_ctl(ctx, TH_ENCCTL_GET_SPLEVEL_MAX, max, sizeof(int));
99     if (ret) {
100         fprintf(stderr, "Error %d getting max speed level.\n", ret);
101         return ret;
102     }
103
104     return 0;
105 }
106
107 /* Print the current and maximum speed level settings */
108 int print_speed_level(th_enc_ctx *ctx)
109 {
110     int current = -1;
111     int max = -1;
112     int ret;
113
114     ret = check_speed_level(ctx, &current, &max);
115     if (ret == 0) {
116         fprintf(stdout, "Default speed level: %d\n", current);
117         fprintf(stdout, "Maximum speed level: %d\n", max);
118     }
119
120     return ret;
121 }
122
123 int main(int argc, char **argv) {
124     th_enc_ctx *ctx;
125
126     /* print versioning */
127     print_version_string();
128     print_version();
129
130     /* allocate a generic context for queries that require it */
131     ctx = dummy_encode_ctx();
132     if (ctx != NULL) {
133         /* dump the speed level setting */
134         print_speed_level(ctx);
135         /* clean up */
136         th_encode_free(ctx);
137     }
138
139     return 0;
140 }
141