From 42722ae8d397ecba55d9ceaa29191d5826f8b081 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Mon, 12 Dec 2022 15:35:37 +0800 Subject: [PATCH 1/5] add surface Signed-off-by: yangwei_814916 --- .../decoder/include/image_sink_decoder.h | 16 +++ .../decoder/src/image_sink_decoder.cpp | 107 +++++++++++++++++- .../encoder/include/image_source_encoder.h | 17 ++- .../encoder/src/image_source_encoder.cpp | 105 +++++++++++++++++ 4 files changed, 243 insertions(+), 2 deletions(-) diff --git a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h index 1e4b1cbe..35cb40c3 100644 --- a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h +++ b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h @@ -36,6 +36,14 @@ namespace OHOS { namespace DistributedHardware { +class ConsumerBufferListener : public IBufferConsumerListener { +public: + ConsumerBufferListener(const std::shared_ptr dncoder) : dncoder_(dncoder) {}; + ~ConsumerBufferListener() = default; + void OnBufferAvailable() override; +private: + std::shared_ptr dncoder_; +} class ImageSinkDecoder : public std::enable_shared_from_this { public: explicit ImageSinkDecoder(const std::shared_ptr &imageListener) @@ -48,11 +56,13 @@ public: int32_t StopDecoder(); int32_t SetOutputSurface(sptr &surface); int32_t InputScreenData(const std::shared_ptr &data); + int32_t AddSurface(); void OnError(Media::AVCodecErrorType errorType, int32_t errorCode); void OnInputBufferAvailable(uint32_t index); void OnOutputBufferAvailable(uint32_t index, Media::AVCodecBufferInfo info, Media::AVCodecBufferFlag flag); void OnOutputFormatChanged(const Media::Format &format); + void ConsumeSurface(); private: int32_t SetDecoderFormat(const VideoParam &configParam); @@ -65,6 +75,7 @@ private: private: static const constexpr char *LOG_TAG = "ImageSinkDecoder"; + VideoParam configParam_; std::mutex dataMutex_; std::mutex decodeMutex_; std::thread decodeThread_; @@ -74,6 +85,11 @@ private: Media::AVCodecBufferInfo decoderBufferInfo_; bool isDecoderReady_ = false; + sptr consumerSurface_; + sptr producerSurface_; + sptr windowSurface_; + sptr consumerBufferListener_; + std::mutex bufferMtx_; std::queue> videoDataQueue_; std::queue bufferIndexQueue_; std::shared_ptr videoDecoder_; diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 53ce8b59..87724336 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -39,10 +39,114 @@ int32_t ImageSinkDecoder::ConfigureDecoder(const VideoParam &configParam) DHLOGE("%s: SetDecoderFormat failed.", LOG_TAG); return ret; } + configParam_ = configParam; + ret = AddSurface(); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Add surface failed ret:%d.", LOG_TAG, ret); + return ret; + } return DH_SUCCESS; } +int32_t ImageSinkDecoder::AddSurface() +{ + DHLOGI("%s: AddSurface.", LOG_TAG); + consumerSurface_ = Surface::CreateSurfaceAsConsumer(); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: Create consumer surface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + + if(consumerBufferListener_ == nullptr) { + consumerBufferListener_ = new ConsumerBufferListener(shared_from_this); + } + consumerSurface_->RegisterConsumerListener(consumerBufferListener_); + + sptr preducer = consumerSurface_->GetProducer(); + if (producer == nullptr) { + DHLOGE("Get preducer surface failed."); + retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + + producerSurface_ = Surface:: CreateSurfaceAsProducer(producer); + if (producerSurface_ == nullptr) { + DHLOGE("Create preducer surface failed."); + retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + return DH_SUCCESS; +} + +void ConsumerBufferListener::OnBufferAvailable() +{ + DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + dncoder_->ConsumeSurface(); +} + +void ImageSinkDecoder::ConsumeSurface() +{ + DHLOGI("%s: ConsumeSurface.", LOG_TAG); + std::unique_lock bufLock(bufferMtx_); + if(consumerSurface_ == nullptr) { + DHLOGE("consumerSurface_ is nullptr."); + return; + } + sptr surfaceBuffer = nullptr; + int32_t fence = -1; + int64_t timestamp = 0; + OHOS::Rect damage = {0,0,0,0}; + SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("consumerSurface_ acquire buffer failed, errcode: %d", surfaceErr); + return; + } + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + + sptr windowSurfaceBuffer = nullptr; + int32_t releaseFence; + OHOS::BufferRequestConfig requestConfig = { + .width = configParam_.GetVideoWidth(), + .height = configParam_.GetVideoHeight(), + .strideAlignment = 8, + .format = PIXEL_FMT_YCBCR_420_SP, + .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, + }; + surfaceErr = windowSurface_->RequestBuffer(windowSurfaceBuffer, releaseFence, requestConfig); + if (windowSurfaceBuffer == nullptr) { + DHLOGE("windowSurface_ request buffer failed, buffer is nullptr"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + if (windowSurfaceBuffer->GetVirAddr() == nullptr) { + DHLOGE("windowSurfaceBuffer get addr failed"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); + int32_t sizeData = surfaceBuffer->GetSize(); + int32_t size = windowSurfaceBuffer->GetSize(); + int32_t cpy_ret = memcpy_s(windowSurfaceAddr, size, surfaceAddr, sizeData); + if (cpy_ret != EOK) { + DHLOGE("memcpy_s run failed"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + BufferFlushConfig flushConfig = { + .damege = { + .w = windowSurfaceBuffer->GetWidth(); + .h = windowSurfaceBuffer->GetHeight(); + }, + }; + surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer,-1,flushConfig); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("windowSurface_ flush buffer failed"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; +} + int32_t ImageSinkDecoder::ReleaseDecoder() { DHLOGI("%s: ReleaseDecoder.", LOG_TAG); @@ -205,7 +309,8 @@ int32_t ImageSinkDecoder::SetOutputSurface(sptr &surface) return ERR_DH_SCREEN_TRANS_NULL_VALUE; } - int32_t ret = videoDecoder_->SetOutputSurface(surface); + windowSurface_ = surface; + int32_t ret = videoDecoder_->SetOutputSurface(producerSurface_); if (ret != Media::MSERR_OK) { DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index d5a6dfe2..95136373 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -31,6 +31,14 @@ namespace OHOS { namespace DistributedHardware { +class ConsumerBufferListener : public IBufferConsumerListener { +public: + ConsumerBufferListener(const std::shared_ptr encoder) : encoder_(encoder) {}; + ~ConsumerBufferListener() = default; + void OnBufferAvailable() override; +private: + std::shared_ptr encoder_; +} class ImageSourceEncoder : public std::enable_shared_from_this { public: explicit ImageSourceEncoder(const std::shared_ptr &imageListener) @@ -41,15 +49,17 @@ public: int32_t ReleaseEncoder(); int32_t StartEncoder(); int32_t StopEncoder(); + int32_t AddSurface(); sptr &GetInputSurface() { - return videoSurface_; + return producerSurface_; } void OnError(Media::AVCodecErrorType errorType, int32_t errorCode); void OnOutputBufferAvailable(uint32_t index, Media::AVCodecBufferInfo info, Media::AVCodecBufferFlag flag); void OnInputBufferAvailable(uint32_t index); void OnOutputFormatChanged(const Media::Format &format); + void ConsumeSurface(); private: int32_t InitVideoEncoder(const VideoParam &configParam); @@ -60,8 +70,13 @@ private: Media::Format imageFormat_; Media::AVCodecBufferInfo encoderBufferInfo_; + VideoParam configParam_; sptr videoSurface_; + sptr consumerSurface_; + sptr producerSurface_; + sptr consumerBufferListener_; + std::mutex bufferMtx_; std::shared_ptr videoEncoder_; std::shared_ptr videoSharedMemory_; std::shared_ptr encodeVideoCallback_; diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index e5675465..8b0c8d11 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -46,9 +46,114 @@ int32_t ImageSourceEncoder::ConfigureEncoder(const VideoParam &configParam) return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } + configParam_ = configParam; + ret = AddSurface(); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Add surface failed ret:%d.", LOG_TAG, ret); + return ret; + } + + return DH_SUCCESS; +} + +int32_t ImageSourceEncoder::AddSurface() +{ + DHLOGI("%s: AddSurface.", LOG_TAG); + consumerSurface_ = Surface::CreateSurfaceAsConsumer(); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: Create consumer surface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + + if(consumerBufferListener_ == nullptr) { + consumerBufferListener_ = new ConsumerBufferListener(shared_from_this); + } + consumerSurface_->RegisterConsumerListener(consumerBufferListener_); + + sptr preducer = consumerSurface_->GetProducer(); + if (producer == nullptr) { + DHLOGE("Get preducer surface failed."); + retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + + producerSurface_ = Surface:: CreateSurfaceAsProducer(producer); + if (producerSurface_ == nullptr) { + DHLOGE("Create preducer surface failed."); + retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } return DH_SUCCESS; } +void ConsumerBufferListener::OnBufferAvailable() +{ + DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + encoder_->ConsumeSurface(); +} + +void ImageSourceEncoder::ConsumeSurface() +{ + DHLOGI("%s: ConsumeSurface.", LOG_TAG); + int32_t screenDataSize = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * 4; + std::unique_lock bufLock(bufferMtx_); + if(consumerSurface_ == nullptr) { + DHLOGE("consumerSurface_ is nullptr."); + return; + } + sptr surfaceBuffer = nullptr; + int32_t fence = -1; + int64_t timestamp = 0; + OHOS::Rect damage = {0,0,0,0}; + SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("consumerSurface_ acquire buffer failed, errcode: %d", surfaceErr); + return; + } + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + + sptr encoderSurfaceBuffer = nullptr; + int32_t releaseFence; + OHOS::BufferRequestConfig requestConfig = { + .width = configParam_.GetVideoWidth(), + .height = configParam_.GetVideoHeight(), + .strideAlignment = 8, + .format = PIXEL_FMT_RGBA_8888, + .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, + }; + surfaceErr = videoSurface_->RequestBuffer(encoderSurfaceBuffer, releaseFence, requestConfig); + if (encoderSurfaceBuffer == nullptr) { + DHLOGE("videoSurface_ request buffer failed, buffer is nullptr"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + if (encoderSurfaceBuffer->GetVirAddr() == nullptr) { + DHLOGE("encoderSurfaceBuffer get addr failed"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + auto encoderSurfaceAddr = static_cast(encoderSurfaceBuffer->GetVirAddr()); + + int32_t cpy_ret = memcpy_s(encoderSurfaceAddr, screenDataSize, surfaceAddr, screenDataSize); + if (cpy_ret != EOK) { + DHLOGE("memcpy_s run failed"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + BufferFlushConfig flushConfig = { + .damege = { + .w = encoderSurfaceBuffer->GetWidth(); + .h = encoderSurfaceBuffer->GetHeight(); + }, + }; + surfaceErr = videoSurface_->FlushBuffer(encoderSurfaceBuffer,-1,flushConfig); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("videoSurface_ flush buffer failed"); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; +} + int32_t ImageSourceEncoder::ReleaseEncoder() { DHLOGI("%s: ReleaseEncoder.", LOG_TAG); -- Gitee From 90ed8f2173ac15f076d02f5c72b064ceb2d8318f Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Mon, 12 Dec 2022 16:23:02 +0800 Subject: [PATCH 2/5] add surface Signed-off-by: yangwei_814916 --- .../decoder/include/image_sink_decoder.h | 2 +- .../decoder/src/image_sink_decoder.cpp | 24 +++++++++---------- .../encoder/include/image_source_encoder.h | 2 +- .../encoder/src/image_source_encoder.cpp | 22 ++++++++--------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h index 35cb40c3..d83377ad 100644 --- a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h +++ b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h @@ -43,7 +43,7 @@ public: void OnBufferAvailable() override; private: std::shared_ptr dncoder_; -} +}; class ImageSinkDecoder : public std::enable_shared_from_this { public: explicit ImageSinkDecoder(const std::shared_ptr &imageListener) diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 87724336..fa02c93b 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -59,27 +59,27 @@ int32_t ImageSinkDecoder::AddSurface() } if(consumerBufferListener_ == nullptr) { - consumerBufferListener_ = new ConsumerBufferListener(shared_from_this); + consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); } consumerSurface_->RegisterConsumerListener(consumerBufferListener_); - sptr preducer = consumerSurface_->GetProducer(); + sptr producer = consumerSurface_->GetProducer(); if (producer == nullptr) { DHLOGE("Get preducer surface failed."); - retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } - producerSurface_ = Surface:: CreateSurfaceAsProducer(producer); + producerSurface_ = Surface::CreateSurfaceAsProducer(producer); if (producerSurface_ == nullptr) { DHLOGE("Create preducer surface failed."); - retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } return DH_SUCCESS; } void ConsumerBufferListener::OnBufferAvailable() { - DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + DHLOGI("OnBufferAvailable."); dncoder_->ConsumeSurface(); } @@ -91,16 +91,16 @@ void ImageSinkDecoder::ConsumeSurface() DHLOGE("consumerSurface_ is nullptr."); return; } - sptr surfaceBuffer = nullptr; + sptr surfaceBuffer = nullptr; int32_t fence = -1; int64_t timestamp = 0; - OHOS::Rect damage = {0,0,0,0}; + OHOS::Rect damage = {0, 0, 0, 0}; SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("consumerSurface_ acquire buffer failed, errcode: %d", surfaceErr); return; } - auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); sptr windowSurfaceBuffer = nullptr; int32_t releaseFence; @@ -122,7 +122,7 @@ void ImageSinkDecoder::ConsumeSurface() consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); return; } - auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); + auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); int32_t sizeData = surfaceBuffer->GetSize(); int32_t size = windowSurfaceBuffer->GetSize(); int32_t cpy_ret = memcpy_s(windowSurfaceAddr, size, surfaceAddr, sizeData); @@ -133,8 +133,8 @@ void ImageSinkDecoder::ConsumeSurface() } BufferFlushConfig flushConfig = { .damege = { - .w = windowSurfaceBuffer->GetWidth(); - .h = windowSurfaceBuffer->GetHeight(); + .w = windowSurfaceBuffer->GetWidth(), + .h = windowSurfaceBuffer->GetHeight(), }, }; surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer,-1,flushConfig); diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index 95136373..3280ddfa 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -38,7 +38,7 @@ public: void OnBufferAvailable() override; private: std::shared_ptr encoder_; -} +}; class ImageSourceEncoder : public std::enable_shared_from_this { public: explicit ImageSourceEncoder(const std::shared_ptr &imageListener) diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 8b0c8d11..31b7d13d 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -66,27 +66,27 @@ int32_t ImageSourceEncoder::AddSurface() } if(consumerBufferListener_ == nullptr) { - consumerBufferListener_ = new ConsumerBufferListener(shared_from_this); + consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); } consumerSurface_->RegisterConsumerListener(consumerBufferListener_); - sptr preducer = consumerSurface_->GetProducer(); + sptr producer = consumerSurface_->GetProducer(); if (producer == nullptr) { DHLOGE("Get preducer surface failed."); - retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } producerSurface_ = Surface:: CreateSurfaceAsProducer(producer); if (producerSurface_ == nullptr) { DHLOGE("Create preducer surface failed."); - retrurn ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } return DH_SUCCESS; } void ConsumerBufferListener::OnBufferAvailable() { - DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + DHLOGI("OnBufferAvailable."); encoder_->ConsumeSurface(); } @@ -99,16 +99,16 @@ void ImageSourceEncoder::ConsumeSurface() DHLOGE("consumerSurface_ is nullptr."); return; } - sptr surfaceBuffer = nullptr; + sptr surfaceBuffer = nullptr; int32_t fence = -1; int64_t timestamp = 0; - OHOS::Rect damage = {0,0,0,0}; + OHOS::Rect damage = {0, 0, 0, 0}; SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("consumerSurface_ acquire buffer failed, errcode: %d", surfaceErr); return; } - auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); sptr encoderSurfaceBuffer = nullptr; int32_t releaseFence; @@ -130,7 +130,7 @@ void ImageSourceEncoder::ConsumeSurface() consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); return; } - auto encoderSurfaceAddr = static_cast(encoderSurfaceBuffer->GetVirAddr()); + auto encoderSurfaceAddr = static_cast(encoderSurfaceBuffer->GetVirAddr()); int32_t cpy_ret = memcpy_s(encoderSurfaceAddr, screenDataSize, surfaceAddr, screenDataSize); if (cpy_ret != EOK) { @@ -140,8 +140,8 @@ void ImageSourceEncoder::ConsumeSurface() } BufferFlushConfig flushConfig = { .damege = { - .w = encoderSurfaceBuffer->GetWidth(); - .h = encoderSurfaceBuffer->GetHeight(); + .w = encoderSurfaceBuffer->GetWidth(), + .h = encoderSurfaceBuffer->GetHeight(), }, }; surfaceErr = videoSurface_->FlushBuffer(encoderSurfaceBuffer,-1,flushConfig); -- Gitee From d2fc84e6cb78f1ab6ab05f0d3673fc30d5594772 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Mon, 12 Dec 2022 17:13:57 +0800 Subject: [PATCH 3/5] add surface Signed-off-by: yangwei_814916 --- .../decoder/src/image_sink_decoder.cpp | 8 ++++---- .../encoder/src/image_source_encoder.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index fa02c93b..fc502dae 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -58,7 +58,7 @@ int32_t ImageSinkDecoder::AddSurface() return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } - if(consumerBufferListener_ == nullptr) { + if (consumerBufferListener_ == nullptr) { consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); } consumerSurface_->RegisterConsumerListener(consumerBufferListener_); @@ -87,7 +87,7 @@ void ImageSinkDecoder::ConsumeSurface() { DHLOGI("%s: ConsumeSurface.", LOG_TAG); std::unique_lock bufLock(bufferMtx_); - if(consumerSurface_ == nullptr) { + if (consumerSurface_ == nullptr) { DHLOGE("consumerSurface_ is nullptr."); return; } @@ -132,12 +132,12 @@ void ImageSinkDecoder::ConsumeSurface() return; } BufferFlushConfig flushConfig = { - .damege = { + .damage = { .w = windowSurfaceBuffer->GetWidth(), .h = windowSurfaceBuffer->GetHeight(), }, }; - surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer,-1,flushConfig); + surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("windowSurface_ flush buffer failed"); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 31b7d13d..ee87a719 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -65,7 +65,7 @@ int32_t ImageSourceEncoder::AddSurface() return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } - if(consumerBufferListener_ == nullptr) { + if (consumerBufferListener_ == nullptr) { consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); } consumerSurface_->RegisterConsumerListener(consumerBufferListener_); @@ -95,7 +95,7 @@ void ImageSourceEncoder::ConsumeSurface() DHLOGI("%s: ConsumeSurface.", LOG_TAG); int32_t screenDataSize = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * 4; std::unique_lock bufLock(bufferMtx_); - if(consumerSurface_ == nullptr) { + if (consumerSurface_ == nullptr) { DHLOGE("consumerSurface_ is nullptr."); return; } @@ -139,12 +139,12 @@ void ImageSourceEncoder::ConsumeSurface() return; } BufferFlushConfig flushConfig = { - .damege = { + .damage = { .w = encoderSurfaceBuffer->GetWidth(), .h = encoderSurfaceBuffer->GetHeight(), }, }; - surfaceErr = videoSurface_->FlushBuffer(encoderSurfaceBuffer,-1,flushConfig); + surfaceErr = videoSurface_->FlushBuffer(encoderSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("videoSurface_ flush buffer failed"); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); -- Gitee From 64f281a9fdd6606accdbbf5f7cdc329f61701f94 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Mon, 12 Dec 2022 19:13:04 +0800 Subject: [PATCH 4/5] add surface Signed-off-by: yangwei_814916 --- .../decoder/include/image_sink_decoder.h | 6 +++--- .../screensinkprocessor/decoder/src/image_sink_decoder.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h index d83377ad..1f3c223b 100644 --- a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h +++ b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h @@ -36,10 +36,10 @@ namespace OHOS { namespace DistributedHardware { -class ConsumerBufferListener : public IBufferConsumerListener { +class ConsumBufferListener : public IBufferConsumerListener { public: - ConsumerBufferListener(const std::shared_ptr dncoder) : dncoder_(dncoder) {}; - ~ConsumerBufferListener() = default; + ConsumBufferListener(const std::shared_ptr dncoder) : dncoder_(dncoder) {}; + ~ConsumBufferListener() = default; void OnBufferAvailable() override; private: std::shared_ptr dncoder_; diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index fc502dae..4f970417 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -59,7 +59,7 @@ int32_t ImageSinkDecoder::AddSurface() } if (consumerBufferListener_ == nullptr) { - consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); + consumerBufferListener_ = new ConsumBufferListener(shared_from_this()); } consumerSurface_->RegisterConsumerListener(consumerBufferListener_); @@ -77,7 +77,7 @@ int32_t ImageSinkDecoder::AddSurface() return DH_SUCCESS; } -void ConsumerBufferListener::OnBufferAvailable() +void ConsumBufferListener::OnBufferAvailable() { DHLOGI("OnBufferAvailable."); dncoder_->ConsumeSurface(); -- Gitee From f976b76a75db3fe1abba835621206dd8f28809b7 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Tue, 13 Dec 2022 15:42:06 +0800 Subject: [PATCH 5/5] add surface Signed-off-by: yangwei_814916 --- common/include/dscreen_constants.h | 1 + .../decoder/include/image_sink_decoder.h | 6 +- .../decoder/src/image_sink_decoder.cpp | 63 +++++++++++-------- .../encoder/include/image_source_encoder.h | 7 ++- .../encoder/src/image_source_encoder.cpp | 49 ++++++++------- 5 files changed, 75 insertions(+), 51 deletions(-) diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 671a9ccc..f3a69a6b 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -87,6 +87,7 @@ constexpr int64_t MAX_YUV420_BUFFER_SIZE = 2560 * 1600 * (3 / 2) * 2; constexpr int32_t LOG_MAX_LEN = 4096; constexpr int32_t INVALID_WINDOW_ID = -1; +constexpr int32_t STRIDE_ALIGNMENT = 8; const std::string DSCREEN_LOG_TITLE_TAG = "DSCREEN"; const std::string DSCREEN_PREFIX = "DISTRIBUTED_SCREEN"; diff --git a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h index 1f3c223b..d9f23b07 100644 --- a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h +++ b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h @@ -38,11 +38,12 @@ namespace OHOS { namespace DistributedHardware { class ConsumBufferListener : public IBufferConsumerListener { public: - ConsumBufferListener(const std::shared_ptr dncoder) : dncoder_(dncoder) {}; + ConsumBufferListener(const std::shared_ptr decoder) : decoder_(decoder) {}; ~ConsumBufferListener() = default; void OnBufferAvailable() override; private: - std::shared_ptr dncoder_; + static const constexpr char *LOG_TAG = "ConsumBufferListener"; + std::shared_ptr decoder_; }; class ImageSinkDecoder : public std::enable_shared_from_this { public: @@ -89,7 +90,6 @@ private: sptr producerSurface_; sptr windowSurface_; sptr consumerBufferListener_; - std::mutex bufferMtx_; std::queue> videoDataQueue_; std::queue bufferIndexQueue_; std::shared_ptr videoDecoder_; diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 4f970417..5626fbe3 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -43,6 +43,8 @@ int32_t ImageSinkDecoder::ConfigureDecoder(const VideoParam &configParam) ret = AddSurface(); if (ret != DH_SUCCESS) { DHLOGE("%s: Add surface failed ret:%d.", LOG_TAG, ret); + consumerSurface_ = nullptr; + producerSurface_ = nullptr; return ret; } @@ -51,44 +53,44 @@ int32_t ImageSinkDecoder::ConfigureDecoder(const VideoParam &configParam) int32_t ImageSinkDecoder::AddSurface() { - DHLOGI("%s: AddSurface.", LOG_TAG); + DHLOGI("%s: AddSurface between decoder and window", LOG_TAG); consumerSurface_ = Surface::CreateSurfaceAsConsumer(); if (consumerSurface_ == nullptr) { DHLOGE("%s: Create consumer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } - if (consumerBufferListener_ == nullptr) { - consumerBufferListener_ = new ConsumBufferListener(shared_from_this()); - } - consumerSurface_->RegisterConsumerListener(consumerBufferListener_); - sptr producer = consumerSurface_->GetProducer(); if (producer == nullptr) { - DHLOGE("Get preducer surface failed."); + DHLOGE("%s: Get preducer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } producerSurface_ = Surface::CreateSurfaceAsProducer(producer); if (producerSurface_ == nullptr) { - DHLOGE("Create preducer surface failed."); + DHLOGE("%s: Create preducer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } + + if (consumerBufferListener_ == nullptr) { + consumerBufferListener_ = new ConsumBufferListener(shared_from_this()); + } + consumerSurface_->RegisterConsumerListener(consumerBufferListener_); return DH_SUCCESS; } void ConsumBufferListener::OnBufferAvailable() { - DHLOGI("OnBufferAvailable."); - dncoder_->ConsumeSurface(); + DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + decoder_->ConsumeSurface(); } void ImageSinkDecoder::ConsumeSurface() { DHLOGI("%s: ConsumeSurface.", LOG_TAG); - std::unique_lock bufLock(bufferMtx_); + std::unique_lock bufLock(decodeMutex_); if (consumerSurface_ == nullptr) { - DHLOGE("consumerSurface_ is nullptr."); + DHLOGE("%s: consumerSurface_ is nullptr.", LOG_TAG); return; } sptr surfaceBuffer = nullptr; @@ -97,38 +99,41 @@ void ImageSinkDecoder::ConsumeSurface() OHOS::Rect damage = {0, 0, 0, 0}; SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { - DHLOGE("consumerSurface_ acquire buffer failed, errcode: %d", surfaceErr); + DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %d", LOG_TAG, surfaceErr); return; } - auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); - + sptr windowSurfaceBuffer = nullptr; int32_t releaseFence; OHOS::BufferRequestConfig requestConfig = { .width = configParam_.GetVideoWidth(), .height = configParam_.GetVideoHeight(), - .strideAlignment = 8, + .strideAlignment = STRIDE_ALIGNMENT, .format = PIXEL_FMT_YCBCR_420_SP, .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, }; surfaceErr = windowSurface_->RequestBuffer(windowSurfaceBuffer, releaseFence, requestConfig); if (windowSurfaceBuffer == nullptr) { - DHLOGE("windowSurface_ request buffer failed, buffer is nullptr"); + DHLOGE("%s: windowSurface_ request buffer failed, buffer is nullptr.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + windowSurface_->CancelBuffer(windowSurfaceBuffer); return; } if (windowSurfaceBuffer->GetVirAddr() == nullptr) { - DHLOGE("windowSurfaceBuffer get addr failed"); + DHLOGE("%s: windowSurfaceBuffer get addr failed.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + windowSurface_->CancelBuffer(windowSurfaceBuffer); return; } + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); int32_t sizeData = surfaceBuffer->GetSize(); int32_t size = windowSurfaceBuffer->GetSize(); int32_t cpy_ret = memcpy_s(windowSurfaceAddr, size, surfaceAddr, sizeData); if (cpy_ret != EOK) { - DHLOGE("memcpy_s run failed"); + DHLOGE("%s: surfaceBuffer memcpy_s run failed.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + windowSurface_->CancelBuffer(windowSurfaceBuffer); return; } BufferFlushConfig flushConfig = { @@ -139,8 +144,9 @@ void ImageSinkDecoder::ConsumeSurface() }; surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { - DHLOGE("windowSurface_ flush buffer failed"); + DHLOGE("%s: windowSurface_ flush buffer failed.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + windowSurface_->CancelBuffer(windowSurfaceBuffer); return; } consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); @@ -310,12 +316,19 @@ int32_t ImageSinkDecoder::SetOutputSurface(sptr &surface) } windowSurface_ = surface; - int32_t ret = videoDecoder_->SetOutputSurface(producerSurface_); - if (ret != Media::MSERR_OK) { - DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); - return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + if (consumerSurface_ == nullptr || producerSurface_ == nullptr) { + int32_t ret = videoDecoder_->SetOutputSurface(surface); + if (ret != Media::MSERR_OK) { + DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + } else { + int32_t ret = videoDecoder_->SetOutputSurface(producerSurface_); + if (ret != Media::MSERR_OK) { + DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } } - return DH_SUCCESS; } diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index 3280ddfa..072854ce 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -37,6 +37,7 @@ public: ~ConsumerBufferListener() = default; void OnBufferAvailable() override; private: + static const constexpr char *LOG_TAG = "ConsumerBufferListener"; std::shared_ptr encoder_; }; class ImageSourceEncoder : public std::enable_shared_from_this { @@ -52,7 +53,11 @@ public: int32_t AddSurface(); sptr &GetInputSurface() { - return producerSurface_; + if (producerSurface_ == nullptr) { + return videoSurface_; + } else { + return producerSurface_; + } } void OnError(Media::AVCodecErrorType errorType, int32_t errorCode); diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index ee87a719..3458bd01 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -30,13 +30,13 @@ int32_t ImageSourceEncoder::ConfigureEncoder(const VideoParam &configParam) DHLOGI("%s: ConfigureEncoder.", LOG_TAG); int32_t ret = InitVideoEncoder(configParam); if (ret != DH_SUCCESS) { - DHLOGE("%s: Init encoder failed ret:%d.", LOG_TAG, ret); + DHLOGE("%s: Init encoder failed ret: %d.", LOG_TAG, ret); return ret; } ret = SetEncoderFormat(configParam); if (ret != DH_SUCCESS) { - DHLOGE("%s: Set encoder format failed ret:%d.", LOG_TAG, ret); + DHLOGE("%s: Set encoder format failed ret: %d.", LOG_TAG, ret); return ret; } @@ -49,7 +49,9 @@ int32_t ImageSourceEncoder::ConfigureEncoder(const VideoParam &configParam) configParam_ = configParam; ret = AddSurface(); if (ret != DH_SUCCESS) { - DHLOGE("%s: Add surface failed ret:%d.", LOG_TAG, ret); + DHLOGE("%s: Add surface failed ret: %d.", LOG_TAG, ret); + consumerSurface_ = nullptr; + producerSurface_ = nullptr; return ret; } @@ -65,38 +67,37 @@ int32_t ImageSourceEncoder::AddSurface() return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } - if (consumerBufferListener_ == nullptr) { - consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); - } - consumerSurface_->RegisterConsumerListener(consumerBufferListener_); - sptr producer = consumerSurface_->GetProducer(); if (producer == nullptr) { - DHLOGE("Get preducer surface failed."); + DHLOGE("%s: Get preducer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } producerSurface_ = Surface:: CreateSurfaceAsProducer(producer); if (producerSurface_ == nullptr) { - DHLOGE("Create preducer surface failed."); + DHLOGE("%s: Create preducer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } + + if (consumerBufferListener_ == nullptr) { + consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); + } + consumerSurface_->RegisterConsumerListener(consumerBufferListener_); return DH_SUCCESS; } void ConsumerBufferListener::OnBufferAvailable() { - DHLOGI("OnBufferAvailable."); + DHLOGI("%s: OnBufferAvailable.", LOG_TAG); encoder_->ConsumeSurface(); } void ImageSourceEncoder::ConsumeSurface() { DHLOGI("%s: ConsumeSurface.", LOG_TAG); - int32_t screenDataSize = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * 4; std::unique_lock bufLock(bufferMtx_); if (consumerSurface_ == nullptr) { - DHLOGE("consumerSurface_ is nullptr."); + DHLOGE("%s: consumerSurface_ is nullptr.", LOG_TAG); return; } sptr surfaceBuffer = nullptr; @@ -105,37 +106,40 @@ void ImageSourceEncoder::ConsumeSurface() OHOS::Rect damage = {0, 0, 0, 0}; SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { - DHLOGE("consumerSurface_ acquire buffer failed, errcode: %d", surfaceErr); + DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %d", LOG_TAG, surfaceErr); return; } - auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); - sptr encoderSurfaceBuffer = nullptr; int32_t releaseFence; OHOS::BufferRequestConfig requestConfig = { .width = configParam_.GetVideoWidth(), .height = configParam_.GetVideoHeight(), - .strideAlignment = 8, + .strideAlignment = STRIDE_ALIGNMENT, .format = PIXEL_FMT_RGBA_8888, .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, }; surfaceErr = videoSurface_->RequestBuffer(encoderSurfaceBuffer, releaseFence, requestConfig); if (encoderSurfaceBuffer == nullptr) { - DHLOGE("videoSurface_ request buffer failed, buffer is nullptr"); + DHLOGE("%s: videoSurface_ request buffer failed, buffer is nullptr.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + videoSurface_->CancelBuffer(encoderSurfaceBuffer); return; } if (encoderSurfaceBuffer->GetVirAddr() == nullptr) { - DHLOGE("encoderSurfaceBuffer get addr failed"); + DHLOGE("%s: encoderSurfaceBuffer get addr failed.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + videoSurface_->CancelBuffer(encoderSurfaceBuffer); return; } - auto encoderSurfaceAddr = static_cast(encoderSurfaceBuffer->GetVirAddr()); + int32_t screenDataSize = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * 4; + auto encoderSurfaceAddr = static_cast(encoderSurfaceBuffer->GetVirAddr()); + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); int32_t cpy_ret = memcpy_s(encoderSurfaceAddr, screenDataSize, surfaceAddr, screenDataSize); if (cpy_ret != EOK) { - DHLOGE("memcpy_s run failed"); + DHLOGE("%s: surfaceBuffer memcpy_s run failed.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + videoSurface_->CancelBuffer(encoderSurfaceBuffer); return; } BufferFlushConfig flushConfig = { @@ -146,8 +150,9 @@ void ImageSourceEncoder::ConsumeSurface() }; surfaceErr = videoSurface_->FlushBuffer(encoderSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { - DHLOGE("videoSurface_ flush buffer failed"); + DHLOGE("%s: videoSurface_ flush buffer failed.", LOG_TAG); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + videoSurface_->CancelBuffer(encoderSurfaceBuffer); return; } consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); -- Gitee