]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 9 Jan 2011 12:50:19 +0000 (12:50 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 9 Jan 2011 12:50:19 +0000 (12:50 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@322 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/utility/timer.h
core/consumer/bluefish/util.h
core/consumer/decklink/util.h
core/format/video_format.cpp
core/format/video_format.h
core/producer/flash/FlashAxContainer.cpp
core/producer/flash/FlashAxContainer.h
core/producer/flash/flash_producer.cpp

index f026f1f9dbbd75bf47bd51c81d13db39573f0481..a5d0d965b38224b8c05ebe40554e6f94b5241bde 100644 (file)
@@ -7,22 +7,27 @@ namespace caspar {
 class timer\r
 {\r
 public:\r
-       timer(int fps = 25) : fps_(fps)\r
+       timer(double fps = 25.0) : fps_(fps)\r
        {\r
                QueryPerformanceFrequency(&freq_);\r
                time_.QuadPart = 0;\r
        }\r
-               \r
+\r
+       void wait()\r
+       {\r
+               wait(fps_);\r
+       }\r
+\r
        // Author: Ryan M. Geiss\r
        // http://www.geisswerks.com/ryan/FAQS/timing.html\r
-       void wait()\r
+       void wait(double fps)\r
        {       \r
                LARGE_INTEGER t;\r
                QueryPerformanceCounter(&t);\r
 \r
                if (time_.QuadPart != 0)\r
                {\r
-                       int ticks_to_wait = static_cast<int>(freq_.QuadPart / fps_);\r
+                       int ticks_to_wait = static_cast<int>(static_cast<double>(freq_.QuadPart) / fps);\r
                        int done = 0;\r
                        do\r
                        {\r
@@ -56,10 +61,12 @@ public:
 \r
                time_ = t;\r
        }\r
+               \r
 private:\r
+       \r
        LARGE_INTEGER freq_;\r
        LARGE_INTEGER time_;\r
-       int fps_;\r
+       double fps_;\r
 };\r
 \r
 }
\ No newline at end of file
index cf53a3d149a9759ce38b0a8bb7950386e858f683..5924468c5f1f1ea76956a1d0d53fb0ad0f2e1958 100644 (file)
@@ -22,20 +22,20 @@ inline EVideoMode vid_fmt_from_video_format(const video_format::type& fmt)
        switch(fmt)\r
        {\r
        case video_format::pal:                 return VID_FMT_PAL;\r
-       case video_format::ntsc:                return VID_FMT_NTSC;\r
+       //case video_format::ntsc:              return VID_FMT_NTSC;\r
        case video_format::x576p2500:   return VID_FMT_INVALID; //not supported\r
        case video_format::x720p2500:   return VID_FMT_720P_2500;\r
        case video_format::x720p5000:   return VID_FMT_720P_5000;\r
-       case video_format::x720p5994:   return VID_FMT_720P_5994;\r
-       case video_format::x720p6000:   return VID_FMT_720P_6000;\r
-       case video_format::x1080p2397:  return VID_FMT_1080P_2397;\r
-       case video_format::x1080p2400:  return VID_FMT_1080P_2400;\r
+       //case video_format::x720p5994: return VID_FMT_720P_5994;\r
+       //case video_format::x720p6000: return VID_FMT_720P_6000;\r
+       //case video_format::x1080p2397:        return VID_FMT_1080P_2397;\r
+       //case video_format::x1080p2400:        return VID_FMT_1080P_2400;\r
        case video_format::x1080i5000:  return VID_FMT_1080I_5000;\r
-       case video_format::x1080i5994:  return VID_FMT_1080I_5994;\r
-       case video_format::x1080i6000:  return VID_FMT_1080I_6000;\r
+       //case video_format::x1080i5994:        return VID_FMT_1080I_5994;\r
+       //case video_format::x1080i6000:        return VID_FMT_1080I_6000;\r
        case video_format::x1080p2500:  return VID_FMT_1080P_2500;\r
-       case video_format::x1080p2997:  return VID_FMT_1080P_2997;\r
-       case video_format::x1080p3000:  return VID_FMT_1080P_3000;\r
+       //case video_format::x1080p2997:        return VID_FMT_1080P_2997;\r
+       //case video_format::x1080p3000:        return VID_FMT_1080P_3000;\r
        default:                                                return VID_FMT_INVALID;\r
        }\r
 }\r
index 62e7989d6450729b28b9d3ac6d92a458870a0bd6..f8380aadda0e26c99d4ba410e9026f5110f49468 100644 (file)
@@ -11,19 +11,19 @@ namespace caspar { namespace core { namespace decklink {
                switch(fmt)\r
                {\r
                case video_format::pal:                 return bmdModePAL;\r
-               case video_format::ntsc:                return bmdModeNTSC;\r
+               //case video_format::ntsc:              return bmdModeNTSC;\r
                case video_format::x576p2500:   return ULONG_MAX;       //not supported\r
                case video_format::x720p5000:   return bmdModeHD720p50;\r
-               case video_format::x720p5994:   return bmdModeHD720p5994;\r
-               case video_format::x720p6000:   return bmdModeHD720p60;\r
-               case video_format::x1080p2397:  return bmdModeHD1080p2398;\r
-               case video_format::x1080p2400:  return bmdModeHD1080p24;\r
+               //case video_format::x720p5994: return bmdModeHD720p5994;\r
+               //case video_format::x720p6000: return bmdModeHD720p60;\r
+               //case video_format::x1080p2397:        return bmdModeHD1080p2398;\r
+               //case video_format::x1080p2400:        return bmdModeHD1080p24;\r
                case video_format::x1080i5000:  return bmdModeHD1080i50;\r
-               case video_format::x1080i5994:  return bmdModeHD1080i5994;\r
-               case video_format::x1080i6000:  return bmdModeHD1080i6000;\r
+               //case video_format::x1080i5994:        return bmdModeHD1080i5994;\r
+               //case video_format::x1080i6000:        return bmdModeHD1080i6000;\r
                case video_format::x1080p2500:  return bmdModeHD1080p25;\r
-               case video_format::x1080p2997:  return bmdModeHD1080p2997;\r
-               case video_format::x1080p3000:  return bmdModeHD1080p30;\r
+               //case video_format::x1080p2997:        return bmdModeHD1080p2997;\r
+               //case video_format::x1080p3000:        return bmdModeHD1080p30;\r
                default:                                                return ULONG_MAX;\r
                }\r
        }\r
index 915716d1ddcfe29f517ccd4481b3cb9ab38508b2..65b2bda1411ff2e55e0a9b0a1ed0ccce1ad0f4dd 100644 (file)
 \r
 #include <array>\r
 \r
-#define DEFINE_VIDEOFORMATDESC(w, h, m, f, s, fmt) { (fmt), (w), (h), (m), (f), (1.0/(m == video_mode::progressive ? f : f/2.0)), ((w)*(h)*4), (s) }\r
+#define DEFINE_VIDEOFORMATDESC(w, h, m, f, s, fmt) { (fmt), (w), (h), (m), (f), (m == video_mode::progressive ? f : f/2.0), (1.0/(m == video_mode::progressive ? f : f/2.0)), ((w)*(h)*4), (s) }\r
 \r
 namespace caspar { namespace core {\r
        \r
 const video_format_desc format_descs[video_format::invalid] =  \r
 {                                                                         \r
        DEFINE_VIDEOFORMATDESC(720,  576,  video_mode::upper,                   50,                     TEXT("PAL"),            video_format::pal               ), \r
-       DEFINE_VIDEOFORMATDESC(720,  486,  video_mode::lower,                   60/1.001,       TEXT("NTSC"),           video_format::ntsc              ), \r
+       //DEFINE_VIDEOFORMATDESC(720,  486,  video_mode::lower,                 60/1.001,       TEXT("NTSC"),           video_format::ntsc              ), \r
        DEFINE_VIDEOFORMATDESC(720,  576,  video_mode::progressive,             25,                     TEXT("576p2500"),       video_format::x576p2500 ),\r
        DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             25,                     TEXT("720p2500"),       video_format::x720p2500 ), \r
        DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             50,                     TEXT("720p5000"),       video_format::x720p5000 ), \r
-       DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             60/1.001,       TEXT("720p5994"),       video_format::x720p5994 ),\r
-       DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             60,                     TEXT("720p6000"),       video_format::x720p6000 ),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             24/1.001,       TEXT("1080p2397"),      video_format::x1080p2397),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             24,                     TEXT("1080p2400"),      video_format::x1080p2400),\r
+       //DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,   60/1.001,       TEXT("720p5994"),       video_format::x720p5994 ),\r
+       //DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,   60,                     TEXT("720p6000"),       video_format::x720p6000 ),\r
+       //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   24/1.001,       TEXT("1080p2397"),      video_format::x1080p2397),\r
+       //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   24,                     TEXT("1080p2400"),      video_format::x1080p2400),\r
        DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                   50,                     TEXT("1080i5000"),      video_format::x1080i5000),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                   60/1.001,       TEXT("1080i5994"),      video_format::x1080i5994),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                   60,                     TEXT("1080i6000"),      video_format::x1080i6000),\r
