[Libav-user] Close a RTSP stream

Jérémy Lugagne j.lugagne at spikenet-technology.com
Tue Sep 3 21:32:02 CEST 2013


Hi,

No body had/have the same issue ?

Jérémy

Le Thu, 22 Aug 2013 10:44:26 +0200, Jeremy Lugagne  
<j.lugagne at spikenet-technology.com> 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130903/49add4ea/attachment.html>


More information about the Libav-user mailing list