Fix oggplay-dump-first-frame
[liboggplay.git] / src / tools / oggplay-info.c
blob2dac55c1951af51e3c5516a268d2d972b661b7a1
1 #include "config.h"
3 #include <oggplay/oggplay.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <math.h>
8 static int n_frames = 0;
10 typedef struct {
11 int last_overrun;
12 int worst_overrun;
13 int overrun_sum;
14 int * histogram;
15 } overrunInfo;
17 static overrunInfo *overruns = NULL;
19 int
20 dump_streams_callback(OggPlay *player, int num_records,
21 OggPlayCallbackInfo **info, void *user) {
23 int i;
24 int available;
25 int required;
26 int overrun;
27 OggPlayDataHeader ** headers;
29 if (overruns == NULL) {
30 overruns = malloc (sizeof (overrunInfo) * num_records);
31 for (i = 0; i < num_records; i++) {
32 overruns[i].last_overrun = 0;
33 overruns[i].worst_overrun = 0;
34 overruns[i].overrun_sum = 0;
35 overruns[i].histogram = malloc (sizeof (int));
36 overruns[i].histogram[0] = 0;
40 for (i = 0; i < num_records; i++)
43 int j;
45 required = oggplay_callback_info_get_required(info[i]);
46 available = oggplay_callback_info_get_available(info[i]);
47 headers = oggplay_callback_info_get_headers(info[i]);
49 overrun = 0;
50 for (j = required; j < available; j++) {
51 /*OggPlayDataHeader *header;*/
53 overrun += oggplay_callback_info_get_record_size(headers[j]);
57 if (overrun > overruns[i].worst_overrun) {
58 int j;
59 overruns[i].histogram = realloc (overruns[i].histogram,
60 (overrun + 1) * sizeof (int));
61 for (j = overruns[i].worst_overrun + 1; j <= overrun; j++) {
62 overruns[i].histogram[j] = 0;
65 overruns[i].worst_overrun = overrun;
68 overruns[i].overrun_sum += overrun;
70 overruns[i].histogram[overrun] += 1;
72 overruns[i].last_overrun = overrun;
74 printf("track %d required %d times [", i, required);
75 for (j = 0; j < required; j++) {
76 if (j > 0) {
77 printf(", ");
79 printf("%ld", oggplay_callback_info_get_presentation_time(headers[j]));
81 printf("] ");
84 printf("\n");
86 n_frames += 1;
88 return 0;
91 int
92 main (int argc, char * argv[]) {
94 OggPlay * player;
95 OggPlayReader * reader;
96 int i;
98 if (argc < 2) {
99 printf ("please provide a filename\n");
100 exit (1);
103 reader = oggplay_file_reader_new(argv[1]);
105 player = oggplay_open_with_reader(reader);
107 if (player == NULL) {
108 printf ("could not initialise oggplay with this file\n");
109 exit (1);
112 printf ("Reading %d tracks ...\n", oggplay_get_num_tracks (player));
114 for (i = 0; i < oggplay_get_num_tracks (player); i++) {
115 printf("\t%s: Track %d ...", oggplay_get_track_typename (player, i), i);
116 if (oggplay_get_track_type (player, i) == OGGZ_CONTENT_THEORA) {
117 oggplay_set_callback_num_frames (player, i, 1);
120 if (oggplay_get_track_type (player, i) == OGGZ_CONTENT_VORBIS) {
121 oggplay_set_offset(player, i, 1000LL);
125 if (oggplay_set_track_active(player, i) < 0) {
126 printf(" Could not set this track active!\n");
127 } else {
128 printf(" ok ...\n");
132 oggplay_set_data_callback(player, dump_streams_callback, NULL);
133 oggplay_start_decoding(player);
135 printf("Total %d frames.\n", n_frames);
137 if (n_frames == 0)
138 return 0;
140 for (i = 0; i < oggplay_get_num_tracks (player); i++) {
141 int j;
142 long long mse = 0;
144 double average = (double)(overruns[i].overrun_sum)/n_frames;
145 double hist_bucket_size;
146 double cur_bucket;
148 if (overruns[i].worst_overrun > 30)
149 hist_bucket_size = overruns[i].worst_overrun/20.0;
150 else
151 hist_bucket_size = 1.0;
153 printf("\n%s: Track %d\n", oggplay_get_track_typename (player, i), i);
154 printf("\tWorst overrun: %d frames\n", overruns[i].worst_overrun);
155 printf("\tAverage overrun: %.3f frames\n", average);
156 printf("\tHistogram bucket size: %.3f\n", hist_bucket_size);
157 printf("\tHistogram:");
159 for
161 cur_bucket = 0;
162 cur_bucket <= overruns[i].worst_overrun;
163 cur_bucket += hist_bucket_size
165 int sum = 0;
166 //printf(" (%f-%f)", cur_bucket, cur_bucket + hist_bucket_size);
167 for
169 j = ceil(cur_bucket);
170 j < (cur_bucket + hist_bucket_size) && j <= overruns[i].worst_overrun;
173 sum += overruns[i].histogram[j];
175 printf(" %d", sum);
178 for (j = 0; j <= overruns[i].worst_overrun; j++) {
179 mse += (average - j) * (average - j) * overruns[i].histogram[j];
181 printf("\n");
182 printf("\tSD of overrun: %f\n", sqrt(mse/n_frames));
187 return 0;