Hi, On Mar 22, 2012 5:58 PM, "Ronald S. Bultje" <[email protected]> wrote: > On Thu, Mar 22, 2012 at 4:35 PM, Luca Barbato <[email protected]> wrote: > > On 22/03/12 16:16, Ronald S. Bultje wrote: > >> On Fri, Mar 16, 2012 at 4:26 PM, Janne Grunau <[email protected]> wrote: > >>> On 2012-03-16 15:56:05 -0700, Ronald S. Bultje wrote: > >>>> Hi, > >>>> > >>>> On Fri, Mar 16, 2012 at 3:35 PM, Janne Grunau <[email protected]> wrote: > >>>>> if(last && s->current_picture_ptr){ > >>>>> if(r->loop_filter) > >>>>> r->loop_filter(r, s->mb_height - 1); > >>>>> - ff_er_frame_end(s); > >>>>> - ff_MPV_frame_end(s); > >>>>> > >>>>> - if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME)) > >>>>> - ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0); > >>>>> - > >>>>> - if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { > >>>>> - *pict = s->current_picture_ptr->f; > >>>>> - } else if (s->last_picture_ptr != NULL) { > >>>>> - *pict = s->last_picture_ptr->f; > >>>>> - } > >>>>> - > >>>>> - if(s->last_picture_ptr || s->low_delay){ > >>>>> - *data_size = sizeof(AVFrame); > >>>>> - ff_print_debug_info(s, pict); > >>>>> - } > >>>>> - s->current_picture_ptr = NULL; //so we can detect if frame_end wasnt called (find some nicer solution...) > >>>>> + *got_picture_ptr = finish_frame(avctx, pict); > >>>>> } > >>>> > >>>> This will hang if last is not set for some reason, e.g. if > >>>> decode_slice() returned an error. You need to call finish_frame() > >>>> unconditionally. > >>> > >>> last can be not set with slices passed one by one to decode_frame() > >>> It will be marked as finished on the next decode_frame() call with a > >>> first slice. > >> > >> I'm thinking we should just commit this and move on from here, I see > >> tons of crashes in rv34-mt, so it'll take multiple finetuning > >> iterations to get this right. Feel free to commit and let's move on > >> from there. Is that a plan? > >> > > > > Sounds good to me. > > One comment, Janne if you could incorporate the following change: > > diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c > index 720997f..ef75665 100644 > --- a/libavcodec/mpegvideo.c > +++ b/libavcodec/mpegvideo.c > @@ -606,6 +606,8 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, > } > } > > + s->mb_num_left = s1->mb_num_left; > + > return 0; > } > > Otherwise the n_threads'th (instead of the next) thread will "unlock" > the previously not-completely-decoded image, leading to deadlocks all > over the place.
Ignore this, me stupid, but this hang exists and should be resolved, e.g. by caching the old self-thread's current_picture_ptr or so... Ronald
_______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
