decoder/renderer: no longer index automatically as part of the retrieve
functions Indexing is a lengthy process and had a high chance of getting RenderWorkers stuck doing it rather than being responsive to cache requests. This commit introduces a system where workers never index media, but instead signal that media is not ready to their RenderBackends which ensure that the media gets indexed and re-queues the affected frames when those indexes are ready.
This commit is contained in:
@@ -23,9 +23,9 @@ void AudioRenderWorker::CloseInternal()
|
||||
// Nothing to init yet
|
||||
}
|
||||
|
||||
FramePtr AudioRenderWorker::RetrieveFromDecoder(DecoderPtr decoder, const TimeRange &range, const QAtomicInt *cancelled)
|
||||
FramePtr AudioRenderWorker::RetrieveFromDecoder(DecoderPtr decoder, const TimeRange &range)
|
||||
{
|
||||
return decoder->RetrieveAudio(range.in(), range.out() - range.in(), audio_params_, cancelled);
|
||||
return decoder->RetrieveAudio(range.in(), range.out() - range.in(), audio_params_);
|
||||
}
|
||||
|
||||
NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const TimeRange &range)
|
||||
@@ -42,12 +42,12 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti
|
||||
TimeRange range_for_block(qMax(b->in(), range.in()),
|
||||
qMin(b->out(), range.out()));
|
||||
|
||||
NodeValueTable table = ProcessNode(NodeDependency(b,
|
||||
range_for_block));
|
||||
NodeValueTable table = ProcessNode(NodeDependency(b, range_for_block));
|
||||
|
||||
QByteArray samples_from_this_block = table.Take(NodeParam::kSamples).toByteArray();
|
||||
int destination_offset = audio_params_.time_to_bytes(range_for_block.in() - range.in());
|
||||
int maximum_copy_size = audio_params_.time_to_bytes(range_for_block.length());
|
||||
|
||||
int copied_size = 0;
|
||||
|
||||
if (!samples_from_this_block.isEmpty()) {
|
||||
@@ -81,13 +81,7 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti
|
||||
|
||||
memcpy(block_range_buffer.data()+destination_offset,
|
||||
samples_from_this_block.data(),
|
||||
static_cast<size_t>(copied_size));
|
||||
}
|
||||
|
||||
if (copied_size < maximum_copy_size) {
|
||||
memset(block_range_buffer.data()+destination_offset+copied_size,
|
||||
0,
|
||||
static_cast<size_t>(maximum_copy_size - copied_size));
|
||||
qMax(maximum_copy_size, copied_size));
|
||||
}
|
||||
|
||||
NodeValueTable::Merge({merged_table, table});
|
||||
|
||||
Reference in New Issue
Block a user