+       //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                 60/1.001,       TEXT("1080i5994"),      video_format::x1080i5994),\r
+       //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                 60,                     TEXT("1080i6000"),      video_format::x1080i6000),\r
        DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             25,                     TEXT("1080p2500"),      video_format::x1080p2500),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             30/1.001,       TEXT("1080p2997"),      video_format::x1080p2997),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             30,                     TEXT("1080p3000"),      video_format::x1080p3000),\r
+       //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   30/1.001,       TEXT("1080p2997"),      video_format::x1080p2997),\r
+       //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   30,                     TEXT("1080p3000"),      video_format::x1080p3000),\r
        DEFINE_VIDEOFORMATDESC(0,               0, video_mode::invalid,                 -1,                     TEXT("invalid"),        video_format::invalid)\r
 };\r
 \r
index 9c6605ea202ea97b12c4726a4c446263ea8f7c65..340da6c4c981a1d27ca65f150760eb680c9cf32c 100644 (file)
@@ -11,20 +11,20 @@ struct video_format
        enum type\r
        {\r
                pal = 0,\r
-               ntsc,\r
+               //ntsc,\r
                x576p2500,\r
                x720p2500,\r
                x720p5000,\r
-               x720p5994,\r
-               x720p6000,\r
-               x1080p2397,\r
-               x1080p2400,\r
+               //x720p5994,\r
+               //x720p6000,\r
+               //x1080p2397,\r
+               //x1080p2400,\r
                x1080i5000,\r
-               x1080i5994,\r
-               x1080i6000,\r
+               //x1080i5994,\r
+               //x1080i6000,\r
                x1080p2500,\r
-               x1080p2997,\r
-               x1080p3000,\r
+               //x1080p2997,\r
+               //x1080p3000,\r
                count,\r
                invalid\r
        };\r
