Skip to content

Commit 3bfdbbc

Browse files
committed
Remove backward stale frame handling in AVAssetReaderDecoder
1 parent 04066dd commit 3bfdbbc

File tree

1 file changed

+6
-67
lines changed

1 file changed

+6
-67
lines changed

crates/rendering/src/decoder/avassetreader.rs

Lines changed: 6 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@ impl AVAssetReaderDecoder {
287287
let mut last_active_frame = None::<u32>;
288288
let last_sent_frame = Rc::new(RefCell::new(None::<ProcessedFrame>));
289289
let first_ever_frame = Rc::new(RefCell::new(None::<ProcessedFrame>));
290-
let mut backward_stale_count: u32 = 0;
291290

292291
let mut frames = this.inner.frames();
293292
let processor = ImageBufProcessor::new();
@@ -347,28 +346,6 @@ impl AVAssetReaderDecoder {
347346
let requested_time = requested_frame as f32 / fps as f32;
348347

349348
const BACKWARD_SEEK_TOLERANCE: u32 = 120;
350-
const MAX_STALE_FRAMES: u32 = 3;
351-
let cache_frame_min_early = cache.keys().next().copied();
352-
let cache_frame_max_early = cache.keys().next_back().copied();
353-
354-
if let (Some(c_min), Some(_c_max)) = (cache_frame_min_early, cache_frame_max_early) {
355-
let is_backward_within_tolerance =
356-
requested_frame < c_min && requested_frame + BACKWARD_SEEK_TOLERANCE >= c_min;
357-
if is_backward_within_tolerance
358-
&& backward_stale_count < MAX_STALE_FRAMES
359-
&& let Some(closest_frame) = cache.get(&c_min)
360-
{
361-
backward_stale_count += 1;
362-
let data = closest_frame.data().clone();
363-
*last_sent_frame.borrow_mut() = Some(data.clone());
364-
for req in pending_requests.drain(..) {
365-
if req.sender.send(data.to_decoded_frame()).is_err() {
366-
debug!("frame receiver dropped before send");
367-
}
368-
}
369-
continue;
370-
}
371-
}
372349

373350
let cache_min = min_requested_frame.saturating_sub(FRAME_CACHE_SIZE as u32 / 2);
374351
let cache_max = max_requested_frame + FRAME_CACHE_SIZE as u32 / 2;
@@ -382,11 +359,7 @@ impl AVAssetReaderDecoder {
382359
requested_frame + BACKWARD_SEEK_TOLERANCE < c_min;
383360
let is_forward_seek_beyond_cache =
384361
requested_frame > c_max + FRAME_CACHE_SIZE as u32 / 4;
385-
let stale_limit_exceeded =
386-
backward_stale_count >= MAX_STALE_FRAMES && requested_frame < c_min;
387-
is_backward_seek_beyond_tolerance
388-
|| is_forward_seek_beyond_cache
389-
|| stale_limit_exceeded
362+
is_backward_seek_beyond_tolerance || is_forward_seek_beyond_cache
390363
} else {
391364
true
392365
};
@@ -395,7 +368,6 @@ impl AVAssetReaderDecoder {
395368
this.reset(requested_time);
396369
frames = this.inner.frames();
397370
*last_sent_frame.borrow_mut() = None;
398-
backward_stale_count = 0;
399371
cache.retain(|&f, _| f >= cache_min && f <= cache_max);
400372
}
401373

@@ -445,7 +417,6 @@ impl AVAssetReaderDecoder {
445417
}
446418

447419
cache.insert(current_frame, cache_frame.clone());
448-
backward_stale_count = 0;
449420

450421
let mut remaining_requests = Vec::with_capacity(pending_requests.len());
451422
for req in pending_requests.drain(..) {
@@ -456,13 +427,9 @@ impl AVAssetReaderDecoder {
456427
debug!("frame receiver dropped before send");
457428
}
458429
} else if req.frame < current_frame {
459-
let prev_frame_data = last_sent_frame.borrow().clone();
460-
if let Some(data) = prev_frame_data {
461-
if req.sender.send(data.to_decoded_frame()).is_err() {
462-
debug!("frame receiver dropped before send");
463-
}
464-
} else {
465-
let data = cache_frame.data().clone();
430+
if let Some(cached) = cache.get(&req.frame) {
431+
let data = cached.data().clone();
432+
*last_sent_frame.borrow_mut() = Some(data.clone());
466433
if req.sender.send(data.to_decoded_frame()).is_err() {
467434
debug!("frame receiver dropped before send");
468435
}
@@ -486,39 +453,11 @@ impl AVAssetReaderDecoder {
486453
this.is_done = true;
487454

488455
for req in pending_requests.drain(..) {
489-
let prev_data = last_sent_frame.borrow().clone();
490-
if let Some(data) = prev_data {
456+
if let Some(cached) = cache.get(&req.frame) {
457+
let data = cached.data().clone();
491458
if req.sender.send(data.to_decoded_frame()).is_err() {
492459
debug!("frame receiver dropped before send");
493460
}
494-
} else if let Some(first_frame) = first_ever_frame.borrow().clone() {
495-
debug!(
496-
"Returning first decoded frame as fallback for request {}",
497-
req.frame
498-
);
499-
if req.sender.send(first_frame.to_decoded_frame()).is_err() {
500-
debug!("frame receiver dropped before send");
501-
}
502-
} else {
503-
debug!(
504-
"No frames available for request {}, returning black frame",
505-
req.frame
506-
);
507-
let black_frame_data = vec![0u8; (video_width * video_height * 4) as usize];
508-
let black_frame = ProcessedFrame {
509-
_number: req.frame,
510-
width: video_width,
511-
height: video_height,
512-
format: PixelFormat::Rgba,
513-
frame_data: FrameData {
514-
data: Arc::new(black_frame_data),
515-
y_stride: video_width * 4,
516-
uv_stride: 0,
517-
},
518-
};
519-
if req.sender.send(black_frame.to_decoded_frame()).is_err() {
520-
debug!("frame receiver dropped before send");
521-
}
522461
}
523462
}
524463
}

0 commit comments

Comments
 (0)