const int width_;\r
const int height_;\r
const PixelFormat pix_fmt_;\r
- const pixel_format_desc desc_;\r
+ pixel_format_desc desc_;\r
\r
public:\r
explicit implementation(AVCodecContext* codec_context, const safe_ptr<frame_factory>& frame_factory) \r
{\r
CASPAR_LOG(warning) << "Hardware accelerated color transform not supported.";\r
\r
+ desc_ = get_pixel_format_desc(PIX_FMT_BGRA, width_, height_);\r
double param;\r
sws_context_.reset(sws_getContext(width_, height_, pix_fmt_, width_, height_, PIX_FMT_BGRA, SWS_BILINEAR, nullptr, nullptr, ¶m), sws_freeContext);\r
if(!sws_context_)\r
\r
if(result < 0)\r
BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("avcodec_decode_video failed"));\r
-\r
+ \r
+ auto write = frame_factory_->create_frame(desc_);\r
if(sws_context_ == nullptr)\r
{\r
- auto write = frame_factory_->create_frame(desc_);\r
-\r
tbb::parallel_for(0, static_cast<int>(desc_.planes.size()), 1, [&](int n)\r
{\r
auto plane = desc_.planes[n];\r
}\r
else\r
{\r
- auto write = frame_factory_->create_frame(width_, height_);\r
-\r
- AVFrame av_frame; \r
- avcodec_get_frame_defaults(&av_frame);\r
- avpicture_fill(reinterpret_cast<AVPicture*>(&av_frame), write->image_data().begin(), PIX_FMT_BGRA, width_, height_);\r
+ safe_ptr<AVFrame> av_frame(avcodec_alloc_frame(), av_free); \r
+ avcodec_get_frame_defaults(av_frame.get()); \r
+ avpicture_fill(reinterpret_cast<AVPicture*>(av_frame.get()), write->image_data().begin(), PIX_FMT_BGRA, width_, height_);\r
\r
- sws_scale(sws_context_.get(), decoded_frame->data, decoded_frame->linesize, 0, height_, av_frame.data, av_frame.linesize); \r
+ sws_scale(sws_context_.get(), decoded_frame->data, decoded_frame->linesize, 0, height_, av_frame->data, av_frame->linesize); \r
\r
return write;\r
} \r
if(is_paused_)\r
return last_frame_;\r
\r
+ if(foreground_ == frame_producer::empty())\r
+ {\r
+ last_frame_ = draw_frame::empty();\r
+ return last_frame_;\r
+ }\r
+\r
try\r
{\r
last_frame_ = foreground_->receive(); \r
last_frame_->set_layer_index(index_);\r
if(last_frame_ == draw_frame::eof())\r
{\r
- CASPAR_ASSERT(foreground_ != frame_producer::empty());\r
-\r
auto following = foreground_->get_following_producer();\r
following->set_leading_producer(foreground_);\r
foreground_ = following;\r