]> git.sesse.net Git - nageru/commitdiff
Also show the frame rate.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 30 Dec 2015 13:15:30 +0000 (14:15 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 30 Dec 2015 13:15:30 +0000 (14:15 +0100)
mixer.cpp
pbo_frame_allocator.h
theme.cpp
theme.lua

index e46d918d6d8421312725dfc872d5730cd5010bc0..61050067b7b9dd60c652a855336eea54f68dec9d 100644 (file)
--- 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.
index fa75f8a615b42bec7f2e1fbbd9babe78475519c1..afb20a19268cb1c9785de8cb060d93db3da0d629 100644 (file)
@@ -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:
index 023b02a4650927de1dd457e638c0b67994fb7209..7bfe6cf57f555cece42fe9d34a1337a9bae11d38 100644 (file)
--- 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 }
 };
 
index 1f00d52165aa4b7d5be0c042bd8028da734f4e5f..efd2280c93e0802b4b8f662c1adb9660b422147e 100644 (file)
--- 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