avcodec/vvcdec: thread, ensure the parse stage gets the highest priority

The parser stage is not parallelizable.
We need to schedule it as soon as possible to create later stages, which are more parallelizable

clips                                       | before | after | delta
--------------------------------------------|--------|-------|------
RitualDance_1920x1080_60_10_420_37_RA.266   | 342.7  | 365.3 |  6.59%
NovosobornayaSquare_1920x1080.bin           | 321.7  | 400   | 24.34%
Tango2_3840x2160_60_10_420_27_LD.266        |  82.3  |  91.7 | 11.42%
RitualDance_1920x1080_60_10_420_32_LD.266   | 323.7  | 319.3 | -1.36%
Chimera_8bit_1080P_1000_frames.vvc          | 364    | 411.3 | 12.99%
BQTerrace_1920x1080_60_10_420_22_RA.vvc     | 162.7  | 185.7 | 14.14%

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Nuo Mi 2024-07-28 11:17:57 +08:00 committed by Paul B Mahol
parent b6b22d5f56
commit 92c4710e4c

View File

@ -385,14 +385,15 @@ static int task_priority_higher(const AVTask *_a, const AVTask *_b)
const VVCTask *a = (const VVCTask*)_a;
const VVCTask *b = (const VVCTask*)_b;
CHECK(a->fc->decode_order, b->fc->decode_order); //decode order
if (a->stage == VVC_TASK_STAGE_PARSE || b->stage == VVC_TASK_STAGE_PARSE) {
if (a->stage <= VVC_TASK_STAGE_PARSE || b->stage <= VVC_TASK_STAGE_PARSE) {
CHECK(a->stage, b->stage);
CHECK(a->fc->decode_order, b->fc->decode_order); //decode order
CHECK(a->ry, b->ry);
return a->rx < b->rx;
}
CHECK(a->fc->decode_order, b->fc->decode_order); //decode order
CHECK(a->rx + a->ry + a->stage, b->rx + b->ry + b->stage); //zigzag with type
CHECK(a->rx + a->ry, b->rx + b->ry); //zigzag
return a->ry < b->ry;