[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