Mercurial > libavcodec.hg
changeset 6036:ce3b68242317 libavcodec
Correct spatial prediction mode in RV30/40 for vertical left direction
and add its version that does not rely on down left neighbour subblock.
author | kostya |
---|---|
date | Mon, 17 Dec 2007 18:43:34 +0000 |
parents | 4de95581b38a |
children | e0e55a5a74c0 |
files | h264pred.c h264pred.h rv34.c |
diffstat | 3 files changed, 20 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/h264pred.c Mon Dec 17 18:23:18 2007 +0000 +++ b/h264pred.c Mon Dec 17 18:43:34 2007 +0000 @@ -288,10 +288,10 @@ src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2; } -static void pred4x4_vertical_left_rv40_c(uint8_t *src, uint8_t *topright, int stride){ +static void pred4x4_vertical_left_rv40(uint8_t *src, uint8_t *topright, int stride, + const int l0, const int l1, const int l2, const int l3, const int l4){ LOAD_TOP_EDGE LOAD_TOP_RIGHT_EDGE - LOAD_LEFT_EDGE src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3; src[1+0*stride]= @@ -301,7 +301,7 @@ src[3+0*stride]= src[2+2*stride]=(t3 + t4+ 1)>>1; src[3+2*stride]=(t4 + t5+ 1)>>1; - src[0+1*stride]=(t0 + 2*t1 + t2 + l2 + 2*l3 + l3 + 4)>>3; + src[0+1*stride]=(t0 + 2*t1 + t2 + l2 + 2*l3 + l4 + 4)>>3; src[1+1*stride]= src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2; src[2+1*stride]= @@ -311,6 +311,19 @@ src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2; } +static void pred4x4_vertical_left_rv40_c(uint8_t *src, uint8_t *topright, int stride){ + LOAD_LEFT_EDGE + LOAD_DOWN_LEFT_EDGE + + pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4); +} + +static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src, uint8_t *topright, int stride){ + LOAD_LEFT_EDGE + + pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3); +} + static void pred4x4_horizontal_up_c(uint8_t *src, uint8_t *topright, int stride){ LOAD_LEFT_EDGE @@ -1010,6 +1023,7 @@ h->pred4x4[DC_128_PRED ]= pred4x4_128_dc_c; h->pred4x4[DIAG_DOWN_LEFT_PRED_RV40_NODOWN]= pred4x4_down_left_rv40_nodown_c; h->pred4x4[HOR_UP_PRED_RV40_NODOWN]= pred4x4_horizontal_up_rv40_nodown_c; + h->pred4x4[VERT_LEFT_PRED_RV40_NODOWN]= pred4x4_vertical_left_rv40_nodown_c; } h->pred8x8l[VERT_PRED ]= pred8x8l_vertical_c;
--- a/h264pred.h Mon Dec 17 18:23:18 2007 +0000 +++ b/h264pred.h Mon Dec 17 18:43:34 2007 +0000 @@ -50,6 +50,7 @@ #define DIAG_DOWN_LEFT_PRED_RV40_NODOWN 12 #define HOR_UP_PRED_RV40_NODOWN 13 +#define VERT_LEFT_PRED_RV40_NODOWN 14 #define DC_PRED8x8 0 #define HOR_PRED8x8 1 @@ -65,7 +66,7 @@ * Context for storing H.264 prediction functions */ typedef struct H264PredContext{ - void (*pred4x4 [9+3+2])(uint8_t *src, uint8_t *topright, int stride);//FIXME move to dsp? + void (*pred4x4 [9+3+3])(uint8_t *src, uint8_t *topright, int stride);//FIXME move to dsp? void (*pred8x8l [9+3])(uint8_t *src, int topleft, int topright, int stride); void (*pred8x8 [4+3])(uint8_t *src, int stride); void (*pred16x16[4+3])(uint8_t *src, int stride);
--- a/rv34.c Mon Dec 17 18:23:18 2007 +0000 +++ b/rv34.c Mon Dec 17 18:43:34 2007 +0000 @@ -766,6 +766,7 @@ if(!down){ if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN; if(itype == HOR_UP_PRED) itype = HOR_UP_PRED_RV40_NODOWN; + if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN; } if(!right && up){ topleft = dst[-stride + 3] * 0x01010101;