]> git.sesse.net Git - casparcg/commitdiff
ffmpeg: Bug fixes.
authorRobert Nagy <ronag@live.com>
Wed, 18 Dec 2013 16:32:35 +0000 (17:32 +0100)
committerRobert Nagy <ronag@live.com>
Wed, 18 Dec 2013 16:32:35 +0000 (17:32 +0100)
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/ffmpeg/producer/audio/audio_decoder.cpp
modules/ffmpeg/producer/util/util.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index 6d789b44333ecdf810e9ca7f5844e27be4778f08..3f5480743bfb0a8fc8e57911a3f413ef6e6ef410 100644 (file)
@@ -215,7 +215,7 @@ struct ffmpeg_consumer : boost::noncopyable
 {              \r
        const std::string                                               filename_;\r
                \r
-       const std::shared_ptr<AVFormatContext>  oc_;\r
+       std::shared_ptr<AVFormatContext>                oc_;\r
        const core::video_format_desc                   format_desc_;\r
        const core::channel_layout                              channel_layout_;\r
        \r
@@ -273,6 +273,8 @@ public:
                        output_format_.format, \r
                        nullptr, \r
                        filename_.c_str()), "[ffmpeg_consumer]");\r
+\r
+               oc_.reset(oc);\r
                                                                \r
                //  Add the audio and video streams using the default format codecs     and initialize the codecs.\r
                auto options2 = options;\r
index 62251a4848afd67d84710c5d2972b63b6e2fd3d0..732a4e7df8abe6285532d6de54ab3c3ad3162156 100644 (file)
@@ -86,6 +86,8 @@ public:
 \r
                file_frame_number_ = 0;\r
 \r
+               codec_context_->refcounted_frames = 1;\r
+\r
                CASPAR_LOG(debug) << print() \r
                                << " Selected channel layout " << channel_layout_.name;\r
        }\r
@@ -124,15 +126,13 @@ public:
 \r
        std::shared_ptr<core::audio_buffer> decode(AVPacket& pkt)\r
        {                               \r
-               std::shared_ptr<AVFrame> frame(\r
-                       av_frame_alloc(), \r
-                       [](AVFrame* p)\r
-                       {\r
-                               av_frame_free(&p);\r
-                       });\r
-               \r
+               auto decoded_frame = std::shared_ptr<AVFrame>(av_frame_alloc(), [](AVFrame* frame)\r
+               {\r
+                       av_frame_free(&frame);\r
+               });\r
+                               \r
                int got_frame = 0;\r
-               auto len = THROW_ON_ERROR2(avcodec_decode_audio4(codec_context_.get(), frame.get(), &got_frame, &pkt), "[audio_decoder]");\r
+               auto len = THROW_ON_ERROR2(avcodec_decode_audio4(codec_context_.get(), decoded_frame.get(), &got_frame, &pkt), "[audio_decoder]");\r
                                        \r
                if(len == 0)\r
                {\r
@@ -146,16 +146,16 @@ public:
                if(!got_frame)\r
                        return nullptr;\r
                                \r
-               const uint8_t **in = const_cast<const uint8_t**>(frame->extended_data);                 \r
+               const uint8_t **in = const_cast<const uint8_t**>(decoded_frame->extended_data);                 \r
                uint8_t* out[]     = { reinterpret_cast<uint8_t*>(buffer_.data()) };\r
                \r
                const auto channel_samples = swr_convert(swr_.get(), \r
                                                                                                 out, static_cast<int>(buffer_.size()) / codec_context_->channels, \r
-                                                                                                in, frame->nb_samples);\r
+                                                                                                in, decoded_frame->nb_samples);\r
                \r
                ++file_frame_number_;\r
 \r
-               return std::make_shared<core::audio_buffer>(buffer_.begin(), buffer_.begin() + channel_samples * frame->channels);\r
+               return std::make_shared<core::audio_buffer>(buffer_.begin(), buffer_.begin() + channel_samples * decoded_frame->channels);\r
        }\r
 \r
        bool ready() const\r
index d0f5d0804393ffe41ddc9d33a703f900d28e710f..857f1a9ce5c47f1809b7be7e8feba1a7cd6021ff 100644 (file)
@@ -163,14 +163,16 @@ core::pixel_format_desc get_pixel_format_desc(PixelFormat pix_fmt, size_t width,
 \r
 int make_alpha_format(int format)\r
 {\r
-       switch(get_pixel_format(static_cast<PixelFormat>(format)))\r
-       {\r
-       case core::pixel_format::ycbcr:\r
-       case core::pixel_format::ycbcra:\r
-               return CASPAR_PIX_FMT_LUMA;\r
-       default:\r
-               return format;\r
-       }\r
+       return format;\r
+\r
+       //switch(get_pixel_format(static_cast<PixelFormat>(format)))\r
+       //{\r
+       //case core::pixel_format::ycbcr:\r
+       //case core::pixel_format::ycbcra:\r
+       //      return CASPAR_PIX_FMT_LUMA;\r
+       //default:\r
+       //      return format;\r
+       //}\r
 }\r
 \r
 safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVFrame>& decoded_frame, const safe_ptr<core::frame_factory>& frame_factory, int hints, const core::channel_layout& audio_channel_layout)\r
index 9ad3720cdb9f67b38033bc505c15360c5fe5ef2a..e8a39764755907391fea10249d1748203df37ddc 100644 (file)
@@ -73,6 +73,8 @@ public:
                , height_(codec_context_->height)\r
        {\r
                file_frame_number_ = 0;\r
+\r
+               codec_context_->refcounted_frames = 1;\r
        }\r
 \r
        void push(const std::shared_ptr<AVPacket>& packet)\r
@@ -112,8 +114,11 @@ public:
 \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
+               auto decoded_frame = std::shared_ptr<AVFrame>(av_frame_alloc(), [](AVFrame* frame)\r
+               {\r
+                       av_frame_free(&frame);\r
+               });\r
+               \r
                int frame_finished = 0;\r
                THROW_ON_ERROR2(avcodec_decode_video2(codec_context_.get(), decoded_frame.get(), &frame_finished, pkt.get()), "[video_decoder]");\r
                \r