implement changing duration of movies
Stefan Schuermans

Stefan Schuermans commited on 2014-05-10 16:16:11
Showing 3 changed files, with 60 additions and 2 deletions.

... ...
@@ -263,6 +263,8 @@ int main(int argCnt, char **args)
263 263
            "     reverse movie\n"
264 264
            "  -ct <begin> <end>\n"
265 265
            "     cut movie to time span from begin (in ms) till end (in ms)\n"
266
+           "  -dur <duration>\n"
267
+           "     adapt duration (in ms) of movie\n"
266 268
            "  -d <first> <count>\n"
267 269
            "     delete frames\n"
268 270
            "  -t <width>x<height>-<channels>/<colors> <test_mode> <duration>\n"
... ...
@@ -523,6 +525,22 @@ int main(int argCnt, char **args)
523 525
       } else
524 526
         printf("missing begin time for \"-ct\"\n");
525 527
     }
528
+    // adapt duration of movie
529
+    else if (strcmp(args[i], "-dur") == 0) {
530
+      if (i + 1 < argCnt) {
531
+        unsigned int duration;
532
+        i++;
533
+        if (sscanf(args[i], "%u", &duration) != 1)
534
+          printf("invalid duration \"%s\"\n", args[i]);
535
+        else if (pMovie == NULL)
536
+          printf("no movie loaded to adapt duration of\n");
537
+        else {
538
+          BlinkenMovieAdaptDuration(pMovie, duration);
539
+          printf("duration adapted to %u ms\n", duration);
540
+        }
541
+      } else
542
+        printf("missing new duration for movie for \"-dur\"\n");
543
+    }
526 544
     // delete frames
527 545
     else if (strcmp(args[i], "-d") == 0) {
528 546
       if (i + 2 < argCnt) {
... ...
@@ -540,8 +540,8 @@ void BlinkenMovieCutTime(stBlinkenMovie *pMovie,
540 540
   int frameCnt;
541 541
   stBlinkenFrame **ppNewFrames;
542 542
 
543
-  // do nothing if empty movie
544
-  if (pMovie->frameCnt < 1)
543
+  // do nothing if no movie or empty movie
544
+  if (pMovie == NULL || pMovie->frameCnt < 1)
545 545
     return;
546 546
 
547 547
   // get movie duration
... ...
@@ -626,6 +626,44 @@ void BlinkenMovieCutTime(stBlinkenMovie *pMovie,
626 626
   }
627 627
 }
628 628
 
629
+void BlinkenMovieAdaptDuration(stBlinkenMovie *pMovie,
630
+                               int duration /* in ms */)
631
+{
632
+  int old_duration, old_curtime, curtime;
633
+  int i, old_dur, dur, old_end, end;
634
+
635
+  // do nothing if no movie, empty movie or invalid duration
636
+  if (pMovie == NULL || pMovie->frameCnt < 1 || duration <= 0)
637
+    return;
638
+
639
+  // get movie duration
640
+  old_duration = 0;
641
+  for (i = 0; i < pMovie->frameCnt; i++)
642
+    old_duration += BlinkenFrameGetDuration(pMovie->ppFrames[i]);
643
+
644
+  // adapt duration of frames
645
+  old_curtime = 0;
646
+  curtime = 0;
647
+  for (i = 0; i < pMovie->frameCnt; i++) {
648
+    // get old end time of current frame
649
+    old_dur = BlinkenFrameGetDuration(pMovie->ppFrames[i]);
650
+    old_end = old_curtime + old_dur;
651
+    // compute new end time and new duration
652
+    end = (int)((double)old_end / (double)old_duration * (double)duration
653
+                + 0.5);
654
+    dur = end - curtime;
655
+    if (dur < BlinkenDurationMin)
656
+      dur = BlinkenDurationMin;
657
+    if (dur > BlinkenDurationMax)
658
+      dur = BlinkenDurationMax;
659
+    // update frame duration
660
+    BlinkenFrameSetDuration(pMovie->ppFrames[i], dur);
661
+    // advance time
662
+    old_curtime += old_dur;
663
+    curtime += dur;
664
+  }
665
+}
666
+
629 667
 void BlinkenMovieResize(stBlinkenMovie *pMovie, int height, int width,
630 668
                         int channels, int maxval)
631 669
 {
... ...
@@ -62,6 +62,8 @@ int BlinkenMovieConcat(stBlinkenMovie *pMovie,
62 62
 void BlinkenMovieReverse(stBlinkenMovie *pMovie);
63 63
 void BlinkenMovieCutTime(stBlinkenMovie *pMovie,
64 64
                          int begin /* in ms */, int end /* in ms */);
65
+void BlinkenMovieAdaptDuration(stBlinkenMovie *pMovie,
66
+                               int duration /* in ms */);
65 67
 
66 68
 void BlinkenMovieResize(stBlinkenMovie *pMovie, int height, int width,
67 69
                         int channels, int maxval);
68 70