That's how I allocate the context.
if ( (avioCxt_buffer = (uint8_t *) av_malloc(4096)) == NULL)            {       
                avformat_close_input(outputFormatCxt);
                        fprintf(stderr, "TranscoderWrapper @%d : failed to 
allocate memory for buffer", __LINE__);                      return 
ERROR(ERR_OUT_MEMORY);           }
                if ( (avioCxt = avio_alloc_context(avioCxt_buffer, 4096, 0, 
&bd, read_packet, NULL, NULL)) == NULL)             {                       
av_free(avioCxt_buffer);                        
avformat_close_input(outputFormatCxt);
                        fprintf(stderr, "TranscoderWrapper @%d : failed to 
allocate memory for context", __LINE__);                     return 
ERROR(ERR_OUT_MEMORY);           }
                // set the manually read data buffer to the context             
avioCxt->seekable = 0;          (*outputFormatCxt)->pb = avioCxt;
                if ( (ret = avformat_open_input(outputFormatCxt, NULL, NULL, 
NULL)) < 0)
then, I deallocate the context.
if (avioCxt)            {                       av_freep(&avioCxt->buffer);     
                av_freep(&avioCxt);             }From: 
[email protected]
Date: Sat, 27 Jun 2015 14:43:23 +0200
To: [email protected]
Subject: Re: [Libav-user] Custom IO strange behavior.

Hi,
It would help if we could see how you allocate the AVIOContext, and your main 
loop.
Le 27 juin 2015 à 11:33, Mohamed Moanis <[email protected]> a écrit :I 
am implementing a custom IO to read data packets then transcode them.The 
problem I have is memory leakage, which I guess is coming from the custom IO 
buffer I allocate to read the data.I am referring to the avio example. I have 
exactly the same callback function.struct buffer_data {    uint8_t *ptr;    
size_t size; ///< size left in the buffer};static int read_packet(void *opaque, 
uint8_t *buf, int buf_size){    struct buffer_data *bd = (struct buffer_data 
*)opaque;    buf_size = FFMIN(buf_size, bd->size);    printf("ptr:%p 
size:%zu\n", bd->ptr, bd->size);    /* copy internal buffer data to buf */    
memcpy(buf, bd->ptr, buf_size);    bd->ptr  += buf_size;    bd->size -= 
buf_size;    return buf_size;}
When I debug my code, the function is called even after the data was all read. 
It is called more than a time with the buffer size is zero and later on the ptr 
itself is null. My question here is why does that happen?
The second question, is how to free the buffer allocated. In my application I 
require reading a JPEG frame from a camera that is considerable in size. What I 
do, is  that I free the AVIOContext and it's buffer just after I call 
avformat_open_input. But I can see the memory usage increasing by an estimate 
of the frame size each run.
Regards.



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

Reply via email to