[FFmpeg-devel] [PATCH] pthreads: Generic progress lubrication support.

Reimar Döffinger Reimar.Doeffinger at gmx.de
Mon Jan 23 20:21:19 CET 2012


On Mon, Jan 23, 2012 at 04:00:11PM +0100, Michael Niedermayer wrote:
> On Mon, Jan 23, 2012 at 08:58:05AM +0100, Reimar Döffinger wrote:
> > 
> > 
> > On 23 Jan 2012, at 07:08, Michael Niedermayer <michaelni at gmx.at> wrote:
> > 
> > > Fixes bug118, bug120 and bug125 at least
> > > 
> > > Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> > > ---
> > > libavcodec/pthread.c |    7 +++++++
> > > 1 files changed, 7 insertions(+), 0 deletions(-)
> > > 
> > > diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
> > > index 070dbff..6ae763d 100644
> > > --- a/libavcodec/pthread.c
> > > +++ b/libavcodec/pthread.c
> > > @@ -366,6 +366,7 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
> > >     AVCodec *codec = avctx->codec;
> > > 
> > >     while (1) {
> > > +        int i;
> > >         if (p->state == STATE_INPUT_READY && !fctx->die) {
> > >             pthread_mutex_lock(&p->mutex);
> > >             while (p->state == STATE_INPUT_READY && !fctx->die)
> > > @@ -388,6 +389,12 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
> > >         p->state = STATE_INPUT_READY;
> > > 
> > >         pthread_mutex_lock(&p->progress_mutex);
> > > +        for (i = 0; i < MAX_BUFFERS; i++)
> > > +            if (p->progress_used[i]) {
> > > +                p->progress[i][0] = INT_MAX;
> > > +                p->progress[i][1] = INT_MAX;
> > > +            }
> > > +        pthread_cond_broadcast(&p->progress_cond);
> > 
> > I think this should add a loud warning when encountering these values since IMO it indicates a bug in the decoder.
> 
> Iam not sure how to detect that the progress was increased from the
> max the decoder would normally set because the code doesnt know the
> max.
> And it seems overkill to add code for exporting the max just for the
> warning IMHO
> but ideas are welcome ..

--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -391,8 +391,10 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
         pthread_mutex_lock(&p->progress_mutex);
         for (i = 0; i < MAX_BUFFERS; i++)
             if (p->progress_used[i]) {
-                p->progress[i][0] = INT_MAX;
-                p->progress[i][1] = INT_MAX;
+                if (p->progress[i][0] < INT_MAX - 1)
+                    p->progress[i][0] = -p->progress[i][0] - 3;
+                if (p->progress[i][1] < INT_MAX - 1)
+                    p->progress[i][1] = -p->progress[i][1] - 3;
             }
         pthread_cond_broadcast(&p->progress_cond);
         pthread_cond_signal(&p->output_cond);
@@ -697,6 +699,12 @@ void ff_thread_await_progress(AVFrame *f, int n, int field)
     int *progress = f->thread_opaque;
 
     if (!progress || progress[field] >= n) return;
+    if (progress[field] < -1) {
+        int max = -(progress[field] + 3);
+        if (max < n)
+            av_log(f->owner, AV_LOG_ERROR, "thread awaiting %d field %d from %d"
+                   "which will never be reached (max %d)\n", n, field, progress, max);
+    }
 
     p = f->owner->thread_opaque;
 



More information about the ffmpeg-devel mailing list