From fc26329e559cfe15e8fc0becaab81d1c3ef14130 Mon Sep 17 00:00:00 2001
From: redzic <48274562+redzic@users.noreply.github.com>
Date: Wed, 13 Jul 2022 11:35:33 -0500
Subject: [PATCH] Avoid taking ownership of Arc> in scenechange API
(#2958)
---
src/api/channel/by_gop.rs | 4 +++-
src/api/internal.rs | 36 +++++++++++++++++++++++++-----------
src/scenechange/mod.rs | 4 ++--
3 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/src/api/channel/by_gop.rs b/src/api/channel/by_gop.rs
index 23b2acdc6e..d5f05fec07 100644
--- a/src/api/channel/by_gop.rs
+++ b/src/api/channel/by_gop.rs
@@ -66,8 +66,10 @@ impl SceneChange {
fn split(&mut self, lookahead: &[Arc>]) -> Option<(usize, bool)> {
self.processed += 1;
+ let lookahead_ref: Vec<_> = lookahead[self.frames..].iter().collect();
+
let new_gop = self.detector.analyze_next_frame(
- &lookahead[self.frames..],
+ &lookahead_ref,
self.processed,
self.last_keyframe,
);
diff --git a/src/api/internal.rs b/src/api/internal.rs
index dd823906dd..859f18d093 100644
--- a/src/api/internal.rs
+++ b/src/api/internal.rs
@@ -357,8 +357,8 @@ impl ContextInner {
let lookahead_frames = self
.frame_q
.range(self.next_lookahead_frame - 1..)
- .filter_map(|(&_input_frameno, frame)| frame.clone())
- .collect::>();
+ .filter_map(|(&_input_frameno, frame)| frame.as_ref())
+ .collect::>>>();
if is_flushing {
// This is the last time send_frame is called, process all the
@@ -371,10 +371,22 @@ impl ContextInner {
break;
}
- self.compute_keyframe_placement(cur_lookahead_frames);
+ Self::compute_keyframe_placement(
+ cur_lookahead_frames,
+ &self.keyframes_forced,
+ &mut self.keyframe_detector,
+ &mut self.next_lookahead_frame,
+ &mut self.keyframes,
+ );
}
} else {
- self.compute_keyframe_placement(&lookahead_frames);
+ Self::compute_keyframe_placement(
+ &lookahead_frames,
+ &self.keyframes_forced,
+ &mut self.keyframe_detector,
+ &mut self.next_lookahead_frame,
+ &mut self.keyframes,
+ );
}
}
@@ -837,19 +849,21 @@ impl ContextInner {
#[hawktracer(compute_keyframe_placement)]
pub fn compute_keyframe_placement(
- &mut self, lookahead_frames: &[Arc>],
+ lookahead_frames: &[&Arc>], keyframes_forced: &BTreeSet,
+ keyframe_detector: &mut SceneChangeDetector,
+ next_lookahead_frame: &mut u64, keyframes: &mut BTreeSet,
) {
- if self.keyframes_forced.contains(&self.next_lookahead_frame)
- || self.keyframe_detector.analyze_next_frame(
+ if keyframes_forced.contains(next_lookahead_frame)
+ || keyframe_detector.analyze_next_frame(
lookahead_frames,
- self.next_lookahead_frame,
- *self.keyframes.iter().last().unwrap(),
+ *next_lookahead_frame,
+ *keyframes.iter().last().unwrap(),
)
{
- self.keyframes.insert(self.next_lookahead_frame);
+ keyframes.insert(*next_lookahead_frame);
}
- self.next_lookahead_frame += 1;
+ *next_lookahead_frame += 1;
}
#[hawktracer(compute_frame_invariants)]
diff --git a/src/scenechange/mod.rs b/src/scenechange/mod.rs
index 8de67262a7..7414f09d3b 100644
--- a/src/scenechange/mod.rs
+++ b/src/scenechange/mod.rs
@@ -166,7 +166,7 @@ impl SceneChangeDetector {
/// This will gracefully handle the first frame in the video as well.
#[hawktracer(analyze_next_frame)]
pub fn analyze_next_frame(
- &mut self, frame_set: &[Arc>], input_frameno: u64,
+ &mut self, frame_set: &[&Arc>], input_frameno: u64,
previous_keyframe: u64,
) -> bool {
// Use score deque for adaptive threshold for scene cut
@@ -254,7 +254,7 @@ impl SceneChangeDetector {
// Initially fill score deque with frame scores
fn initialize_score_deque(
- &mut self, frame_set: &[Arc>], input_frameno: u64,
+ &mut self, frame_set: &[&Arc>], input_frameno: u64,
init_len: usize,
) {
for x in 0..init_len {