summaryrefslogtreecommitdiffstats
path: root/libcamera/SecCameraHWInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libcamera/SecCameraHWInterface.cpp')
-rw-r--r--libcamera/SecCameraHWInterface.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/libcamera/SecCameraHWInterface.cpp b/libcamera/SecCameraHWInterface.cpp
index 5b45654..0e2a418 100644
--- a/libcamera/SecCameraHWInterface.cpp
+++ b/libcamera/SecCameraHWInterface.cpp
@@ -732,6 +732,9 @@ void CameraHardwareSec::stopPreview()
{
LOGV("%s :", __func__);
+ if (!previewEnabled())
+ return;
+
/* request that the preview thread exit. we can wait because we're
* called by CameraServices with a lock but it has disabled all preview
* related callbacks so previewThread should not invoke any callbacks.
@@ -1129,11 +1132,12 @@ int CameraHardwareSec::pictureThread()
if(isLSISensor) {
LOGI("== Camera Sensor Detect %s - Samsung LSI SOC 5M ==\n", mCameraSensorName);
// LSI 5M SOC
- SplitFrame(jpeg_data, SecCamera::getInterleaveDataSize(),
+ if (!SplitFrame(jpeg_data, SecCamera::getInterleaveDataSize(),
SecCamera::getJpegLineLength(),
mPostViewWidth * 2, mPostViewWidth,
JpegHeap->base(), &JpegImageSize,
- PostviewHeap->base(), &mPostViewSize);
+ PostviewHeap->base(), &mPostViewSize))
+ return UNKNOWN_ERROR;
} else {
LOGI("== Camera Sensor Detect %s Sony SOC 5M ==\n", mCameraSensorName);
decodeInterleaveData(jpeg_data, SecCamera::getInterleaveDataSize(), mPostViewWidth, mPostViewHeight,
@@ -1265,6 +1269,10 @@ status_t CameraHardwareSec::takePicture()
status_t CameraHardwareSec::cancelPicture()
{
+ mPictureThread->requestExitAndWait();
+
+ mSecCamera->cancelPicture();
+
LOGW("%s : not supported, just returning NO_ERROR", __func__);
return NO_ERROR;
}
@@ -1347,14 +1355,22 @@ bool CameraHardwareSec::SplitFrame(unsigned char *pFrame, int dwSize,
while (pSrc < pSrcEnd) {
// Check video start marker
if (CheckVideoStartMarker(pSrc)) {
+ int copyLength;
+
+ if (pSrc + dwVideoLineLength <= pSrcEnd)
+ copyLength = dwVideoLineLength;
+ else
+ copyLength = pSrcEnd - pSrc - VIDEO_COMMENT_MARKER_LENGTH;
+
// Copy video data
if (pV) {
- memcpy(pV, pSrc + VIDEO_COMMENT_MARKER_LENGTH, dwVideoLineLength);
- pV += dwVideoLineLength;
- dwVSize += dwVideoLineLength;
+ memcpy(pV, pSrc + VIDEO_COMMENT_MARKER_LENGTH, copyLength);
+ pV += copyLength;
+ dwVSize += copyLength;
}
- pSrc += dwVideoLineLength + VIDEO_COMMENT_MARKER_LENGTH;
- } else {
+
+ pSrc += copyLength + VIDEO_COMMENT_MARKER_LENGTH;
+ } else {
// Copy pure JPEG data
int size = 0;
int dwCopyBufLen = dwJPEGLineLength <= pSrcEnd-pSrc ? dwJPEGLineLength : pSrcEnd - pSrc;
@@ -1379,7 +1395,6 @@ bool CameraHardwareSec::SplitFrame(unsigned char *pFrame, int dwSize,
pJ += dwCopyBufLen;
pSrc += dwCopyBufLen;
}
-
if (isFinishJpeg)
break;
}