On Thu, 15 Jun 2017 15:50:31 -0400
"Ronald S. Bultje" <rsbul...@gmail.com> wrote:

> From: Anton Mitrofanov <bugmas...@narod.ru>
> 
> Use the correct ctxIdxInc calculation for coded_block_flag.
> Keep old behavior for old versions of x264 for backward compatibility.
> 
> Signed-off-by: Ronald S. Bultje <rsbul...@gmail.com>
> ---
>  libavcodec/h264_cabac.c | 47 +++++++++++++++++++++++++++++++++--------------
>  1 file changed, 33 insertions(+), 14 deletions(-)
> 
> diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c
> index 11ff3a0..28aacc5 100644
> --- a/libavcodec/h264_cabac.c
> +++ b/libavcodec/h264_cabac.c
> @@ -2347,21 +2347,40 @@ decode_intra_mb:
>      if (CHROMA444(h) && IS_8x8DCT(mb_type)){
>          int i;
>          uint8_t *nnz_cache = sl->non_zero_count_cache;
> -        for (i = 0; i < 2; i++){
> -            if (sl->left_type[LEFT(i)] && 
> !IS_8x8DCT(sl->left_type[LEFT(i)])) {
> -                nnz_cache[3+8* 1 + 2*8*i]=
> -                nnz_cache[3+8* 2 + 2*8*i]=
> -                nnz_cache[3+8* 6 + 2*8*i]=
> -                nnz_cache[3+8* 7 + 2*8*i]=
> -                nnz_cache[3+8*11 + 2*8*i]=
> -                nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
> +        if (h->sei.unregistered.x264_build < 151U) {
> +            for (i = 0; i < 2; i++){
> +                if (sl->left_type[LEFT(i)] && 
> !IS_8x8DCT(sl->left_type[LEFT(i)])) {
> +                    nnz_cache[3+8* 1 + 2*8*i]=
> +                    nnz_cache[3+8* 2 + 2*8*i]=
> +                    nnz_cache[3+8* 6 + 2*8*i]=
> +                    nnz_cache[3+8* 7 + 2*8*i]=
> +                    nnz_cache[3+8*11 + 2*8*i]=
> +                    nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
> +                }
> +            }
> +            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
> +                uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
> +                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
> +                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
> +                AV_WN32A(&nnz_cache[4+8*10], top_empty);
> +            }
> +        } else {
> +            for (i = 0; i < 2; i++){
> +                if (sl->left_type[LEFT(i)] && 
> !IS_8x8DCT(sl->left_type[LEFT(i)])) {
> +                    nnz_cache[3+8* 1 + 2*8*i]=
> +                    nnz_cache[3+8* 2 + 2*8*i]=
> +                    nnz_cache[3+8* 6 + 2*8*i]=
> +                    nnz_cache[3+8* 7 + 2*8*i]=
> +                    nnz_cache[3+8*11 + 2*8*i]=
> +                    nnz_cache[3+8*12 + 2*8*i]= 
> !IS_INTRA_PCM(sl->left_type[LEFT(i)]) ? 0 : 64;
> +                }
> +            }
> +            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
> +                uint32_t top_empty = !IS_INTRA_PCM(sl->top_type) ? 0 : 
> 0x40404040;
> +                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
> +                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
> +                AV_WN32A(&nnz_cache[4+8*10], top_empty);
>              }
> -        }
> -        if (sl->top_type && !IS_8x8DCT(sl->top_type)){
> -            uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
> -            AV_WN32A(&nnz_cache[4+8* 0], top_empty);
> -            AV_WN32A(&nnz_cache[4+8* 5], top_empty);
> -            AV_WN32A(&nnz_cache[4+8*10], top_empty);
>          }
>      }
>      h->cur_pic.mb_type[mb_xy] = mb_type;

There have been several user complaints about it. Apparently, there are
a lot of these broken files around. The problem is that some files lack
the SEI (or it has been wiped out by incompetents to hide encode
settings, I guess). Usually, only the first video packet in a file
contains this SEI, so starting at a position other than the start also
causes problems.

Would there be any way to detect this situation if x264_build is unset?
Such as retrying decoding after obvious errors happen, or at least
allowing frames after that to be decoded with the bug workaround
enabled. Or would that be too crude to be considered?
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to