]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: ffmpeg_input: Assume EIO is AVERROR_EOF since it is sometimes returned inste...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 18 May 2011 16:30:54 +0000 (16:30 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 18 May 2011 16:30:54 +0000 (16:30 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@779 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/ffmpeg.cpp
modules/ffmpeg/ffmpeg.h
modules/ffmpeg/producer/input.cpp
shell/main.cpp

index 69bd866d867f0177a93a83ff59eab7fde1b894b5..26aec9664b726b36e6f7b8856a5d83f6b5b89944 100644 (file)
@@ -35,6 +35,8 @@ extern "C"
        #define __STDC_LIMIT_MACROS\r
        #include <libavformat/avformat.h>\r
        #include <libswscale/swscale.h>\r
+       #include <libavutil/avutil.h>\r
+       #include <libavfilter/avfilter.h>\r
 }\r
 \r
 namespace caspar {\r
@@ -62,6 +64,20 @@ std::wstring get_avformat_version()
        return str.str();\r
 }\r
 \r
+std::wstring get_avutil_version()\r
+{\r
+       std::wstringstream str;\r
+       str << ((avutil_version() >> 16) & 0xFF) << L"." << ((avutil_version() >> 8) & 0xFF) << L"." << ((avutil_version() >> 0) & 0xFF);\r
+       return str.str();\r
+}\r
+\r
+std::wstring get_avfilter_version()\r
+{\r
+       std::wstringstream str;\r
+       str << ((avfilter_version() >> 16) & 0xFF) << L"." << ((avfilter_version() >> 8) & 0xFF) << L"." << ((avfilter_version() >> 0) & 0xFF);\r
+       return str.str();\r
+}\r
+\r
 std::wstring get_swscale_version()\r
 {\r
        std::wstringstream str;\r
index ae0c9db9d8d4afa4e3759dca33081460ff4a13bf..f86f09f24d85c0618da6b8c0a4800aaa5eaf36ba 100644 (file)
@@ -25,6 +25,8 @@ void init_ffmpeg();
 \r
 std::wstring get_avcodec_version();\r
 std::wstring get_avformat_version();\r
+std::wstring get_avutil_version();\r
+std::wstring get_avfilter_version();\r
 std::wstring get_swscale_version();\r
 \r
 }
\ No newline at end of file
index 70803035a48100c8f1f06aaed73ceb4efcb9882a..743ad94e4fb976bd45de798e1f99d8b84e81ace6 100644 (file)
@@ -228,17 +228,20 @@ private:
                                if(loop_)\r
                                {\r
                                        seek_frame(start_, AVSEEK_FLAG_BACKWARD);\r
-                                       // AVCodecContext.frame_number is not reset. Increase the target frame_number.\r
-                                       eof_count_ += length_; \r
-                                       graph_->add_tag("seek");        \r
+                                       eof_count_ += length_; // AVCodecContext.frame_number is not reset. Increase the target frame_number.\r
+                                       graph_->add_tag("seek");                \r
+                                       CASPAR_LOG(info) << print() << " Received EOF. Looping.";                       \r
                                }       \r
                                else\r
+                               {\r
                                        stop();\r
+                                       CASPAR_LOG(info) << print() << " Received EOF. Stopping.";\r
+                               }\r
                        }\r
                        else if(errn < 0)\r
                        {\r
                                BOOST_THROW_EXCEPTION(\r
-                                       invalid_operation() <<\r
+                                       file_read_error() <<\r
                                        msg_info(av_error_str(errn)) <<\r
                                        source_info(narrow(print())) << \r
                                        boost::errinfo_api_function("av_read_frame") <<\r
@@ -300,7 +303,10 @@ private:
                if(length_ != -1)\r
                        return get_default_context()->frame_number > eof_count_;                \r
 \r
-               return errn == AVERROR_EOF;\r
+               if(-errn == EIO)\r
+                       CASPAR_LOG(warning) << print() << " Received EIO, assuming EOF";\r
+\r
+               return errn == AVERROR_EOF || -errn == EIO; // av_read_frame doesn't always correctly return AVERROR_EOF;\r
        }\r
                \r
        packet get_packet(tbb::concurrent_bounded_queue<packet>& buffer)\r
index 63c58c07483291df41563db3a46b1c015c8eeccb..28a106eaed0f23de617a5adbad9f7b00a7451d54 100644 (file)
@@ -110,8 +110,10 @@ void print_info()
                CASPAR_LOG(info) << device;\r
 \r
        CASPAR_LOG(info) << L"FFMPEG-avcodec "  << caspar::get_avcodec_version();\r
-       CASPAR_LOG(info) << L"FFMPEG-swscale "  << caspar::get_avformat_version();\r
-       CASPAR_LOG(info) << L"FFMPEG-avformat " << caspar::get_swscale_version();\r
+       CASPAR_LOG(info) << L"FFMPEG-avformat " << caspar::get_avformat_version();\r
+       CASPAR_LOG(info) << L"FFMPEG-avformat " << caspar::get_avfilter_version();\r
+       CASPAR_LOG(info) << L"FFMPEG-avformat " << caspar::get_avutil_version();\r
+       CASPAR_LOG(info) << L"FFMPEG-swscale "  << caspar::get_swscale_version();\r
        CASPAR_LOG(info) << L"OpenGL " << caspar::core::ogl_device::get_version() << "\n\n";\r
 }\r
  \r