On Nov 10, 2011, at 4:02 PM, Janne Grunau wrote:

> this fixes fate-iv8-demux with two threads

Seems worthwhile.

I added this to avoid mplayer/vlc having to make code changes (their a/v sync 
is somewhat based on guesswork…), so if you apply this they'll need to change.

> ---8<---
> Adding the thread count in frame level multithreading to has_b_frames
> as an additional delay causes more problems than it solves.
> For example inconsistent behaviour during timestamp calculation in
> libavformat.
> Thread count and frame level multithreading are both set by the user.

Auto thread count would make this not true of course.

> If the additional delay caused by frame level multithreading needs
> to be considered in the calling code it has all information to take
> it into account.
> Should it become necessary to calculate a maximum delay inside
> libavcodec it should be exported as its own field and not reusing
> an existing field.
> 
> Based on a patch by Michael Niedermayer.
> ---
> libavcodec/pthread.c |    4 +---
> libavcodec/version.h |    2 +-
> libavformat/utils.c  |    5 -----
> 3 files changed, 2 insertions(+), 9 deletions(-)
> 
> diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
> index 7557e68..8fd2eba 100644
> --- a/libavcodec/pthread.c
> +++ b/libavcodec/pthread.c
> @@ -362,8 +362,7 @@ static int update_context_from_thread(AVCodecContext 
> *dst, AVCodecContext *src,
>     }
> 
>     if (for_user) {
> -        dst->coded_frame   = src->coded_frame;
> -        dst->has_b_frames += src->thread_count - 1;
> +        dst->coded_frame = src->coded_frame;
>     } else {
>         if (dst->codec->update_thread_context)
>             err = dst->codec->update_thread_context(dst, src);
> @@ -681,7 +680,6 @@ static void frame_thread_free(AVCodecContext *avctx, int 
> thread_count)
>     av_freep(&fctx->threads);
>     pthread_mutex_destroy(&fctx->buffer_mutex);
>     av_freep(&avctx->thread_opaque);
> -    avctx->has_b_frames -= avctx->thread_count - 1;
> }
> 
> static int frame_thread_init(AVCodecContext *avctx)
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index c11f09c..756ad1d 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -21,7 +21,7 @@
> #define AVCODEC_VERSION_H
> 
> #define LIBAVCODEC_VERSION_MAJOR 53
> -#define LIBAVCODEC_VERSION_MINOR 18
> +#define LIBAVCODEC_VERSION_MINOR 19
> #define LIBAVCODEC_VERSION_MICRO  0
> 
> #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index c2beeae..2b7230a 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -962,11 +962,6 @@ static void compute_pkt_fields(AVFormatContext *s, 
> AVStream *st,
>     delay= st->codec->has_b_frames;
>     presentation_delayed = 0;
> 
> -    // ignore delay caused by frame threading so that the mpeg2-without-dts
> -    // warning will not trigger
> -    if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
> -        delay -= st->codec->thread_count-1;
> -
>     /* XXX: need has_b_frame, but cannot get it if the codec is
>         not initialized */
>     if (delay &&
> -- 
> 1.7.8.rc1
> 
> _______________________________________________
> libav-devel mailing list
> libav-devel@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to