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
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
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
\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
\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