wcap: Space out frames according to timestamps
authorKristian Høgsberg <krh@bitplanet.net>
Sat, 26 May 2012 02:33:35 +0000 (22:33 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Sat, 26 May 2012 02:33:35 +0000 (22:33 -0400)
wcap/vpxenc.c
wcap/wcap-decode.c
wcap/wcap-decode.h

index 7e0c552..8edeb55 100644 (file)
@@ -314,6 +314,7 @@ struct input_state
     struct vpx_rational   framerate;
     int                   use_i420;
     struct wcap_decoder  *wcap;
+    uint32_t              output_msecs;
 };
 
 static inline int rgb_to_yuv(uint32_t format, uint32_t p, int *u, int *v)
@@ -406,10 +407,18 @@ static int read_frame(struct input_state *input, vpx_image_t *img)
     }
     else if (file_type == FILE_TYPE_WCAP)
     {
-        if (!wcap_decoder_get_frame(input->wcap))
-            return 0;
+        if (input->wcap->count == 0) {
+            wcap_decoder_get_frame(input->wcap);
+           input->output_msecs = input->wcap->msecs;
+       }
+
+       while (input->output_msecs > input->wcap->msecs)
+            if (!wcap_decoder_get_frame(input->wcap))
+                return 0;
 
        convert_to_yv12(input->wcap, img);
+       input->output_msecs +=
+               input->framerate.den * 1000 / input->framerate.num;
     }
     else
     {
@@ -1748,7 +1757,7 @@ static void parse_global_config(struct global_config *global, char **argv)
 }
 
 
-void open_input_file(struct input_state *input)
+void open_input_file(struct input_state *input, struct global_config *global)
 {
     unsigned int fourcc;
 
@@ -1802,8 +1811,7 @@ void open_input_file(struct input_state *input)
         input->file_type = FILE_TYPE_WCAP;
         input->w = input->wcap->width;
         input->h = input->wcap->height;
-        input->framerate.num = 30;
-        input->framerate.den = 1;
+        input->framerate = global->framerate;
         input->use_i420 = 0;
     }
     else
@@ -2488,7 +2496,7 @@ int main(int argc, const char **argv_)
     {
         int frames_in = 0;
 
-        open_input_file(&input);
+        open_input_file(&input, &global);
 
         /* If the input file doesn't specify its w/h (raw files), try to get
          * the data from the first stream's configuration.
index d6adc33..3ce7a19 100644 (file)
@@ -86,6 +86,8 @@ wcap_decoder_get_frame(struct wcap_decoder *decoder)
                return 0;
 
        header = decoder->p;
+       decoder->msecs = header->msecs;
+       decoder->count++;
 
        rects = (void *) (header + 1);
        decoder->p = (uint32_t *) (rects + header->nrects);
@@ -121,6 +123,7 @@ wcap_decoder_create(const char *filename)
                
        header = decoder->map;
        decoder->format = header->format;
+       decoder->count = 0;
        decoder->width = header->width;
        decoder->height = header->height;
        decoder->p = header + 1;
index 8cf45d3..d630415 100644 (file)
@@ -51,6 +51,8 @@ struct wcap_decoder {
        void *map, *p, *end;
        uint32_t *frame;
        uint32_t format;
+       uint32_t msecs;
+       uint32_t count;
        int width, height;
 };