mirror of
https://github.com/opencv/opencv.git
synced 2025-08-05 22:19:14 +08:00
Fix for frame stride wider than frame width for 1080p issue
This commit is contained in:
parent
ebaf8cc06c
commit
3390da6beb
@ -181,6 +181,7 @@ class AndroidCameraCapture : public IVideoCapture
|
||||
std::shared_ptr<ACameraCaptureSession> captureSession;
|
||||
CaptureSessionState sessionState = CaptureSessionState::INITIALIZING;
|
||||
int32_t frameWidth = 0;
|
||||
int32_t frameStride = 0;
|
||||
int32_t frameHeight = 0;
|
||||
int32_t colorFormat;
|
||||
std::vector<uint8_t> buffer;
|
||||
@ -307,8 +308,11 @@ public:
|
||||
AImage_getPlaneData(image.get(), 1, &uPixel, &uLen);
|
||||
AImage_getPlaneData(image.get(), 2, &vPixel, &vLen);
|
||||
AImage_getPlanePixelStride(image.get(), 1, &uvPixelStride);
|
||||
int32_t yBufferLen = yLen;
|
||||
|
||||
if ( (uvPixelStride == 2) && (uPixel == vPixel + 1) && (yLen == frameWidth * frameHeight) && (uLen == ((yLen / 2) - 1)) && (vLen == uLen) ) {
|
||||
if ( (uvPixelStride == 2) && (uPixel == vPixel + 1) && (yLen == (yStride * (frameHeight - 1)) + frameWidth) && (uLen == (uvStride * ((frameHeight / 2) - 1)) + frameWidth - 1) && (uvStride == yStride) && (vLen == uLen) ) {
|
||||
frameStride = yStride;
|
||||
yBufferLen = frameStride * frameHeight;
|
||||
colorFormat = COLOR_FormatYUV420SemiPlanar;
|
||||
if (fourCC == FOURCC_UNKNOWN) {
|
||||
fourCC = FOURCC_NV21;
|
||||
@ -326,8 +330,8 @@ public:
|
||||
}
|
||||
|
||||
buffer.clear();
|
||||
buffer.insert(buffer.end(), yPixel, yPixel + yLen);
|
||||
buffer.insert(buffer.end(), vPixel, vPixel + yLen / 2);
|
||||
buffer.insert(buffer.end(), yPixel, yPixel + yBufferLen);
|
||||
buffer.insert(buffer.end(), vPixel, vPixel + yBufferLen / 2);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -336,8 +340,8 @@ public:
|
||||
if (buffer.empty()) {
|
||||
return false;
|
||||
}
|
||||
Mat yuv(frameHeight + frameHeight/2, frameWidth, CV_8UC1, buffer.data());
|
||||
if (colorFormat == COLOR_FormatYUV420Planar) {
|
||||
Mat yuv(frameHeight + frameHeight/2, frameWidth, CV_8UC1, buffer.data());
|
||||
switch (fourCC) {
|
||||
case FOURCC_BGR:
|
||||
cv::cvtColor(yuv, out, cv::COLOR_YUV2BGR_YV12);
|
||||
@ -356,18 +360,20 @@ public:
|
||||
break;
|
||||
}
|
||||
} else if (colorFormat == COLOR_FormatYUV420SemiPlanar) {
|
||||
Mat yuv(frameHeight + frameHeight/2, frameStride, CV_8UC1, buffer.data());
|
||||
Mat tmp = (frameWidth == frameStride) ? yuv : yuv(Rect(0, 0, frameWidth, frameHeight + frameHeight / 2));
|
||||
switch (fourCC) {
|
||||
case FOURCC_BGR:
|
||||
cv::cvtColor(yuv, out, cv::COLOR_YUV2BGR_NV21);
|
||||
cv::cvtColor(tmp, out, cv::COLOR_YUV2BGR_NV21);
|
||||
break;
|
||||
case FOURCC_RGB:
|
||||
cv::cvtColor(yuv, out, cv::COLOR_YUV2RGB_NV21);
|
||||
cv::cvtColor(tmp, out, cv::COLOR_YUV2RGB_NV21);
|
||||
break;
|
||||
case FOURCC_GRAY:
|
||||
cv::cvtColor(yuv, out, cv::COLOR_YUV2GRAY_NV21);
|
||||
cv::cvtColor(tmp, out, cv::COLOR_YUV2GRAY_NV21);
|
||||
break;
|
||||
case FOURCC_NV21:
|
||||
yuv.copyTo(out);
|
||||
tmp.copyTo(out);
|
||||
break;
|
||||
default:
|
||||
LOGE("Unexpected FOURCC value: %d", fourCC);
|
||||
|
Loading…
Reference in New Issue
Block a user