@@ -136,12 +136,15 @@ impl<T: Pixel> SceneChangeDetector<T> {
136
136
}
137
137
138
138
// 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 {
140
140
self . deque_offset = frame_set. len ( ) ;
141
141
}
142
142
143
143
// 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
+ {
145
148
for x in 0 ..self . lookahead_offset {
146
149
// Filling score deque with forward frames
147
150
let result = if self . fast_mode {
@@ -156,35 +159,36 @@ impl<T: Pixel> SceneChangeDetector<T> {
156
159
} ;
157
160
self . score_deque . push ( ( result. inter_cost , result. intra_cost ) ) ;
158
161
}
159
- debug ! ( "{:.0?}" , self . score_deque)
160
162
}
161
163
162
164
// 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
+ }
179
183
180
- // Adaptive scenecut check;
184
+ // Adaptive scenecut check
181
185
let scenecut = self . adaptive_scenecut ( ) ;
182
186
183
187
debug ! (
184
188
"[SC-Detect] Frame {}: Cost={:.0} Threshold= {:.0} {}" ,
185
189
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 ,
188
192
if scenecut { "Scenecut" } else { "No cut" }
189
193
) ;
190
194
@@ -194,13 +198,11 @@ impl<T: Pixel> SceneChangeDetector<T> {
194
198
195
199
// Clear buffers and deque
196
200
self . frame_buffer . clear ( ) ;
201
+ debug ! ( "[SC-score-deque]{:.0?}" , self . score_deque) ;
197
202
self . score_deque . clear ( ) ;
198
203
} else {
199
204
// 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 {
204
206
self . score_deque . remove ( 0 ) ;
205
207
}
206
208
}
@@ -228,10 +230,9 @@ impl<T: Pixel> SceneChangeDetector<T> {
228
230
} ;
229
231
230
232
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 ;
232
234
233
- let scenecut = scene_score >= threshold;
234
- scenecut
235
+ scene_score >= threshold
235
236
}
236
237
237
238
/// The fast algorithm detects fast cuts using a raw difference
0 commit comments