From 5e01b03ee7850241a15f74e160ebbe2b8ad9b9ea Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 30 Dec 2015 14:15:30 +0100 Subject: [PATCH] Also show the frame rate. --- mixer.cpp | 2 ++ pbo_frame_allocator.h | 1 + theme.cpp | 25 +++++++++++++++++++++++++ theme.lua | 24 ++++++++++++++++++++---- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/mixer.cpp b/mixer.cpp index e46d918..6105006 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -353,6 +353,8 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode, clock_gettime(CLOCK_MONOTONIC, &frame_upload_start); } userdata->last_interlaced = interlaced; + userdata->last_frame_rate_nom = frame_rate_nom; + userdata->last_frame_rate_den = frame_rate_den; RefCountedFrame new_frame(video_frame); // Upload the textures. diff --git a/pbo_frame_allocator.h b/pbo_frame_allocator.h index fa75f8a..afb20a1 100644 --- a/pbo_frame_allocator.h +++ b/pbo_frame_allocator.h @@ -33,6 +33,7 @@ public: GLuint tex_y[2], tex_cbcr[2]; GLuint last_width[2], last_height[2]; bool last_interlaced; + unsigned last_frame_rate_nom, last_frame_rate_den; }; private: diff --git a/theme.cpp b/theme.cpp index 023b02a..7bfe6cf 100644 --- a/theme.cpp +++ b/theme.cpp @@ -46,6 +46,7 @@ struct InputStateInfo { unsigned last_width[MAX_CARDS], last_height[MAX_CARDS]; bool last_interlaced[MAX_CARDS]; + unsigned last_frame_rate_nom[MAX_CARDS], last_frame_rate_den[MAX_CARDS]; }; InputStateInfo::InputStateInfo(const InputState &input_state) @@ -61,6 +62,8 @@ InputStateInfo::InputStateInfo(const InputState &input_state) last_width[signal_num] = userdata->last_width[frame.field_number]; last_height[signal_num] = userdata->last_height[frame.field_number]; last_interlaced[signal_num] = userdata->last_interlaced; + last_frame_rate_nom[signal_num] = userdata->last_frame_rate_nom; + last_frame_rate_den[signal_num] = userdata->last_frame_rate_den; } } @@ -327,6 +330,26 @@ int InputStateInfo_get_interlaced(lua_State* L) return 1; } +int InputStateInfo_get_frame_rate_nom(lua_State* L) +{ + assert(lua_gettop(L) == 2); + InputStateInfo *input_state_info = get_input_state_info(L, 1); + Theme *theme = get_theme_updata(L); + int signal_num = theme->map_signal(luaL_checknumber(L, 2)); + lua_pushnumber(L, input_state_info->last_frame_rate_nom[signal_num]); + return 1; +} + +int InputStateInfo_get_frame_rate_den(lua_State* L) +{ + assert(lua_gettop(L) == 2); + InputStateInfo *input_state_info = get_input_state_info(L, 1); + Theme *theme = get_theme_updata(L); + int signal_num = theme->map_signal(luaL_checknumber(L, 2)); + lua_pushnumber(L, input_state_info->last_frame_rate_den[signal_num]); + return 1; +} + int Effect_set_float(lua_State *L) { assert(lua_gettop(L) == 3); @@ -473,6 +496,8 @@ const luaL_Reg InputStateInfo_funcs[] = { { "get_width", InputStateInfo_get_width }, { "get_height", InputStateInfo_get_height }, { "get_interlaced", InputStateInfo_get_interlaced }, + { "get_frame_rate_nom", InputStateInfo_get_frame_rate_nom }, + { "get_frame_rate_den", InputStateInfo_get_frame_rate_den }, { NULL, NULL } }; diff --git a/theme.lua b/theme.lua index 1f00d52..efd2280 100644 --- a/theme.lua +++ b/theme.lua @@ -247,16 +247,30 @@ function num_channels() return 4 end --- Helper function to write e.g. “720p”. +-- Helper function to write e.g. “60” or “59.94”. +function get_frame_rate(signal_num) + local nom = last_resolution[signal_num].frame_rate_nom + local den = last_resolution[signal_num].frame_rate_den + if last_resolution[signal_num].interlaced then + nom = nom * 2 + end + if nom % den == 0 then + return nom / den + else + return string.format("%.2f", num / den) + end +end + +-- Helper function to write e.g. “720p60”. function get_channel_resolution(signal_num) if last_resolution[signal_num] then if last_resolution[signal_num].height == 0 or last_resolution[signal_num].height == 525 then return "no signal" elseif last_resolution[signal_num].interlaced then - return (last_resolution[signal_num].height * 2) .. "i" + return (last_resolution[signal_num].height * 2) .. "i" .. get_frame_rate(signal_num) else - return last_resolution[signal_num].height .. "p" + return last_resolution[signal_num].height .. "p" .. get_frame_rate(signal_num) end else return "no signal" @@ -454,7 +468,9 @@ function get_chain(num, t, width, height, signals) last_resolution[signal_num] = { width = signals:get_width(signal_num), height = signals:get_height(signal_num), - interlaced = signals:get_interlaced(signal_num) + interlaced = signals:get_interlaced(signal_num), + frame_rate_nom = signals:get_frame_rate_nom(signal_num), + frame_rate_den = signals:get_frame_rate_den(signal_num) } end -- 2.39.2