[Kdenlive-devel] kthumb crash? (was Re: [PATCH mlt] Clear audio and video context to NULL)
jb
jb at kdenlive.org
Tue Oct 25 09:56:49 UTC 2011
On Sunday 23 October 2011 20:58:51 Dan Dennedy wrote:
> On Sun, Oct 23, 2011 at 3:38 PM, jb <jb at kdenlive.org> wrote:
> > Using MLT in debug mode, I discovered several cases where FFmpeg did
> > show a warning about insufficient thread locking around avcodec open /
> > close.
> I have seen these messages before as well, but there are global mutex
> locks around all calls to avcodec_open/close.
>
> > After several of this warnings, the avformat producer became corrupted
> > and unable to load any clip, or simply crashed, which might be the
> > reason for those clips becoming invalid.
> >
> > These problems were caused by concurrent uses of producers in Kdenlive,
> > and also by a "weakness" in the sdl preview consumer that caused such
> > corruption when doing the following steps very fast several times:
> >
> > stop the consumer
> > delete the producer
> > connect a new producer to the consumer
> > start the consumer
> >
> > Looks like when looping, sometimes the consumer was stopped while
> > starting,
> Were you calling consumer.is_stopped() before trying to start it? I do
> not criticize you if you were not; it is not exactly obvious you
> should need to, but I am wondering if that would help.
Making sure that the consumer is stopped before starting it does not change
anything. In fact, the problem is the following:
After starting the consumer, I do:
consumer->set("refresh", 1);
To trigger an update of the display. The avformat corruption happens because
of the "consumer-frame-show" event. After refreshing, the sdl consumer
triggers the event like this:
mlt_events_fire( properties, "consumer-frame-show", frame, NULL );
It sends a frame, but sometimes, when stopping the consumer (and purging it),
that frame is still "alive" somewhere in this event. Then, when we delete its
producer, it causes some of the corruptions I noticed.
The way I currently solved it is to do this just after the call to refresh:
Mlt::Event *ev = consumer->setup_wait_for("consumer-frame-show");
consumer->wait_for(ev);
delete ev;
After that, we can stop the consumer, delete the producer and start a new one
safely.
Somehow, it seems to me that when stopping the consumer (or when purging), all
frames should be closed (including those in the events). Maybe there is a way
in MLT to make this happen that I do not know?
regards
jb
More information about the Kdenlive
mailing list