diff --git a/frameworks/native/capi/screencapture/native_avscreen_capture.cpp b/frameworks/native/capi/screencapture/native_avscreen_capture.cpp index 8278026f1fbbd6485e9217246244d728a721aee4..1c0f58009c4a9aaf4aaa96df2fe2f56aa525a951 100644 --- a/frameworks/native/capi/screencapture/native_avscreen_capture.cpp +++ b/frameworks/native/capi/screencapture/native_avscreen_capture.cpp @@ -16,6 +16,7 @@ #include "native_avscreen_capture.h" #include +#include #include #include @@ -36,6 +37,7 @@ constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN, "NativeScre typedef struct NativeWindow OHNativeWindow; using namespace OHOS::Media; +static std::queue referencedBuffer_; class NativeScreenCaptureCallback; struct ScreenCaptureObject : public OH_AVScreenCapture { @@ -626,6 +628,9 @@ OH_NativeBuffer* OH_AVScreenCapture_AcquireVideoBuffer(struct OH_AVScreenCapture OH_NativeBuffer* nativebuffer = sufacebuffer->SurfaceBufferToNativeBuffer(); OH_NativeBuffer_Reference(nativebuffer); + referencedBuffer_.push(nativebuffer); + MEDIA_LOGD("return and reference the nativebuffer"); + return nativebuffer; } @@ -641,6 +646,14 @@ OH_AVSCREEN_CAPTURE_ErrCode OH_AVScreenCapture_ReleaseVideoBuffer(struct OH_AVSc MEDIA_LOGE("ReleaseVideoBuffer() not permit for has set DataCallback"); return AV_SCREEN_CAPTURE_ERR_OPERATE_NOT_PERMIT; } + + if (!referencedBuffer_.empty()) { + OH_NativeBuffer* nativebuffer = referencedBuffer_.front(); + OH_NativeBuffer_Unreference(nativebuffer); + referencedBuffer_.pop(); + MEDIA_LOGD("unreference the front nativebuffer"); + } + int32_t ret = screenCaptureObj->screenCapture_->ReleaseVideoBuffer(); CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, AV_SCREEN_CAPTURE_ERR_OPERATE_NOT_PERMIT, "ReleaseVideoBuffer failed!");