已开启
add meta actual size #4787
add meta actual size #4787
已开启
sunchao106创建于 20 天前
4 个文件变更+49-2
Mdynamic_libs/media_manager/src/media_manager/mpeg_manager.cpp+7-1
@@ -420,8 +420,14 @@ void MpegManager::OnMakerBufferAvailable()
420 return;420 return;
421 }421 }
422 422 
423+ int32_t actualSize = 0;
424+ auto bufferExtraData = buffer->GetExtraData();
425+ DP_CHECK_EXECUTE(bufferExtraData != nullptr, bufferExtraData->ExtraGet("dataSize", actualSize));
426+ int32_t metaSize = actualSize > 0 ? actualSize : buffer->GetSize();
427+ 
423 std::lock_guard<std::mutex> lock(makerMutex_);428 std::lock_guard<std::mutex> lock(makerMutex_);
424- auto makerBuffer = AVBuffer::CreateAVBuffer(buffer);429+ auto makerBuffer = AVBuffer::CreateAVBuffer(
430+ static_cast<uint8_t*>(buffer->GetVirAddr()), metaSize, metaSize);
425 if (makerBuffer == nullptr) {431 if (makerBuffer == nullptr) {
426 ReleaseMakerBuffer(buffer);432 ReleaseMakerBuffer(buffer);
427 return;433 return;
Mdynamic_libs/moving_photo/src/avcodec/avcodec_task_manager.cpp+30-1
@@ -39,6 +39,7 @@
39#include "sample_info.h"39#include "sample_info.h"
40#include "native_mfmagic.h"40#include "native_mfmagic.h"
41#include "sync_fence.h"41#include "sync_fence.h"
42+#include "video_key_info.h"
42 43 
43namespace {44namespace {
44using namespace std::string_literals;45using namespace std::string_literals;
@@ -229,6 +230,19 @@ constexpr inline float MovingPhotoNanosecToMillisec(int64_t nanosec)
229 // LCOV_EXCL_STOP230 // LCOV_EXCL_STOP
230}231}
231 232 
233+int32_t GetMetaActualSize(sptr<SurfaceBuffer> buffer)
234+{
235+ sptr<BufferExtraData> bufferExtraData = buffer->GetExtraData();
236+ int32_t metaActualSize = 0;
237+ if (bufferExtraData != nullptr) {
238+ bufferExtraData->ExtraGet(OHOS::Camera::dataSize, metaActualSize);
239+ MEDIA_DEBUG_LOG("Get actual meta size: %{public}d", metaActualSize);
240+ } else {
241+ MEDIA_ERR_LOG("Get actual meta size failed");
242+ }
243+ return metaActualSize;
244+}
245+ 
232sptr<AudioVideoMuxer> AvcodecTaskManager::CreateAVMuxer(vector<sptr<FrameRecord>> frameRecords,246sptr<AudioVideoMuxer> AvcodecTaskManager::CreateAVMuxer(vector<sptr<FrameRecord>> frameRecords,
233 vector<sptr<FrameRecord>> manualFrameRecords, int32_t captureRotation, vector<sptr<FrameRecord>>& choosedBuffer,247 vector<sptr<FrameRecord>> manualFrameRecords, int32_t captureRotation, vector<sptr<FrameRecord>>& choosedBuffer,
234 int32_t captureId, int64_t& backTimestamp)248 int32_t captureId, int64_t& backTimestamp)
@@ -452,7 +466,10 @@ void AvcodecTaskManager::WriteVideoAndMetaSamples(sptr<AudioVideoMuxer> muxer,
452 sptr<SurfaceBuffer> metaSurfaceBuffer = choosedBuffer[index]->GetMetaBuffer();466 sptr<SurfaceBuffer> metaSurfaceBuffer = choosedBuffer[index]->GetMetaBuffer();
453 auto ptr = retMap.find(choosedBuffer[index]->GetTimeStamp());467 auto ptr = retMap.find(choosedBuffer[index]->GetTimeStamp());
454 if (metaSurfaceBuffer && ptr != retMap.end() && ptr->second == AV_ERR_OK) {468 if (metaSurfaceBuffer && ptr != retMap.end() && ptr->second == AV_ERR_OK) {
455- shared_ptr<AVBuffer> metaAvBuffer = AVBuffer::CreateAVBuffer(metaSurfaceBuffer);469+ int32_t actualMetaSize = GetMetaActualSize(metaSurfaceBuffer);
470+ int32_t metaSize = actualMetaSize > 0 ? actualMetaSize : metaSurfaceBuffer->GetSize();
471+ shared_ptr<AVBuffer> metaAvBuffer = AVBuffer::CreateAVBuffer(
472+ static_cast<uint8_t*>(metaSurfaceBuffer->GetVirAddr()), metaSize, metaSize);
456 metaAvBuffer->pts_ = NanosecToMicrosec(choosedBuffer[index]->GetTimeStamp() - videoStartTime);473 metaAvBuffer->pts_ = NanosecToMicrosec(choosedBuffer[index]->GetTimeStamp() - videoStartTime);
457 MEDIA_DEBUG_LOG("metaAvBuffer pts_ %{public}llu, avBufferSize: %{public}d",474 MEDIA_DEBUG_LOG("metaAvBuffer pts_ %{public}llu, avBufferSize: %{public}d",
458 (long long unsigned)(metaAvBuffer->pts_), metaAvBuffer->memory_->GetSize());475 (long long unsigned)(metaAvBuffer->pts_), metaAvBuffer->memory_->GetSize());
@@ -1280,6 +1297,18 @@ bool AvcodecExtendImageTaskManager::EncodeVideoExtendBuffer(sptr<FrameRecord> fr
1280 frameRecord->GetRotation());1297 frameRecord->GetRotation());
1281 }1298 }
1282 }1299 }
1300+ sptr<Surface> extendImageSurface = thisPtr->extendImageSurface_.promote();
1301+ if (extendImageSurface) {
1302+ sptr<SurfaceBuffer> codecDetachBuf;
1303+ thisPtr->extendVideoEncoder_->DetachCodecBuffer(codecDetachBuf, frameRecord);
1304+ SurfaceError surfaceRet = extendImageSurface->AttachBufferToQueue(codecDetachBuf);
1305+ CHECK_EXECUTE(surfaceRet != SURFACE_ERROR_OK,
1306+ MEDIA_ERR_LOG("extendImageSurface AttachBuffer, surfaceRet = %{public}d, timestamp:%{public}llu",
1307+ surfaceRet, (long long unsigned)frameRecord->GetTimeStamp()));
1308+ surfaceRet = extendImageSurface->ReleaseBuffer(codecDetachBuf, SyncFence::INVALID_FENCE);
1309+ CHECK_EXECUTE(surfaceRet != SURFACE_ERROR_OK,
1310+ MEDIA_ERR_LOG("extendImageSurface ReleaseBuffer, surfaceRet = %{public}d", surfaceRet));
1311+ }
1283 bool isEncodeSuccess = sharedThis->extendVideoEncoder_->EncodeExtendSurfaceBuffer(frameRecord);1312 bool isEncodeSuccess = sharedThis->extendVideoEncoder_->EncodeExtendSurfaceBuffer(frameRecord);
1284 frameRecord->SetEncodedResult(isEncodeSuccess);1313 frameRecord->SetEncodedResult(isEncodeSuccess);
1285 frameRecord->SetFinishStatus();1314 frameRecord->SetFinishStatus();
Mdynamic_libs/moving_photo/src/common/frame_record.cpp+10-0
@@ -16,6 +16,7 @@
16#include "frame_record.h"16#include "frame_record.h"
17 17 
18#include "moving_photo_surface_wrapper.h"18#include "moving_photo_surface_wrapper.h"
19+#include "video_key_info.h"
19 20 
20namespace OHOS {21namespace OHOS {
21namespace CameraStandard {22namespace CameraStandard {
@@ -67,6 +68,15 @@ void FrameRecord::ReleaseMetaBuffer(sptr<Surface> surface, bool reuse)
67 DeepCopyBuffer(buffer, metaBuffer_);68 DeepCopyBuffer(buffer, metaBuffer_);
68 }69 }
69 CHECK_RETURN(!metaBuffer_);70 CHECK_RETURN(!metaBuffer_);
71+ sptr<BufferExtraData> bufferExtraData = metaBuffer_->GetExtraData();
72+ int32_t actualMetaSize = 0;
73+ CHECK_EXECUTE(bufferExtraData != nullptr, bufferExtraData->ExtraGet(OHOS::Camera::dataSize, actualMetaSize));
74+ // Copy actual meta buffer size
75+ if (buffer != nullptr) {
76+ sptr<BufferExtraData> metaExtraData = buffer->GetExtraData();
77+ metaExtraData->ExtraSet(OHOS::Camera::dataSize, actualMetaSize);
78+ buffer->SetExtraData(metaExtraData);
79+ }
70 if (reuse) {80 if (reuse) {
71 CHECK_RETURN_ELOG(surface == nullptr, "FrameRecord::ReleaseMetaBuffer surface is null");81 CHECK_RETURN_ELOG(surface == nullptr, "FrameRecord::ReleaseMetaBuffer surface is null");
72 SurfaceError surfaceRet = surface->AttachBufferToQueue(metaBuffer_);82 SurfaceError surfaceRet = surface->AttachBufferToQueue(metaBuffer_);
Mservices/camera_service/src/hstream_common.cpp+2-0
@@ -55,6 +55,8 @@ static const std::map<ColorSpace, CM_ColorSpaceType_V2_1> g_fwkToMetaColorSpaceM
55 {P3_PQ_LIMIT, CM_ColorSpaceType_V2_1::CM_P3_PQ_LIMIT},55 {P3_PQ_LIMIT, CM_ColorSpaceType_V2_1::CM_P3_PQ_LIMIT},
56 {H_LOG, CM_ColorSpaceType_V2_1::CM_BT2020_LOG_FULL},56 {H_LOG, CM_ColorSpaceType_V2_1::CM_BT2020_LOG_FULL},
57};57};
58+ 
59+ 
58namespace {60namespace {
59static const int32_t STREAMID_BEGIN = 1;61static const int32_t STREAMID_BEGIN = 1;
60static const int32_t CAPTUREID_BEGIN = 1;62static const int32_t CAPTUREID_BEGIN = 1;