จะใช้ 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