Sometimes you'll need to seek to a temporal offset in seconds into a CMML file. Note: The seconds offset is calculated with respect to the timebase attribute of the stream tag. libcmml provides an API for this functionality through the cmml_skip_to_secs() function.
The procedure is illustrated in cmml-seek-offset.c, which seeks to an offset given in seconds and prints out the descriptions of all the following clips:
#include <stdio.h> #include <cmml.h> #define BUFSIZE 100000 static int read_clip (CMML * cmml, const CMML_Clip * clip, void * user_data) { puts(clip->desc_text); return 0; } int main(int argc, char *argv[]) { char *filename = NULL; CMML * doc; double seconds = 0.0; long n = 0; if (argc < 2) { fprintf (stderr, "Usage: %s <CMMLfile> <seconds>\n", argv[0]); exit (1); } filename = argv[1]; if (argv[2]) seconds = atof(argv[2]); doc = cmml_open(filename); /* seek to time offset; if not found, to file end */ cmml_skip_to_secs (doc, seconds); cmml_set_read_callbacks (doc, NULL, NULL, read_clip, NULL); while (((n = cmml_read (doc, BUFSIZE)) > 0)); cmml_close(doc); return 0; }
00001 00031 #include <stdio.h> 00032 00033 #include <cmml.h> 00034 00045 #define BUFSIZE 100000 00046 00057 static int 00058 read_clip (CMML * cmml, const CMML_Clip * clip, void * user_data) { 00059 puts(clip->desc_text); 00060 return 0; 00061 } 00062 00069 int main(int argc, char *argv[]) 00070 { 00071 char *filename = NULL; 00072 CMML * doc; 00073 double seconds = 0.0; 00074 long n = 0; 00075 00076 if (argc < 2) { 00077 fprintf (stderr, "Usage: %s <CMMLfile> <seconds>\n", argv[0]); 00078 exit (1); 00079 } 00080 filename = argv[1]; 00081 if (argv[2]) seconds = atof(argv[2]); 00082 00083 doc = cmml_open(filename); 00084 00085 /* seek to time offset; if not found, to file end */ 00086 cmml_skip_to_secs (doc, seconds); 00087 00088 cmml_set_read_callbacks (doc, NULL, NULL, read_clip, NULL); 00089 00090 while (((n = cmml_read (doc, BUFSIZE)) > 0)); 00091 00092 cmml_close(doc); 00093 00094 return 0; 00095 }