From 4a93dee2d8a527023e0b9a06b23245c1d9781839 Mon Sep 17 00:00:00 2001 From: t00605578 Date: Sun, 24 Apr 2022 17:28:24 +0800 Subject: [PATCH 1/3] xxxxx Signed-off-by: t00605578 --- services/data_process/BUILD.gn | 2 +- .../include/pipeline/dcamera_pipeline_sink.h | 12 +- .../pipeline/dcamera_pipeline_source.h | 12 +- .../convert_nv12_to_nv21.h | 2 +- .../fpscontroller/fps_controller_process.h | 18 +-- .../decoder/decode_data_process.h | 27 ++-- .../decoder/decode_surface_listener.h | 2 +- .../decoder/decode_video_callback.h | 2 +- .../encoder/encode_data_process.h | 64 +++++----- .../encoder/encode_video_callback.h | 2 +- .../include/utils/image_common_type.h | 2 +- .../convert_nv12_to_nv21.cpp | 2 +- .../fpscontroller/fps_controller_process.cpp | 2 +- .../decoder/decode_data_process.cpp | 116 ++++++++++-------- .../decoder/decode_data_process_common.cpp | 93 ++++++++------ .../decoder/decode_surface_listener.cpp | 2 +- .../decoder/decode_video_callback.cpp | 4 +- .../encoder/encode_data_process.cpp | 58 ++++++--- .../encoder/encode_data_process_common.cpp | 59 +++++---- .../encoder/encode_video_callback.cpp | 4 +- .../src/utils/image_common_type.cpp | 2 +- 21 files changed, 281 insertions(+), 206 deletions(-) diff --git a/services/data_process/BUILD.gn b/services/data_process/BUILD.gn index 74c3409b..75a37513 100644 --- a/services/data_process/BUILD.gn +++ b/services/data_process/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/services/data_process/include/pipeline/dcamera_pipeline_sink.h b/services/data_process/include/pipeline/dcamera_pipeline_sink.h index 13df907d..60f6c23d 100644 --- a/services/data_process/include/pipeline/dcamera_pipeline_sink.h +++ b/services/data_process/include/pipeline/dcamera_pipeline_sink.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -54,11 +54,11 @@ private: private: const static std::string PIPELINE_OWNER; - const static uint32_t MAX_FRAME_RATE = 30; - const static uint32_t MIN_VIDEO_WIDTH = 320; - const static uint32_t MIN_VIDEO_HEIGHT = 240; - const static uint32_t MAX_VIDEO_WIDTH = 1920; - const static uint32_t MAX_VIDEO_HEIGHT = 1080; + constexpr static uint32_t MAX_FRAME_RATE = 30; + constexpr static uint32_t MIN_VIDEO_WIDTH = 320; + constexpr static uint32_t MIN_VIDEO_HEIGHT = 240; + constexpr static uint32_t MAX_VIDEO_WIDTH = 1920; + constexpr static uint32_t MAX_VIDEO_HEIGHT = 1080; std::shared_ptr processListener_ = nullptr; std::shared_ptr pipelineHead_ = nullptr; diff --git a/services/data_process/include/pipeline/dcamera_pipeline_source.h b/services/data_process/include/pipeline/dcamera_pipeline_source.h index 3e665141..14e0ed5b 100644 --- a/services/data_process/include/pipeline/dcamera_pipeline_source.h +++ b/services/data_process/include/pipeline/dcamera_pipeline_source.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -57,11 +57,11 @@ private: private: const static std::string PIPELINE_OWNER; - const static uint32_t MAX_FRAME_RATE = 30; - const static uint32_t MIN_VIDEO_WIDTH = 320; - const static uint32_t MIN_VIDEO_HEIGHT = 240; - const static uint32_t MAX_VIDEO_WIDTH = 1920; - const static uint32_t MAX_VIDEO_HEIGHT = 1080; + constexpr static uint32_t MAX_FRAME_RATE = 30; + constexpr static uint32_t MIN_VIDEO_WIDTH = 320; + constexpr static uint32_t MIN_VIDEO_HEIGHT = 240; + constexpr static uint32_t MAX_VIDEO_WIDTH = 1920; + constexpr static uint32_t MAX_VIDEO_HEIGHT = 1080; std::shared_ptr processListener_ = nullptr; std::shared_ptr pipelineHead_ = nullptr; diff --git a/services/data_process/include/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.h b/services/data_process/include/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.h index 515da244..5f950716 100644 --- a/services/data_process/include/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.h +++ b/services/data_process/include/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/include/pipeline_node/fpscontroller/fps_controller_process.h b/services/data_process/include/pipeline_node/fpscontroller/fps_controller_process.h index 9afbe082..29a48c8b 100644 --- a/services/data_process/include/pipeline_node/fpscontroller/fps_controller_process.h +++ b/services/data_process/include/pipeline_node/fpscontroller/fps_controller_process.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -46,15 +46,15 @@ private: int32_t FpsControllerDone(std::vector>& outputBuffers); private: - const static uint32_t MAX_TARGET_FRAME_RATE = 30; - const static int32_t VIDEO_FRAME_DROP_INTERVAL = 4; - const static int32_t MIN_INCOME_FRAME_NUM_COEFFICIENT = 3; - const static int32_t INCOME_FRAME_TIME_HISTORY_WINDOWS_SIZE = 60; + constexpr static uint32_t MAX_TARGET_FRAME_RATE = 30; + constexpr static int32_t VIDEO_FRAME_DROP_INTERVAL = 4; + constexpr static int32_t MIN_INCOME_FRAME_NUM_COEFFICIENT = 3; + constexpr static int32_t INCOME_FRAME_TIME_HISTORY_WINDOWS_SIZE = 60; /* Receive video frame detect time windows */ - const static int32_t FRAME_HISTORY_TIME_WINDOWS_MS = 2000; - const static int64_t FRMAE_MAX_INTERVAL_TIME_WINDOW_MS = 700; - const static int32_t OVERSHOOT_MODIFY_COEFFICIENT = 3; - const static int32_t DOUBLE_MULTIPLE = 2; + constexpr static int32_t FRAME_HISTORY_TIME_WINDOWS_MS = 2000; + constexpr static int64_t FRMAE_MAX_INTERVAL_TIME_WINDOW_MS = 700; + constexpr static int32_t OVERSHOOT_MODIFY_COEFFICIENT = 3; + constexpr static int32_t DOUBLE_MULTIPLE = 2; std::mutex mtx; VideoConfigParams sourceConfig_; diff --git a/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_data_process.h b/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_data_process.h index 1e96fedc..ac6d755c 100644 --- a/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_data_process.h +++ b/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_data_process.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -85,25 +85,30 @@ private: void ReleaseCodecEvent(); int32_t FeedDecoderInputBuffer(); int64_t GetDecoderTimeStamp(); + void IncreaseWaitDecodeCnt(); + void ReduceWaitDecodeCnt(); void CopyDecodedImage(const sptr& surBuf, int64_t timeStampUs, int32_t alignedWidth, int32_t alignedHeight); int32_t CopyYUVPlaneByRow(const ImageUnitInfo& srcImgInfo, const ImageUnitInfo& dstImgInfo); int32_t CheckCopyImageInfo(const ImageUnitInfo& srcImgInfo, const ImageUnitInfo& dstImgInfo); bool IsCorrectImageUnitInfo(const ImageUnitInfo& imgInfo); + bool IsCorrectSurfaceBuffer(const sptr& surBuf, int32_t alignedWidth, int32_t alignedHeight); void PostOutputDataBuffers(std::shared_ptr& outputBuffer); int32_t DecodeDone(std::vector>& outputBuffers); private: - const static int32_t VIDEO_DECODER_QUEUE_MAX = 1000; - const static int32_t MAX_YUV420_BUFFER_SIZE = 1920 * 1080 * 3 / 2 * 2; - const static int32_t MAX_RGB32_BUFFER_SIZE = 1920 * 1080 * 4 * 2; - const static uint32_t MAX_FRAME_RATE = 30; - const static uint32_t MIN_VIDEO_WIDTH = 320; - const static uint32_t MIN_VIDEO_HEIGHT = 240; - const static uint32_t MAX_VIDEO_WIDTH = 1920; - const static uint32_t MAX_VIDEO_HEIGHT = 1080; - const static int32_t FIRST_FRAME_INPUT_NUM = 2; - const static int32_t RGB32_MEMORY_COEFFICIENT = 4; + constexpr static int32_t VIDEO_DECODER_QUEUE_MAX = 1000; + constexpr static int32_t MAX_YUV420_BUFFER_SIZE = 1920 * 1080 * 3 / 2 * 2; + constexpr static int32_t MAX_RGB32_BUFFER_SIZE = 1920 * 1080 * 4 * 2; + constexpr static uint32_t MAX_FRAME_RATE = 30; + constexpr static uint32_t MIN_VIDEO_WIDTH = 320; + constexpr static uint32_t MIN_VIDEO_HEIGHT = 240; + constexpr static uint32_t MAX_VIDEO_WIDTH = 1920; + constexpr static uint32_t MAX_VIDEO_HEIGHT = 1080; + constexpr static int32_t FIRST_FRAME_INPUT_NUM = 2; + constexpr static int32_t RGB32_MEMORY_COEFFICIENT = 4; + constexpr static int32_t YUV_BYTES_PER_PIXEL = 3; + constexpr static int32_t Y2UV_RATIO = 2; std::mutex mtxDecoderState_; std::mutex mtxHoldCount_; diff --git a/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_surface_listener.h b/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_surface_listener.h index 04b011c0..ef0e6bd7 100644 --- a/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_surface_listener.h +++ b/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_surface_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_video_callback.h b/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_video_callback.h index cec129eb..0a35ee51 100644 --- a/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_video_callback.h +++ b/services/data_process/include/pipeline_node/multimedia_codec/decoder/decode_video_callback.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h b/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h index d77dede6..0ee7f96f 100644 --- a/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h +++ b/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -68,41 +68,43 @@ private: int32_t FeedEncoderInputBuffer(std::shared_ptr& inputBuffer); sptr GetEncoderInputSurfaceBuffer(); int64_t GetEncoderTimeStamp(); + void IncreaseWaitDecodeCnt(); + void ReduceWaitDecodeCnt(); int32_t GetEncoderOutputBuffer(uint32_t index, Media::AVCodecBufferInfo info); int32_t EncodeDone(std::vector>& outputBuffers); private: - const static int32_t ENCODER_STRIDE_ALIGNMENT = 8; - const static int64_t NORM_YUV420_BUFFER_SIZE = 1920 * 1080 * 3 / 2; - const static int32_t NORM_RGB32_BUFFER_SIZE = 1920 * 1080 * 4; - const static uint32_t MAX_FRAME_RATE = 30; - const static uint32_t MIN_VIDEO_WIDTH = 320; - const static uint32_t MIN_VIDEO_HEIGHT = 240; - const static uint32_t MAX_VIDEO_WIDTH = 1920; - const static uint32_t MAX_VIDEO_HEIGHT = 1080; - const static int32_t IDR_FRAME_INTERVAL_MS = 300; - const static int32_t FIRST_FRAME_OUTPUT_NUM = 2; + constexpr static int32_t ENCODER_STRIDE_ALIGNMENT = 8; + constexpr static int64_t NORM_YUV420_BUFFER_SIZE = 1920 * 1080 * 3 / 2; + constexpr static int32_t NORM_RGB32_BUFFER_SIZE = 1920 * 1080 * 4; + constexpr static uint32_t MAX_FRAME_RATE = 30; + constexpr static uint32_t MIN_VIDEO_WIDTH = 320; + constexpr static uint32_t MIN_VIDEO_HEIGHT = 240; + constexpr static uint32_t MAX_VIDEO_WIDTH = 1920; + constexpr static uint32_t MAX_VIDEO_HEIGHT = 1080; + constexpr static int32_t IDR_FRAME_INTERVAL_MS = 300; + constexpr static int32_t FIRST_FRAME_OUTPUT_NUM = 2; - const static int64_t WIDTH_320_HEIGHT_240 = 320 * 240; - const static int64_t WIDTH_480_HEIGHT_360 = 480 * 360; - const static int64_t WIDTH_640_HEIGHT_360 = 640 * 360; - const static int64_t WIDTH_640_HEIGHT_480 = 640 * 480; - const static int64_t WIDTH_720_HEIGHT_540 = 720 * 540; - const static int64_t WIDTH_960_HEIGHT_540 = 960 * 540; - const static int64_t WIDTH_960_HEIGHT_720 = 960 * 720; - const static int64_t WIDTH_1280_HEIGHT_720 = 1280 * 720; - const static int64_t WIDTH_1440_HEIGHT_1080 = 1440 * 1080; - const static int64_t WIDTH_1920_HEIGHT_1080 = 1920 * 1080; - const static int32_t BITRATE_500000 = 500000; - const static int32_t BITRATE_1110000 = 1110000; - const static int32_t BITRATE_1500000 = 1500000; - const static int32_t BITRATE_1800000 = 1800000; - const static int32_t BITRATE_2100000 = 2100000; - const static int32_t BITRATE_2300000 = 2300000; - const static int32_t BITRATE_2800000 = 2800000; - const static int32_t BITRATE_3400000 = 3400000; - const static int32_t BITRATE_5000000 = 5000000; - const static int32_t BITRATE_6000000 = 6000000; + constexpr static int64_t WIDTH_320_HEIGHT_240 = 320 * 240; + constexpr static int64_t WIDTH_480_HEIGHT_360 = 480 * 360; + constexpr static int64_t WIDTH_640_HEIGHT_360 = 640 * 360; + constexpr static int64_t WIDTH_640_HEIGHT_480 = 640 * 480; + constexpr static int64_t WIDTH_720_HEIGHT_540 = 720 * 540; + constexpr static int64_t WIDTH_960_HEIGHT_540 = 960 * 540; + constexpr static int64_t WIDTH_960_HEIGHT_720 = 960 * 720; + constexpr static int64_t WIDTH_1280_HEIGHT_720 = 1280 * 720; + constexpr static int64_t WIDTH_1440_HEIGHT_1080 = 1440 * 1080; + constexpr static int64_t WIDTH_1920_HEIGHT_1080 = 1920 * 1080; + constexpr static int32_t BITRATE_500000 = 500000; + constexpr static int32_t BITRATE_1110000 = 1110000; + constexpr static int32_t BITRATE_1500000 = 1500000; + constexpr static int32_t BITRATE_1800000 = 1800000; + constexpr static int32_t BITRATE_2100000 = 2100000; + constexpr static int32_t BITRATE_2300000 = 2300000; + constexpr static int32_t BITRATE_2800000 = 2800000; + constexpr static int32_t BITRATE_3400000 = 3400000; + constexpr static int32_t BITRATE_5000000 = 5000000; + constexpr static int32_t BITRATE_6000000 = 6000000; const static std::map ENCODER_BITRATE_TABLE; std::mutex mtxEncoderState_; diff --git a/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_video_callback.h b/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_video_callback.h index 34f6fc11..0cffb62a 100644 --- a/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_video_callback.h +++ b/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_video_callback.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/include/utils/image_common_type.h b/services/data_process/include/utils/image_common_type.h index 9e302d96..a176c85d 100644 --- a/services/data_process/include/utils/image_common_type.h +++ b/services/data_process/include/utils/image_common_type.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp b/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp index 3a023eff..a4287bc1 100644 --- a/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp +++ b/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp b/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp index 1e9b3562..4866fb7c 100644 --- a/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp +++ b/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process.cpp b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process.cpp index ab263856..c76934da 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -286,10 +286,8 @@ void DecodeDataProcess::ReleaseProcessNode() ReleaseDecoderSurface(); processType_ = ""; - std::queue> emptyBuffersQueue; - inputBuffersQueue_.swap(emptyBuffersQueue); - std::queue emptyIndexsQueue; - availableInputIndexsQueue_.swap(emptyIndexsQueue); + std::queue>().swap(inputBuffersQueue_); + std::queue().swap(availableInputIndexsQueue_); waitDecoderOutputCount_ = 0; lastFeedDecoderInputBufferTimeUs_ = 0; outputTimeStampUs_ = 0; @@ -388,27 +386,44 @@ int32_t DecodeDataProcess::FeedDecoderInputBuffer() inputBuffersQueue_.pop(); DHLOGD("Push inputBuffer sucess. inputBuffersQueue size is %d.", inputBuffersQueue_.size()); - { - std::lock_guard lck(mtxHoldCount_); - availableInputIndexsQueue_.pop(); - waitDecoderOutputCount_++; - DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); - } + IncreaseWaitDecodeCnt(); } return DCAMERA_OK; } int64_t DecodeDataProcess::GetDecoderTimeStamp() { - int64_t TimeDifferenceStampUs = 0; + int64_t TimeIntervalStampUs = 0; int64_t nowTimeUs = GetNowTimeStampUs(); if (lastFeedDecoderInputBufferTimeUs_ == 0) { lastFeedDecoderInputBufferTimeUs_ = nowTimeUs; - return TimeDifferenceStampUs; + return TimeIntervalStampUs; } - TimeDifferenceStampUs = nowTimeUs - lastFeedDecoderInputBufferTimeUs_; + TimeIntervalStampUs = nowTimeUs - lastFeedDecoderInputBufferTimeUs_; lastFeedDecoderInputBufferTimeUs_ = nowTimeUs; - return TimeDifferenceStampUs; + return TimeIntervalStampUs; +} + +void DecodeDataProcess::IncreaseWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + availableInputIndexsQueue_.pop(); + waitDecoderOutputCount_++; + DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); +} + +void DecodeDataProcess::ReduceWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + if (waitDecoderOutputCount_ <= 0) { + DHLOGE("The waitDecoderOutputCount_ = %d.", waitDecoderOutputCount_); + } + if (outputTimeStampUs_ == 0) { + waitDecoderOutputCount_ -= FIRST_FRAME_INPUT_NUM; + } else { + waitDecoderOutputCount_--; + } + DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); } void DecodeDataProcess::GetDecoderOutputBuffer(const sptr& surface) @@ -433,44 +448,24 @@ void DecodeDataProcess::GetDecoderOutputBuffer(const sptr& surface) CopyDecodedImage(surfaceBuffer, timeStampUs, alignedWidth, alignedHeight); surface->ReleaseBuffer(surfaceBuffer, -1); outputTimeStampUs_ = timeStampUs; - { - std::lock_guard lck(mtxHoldCount_); - if (waitDecoderOutputCount_ <= 0) { - DHLOGE("The waitDecoderOutputCount_ = %d.", waitDecoderOutputCount_); - } - if (outputTimeStampUs_ == 0) { - waitDecoderOutputCount_ -= FIRST_FRAME_INPUT_NUM; - } else { - waitDecoderOutputCount_--; - } - DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); - } + ReduceWaitDecodeCnt(); } void DecodeDataProcess::CopyDecodedImage(const sptr& surBuf, int64_t timeStampUs, int32_t alignedWidth, int32_t alignedHeight) { - if (surBuf == nullptr) { - DHLOGE("surface buffer is null!"); + if (!IsCorrectSurfaceBuffer(surBuf, alignedWidth, alignedHeight)) { + DHLOGE("Surface output buffer error."); return; } - int32_t y2UvRatio = 2; - int32_t bytesPerPixel = 3; - size_t validDecodedImageAlignedSize = static_cast(alignedWidth * alignedHeight * - bytesPerPixel / y2UvRatio); - size_t validDecodedImageSize = static_cast(sourceConfig_.GetWidth() * sourceConfig_.GetHeight() * - bytesPerPixel / y2UvRatio); - size_t surfaceBufSize = static_cast(surBuf->GetSize()); - if (validDecodedImageAlignedSize > surfaceBufSize || validDecodedImageAlignedSize < validDecodedImageSize) { - DHLOGE("Buffer size error, validDecodedImageSize %zu, validDecodedImageAlignedSize %zu, surBufSize %zu.", - validDecodedImageSize, validDecodedImageAlignedSize, surBuf->GetSize()); - return; - } - std::shared_ptr bufferOutput = std::make_shared(validDecodedImageSize); + + size_t yuvImageSize = static_cast(sourceConfig_.GetWidth() * sourceConfig_.GetHeight() * + YUV_BYTES_PER_PIXEL / Y2UV_RATIO); + std::shared_ptr bufferOutput = std::make_shared(yuvImageSize); uint8_t *addr = static_cast(surBuf->GetVirAddr()); if (alignedWidth == static_cast(sourceConfig_.GetWidth()) && alignedHeight == static_cast(sourceConfig_.GetHeight())) { - errno_t err = memcpy_s(bufferOutput->Data(), bufferOutput->Size(), addr, validDecodedImageSize); + errno_t err = memcpy_s(bufferOutput->Data(), bufferOutput->Size(), addr, yuvImageSize); if (err != EOK) { DHLOGE("memcpy_s surface buffer failed."); return; @@ -478,7 +473,7 @@ void DecodeDataProcess::CopyDecodedImage(const sptr& surBuf, int6 } else { ImageUnitInfo srcImgInfo = { sourceConfig_.GetVideoformat(), static_cast(sourceConfig_.GetWidth()), static_cast(sourceConfig_.GetHeight()), alignedWidth, alignedHeight, - static_cast(alignedWidth * alignedHeight), surfaceBufSize, addr }; + static_cast(alignedWidth * alignedHeight), surBuf->GetSize(), addr }; ImageUnitInfo dstImgInfo = { sourceConfig_.GetVideoformat(), static_cast(sourceConfig_.GetWidth()), static_cast(sourceConfig_.GetHeight()), static_cast(sourceConfig_.GetWidth()), static_cast(sourceConfig_.GetHeight()), sourceConfig_.GetWidth() * sourceConfig_.GetHeight(), @@ -489,12 +484,14 @@ void DecodeDataProcess::CopyDecodedImage(const sptr& surBuf, int6 return; } } + bufferOutput->SetInt64("timeUs", timeStampUs); bufferOutput->SetInt32("Videoformat", static_cast(sourceConfig_.GetVideoformat())); bufferOutput->SetInt32("alignedWidth", static_cast(sourceConfig_.GetWidth())); bufferOutput->SetInt32("alignedHeight", static_cast(sourceConfig_.GetHeight())); bufferOutput->SetInt32("width", static_cast(sourceConfig_.GetWidth())); bufferOutput->SetInt32("height", static_cast(sourceConfig_.GetHeight())); + PostOutputDataBuffers(bufferOutput); } @@ -505,6 +502,8 @@ int32_t DecodeDataProcess::CopyYUVPlaneByRow(const ImageUnitInfo& srcImgInfo, co DHLOGE("Check CopyImageUnitInfo failed."); return ret; } + + /* Copy YPlane by Row */ errno_t err = EOK; int32_t srcDataOffset = 0; int32_t dstDataOffset = 0; @@ -521,10 +520,10 @@ int32_t DecodeDataProcess::CopyYUVPlaneByRow(const ImageUnitInfo& srcImgInfo, co DHLOGD("Copy Yplane end, dstDataOffset %d, srcDataOffset %d, validYPlaneSize %d.", dstDataOffset, srcDataOffset, dstImgInfo.chromaOffset); - int32_t y2UvRatio = 2; + /* Copy UVPlane by Row */ dstDataOffset = dstImgInfo.chromaOffset; srcDataOffset = srcImgInfo.chromaOffset; - for (int32_t uvh = 0; uvh < dstImgInfo.height / y2UvRatio; uvh++) { + for (int32_t uvh = 0; uvh < dstImgInfo.height / Y2UV_RATIO; uvh++) { err = memcpy_s(dstImgInfo.imgData + dstDataOffset, dstImgInfo.imgSize - dstDataOffset, srcImgInfo.imgData + srcDataOffset, dstImgInfo.width); if (err != EOK) { @@ -573,15 +572,34 @@ int32_t DecodeDataProcess::CheckCopyImageInfo(const ImageUnitInfo& srcImgInfo, c bool DecodeDataProcess::IsCorrectImageUnitInfo(const ImageUnitInfo& imgInfo) { - int32_t y2UvRatio = 2; - int32_t bytesPerPixel = 3; size_t expectedImgSize = static_cast(imgInfo.alignedWidth * imgInfo.alignedHeight * - bytesPerPixel / y2UvRatio); + YUV_BYTES_PER_PIXEL / Y2UV_RATIO); size_t expectedChromaOffset = static_cast(imgInfo.alignedWidth * imgInfo.alignedHeight); return (imgInfo.width <= imgInfo.alignedWidth && imgInfo.height <= imgInfo.alignedHeight && imgInfo.imgSize >= expectedImgSize && imgInfo.chromaOffset == expectedChromaOffset); } +bool DecodeDataProcess::IsCorrectSurfaceBuffer(const sptr& surBuf, int32_t alignedWidth, + int32_t alignedHeight) +{ + if (surBuf == nullptr) { + DHLOGE("surface buffer is null!"); + return false; + } + + size_t yuvImageAlignedSize = static_cast(alignedWidth * alignedHeight * + YUV_BYTES_PER_PIXEL / Y2UV_RATIO); + size_t yuvImageSize = static_cast(sourceConfig_.GetWidth() * sourceConfig_.GetHeight() * + YUV_BYTES_PER_PIXEL / Y2UV_RATIO); + size_t surfaceBufSize = static_cast(surBuf->GetSize()); + if (yuvImageAlignedSize > surfaceBufSize || yuvImageAlignedSize < yuvImageSize) { + DHLOGE("Buffer size error, yuvImageSize %zu, yuvImageAlignedSize %zu, surBufSize %zu.", + yuvImageSize, yuvImageAlignedSize, surBuf->GetSize()); + return false; + } + return true; +} + void DecodeDataProcess::PostOutputDataBuffers(std::shared_ptr& outputBuffer) { if (eventBusDecode_ == nullptr || outputBuffer == nullptr) { diff --git a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process_common.cpp b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process_common.cpp index f8b6225b..bdafe6c5 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process_common.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process_common.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -276,10 +276,8 @@ void DecodeDataProcess::ReleaseProcessNode() ReleaseDecoderSurface(); processType_ = ""; - std::queue> emptyBuffersQueue; - inputBuffersQueue_.swap(emptyBuffersQueue); - std::queue emptyIndexsQueue; - availableInputIndexsQueue_.swap(emptyIndexsQueue); + std::queue>().swap(inputBuffersQueue_); + std::queue().swap(availableInputIndexsQueue_); waitDecoderOutputCount_ = 0; lastFeedDecoderInputBufferTimeUs_ = 0; outputTimeStampUs_ = 0; @@ -378,27 +376,44 @@ int32_t DecodeDataProcess::FeedDecoderInputBuffer() inputBuffersQueue_.pop(); DHLOGD("Push inputBuffer sucess. inputBuffersQueue size is %d.", inputBuffersQueue_.size()); - { - std::lock_guard lck(mtxHoldCount_); - availableInputIndexsQueue_.pop(); - waitDecoderOutputCount_++; - DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); - } + IncreaseWaitDecodeCnt(); } return DCAMERA_OK; } int64_t DecodeDataProcess::GetDecoderTimeStamp() { - int64_t TimeDifferenceStampUs = 0; + int64_t TimeIntervalStampUs = 0; int64_t nowTimeUs = GetNowTimeStampUs(); if (lastFeedDecoderInputBufferTimeUs_ == 0) { lastFeedDecoderInputBufferTimeUs_ = nowTimeUs; - return TimeDifferenceStampUs; + return TimeIntervalStampUs; } - TimeDifferenceStampUs = nowTimeUs - lastFeedDecoderInputBufferTimeUs_; + TimeIntervalStampUs = nowTimeUs - lastFeedDecoderInputBufferTimeUs_; lastFeedDecoderInputBufferTimeUs_ = nowTimeUs; - return TimeDifferenceStampUs; + return TimeIntervalStampUs; +} + +void DecodeDataProcess::IncreaseWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + availableInputIndexsQueue_.pop(); + waitDecoderOutputCount_++; + DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); +} + +void DecodeDataProcess::ReduceWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + if (waitDecoderOutputCount_ <= 0) { + DHLOGE("The waitDecoderOutputCount_ = %d.", waitDecoderOutputCount_); + } + if (outputTimeStampUs_ == 0) { + waitDecoderOutputCount_ -= FIRST_FRAME_INPUT_NUM; + } else { + waitDecoderOutputCount_--; + } + DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); } void DecodeDataProcess::GetDecoderOutputBuffer(const sptr& surface) @@ -423,38 +438,22 @@ void DecodeDataProcess::GetDecoderOutputBuffer(const sptr& surface) CopyDecodedImage(surfaceBuffer, timeStampUs, alignedWidth, alignedHeight); surface->ReleaseBuffer(surfaceBuffer, -1); outputTimeStampUs_ = timeStampUs; - { - std::lock_guard lck(mtxHoldCount_); - if (waitDecoderOutputCount_ <= 0) { - DHLOGE("The waitDecoderOutputCount_ = %d.", waitDecoderOutputCount_); - } - if (outputTimeStampUs_ == 0) { - waitDecoderOutputCount_ -= FIRST_FRAME_INPUT_NUM; - } else { - waitDecoderOutputCount_--; - } - DHLOGD("Wait decoder output frames number is %d.", waitDecoderOutputCount_); - } + ReduceWaitDecodeCnt(); } void DecodeDataProcess::CopyDecodedImage(const sptr& surBuf, int64_t timeStampUs, int32_t alignedWidth, int32_t alignedHeight) { - if (surBuf == nullptr) { - DHLOGE("surface buffer is null!"); + if (!IsCorrectSurfaceBuffer(surBuf, alignedWidth, alignedHeight)) { + DHLOGE("Surface output buffer error."); return; } - size_t validDecodedImageSize = static_cast(sourceConfig_.GetWidth() * sourceConfig_.GetHeight() * + + size_t rgbImageSize = static_cast(sourceConfig_.GetWidth() * sourceConfig_.GetHeight() * RGB32_MEMORY_COEFFICIENT); - size_t surfaceBufSize = static_cast(surBuf->GetSize()); - if (validDecodedImageSize > surfaceBufSize) { - DHLOGE("Buffer size error, validDecodedImageSize %d, surBufSize %d.", - validDecodedImageSize, surBuf->GetSize()); - return; - } - std::shared_ptr bufferOutput = std::make_shared(validDecodedImageSize); + std::shared_ptr bufferOutput = std::make_shared(rgbImageSize); uint8_t *addr = static_cast(surBuf->GetVirAddr()); - errno_t err = memcpy_s(bufferOutput->Data(), bufferOutput->Size(), addr, validDecodedImageSize); + errno_t err = memcpy_s(bufferOutput->Data(), bufferOutput->Size(), addr, rgbImageSize); if (err != EOK) { DHLOGE("memcpy_s surface buffer failed."); return; @@ -468,6 +467,24 @@ void DecodeDataProcess::CopyDecodedImage(const sptr& surBuf, int6 PostOutputDataBuffers(bufferOutput); } +bool DecodeDataProcess::IsCorrectSurfaceBuffer(const sptr& surBuf, int32_t alignedWidth, + int32_t alignedHeight) +{ + if (surBuf == nullptr) { + DHLOGE("surface buffer is null!"); + return false; + } + + size_t rgbImageSize = static_cast(sourceConfig_.GetWidth() * sourceConfig_.GetHeight() * + RGB32_MEMORY_COEFFICIENT); + size_t surfaceBufSize = static_cast(surBuf->GetSize()); + if (rgbImageSize > surfaceBufSize) { + DHLOGE("Buffer size error, rgbImageSize %d, surBufSize %d.", rgbImageSize, surBuf->GetSize()); + return false; + } + return true; +} + void DecodeDataProcess::PostOutputDataBuffers(std::shared_ptr& outputBuffer) { if (eventBusDecode_ == nullptr || outputBuffer == nullptr) { diff --git a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_surface_listener.cpp b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_surface_listener.cpp index 8707452e..09fdb94d 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_surface_listener.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_surface_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_video_callback.cpp b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_video_callback.cpp index 04b1bcc6..fd950b27 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_video_callback.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_video_callback.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -13,7 +13,7 @@ * limitations under the License. */ -#include +#include "decode_video_callback.h" #include "distributed_hardware_log.h" diff --git a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp index a72eb3e7..fec6cfef 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -220,14 +220,20 @@ int32_t EncodeDataProcess::StopVideoEncoder() DHLOGE("The video encoder does not exist before StopVideoEncoder."); return DCAMERA_BAD_VALUE; } + + bool isSuccess = true; int32_t ret = videoEncoder_->Flush(); if (ret != Media::MediaServiceErrCode::MSERR_OK) { DHLOGE("VideoEncoder flush failed. Error type: %d.", ret); - return DCAMERA_BAD_OPERATE; + isSuccess = isSuccess && false; } ret = videoEncoder_->Stop(); if (ret != Media::MediaServiceErrCode::MSERR_OK) { DHLOGE("VideoEncoder stop failed. Error type: %d.", ret); + isSuccess = isSuccess && false; + } + + if (!isSuccess) { return DCAMERA_BAD_OPERATE; } return DCAMERA_OK; @@ -304,15 +310,8 @@ int32_t EncodeDataProcess::ProcessData(std::vector>& DHLOGE("Feed encoder input Buffer failed."); return err; } - { - std::lock_guard lck(mtxHoldCount_); - if (inputTimeStampUs_ == 0) { - waitEncoderOutputCount_ += FIRST_FRAME_OUTPUT_NUM; - } else { - waitEncoderOutputCount_++; - } - DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); - } + + IncreaseWaitDecodeCnt(); return DCAMERA_OK; } @@ -324,6 +323,7 @@ int32_t EncodeDataProcess::FeedEncoderInputBuffer(std::shared_ptr& i DHLOGE("Get encoder input producer surface failed."); return DCAMERA_INIT_ERR; } + sptr surfacebuffer = GetEncoderInputSurfaceBuffer(); if (surfacebuffer == nullptr) { DHLOGE("Get encoder input producer surface buffer failed."); @@ -338,12 +338,14 @@ int32_t EncodeDataProcess::FeedEncoderInputBuffer(std::shared_ptr& i size_t size = static_cast(surfacebuffer->GetSize()); errno_t err = memcpy_s(addr, size, inputBuffer->Data(), inputBuffer->Size()); if (err != EOK) { - DHLOGE("memcpy_s encoder input producer surface buffer failed."); + DHLOGE("memcpy_s encoder input producer surface buffer failed, surBufSize %z.", size); return DCAMERA_MEMORY_OPT_ERROR; } + inputTimeStampUs_ = GetEncoderTimeStamp(); DHLOGD("Encoder input buffer size %d, timeStamp %lld.", inputBuffer->Size(), (long long)inputTimeStampUs_); surfacebuffer->GetExtraData()->ExtraSet("timeStamp", inputTimeStampUs_); + BufferFlushConfig flushConfig = { {0, 0, sourceConfig_.GetWidth(), sourceConfig_.GetHeight()}, 0}; SurfaceError ret = encodeProducerSurface_->FlushBuffer(surfacebuffer, -1, flushConfig); if (ret != SURFACE_ERROR_OK) { @@ -398,6 +400,27 @@ int64_t EncodeDataProcess::GetEncoderTimeStamp() return TimeDifferenceStampUs; } +void EncodeDataProcess::IncreaseWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + if (inputTimeStampUs_ == 0) { + waitEncoderOutputCount_ += FIRST_FRAME_OUTPUT_NUM; + } else { + waitEncoderOutputCount_++; + } + DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); +} + +void EncodeDataProcess::ReduceWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + if (waitEncoderOutputCount_ <= 0) { + DHLOGE("The waitEncoderOutputCount_ = %d.", waitEncoderOutputCount_); + } + waitEncoderOutputCount_--; + DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); +} + int32_t EncodeDataProcess::GetEncoderOutputBuffer(uint32_t index, Media::AVCodecBufferInfo info) { DHLOGD("Get encoder output buffer."); @@ -500,14 +523,8 @@ void EncodeDataProcess::OnOutputBufferAvailable(uint32_t index, Media::AVCodecBu DHLOGE("Get encode output Buffer failed."); return; } - { - std::lock_guard lck(mtxHoldCount_); - if (waitEncoderOutputCount_ <= 0) { - DHLOGE("The waitEncoderOutputCount_ = %d.", waitEncoderOutputCount_); - } - waitEncoderOutputCount_--; - DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); - } + ReduceWaitDecodeCnt(); + if (videoEncoder_ == nullptr) { DHLOGE("The video encoder does not exist before release output buffer index."); return; @@ -517,6 +534,7 @@ void EncodeDataProcess::OnOutputBufferAvailable(uint32_t index, Media::AVCodecBu DHLOGE("The video encoder release output buffer failed, index : [%u].", index); } } + VideoConfigParams EncodeDataProcess::GetSourceConfig() const { return sourceConfig_; diff --git a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process_common.cpp b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process_common.cpp index 003f8218..919724f5 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process_common.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process_common.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -137,7 +137,6 @@ int32_t EncodeDataProcess::InitEncoder() DHLOGE("Video encoder start failed."); return DCAMERA_INIT_ERR; } - DHLOGI("Common Init video encoder success"); return DCAMERA_OK; } @@ -196,14 +195,20 @@ int32_t EncodeDataProcess::StopVideoEncoder() DHLOGE("The video encoder does not exist before StopVideoEncoder."); return DCAMERA_BAD_VALUE; } + + bool isSuccess = true; int32_t ret = videoEncoder_->Flush(); if (ret != Media::MediaServiceErrCode::MSERR_OK) { DHLOGE("VideoEncoder flush failed. Error type: %d.", ret); - return DCAMERA_BAD_OPERATE; + isSuccess = isSuccess && false; } ret = videoEncoder_->Stop(); if (ret != Media::MediaServiceErrCode::MSERR_OK) { DHLOGE("VideoEncoder stop failed. Error type: %d.", ret); + isSuccess = isSuccess && false; + } + + if (!isSuccess) { return DCAMERA_BAD_OPERATE; } return DCAMERA_OK; @@ -281,15 +286,8 @@ int32_t EncodeDataProcess::ProcessData(std::vector>& DHLOGE("Feed encoder input Buffer fail."); return err; } - { - std::lock_guard lck(mtxHoldCount_); - if (inputTimeStampUs_ == 0) { - waitEncoderOutputCount_ += FIRST_FRAME_OUTPUT_NUM; - } else { - waitEncoderOutputCount_++; - } - DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); - } + + IncreaseWaitDecodeCnt(); return DCAMERA_OK; } @@ -301,6 +299,7 @@ int32_t EncodeDataProcess::FeedEncoderInputBuffer(std::shared_ptr& i DHLOGE("Get encoder input producer surface failed."); return DCAMERA_INIT_ERR; } + sptr surfacebuffer = GetEncoderInputSurfaceBuffer(); if (surfacebuffer == nullptr) { DHLOGE("Get encoder input producer surface buffer failed."); @@ -314,14 +313,15 @@ int32_t EncodeDataProcess::FeedEncoderInputBuffer(std::shared_ptr& i } size_t size = static_cast(surfacebuffer->GetSize()); errno_t err = memcpy_s(addr, size, inputBuffer->Data(), inputBuffer->Size()); - DHLOGI("FeedEncoderInputBuffer size: %d, bufferSize: %d, err: %d", size, inputBuffer->Size(), err); if (err != EOK) { - DHLOGE("memcpy_s encoder input producer surface buffer failed."); + DHLOGE("memcpy_s encoder input producer surface buffer failed, surBufSize %z.", size); return DCAMERA_MEMORY_OPT_ERROR; } + inputTimeStampUs_ = GetEncoderTimeStamp(); DHLOGD("Encoder input buffer size %d, timeStamp %lld.", inputBuffer->Size(), (long long)inputTimeStampUs_); surfacebuffer->GetExtraData()->ExtraSet("timeStamp", inputTimeStampUs_); + BufferFlushConfig flushConfig = { {0, 0, sourceConfig_.GetWidth(), sourceConfig_.GetHeight()}, 0}; SurfaceError ret = encodeProducerSurface_->FlushBuffer(surfacebuffer, -1, flushConfig); if (ret != SURFACE_ERROR_OK) { @@ -356,6 +356,27 @@ int64_t EncodeDataProcess::GetEncoderTimeStamp() return nowTimeUs; } +void EncodeDataProcess::IncreaseWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + if (inputTimeStampUs_ == 0) { + waitEncoderOutputCount_ += FIRST_FRAME_OUTPUT_NUM; + } else { + waitEncoderOutputCount_++; + } + DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); +} + +void EncodeDataProcess::ReduceWaitDecodeCnt() +{ + std::lock_guard lck(mtxHoldCount_); + if (waitEncoderOutputCount_ <= 0) { + DHLOGE("The waitEncoderOutputCount_ = %d.", waitEncoderOutputCount_); + } + waitEncoderOutputCount_--; + DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); +} + int32_t EncodeDataProcess::GetEncoderOutputBuffer(uint32_t index, Media::AVCodecBufferInfo info) { DHLOGD("Get encoder output buffer."); @@ -458,14 +479,8 @@ void EncodeDataProcess::OnOutputBufferAvailable(uint32_t index, Media::AVCodecBu DHLOGE("Get encode output Buffer fail."); return; } - { - std::lock_guard lck(mtxHoldCount_); - if (waitEncoderOutputCount_ <= 0) { - DHLOGE("The waitEncoderOutputCount_ = %d.", waitEncoderOutputCount_); - } - waitEncoderOutputCount_--; - DHLOGD("Wait encoder output frames number is %d.", waitEncoderOutputCount_); - } + ReduceWaitDecodeCnt(); + if (videoEncoder_ == nullptr) { DHLOGE("The video encoder does not exist before release output buffer index."); return; diff --git a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_video_callback.cpp b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_video_callback.cpp index ed321418..462a7e7b 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_video_callback.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_video_callback.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include +#include "encode_video_callback.h" #include "distributed_hardware_log.h" diff --git a/services/data_process/src/utils/image_common_type.cpp b/services/data_process/src/utils/image_common_type.cpp index 5990cb40..9cff6d05 100644 --- a/services/data_process/src/utils/image_common_type.cpp +++ b/services/data_process/src/utils/image_common_type.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at -- Gitee From 06a9dd7aacd6f3f7d0d62abf485317ae787d6c1e Mon Sep 17 00:00:00 2001 From: t00605578 Date: Sun, 24 Apr 2022 17:40:43 +0800 Subject: [PATCH 2/3] fix dataprocess codex-1 Signed-off-by: t00605578 --- .../fpscontroller/fps_controller_process.cpp | 10 +++++----- .../multimedia_codec/encoder/encode_data_process.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp b/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp index 4866fb7c..4dc226b5 100644 --- a/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp +++ b/services/data_process/src/pipeline_node/fpscontroller/fps_controller_process.cpp @@ -217,12 +217,12 @@ float FpsControllerProcess::CalculateFrameRate(int64_t nowMs) const int32_t minValidCalculatedFrameRatesNum = 2; int32_t minIncomingFrameNum = static_cast(targetFrameRate_) / MIN_INCOME_FRAME_NUM_COEFFICIENT; if (validFramesNumber > minIncomingFrameNum && validFramesNumber > minValidCalculatedFrameRatesNum) { - int64_t validTotalTimeDifference = (nowMs - incomingFrameTimesMs_[num - 1]); - if (validTotalTimeDifference < 0) { - validTotalTimeDifference = -validTotalTimeDifference; + int64_t validTotalTimeInterval = (nowMs - incomingFrameTimesMs_[num - 1]); + if (validTotalTimeInterval < 0) { + validTotalTimeInterval = -validTotalTimeInterval; } - if (validTotalTimeDifference > 0) { - return validFramesNumber * msPerSecond / validTotalTimeDifference + frameRateCorrectionFactor_; + if (validTotalTimeInterval > 0) { + return validFramesNumber * msPerSecond / validTotalTimeInterval + frameRateCorrectionFactor_; } } return static_cast(validFramesNumber); diff --git a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp index fec6cfef..ed2d5ca5 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp @@ -388,16 +388,16 @@ sptr EncodeDataProcess::GetEncoderInputSurfaceBuffer() int64_t EncodeDataProcess::GetEncoderTimeStamp() { - int64_t TimeDifferenceStampUs = 0; + int64_t TimeIntervalStampUs = 0; const int64_t nsPerUs = 1000L; int64_t nowTimeUs = GetNowTimeStampUs() * nsPerUs; if (lastFeedEncoderInputBufferTimeUs_ == 0) { lastFeedEncoderInputBufferTimeUs_ = nowTimeUs; - return TimeDifferenceStampUs; + return TimeIntervalStampUs; } - TimeDifferenceStampUs = nowTimeUs - lastFeedEncoderInputBufferTimeUs_; + TimeIntervalStampUs = nowTimeUs - lastFeedEncoderInputBufferTimeUs_; lastFeedEncoderInputBufferTimeUs_ = nowTimeUs; - return TimeDifferenceStampUs; + return TimeIntervalStampUs; } void EncodeDataProcess::IncreaseWaitDecodeCnt() -- Gitee From 4421234b3c644134fcf8f717302e5161bb7fd555 Mon Sep 17 00:00:00 2001 From: t00605578 Date: Sun, 24 Apr 2022 19:59:47 +0800 Subject: [PATCH 3/3] fix codec Signed-off-by: t00605578 --- .../pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp b/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp index a4287bc1..798f39d6 100644 --- a/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp +++ b/services/data_process/src/pipeline_node/colorspace_conversion/convert_nv12_to_nv21.cpp @@ -273,7 +273,6 @@ int32_t ConvertNV12ToNV21::CopyYPlane(const ImageUnitInfo& srcImgInfo, const Ima int32_t srcDataOffset = 0; int32_t dstDataOffset = 0; for (int32_t yh = 0; yh < dstImgInfo.height; yh++) { - DHLOGE("ColorConvert : memcpy_s Line[%d] source buffer failed.", yh); err = memcpy_s(dstImgInfo.imgData + dstDataOffset, totalCopyYPlaneSize - dstDataOffset, srcImgInfo.imgData + srcDataOffset, dstImgInfo.width); if (err != EOK) { -- Gitee