|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|