On Tue, Sep 24, 2024 at 10:43 PM Nuo Mi <nuomi2...@gmail.com> wrote:
> > > On Tue, Sep 24, 2024 at 10:24 PM Zhao Zhili <quinkbl...@foxmail.com> > wrote: > >> >> >> > On Sep 24, 2024, at 22:16, Nuo Mi <nuomi2...@gmail.com> wrote: >> > >> > Due to the nature of multithreading, using a "ready check" mechanism >> may introduce a deadlock. For example: >> > >> > Suppose all tasks have been submitted to the executor, and the last >> thread checks the entire list and finds >> > no ready tasks. It then goes to sleep, waiting for a new task. However, >> for some multithreading-related reason, >> > a task becomes ready after the check. Since no other thread is aware of >> this and no new tasks are being added to >> > the executor, a deadlock occurs. >> > >> > In VVC, this function is unnecessary because we use a scoreboard. All >> tasks submitted to the executor are ready tasks. >> > --- >> > libavcodec/vvc/thread.c | 8 -------- >> > libavutil/executor.c | 6 ++---- >> > libavutil/executor.h | 3 --- >> > 3 files changed, 2 insertions(+), 15 deletions(-) >> > >> > diff --git a/libavcodec/vvc/thread.c b/libavcodec/vvc/thread.c >> > index 86a7753c6a..6208cc1811 100644 >> > --- a/libavcodec/vvc/thread.c >> > +++ b/libavcodec/vvc/thread.c >> > @@ -372,13 +372,6 @@ static int task_is_stage_ready(VVCTask *t, int add) >> > return task_has_target_score(t, stage, score); >> > } >> > >> > -static int task_ready(const AVTask *_t, void *user_data) >> > -{ >> > - VVCTask *t = (VVCTask*)_t; >> > - >> > - return task_is_stage_ready(t, 0); >> > -} >> > - >> > #define CHECK(a, b) \ >> > do { \ >> > if ((a) != (b)) \ >> > @@ -689,7 +682,6 @@ AVExecutor* ff_vvc_executor_alloc(VVCContext *s, >> const int thread_count) >> > s, >> > sizeof(VVCLocalContext), >> > task_priority_higher, >> > - task_ready, >> > task_run, >> > }; >> > return av_executor_alloc(&callbacks, thread_count); >> > diff --git a/libavutil/executor.c b/libavutil/executor.c >> > index bfce2ac444..64e6cc0775 100644 >> > --- a/libavutil/executor.c >> > +++ b/libavutil/executor.c >> > @@ -79,10 +79,8 @@ static void add_task(AVTask **prev, AVTask *t) >> > static int run_one_task(AVExecutor *e, void *lc) >> > { >> > AVTaskCallbacks *cb = &e->cb; >> > - AVTask **prev; >> > + AVTask **prev = &e->tasks; >> > >> > - for (prev = &e->tasks; *prev && !cb->ready(*prev, cb->user_data); >> prev = &(*prev)->next) >> > - /* nothing */; >> > if (*prev) { >> > AVTask *t = remove_task(prev, *prev); >> > if (e->thread_count > 0) >> > @@ -143,7 +141,7 @@ AVExecutor* av_executor_alloc(const AVTaskCallbacks >> *cb, int thread_count) >> > { >> > AVExecutor *e; >> > int has_lock = 0, has_cond = 0; >> > - if (!cb || !cb->user_data || !cb->ready || !cb->run || >> !cb->priority_higher) >> > + if (!cb || !cb->user_data || !cb->run || !cb->priority_higher) >> > return NULL; >> > >> > e = av_mallocz(sizeof(*e)); >> > diff --git a/libavutil/executor.h b/libavutil/executor.h >> > index 0eb21c10c8..7af53c92ce 100644 >> > --- a/libavutil/executor.h >> > +++ b/libavutil/executor.h >> > @@ -36,9 +36,6 @@ typedef struct AVTaskCallbacks { >> > // return 1 if a's priority > b's priority >> > int (*priority_higher)(const AVTask *a, const AVTask *b); >> > >> > - // task is ready for run >> > - int (*ready)(const AVTask *t, void *user_data); >> > - >> > // run the task >> > int (*run)(AVTask *t, void *local_context, void *user_data); >> > } AVTaskCallbacks; >> >> Unfortunately executor.h is a public header, this is API/ABI break. >> > No one uses it except the vvc decoder. > I can update the libavutils API version > Currently, the pure decode speed for 8K is around 27–30 fps. To achieve stable 8K@30 playback, we may need to go through several rounds of refactoring and optimization for both the decoder and executor, with each refactor potentially breaking the API/ABI. > >> > -- >> > 2.34.1 >> > >> > _______________________________________________ >> > ffmpeg-devel mailing list >> > ffmpeg-devel@ffmpeg.org >> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > >> > To unsubscribe, visit link above, or email >> > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >> >> _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".