[Libav-user] FFMPEG decoding H264 and Multithreading

Jérôme SALAYET jerome.salayet at hymatom.fr
Mon Feb 11 09:54:37 CET 2013


Hello,

In fact, in can't  do test with Multithreading enable because I still have the message « The maximum value for lowres supported by the decoder is 0 », and I don't understand why (even if I set thread_count to 1).

 

If someone could tell me if there's a mistake in my code, thanks a lot...

Reagrds,

 

Part of my class code (one class used by decompression):

 

Define the lockmgr callback function:

 

static int ff_lockmgr(void **mutex, enum AVLockOp op)

// Callback 

{ if (NULL == mutex)

    return -1;

  

  CRITICAL_SECTION **cSec = (CRITICAL_SECTION **)mutex;

  

  switch (op) 

   { case AV_LOCK_CREATE:

      { *cSec = NULL;

        *cSec = new CRITICAL_SECTION();

        if (*cSec == NULL) return 1;

        InitializeCriticalSection(*cSec);

        return 0;

      }  

     case AV_LOCK_OBTAIN:

      { if (*cSec == NULL) return 1;

        EnterCriticalSection(*cSec);

        return 0;

      } 

     case AV_LOCK_RELEASE:

      { if (*cSec == NULL) return 1;

        LeaveCriticalSection(*cSec);

        return 0;

      }  

     case AV_LOCK_DESTROY:

      { if (*cSec == NULL) return 1;

        DeleteCriticalSection(*cSec);

        delete *cSec;

        *cSec = NULL;

        return 0;

      }

   }

  return 0;

}

 

At the class constructor :

Just call once using a global check value :

 

av_register_all();

av_lockmgr_register(ff_lockmgr);

 

decoding part (call each once per frame):

 

if (m_lpCodecCtx ==NULL) 

 { m_lpCodecCtx = avcodec_alloc_context3(NULL);

   avcodec_get_context_defaults(m_lpCodecCtx);

}

// Init CodecContext

if (m_lpCodecCtx->width == 0)

{ m_lpCodecCtx->pix_fmt            = AV_PIX_FMT_YUV420P;

   m_lpCodecCtx->codec_type         = AVMEDIA_TYPE_VIDEO;

   m_lpCodecCtx->codec_id           = CODEC_ID_H264;

   m_lpCodecCtx->coded_width        = iImageWidth;  // values I already got from my camera stream

   m_lpCodecCtx->coded_height       = iImageHeight; // values I already got from my camera stream

   m_lpCodecCtx->width              = iImageWidth;

   m_lpCodecCtx->height             = iImageHeight;

 

   if (m_lpCodecCtx->codec_id == AV_CODEC_ID_H264) 

    {  m_lpCodecCtx->thread_count = 1;

       m_lpCodecCtx->thread_type = FF_THREAD_SLICE|FF_THREAD_FRAME;

 

    }

  

if (m_lpCodec==NULL)

{ m_lpCodec = avcodec_find_decoder(m_lpCodecCtx->codec_id);            

   

   if(m_lpCodec->capabilities&CODEC_CAP_TRUNCATED) m_lpCodecCtx->flags|= CODEC_FLAG_TRUNCATED;

 

   avcodec_open2(m_lpCodecCtx,  m_lpCodec, NULL);

   m_lpFrame = lpfnavcodec_alloc_frame();

 

      m_lpFrame->width = m_lpCodecCtx->width;

   m_lpFrame->height = m_lpCodecCtx->height;

}   

 

// Prepare the packet to decode

av_init_packet(&m_lpPacket);

   

// Set the INPUT BUFFER PADDING

if (m_lpFFMPEGBuffer == NULL)

{ m_lpFFMPEGBuffer = new BYTE[MAX_MPEG4VIDEO_FRAMESIZE+FF_INPUT_BUFFER_PADDING_SIZE];

}

if (m_lpFFMPEGBuffer !=NULL)

{ ZeroMemory( m_lpFFMPEGBuffer, MAX_MPEG4VIDEO_FRAMESIZE+FF_INPUT_BUFFER_PADDING_SIZE);

   CopyMemory( m_lpFFMPEGBuffer, lpImageData, dwImageSize);

   // Set the buffer to packet data

   m_lpPacket.data = m_lpFFMPEGBuffer;

   // Set the size to packet size

   m_lpPacket.size = dwImageSize;

}

 

// Decode the frame


   do 


    { iRes = avcodec_decode_video2( m_lpCodecCtx, m_lpFrame, &iFrameFinished, &m_lpPacket);

      if (iRes<0)

       { break;

       }

      if (iRes>0)

       { m_lpPacket.data+=iRes;

         m_lpPacket.size-=iRes;

       }

    }

   while (m_lpPacket.size>0);

      

   if (iFrameFinished)

...

I display my decoded image using swscale

...

   // Free Packet

   av_free_packet(&m_lpPacket);

 

When I finish my decompression work :

 

  // Close the codec context

  avcodec_close(m_lpCodecCtx);

  av_free(m_lpCodecCtx);

  

  avcodec_free_frame(&m_lpFrame);

  

  if (m_lpFFMPEGBuffer != NULL)

   { delete [] m_lpFFMPEGBuffer;

   }

  m_lpFrame         = NULL; 

  m_lpCodec         = NULL;

  m_lpCodecCtx      = NULL;

  m_lpFFMPEGBuffer  = NULL;  

  

 

Jérôme SALAYET
Ingénieur Informatique
Tél :    04 67 87 61 12
Fax :   04 67 70 85 44
Site web : www.hymatom.fr <http://www.hymatom.fr/> 
Email : jerome.salayet at hymatom.fr <mailto:jerome.salayet at hymatom.fr> 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130211/14d919a1/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/png
Size: 7598 bytes
Desc: image003.png
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130211/14d919a1/attachment.png>


More information about the Libav-user mailing list