diff --git a/daemon/src/video/video_base.cpp b/daemon/src/video/video_base.cpp index 493622ddb1d79611d8acfb670de74d8265111af3..ccf2739b9a62b17dc4778c8108de807164d2e14a 100644 --- a/daemon/src/video/video_base.cpp +++ b/daemon/src/video/video_base.cpp @@ -158,38 +158,20 @@ int VideoFrame::blit(VideoFrame &src, int xoff, int yoff) return -1; } - uint8_t *src_data, *dst_data; - ssize_t dst_stride; - - // Y - dst_stride = frame_->linesize[0]; - src_data = src_frame->data[0]; - dst_data = frame_->data[0] + yoff * dst_stride + xoff; - for (int i = 0; i < src_frame->height; i++) { - memcpy(dst_data, src_data, src_frame->linesize[0]); - src_data += src_frame->linesize[0]; - dst_data += dst_stride; - } - - // U - dst_stride = frame_->linesize[1]; - src_data = src_frame->data[1]; - dst_data = frame_->data[1] + yoff / 2 * dst_stride + xoff / 2; - for (int i = 0; i < src_frame->height / 2; i++) { - memcpy(dst_data, src_data, src_frame->linesize[1]); - src_data += src_frame->linesize[1]; - dst_data += dst_stride; - } - - // V - dst_stride = frame_->linesize[2]; - src_data = src_frame->data[2]; - dst_data = frame_->data[2] + yoff / 2 * dst_stride + xoff / 2; - for (int i = 0; i < src_frame->height / 2; i++) { - memcpy(dst_data, src_data, src_frame->linesize[2]); - src_data += src_frame->linesize[2]; - dst_data += dst_stride; - } + auto copy_plane = [&] (unsigned idx) { + const unsigned divisor = idx == 0 ? 1 : 2; + ssize_t dst_stride = frame_->linesize[idx]; + uint8_t *src_data = src_frame->data[idx]; + uint8_t *dst_data = frame_->data[idx] + yoff / divisor * dst_stride + xoff / divisor; + for (unsigned i = 0; i < src_frame->height / divisor; i++) { + memcpy(dst_data, src_data, src_frame->linesize[idx]); + src_data += src_frame->linesize[idx]; + dst_data += dst_stride; + } + }; + + for (unsigned plane = 0; plane < 3; ++plane) + copy_plane(plane); return 0; }