Как использовать sws_scale ffmpeg из нескольких потоков?

У меня есть функция преобразования цветового пространства на основе sws_scale. Он будет вызываться из нескольких разных потоков в течение всего жизненного цикла приложения. Однако я не знаю, насколько потокобезопасен sws_scale, и я не нашел упоминания об этом в его документации.

Я бы предположил, что для каждого потока требуется свой собственный SwsContext, так как этот параметр будет общим, но этого достаточно, чтобы гарантировать отсутствие внутренних столкновений?


person Asik    schedule 22.04.2013    source источник


Ответы (2)


Вы должны быть в безопасности, пока каждый поток имеет свое собственное значение SwsContext. Беглый взгляд на исходники libswscale показывает, что он не использует никаких глобальных переменных.

person Paul    schedule 22.04.2013

ffmpeg по умолчанию не является потокобезопасным. Однако libswsscale кажется безопасным, если каждый контекст sws создается в отдельном потоке.

Однако при использовании операций avcodec существует механизм обратного вызова, который вы можете использовать, чтобы включить потокобезопасность для вашего шага декодирования (или других операций, связанных с avcodec):

** Обратите внимание, что я использую этот произвольный класс Mutex для иллюстрации:

 int ffmpeg_lock_callback(void **mutex, enum AVLockOp op)
   {
      static Mutex m;

      switch(op)
      {
          case AV_LOCK_CREATE:
          {
              *mutex = &m;
              break;
          }
          case AV_LOCK_OBTAIN:
          {
              // TODO: Lock you mutex here
              break;
          }
          case AV_LOCK_RELEASE:
          {
              // TODO: Unlock your mutex here
              break;
          }
          case AV_LOCK_DESTROY:
          {
              *mutex = 0;
              break;
          }

      }
      return 0;
  }

...

и это входит в ваш файл .h:

extern "C"{
#include "libavcodec/avcodec.h"
}

extern "C"
{
    int ffmpeg_lock_callback(void **mutex, enum AVLockOp op);
}
person Aki    schedule 23.04.2013
comment
Да, я должен сказать, что ты прав. У меня сложилось впечатление, что это также используется при создании sws_context; но я только что проверил исходный код ffmpeg, и это не похоже на правду. Я изменю свой ответ, чтобы отразить это. - person Aki; 25.04.2013
comment
Примечание: это устарело и больше не требуется в более новых версиях ffmpeg (при компиляции с учетом потоков). Тем временем ffmpeg_lock_callback устарел и ничего не делает. - person user2328447; 23.05.2018