已开启
add meta actual size #4787
sunchao106创建于 20 天前
add meta actual size #4787
已开启
共 4 个文件变更+49-2
| @@ -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; |
| @@ -39,6 +39,7 @@ | |||
| 39 | 39 | ||
| 40 | 40 | ||
| 41 | 41 | ||
| 42 | + | ||
| 42 | 43 | ||
| 43 | namespace { | 44 | namespace { |
| 44 | using namespace std::string_literals; | 45 | using namespace std::string_literals; |
| @@ -229,6 +230,19 @@ constexpr inline float MovingPhotoNanosecToMillisec(int64_t nanosec) | |||
| 229 | // LCOV_EXCL_STOP | 230 | // 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 | + | ||
| 232 | sptr<AudioVideoMuxer> AvcodecTaskManager::CreateAVMuxer(vector<sptr<FrameRecord>> frameRecords, | 246 | sptr<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(); |
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | + | ||
| 19 | 20 | ||
| 20 | namespace OHOS { | 21 | namespace OHOS { |
| 21 | namespace CameraStandard { | 22 | namespace 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_); |
| @@ -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 | + | ||
| 58 | namespace { | 60 | namespace { |
| 59 | static const int32_t STREAMID_BEGIN = 1; | 61 | static const int32_t STREAMID_BEGIN = 1; |
| 60 | static const int32_t CAPTUREID_BEGIN = 1; | 62 | static const int32_t CAPTUREID_BEGIN = 1; |