[Libav-user] transcoder class instance memory leak.

zikken zikken at xs4all.nl
Fri Nov 23 15:12:10 EET 2018


why should we debug your code?Verzonden vanaf mijn Samsung Galaxy-smartphone.
-------- Oorspronkelijk bericht --------Van: 강구철 <kckang at skycom.ne.kr> Datum: 23-11-18  07:38  (GMT+01:00) Aan: "'This list is about using libavcodec, libavformat, libavutil, libavdevice and libavfilter.'" <libav-user at ffmpeg.org> Onderwerp: [Libav-user] transcoder class instance memory leak. hear is transcoder class src. use it as a instance and  memory leak after delete instance.every resource release and close. what's problem? main transact func is "tcode(opus pkt in, aac pkt out)"class trans{    public:    ///DECLARE     AVCodecContext    *oc;    AVCodecContext    *opus_context;    AVCodecContext    *aac_context;    AVCodecContext    *aac_context2;    AVCodecContext    *input_codec_context;    AVFormatContext   *output_format_context;    const   AVCodec   *opus_codec;    const   AVCodec   *aac_codec;    const   AVCodec   *aac_codec2;    const   AVCodec   *h264_codec;    float AAC_ENCTIME;    int   AAC_SAMPRATE;    int   OPUS_SAMPRATE;    int                OPUSsize;    int                OPUScnt ;    int                AACsize ;    int                AACcnt  ;    AVFrame           *decoded_frame;///opus decode by ffmpeg    AVFrame           *decoded_frame2;///opus decode by ffmpeg    AVFrame           *framebuf;    AVPacket          *pkt1;    AVPacket          *pkt2;    int                data_present;    CUnitInspection   *gen1;    CUnitInspection   *gen2;    AVAudioFifo *fifo;    AVAudioFifo *fifo2;    SwrContext *resample_context;    RTPPaserUtilityLibrary::ConvertStreamAVGranules* _instance;    int len;    string outfile;	int pcmsize;    uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];    char out_buf [2000]; //from file    int  out_size;    uint8_t *data;    size_t data_size;    int ix1;	int channel;    int ret;    int cnt[100];    int init(int a, int b, int c);    trans();    ~trans();    int push_q(AVAudioFifo *fifo,                               uint8_t **converted_input_samples,                               const int frame_size);    int pop_q(AVAudioFifo *_queue, AVFrame* mframe);    int tcode(string *src, string* dst);    int tcode(AVPacket* src, AVPacket* dst);};int   RTP_REASSEMBLE::trans::init(int a, int b, int c){        opus_context->channels = 1;        opus_context->channel_layout = AV_CH_LAYOUT_MONO;        opus_context->sample_rate    = OPUS_SAMPRATE;        opus_context->sample_fmt     = AV_SAMPLE_FMT_FLTP;        opus_context->bit_rate       = OPUS_SAMPRATE;        aac_context->channels = 1;        aac_context->channel_layout = AV_CH_LAYOUT_MONO;        aac_context->sample_rate    = AAC_SAMPRATE;        aac_context->sample_fmt     = AV_SAMPLE_FMT_FLTP;        aac_context->bit_rate       = AAC_SAMPRATE;        fifo = av_audio_fifo_alloc(aac_context->sample_fmt, aac_context->channels, 2048);        aac_context2->channels = 1;        aac_context2->channel_layout = AV_CH_LAYOUT_MONO;        aac_context2->sample_rate    = AAC_SAMPRATE;        aac_context2->sample_fmt     = AV_SAMPLE_FMT_FLTP;        aac_context2->bit_rate       = AAC_SAMPRATE;		return 0;};RTP_REASSEMBLE::trans::trans(){        oc                          = NULL;        opus_context                = NULL;        aac_context                 = NULL;        input_codec_context         = NULL;        output_format_context       = NULL;        OPUSsize                    = 0;        OPUScnt                     = 0;        AACsize                     = 0;        h264_codec                  = NULL;        AACcnt                      = 0;        decoded_frame               = NULL;///opus decode by ffmpeg        decoded_frame2              = NULL;///opus decode by ffmpeg        fifo                        = NULL;        //fifo2                       = NULL;        resample_context            = NULL;        AAC_SAMPRATE=48000;        OPUS_SAMPRATE=48000;        ix1=0;        ret = AVERROR_EXIT;        avcodec_register_all();        h264_codec = avcodec_find_decoder( AV_CODEC_ID_H264 );                  opus_codec = avcodec_find_decoder( AV_CODEC_ID_OPUS );                  aac_codec  = avcodec_find_encoder( AV_CODEC_ID_AAC  );         aac_codec2 = avcodec_find_decoder( AV_CODEC_ID_AAC  );// ENCODER         //aac_codec  = avcodec_find_encoder( V_CODEC_ID_AAC_LATM  );         framebuf = av_frame_alloc();        if(framebuf==NULL) cout << "frame alloc fail."<<endl;        _instance = new RTPPaserUtilityLibrary::ConvertStreamAVGranules();        pkt1 = av_packet_alloc();        pkt2 = av_packet_alloc();        if (!h264_codec) {            cout << "H264 Codec not found"<<endl;            return;		}		else cout << "H264 codec found."<<endl;        if(framebuf==NULL) cout << "frame alloc fail."<<endl;/*        gen1 = new CUnitInspection();        gen2 = new CUnitInspection();        gen1-> ifile = "opus.rtp";        gen1->_begin();        gen2-> ifile = "264.rtp";        gen2->_begin();*/        if (!opus_codec) {            cout << "opus Codec not found"<<endl;            return;        }		else cout << "OPUS codec found."<<endl;        opus_context   = avcodec_alloc_context3( opus_codec );        //_instance->init_fifo(&fifo, opus_context);        if (!opus_context) {            cout << "Could not allocate audio opus_codec context OPUS"<<endl;            return;        }        outfile = "raw.mp4";        if (!aac_codec) {            cout << "AAC Codec not found"<<endl;            return;        }		else cout << "AAC codec found."<<endl;        aac_context = avcodec_alloc_context3(aac_codec);        //_instance->init_fifo(&fifo2, aac_context);        if (!aac_context) {            cout << "Could not allocate audio codec context AAC"<<endl;            return;        }        aac_context2 = avcodec_alloc_context3(aac_codec2);        init(1,2,3);        if (avcodec_open2(opus_context, opus_codec, NULL) < 0) {            cout << "Could not open codec opus"<<endl;            return;        }        if (avcodec_open2(aac_context, aac_codec, NULL) < 0) {            cout << "Could not open codec aac"<<endl;            return;        }        if (avcodec_open2(aac_context2, aac_codec2, NULL) < 0) {            cout << "Could not open codec aac2"<<endl;            return;        }        if (!decoded_frame)         {            cout << "Got a decoded_frame"<<endl;            if (!(decoded_frame = av_frame_alloc())) {                cout << "Could not allocate audio frame"<<endl;                return;            }        }else{		    cout << "nodata decoded_frame"<<endl;		}        if (!decoded_frame2)         {            cout << "Got a decoded_frame2"<<endl;            if (!(decoded_frame2 = av_frame_alloc())) {                cout << "Could not allocate audio frame"<<endl;                return;            }        }else{		    cout << "nodata decoded_frame2"<<endl;		}}RTP_REASSEMBLE::trans::~trans(){OsSysLog::add(FAC_PROCESS, PRI_INFO, "%s:%d:FREE FIFO************************* ",__FILE__,__LINE__);   //     delete gen1; //		delete gen2;        av_free_packet(pkt1);        av_free_packet(pkt2);		av_frame_free(&decoded_frame);		av_frame_free(&decoded_frame2);        av_audio_fifo_free(fifo);        //av_audio_fifo_free(fifo2);        delete _instance;}/** Add converted input audio samples to the FIFO buffer for later processing. */int RTP_REASSEMBLE::trans::push_q(AVAudioFifo *fifo,                               uint8_t **converted_input_samples,                               const int frame_size){    int error;    /**     * Make the FIFO as large as it needs to be to hold both,     * the old and the new samples.     */    //OsSysLog::add(FAC_PROCESS, PRI_INFO, "%s:%d:*************************PUSH called fifo:0x%x, data:0x%x, frame_size:%d",__FILE__,__LINE__,(int64_t)fifo, (void*)**converted_input_samples, frame_size);      if ((error = av_audio_fifo_realloc(fifo, av_audio_fifo_size(fifo) + frame_size)) < 0) {        return error;    }    /** Store the new samples in the FIFO buffer. */    if (av_audio_fifo_write(fifo, (void **)converted_input_samples, frame_size) < frame_size) {        return AVERROR_EXIT;    }        //OsSysLog::add(FAC_PROCESS, PRI_INFO, "%s:%d:*************************OK PUSH:%d tot:%d", __FILE__, __LINE__, frame_size, av_audio_fifo_size(fifo));    return 1;}int RTP_REASSEMBLE::trans::pop_q(AVAudioFifo *_fifo, AVFrame* mframe){    int ret;	if(	av_audio_fifo_size (_fifo) >= 1024)    {		void* ptr;		ptr = * mframe->data;        ret = av_audio_fifo_read(_fifo, (void**)mframe->data, 1024);//@#@#		mframe->nb_samples = ret;        return ret;	}	else 	{        //OsSysLog::add(FAC_PROCESS, PRI_INFO, "%s:%d:*Not enough data  popup ret:%d tot:%d",__FILE__,__LINE__, ret, av_audio_fifo_size(_fifo));        return 0;    }}int RTP_REASSEMBLE::trans::tcode(AVPacket* src, AVPacket* dst){//return -1;//KKC 8888	AACContext *ac = (AACContext*)aac_context->priv_data;    /*    static int aac_decode_er_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, GetBitContext *gb)    {        AACContext *ac = avctx->priv_data;        const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;        ChannelElement *che;        int err, i;        int samples = m4ac->frame_length_short ? 960 : 1024;        int chan_config = m4ac->chan_config;        int aot = m4ac->object_type;         if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD)            samples >>= 1;    }*/        MPEG4AudioConfig *m4ac = &(ac->oc[0].m4ac);    m4ac->frame_length_short = 1;//1:960, 0:1024   int ret;   FILE *f, *outfile;   int data_size;   data_size = av_get_bytes_per_sample(opus_context->sample_fmt);   if (src->size){       data_present = 0;       //decoded_frame->linesize[0]=1024*4;       //decoded_frame->linesize[1]=1024*4;       //opus_context->frame_size=960;//TESTTEST       //decoded_frame->data[0] = (uint8_t*)av_malloc(4*1024);//TESTTEST	   if(decoded_frame2->data[0]!=NULL)	   av_free(decoded_frame2->data[0]);       decoded_frame2->data[0] = (uint8_t*)av_malloc(4*1024);//@#@#	   ret = avcodec_decode_audio4(opus_context, decoded_frame,  &data_present, src);       if(ret<0) 	   {           //OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d DECODE Error  ======%d", __FILE__, __LINE__,ret);	       return ret;	   }#ifdef _NOUSE	   else	   {           if(data_present){               if(channel%2)//7777                   outfile = fopen("/temp/abc1.wav", "a");	           else                   outfile = fopen("/temp/abc2.wav", "a");           if (!outfile) {               OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d abc.wav open  Error  ======", __FILE__, __LINE__);		       //return 0;           }   	       //av_freep(&decoded_frame);//TESTTEST           unsigned char cbuf[4]={0,0,0,0};//GEN WAVE------------------;           unsigned char *pbuf;           cbuf[0]=0xf2;           cbuf[1]=0xdb;           cbuf[2]=0x0;           cbuf[3]=0x3f;           //decoded_frame->data[0] = (uint8_t*)av_malloc(4*1024);//BLANK 1024           //if(1) decoded_frame->nb_samples =  960;//good for mp4	       //else  decoded_frame->nb_samples = 1024;//good for wav space		              pbuf = decoded_frame->data[0];#ifdef _NOUSE           for(int i=960; i<1024 ; i++){//             OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d i:%d ======", __FILE__, __LINE__, i*4+3);	           pbuf[i*4+0] =  cbuf[0];  //float	           pbuf[i*4+1] =  cbuf[1];  //float	           pbuf[i*4+2] =  cbuf[2];  //float	           pbuf[i*4+3] =  cbuf[3];  //float	    	   cbuf[2]     += 2;        //mod wav   to 0~96		       if(cbuf[2] >= 96) cbuf[2]=0; //mod reset to 0	       }//END OF GENWAVE---------------------------------------------------------#endif           fwrite(decoded_frame->data[0] , decoded_frame->nb_samples*data_size, 1, outfile);//opus_context->channels*	       fclose(outfile);	//OsSysLog::add(FAC_PROCESS,PRI_INFO,"LN:%d Ddata_present=%d OPUS DECODE Success  === duration:%d ret(size):%d linesize:%d nbsampels:%d",  __LINE__, data_present, decoded_frame->pkt_duration, ret,decoded_frame->linesize,decoded_frame->nb_samples);        }//data present growes up and cut off it.    }#endif		   //#ifdef _VIDEODUMP// test file write//OsSysLog::add(FAC_PROCESS, PRI_INFO, "BAAAAAAAAAAAAAAAAAAAAA ch=%d,samp=%d, fmt=%d, data_size=%d ch=%d chLayout=%ld frame_size=%d\n", \    opus_context->channels, decoded_frame->nb_samples, opus_context->sample_fmt, data_size, opus_context->channels, opus_context->channel_layout,opus_context->frame_size);    OPUSsize += decoded_frame->nb_samples * opus_context->channels * data_size;//OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d RAW PCMsize= %d, opusCNT= %d decodeRAW:%d", __FILE__, __LINE__, OPUSsize, OPUScnt++, decoded_frame->nb_samples);//#endif	    av_init_packet(dst);	dst->data = NULL;//IMPORTANT for dynamic reallocate surface    dst->size = 0;ret = -1;    ///////////////////////////////////////////////////////////////////////////////	    //int push_q(AVAudioFifo *fifo, uint8_t **converted_input_samples, const int frame_size);    //int pop_q(AVAudioFifo *fifo,  AVFrame* mframe);    /////////////////////////////////////////////////////////////////////////////    uint8_t* ptr;    //ptr = 	    push_q(fifo, decoded_frame->data, decoded_frame->nb_samples);//PUSH 	decoded_frame2->nb_samples = 1024;    ret = pop_q (fifo, decoded_frame2);            //POP         //decoded_frame->nb_samples = 1024;    //aac_context->frame_size   = 960;    aac_context->frame_size   = 1024;    //OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d AAC ENCODE try decodedframeSize:%d aacctxFramesieze:%d======frameLnShort:%d privdataSIZE:0x%x", __FILE__, __LINE__, decoded_frame2->nb_samples, aac_context->frame_size, m4ac->frame_length_short,aac_context->priv_data);	if(ret>0){// pop ok (que hav sample over 1024)        ret = avcodec_encode_audio2(aac_context, dst, decoded_frame2, &data_present);//@#@#AAC ENCODING#ifdef _AAC_ENCODE_RESULT_PRINT        if(ret != 0)         {           OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d AAC ENCODE Error  OK  ret:%d ======", __FILE__, __LINE__, ret);        }else{           OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d AAC ENCODE OK size is %d AACcnt:%d AACsize:%d aacctxFramesize:%d======", __FILE__, __LINE__,                     dst->size, AACcnt, AACsize,aac_context->frame_size);           AACsize += (int)(dst->size);           if(pkt2->size != 0)               AACcnt++;        }#endif	}}#ifdef _DECODE_VERIFY_AAC    ret = avcodec_decode_audio4(aac_context2, decoded_frame, &data_present, dst);    //if(ret<1) OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d AAC REDECODE Error ======%d", __FILE__, __LINE__,ret);#endif#ifdef _DUMP_REDECODE    if(ret<0)     {        OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d AAC REDECODE Error  ======%d", __FILE__, __LINE__,ret);        //return ret;	}else{        if(data_present){            //OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d AAC REDECODE   ====%d frsize:%d", __FILE__, __LINE__,ret, decoded_frame->nb_samples);            if(channel%2)//7777                outfile = fopen("/temp/aac1.wav", "a+");            else                outfile = fopen("/temp/aac2.wav", "a+");                if (!outfile) {                OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d aac.wav open  Error  ======", __FILE__, __LINE__);                return 0;            }            fwrite(decoded_frame->data[0] , /*decoded_frame->nb_samples * opus_context->channels */1024 * data_size, 1, outfile);//opus_context->channels*	        fclose(outfile);	OsSysLog::add(FAC_PROCESS,PRI_INFO,"LN:%d Ddata_present=%d DECODE Success  === duration:%d ret(size):%d linesize:%d nbsampels:%d",  __LINE__, data_present, decoded_frame->pkt_duration, ret,decoded_frame->linesize,decoded_frame->nb_samples);       }	   else{           OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d DECODE no presents data!!  ======", __FILE__, __LINE__);	       return ret;       }   }#endif        return 0;}int RTP_REASSEMBLE::trans::tcode(string *src, string* dst){	if(pkt1 == NULL)	{        OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d Error  pkt1 NULL====data_size[%d]======", __FILE__, __LINE__, src->length());		init(1,2,3);	}    // COPY NEED , dont use STRING		pkt1->data = (uint8_t*)src->c_str();    pkt1->size = src->length();//solve source packet of opus sound encoded data    //memcpy(pkt1->data, src->c_str(), src->length());	tcode(pkt1,pkt2);	if(pkt2 == NULL)	{        OsSysLog::add(FAC_PROCESS,PRI_INFO,"%s:%d Error pkt2 NUL======data22_size[%d]=====", __FILE__, __LINE__, dst->length());		init(1,2,3);	}    dst->assign((uint8_t&)pkt2->data, pkt2->size);//build dst	if(pkt2->size==0){        OsSysLog::add(FAC_PROCESS,PRI_INFO,    "%s:%d Error====data2_size zero[%d:%d]=======", __FILE__, __LINE__, src->length(), dst->length());	}    return 1;// protection code }_______________________________________________Libav-user mailing listLibav-user at ffmpeg.orghttp://ffmpeg.org/mailman/listinfo/libav-user
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20181123/82f2ae7d/attachment.html>


More information about the Libav-user mailing list