2013-04-22 4 views
1

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

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

ответ

3

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

0

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

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

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

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); 
} 
+0

вряд ли применим к swscale, менеджер блокировок - вещь avcodec –

+0

Да, я должен сказать, что вы правы. У меня создалось впечатление, что это также используется при создании sws_context; но я только что проверил исходный код ffmpeg, и это не похоже на правду. Я изменю свой ответ, чтобы это отразить. – Aki