Hi,

No body had/have the same issue ?

Jérémy

Le Thu, 22 Aug 2013 10:44:26 +0200, Jeremy Lugagne <[email protected]> a écrit:

Hello all,
 
I'm using the libav to grab images from a network camera with the rtsp protocol but I have an issue. When I release the stream, my camera don't release resources for the sessions, so when I do 4 tests with my applications I must restart the camera because I have no more slot.
 
This is how I open the stream :
<code>
  AVFormatContext *pFormatCtx;
  AVCodecContext* vCodecCtxp;
  AVPacket packet;
  AVFrame *pFrame;
  AVFrame *pFrameRGB = NULL;
  int numBytes;
  AVDictionary *optionsDict = NULL;
  struct SwsContext *sws_ctx = NULL;
  uint8_t *buffer = NULL;
  AVCodec *videoCodec;
 
  av_register_all();
  avformat_network_init();
  pFormatCtx = avformat_alloc_context();
  if(avformat_open_input(&pFormatCtx, qPrintable(url), NULL, 0)!=0)
     return false; // Couldn't open file
  videoStream=-1;
 
  if(avformat_find_stream_info(pFormatCtx,NULL) < 0){
    return false;
  }
  for(int i=0; i<pFormatCtx->nb_streams; i++) {
    if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO && videoStream < 0) {
      videoStream=i;
    }
  }
  vCodecCtxp = pFormatCtx->streams[videoStream]->codec;
 
  // Allocate an AVFrame structure
  pFrameRGB = avcodec_alloc_frame();
  pFrame = avcodec_alloc_frame();
  if(pFrameRGB==NULL)  return ;
 
  // Determine required buffer size and allocate buffer
  numBytes=avpicture_get_size(PIX_FMT_RGB24, vCodecCtxp->width, vCodecCtxp->height);
  buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
 
  sws_ctx = sws_getContext(vCodecCtxp->width, vCodecCtxp->height, vCodecCtxp->pix_fmt, vCodecCtxp->width, vCodecCtxp->height, PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL );
 
  // Assign appropriate parts of buffer to image planes in pFrameRGB. Note that pFrameRGB is an AVFrame, but AVFrame is a superset of AVPicture
  avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, vCodecCtxp->width, vCodecCtxp->height);
  
  // Assign appropriate parts of buffer to image planes in pFrameRGB. Note that pFrameRGB is an AVFrame, but AVFrame is a superset of AVPicture
  int res = avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, vCodecCtxp->width, vCodecCtxp->height);
  
  videoCodec=avcodec_find_decoder(vCodecCtxp->codec_id);
  avcodec_open2(vCodecCtxp, videoCodec, 0);
 
  av_read_play(pFormatCtx);
</code>
 
And how I close it :
<code>
  av_free(pFrameRGB);
  av_free(buffer);
  av_free(pFrame);
  sws_freeContext(sws_ctx);
  avformat_close_input(&pFormatCtx);
</code>
 
Do i forgetting something to close properly my stream ? Because when I watch what messages are sent to the camera I see the TEARDOWN message.
 
Thanks in advance,
 
Jeremy L.



_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to