2013-04-22 2 views
1

sws_scale을 기반으로하는 색 공간 변환 기능이 있습니다. 응용 프로그램의 수명 동안 여러 스레드에서 호출됩니다. 그러나 thread-safe sws_scale이 어떻게 작동하는지 그리고 그것의 문서에 언급되어 있는지 찾지 못했습니다.여러 스레드에서 ffmpeg의 sws_scale을 사용하는 방법은 무엇입니까?

이 매개 변수는 공유되기 때문에 각 스레드마다 자체적으로 SwsContext이 필요하다고 가정하지만 내부 충돌이 발생하지 않을 정도로 충분합니까?

답변

3

각 스레드가 자신의 SwsContext 값을 가지고있는 한 안전해야합니다. libswscale 소스를 간략하게 살펴보면 전역 변수를 사용하지 않는다는 것을 알 수 있습니다.

0

일반적으로 ffmpeg는 기본적으로 스레드로부터 안전하지 않습니다. 그러나 libswsscale은 각 sws 컨텍스트가 별도의 스레드에서 작성되는 한 안전합니다.

** 나는이 임의의 뮤텍스를 사용하는 것이 주 : avcodec 작업을 사용하는 경우

그러나, 당신이 당신의 디코딩 단계 (또는 다른 avcodec 관련 작업을) 스레드 safefy 수 있도록 에 사용할 수있는 콜백 메커니즘이 설명을 위해 클래스 :

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

관련 문제