Skip to content

Commit e061f34

Browse files
committed
Change Pipewire frame capture
1 parent db4b07a commit e061f34

File tree

3 files changed

+39
-26
lines changed

3 files changed

+39
-26
lines changed

Diff for: CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ if (DEFAULT_PIPEWIRE)
242242
message( WARNING "QT dbus library is required for PipeWire/Portal support" )
243243
SET ( DEFAULT_PIPEWIRE OFF )
244244
else()
245+
245246
pkg_check_modules(PIPEWIRE libpipewire-0.3)
246247
if(NOT PIPEWIRE_FOUND OR NOT PIPEWIRE_INCLUDE_DIRS OR NOT PIPEWIRE_LIBRARIES)
247248
message( WARNING "Pipewire >= 3.0 not found (did you install libpipewire-0.3-dev?). Disabling support for PipeWire software grabber.")

Diff for: sources/grabber/pipewire/PipewireHandler.cpp

+36-26
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ PipewireHandler::PipewireHandler() :
102102
connect(this, &PipewireHandler::onStateChangedSignal, this, &PipewireHandler::onStateChanged);
103103
connect(this, &PipewireHandler::onProcessFrameSignal, this, &PipewireHandler::onProcessFrame);
104104
connect(this, &PipewireHandler::onCoreErrorSignal, this, &PipewireHandler::onCoreError);
105-
105+
106+
_image.isError = true;
107+
_image.data = nullptr;
106108
}
107109

108110
QString PipewireHandler::getToken()
@@ -243,6 +245,12 @@ void PipewireHandler::closeSession()
243245
for (supportedDmaFormat& supVal : _supportedDmaFormatsList)
244246
supVal.hasDma = false;
245247

248+
if (_image.data != nullptr)
249+
{
250+
free(_image.data);
251+
_image.data = nullptr;
252+
}
253+
246254
if (_version > 0)
247255
{
248256
std::cout << "Pipewire: driver is closed now" << std::endl;
@@ -668,36 +676,42 @@ void PipewireHandler::onParamsChanged(uint32_t id, const struct spa_pod* param)
668676

669677
void PipewireHandler::onProcessFrame()
670678
{
671-
if (_hasFrame)
679+
if (_image.data == nullptr)
672680
{
673-
struct pw_buffer* newFrame;
674-
if ((newFrame = pw_stream_dequeue_buffer(_pwStream)) != nullptr)
675-
pw_stream_queue_buffer(_pwStream, newFrame);
681+
captureFrame();
682+
_hasFrame = (_image.data != nullptr);
676683
}
677-
678-
_hasFrame = true;
679684
};
680685

681686
void PipewireHandler::grabFrame()
687+
{
688+
if (_image.data != nullptr)
689+
{
690+
_callback(_image);
691+
692+
free(_image.data);
693+
_image.data = nullptr;
694+
}
695+
}
696+
697+
void PipewireHandler::captureFrame()
682698
{
683699
struct pw_buffer* newFrame = nullptr;
684700
struct pw_buffer* dequeueFrame = nullptr;
685701
uint8_t* mappedMemory = nullptr;
686-
uint8_t* frameBuffer = nullptr;
687-
PipewireImage image;
702+
uint8_t* frameBuffer = nullptr;
688703

689704
if (_pwStream == nullptr)
690705
return;
691706

692707
_hasFrame = false;
693708

694-
image.width = _frameWidth;
695-
image.height = _frameHeight;
696-
image.isOrderRgb = _frameOrderRgb;
697-
image.version = getVersion();
698-
image.isError = hasError();
699-
image.stride = 0;
700-
image.data = nullptr;
709+
_image.width = _frameWidth;
710+
_image.height = _frameHeight;
711+
_image.isOrderRgb = _frameOrderRgb;
712+
_image.version = getVersion();
713+
_image.isError = hasError();
714+
_image.stride = 0;
701715

702716
while ((dequeueFrame = pw_stream_dequeue_buffer(_pwStream)) != nullptr)
703717
{
@@ -816,7 +830,7 @@ void PipewireHandler::grabFrame()
816830
if (!_infoUpdated)
817831
printf("PipewireEGL: succesfully rendered the DMA texture\n");
818832

819-
image.data = frameBuffer;
833+
_image.data = frameBuffer;
820834
}
821835

822836
break;
@@ -837,7 +851,7 @@ void PipewireHandler::grabFrame()
837851
}
838852
else
839853
{
840-
image.stride = newFrame->buffer->datas->chunk->stride;
854+
_image.stride = newFrame->buffer->datas->chunk->stride;
841855

842856
if (newFrame->buffer->datas->type == SPA_DATA_MemFd)
843857
{
@@ -852,26 +866,22 @@ void PipewireHandler::grabFrame()
852866
}
853867
else
854868
{
855-
image.data = mappedMemory;
869+
_image.data = (uint8_t*) malloc(_image.stride * _frameHeight);
870+
memcpy(_image.data, mappedMemory, _image.stride * _frameHeight);
856871
}
857872
}
858873
else if (newFrame->buffer->datas->type == SPA_DATA_MemPtr)
859874
{
860-
image.data = static_cast<uint8_t*>(newFrame->buffer->datas[0].data);
875+
_image.data = (uint8_t*) malloc(_image.stride * _frameHeight);
876+
memcpy(_image.data, static_cast<uint8_t*>(newFrame->buffer->datas[0].data), _image.stride * _frameHeight);
861877
}
862878
}
863879
}
864880

865-
// forward the frame
866-
_callback(image);
867-
868881
// clean up
869882
if (mappedMemory != nullptr)
870883
munmap(mappedMemory, newFrame->buffer->datas->maxsize + newFrame->buffer->datas->mapoffset);
871884

872-
if (frameBuffer != nullptr)
873-
free(frameBuffer);
874-
875885
if (newFrame != nullptr)
876886
pw_stream_queue_buffer(_pwStream, newFrame);
877887

Diff for: sources/grabber/pipewire/PipewireHandler.h

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public Q_SLOTS:
112112
pw_stream* createCapturingStream();
113113
QString getSessionToken();
114114
QString getRequestToken();
115+
void captureFrame();
115116

116117
pipewire_callback_func _callback;
117118
QString _sessionHandle;
@@ -149,6 +150,7 @@ public Q_SLOTS:
149150
int64_t _frameDrmFormat;
150151
int64_t _frameDrmModifier;
151152
QTimer _timer;
153+
PipewireImage _image;
152154

153155
#ifdef ENABLE_PIPEWIRE_EGL
154156
eglGetProcAddressFun eglGetProcAddress = nullptr;

0 commit comments

Comments
 (0)