Hello All:

Just did a test on making the ffmpeg thread safe. You should not have to modify the plugin but here is a cut and past:

extern "C"
{
int ffmpeg_lock_callback(void **mutex, enum AVLockOp op);
}

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

   switch(op)
   {
      case AV_LOCK_CREATE:
      {
         *mutex = &m;
          break;
      }
      case AV_LOCK_OBTAIN:
      {
         ((OpenThreads::Mutex*)(*mutex))->lock();
         break;
      }
      case AV_LOCK_RELEASE:
      {
         ((OpenThreads::Mutex*)(*mutex))->unlock();
        break;
      }
      case AV_LOCK_DESTROY:
      {
        *mutex = 0;
        break;
      }

   }

   return 0;
}


You can then register your function via the avcodec interface call:

av_lockmgr_register(&ffmpeg_lock_callback);


To me this needs to be done at the application level. doing this will automatically allow for thread safe access to parts of libavcodec that need it. ffmpeg calls the callback method and passes the different ops it would like you to do.


you probably could have gotten rid of the type casts and just access the Mutex lock directly.


Take care

Garrett

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to