2222
2323#define DEFAULT_LOG_CHANNEL " FramePlayer"
2424#include < logging/Log.h>
25+ #include < logging/Verify.h>
2526
2627#include < vrs/DiskFile.h>
2728#include < vrs/IndexRecord.h>
2829
30+ #include " FileReader.h"
31+
2932namespace vrsp {
3033
3134using namespace std ;
@@ -44,6 +47,9 @@ bool FramePlayer::onDataLayoutRead(
4447 const CurrentRecord& record,
4548 size_t blockIndex,
4649 DataLayout& layout) {
50+ if (!XR_VERIFY (state_ != FileReaderState::NoMedia)) {
51+ return false ;
52+ }
4753 ostringstream buffer;
4854 layout.printLayoutCompact (buffer);
4955 string text = buffer.str ();
@@ -62,12 +68,15 @@ bool FramePlayer::onImageRead(
6268 const CurrentRecord& record,
6369 size_t /* blockIndex*/ ,
6470 const ContentBlock& contentBlock) {
71+ if (!XR_VERIFY (state_ != FileReaderState::NoMedia)) {
72+ return false ;
73+ }
6574 if (!saveNextFramePath_.empty ()) {
6675 return saveFrame (record, contentBlock);
6776 }
6877 widget_->setDataFps (dataFps_.newFrame ()); // fps counter for images read from file
6978 const auto & spec = contentBlock.image ();
70- shared_ptr <PixelFrame> frame = getFrame (true );
79+ unique_ptr <PixelFrame> frame = getFrame (spec. getPixelFormat () );
7180 bool frameValid = false ;
7281 imageFormat_ = spec.getImageFormat ();
7382 if (imageFormat_ == vrs::ImageFormat::VIDEO) {
@@ -132,7 +141,7 @@ bool FramePlayer::onImageRead(
132141 widget_->swapImage (frame);
133142 }
134143 }
135- recycle (frame, !needsConvertedFrame_ );
144+ recycle (frame);
136145 return true ; // read next blocks, if any
137146}
138147
@@ -141,44 +150,52 @@ void FramePlayer::setVisible(bool visible) {
141150 widget_->setVisible (visible_);
142151}
143152
144- void FramePlayer::convertFrame (shared_ptr <PixelFrame>& frame) {
153+ void FramePlayer::convertFrame (unique_ptr <PixelFrame>& frame) {
145154 if (blankMode_) {
146155 makeBlankFrame (frame);
147156 } else {
148- shared_ptr<PixelFrame> convertedFrame = needsConvertedFrame_ ? getFrame (false ) : nullptr ;
149- PixelFrame::normalizeFrame (frame, convertedFrame, false , normalizeOptions_);
150- needsConvertedFrame_ = (frame != convertedFrame); // for next time!
157+ unique_ptr<PixelFrame> convertedFrame =
158+ needsConvertedFrame_ ? getFrame (frame->getPixelFormat ()) : nullptr ;
159+ needsConvertedFrame_ =
160+ frame->normalizeFrame (PixelFrame::make (convertedFrame), false , normalizeOptions_);
151161 if (needsConvertedFrame_) {
152- recycle (frame, true );
162+ recycle (frame);
153163 frame = std::move (convertedFrame);
154164 }
155165 }
156166}
157167
158- void FramePlayer::makeBlankFrame (shared_ptr <PixelFrame>& frame) {
168+ void FramePlayer::makeBlankFrame (unique_ptr <PixelFrame>& frame) {
159169 frame->init (vrs::PixelFormat::GREY8, frame->getWidth (), frame->getHeight ());
160170 frame->blankFrame ();
161171}
162172
163- shared_ptr <PixelFrame> FramePlayer::getFrame (bool inputNotConvertedFrame ) {
173+ unique_ptr <PixelFrame> FramePlayer::getFrame (vrs::PixelFormat format ) {
164174 unique_lock<mutex> lock (frameMutex_);
165- vector<shared_ptr<PixelFrame>>& frames = inputNotConvertedFrame ? inputFrames_ : convertedframes_;
166- if (frames.empty ()) {
175+ if (recycledFrames_.empty ()) {
167176 return nullptr ;
168177 }
169- shared_ptr<PixelFrame> frame = std::move (frames.back ());
170- frames.pop_back ();
178+ if (recycledFrames_.back ()->getPixelFormat () == format) {
179+ unique_ptr<PixelFrame> frame = std::move (recycledFrames_.back ());
180+ recycledFrames_.pop_back ();
181+ return frame;
182+ }
183+ unique_ptr<PixelFrame> frame = std::move (recycledFrames_.front ());
184+ recycledFrames_.pop_front ();
171185 return frame;
172186}
173187
174- void FramePlayer::recycle (shared_ptr <PixelFrame>& frame, bool inputNotConvertedFrame ) {
188+ void FramePlayer::recycle (unique_ptr <PixelFrame>& frame) {
175189 if (frame) {
176190 {
177191 unique_lock<mutex> lock (frameMutex_);
178- vector<shared_ptr<PixelFrame>>& frames =
179- inputNotConvertedFrame ? inputFrames_ : convertedframes_;
180- if (frames.size () < 10 ) {
181- frames.emplace_back (std::move (frame));
192+ if (recycledFrames_.size () < 10 ) {
193+ if (recycledFrames_.empty () ||
194+ recycledFrames_.back ()->getPixelFormat () == frame->getPixelFormat ()) {
195+ recycledFrames_.emplace_back (std::move (frame));
196+ } else {
197+ recycledFrames_.emplace_front (std::move (frame));
198+ }
182199 }
183200 }
184201 frame.reset ();
@@ -267,7 +284,10 @@ void FramePlayer::imageJobsThreadActivity() {
267284 while (imageJobs_.getJob (job)) {
268285 ; // just skip!
269286 }
270- shared_ptr<PixelFrame>& frame = *job;
287+ if (!XR_VERIFY (state_ != FileReaderState::NoMedia)) {
288+ continue ;
289+ }
290+ unique_ptr<PixelFrame>& frame = *job;
271291 bool frameValid = false ;
272292 vrs::ImageFormat imageFormat = frame->getImageFormat ();
273293 if (imageFormat == vrs::ImageFormat::RAW) {
@@ -283,7 +303,7 @@ void FramePlayer::imageJobsThreadActivity() {
283303 widget_->swapImage (frame);
284304 }
285305 if (imageFormat != vrs::ImageFormat::VIDEO) {
286- recycle (frame, !frameValid || !needsConvertedFrame_ );
306+ recycle (frame);
287307 }
288308 }
289309}
0 commit comments