diff options
-rw-r--r-- | libavcodec/h264.c | 128 |
1 files changed, 63 insertions, 65 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index ec6c656333..7a2fd69126 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -1796,77 +1796,75 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h, int qscale = p == 0 ? s->qscale : h->chroma_qp[p - 1]; block_offset += 16 * p; if (IS_INTRA4x4(mb_type)) { - if (simple || !s->encoding) { - if (IS_8x8DCT(mb_type)) { - if (transform_bypass) { - idct_dc_add = - idct_add = s->dsp.add_pixels8; + if (IS_8x8DCT(mb_type)) { + if (transform_bypass) { + idct_dc_add = + idct_add = s->dsp.add_pixels8; + } else { + idct_dc_add = h->h264dsp.h264_idct8_dc_add; + idct_add = h->h264dsp.h264_idct8_add; + } + for (i = 0; i < 16; i += 4) { + uint8_t *const ptr = dest_y + block_offset[i]; + const int dir = h->intra4x4_pred_mode_cache[scan8[i]]; + if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) { + h->hpc.pred8x8l_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); } else { - idct_dc_add = h->h264dsp.h264_idct8_dc_add; - idct_add = h->h264dsp.h264_idct8_add; - } - for (i = 0; i < 16; i += 4) { - uint8_t *const ptr = dest_y + block_offset[i]; - const int dir = h->intra4x4_pred_mode_cache[scan8[i]]; - if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) { - h->hpc.pred8x8l_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); - } else { - const int nnz = h->non_zero_count_cache[scan8[i + p * 16]]; - h->hpc.pred8x8l[dir](ptr, (h->topleft_samples_available << i) & 0x8000, - (h->topright_samples_available << i) & 0x4000, linesize); - if (nnz) { - if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256)) - idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); - else - idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); - } + const int nnz = h->non_zero_count_cache[scan8[i + p * 16]]; + h->hpc.pred8x8l[dir](ptr, (h->topleft_samples_available << i) & 0x8000, + (h->topright_samples_available << i) & 0x4000, linesize); + if (nnz) { + if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256)) + idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); + else + idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); } } + } + } else { + if (transform_bypass) { + idct_dc_add = + idct_add = s->dsp.add_pixels4; } else { - if (transform_bypass) { - idct_dc_add = - idct_add = s->dsp.add_pixels4; - } else { - idct_dc_add = h->h264dsp.h264_idct_dc_add; - idct_add = h->h264dsp.h264_idct_add; - } - for (i = 0; i < 16; i++) { - uint8_t *const ptr = dest_y + block_offset[i]; - const int dir = h->intra4x4_pred_mode_cache[scan8[i]]; + idct_dc_add = h->h264dsp.h264_idct_dc_add; + idct_add = h->h264dsp.h264_idct_add; + } + for (i = 0; i < 16; i++) { + uint8_t *const ptr = dest_y + block_offset[i]; + const int dir = h->intra4x4_pred_mode_cache[scan8[i]]; - if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) { - h->hpc.pred4x4_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); - } else { - uint8_t *topright; - int nnz, tr; - uint64_t tr_high; - if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) { - const int topright_avail = (h->topright_samples_available << i) & 0x8000; - assert(s->mb_y || linesize <= block_offset[i]); - if (!topright_avail) { - if (pixel_shift) { - tr_high = ((uint16_t *)ptr)[3 - linesize / 2] * 0x0001000100010001ULL; - topright = (uint8_t *)&tr_high; - } else { - tr = ptr[3 - linesize] * 0x01010101u; - topright = (uint8_t *)&tr; - } - } else - topright = ptr + (4 << pixel_shift) - linesize; + if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) { + h->hpc.pred4x4_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); + } else { + uint8_t *topright; + int nnz, tr; + uint64_t tr_high; + if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) { + const int topright_avail = (h->topright_samples_available << i) & 0x8000; + assert(s->mb_y || linesize <= block_offset[i]); + if (!topright_avail) { + if (pixel_shift) { + tr_high = ((uint16_t *)ptr)[3 - linesize / 2] * 0x0001000100010001ULL; + topright = (uint8_t *)&tr_high; + } else { + tr = ptr[3 - linesize] * 0x01010101u; + topright = (uint8_t *)&tr; + } } else - topright = NULL; - - h->hpc.pred4x4[dir](ptr, topright, linesize); - nnz = h->non_zero_count_cache[scan8[i + p * 16]]; - if (nnz) { - if (is_h264) { - if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256)) - idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); - else - idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); - } else if (CONFIG_SVQ3_DECODER) - ff_svq3_add_idct_c(ptr, h->mb + i * 16 + p * 256, linesize, qscale, 0); - } + topright = ptr + (4 << pixel_shift) - linesize; + } else + topright = NULL; + + h->hpc.pred4x4[dir](ptr, topright, linesize); + nnz = h->non_zero_count_cache[scan8[i + p * 16]]; + if (nnz) { + if (is_h264) { + if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256)) + idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); + else + idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize); + } else if (CONFIG_SVQ3_DECODER) + ff_svq3_add_idct_c(ptr, h->mb + i * 16 + p * 256, linesize, qscale, 0); } } } |