<div dir="ltr"><div>I use the following code to open a MP4 file. Each time the MP4 file is opened successfully by calling `QVideoDecoder::openFile(QString filename)`.</div><div><br></div><div>I close the content and release the resources by calling close();</div><div><br></div><div>However, each time I run the `openFile(QString filename)` function on the same file. There are some memory leak. </div><div><br></div><div><br></div><div> What is wrong with my code?</div><div><br></div><div>    void QVideoDecoder::InitVars()</div><div>    {</div><div>    <span class="" style="white-space:pre">   </span>ok = false;</div><div>    <span class="" style="white-space:pre">  </span>pFormatCtx = 0;</div><div>    <span class="" style="white-space:pre">      </span>pCodecCtx = 0;</div><div>    <span class="" style="white-space:pre">       </span>pCodec = 0;</div><div>    <span class="" style="white-space:pre">  </span>pFrame = 0;</div><div>    <span class="" style="white-space:pre">  </span>pFrameRGB = 0;</div><div>    <span class="" style="white-space:pre">       </span>buffer = 0;</div><div>    <span class="" style="white-space:pre">  </span>img_convert_ctx = 0;</div><div>    <span class="" style="white-space:pre"> </span>th = 0;</div><div>    }</div><div>    </div><div>    void QVideoDecoder::close()</div><div>    {</div><div>       if(buffer)</div><div>          delete [] buffer;</div><div>    </div><div>       if(pFrame)</div><div>          av_free(pFrame);</div><div>    </div><div>       if(pFrameRGB)</div><div>          av_free(pFrameRGB);</div><div>    </div><div>       if(pCodecCtx)</div><div>          avcodec_close(pCodecCtx);</div><div>    </div><div>       if(pFormatCtx)</div><div>    <span class="" style="white-space:pre"> </span>   avformat_close_input(&pFormatCtx);</div><div>       </div><div>       if (th)</div><div>    <span class="" style="white-space:pre">        </span>   delete th;</div><div>    </div><div>       InitVars();</div><div>    }</div><div>    </div><div>    bool QVideoDecoder::openFile(QString filename)</div><div>    {</div><div>    <span class="" style="white-space:pre">       </span>// Close the last video first</div><div>    <span class="" style="white-space:pre">        </span>//----------------------------------------------</div><div>    <span class="" style="white-space:pre">     </span>close();</div><div>    </div><div>    <span class="" style="white-space:pre">       </span>ffmpeg::AVInputFormat *iformat = NULL;</div><div><br></div><div>    <span class="" style="white-space:pre">      </span>pFormatCtx = ffmpeg::avformat_alloc_context();</div><div><br></div><div>    <span class="" style="white-space:pre">      </span>avformat_open_input(&pFormatCtx, filename.toStdString().c_str(), iformat, &opts) != 0)</div><div>    <span class="" style="white-space:pre">       </span>av_dict_free(&opts);</div><div>    </div><div><br></div><div>    <span class="" style="white-space:pre">      </span>avformat_find_stream_info(pFormatCtx, NULL);</div><div>    </div><div>    <span class="" style="white-space:pre">   </span>av_dump_format(pFormatCtx, 0, filename.toStdString().c_str(), false);</div><div>    </div><div>    <span class="" style="white-space:pre">  </span>for (unsigned i = 0; i < pFormatCtx->nb_streams; i++)</div><div>    <span class="" style="white-space:pre">  </span>{</div><div>    <span class="" style="white-space:pre">            </span>if (pFormatCtx->streams[i]->codec->codec_type == ffmpeg::AVMEDIA_TYPE_VIDEO)</div><div>    <span class="" style="white-space:pre">                </span>{</div><div>    <span class="" style="white-space:pre">                    </span>videoStream = i;</div><div>    <span class="" style="white-space:pre">                     </span>break;</div><div>    <span class="" style="white-space:pre">               </span>}</div><div>    <span class="" style="white-space:pre">    </span>}</div><div>    </div><div>    <span class="" style="white-space:pre">      </span>pCodecCtx = pFormatCtx->streams[videoStream]->codec;</div><div>    </div><div>    <span class="" style="white-space:pre">     </span>pCodec = avcodec_find_decoder(pCodecCtx->codec_id);</div><div>    </div><div>    <span class="" style="white-space:pre"> </span>pCodecCtx->thread_type = 0;</div><div><br></div><div><span class="" style="white-space:pre">    </span>avcodec_open2(pCodecCtx, pCodec, NULL);</div><div><br></div><div><span class="" style="white-space:pre">   </span>pFrame = ffmpeg::avcodec_alloc_frame();</div><div><br></div><div><span class="" style="white-space:pre">   </span>pFrameRGB = ffmpeg::avcodec_alloc_frame();</div><div><br></div><div><span class="" style="white-space:pre">        </span>numBytes = ffmpeg::avpicture_get_size(ffmpeg::PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);</div><div><span class="" style="white-space:pre">   </span>buffer = new uint8_t[numBytes];</div><div><br></div><div><span class="" style="white-space:pre">   </span>avpicture_fill((ffmpeg::AVPicture *)pFrameRGB, buffer, ffmpeg::PIX_FMT_RGB24,</div><div><span class="" style="white-space:pre">              </span>pCodecCtx->width, pCodecCtx->height);</div><div><br></div><div><span class="" style="white-space:pre">       </span>return true;</div><div>    }</div><div><br></div></div>