\r
try\r
{\r
- auto result = core::basic_frame::empty();\r
-\r
graph_->update_value("tick-time", tick_timer_.elapsed()*format_desc_.fps*0.5);\r
tick_timer_.restart();\r
\r
frame_timer_.restart();\r
- \r
- core::pixel_format_desc desc;\r
- desc.pix_fmt = core::pixel_format::ycbcr;\r
- desc.planes.push_back(core::pixel_format_desc::plane(video->GetWidth(), video->GetHeight(), 1));\r
- desc.planes.push_back(core::pixel_format_desc::plane(video->GetWidth()/2, video->GetHeight(), 1));\r
- desc.planes.push_back(core::pixel_format_desc::plane(video->GetWidth()/2, video->GetHeight(), 1)); \r
- auto frame = frame_factory_->create_frame(this, desc);\r
- \r
+\r
void* bytes = nullptr;\r
if(FAILED(video->GetBytes(&bytes)) || !bytes)\r
return S_OK;\r
-\r
- unsigned char* data = reinterpret_cast<unsigned char*>(bytes);\r
- const size_t frame_size = (format_desc_.width * 16 / 8) * format_desc_.height;\r
-\r
- // Convert to planar YUV422\r
- unsigned char* y = frame->image_data(0).begin();\r
- unsigned char* cb = frame->image_data(1).begin();\r
- unsigned char* cr = frame->image_data(2).begin();\r
- \r
- tbb::parallel_for(tbb::blocked_range<size_t>(0, frame_size/4), [&](const tbb::blocked_range<size_t>& r)\r
- {\r
- for(auto n = r.begin(); n != r.end(); ++n)\r
- {\r
- cb[n] = data[n*4+0];\r
- y [n*2+0] = data[n*4+1];\r
- cr[n] = data[n*4+2];\r
- y [n*2+1] = data[n*4+3];\r
- }\r
- });\r
- frame->set_type(format_desc_.mode);\r
\r
- std::vector<safe_ptr<core::write_frame>> frames;\r
-\r
+ safe_ptr<AVFrame> av_frame(avcodec_alloc_frame(), av_free); \r
+ avcodec_get_frame_defaults(av_frame.get());\r
+ \r
+ av_frame->data[0] = reinterpret_cast<uint8_t*>(bytes);\r
+ av_frame->linesize[0] = video->GetRowBytes(); \r
+ av_frame->format = PIX_FMT_UYVY422;\r
+ av_frame->width = video->GetWidth();\r
+ av_frame->height = video->GetHeight();\r
+ av_frame->interlaced_frame = format_desc_.mode != core::video_mode::progressive;\r
+ av_frame->top_field_first = format_desc_.mode == core::video_mode::upper ? 1 : 0;\r
+ \r
if(filter_)\r
{\r
- filter_->push(as_av_frame(frame));\r
- auto av_frames = filter_->poll();\r
- BOOST_FOREACH(auto& av_frame, av_frames)\r
- frames.push_back(make_write_frame(this, av_frame, frame_factory_));\r
+ filter_->push(av_frame);\r
+ BOOST_FOREACH(auto& av_frame2, filter_->poll())\r
+ muxer_.push(make_write_frame(this, av_frame2, frame_factory_));\r
}\r
- else\r
- {\r
- frame->commit();\r
- frames.push_back(frame);\r
- }\r
-\r
- BOOST_FOREACH(auto frame, frames)\r
- muxer_.push(frame);\r
- \r
+ else \r
+ muxer_.push(make_write_frame(this, av_frame, frame_factory_)); \r
+ \r
// It is assumed that audio is always equal or ahead of video.\r
if(audio && SUCCEEDED(audio->GetBytes(&bytes)))\r
{\r