diff libmpcodecs/ve.c @ 32476:af9ef007bec6

Add the -force-key-frames option.
author cigaes
date Fri, 29 Oct 2010 13:50:05 +0000
parents 4614728cab25
children
line wrap: on
line diff
--- a/libmpcodecs/ve.c	Fri Oct 29 13:48:12 2010 +0000
+++ b/libmpcodecs/ve.c	Fri Oct 29 13:50:05 2010 +0000
@@ -26,6 +26,7 @@
 #include "img_format.h"
 #include "mp_image.h"
 #include "vf.h"
+#include "ve.h"
 
 extern const vf_info_t ve_info_lavc;
 extern const vf_info_t ve_info_vfw;
@@ -73,3 +74,56 @@
     char* vf_args[] = { "_oldargs_", args, NULL };
     return vf_open_plugin(encoder_list,next,name,vf_args);
 }
+
+static double *forced_key_frames_ts;
+static int forced_key_frames_number;
+static int forced_key_frames_idx;
+
+int parse_forced_key_frames(const m_option_t *opt, const char *arg)
+{
+    double ts;
+    const char *p;
+    int nts = 1, idx = 0, len;
+
+    for (p = arg; *p; p++)
+        nts += *p == ',';
+    free(forced_key_frames_ts);
+    forced_key_frames_ts = calloc(sizeof(*forced_key_frames_ts), nts);
+    p = arg;
+    while (1) {
+        len = parse_timestring(p, &ts, ',');
+        if (!len) {
+            mp_msg(MSGT_CFGPARSER, MSGL_ERR,
+                   "Option force-key-frames: invalid time: '%s'\n", p);
+            return M_OPT_INVALID;
+        }
+        forced_key_frames_ts[idx++] = ts;
+        if (!p[len])
+            break;
+        p += len + 1;
+    }
+    forced_key_frames_number = idx;
+    forced_key_frames_idx = 0;
+    for (idx = 1; idx < forced_key_frames_number; idx++) {
+        if (forced_key_frames_ts[idx - 1] >= forced_key_frames_ts[idx]) {
+            mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option force-key-frames: "
+                   "timestamps are not in ascending order\n");
+            return M_OPT_INVALID;
+        }
+    }
+    return 0;
+}
+
+int is_forced_key_frame(double pts)
+{
+    if (forced_key_frames_idx < forced_key_frames_number &&
+        pts >= forced_key_frames_ts[forced_key_frames_idx]) {
+        forced_key_frames_idx++;
+        if (forced_key_frames_idx >= forced_key_frames_number) {
+            free(forced_key_frames_ts);
+            forced_key_frames_number = 0;
+        }
+        return 1;
+    }
+    return 0;
+}