3 #include <oggplay/oggplay.h>
8 static int n_frames
= 0;
17 static overrunInfo
*overruns
= NULL
;
20 dump_streams_callback(OggPlay
*player
, int num_records
,
21 OggPlayCallbackInfo
**info
, void *user
) {
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
++)
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
]);
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
) {
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
++) {
79 printf("%ld", oggplay_callback_info_get_presentation_time(headers
[j
]));
92 main (int argc
, char * argv
[]) {
95 OggPlayReader
* reader
;
99 printf ("please provide a filename\n");
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");
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");
132 oggplay_set_data_callback(player
, dump_streams_callback
, NULL
);
133 oggplay_start_decoding(player
);
135 printf("Total %d frames.\n", n_frames
);
140 for (i
= 0; i
< oggplay_get_num_tracks (player
); i
++) {
144 double average
= (double)(overruns
[i
].overrun_sum
)/n_frames
;
145 double hist_bucket_size
;
148 if (overruns
[i
].worst_overrun
> 30)
149 hist_bucket_size
= overruns
[i
].worst_overrun
/20.0;
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:");
162 cur_bucket
<= overruns
[i
].worst_overrun
;
163 cur_bucket
+= hist_bucket_size
166 //printf(" (%f-%f)", cur_bucket, cur_bucket + hist_bucket_size);
169 j
= ceil(cur_bucket
);
170 j
< (cur_bucket
+ hist_bucket_size
) && j
<= overruns
[i
].worst_overrun
;
173 sum
+= overruns
[i
].histogram
[j
];
178 for (j
= 0; j
<= overruns
[i
].worst_overrun
; j
++) {
179 mse
+= (average
- j
) * (average
- j
) * overruns
[i
].histogram
[j
];
182 printf("\tSD of overrun: %f\n", sqrt(mse
/n_frames
));