av_bitstream_filter_filter memory free

How may I free pkt in an ffmpeg write frame method

Rate this:
  
 
See more: C++ ffmpeg
Greetings
I'm looking at an ffmpeg source code example at : http://svn.perian.org/ffmpeg/ffmpeg.c[ ^]

In the code, I'm focusing on a method that writes the video frame.

Here is that method:

static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
    int ret;
 
    while(bsfc){
        AVPacket new_pkt= *pkt;
        int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
                                          &new_pkt.data, &new_pkt.size,
                                          pkt->data, pkt->size,
                                          pkt->flags & AV_PKT_FLAG_KEY);
        if(a>0){
            av_free_packet(pkt);
            new_pkt.destruct= av_destruct_packet;
        } else if(a<0){
            fprintf(stderr, "%s failed for stream %d, codec %s",
                    bsfc->filter->name, pkt->stream_index,
                    avctx->codec ? avctx->codec->name : "copy");
            print_error("", a);
            if (exit_on_error)
                exit_program(1);
        }
        *pkt= new_pkt;
 
        bsfc= bsfc->next;
    }
 
    ret= av_interleaved_write_frame(s, pkt);
    if(ret < 0){
        print_error("av_interleaved_write_frame()", ret);
        exit_program(1);
    }
}

If I test the code as is, I get a crash at the write " ret= av_interleaved_write_frame(s, pkt);"

But if I comment our the // av_free_packet(pkt);

It works fine, and here is the problem, until after a while, memory grows very very large.
I suspect it's because I've commented out the  av_free_packet(pkt)

Any ideas as to why I crash with the original code (with av_free_packet(pkt))?
Posted 28-Feb-14 12:33pm
radnix 824
Updated 28-Feb-14 14:55pm
CHill60 157.4K
v2
Comments
The_Inventor   2-Mar-14 7:51am
   
You need to write one frame at a time. Also you are freeing a pointer to what it is that you are trying to write before you write it. Thus it crashes. If you don't free it at all you then keep allocating more and more RAM instead of writing to HDD file, and freeing memory for next frame.
radnix   4-Mar-14 18:08pm
   
Thanks ! yes, you've got me thinking.....:)

2 solutions

Rate this: bad
  
good  

Solution 1

Well, I did finally get it working and will post my particular solution here with the hope it may help others. Oh, almost forgot. If you have a suggestion for change to this code, please do:

static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
    int ret;
 
    while(bsfc){
        AVPacket new_pkt= *pkt;
        int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
                                          &new_pkt.data, &new_pkt.size,
                                          pkt->data, pkt->size,
                                          pkt->flags & AV_PKT_FLAG_KEY);
        if(a>0){
            //av_free_packet(pkt);//-comment this out

                  if (new_pkt.data != pkt->data)//-added this
                  {
                    av_free_packet(pkt);
 
                    pkt->data = new_pkt.data;
                    pkt->size = new_pkt.size;
 
                    pkt->destruct = av_destruct_packet;
                  }

 

            new_pkt.destruct= av_destruct_packet;
        } else if(a&lt;0){
            fprintf(stderr, &quot;%s failed for stream %d, codec %s&quot;,
                    bsfc-&gt;filter-&gt;name, pkt-&gt;stream_index,
                    avctx-&gt;codec ? avctx-&gt;codec-&gt;name : &quot;copy&quot;);
            print_error(&quot;&quot;, a);
            if (exit_on_error)
                exit_program(1);
        }
       <b>// *pkt= new_pkt;//-comment this out</b>

        bsfc= bsfc-&gt;next;
    }
 
    ret= av_interleaved_write_frame(s, pkt);
 
    av_free_packet(pkt);//-added here

    av_bitstream_filter_close(bsfc);//-added here

 

    if(ret &lt; 0){
        print_error(&quot;av_interleaved_write_frame()&quot;, ret);
        exit_program(1);
    }
}</pre>
   Permalink  
Comments
The_Inventor   5-Mar-14 6:51am
   
Looks better. Just remember in a function like this, you need to use your 'dummy' variables correctly. The dummy receives the info, the function operates on the dummy, when the dummy is happy it spits it back in the format you wanted.
radnix   5-Mar-14 18:17pm
   
Excellent analysis and a pretty good step ahead for future application. The original code is from ffmpeg.c .
Rate this: bad
  
good  

Solution 2

AVPacket new_pkt = pkt;
int a = av_bitstream_filter_filter(m_bsfDecoderContext, out_stream->codec,
	NULL,
	&new_pkt.data,
				&new_pkt.size,
				pkt.data,
				pkt.size,
				pkt.flags & AV_PKT_FLAG_KEY);
 
			av_free_packet(&pkt);
			pkt.data = new_pkt.data;
			pkt.size = new_pkt.size;
 
			if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0)break;
			av_free(new_pkt.data);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值