diff --git a/services/data_process/BUILD.gn b/services/data_process/BUILD.gn index 74c3409bb0ca1af4b60e995bd9ee9a1ffd840abe..75a37513f9017b0ca8518a51f6ee83c486dbb345 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 13df907dcc86a04b972654d1e625636f12f5c1c2..60f6c23dc46169a454b9472b2d5eac382496b95e 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 3e6651417f3bb7d17f38bccf3f87604adc3b804c..14e0ed5b035d2d70bfae8ce9229c04fe77eb7a09 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 515da2441d6c3c10790d83a368d4411edbba359c..5f950716b7aef74b4e8a3c293fd285a86730b50b 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 9afbe082847d7e2e761edc5ef28d1e31e1443f8b..29a48c8b75b650ff05e4fd40696bf6d253edc7bd 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 1e96fedcc90009ce5cf606a328b3094a43f5be40..ac6d755c7863bd67462fa6a4288d501ec786d148 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 04b011c037da85a838cd06f70e2b5ba9fe94fb74..ef0e6bd72a19ca475b917e611db9389d3f97aed1 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 cec129ebc2c856510a9c0e847e5acbb35a409565..0a35ee5180f21f83ae21cd37f634a66f2c221f62 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 d77dede615f30a4e7e8da96e276caaf530d21ab7..0ee7f96fb555485df53720c66c976cfd547f586b 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 34f6fc11addc5e41e5c15c4ec7198c61bca09845..0cffb62a707be8899616457667bc73fc1413efdf 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 9e302d963528ea82704907755d8afd8d7d89d9a8..a176c85d2d19792d8bf3b403a4c5e8f0a689dac2 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 3a023effc625bbfcfdc12ffd5d94c99469de2d32..798f39d650b078eb4c5ac41b2e4fb1b6f3596f60 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 @@ -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) { 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 1e9b356213103811be2bdb802f26162b74262387..4dc226b584494e09ca8f2588bafab1db5babcbfa 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 @@ -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/decoder/decode_data_process.cpp b/services/data_process/src/pipeline_node/multimedia_codec/decoder/decode_data_process.cpp index ab2638563c8cc48eb6b31f19efdeb0dca92f39b1..c76934daf75d62ff3705600ae847dadd15f4fe12 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 f8b6225b2cf71f870cbff17271c5367f2b2690ff..bdafe6c519601d2bdfe0a4cb370768cafdfe8828 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 8707452ee80b7a82c5e0aa84c7fb7d489c624752..09fdb94dca08b9435828f5e50a09419224fedbc3 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 04b1bcc631a7ea9f348dd0f8581eb70afbb4cf98..fd950b27ef0384f2b9729cc65348ca30576914f3 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 a72eb3e7034487123e0c1a62e3e1f9656af45d4b..ed2d5ca5efca2afb4c111c04cd71368cc652887d 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) { @@ -386,16 +388,37 @@ 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() +{ + 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) @@ -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 003f8218227b363947cfa72b722a7872e1acf081..919724f59d26a894fd4158a1559d0eea9f098e7b 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 ed3214184e47bb5fd8a8472657253458731a76ae..462a7e7bec35984e8c9aa6fd8738e5ef3ee358a1 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 5990cb404323966e887a3d98b2d05eb457da6af1..9cff6d050913f41c283708c89eed23e3dfd15787 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