Skip to content

Commit a653e4c

Browse files
committed
fix
1 parent 6f89702 commit a653e4c

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

src/scenechange/mod.rs

+30-29
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,15 @@ impl<T: Pixel> SceneChangeDetector<T> {
136136
}
137137

138138
// Decrease deque offset if there is no more frames
139-
if self.deque_offset > frame_set.len() && self.lookahead_offset > 0 {
139+
if self.deque_offset > frame_set.len() + 1 && self.lookahead_offset > 0 {
140140
self.deque_offset = frame_set.len();
141141
}
142142

143143
// Initially fill score deque with forward frames
144-
if self.deque_offset > 0 && self.score_deque.len() == 0 {
144+
if self.deque_offset > 0
145+
&& self.score_deque.is_empty()
146+
&& frame_set.len() > self.lookahead_offset + 1
147+
{
145148
for x in 0..self.lookahead_offset {
146149
// Filling score deque with forward frames
147150
let result = if self.fast_mode {
@@ -156,35 +159,36 @@ impl<T: Pixel> SceneChangeDetector<T> {
156159
};
157160
self.score_deque.push((result.inter_cost, result.intra_cost));
158161
}
159-
debug!("{:.0?}", self.score_deque)
160162
}
161163

162164
// Running single frame comparison and adding it to deque
163-
let result = if self.fast_mode {
164-
self.fast_scenecut(
165-
frame_set[0 + self.deque_offset].clone(),
166-
frame_set[1 + self.deque_offset].clone(),
167-
)
168-
} else {
169-
self.cost_scenecut(
170-
frame_set[0 + self.deque_offset].clone(),
171-
frame_set[1 + self.deque_offset].clone(),
172-
input_frameno,
173-
previous_keyframe,
174-
)
175-
};
176-
self
177-
.score_deque
178-
.push((result.inter_cost as f64, result.intra_cost as f64));
165+
if frame_set.len() > self.deque_offset + 1 {
166+
let result = if self.fast_mode {
167+
self.fast_scenecut(
168+
frame_set[self.deque_offset].clone(),
169+
frame_set[self.deque_offset + 1].clone(),
170+
)
171+
} else {
172+
self.cost_scenecut(
173+
frame_set[self.deque_offset].clone(),
174+
frame_set[self.deque_offset + 1].clone(),
175+
input_frameno,
176+
previous_keyframe,
177+
)
178+
};
179+
self
180+
.score_deque
181+
.push((result.inter_cost as f64, result.intra_cost as f64));
182+
}
179183

180-
// Adaptive scenecut check;
184+
// Adaptive scenecut check
181185
let scenecut = self.adaptive_scenecut();
182186

183187
debug!(
184188
"[SC-Detect] Frame {}: Cost={:.0} Threshold= {:.0} {}",
185189
input_frameno,
186-
self.score_deque[self.score_deque.len() - self.deque_offset].0,
187-
self.score_deque[self.score_deque.len() - self.deque_offset].1,
190+
self.score_deque[self.score_deque.len() - (self.deque_offset + 1)].0,
191+
self.score_deque[self.score_deque.len() - (self.deque_offset + 1)].1,
188192
if scenecut { "Scenecut" } else { "No cut" }
189193
);
190194

@@ -194,13 +198,11 @@ impl<T: Pixel> SceneChangeDetector<T> {
194198

195199
// Clear buffers and deque
196200
self.frame_buffer.clear();
201+
debug!("[SC-score-deque]{:.0?}", self.score_deque);
197202
self.score_deque.clear();
198203
} else {
199204
// Keep score deque 5 + lookahead_size frames
200-
self
201-
.score_deque
202-
.push((result.inter_cost as f64, result.intra_cost as f64));
203-
if self.score_deque.len() > 5 + self.deque_offset {
205+
if self.score_deque.len() > 5 + self.lookahead_offset {
204206
self.score_deque.remove(0);
205207
}
206208
}
@@ -228,10 +230,9 @@ impl<T: Pixel> SceneChangeDetector<T> {
228230
};
229231

230232
let scene_score =
231-
self.score_deque[self.score_deque.len() - self.deque_offset].0;
233+
self.score_deque[self.score_deque.len() - (self.deque_offset + 1)].0;
232234

233-
let scenecut = scene_score >= threshold;
234-
scenecut
235+
scene_score >= threshold
235236
}
236237

237238
/// The fast algorithm detects fast cuts using a raw difference

0 commit comments

Comments
 (0)