Mercurial > mplayer.hg
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; +}