From f4f4fa7a803d13ebdd6778b1fb4625e80e6e4e5e Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 5 Apr 2016 16:34:33 +0200 Subject: [PATCH] Testcard: accept convenient FPS+suffix format Allow something like 'testcard:1920:1080:50i:UYVY' instead of less convenient 'testcard:1920:1080:25:UYVY:i' (which is now deprecated). --- src/video_capture/testcard.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/video_capture/testcard.cpp b/src/video_capture/testcard.cpp index 8fb1462a9..c06e09ea1 100644 --- a/src/video_capture/testcard.cpp +++ b/src/video_capture/testcard.cpp @@ -78,7 +78,7 @@ #define BUFFER_SEC 1 #define AUDIO_BUFFER_SIZE (AUDIO_SAMPLE_RATE * AUDIO_BPS * \ audio_capture_channels * BUFFER_SEC) -#define DEFAULT_FORMAT "1920:1080:25:UYVY:i" +#define DEFAULT_FORMAT "1920:1080:50i:UYVY" using namespace std; @@ -320,6 +320,7 @@ static int vidcap_testcard_init(const struct vidcap_params *params, void **state return VIDCAP_INIT_FAIL; s->frame = vf_alloc(1); + s->frame->interlacing = PROGRESSIVE; char *fmt = strdup(vidcap_params_get_fmt(params)); char *tmp; @@ -349,7 +350,20 @@ static int vidcap_testcard_init(const struct vidcap_params *params, void **state goto error; } - s->frame->fps = atof(tmp); + char *endptr; + s->frame->fps = strtod(tmp, &endptr); + if (endptr[0] != '\0') { // optional interlacing suffix + s->frame->interlacing = get_interlacing_from_suffix(endptr); + if (s->frame->interlacing != PROGRESSIVE && + s->frame->interlacing != SEGMENTED_FRAME && + s->frame->interlacing != INTERLACED_MERGED) { // tff or bff + log_msg(LOG_LEVEL_ERROR, "Unsuppored interlacing format!\n"); + goto error; + } + if (s->frame->interlacing == INTERLACED_MERGED) { + s->frame->fps /= 2; + } + } tmp = strtok_r(NULL, ":", &save_ptr); if (!tmp) { @@ -397,7 +411,6 @@ static int vidcap_testcard_init(const struct vidcap_params *params, void **state rect_size = (vf_get_tile(s->frame, 0)->width + rect_size - 1) / rect_size; s->frame_linesize = aligned_x * bpp; - s->frame->interlacing = PROGRESSIVE; s->size = aligned_x * vf_get_tile(s->frame, 0)->height * bpp; filename = NULL; @@ -441,8 +454,10 @@ static int vidcap_testcard_init(const struct vidcap_params *params, void **state strip_fmt = tmp; } else if (strcmp(tmp, "i") == 0) { s->frame->interlacing = INTERLACED_MERGED; + log_msg(LOG_LEVEL_WARNING, "[testcard] Deprecated 'i' option. Use format testcard:1920:1080:50i:UYVY instead!\n"); } else if (strcmp(tmp, "sf") == 0) { s->frame->interlacing = SEGMENTED_FRAME; + log_msg(LOG_LEVEL_WARNING, "[testcard] Deprecated 'sf' option. Use format testcard:1920:1080:25sf:UYVY instead!\n"); } else if (strcmp(tmp, "still") == 0) { s->still_image = TRUE; } else if (strncmp(tmp, "pattern=", strlen("pattern=")) == 0) {