// Copyright Epic Games, Inc. All Rights Reserved. #include "EpicRtcVideoSource.h" #include "Logging.h" #include "PixelStreaming2Trace.h" #include "VideoSourceGroup.h" namespace UE::PixelStreaming2 { TSharedPtr FEpicRtcVideoSource::Create(TRefCountPtr InVideoTrack, TSharedPtr InVideoCapturer, TSharedPtr InVideoSourceGroup) { TSharedPtr VideoSource = TSharedPtr(new FEpicRtcVideoSource(InVideoTrack, InVideoCapturer)); InVideoSourceGroup->AddVideoSource(VideoSource); return VideoSource; } FEpicRtcVideoSource::FEpicRtcVideoSource(TRefCountPtr InVideoTrack, TSharedPtr InVideoCapturer) : TEpicRtcTrack(InVideoTrack) , VideoCapturer(InVideoCapturer) { } TRefCountPtr FEpicRtcVideoSource::GetVideoTrack() { return Track; } void FEpicRtcVideoSource::ForceKeyFrame() { Track->GenerateKeyFrame(EpicRtcStringViewSpan{ ._ptr = nullptr, ._size = 0 }); } void FEpicRtcVideoSource::PushFrame() { if (!VideoCapturer->IsReady() || !Track || bIsMuted) { return; } TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR("PixelStreaming2 Push Video Frame", PixelStreaming2Channel); static uint16_t FrameId = 1; TRefCountPtr FrameBuffer = VideoCapturer->GetFrameBuffer(); EpicRtcVideoFrame Frame = { ._id = FrameId++, ._timestampUs = static_cast(FPlatformTime::ToMilliseconds64(FPlatformTime::Cycles64()) * 1000), ._timestampRtp = static_cast(0), ._isBackedByWebRtc = false, ._buffer = FrameBuffer }; if (!Track->PushFrame(Frame)) { UE_LOG(LogPixelStreaming2RTC, Error, TEXT("Unable to push Video frame id: %d"), Frame._id); } } } // namespace UE::PixelStreaming2