Skip to content

Commit 27f71de

Browse files
committed
Split fine directional prediction search into 2 passes
1. Search matching deltas for luma and chroma 2. Refine chroma delta for best luma delta Iterations are the sum of luma/chroma deltas rather than the product. On thaloundeskmtg360p_60f.y4m at speed 5 and quantizer 100, this yields 37% overall speed-up. This clip has 2 keyframes out of 60 frames and they are ~40% directionally predicted. Expected average speedup on objective-1-fast is ~16%.
1 parent 8ba77e7 commit 27f71de

File tree

1 file changed

+24
-25
lines changed

1 file changed

+24
-25
lines changed

src/rdo.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,30 +1308,16 @@ fn intra_frame_rdo_mode_decision<T: Pixel>(
13081308
&& bsize >= BlockSize::BLOCK_8X8
13091309
{
13101310
// Find the best angle delta for the current best prediction mode
1311-
let luma_angle_delta_count = best.pred_mode_luma.angle_delta_count();
1312-
let chroma_angle_delta_count = best.pred_mode_chroma.angle_delta_count();
1313-
1314-
'luma_loop: for i in 0..luma_angle_delta_count {
1315-
for j in 0..chroma_angle_delta_count {
1316-
let mvs = [MotionVector::default(); 2];
1317-
let ref_frames = [INTRA_FRAME, NONE_FRAME];
1318-
let mut mode_set_chroma = ArrayVec::<[_; 2]>::new();
1319-
mode_set_chroma.push(best.pred_mode_chroma);
1320-
1321-
let angle_delta_y: i8 = if luma_angle_delta_count == 1 {
1322-
0
1323-
} else {
1324-
i - MAX_ANGLE_DELTA as i8
1325-
};
1326-
let angle_delta_uv: i8 = if chroma_angle_delta_count == 1 {
1327-
0
1328-
} else {
1329-
j - MAX_ANGLE_DELTA as i8
1330-
};
1331-
if luma_angle_delta_count == 1 && chroma_angle_delta_count == 1 {
1332-
break 'luma_loop;
1333-
}
1311+
let luma_deltas = best.pred_mode_luma.angle_delta_count();
1312+
let chroma_deltas = best.pred_mode_chroma.angle_delta_count();
13341313

1314+
let mvs = [MotionVector::default(); 2];
1315+
let ref_frames = [INTRA_FRAME, NONE_FRAME];
1316+
let mode_set_chroma = [best.pred_mode_chroma];
1317+
let mv_stack = ArrayVec::<[_; 9]>::new();
1318+
let mut best_angle_delta_y = best.angle_delta.y;
1319+
let mut angle_delta_rdo = |y, uv| -> i8 {
1320+
if best.angle_delta.y != y || best.angle_delta.uv != uv {
13351321
luma_chroma_mode_rdo(
13361322
best.pred_mode_luma,
13371323
fi,
@@ -1347,10 +1333,23 @@ fn intra_frame_rdo_mode_decision<T: Pixel>(
13471333
&mode_set_chroma,
13481334
true,
13491335
0,
1350-
&ArrayVec::<[CandidateMV; 9]>::new(),
1351-
AngleDelta { y: angle_delta_y, uv: angle_delta_uv },
1336+
&mv_stack,
1337+
AngleDelta { y, uv },
13521338
);
13531339
}
1340+
best.angle_delta.y
1341+
};
1342+
1343+
for i in 0..luma_deltas {
1344+
let angle_delta_y =
1345+
if luma_deltas == 1 { 0 } else { i - MAX_ANGLE_DELTA as i8 };
1346+
let angle_delta_uv = if chroma_deltas == 1 { 0 } else { angle_delta_y };
1347+
best_angle_delta_y = angle_delta_rdo(angle_delta_y, angle_delta_uv);
1348+
}
1349+
for j in 0..chroma_deltas {
1350+
let angle_delta_uv =
1351+
if chroma_deltas == 1 { 0 } else { j - MAX_ANGLE_DELTA as i8 };
1352+
angle_delta_rdo(best_angle_delta_y, angle_delta_uv);
13541353
}
13551354
}
13561355

0 commit comments

Comments
 (0)