]> git.sesse.net Git - casparcg/commitdiff
ffmpeg dshow: Fix packet life preserver in video_decoder and revert move of packet...
authorcambell <cambell.prince@gmail.com>
Tue, 28 May 2013 14:09:42 +0000 (21:09 +0700)
committercambell <cambell.prince@gmail.com>
Tue, 28 May 2013 14:09:42 +0000 (21:09 +0700)
modules/ffmpeg/ffmpeg.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index 3bf0f8fd8eb17b71df693f0cb202d42e81ba0a24..d85a1552801ee16c4b962e7db641da26576bc760 100644 (file)
@@ -245,7 +245,7 @@ void init()
        //fix_yadif_filter_format_query();\r
        av_register_all();\r
     avformat_network_init();\r
-       //avcodec_init();\r
+       avcodec_init();\r
     avcodec_register_all();\r
        \r
        core::register_consumer_factory([](const std::vector<std::wstring>& params){return create_consumer(params);});\r
index 91d7161e49ed7bd60654ab5966c2e58f55aa5771..b263911d3386fb66d8fa6273bbb7bd3d8ac2e731 100644 (file)
@@ -93,30 +93,29 @@ public:
                                        \r
                if(packet->data == nullptr)\r
                {                       \r
-                       packets_.pop();\r
                        if(codec_context_->codec->capabilities & CODEC_CAP_DELAY)\r
                        {\r
-                               auto video = decode(packet.get());\r
+                               auto video = decode(packet);\r
                                if(video)\r
                                        return video;\r
                        }\r
                                        \r
-                       //packets_.pop();\r
+                       packets_.pop();\r
                        file_frame_number_ = static_cast<size_t>(packet->pos);\r
                        avcodec_flush_buffers(codec_context_.get());\r
                        return flush_video();   \r
                }\r
                        \r
                packets_.pop();\r
-               return decode(packet.get());\r
+               return decode(packet);\r
        }\r
 \r
-       std::shared_ptr<AVFrame> decode(AVPacket* pkt)\r
+       std::shared_ptr<AVFrame> decode(safe_ptr<AVPacket> pkt)\r
        {\r
                std::shared_ptr<AVFrame> decoded_frame(avcodec_alloc_frame(), av_free);\r
 \r
                int frame_finished = 0;\r
-               THROW_ON_ERROR2(avcodec_decode_video2(codec_context_.get(), decoded_frame.get(), &frame_finished, pkt), "[video_decocer]");\r
+               THROW_ON_ERROR2(avcodec_decode_video2(codec_context_.get(), decoded_frame.get(), &frame_finished, pkt.get()), "[video_decoder]");\r
                \r
                // If a decoder consumes less then the whole packet then something is wrong\r
                // that might be just harmless padding at the end, or a problem with the\r
@@ -132,7 +131,9 @@ public:
                \r
                ++file_frame_number_;\r
 \r
-               //return decoded_frame;\r
+               // This ties the life of the decoded_frame to the packet that it came from. For the\r
+               // current version of ffmpeg (0.8 or c17808c) the RAW_VIDEO codec returns frame data\r
+               // owned by the packet.\r
                return std::shared_ptr<AVFrame>(decoded_frame.get(), [decoded_frame, pkt](AVFrame*){});\r
        }\r
        \r