mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Correct spatial prediction mode in RV30/40 for vertical left direction
and add its version that does not rely on down left neighbour subblock. Originally committed as revision 11252 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
5492209aa9
commit
b0797570df
@ -288,10 +288,10 @@ static void pred4x4_vertical_left_c(uint8_t *src, uint8_t *topright, int stride)
|
|||||||
src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
|
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_EDGE
|
||||||
LOAD_TOP_RIGHT_EDGE
|
LOAD_TOP_RIGHT_EDGE
|
||||||
LOAD_LEFT_EDGE
|
|
||||||
|
|
||||||
src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
|
src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
|
||||||
src[1+0*stride]=
|
src[1+0*stride]=
|
||||||
@ -301,7 +301,7 @@ static void pred4x4_vertical_left_rv40_c(uint8_t *src, uint8_t *topright, int st
|
|||||||
src[3+0*stride]=
|
src[3+0*stride]=
|
||||||
src[2+2*stride]=(t3 + t4+ 1)>>1;
|
src[2+2*stride]=(t3 + t4+ 1)>>1;
|
||||||
src[3+2*stride]=(t4 + t5+ 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[1+1*stride]=
|
||||||
src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
|
src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
|
||||||
src[2+1*stride]=
|
src[2+1*stride]=
|
||||||
@ -311,6 +311,19 @@ static void pred4x4_vertical_left_rv40_c(uint8_t *src, uint8_t *topright, int st
|
|||||||
src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
|
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){
|
static void pred4x4_horizontal_up_c(uint8_t *src, uint8_t *topright, int stride){
|
||||||
LOAD_LEFT_EDGE
|
LOAD_LEFT_EDGE
|
||||||
|
|
||||||
@ -1010,6 +1023,7 @@ void ff_h264_pred_init(H264PredContext *h, int codec_id){
|
|||||||
h->pred4x4[DC_128_PRED ]= pred4x4_128_dc_c;
|
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[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[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;
|
h->pred8x8l[VERT_PRED ]= pred8x8l_vertical_c;
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
|
|
||||||
#define DIAG_DOWN_LEFT_PRED_RV40_NODOWN 12
|
#define DIAG_DOWN_LEFT_PRED_RV40_NODOWN 12
|
||||||
#define HOR_UP_PRED_RV40_NODOWN 13
|
#define HOR_UP_PRED_RV40_NODOWN 13
|
||||||
|
#define VERT_LEFT_PRED_RV40_NODOWN 14
|
||||||
|
|
||||||
#define DC_PRED8x8 0
|
#define DC_PRED8x8 0
|
||||||
#define HOR_PRED8x8 1
|
#define HOR_PRED8x8 1
|
||||||
@ -65,7 +66,7 @@
|
|||||||
* Context for storing H.264 prediction functions
|
* Context for storing H.264 prediction functions
|
||||||
*/
|
*/
|
||||||
typedef struct H264PredContext{
|
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 (*pred8x8l [9+3])(uint8_t *src, int topleft, int topright, int stride);
|
||||||
void (*pred8x8 [4+3])(uint8_t *src, int stride);
|
void (*pred8x8 [4+3])(uint8_t *src, int stride);
|
||||||
void (*pred16x16[4+3])(uint8_t *src, int stride);
|
void (*pred16x16[4+3])(uint8_t *src, int stride);
|
||||||
|
@ -766,6 +766,7 @@ static void rv34_pred_4x4_block(RV34DecContext *r, uint8_t *dst, int stride, int
|
|||||||
if(!down){
|
if(!down){
|
||||||
if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN;
|
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 == HOR_UP_PRED) itype = HOR_UP_PRED_RV40_NODOWN;
|
||||||
|
if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN;
|
||||||
}
|
}
|
||||||
if(!right && up){
|
if(!right && up){
|
||||||
topleft = dst[-stride + 3] * 0x01010101;
|
topleft = dst[-stride + 3] * 0x01010101;
|
||||||
|
Loading…
Reference in New Issue
Block a user