]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: decklink_producer: Use ffmpeg conversion function instead of hand-rolled.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 28 Jul 2011 10:04:06 +0000 (10:04 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 28 Jul 2011 10:04:06 +0000 (10:04 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1003 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/audio/audio_decoder.cpp

index e5742d58a7831775d5715b9e73ce0ce1f1fddc00..088596da319ce3d92d032ce95efbf6d2da4fa0e2 100644 (file)
@@ -170,62 +170,35 @@ public:
 \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
index e9c661900dfc26a58c9a7fec9a651599c96609a7..0092c798dfd62958b1e8b39a8f58a61d57e5d0d6 100644 (file)
@@ -144,6 +144,7 @@ public:
                                boost::errinfo_errno(AVUNERROR(ret)));\r
                }\r
 \r
+               // There might be several frames in one packet.\r
                pkt.size -= ret;\r
                pkt.data += ret;\r
                        \r