av_bitstream_filter_filter memory free

转载 2016年08月31日 09:21:37

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
radnix824
Updated 28-Feb-14 14:55pm
CHill60157.4K
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);

相关文章推荐

最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

最近打算记录一下基于FFmpeg的视音频分离,复用,封装格式转换相关的例子。有关封转格式转换的例子在之前的文章:《最简单的基于FFMPEG的封装格式转换器(无编解码)》中已经有过记录,不再重复。因此计...

遇到的两个ffmpeg库函数的坑

项目中使用ffmpeg库处理视频时掉进了两个内存泄漏的坑。1. av_bitstream_filter_filter下面这种用法,av_bitstream_filter_filter(h264bsfc...

av_bitstream_filter_filter memory free

How may I free pkt in an ffmpeg write frame method Rate this: ...

内存泄漏的问题之av_bitstream_filter_filter

AVPacket new_pkt = pkt; int a = av_bitstream_filter_filter(m_bsfDecoderContext, out_stream->codec, ...

使用FFMPEG类库分离出多媒体文件中的H.264码流

在使用FFMPEG的类库进行编程的过程中,可以直接输出解复用之后的的视频数据码流。只需要在每次调用av_read_frame()之后将得到的视频的AVPacket存为本地文件即可。 经试验,在分离M...

ffmpeg 解复用视频文件

解复用视频文件:就是提取出音频文件和视频文件的ES流数据。而对于aac和h264来说,提取出来的数据直接保存并不能成功的播放,原因就在ffmpeg解出的ES数据比较纯净,没有ADTS头,而很多解码器都...

MP4中提取H.264码流

 1.获取数据 ffmpeg读取mp4中的H264数据,并不能直接得到NALU,文件中也没有储存0x00000001的分隔符。下面这张图为packet.data中的数据 从图中可以发...

关于ffmpeg封装h264为mp4的问题

照着ffmpeg里的例子封装h264为mp4的答题思路是对的,但是,还是要加一些东西才行~ 下面是之前查东西的一些收获:     对于h264文件来说,h264有两种封装,     一种是ann...

使用FFMPEG类库分离出多媒体文件中的H.264码流

在使用FFMPEG的类库进行编程的过程中,可以直接输出解复用之后的的视频数据码流。只需要在每次调用av_read_frame()之后将得到的视频的AVPacket存为本地文件即可。 经试验,在分...

使用FFmpeg将mp4转为ts(代码实现)

使用ffmpeg将mp4转为ts的命令格式如下: 点击(此处)折叠或打开 ffmpeg -i b.mp4 -codec copy -bsf h264_mp4...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:av_bitstream_filter_filter memory free
举报原因:
原因补充:

(最多只允许输入30个字)