diff --git a/services/src/camera_device.cpp b/services/src/camera_device.cpp index 5e1c0ca4e3390c5458764eea3c56843ec91a21af..5d5e8e7a8cef069f475165a3c6780a371b2f63d1 100755 --- a/services/src/camera_device.cpp +++ b/services/src/camera_device.cpp @@ -531,14 +531,15 @@ int32_t CaptureAssistant::SetFrameConfig(FrameConfig &fc, uint32_t *streamId) /* Block method, waiting for capture completed */ int32_t CaptureAssistant::Start(uint32_t streamId) { + int32_t retCode = MEDIA_ERR; state_ = LOOP_LOOPING; HalCameraStreamOn(cameraId_, streamId); int32_t ret = CodecStart(vencHdl_); if (ret != 0) { MEDIA_ERR_LOG("Start capture encoder failed.(ret=%d)", ret); - state_ = LOOP_STOP; - return MEDIA_ERR; + goto FREE_RESOURCE; } + do { SurfaceBuffer *surfaceBuf = capSurface_->RequestBuffer(); if (surfaceBuf == nullptr) { @@ -551,7 +552,6 @@ int32_t CaptureAssistant::Start(uint32_t streamId) if (ret != 0) { capSurface_->CancelBuffer(surfaceBuf); MEDIA_ERR_LOG("Dequeue capture frame failed.(ret=%d)", ret); - ret = MEDIA_ERR; break; } @@ -559,14 +559,11 @@ int32_t CaptureAssistant::Start(uint32_t streamId) void *buf = surfaceBuf->GetVirAddr(); if (buf == nullptr) { MEDIA_ERR_LOG("Invalid buffer address."); - ret = MEDIA_ERR; break; } - ret = CopyCodecOutput(buf, &size, &outInfo); - if (ret != MEDIA_OK) { + if (CopyCodecOutput(buf, &size, &outInfo) != MEDIA_OK) { MEDIA_ERR_LOG("No available buffer in capSurface_."); capSurface_->CancelBuffer(surfaceBuf); - ret = MEDIA_ERR; break; } surfaceBuf->SetSize(capSurface_->GetSize() - size); @@ -574,21 +571,24 @@ int32_t CaptureAssistant::Start(uint32_t streamId) if (capSurface_->FlushBuffer(surfaceBuf) != 0) { MEDIA_ERR_LOG("Flush surface buffer failed."); capSurface_->CancelBuffer(surfaceBuf); - ret = MEDIA_ERR; break; } - ret = MEDIA_OK; CodecQueueOutput(vencHdl_, &outInfo, 0, -1); // 0:no timeout -1:no fd + retCode = MEDIA_OK; } while (0); CodecStop(vencHdl_); + +FREE_RESOURCE: CodecDestroy(vencHdl_); HalCameraStreamOff(cameraId_, streamId); HalCameraStreamDestroy(cameraId_, streamId); + delete capSurface_; + capSurface_ = nullptr; state_ = LOOP_STOP; - return ret; + return retCode; } int32_t CaptureAssistant::Stop()