]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 22:51:42 +0000 (22:51 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 22:51:42 +0000 (22:51 +0000)
modules/ffmpeg/producer/util.cpp
modules/ffmpeg/producer/util.h
modules/ffmpeg/producer/video/video_decoder.cpp

index cca4c7f052c6626cbbe7983c28e8373f6b9f7079..62867d4a671a71dc53916812342d07a7f6539c96 100644 (file)
@@ -308,7 +308,7 @@ safe_ptr<AVPacket> create_packet()
        return packet;\r
 }\r
 \r
-const safe_ptr<AVPacket>& loop_packet(int index)\r
+safe_ptr<AVPacket> loop_packet(int index)\r
 {\r
        static safe_ptr<AVPacket> packets[] = {create_packet(), create_packet(), create_packet(), create_packet(), create_packet(), create_packet()};\r
        \r
@@ -318,7 +318,7 @@ const safe_ptr<AVPacket>& loop_packet(int index)
        return packet;\r
 }\r
 \r
-const safe_ptr<AVPacket>& eof_packet(int index)\r
+safe_ptr<AVPacket> eof_packet(int index)\r
 {\r
        static safe_ptr<AVPacket> packets[] = {create_packet(), create_packet(), create_packet(), create_packet(), create_packet(), create_packet()};\r
        \r
@@ -328,37 +328,37 @@ const safe_ptr<AVPacket>& eof_packet(int index)
        return packet;\r
 }\r
 \r
-const safe_ptr<AVFrame>& loop_video()\r
+safe_ptr<AVFrame> loop_video()\r
 {\r
        static auto frame1 = safe_ptr<AVFrame>(avcodec_alloc_frame(), av_free);\r
        return frame1;\r
 }\r
 \r
-const safe_ptr<AVFrame>& empty_video()\r
+safe_ptr<AVFrame> empty_video()\r
 {\r
        static auto frame1 = safe_ptr<AVFrame>(avcodec_alloc_frame(), av_free);\r
        return frame1;\r
 }\r
 \r
-const safe_ptr<AVFrame>& eof_video()\r
+safe_ptr<AVFrame> eof_video()\r
 {\r
        static auto frame2 = safe_ptr<AVFrame>(avcodec_alloc_frame(), av_free);\r
        return frame2;\r
 }\r
 \r
-const safe_ptr<core::audio_buffer>& loop_audio()\r
+safe_ptr<core::audio_buffer> loop_audio()\r
 {\r
        static auto audio1 = safe_ptr<core::audio_buffer>();\r
        return audio1;\r
 }\r
 \r
-const safe_ptr<core::audio_buffer>& empty_audio()\r
+safe_ptr<core::audio_buffer> empty_audio()\r
 {\r
        static auto audio1 = safe_ptr<core::audio_buffer>();\r
        return audio1;\r
 }\r
 \r
-const safe_ptr<core::audio_buffer>& eof_audio()\r
+safe_ptr<core::audio_buffer> eof_audio()\r
 {\r
        static auto audio2 = safe_ptr<core::audio_buffer>();\r
        return audio2;\r
index eb4758a183399793e6b8706d37000f249e30ab26..976ffefcf47ca064d8519fe8dacc9528635195c9 100644 (file)
@@ -41,15 +41,14 @@ namespace ffmpeg {
        \r
 // Dataflow\r
        \r
-const safe_ptr<AVPacket>& loop_packet(int index);\r
-const safe_ptr<AVPacket>& eof_packet(int index);\r
-\r
-const safe_ptr<AVFrame>& loop_video();\r
-const safe_ptr<AVFrame>& empty_video();\r
-const safe_ptr<AVFrame>& eof_video();\r
-const safe_ptr<core::audio_buffer>& loop_audio();\r
-const safe_ptr<core::audio_buffer>& empty_audio();\r
-const safe_ptr<core::audio_buffer>& eof_audio();\r
+safe_ptr<AVPacket>                             loop_packet(int index);\r
+safe_ptr<AVPacket>                             eof_packet(int index);\r
+safe_ptr<AVFrame>                              loop_video();\r
+safe_ptr<AVFrame>                              empty_video();\r
+safe_ptr<AVFrame>                              eof_video();\r
+safe_ptr<core::audio_buffer>   loop_audio();\r
+safe_ptr<core::audio_buffer>   empty_audio();\r
+safe_ptr<core::audio_buffer>   eof_audio();\r
 \r
 // Utils\r
 \r
index de04b00dfa392dd1b80bf1e4b5c9e824d0f97212..1099e3b9ce9eefcbec9356c8124589ac1322e6ac 100644 (file)
@@ -152,17 +152,21 @@ public:
 \r
        safe_ptr<AVFrame> dup_frame(const safe_ptr<AVFrame>& frame)\r
        {\r
+               auto desc = get_pixel_format_desc(static_cast<PixelFormat>(frame->format), frame->width, frame->height);\r
+\r
+               auto count = desc.planes.size();\r
                std::array<uint8_t*, 4> data;\r
-               parallel_for(0, 4, [&](int n)\r
+               parallel_for<size_t>(0, count, [&](size_t n)\r
                {\r
                        data[n] = frame->data[n];\r
-                       frame->data[n] = reinterpret_cast<uint8_t*>(scalable_aligned_malloc(frame->linesize[n]*frame->height, 32));\r
-                       memcpy(frame->data[n], data[n], frame->linesize[n]*frame->height);\r
+                       auto size = frame->linesize[n]*desc.planes[n].height;\r
+                       frame->data[n] = reinterpret_cast<uint8_t*>(scalable_aligned_malloc(size, 32));\r
+                       memcpy(frame->data[n], data[n], size);\r
                });\r
 \r
-               return safe_ptr<AVFrame>(frame.get(), [frame, data](AVFrame*)\r
+               return safe_ptr<AVFrame>(frame.get(), [frame, data, count](AVFrame*)\r
                {\r
-                       for(int n = 0; n < 4; ++n)\r
+                       for(size_t n = 0; n < count; ++n)\r
                        {\r
                                scalable_aligned_free(frame->data[n]);\r
                                frame->data[n] = data[n];\r