\r
// Author: Ryan M. Geiss\r
// http://www.geisswerks.com/ryan/FAQS/timing.html\r
- void wait(double fps)\r
+ void tick(double interval)\r
{ \r
LARGE_INTEGER t;\r
QueryPerformanceCounter(&t);\r
\r
if (time_.QuadPart != 0)\r
{\r
- int ticks_to_wait = static_cast<int>(static_cast<double>(freq_.QuadPart) / fps);\r
+ int ticks_to_wait = static_cast<int>(static_cast<double>(freq_.QuadPart) * interval);\r
int done = 0;\r
do\r
{\r
CASPAR_LOG(error) << "BLUECARD ERROR: Failed to disable video output. (device " << device_index_ << TEXT(")"); \r
}\r
\r
- void send(const safe_ptr<const read_frame>& frame)\r
+ virtual void send(const safe_ptr<const read_frame>& frame)\r
{ \r
static std::vector<short> silence(MAX_HANC_BUFFER_SIZE, 0);\r
\r
});\r
}\r
\r
- size_t buffer_depth() const\r
- {\r
- return 1;\r
- }\r
+ virtual size_t buffer_depth() const{return 1;}\r
\r
void encode_hanc(BLUE_UINT32* hanc_data, void* audio_data, size_t audio_samples, size_t audio_nchannels)\r
{ \r
std::rotate(reserved_frames_.begin(), reserved_frames_.begin() + 1, reserved_frames_.end());\r
}\r
\r
- void send(const safe_ptr<const read_frame>& frame)\r
+ virtual void send(const safe_ptr<const read_frame>& frame)\r
{\r
video_frame_buffer_.push(frame);\r
if(embed_audio_)\r
audio_frame_buffer_.push(frame);\r
}\r
\r
- size_t buffer_depth() const\r
+ virtual size_t buffer_depth() const\r
{\r
return 1;\r
}\r
}\r
}\r
\r
- clock_.wait(fmt_.fps);\r
+ clock_.tick(1.0/fmt_.fps);\r
});\r
}\r
};\r
Play(); \r
}\r
\r
- void send(const safe_ptr<const read_frame>& frame)\r
+ virtual void send(const safe_ptr<const read_frame>& frame)\r
{ \r
if(frame->audio_data().empty())\r
return;\r
input_.push(std::vector<short>(frame->audio_data().begin(), frame->audio_data().end())); \r
}\r
\r
- size_t buffer_depth() const\r
- {\r
- return 3;\r
- }\r
+ virtual size_t buffer_depth() const{return 3;}\r
\r
virtual bool OnGetData(sf::SoundStream::Chunk& data)\r
{ \r
std::rotate(pbos_.begin(), pbos_.begin() + 1, pbos_.end());\r
}\r
\r
- void send(const safe_ptr<const read_frame>& frame)\r
+ virtual void send(const safe_ptr<const read_frame>& frame)\r
{\r
active_.get();\r
active_ = executor_.begin_invoke([=]\r
});\r
}\r
\r
- size_t buffer_depth() const\r
- {\r
- return 2;\r
- }\r
+ virtual size_t buffer_depth() const{return 2;}\r
};\r
\r
consumer::consumer(consumer&& other) : impl_(std::move(other.impl_)){}\r
<ClInclude Include="consumer\bluefish\util.h" />\r
<ClInclude Include="consumer\decklink\decklink_consumer.h" />\r
<ClInclude Include="consumer\decklink\util.h" />\r
+ <ClInclude Include="consumer\ffmpeg\ffmpeg_consumer.h" />\r
<ClInclude Include="consumer\frame_consumer_device.h" />\r
<ClInclude Include="consumer\decklink\DeckLinkAPI_h.h" />\r
<ClInclude Include="consumer\frame_consumer.h" />\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
</ClCompile>\r
+ <ClCompile Include="consumer\ffmpeg\ffmpeg_consumer.cpp">\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="consumer\frame_consumer_device.cpp">\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
<Filter Include="Source\producer\flash\interop">\r
<UniqueIdentifier>{f99e4727-2b1b-4009-a445-99b11b071e8e}</UniqueIdentifier>\r
</Filter>\r
+ <Filter Include="Source\consumer\ffmpeg">\r
+ <UniqueIdentifier>{b651856c-ff7e-4f90-be8a-32aba6094dbd}</UniqueIdentifier>\r
+ </Filter>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="consumer\decklink\DeckLinkAPI_h.h">\r
<ClInclude Include="producer\decklink\decklink_producer.h">\r
<Filter>Source\producer\decklink</Filter>\r
</ClInclude>\r
+ <ClInclude Include="consumer\ffmpeg\ffmpeg_consumer.h">\r
+ <Filter>Source\consumer\ffmpeg</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ClCompile Include="consumer\decklink\DeckLinkAPI_i.c">\r
<ClCompile Include="producer\decklink\decklink_producer.cpp">\r
<Filter>Source\producer\decklink</Filter>\r
</ClCompile>\r
+ <ClCompile Include="consumer\ffmpeg\ffmpeg_consumer.cpp">\r
+ <Filter>Source\consumer\ffmpeg</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
<Midl Include="producer\flash\Flash9e.IDL">\r
buffer audio_buffer_; \r
buffer current_chunk_;\r
\r
- size_t audio_frame_size_;\r
+ const size_t audio_frame_size_;\r
\r
static const size_t SAMPLE_RATE = 48000;\r
static const size_t N_CHANNELS = 2;\r
{\r
input input_; \r
std::unique_ptr<audio_decoder> audio_decoder_;\r
- std::unique_ptr<video_decoder> video_decoder_;\r
+ video_decoder video_decoder_;\r
\r
std::deque<safe_ptr<write_frame>> video_frame_channel_; \r
std::deque<std::vector<short>> audio_chunk_channel_;\r
: filename_(filename)\r
, last_frame_(draw_frame(draw_frame::empty()))\r
, input_(filename, loop)\r
- , video_decoder_(new video_decoder(input_.get_video_codec_context().get())) \r
+ , video_decoder_(input_.get_video_codec_context().get()) \r
, audio_decoder_(input_.get_audio_codec_context().get() ? new audio_decoder(input_.get_audio_codec_context().get(), input_.fps()) : nullptr){}\r
\r
virtual void initialize(const safe_ptr<frame_processor_device>& frame_processor)\r
{\r
format_desc_ = frame_processor->get_video_format_desc();\r
- video_decoder_->initialize(frame_processor);\r
+ video_decoder_.initialize(frame_processor);\r
}\r
\r
virtual safe_ptr<draw_frame> receive()\r
tbb::parallel_invoke(\r
[&]\r
{ // Video Decoding and Scaling\r
- if(!video_packet.empty() && video_decoder_)\r
+ if(!video_packet.empty())\r
{\r
- auto frame = video_decoder_->execute(video_packet);\r
+ auto frame = video_decoder_.execute(video_packet);\r
video_frame_channel_.push_back(std::move(frame));\r
}\r
}, \r
audio_chunk_channel_.pop_front();\r
}\r
\r
- ouput_channel_.push(video_frame_channel_.front());\r
+ ouput_channel_.push(std::move(video_frame_channel_.front()));\r
video_frame_channel_.pop_front();\r
} \r
\r
\r
AVCodecContext* codec_context_;\r
\r
- int width_;\r
- int height_;\r
- PixelFormat pix_fmt_;\r
- pixel_format_desc desc_;\r
+ const int width_;\r
+ const int height_;\r
+ const PixelFormat pix_fmt_;\r
+ const pixel_format_desc desc_;\r
\r
public:\r
explicit implementation(AVCodecContext* codec_context) \r
\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
+ timer_.tick(1.0/ax_->GetFPS()); // Tick doesnt work on nested timelines, force an actual sync\r
\r
ax_->Tick();\r
\r
<device>1</device>\r
<embedded-audio>true</embedded-audio>\r
</decklink-->\r
- <bluefish>\r
+ <!--bluefish>\r
<device>1</device> \r
<embedded-audio>true</embedded-audio>\r
- </bluefish>\r
+ </bluefish-->\r
</consumers>\r
</channel>\r
</channels>\r