@@ -102,7 +102,9 @@ PipewireHandler::PipewireHandler() :
102
102
connect (this , &PipewireHandler::onStateChangedSignal, this , &PipewireHandler::onStateChanged);
103
103
connect (this , &PipewireHandler::onProcessFrameSignal, this , &PipewireHandler::onProcessFrame);
104
104
connect (this , &PipewireHandler::onCoreErrorSignal, this , &PipewireHandler::onCoreError);
105
-
105
+
106
+ _image.isError = true ;
107
+ _image.data = nullptr ;
106
108
}
107
109
108
110
QString PipewireHandler::getToken ()
@@ -243,6 +245,12 @@ void PipewireHandler::closeSession()
243
245
for (supportedDmaFormat& supVal : _supportedDmaFormatsList)
244
246
supVal.hasDma = false ;
245
247
248
+ if (_image.data != nullptr )
249
+ {
250
+ free (_image.data );
251
+ _image.data = nullptr ;
252
+ }
253
+
246
254
if (_version > 0 )
247
255
{
248
256
std::cout << " Pipewire: driver is closed now" << std::endl;
@@ -668,36 +676,42 @@ void PipewireHandler::onParamsChanged(uint32_t id, const struct spa_pod* param)
668
676
669
677
void PipewireHandler::onProcessFrame ()
670
678
{
671
- if (_hasFrame )
679
+ if (_image. data == nullptr )
672
680
{
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 );
676
683
}
677
-
678
- _hasFrame = true ;
679
684
};
680
685
681
686
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 ()
682
698
{
683
699
struct pw_buffer * newFrame = nullptr ;
684
700
struct pw_buffer * dequeueFrame = nullptr ;
685
701
uint8_t * mappedMemory = nullptr ;
686
- uint8_t * frameBuffer = nullptr ;
687
- PipewireImage image;
702
+ uint8_t * frameBuffer = nullptr ;
688
703
689
704
if (_pwStream == nullptr )
690
705
return ;
691
706
692
707
_hasFrame = false ;
693
708
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 ;
701
715
702
716
while ((dequeueFrame = pw_stream_dequeue_buffer (_pwStream)) != nullptr )
703
717
{
@@ -816,7 +830,7 @@ void PipewireHandler::grabFrame()
816
830
if (!_infoUpdated)
817
831
printf (" PipewireEGL: succesfully rendered the DMA texture\n " );
818
832
819
- image .data = frameBuffer;
833
+ _image .data = frameBuffer;
820
834
}
821
835
822
836
break ;
@@ -837,7 +851,7 @@ void PipewireHandler::grabFrame()
837
851
}
838
852
else
839
853
{
840
- image .stride = newFrame->buffer ->datas ->chunk ->stride ;
854
+ _image .stride = newFrame->buffer ->datas ->chunk ->stride ;
841
855
842
856
if (newFrame->buffer ->datas ->type == SPA_DATA_MemFd)
843
857
{
@@ -852,26 +866,22 @@ void PipewireHandler::grabFrame()
852
866
}
853
867
else
854
868
{
855
- image.data = mappedMemory;
869
+ _image.data = (uint8_t *) malloc (_image.stride * _frameHeight);
870
+ memcpy (_image.data , mappedMemory, _image.stride * _frameHeight);
856
871
}
857
872
}
858
873
else if (newFrame->buffer ->datas ->type == SPA_DATA_MemPtr)
859
874
{
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);
861
877
}
862
878
}
863
879
}
864
880
865
- // forward the frame
866
- _callback (image);
867
-
868
881
// clean up
869
882
if (mappedMemory != nullptr )
870
883
munmap (mappedMemory, newFrame->buffer ->datas ->maxsize + newFrame->buffer ->datas ->mapoffset );
871
884
872
- if (frameBuffer != nullptr )
873
- free (frameBuffer);
874
-
875
885
if (newFrame != nullptr )
876
886
pw_stream_queue_buffer (_pwStream, newFrame);
877
887
0 commit comments