We cherry-picked this in bug 2056029. Upstream commit: https://webrtc.googlesource.com/src/+/5da5a6e4e00c69ef60c7643e99ef34f65f7af51a video_capture: Implement buffer stride support for Pipewire Add optional buffer stride support to VideoCaptureImpl and use it in VideoCaptureModulePipeWire, allowing us to drop the requirement for unpadded buffers. This notably improves compatibility with libcamera, which supports a wider range of devices than the V4L2 backend - some having hardware requirements for stride-alignment. Extending `ConvertToI420()` in libyuv was rejected on the grounds that there are various approaches to stride handling - using a single stride value for multiple planes, having explicit values for each one etc. - as well as the fact that we might well want to extend the helper further in the future - e.g. in order to better handle color spaces such as BT709 (instead of always assuming BT601). Thus this patch now adds a local copy of `ConvertToI420()`, supporting implicit and a single explicit stride value for now. libyuv CL for context: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8146821 Bug: chromium:538875176 Change-Id: Ic5781709cf5f20e8c75b9ad09d7052a355fcbec7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/491680 Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Jan Grulich <grulja@gmail.com> Commit-Queue: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/main@{#48353}
68 lines
2.1 KiB
Diff
68 lines
2.1 KiB
Diff
From: Michael Froman <mjfroman@mac.com>
|
|
Date: Thu, 28 Apr 2022 10:53:43 -0500
|
|
Subject: Bug 1766646 - (fix-a0bb2ef2dc) add back VideoType enum values
|
|
|
|
---
|
|
common_video/libyuv/include/webrtc_libyuv.h | 3 +++
|
|
common_video/libyuv/webrtc_libyuv.cc | 9 +++++++++
|
|
2 files changed, 12 insertions(+)
|
|
|
|
diff --git a/common_video/libyuv/include/webrtc_libyuv.h b/common_video/libyuv/include/webrtc_libyuv.h
|
|
index 8ac2151c18..a1899dba88 100644
|
|
--- a/common_video/libyuv/include/webrtc_libyuv.h
|
|
+++ b/common_video/libyuv/include/webrtc_libyuv.h
|
|
@@ -35,11 +35,14 @@ enum class VideoType {
|
|
kBGR24,
|
|
kARGB,
|
|
kABGR,
|
|
+ kARGB4444,
|
|
kRGB565,
|
|
+ kARGB1555,
|
|
kYUY2,
|
|
kYV12,
|
|
kUYVY,
|
|
kMJPEG,
|
|
+ kNV21,
|
|
kBGRA,
|
|
kNV12,
|
|
};
|
|
diff --git a/common_video/libyuv/webrtc_libyuv.cc b/common_video/libyuv/webrtc_libyuv.cc
|
|
index 056f5613d1..8527f34163 100644
|
|
--- a/common_video/libyuv/webrtc_libyuv.cc
|
|
+++ b/common_video/libyuv/webrtc_libyuv.cc
|
|
@@ -36,6 +36,7 @@ size_t CalcBufferSize(VideoType type, int width, int height) {
|
|
RTC_DCHECK_GE(height, 0);
|
|
switch (type) {
|
|
case VideoType::kI420:
|
|
+ case VideoType::kNV21:
|
|
case VideoType::kIYUV:
|
|
case VideoType::kYV12:
|
|
case VideoType::kNV12: {
|
|
@@ -43,7 +44,9 @@ size_t CalcBufferSize(VideoType type, int width, int height) {
|
|
int half_height = (height + 1) >> 1;
|
|
return width * height + half_width * half_height * 2;
|
|
}
|
|
+ case VideoType::kARGB4444:
|
|
case VideoType::kRGB565:
|
|
+ case VideoType::kARGB1555:
|
|
case VideoType::kYUY2:
|
|
case VideoType::kUYVY:
|
|
return width * height * 2;
|
|
@@ -116,10 +119,16 @@ int ConvertVideoType(VideoType video_type) {
|
|
return libyuv::FOURCC_UYVY;
|
|
case VideoType::kMJPEG:
|
|
return libyuv::FOURCC_MJPG;
|
|
+ case VideoType::kNV21:
|
|
+ return libyuv::FOURCC_NV21;
|
|
case VideoType::kARGB:
|
|
return libyuv::FOURCC_ARGB;
|
|
case VideoType::kBGRA:
|
|
return libyuv::FOURCC_BGRA;
|
|
+ case VideoType::kARGB4444:
|
|
+ return libyuv::FOURCC_R444;
|
|
+ case VideoType::kARGB1555:
|
|
+ return libyuv::FOURCC_RGBO;
|
|
case VideoType::kNV12:
|
|
return libyuv::FOURCC_NV12;
|
|
}
|