<Lib />\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
- <ClCompile Include="consumer\ffmpeg_consumer.cpp">\r
- <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
- <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
- <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
- <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">true</ExcludedFromBuild>\r
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">true</ExcludedFromBuild>\r
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="ffmpeg.cpp">\r
<ShowIncludes Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">false</ShowIncludes>\r
</ClCompile>\r
</ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
- <ClInclude Include="consumer\ffmpeg_consumer.h" />\r
<ClInclude Include="ffmpeg.h" />\r
<ClInclude Include="ffmpeg_error.h" />\r
<ClInclude Include="producer\audio\audio_decoder.h" />\r
<Filter Include="source">\r
<UniqueIdentifier>{c9454245-e85a-45ba-960f-203b00d18454}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="source\consumer">\r
- <UniqueIdentifier>{4db7d9c3-08ea-4423-a303-f18737629268}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="source\producer">\r
<UniqueIdentifier>{c5a94fd1-4552-4f6d-97cd-24e44e662e0f}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="producer\audio\audio_decoder.cpp">\r
<Filter>source\producer\audio</Filter>\r
</ClCompile>\r
- <ClCompile Include="consumer\ffmpeg_consumer.cpp">\r
- <Filter>source\consumer</Filter>\r
- </ClCompile>\r
<ClCompile Include="StdAfx.cpp" />\r
<ClCompile Include="ffmpeg.cpp">\r
<Filter>source</Filter>\r
<ClInclude Include="producer\audio\audio_decoder.h">\r
<Filter>source\producer\audio</Filter>\r
</ClInclude>\r
- <ClInclude Include="consumer\ffmpeg_consumer.h">\r
- <Filter>source\consumer</Filter>\r
- </ClInclude>\r
<ClInclude Include="StdAfx.h" />\r
<ClInclude Include="ffmpeg_error.h">\r
<Filter>source</Filter>\r
\r
#include <core/producer/frame_producer.h>\r
#include <core/producer/frame/basic_frame.h>\r
-#include <core/producer/frame/frame_transform.h>\r
-#include <core/producer/frame/pixel_format.h>\r
#include <core/producer/frame/frame_factory.h>\r
#include <core/mixer/write_frame.h>\r
\r
#endif\r
\r
#include <boost/foreach.hpp>\r
-#include <boost/range/algorithm_ext/push_back.hpp>\r
-#include <boost/assign.hpp>\r
\r
#include <agents_extras.h>\r
\r
-#include <deque>\r
-#include <tuple>\r
-#include <queue>\r
-#include <vector>\r
-\r
using namespace caspar::core;\r
\r
using namespace Concurrency;\r
return display_mode::invalid;\r
}\r
\r
-\r
struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopyable\r
{ \r
ITarget<safe_ptr<core::basic_frame>>& target_;\r
\r
Concurrency::overwrite_buffer<bool> is_running_;\r
\r
- safe_ptr<semaphore> semaphore_;\r
- \r
implementation(frame_muxer2::video_source_t* video_source,\r
frame_muxer2::audio_source_t* audio_source,\r
frame_muxer2::target_t& target,\r
, frame_factory_(make_safe<core::concrt_frame_factory>(frame_factory))\r
, push_video_(std::bind(&implementation::push_video, this, std::placeholders::_1))\r
, push_audio_(std::bind(&implementation::push_audio, this, std::placeholders::_1))\r
- , semaphore_(make_safe<semaphore>(8))\r
{\r
if(video_source)\r
video_source->link_target(&push_video_);\r
\r
filter_.push(video_frame);\r
\r
- BOOST_FOREACH(auto av_frame, filter_.poll_all())\r
- { \r
- av_frame->format = format; \r
- send(video_, av_frame);\r
+ while(true)\r
+ {\r
+ auto frame = filter_.poll();\r
+ if(!frame)\r
+ break; \r
+\r
+ frame->format = format;\r
+ send(video_, make_safe_ptr(frame));\r
}\r
}\r
\r
tbb::atomic<size_t> packets_size_;\r
\r
bool stop_;\r
+\r
+ safe_ptr<semaphore> semaphore_;\r
\r
public:\r
explicit implementation(input::target_t& target,\r
, length_(length)\r
, frame_number_(0)\r
, stop_(false)\r
+ , semaphore_(make_safe<semaphore>(8))\r
{ \r
packets_count_ = 0;\r
packets_size_ = 0;\r
break;\r
\r
Concurrency::asend(target_, make_safe_ptr(packet));\r
- Concurrency::wait(20);\r
}\r
}\r
catch(...)\r
packet->size = size;\r
packet->data = data;\r
--packets_count_;\r
+ semaphore_->release();\r
});\r
+ semaphore_->acquire();\r
\r
++packets_count_;\r
\r
struct video_decoder::implementation : public Concurrency::agent, boost::noncopyable\r
{ \r
int index_;\r
- std::shared_ptr<AVCodecContext> codec_context_;\r
- \r
- double fps_;\r
- int64_t nb_frames_;\r
+ safe_ptr<AVCodecContext> codec_context_; \r
+ const double fps_;\r
+ const int64_t nb_frames_;\r
+ const size_t width_;\r
+ const size_t height_;\r
\r
- size_t width_;\r
- size_t height_;\r
bool is_progressive_;\r
\r
overwrite_buffer<bool> is_running_;\r
, width_(codec_context_->width)\r
, height_(codec_context_->height)\r
, is_progressive_(true)\r
- , source_([this](const safe_ptr<AVPacket>& packet)\r
- {\r
- return packet->stream_index == index_;\r
- })\r
+ , source_([this](const safe_ptr<AVPacket>& packet){return packet->stream_index == index_;})\r
, target_(target)\r
, semaphore_(make_safe<Concurrency::semaphore>(1))\r
{ \r
CASPAR_LOG(debug) << "[video_decoder] " << context.streams[index_]->codec->codec->long_name;\r
\r
- CASPAR_VERIFY(width_ > 0, ffmpeg_error());\r
- CASPAR_VERIFY(height_ > 0, ffmpeg_error());\r
-\r
Concurrency::connect(source, source_);\r
\r
start();\r