Move HuffYUV left prediction to dsputil.
Patch by Nathan Caldwell, saintdev gmail Originally committed as revision 20179 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
95ce961d88
commit
73c6f59830
@ -3608,6 +3608,59 @@ static void sub_hfyu_median_prediction_c(uint8_t *dst, uint8_t *src1, uint8_t *s
|
|||||||
*left_top= lt;
|
*left_top= lt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int add_hfyu_left_prediction_c(uint8_t *dst, uint8_t *src, int w, int acc){
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<w-1; i++){
|
||||||
|
acc+= src[i];
|
||||||
|
dst[i]= acc;
|
||||||
|
i++;
|
||||||
|
acc+= src[i];
|
||||||
|
dst[i]= acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(; i<w; i++){
|
||||||
|
acc+= src[i];
|
||||||
|
dst[i]= acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAVE_BIGENDIAN
|
||||||
|
#define B 3
|
||||||
|
#define G 2
|
||||||
|
#define R 1
|
||||||
|
#else
|
||||||
|
#define B 0
|
||||||
|
#define G 1
|
||||||
|
#define R 2
|
||||||
|
#endif
|
||||||
|
static inline void add_hfyu_left_prediction_bgr32_c(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
|
||||||
|
int i;
|
||||||
|
int r,g,b;
|
||||||
|
r= *red;
|
||||||
|
g= *green;
|
||||||
|
b= *blue;
|
||||||
|
|
||||||
|
for(i=0; i<w; i++){
|
||||||
|
b+= src[4*i+B];
|
||||||
|
g+= src[4*i+G];
|
||||||
|
r+= src[4*i+R];
|
||||||
|
|
||||||
|
dst[4*i+B]= b;
|
||||||
|
dst[4*i+G]= g;
|
||||||
|
dst[4*i+R]= r;
|
||||||
|
}
|
||||||
|
|
||||||
|
*red= r;
|
||||||
|
*green= g;
|
||||||
|
*blue= b;
|
||||||
|
}
|
||||||
|
#undef B
|
||||||
|
#undef G
|
||||||
|
#undef R
|
||||||
|
|
||||||
#define BUTTERFLY2(o1,o2,i1,i2) \
|
#define BUTTERFLY2(o1,o2,i1,i2) \
|
||||||
o1= (i1)+(i2);\
|
o1= (i1)+(i2);\
|
||||||
o2= (i1)-(i2);
|
o2= (i1)-(i2);
|
||||||
@ -4737,6 +4790,8 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
|
|||||||
c->diff_bytes= diff_bytes_c;
|
c->diff_bytes= diff_bytes_c;
|
||||||
c->add_hfyu_median_prediction= add_hfyu_median_prediction_c;
|
c->add_hfyu_median_prediction= add_hfyu_median_prediction_c;
|
||||||
c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c;
|
c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c;
|
||||||
|
c->add_hfyu_left_prediction = add_hfyu_left_prediction_c;
|
||||||
|
c->add_hfyu_left_prediction_bgr32 = add_hfyu_left_prediction_bgr32_c;
|
||||||
c->bswap_buf= bswap_buf;
|
c->bswap_buf= bswap_buf;
|
||||||
#if CONFIG_PNG_DECODER
|
#if CONFIG_PNG_DECODER
|
||||||
c->add_png_paeth_prediction= ff_add_png_paeth_prediction;
|
c->add_png_paeth_prediction= ff_add_png_paeth_prediction;
|
||||||
|
@ -349,6 +349,8 @@ typedef struct DSPContext {
|
|||||||
*/
|
*/
|
||||||
void (*sub_hfyu_median_prediction)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top);
|
void (*sub_hfyu_median_prediction)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top);
|
||||||
void (*add_hfyu_median_prediction)(uint8_t *dst, uint8_t *top, uint8_t *diff, int w, int *left, int *left_top);
|
void (*add_hfyu_median_prediction)(uint8_t *dst, uint8_t *top, uint8_t *diff, int w, int *left, int *left_top);
|
||||||
|
int (*add_hfyu_left_prediction)(uint8_t *dst, uint8_t *src, int w, int acc);
|
||||||
|
void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue);
|
||||||
/* this might write to dst[w] */
|
/* this might write to dst[w] */
|
||||||
void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
|
void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
|
||||||
void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
|
void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
|
||||||
|
@ -129,47 +129,6 @@ static const unsigned char classic_add_chroma[256] = {
|
|||||||
6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
|
6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0; i<w-1; i++){
|
|
||||||
acc+= src[i];
|
|
||||||
dst[i]= acc;
|
|
||||||
i++;
|
|
||||||
acc+= src[i];
|
|
||||||
dst[i]= acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(; i<w; i++){
|
|
||||||
acc+= src[i];
|
|
||||||
dst[i]= acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
|
|
||||||
int i;
|
|
||||||
int r,g,b;
|
|
||||||
r= *red;
|
|
||||||
g= *green;
|
|
||||||
b= *blue;
|
|
||||||
|
|
||||||
for(i=0; i<w; i++){
|
|
||||||
b+= src[4*i+B];
|
|
||||||
g+= src[4*i+G];
|
|
||||||
r+= src[4*i+R];
|
|
||||||
|
|
||||||
dst[4*i+B]= b;
|
|
||||||
dst[4*i+G]= g;
|
|
||||||
dst[4*i+R]= r;
|
|
||||||
}
|
|
||||||
|
|
||||||
*red= r;
|
|
||||||
*green= g;
|
|
||||||
*blue= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){
|
static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){
|
||||||
int i;
|
int i;
|
||||||
if(w<32){
|
if(w<32){
|
||||||
@ -1035,10 +994,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
|||||||
case LEFT:
|
case LEFT:
|
||||||
case PLANE:
|
case PLANE:
|
||||||
decode_422_bitstream(s, width-2);
|
decode_422_bitstream(s, width-2);
|
||||||
lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
|
lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
|
||||||
if(!(s->flags&CODEC_FLAG_GRAY)){
|
if(!(s->flags&CODEC_FLAG_GRAY)){
|
||||||
leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
|
leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
|
||||||
leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
|
leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(cy=y=1; y<s->height; y++,cy++){
|
for(cy=y=1; y<s->height; y++,cy++){
|
||||||
@ -1049,7 +1008,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
|||||||
|
|
||||||
ydst= p->data[0] + p->linesize[0]*y;
|
ydst= p->data[0] + p->linesize[0]*y;
|
||||||
|
|
||||||
lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
|
lefty= s->dsp.add_hfyu_left_prediction(ydst, s->temp[0], width, lefty);
|
||||||
if(s->predictor == PLANE){
|
if(s->predictor == PLANE){
|
||||||
if(y>s->interlaced)
|
if(y>s->interlaced)
|
||||||
s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
|
s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
|
||||||
@ -1065,10 +1024,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
|||||||
vdst= p->data[2] + p->linesize[2]*cy;
|
vdst= p->data[2] + p->linesize[2]*cy;
|
||||||
|
|
||||||
decode_422_bitstream(s, width);
|
decode_422_bitstream(s, width);
|
||||||
lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
|
lefty= s->dsp.add_hfyu_left_prediction(ydst, s->temp[0], width, lefty);
|
||||||
if(!(s->flags&CODEC_FLAG_GRAY)){
|
if(!(s->flags&CODEC_FLAG_GRAY)){
|
||||||
leftu= add_left_prediction(udst, s->temp[1], width2, leftu);
|
leftu= s->dsp.add_hfyu_left_prediction(udst, s->temp[1], width2, leftu);
|
||||||
leftv= add_left_prediction(vdst, s->temp[2], width2, leftv);
|
leftv= s->dsp.add_hfyu_left_prediction(vdst, s->temp[2], width2, leftv);
|
||||||
}
|
}
|
||||||
if(s->predictor == PLANE){
|
if(s->predictor == PLANE){
|
||||||
if(cy>s->interlaced){
|
if(cy>s->interlaced){
|
||||||
@ -1086,10 +1045,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
|||||||
case MEDIAN:
|
case MEDIAN:
|
||||||
/* first line except first 2 pixels is left predicted */
|
/* first line except first 2 pixels is left predicted */
|
||||||
decode_422_bitstream(s, width-2);
|
decode_422_bitstream(s, width-2);
|
||||||
lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
|
lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
|
||||||
if(!(s->flags&CODEC_FLAG_GRAY)){
|
if(!(s->flags&CODEC_FLAG_GRAY)){
|
||||||
leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
|
leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
|
||||||
leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
|
leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
|
||||||
}
|
}
|
||||||
|
|
||||||
cy=y=1;
|
cy=y=1;
|
||||||
@ -1097,20 +1056,20 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
|||||||
/* second line is left predicted for interlaced case */
|
/* second line is left predicted for interlaced case */
|
||||||
if(s->interlaced){
|
if(s->interlaced){
|
||||||
decode_422_bitstream(s, width);
|
decode_422_bitstream(s, width);
|
||||||
lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
|
lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
|
||||||
if(!(s->flags&CODEC_FLAG_GRAY)){
|
if(!(s->flags&CODEC_FLAG_GRAY)){
|
||||||
leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
|
leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
|
||||||
leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
|
leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
|
||||||
}
|
}
|
||||||
y++; cy++;
|
y++; cy++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* next 4 pixels are left predicted too */
|
/* next 4 pixels are left predicted too */
|
||||||
decode_422_bitstream(s, 4);
|
decode_422_bitstream(s, 4);
|
||||||
lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
|
lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
|
||||||
if(!(s->flags&CODEC_FLAG_GRAY)){
|
if(!(s->flags&CODEC_FLAG_GRAY)){
|
||||||
leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
|
leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
|
||||||
leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
|
leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* next line except the first 4 pixels is median predicted */
|
/* next line except the first 4 pixels is median predicted */
|
||||||
@ -1178,12 +1137,12 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
|||||||
case LEFT:
|
case LEFT:
|
||||||
case PLANE:
|
case PLANE:
|
||||||
decode_bgr_bitstream(s, width-1);
|
decode_bgr_bitstream(s, width-1);
|
||||||
add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb);
|
s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb);
|
||||||
|
|
||||||
for(y=s->height-2; y>=0; y--){ //Yes it is stored upside down.
|
for(y=s->height-2; y>=0; y--){ //Yes it is stored upside down.
|
||||||
decode_bgr_bitstream(s, width);
|
decode_bgr_bitstream(s, width);
|
||||||
|
|
||||||
add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb);
|
s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb);
|
||||||
if(s->predictor == PLANE){
|
if(s->predictor == PLANE){
|
||||||
if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){
|
if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){
|
||||||
s->dsp.add_bytes(p->data[0] + p->linesize[0]*y,
|
s->dsp.add_bytes(p->data[0] + p->linesize[0]*y,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user