From: ronag Date: Wed, 17 Aug 2011 12:25:14 +0000 (+0000) Subject: git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches... X-Git-Tag: 2.0.1~132 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=0d225c5442d5a127b0eefd08c1cf723a37357211;p=casparcg git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1208 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/modules/ffmpeg/producer/ffmpeg_producer.cpp b/modules/ffmpeg/producer/ffmpeg_producer.cpp index 84863760e..4a9ad443f 100644 --- a/modules/ffmpeg/producer/ffmpeg_producer.cpp +++ b/modules/ffmpeg/producer/ffmpeg_producer.cpp @@ -74,6 +74,7 @@ struct ffmpeg_producer : public core::frame_producer input input_; video_decoder video_decoder_; audio_decoder audio_decoder_; + double fps_; frame_muxer muxer_; int late_frames_; @@ -81,21 +82,29 @@ struct ffmpeg_producer : public core::frame_producer const bool loop_; safe_ptr last_frame_; + + const size_t width_; + const size_t height_; + bool progressive_; public: explicit ffmpeg_producer(const safe_ptr& frame_factory, const std::wstring& filename, const std::wstring& filter, bool loop, int start, int length) : filename_(filename) - , graph_(diagnostics::create_graph(narrow(print()))) + , graph_(diagnostics::create_graph([this]{return print();})) , frame_factory_(frame_factory) , format_desc_(frame_factory->get_video_format_desc()) , input_(graph_, filename_, loop, start, length) , video_decoder_(input_.context(), frame_factory, filter) , audio_decoder_(input_.context(), frame_factory->get_video_format_desc()) - , muxer_(validate_fps(video_decoder_.fps(), video_decoder_.nb_frames(), audio_decoder_.duration()), frame_factory) + , fps_(validate_fps(video_decoder_.fps(), video_decoder_.nb_frames(), audio_decoder_.duration())) + , muxer_(fps_, frame_factory) , late_frames_(0) , start_(start) , loop_(loop) , last_frame_(core::basic_frame::empty()) + , width_(video_decoder_.width()) + , height_(video_decoder_.height()) + , progressive_(true) { graph_->add_guide("frame-time", 0.5); graph_->set_color("frame-time", diagnostics::color(0.1f, 1.0f, 0.1f)); @@ -156,8 +165,11 @@ public: return; auto video_frames = video_decoder_.poll(); - BOOST_FOREACH(auto& video, video_frames) + BOOST_FOREACH(auto& video, video_frames) + { + progressive_ &= video->interlaced_frame != 0; muxer_.push(video, hints); + } }, [&] { @@ -197,7 +209,9 @@ public: virtual std::wstring print() const { - return L"ffmpeg[" + boost::filesystem::wpath(filename_).filename() + L"]"; + return L"ffmpeg[" + boost::filesystem::wpath(filename_).filename() + L"|" + + boost::lexical_cast(fps_) + (progressive_ ? L"p" : L"i") +L"|" + + boost::lexical_cast(width_) + L"x" + boost::lexical_cast(height_) + L"]"; } }; diff --git a/modules/ffmpeg/producer/video/video_decoder.cpp b/modules/ffmpeg/producer/video/video_decoder.cpp index e2549ecf4..d78361f67 100644 --- a/modules/ffmpeg/producer/video/video_decoder.cpp +++ b/modules/ffmpeg/producer/video/video_decoder.cpp @@ -61,12 +61,18 @@ struct video_decoder::implementation : boost::noncopyable double fps_; int64_t nb_frames_; + + size_t width_; + size_t height_; + public: explicit implementation(const safe_ptr& context, const safe_ptr& frame_factory, const std::wstring& filter) : frame_factory_(frame_factory) , filter_(filter) , fps_(frame_factory_->get_video_format_desc().fps) , nb_frames_(0) + , width_(0) + , height_(0) { try { @@ -90,6 +96,9 @@ public: fps_ = static_cast(codec_context_->time_base.den) / static_cast(codec_context_->time_base.num); if(double_rate(filter)) fps_ *= 2; + + width_ = codec_context_->width; + height_ = codec_context_->height; } catch(...) { @@ -205,4 +214,6 @@ std::vector> video_decoder::poll(){return impl_->poll() bool video_decoder::ready() const{return impl_->ready();} double video_decoder::fps() const{return impl_->fps();} int64_t video_decoder::nb_frames() const{return impl_->nb_frames_;} +size_t video_decoder::width() const{return impl_->width_;} +size_t video_decoder::height() const{return impl_->height_;} } \ No newline at end of file diff --git a/modules/ffmpeg/producer/video/video_decoder.h b/modules/ffmpeg/producer/video/video_decoder.h index dd91216aa..743bf749a 100644 --- a/modules/ffmpeg/producer/video/video_decoder.h +++ b/modules/ffmpeg/producer/video/video_decoder.h @@ -47,6 +47,9 @@ public: bool ready() const; std::vector> poll(); + size_t width() const; + size_t height() const; + int64_t nb_frames() const; double fps() const;