Files
UnrealEngine/Engine/Plugins/MetaHuman/MetaHumanLiveLink/Source/LiveLinkFaceSource/Private/LiveLinkFacePacket.cpp
2025-05-18 13:04:45 +08:00

110 lines
2.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "LiveLinkFacePacket.h"
bool FLiveLinkFacePacket::Read(const FArrayReaderPtr& InPayloadPtr)
{
FArrayReader& Payload = *InPayloadPtr;
Payload << Version;
// Subject ID
uint16 SubjectIdLength;
Payload << SubjectIdLength;
SubjectId = ReadString(Payload, SubjectIdLength);
// Qualified Frame Time (Time code)
QualifiedFrameTime = ReadQualifiedFrameTime(Payload);
// Control Values
ReadControlValues(Payload, ControlValues);
// Head Pose
ReadHeadPose(Payload, HeadPose);
return !Payload.IsError();
}
uint16 FLiveLinkFacePacket::GetVersion() const
{
return Version;
}
FString FLiveLinkFacePacket::GetSubjectId() const
{
return SubjectId;
}
FQualifiedFrameTime FLiveLinkFacePacket::GetQualifiedFrameTime() const
{
return QualifiedFrameTime;
}
const TArray<uint16>& FLiveLinkFacePacket::GetControlValues() const
{
return ControlValues;
}
const TArray<float>& FLiveLinkFacePacket::GetHeadPose() const
{
return HeadPose;
}
TArray<uint8> FLiveLinkFacePacket::ReadData(FArrayReader& InArrayReader, const uint32 InLen)
{
TArray<uint8> DataArray;
DataArray.SetNumUninitialized(InLen);
InArrayReader.Serialize(DataArray.GetData(), InLen);
return DataArray;
}
FString FLiveLinkFacePacket::ReadString(FArrayReader& InArrayReader, const uint32 InLen)
{
TArray<uint8> Data = ReadData(InArrayReader, InLen);
return FString(StringCast<TCHAR>((const UTF8CHAR*)Data.GetData(), Data.Num()));
}
FName FLiveLinkFacePacket::ReadName(FArrayReader& InArrayReader, const uint32 InLen)
{
FString String = ReadString(InArrayReader, InLen);
return FName(String);
}
FQualifiedFrameTime FLiveLinkFacePacket::ReadQualifiedFrameTime(FArrayReader& InArrayReader)
{
int32 FrameNumber;
float SubFrame;
int32 FrameRateNumerator;
int32 FrameRateDenominator;
InArrayReader << FrameNumber;
InArrayReader << SubFrame;
InArrayReader << FrameRateNumerator;
InArrayReader << FrameRateDenominator;
const FFrameTime FrameTime(FrameNumber, SubFrame);
const FFrameRate FrameRate(FrameRateNumerator, FrameRateDenominator);
return FQualifiedFrameTime(FrameTime, FrameRate);
}
void FLiveLinkFacePacket::ReadControlValues(FArrayReader& InArrayReader, TArray<uint16>& OutControlValues)
{
uint16 ControlValuesCount;
InArrayReader << ControlValuesCount;
OutControlValues.SetNumUninitialized(ControlValuesCount);
for (uint16 ControlValueIndex = 0; ControlValueIndex < ControlValuesCount; ++ControlValueIndex)
{
InArrayReader << OutControlValues[ControlValueIndex];
}
}
void FLiveLinkFacePacket::ReadHeadPose(FArrayReader& InArrayReader, TArray<float>& OutHeadPose)
{
OutHeadPose.SetNumUninitialized(HeadPoseValueCount);
for (int32 Index = 0; Index < HeadPoseValueCount; ++Index)
{
InArrayReader << OutHeadPose[Index];
}
}