@@ -50,7 +50,8 @@ struct video_format_desc
        size_t                                  height;\r
        video_mode::type                mode;\r
        double                                  fps;\r
-       double                                  period;\r
+       double                                  actual_fps;\r
+       double                                  actual_interval;\r
        size_t                                  size;\r
        std::wstring                    name;\r
 \r
index cdb7641a3a56335558395a2cc572b4afc6fe9b55..21022798607fb2f598a86dcd04fbdb11e7452aac 100644 (file)
@@ -574,11 +574,11 @@ HRESULT STDMETHODCALLTYPE FlashAxContainer::GetTime(/* [out] */ VARIANT *pvtime)
        return S_OK;\r
 }\r
 \r
-int FlashAxContainer::GetFPS() {\r
+double FlashAxContainer::GetFPS() {\r
        if(pTimerHelper != 0 && pTimerHelper->interval > 0)\r
-               return (1000 / pTimerHelper->interval);\r
+               return (1000.0 / static_cast<double>(pTimerHelper->interval));\r
        \r
-       return 0;\r
+       return 0.0;\r
 }\r
 \r
 bool FlashAxContainer::IsReadyToRender() const {\r
index ccc01c3b9e474c9d2a95ce06b9df42fffe3fd29f..464b2dcb47bf91d994f22c8c6337952623518927 100644 (file)
@@ -232,7 +232,7 @@ public:
        STDMETHOD(Unadvise)(DWORD dwCookie);\r
        STDMETHOD(Freeze)(BOOL fFreeze);\r
        STDMETHOD(GetTime)(VARIANT *pvtime);\r
-       int GetFPS();\r
+       double GetFPS();\r
 \r
        HRESULT CreateAxControl();\r
        void DestroyAxControl();\r
index b035e6cbb66be9bdce2b5251468e103b347fece6..c4d15bbaf8e1d02b26765074fb1a161eee4afdf3 100644 (file)
@@ -34,6 +34,7 @@
 #include "../../processor/frame_processor_device.h"\r
 \r
 #include <common/concurrency/executor.h>\r
+#include <common/utility/timer.h>\r
 \r
 #include <boost/filesystem.hpp>\r
 \r
@@ -109,13 +110,14 @@ public:
 \r
                auto frame = render_simple_frame();\r
                \r
-               auto running_fps = ax_->GetFPS();\r
-               auto target_fps = static_cast<int>(format_desc_.mode == video_mode::progressive ? format_desc_.fps : format_desc_.fps/2.0);\r
+               auto running_fps = static_cast<int>(ax_->GetFPS());\r
+               auto target_fps = static_cast<int>(format_desc_.actual_fps);\r
                if(target_fps < running_fps)\r
                        frame = draw_frame::interlace(frame, render_simple_frame(), format_desc_.mode);\r
                return frame;\r
        }\r
-                       \r
+               \r
+       timer timer_;\r
        std::wstring print() const{ return L"flash[" + boost::filesystem::wpath(filename_).filename() + L"] Render thread"; }\r
        std::string bprint() const{ return narrow(print()); }\r
 \r
@@ -123,6 +125,8 @@ private:
 \r
        safe_ptr<draw_frame> render_simple_frame()\r
        {\r
+               timer_.wait(ax_->GetFPS()); // Tick doesnt work on nested timelines, force an actual sync\r
+\r
                ax_->Tick();\r
 \r
                if(ax_->InvalidRect())\r
@@ -185,18 +189,20 @@ struct flash_producer::implementation
                {\r
                        executor_.begin_invoke([=]\r
                        {\r
-                               auto frame = draw_frame::empty();\r
+                               if(!renderer_)\r
+                                       return;\r
+\r
                                try\r
                                {\r
-                                       if(renderer_)\r
-                                               frame = renderer_->render_frame();\r
+                                       auto frame = draw_frame::empty();\r
+                                       do{frame = renderer_->render_frame();}\r
+                                       while(frame_buffer_.try_push(frame) && frame == draw_frame::empty());\r
                                }\r
                                catch(...)\r
                                {\r
                                        CASPAR_LOG_CURRENT_EXCEPTION();\r
                                        renderer_ = nullptr;\r
                                }\r
-                               frame_buffer_.try_push(frame);\r
                        });     \r
                }                               \r
                return tail_;\r