[FFmpeg-devel] Threading issue with avcodec_decode_video2 ?
Don Moir
donmoir at comcast.net
Mon Oct 29 22:22:06 CET 2012
>> Don Moir <donmoir <at> comcast.net> writes:
>>
>>>> Forgot to mention that abort seemed to be called as one
>>>> of the spurious crashes I was seeing before lock was in
>>>> place.
>>> As you know, we consider crashes important, so if you
>>> have a sample that crashes current FFmpeg (no matter if
>>> with abort() or differently), please either open a ticket
>>> on trac or send a mail to ffmpeg-user.
>
>> All crashes related to the issue in this email had to do with unsafe thread issue as detailed in email which can create spurious
>> and seemingly unrelated crashes. It's not going to be reproducible with ffmpeg command line since its a multi-threaded issue.
>
>> Would be great if this could be addressed right away and will do what I can. We probably just need confirmation from Michael or
>> Hendrik or whoever that it's ok to move the mentioned failing code into the init procedure. Also, whatever else this might effect
>> and whatever else might be doing the same thing.
>patch for this is welcome
Yeah would love to supply a patch, but just not patch savvy and seems I never have to time to get that way.
I looked around for what code calls ff_msmpeg4_decode_init and ff_vc1_decode_init_alloc_tables.
Within avcodec both are called in only 2 places.
In mss2.c they are called in wmv9_init and as we know in vc1_dec.c they are called in vc1_decode_frame.
In wmv2dec.c only ff_msmpeg4_decode_init is called in its wmv2_decode_init function. ff_vc1_decode_init_alloc_tables is not called
from code in wmv2dec.c directly.
vc1dec.c is the odd man out here and doesn't call these functions in its vc1_decode_init function and there are threading issues
because of it.
In vc1dec.c there is a little more to it but not much.
if (!s->context_initialized) {
if (ff_msmpeg4_decode_init(avctx) < 0 || ff_vc1_decode_init_alloc_tables(v) < 0)
return -1;
s->low_delay = !avctx->has_b_frames || v->res_sprite;
if (v->profile == PROFILE_ADVANCED) {
s->h_edge_pos = avctx->coded_width;
s->v_edge_pos = avctx->coded_height;
}
}
In mss2.c and wm2dec.c they just call init functions or function and thats it.
In vc1dec.c it calls the init functions and does a little more. The code under return -1; appears to be ok and seems to be happy in
either vc1_decode_init or vc1_decode_frame, but "if (ff_msmpeg4_decode_init(avctx) < 0 || ff_vc1_decode_init_alloc_tables(v) < 0)"
only seems to be happy in vc1_decode_init or when locked down.
Do you have a multi-threaded test case for this kind of thing ?
More information about the ffmpeg-devel
mailing list