2323
2424#include "common.h"
2525
26- typedef struct frate_s {
27- char * name ;
28- int rate ;
29- double frame_dur ;
30- } frate_t ;
31-
3226frate_t frates [] = {
33- {"23.976" , 24 , 1000.0 / (24000.0 / 1001.0 )},
34- {"24" , 24 , 1000.0 / (24.0 / 1.0 )},
35- {"25" , 25 , 1000.0 / (25.0 / 1.0 )},
36- {"29.97" , 30 , 1000.0 / (30000.0 / 1001.0 )},
37- {"50" , 50 , 1000.0 / (50.0 / 1.0 )},
38- {"59.94" , 60 , 1000.0 / (60000.0 / 1001.0 )},
27+ {"23.976" ,24 , 1000.0 / (24000.0 / 1001.0 ), 24000 , 1001 },
28+ {"24" , 24 , 1000.0 / (24.0 / 1.0 ), 24 , 1 },
29+ {"25" , 25 , 1000.0 / (25.0 / 1.0 ), 25 , 1 },
30+ {"29.97" , 30 , 1000.0 / (30000.0 / 1001.0 ), 30000 , 1001 },
31+ {"50" , 50 , 1000.0 / (50.0 / 1.0 ), 50 , 1 },
32+ {"59.94" , 60 , 1000.0 / (60000.0 / 1001.0 ), 60000 , 1001 },
3933 {NULL , 0 , 0 }
4034};
4135
@@ -88,6 +82,24 @@ void mktc(int tc, int fps, char *buf)
8882 }
8983}
9084
85+ static void frame_to_tc (uint64_t frames , frate_t * fps , char * buf )
86+ {
87+ frames -- ;
88+ uint8_t frame = frames % fps -> rate ;
89+ uint64_t ts = frames /fps -> rate ;
90+ uint8_t sec = ts % 60 ;
91+ ts /= 60 ;
92+ uint8_t m = ts % 60 ;
93+ ts /= 60 ;
94+ if (ts > 99 ) {
95+ fprintf (stderr , "timestamp overflow (more than 99 hours).\n" );
96+ exit (1 );
97+ } else if (snprintf (buf , 12 , "%02d:%02d:%02d:%02d" , (uint8_t )ts , m , sec , frame ) != 11 ) {
98+ fprintf (stderr , "Timecode lead to invalid format: %s\n" , buf );
99+ exit (1 );
100+ }
101+ }
102+
91103void write_xml (eventlist_t * evlist , vfmt_t * vfmt , frate_t * frate ,
92104 char * track_name , char * language , opts_t * args )
93105{
@@ -103,9 +115,10 @@ void write_xml(eventlist_t *evlist, vfmt_t *vfmt, frate_t *frate,
103115 exit (1 );
104116 }
105117
106- mktc (evlist -> events [0 ]-> in / frate -> frame_dur , frate -> rate , buf_in );
107- mktc (evlist -> events [evlist -> nmemb - 1 ]-> out / frate -> frame_dur ,
108- frate -> rate , buf_out );
118+ //mktc(evlist->events[0]->in / frate->frame_dur, frate->rate, buf_in);
119+ //mktc(evlist->events[evlist->nmemb - 1]->out / frate->frame_dur, frate->rate, buf_out);
120+ frame_to_tc (evlist -> events [0 ]-> in , frate , buf_in );
121+ frame_to_tc (evlist -> events [evlist -> nmemb - 1 ]-> out , frate , buf_out );
109122
110123 fprintf (of , "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
111124 "<BDN Version=\"0.93\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"BD-03-006-0093b BDN File Format.xsd\">\n"
@@ -116,15 +129,19 @@ void write_xml(eventlist_t *evlist, vfmt_t *vfmt, frate_t *frate,
116129 " <Events LastEventOutTC=\"%s\" FirstEventInTC=\"%s\" " ,
117130 track_name , language , vfmt -> name , frate -> name , buf_out , buf_in );
118131
119- mktc (0 , frate -> rate , buf_in );
132+ //mktc(0, frate->rate, buf_in);
133+ frame_to_tc (1 , frate , buf_in );
134+
120135 fprintf (of , "ContentInTC=\"%s\" ContentOutTC=\"%s\" NumberofEvents=\"%d\" Type=\"Graphic\"/>\n"
121136 " </Description>\n"
122137 " <Events>\n" , buf_in , buf_out , evlist -> nmemb );
123138
124139 for (i = 0 ; i < evlist -> nmemb ; i ++ ) {
125140 image_t * img = evlist -> events [i ];
126- mktc (img -> in / frate -> frame_dur , frate -> rate , buf_in );
127- mktc (img -> out / frate -> frame_dur , frate -> rate , buf_out );
141+ frame_to_tc (img -> in , frate , buf_in );
142+ frame_to_tc (img -> out , frate , buf_out );
143+ //mktc(img->in / frate->frame_dur, frate->rate, buf_in);
144+ //mktc(img->out / frate->frame_dur, frate->rate, buf_out);
128145
129146 fprintf (of , " <Event Forced=\"False\" InTC=\"%s\" OutTC=\"%s\">\n" ,
130147 buf_in , buf_out );
@@ -313,9 +330,7 @@ int main(int argc, char *argv[])
313330 }
314331 }
315332
316- args .fps = frate -> rate ;
317-
318- evlist = render_subs (subfile , rint (frate -> frame_dur ), & args );
333+ evlist = render_subs (subfile , frate , & args );
319334
320335 write_xml (evlist , vfmt , frate , track_name , language , & args );
321336
0 commit comments