FFmpeg/libavcodec/executor.h
Nuo Mi 846fbc395b avcodec/vvc: simplify priority logical to improve performance for 4K/8K
For 4K/8K video processing, it's possible to have over 1,000 tasks pending on the executor.
In such cases, O(n) and O(log(n)) insertion times are too costly.
Reducing this to O(1) will significantly decrease the time spent in critical sections

clip                                                        | before | after  | delta
------------------------------------------------------------|--------|--------|-------
VVC_HDR_UHDTV2_OpenGOP_7680x4320_50fps_HLG10.bit            |    24  |   27   |  12.5%
VVC_HDR_UHDTV2_OpenGOP_7680x4320_50fps_HLG10_HighBitrate.bit|    12  |   17   |  41.7%
tears_of_steel_4k_8M_8bit_2000.vvc                          |    34  |  102   | 200.0%
VVC_UHDTV1_OpenGOP_3840x2160_60fps_HLG10.bit                |   126  |  128   |   1.6%
RitualDance_1920x1080_60_10_420_37_RA.266                   |   350  |  378   |   8.0%
NovosobornayaSquare_1920x1080.bin                           |   341  |  369   |   8.2%
Tango2_3840x2160_60_10_420_27_LD.266                        |    69  |   70   |   1.4%
RitualDance_1920x1080_60_10_420_32_LD.266                   |   243  |  259   |   6.6%
Chimera_8bit_1080P_1000_frames.vvc                          |   420  |  392   |  -6.7%
BQTerrace_1920x1080_60_10_420_22_RA.vvc                     |   148  |  144   |  -2.7%
2024-10-04 21:58:42 +08:00

72 lines
2.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2024 Nuo Mi
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* We still need several refactors to improve the current VVC decoder's performance,
* which will frequently break the API/ABI. To mitigate this, we've copied the executor from
* avutil to avcodec. Once the API/ABI is stable, we will move this class back to avutil
*/
#ifndef AVCODEC_EXECUTOR_H
#define AVCODEC_EXECUTOR_H
typedef struct FFExecutor FFExecutor;
typedef struct FFTask FFTask;
struct FFTask {
FFTask *next;
int priority; // task priority should >= 0 and < AVTaskCallbacks.priorities
};
typedef struct FFTaskCallbacks {
void *user_data;
int local_context_size;
// how many priorities do we have
int priorities;
// run the task
int (*run)(FFTask *t, void *local_context, void *user_data);
} FFTaskCallbacks;
/**
* Alloc executor
* @param callbacks callback structure for executor
* @param thread_count worker thread number, 0 for run on caller's thread directly
* @return return the executor
*/
FFExecutor* ff_executor_alloc(const FFTaskCallbacks *callbacks, int thread_count);
/**
* Free executor
* @param e pointer to executor
*/
void ff_executor_free(FFExecutor **e);
/**
* Add task to executor
* @param e pointer to executor
* @param t pointer to task. If NULL, it will wakeup one work thread
*/
void ff_executor_execute(FFExecutor *e, FFTask *t);
#endif //AVCODEC_EXECUTOR_H