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%
This commit is contained in:
Nuo Mi 2024-07-28 11:17:57 +08:00
parent 7eb1df44ae
commit bdb79fe60a

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;