renderer: improved code flow

This commit is contained in:
itsmattkc
2021-09-21 19:10:03 -07:00
parent 751b5f6c44
commit 677277c16d
17 changed files with 401 additions and 345 deletions
+8 -3
View File
@@ -85,7 +85,7 @@ bool Decoder::Open(const CodecStream &stream)
}
}
FramePtr Decoder::RetrieveVideo(const rational &timecode, const RetrieveVideoParams &divider)
FramePtr Decoder::RetrieveVideo(const rational &timecode, const RetrieveVideoParams &divider, const QAtomicInt *cancelled)
{
QMutexLocker locker(&mutex_);
@@ -101,7 +101,11 @@ FramePtr Decoder::RetrieveVideo(const rational &timecode, const RetrieveVideoPar
return nullptr;
}
return RetrieveVideoInternal(timecode, divider);
if (cancelled && *cancelled) {
return nullptr;
}
return RetrieveVideoInternal(timecode, divider, cancelled);
}
Decoder::RetrieveAudioData Decoder::RetrieveAudio(const TimeRange &range, const AudioParams &params, const QString& cache_path, Footage::LoopMode loop_mode, RenderMode::Mode mode)
@@ -248,10 +252,11 @@ int64_t Decoder::GetImageSequenceIndex(const QString &filename)
return number_only.toLongLong();
}
FramePtr Decoder::RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams &divider)
FramePtr Decoder::RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams &divider, const QAtomicInt *cancelled)
{
Q_UNUSED(timecode)
Q_UNUSED(divider)
Q_UNUSED(cancelled)
return nullptr;
}
+2 -2
View File
@@ -184,7 +184,7 @@ public:
*
* This function is thread safe and can only run while the decoder is open. \see Open()
*/
FramePtr RetrieveVideo(const rational& timecode, const RetrieveVideoParams& divider);
FramePtr RetrieveVideo(const rational& timecode, const RetrieveVideoParams& divider, const QAtomicInt *cancelled = nullptr);
enum RetrieveAudioStatus {
kInvalid = -1,
@@ -284,7 +284,7 @@ protected:
* Sub-classes must override this function IF they support video. Function is already mutexed
* so sub-classes don't need to worry about thread safety.
*/
virtual FramePtr RetrieveVideoInternal(const rational& timecode, const RetrieveVideoParams& divider);
virtual FramePtr RetrieveVideoInternal(const rational& timecode, const RetrieveVideoParams& divider, const QAtomicInt *cancelled);
virtual bool ConformAudioInternal(const QString& filename, const AudioParams &params, const QAtomicInt* cancelled);
+7 -3
View File
@@ -145,7 +145,7 @@ bool FFmpegDecoder::OpenInternal()
return output_frame;
}*/
FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams &params)
FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams &params, const QAtomicInt *cancelled)
{
if (!InitScaler(params)) {
return nullptr;
@@ -154,7 +154,7 @@ FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const Re
AVStream* s = instance_.avstream();
// Retrieve frame
FFmpegFramePool::ElementPtr return_frame = RetrieveFrame(timecode);
FFmpegFramePool::ElementPtr return_frame = RetrieveFrame(timecode, cancelled);
// We found the frame, we'll return a copy
if (return_frame) {
@@ -661,7 +661,7 @@ void FFmpegDecoder::ClearFrameCache()
}
}
FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const rational& time)
FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const rational& time, const QAtomicInt *cancelled)
{
int64_t target_ts = GetTimeInTimebaseUnits(time, instance_.avstream()->time_base, instance_.avstream()->start_time);
@@ -704,6 +704,10 @@ FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const rational& time)
AVFrame* working_frame = av_frame_alloc();
while (true) {
// Break out of loop if we've cancelled
if (cancelled && *cancelled) {
break;
}
// Pull from the decoder
av_frame_unref(working_frame);
+2 -2
View File
@@ -63,7 +63,7 @@ public:
protected:
virtual bool OpenInternal() override;
virtual FramePtr RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams& params) override;
virtual FramePtr RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams& params, const QAtomicInt *cancelled) override;
virtual bool ConformAudioInternal(const QString& filename, const AudioParams &params, const QAtomicInt* cancelled) override;
virtual void CloseInternal() override;
@@ -137,7 +137,7 @@ private:
void ClearFrameCache();
FFmpegFramePool::ElementPtr RetrieveFrame(const rational &time);
FFmpegFramePool::ElementPtr RetrieveFrame(const rational &time, const QAtomicInt *cancelled);
void RemoveFirstFrame();
+2 -1
View File
@@ -101,9 +101,10 @@ bool OIIODecoder::OpenInternal()
return OpenImageHandler(stream().filename());
}
FramePtr OIIODecoder::RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams &divider)
FramePtr OIIODecoder::RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams &divider, const QAtomicInt *cancelled)
{
Q_UNUSED(timecode)
Q_UNUSED(cancelled)
FramePtr frame = Frame::Create();
+1 -1
View File
@@ -44,7 +44,7 @@ public:
protected:
virtual bool OpenInternal() override;
virtual FramePtr RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams& divider) override;
virtual FramePtr RetrieveVideoInternal(const rational &timecode, const RetrieveVideoParams& divider, const QAtomicInt *cancelled) override;
virtual void CloseInternal() override;
private: