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