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

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


On Mon, Jan 23, 2012 at 08:21:19PM +0100, Reimar Döffinger wrote:
> 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);
> +    }

And yes, I obviously forgot a "return" here.


More information about the ffmpeg-devel mailing list