]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Added audio info to video_format.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 11 May 2011 18:42:41 +0000 (18:42 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 11 May 2011 18:42:41 +0000 (18:42 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@716 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/video_format.cpp
core/video_format.h
modules/decklink/consumer/decklink_consumer.cpp
shell/caspar.config

index 2118fda336c86b4eb08958a6bdadec80fb5b2771..d695d589342af6fe6688ce53520c89d6fee0f13b 100644 (file)
        (duration),\\r
        (m == video_mode::progressive ? 1 : 2),\\r
        ((w)*(h)*4),\\r
-       (name)\\r
+       (name),\\r
+       (2),\\r
+       (48000),\\r
+       (2),\\r
+       (static_cast<size_t>(48000.0*2.0/((double)scale/(double)duration)))\\r
 }\r
 \r
 namespace caspar { namespace core {\r
@@ -60,7 +64,7 @@ const video_format_desc format_descs[video_format::count] =
        DEFINE_VIDEOFORMATDESC(video_format::x1080p2997 ,1920, 1080, video_mode::progressive,   30000,  1001,   TEXT("1080p2997")),\r
        DEFINE_VIDEOFORMATDESC(video_format::x1080p3000 ,1920, 1080, video_mode::progressive,   30,             1,              TEXT("1080p3000")),\r
        DEFINE_VIDEOFORMATDESC(video_format::x1080p5000 ,1920, 1080, video_mode::progressive,   50,             1,              TEXT("1080p5000")),\r
-       DEFINE_VIDEOFORMATDESC(video_format::invalid    ,0,             0, video_mode::invalid,                 0,              1,              TEXT("invalid"))\r
+       DEFINE_VIDEOFORMATDESC(video_format::invalid    ,0,             0, video_mode::invalid,                 1,              1,              TEXT("invalid"))\r
 };\r
 \r
 const video_format_desc& video_format_desc::get(video_format::type format)     \r
index 2c7ba699ababac0cdfa910f48b0a8339438579dc..7fdcfcf882e32503be2129d836871814be2d50c2 100644 (file)
@@ -77,6 +77,11 @@ struct video_format_desc
        size_t                                  size;           // output frame size in bytes \r
        std::wstring                    name;           // name of output format\r
 \r
+       size_t                                  audio_bytes_per_sample;\r
+       size_t                                  audio_sample_rate;\r
+       size_t                                  audio_channels;\r
+       size_t                                  audio_samples_per_frame;\r
+\r
        static const video_format_desc& get(video_format::type format);\r
        static const video_format_desc& get(const std::wstring& name);\r
 };\r
index 5218dc834c757afa5532310c3c13d5db6ea03514..ffeaa07f093bc856c522886cd273aac8311c4501 100644 (file)
@@ -26,8 +26,6 @@
 \r
 #include "../interop/DeckLinkAPI_h.h"\r
 \r
-#include <core/video_format.h>\r
-\r
 #include <core/consumer/frame/read_frame.h>\r
 \r
 #include <common/concurrency/com_context.h>\r
 #include <boost/circular_buffer.hpp>\r
 #include <boost/timer.hpp>\r
 \r
-#include <vector>\r
-\r
-#pragma warning(push)\r
-#pragma warning(disable : 4996)\r
-\r
-       #include <atlbase.h>\r
-\r
-       #include <atlcom.h>\r
-       #include <atlhost.h>\r
-\r
-#pragma warning(push)\r
-\r
 namespace caspar { \r
        \r
 enum key\r
@@ -71,9 +57,9 @@ enum latency
 \r
 struct configuration\r
 {\r
-       size_t device_index;\r
-       bool embedded_audio;\r
-       key keyer;\r
+       size_t  device_index;\r
+       bool    embedded_audio;\r
+       key             keyer;\r
        latency latency;\r
        \r
        configuration()\r
@@ -85,8 +71,8 @@ struct configuration
 \r
 class decklink_frame_adapter : public IDeckLinkVideoFrame\r
 {\r
-       safe_ptr<const core::read_frame> frame_;\r
-       core::video_format_desc format_desc_;\r
+       const safe_ptr<const core::read_frame>  frame_;\r
+       const core::video_format_desc                   format_desc_;\r
 public:\r
        decklink_frame_adapter(const safe_ptr<const core::read_frame>& frame, const core::video_format_desc& format_desc)\r
                : frame_(frame)\r
@@ -144,7 +130,6 @@ struct decklink_consumer : public IDeckLinkVideoOutputCallback, public IDeckLink
        std::shared_ptr<diagnostics::graph> graph_;\r
        boost::timer tick_timer_;\r
 \r
-\r
 public:\r
        decklink_consumer(const configuration& config, const core::video_format_desc& format_desc) \r
                : config_(config)\r
@@ -185,10 +170,7 @@ public:
                if(config.embedded_audio)\r
                        output_->BeginAudioPreroll();\r
                else\r
-               {\r
-                       if(FAILED(output_->StartScheduledPlayback(0, format_desc_.time_scale, 1.0))) \r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Failed to schedule playback."));\r
-               }\r
+                       start_playback();\r
                \r
                CASPAR_LOG(info) << print() << L" Buffer depth: " << buffer_size_;              \r
                CASPAR_LOG(info) << print() << L" Successfully initialized for " << format_desc_.name;  \r
@@ -270,6 +252,12 @@ public:
                if(FAILED(output_->SetScheduledFrameCompletionCallback(this)))\r
                        BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Failed to set playback completion callback."));\r
        }\r
+\r
+       void start_playback()\r
+       {\r
+               if(FAILED(output_->StartScheduledPlayback(0, format_desc_.time_scale, 1.0))) \r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Failed to schedule playback."));\r
+       }\r
        \r
        STDMETHOD (QueryInterface(REFIID, LPVOID*))     {return E_NOINTERFACE;}\r
        STDMETHOD_(ULONG, AddRef())                                     {return 1;}\r
@@ -289,10 +277,10 @@ public:
                        else if(result == bmdOutputFrameFlushed)\r
                                graph_->add_tag("flushed-frame");\r
 \r
-                       frame_container_.erase(std::remove_if(frame_container_.begin(), frame_container_.end(), [&](const decklink_frame_adapter& frame)\r
+                       frame_container_.erase(std::find_if(frame_container_.begin(), frame_container_.end(), [&](const decklink_frame_adapter& frame)\r
                        {\r
                                return &frame == completed_frame;\r
-                       }), frame_container_.end());\r
+                       }));\r
 \r
                        std::shared_ptr<const core::read_frame> frame;  \r
                        video_frame_buffer_.pop(frame);         \r
@@ -321,15 +309,12 @@ public:
                \r
                try\r
                {\r
-                       if(preroll)\r
-                       {\r
-                               if(FAILED(output_->StartScheduledPlayback(0, format_desc_.time_scale, 1.0)))\r
-                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Failed to schedule playback."));\r
-                       }\r
-\r
                        std::shared_ptr<const core::read_frame> frame;\r
                        audio_frame_buffer_.pop(frame);\r
                        schedule_next_audio(safe_ptr<const core::read_frame>(frame));           \r
+\r
+                       if(preroll)\r
+                               start_playback();\r
                }\r
                catch(...)\r
                {\r
@@ -343,13 +328,14 @@ public:
        void schedule_next_audio(const safe_ptr<const core::read_frame>& frame)\r
        {\r
                static std::vector<short> silence(48000, 0);\r
+               \r
+               const int sample_count = format_desc_.audio_samples_per_frame;\r
+               const int sample_frame_count = sample_count/2;\r
 \r
-               int audio_samples = static_cast<size_t>(48000.0 / format_desc_.fps)*2; // Audio samples per channel\r
-\r
-               const short* frame_audio_data = frame->audio_data().size() == audio_samples ? frame->audio_data().begin() : silence.data();\r
-               audio_container_.push_back(std::vector<short>(frame_audio_data, frame_audio_data+audio_samples));\r
+               const short* frame_audio_data = frame->audio_data().size() == sample_count ? frame->audio_data().begin() : silence.data();\r
+               audio_container_.push_back(std::vector<short>(frame_audio_data, frame_audio_data+sample_count));\r
 \r
-               if(FAILED(output_->ScheduleAudioSamples(audio_container_.back().data(), audio_samples/2, (audio_scheduled_++) * audio_samples/2, 48000, nullptr)))\r
+               if(FAILED(output_->ScheduleAudioSamples(audio_container_.back().data(), sample_frame_count, (audio_scheduled_++) * sample_frame_count, format_desc_.audio_sample_rate, nullptr)))\r
                        CASPAR_LOG(error) << print() << L" Failed to schedule audio.";\r
        }\r
                        \r
index adb9044ea91e05d0f9443a5bd1f69de2a6d26e8f..79dea1f438376caec9b58b500cb42055a0ea9f51 100644 (file)
@@ -12,7 +12,7 @@
   </diagnostics>\r
   <channels>\r
     <channel>\r
-      <videomode>PAL</videomode>\r
+      <videomode>1080i5000</videomode>\r
       <consumers>\r
         <decklink>\r
           <device>1</device>\r