diff options
author | Yogender Kumar Gupta <yogender.gupta@gmail.com> | 2017-06-15 18:56:13 -0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2017-07-26 23:23:17 +0200 |
commit | 79c6477c2abd8cfa41eef0c4ac39779dd8a9ec8e (patch) | |
tree | dde8e3d5962c0f1420dac31e7f96d9ffa8fe9576 /libavcodec/h264pred_template.c | |
parent | 45c4bf3df03ef53ae61fa1473424d4ae024f22e4 (diff) | |
download | ffmpeg-streaming-79c6477c2abd8cfa41eef0c4ac39779dd8a9ec8e.zip ffmpeg-streaming-79c6477c2abd8cfa41eef0c4ac39779dd8a9ec8e.tar.gz |
h264dec: fix Lossless Decoding (Profile 244) for 8x8 Intra Prediction
CC: libav-stable@libav.org
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavcodec/h264pred_template.c')
-rw-r--r-- | libavcodec/h264pred_template.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/libavcodec/h264pred_template.c b/libavcodec/h264pred_template.c index 8492b2b..02494aa 100644 --- a/libavcodec/h264pred_template.c +++ b/libavcodec/h264pred_template.c @@ -1123,6 +1123,79 @@ static void FUNCC(pred8x8l_horizontal_up)(uint8_t *_src, int has_topleft, SRC(5,6)=SRC(5,7)=SRC(6,4)=SRC(6,5)=SRC(6,6)= SRC(6,7)=SRC(7,4)=SRC(7,5)=SRC(7,6)=SRC(7,7)= l7; } + +static void FUNCC(pred8x8l_vertical_filter_add)(uint8_t *_src, int16_t *_block, int has_topleft, + int has_topright, ptrdiff_t _stride) +{ + int i; + pixel *src = (pixel*)_src; + const dctcoef *block = (const dctcoef*)_block; + pixel pix[8]; + int stride = _stride/sizeof(pixel); + PREDICT_8x8_LOAD_TOP; + + pix[0] = t0; + pix[1] = t1; + pix[2] = t2; + pix[3] = t3; + pix[4] = t4; + pix[5] = t5; + pix[6] = t6; + pix[7] = t7; + + for (i = 0; i < 8; i++) { + pixel v = pix[i]; + src[0 * stride] = v += block[0]; + src[1 * stride] = v += block[8]; + src[2 * stride] = v += block[16]; + src[3 * stride] = v += block[24]; + src[4 * stride] = v += block[32]; + src[5 * stride] = v += block[40]; + src[6 * stride] = v += block[48]; + src[7 * stride] = v + block[56]; + src++; + block++; + } + + memset(_block, 0, sizeof(dctcoef) * 64); +} + +static void FUNCC(pred8x8l_horizontal_filter_add)(uint8_t *_src, int16_t *_block, int has_topleft, + int has_topright, ptrdiff_t _stride) +{ + int i; + pixel *src = (pixel*)_src; + const dctcoef *block = (const dctcoef*)_block; + pixel pix[8]; + int stride = _stride/sizeof(pixel); + PREDICT_8x8_LOAD_LEFT; + + pix[0] = l0; + pix[1] = l1; + pix[2] = l2; + pix[3] = l3; + pix[4] = l4; + pix[5] = l5; + pix[6] = l6; + pix[7] = l7; + + for (i = 0; i < 8; i++) { + pixel v = pix[i]; + src[0] = v += block[0]; + src[1] = v += block[1]; + src[2] = v += block[2]; + src[3] = v += block[3]; + src[4] = v += block[4]; + src[5] = v += block[5]; + src[6] = v += block[6]; + src[7] = v + block[7]; + src += stride; + block += 8; + } + + memset(_block, 0, sizeof(dctcoef) * 64); +} + #undef PREDICT_8x8_LOAD_LEFT #undef PREDICT_8x8_LOAD_TOP #undef PREDICT_8x8_LOAD_TOPLEFT |