diff options
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r-- | libavcodec/h264.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index fc612905ab..b909600b3e 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -48,6 +48,8 @@ // #undef NDEBUG #include <assert.h> +const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 }; + static const uint8_t rem6[QP_MAX_NUM + 1] = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, @@ -2126,7 +2128,8 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple, if (pixel_shift) { int j; GetBitContext gb; - init_get_bits(&gb, (uint8_t *)h->mb, 384 * bit_depth); + init_get_bits(&gb, (uint8_t *)h->mb, + ff_h264_mb_sizes[h->sps.chroma_format_idc] * bit_depth); for (i = 0; i < 16; i++) { uint16_t *tmp_y = (uint16_t *)(dest_y + i * linesize); @@ -2157,7 +2160,7 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple, } } else { for (i = 0; i < 16; i++) - memcpy(dest_y + i * linesize, h->mb + i * 8, 16); + memcpy(dest_y + i * linesize, (uint8_t *)h->mb + i * 16, 16); if (simple || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { if (!h->sps.chroma_format_idc) { for (i = 0; i < 8; i++) { @@ -2165,9 +2168,11 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple, memset(dest_cr + i*uvlinesize, 1 << (bit_depth - 1), 8); } } else { + uint8_t *src_cb = (uint8_t *)h->mb + 256; + uint8_t *src_cr = (uint8_t *)h->mb + 256 + block_h * 8; for (i = 0; i < block_h; i++) { - memcpy(dest_cb + i * uvlinesize, h->mb + 128 + i * 4, 8); - memcpy(dest_cr + i * uvlinesize, h->mb + 160 + i * 4, 8); + memcpy(dest_cb + i * uvlinesize, src_cb + i * 8, 8); + memcpy(dest_cr + i * uvlinesize, src_cr + i * 8, 8); } } } @@ -2358,7 +2363,8 @@ static av_always_inline void hl_decode_mb_444_internal(H264Context *h, } else { for (p = 0; p < plane_count; p++) for (i = 0; i < 16; i++) - memcpy(dest[p] + i * linesize, h->mb + p * 128 + i * 8, 16); + memcpy(dest[p] + i * linesize, + (uint8_t *)h->mb + p * 256 + i * 16, 16); } } else { if (IS_INTRA(mb_type)) { |