On 6 November 2014 22:55, Michael Niedermayer <michae...@gmx.at> wrote:
> On Thu, Nov 06, 2014 at 09:27:45PM +0100, Lukasz Marek wrote: > > On 06.11.2014 01:32, Michael Niedermayer wrote: > > >On Thu, Nov 06, 2014 at 12:59:45AM +0100, Lukasz Marek wrote: > > >>new_output_stream creates a codec context with arbitraty picked codec. > > >>Later data is updated, but priv_data are left alone. > > >>There is a bit chance there is a mismatch between codecs. > > >> > > >>Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com> > > >>--- > > >> ffmpeg_opt.c | 16 ++++++++++++++++ > > >> libavformat/ffmdec.c | 6 ++++-- > > >> 2 files changed, 20 insertions(+), 2 deletions(-) > > > > > >with this fate-lavf-ffm crashes > > > > > >==10836== Invalid write of size 8 > > >==10836== at 0x935442: decode_init (mpegaudiodec_template.c:419) > > >==10836== by 0xA69226: avcodec_open2 (utils.c:1614) > > >==10836== by 0x64CC5F: avformat_find_stream_info (utils.c:3053) > > >==10836== by 0x41C2D7: open_input_file (ffmpeg_opt.c:886) > > >==10836== by 0x42427A: open_files (ffmpeg_opt.c:2699) > > >==10836== by 0x4243F8: ffmpeg_parse_options (ffmpeg_opt.c:2736) > > >==10836== by 0x43762E: main (ffmpeg.c:3861) > > >==10836== Address 0x10f072b0 is not stack'd, malloc'd or (recently) > free'd > > >==10836== > > >==10836== Invalid write of size 8 > > >==10836== at 0xDC67D0: avpriv_float_dsp_init (float_dsp.c:120) > > >==10836== by 0x93546B: decode_init (mpegaudiodec_template.c:421) > > >==10836== by 0xA69226: avcodec_open2 (utils.c:1614) > > >==10836== by 0x64CC5F: avformat_find_stream_info (utils.c:3053) > > >==10836== by 0x41C2D7: open_input_file (ffmpeg_opt.c:886) > > >==10836== by 0x42427A: open_files (ffmpeg_opt.c:2699) > > >==10836== by 0x4243F8: ffmpeg_parse_options (ffmpeg_opt.c:2736) > > >==10836== by 0x43762E: main (ffmpeg.c:3861) > > >==10836== Address 0x10f072e8 is not stack'd, malloc'd or (recently) > free'd > > >and pages more > > > > I tried to debug it, but there is too much code to read to handle > > one very specific case and I'm not sure there is other, better > > solution. > > > Probably, I haven't check, clear solution would be to clear > > priv_data in read_ffserver_streams right after copy_context, and set > > it to NULL, but I will need private data soon to support it in > > ffserver. > > Maybe iam missing something but why does the ffm demuxer attempt to > setup a encoder instead of exporting the "recommanded" encoder > settings as name-value pairs (possibly in metadata) and ffmpeg then > sets up the encoder streams based on that instead of copying > contexts > Probably you are not mistaken. After sending I had second thoughts, probably it would be better to do one of the followings: - add option to muxer instead to control context should be read/write from file (now is always written) - export parsing function that is major part of read_header so ffmpeg can pass its own context and params will be read. This has disadvantage that ffmpeg would need ffm's private header. Already present in ffserver though. - your solution > Trying to set the encoder contexts up in a demuxer (which normally > would interface to decoders not encoders) seems odd to me > Though of course this is how it was designed before the patch already > Yes, but maybe its time to clean hack and not to add new one. In new patch I just clear possibly incorrect priv_data. I will come back to during the weekend when I want to finish private options handling in ffserver
From 9d3188dd3fadfad47ef4cbe2073604d4cd7ebdc2 Mon Sep 17 00:00:00 2001 From: Lukasz Marek <lukasz.m.lu...@gmail.com> Date: Fri, 7 Nov 2014 09:05:41 +0100 Subject: [PATCH] ffmpeg_opt: free incorrect priv_data for feed stream new_output_stream creates a codec context with arbitraty picked codec. Later data is updated, but priv_data are left alone. There is a bit chance there is a mismatch between codecs. Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com> --- ffmpeg_opt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 1757dcc..454da98 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -1649,6 +1649,10 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy) choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt); avcodec_copy_context(ost->enc_ctx, st->codec); + if (ost->enc_ctx->priv_data) { + av_opt_free(ost->enc_ctx->priv_data); + av_freep(&ost->enc_ctx->priv_data); + } } avformat_close_input(&ic); -- 1.9.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel