source: trunk/Patches/ffmpeg-bgr24-huffyuv.diff @ 1198

Revision 1198, 9.4 KB checked in by astrange, 5 years ago (diff)

Import patch to fix the alpha in HuffYUV locally.

Haven't managed to finish it for mainline yet.
Fixes #439.

  • libavcodec/huffyuv.c

     
    3939#define B 3 
    4040#define G 2 
    4141#define R 1 
     42#define A 0 
    4243#else 
    4344#define B 0 
    4445#define G 1 
    4546#define R 2 
     47#define A 3 
    4648#endif 
    4749 
    4850typedef enum Predictor{ 
     
    6163    int bitstream_bpp; 
    6264    int version; 
    6365    int yuy2;                               //use yuy2 instead of 422P 
    64     int bgr32;                              //use bgr32 instead of bgr24 
    6566    int width, height; 
    6667    int flags; 
    6768    int context; 
     
    406407            s->temp[i]= av_malloc(s->width + 16); 
    407408        } 
    408409    }else{ 
    409         s->temp[0]= av_malloc(4*s->width + 16); 
     410        int bytes = (s->bitstream_bpp==24) ? 3 : 4; 
     411        s->temp[0]= av_malloc(bytes*s->width + 16); 
    410412    } 
    411413} 
    412414 
     
    436438    avctx->coded_frame= &s->picture; 
    437439    s->interlaced= s->height > 288; 
    438440 
    439 s->bgr32=1; 
    440441//if(avctx->extradata) 
    441442//  printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size); 
    442443    if(avctx->extradata_size){ 
     
    504505        } 
    505506        break; 
    506507    case 24: 
     508        avctx->pix_fmt = PIX_FMT_BGR24; 
     509        break; 
    507510    case 32: 
    508         if(s->bgr32){ 
    509             avctx->pix_fmt = PIX_FMT_RGB32; 
    510         }else{ 
    511             avctx->pix_fmt = PIX_FMT_BGR24; 
    512         } 
     511        avctx->pix_fmt = PIX_FMT_RGB32; 
    513512        break; 
    514513    default: 
    515514        assert(0); 
     
    820819} 
    821820#endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */ 
    822821 
    823 static av_always_inline void decode_bgr_1(HYuvContext *s, int count, int decorrelate, int alpha){ 
     822static av_always_inline void decode_bgr_1_32(HYuvContext *s, int count, int decorrelate){ 
    824823    int i; 
    825824    for(i=0; i<count; i++){ 
    826825        int code = get_vlc2(&s->gb, s->vlc[3].table, VLC_BITS, 1); 
     
    835834            s->temp[0][4*i+G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); 
    836835            s->temp[0][4*i+R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); 
    837836        } 
    838         if(alpha) 
    839             get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?! 
     837        s->temp[0][4*i+A] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); 
    840838    } 
    841839} 
    842840 
     841static av_always_inline void decode_bgr_1_24(HYuvContext *s, int count, int decorrelate){ 
     842    int i; 
     843    for(i=0; i<count; i++){ 
     844        int code = get_vlc2(&s->gb, s->vlc[3].table, VLC_BITS, 1); 
     845        if(code != -1){ 
     846            *(uint32_t*)&s->temp[0][3*i] = AV_RL32(&s->pix_bgr_map[code]); 
     847        }else if(decorrelate){ 
     848            // B = 0, G = 1, R = 2 for BGR24 no matter the endianness 
     849            s->temp[0][3*i+1] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); 
     850            s->temp[0][3*i+0] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][3*i+1]; 
     851            s->temp[0][3*i+2] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][3*i+1]; 
     852        }else{ 
     853            s->temp[0][3*i+0] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3); 
     854            s->temp[0][3*i+1] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); 
     855            s->temp[0][3*i+2] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); 
     856        } 
     857    } 
     858} 
     859 
    843860static void decode_bgr_bitstream(HYuvContext *s, int count){ 
    844861    if(s->decorrelate){ 
    845862        if(s->bitstream_bpp==24) 
    846             decode_bgr_1(s, count, 1, 0); 
     863            decode_bgr_1_24(s, count, 1); 
    847864        else 
    848             decode_bgr_1(s, count, 1, 1); 
     865            decode_bgr_1_32(s, count, 1); 
    849866    }else{ 
    850867        if(s->bitstream_bpp==24) 
    851             decode_bgr_1(s, count, 0, 0); 
     868            decode_bgr_1_24(s, count, 0); 
    852869        else 
    853             decode_bgr_1(s, count, 0, 1); 
     870            decode_bgr_1_32(s, count, 0); 
    854871    } 
    855872} 
    856873 
     
    11161133        } 
    11171134    }else{ 
    11181135        int y; 
    1119         int leftr, leftg, leftb; 
     1136        int leftr, leftg, leftb, lefta; 
    11201137        const int last_line= (height-1)*p->linesize[0]; 
    11211138 
    11221139        if(s->bitstream_bpp==32){ 
    1123             skip_bits(&s->gb, 8); 
     1140            lefta= p->data[0][last_line+A]= get_bits(&s->gb, 8); 
    11241141            leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8); 
    11251142            leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8); 
    11261143            leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8); 
    11271144        }else{ 
    1128             leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8); 
    1129             leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8); 
    1130             leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8); 
     1145            leftr= p->data[0][last_line+2]= get_bits(&s->gb, 8); 
     1146            leftg= p->data[0][last_line+1]= get_bits(&s->gb, 8); 
     1147            leftb= p->data[0][last_line+0]= get_bits(&s->gb, 8); 
    11311148            skip_bits(&s->gb, 8); 
    11321149        } 
    11331150 
    1134         if(s->bgr32){ 
    11351151            switch(s->predictor){ 
    11361152            case LEFT: 
    11371153            case PLANE: 
    11381154                decode_bgr_bitstream(s, width-1); 
    1139                 s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb); 
     1155                if(s->bitstream_bpp==32) 
     1156                    s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb, &lefta); 
     1157                else 
     1158                    s->dsp.add_hfyu_left_prediction_bgr24(p->data[0] + last_line+3, s->temp[0], width-1, &leftr, &leftg, &leftb); 
    11401159 
     1160 
    11411161                for(y=s->height-2; y>=0; y--){ //Yes it is stored upside down. 
    11421162                    decode_bgr_bitstream(s, width); 
    11431163 
    1144                     s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb); 
     1164                    if(s->bitstream_bpp==32) 
     1165                        s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb, &lefta); 
     1166                    else 
     1167                        s->dsp.add_hfyu_left_prediction_bgr24(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb); 
    11451168                    if(s->predictor == PLANE){ 
    11461169                        if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){ 
    11471170                            s->dsp.add_bytes(p->data[0] + p->linesize[0]*y, 
     
    11541177            default: 
    11551178                av_log(avctx, AV_LOG_ERROR, "prediction type not supported!\n"); 
    11561179            } 
    1157         }else{ 
    1158  
    1159             av_log(avctx, AV_LOG_ERROR, "BGR24 output is not implemented yet\n"); 
    1160             return -1; 
    1161         } 
    11621180    } 
    11631181    emms_c(); 
    11641182 
  • libavcodec/dsputil.c

     
    36273627    return acc; 
    36283628} 
    36293629 
     3630static inline void add_hfyu_left_prediction_bgr24_c(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue){ 
     3631    int i; 
     3632    int r,g,b; 
     3633    r= *red; 
     3634    g= *green; 
     3635    b= *blue; 
     3636 
     3637    for(i=0; i<w; i++){ 
     3638        b+= src[3*i+0]; 
     3639        g+= src[3*i+1]; 
     3640        r+= src[3*i+2]; 
     3641 
     3642        dst[3*i+0]= b; 
     3643        dst[3*i+1]= g; 
     3644        dst[3*i+2]= r; 
     3645    } 
     3646 
     3647    *red= r; 
     3648    *green= g; 
     3649    *blue= b; 
     3650} 
     3651 
    36303652#if HAVE_BIGENDIAN 
    36313653#define B 3 
    36323654#define G 2 
    36333655#define R 1 
     3656#define A 0 
    36343657#else 
    36353658#define B 0 
    36363659#define G 1 
    36373660#define R 2 
     3661#define A 3 
    36383662#endif 
    3639 static void add_hfyu_left_prediction_bgr32_c(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue){ 
     3663static void add_hfyu_left_prediction_bgr32_c(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha){ 
    36403664    int i; 
    3641     int r,g,b; 
     3665    int r,g,b,a; 
    36423666    r= *red; 
    36433667    g= *green; 
    36443668    b= *blue; 
     3669    a= *alpha; 
    36453670 
    36463671    for(i=0; i<w; i++){ 
    36473672        b+= src[4*i+B]; 
    36483673        g+= src[4*i+G]; 
    36493674        r+= src[4*i+R]; 
     3675        a+= src[4*i+A]; 
    36503676 
    36513677        dst[4*i+B]= b; 
    36523678        dst[4*i+G]= g; 
    36533679        dst[4*i+R]= r; 
     3680        dst[4*i+A]= a; 
    36543681    } 
    36553682 
    36563683    *red= r; 
    36573684    *green= g; 
    36583685    *blue= b; 
     3686    *alpha= a; 
    36593687} 
    36603688#undef B 
    36613689#undef G 
    36623690#undef R 
     3691#undef A 
    36633692 
    36643693#define BUTTERFLY2(o1,o2,i1,i2) \ 
    36653694o1= (i1)+(i2);\ 
     
    47914820    c->add_hfyu_median_prediction= add_hfyu_median_prediction_c; 
    47924821    c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c; 
    47934822    c->add_hfyu_left_prediction  = add_hfyu_left_prediction_c; 
     4823    c->add_hfyu_left_prediction_bgr24 = add_hfyu_left_prediction_bgr24_c; 
    47944824    c->add_hfyu_left_prediction_bgr32 = add_hfyu_left_prediction_bgr32_c; 
    47954825    c->bswap_buf= bswap_buf; 
    47964826#if CONFIG_PNG_DECODER 
  • libavcodec/dsputil.h

     
    350350    void (*sub_hfyu_median_prediction)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w, int *left, int *left_top); 
    351351    void (*add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top); 
    352352    int  (*add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left); 
    353     void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue); 
     353    void (*add_hfyu_left_prediction_bgr24)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue); 
     354    void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha); 
    354355    /* this might write to dst[w] */ 
    355356    void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp); 
    356357    void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w); 
Note: See TracBrowser for help on using the repository browser.