Ticket #143: yuv422p_to_rgb.patch

File yuv422p_to_rgb.patch, 12.8 KB (added by peter_b, 6 years ago)

Patch to fix this (by Baptiste Coudurier)

  • libswscale/yuv2rgb.c

     
    104104                     int srcSliceH, uint8_t* dst[], int dstStride[]) \ 
    105105{\ 
    106106    int y;\ 
     107    int vshift = c->srcFormat == PIX_FMT_YUV420P;\ 
    107108\ 
    108     if (!alpha && c->srcFormat == PIX_FMT_YUV422P) {\ 
    109         srcStride[1] *= 2;\ 
    110         srcStride[2] *= 2;\ 
    111     }\ 
    112     for (y=0; y<srcSliceH; y+=2) {\ 
     109    for (y=0; y<srcSliceH; y++) {\ 
    113110        dst_type *dst_1 = (dst_type*)(dst[0] + (y+srcSliceY  )*dstStride[0]);\ 
    114         dst_type *dst_2 = (dst_type*)(dst[0] + (y+srcSliceY+1)*dstStride[0]);\ 
    115111        dst_type av_unused *r, *b;\ 
    116112        dst_type *g;\ 
    117113        const uint8_t *py_1 = src[0] + y*srcStride[0];\ 
    118         const uint8_t *py_2 = py_1 + srcStride[0];\ 
    119         const uint8_t *pu = src[1] + (y>>1)*srcStride[1];\ 
    120         const uint8_t *pv = src[2] + (y>>1)*srcStride[2];\ 
    121         const uint8_t av_unused *pa_1, *pa_2;\ 
     114        const uint8_t *pu = src[1] + (y>>vshift)*srcStride[1];\ 
     115        const uint8_t *pv = src[2] + (y>>vshift)*srcStride[2];\ 
     116        const uint8_t av_unused *pa_1;\ 
    122117        unsigned int h_size = c->dstW>>3;\ 
    123118        if (alpha) {\ 
    124119            pa_1 = src[3] + y*srcStride[3];\ 
    125             pa_2 = pa_1 + srcStride[3];\ 
    126120        }\ 
    127121        while (h_size--) {\ 
    128122            int av_unused U, V;\ 
     
    132126            pu += 4;\ 
    133127            pv += 4;\ 
    134128            py_1 += 8;\ 
    135             py_2 += 8;\ 
    136129            dst_1 += dst_delta;\ 
    137             dst_2 += dst_delta;\ 
    138130        }\ 
    139131        if (c->dstW & 4) {\ 
    140132            int av_unused Y, U, V;\ 
     
    152144YUV2RGBFUNC(yuv2rgb_c_48, uint8_t, 0) 
    153145    LOADCHROMA(0); 
    154146    PUTRGB48(dst_1,py_1,0); 
    155     PUTRGB48(dst_2,py_2,0); 
    156147 
    157148    LOADCHROMA(1); 
    158     PUTRGB48(dst_2,py_2,1); 
    159149    PUTRGB48(dst_1,py_1,1); 
    160150 
    161151    LOADCHROMA(2); 
    162152    PUTRGB48(dst_1,py_1,2); 
    163     PUTRGB48(dst_2,py_2,2); 
    164153 
    165154    LOADCHROMA(3); 
    166     PUTRGB48(dst_2,py_2,3); 
    167155    PUTRGB48(dst_1,py_1,3); 
    168156ENDYUV2RGBLINE(48) 
    169157    LOADCHROMA(0); 
    170158    PUTRGB48(dst_1,py_1,0); 
    171     PUTRGB48(dst_2,py_2,0); 
    172159 
    173160    LOADCHROMA(1); 
    174     PUTRGB48(dst_2,py_2,1); 
    175161    PUTRGB48(dst_1,py_1,1); 
    176162ENDYUV2RGBFUNC() 
    177163 
    178164YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0) 
    179165    LOADCHROMA(0); 
    180166    PUTRGB(dst_1,py_1,0); 
    181     PUTRGB(dst_2,py_2,0); 
    182167 
    183168    LOADCHROMA(1); 
    184     PUTRGB(dst_2,py_2,1); 
    185169    PUTRGB(dst_1,py_1,1); 
    186170 
    187171    LOADCHROMA(2); 
    188172    PUTRGB(dst_1,py_1,2); 
    189     PUTRGB(dst_2,py_2,2); 
    190173 
    191174    LOADCHROMA(3); 
    192     PUTRGB(dst_2,py_2,3); 
    193175    PUTRGB(dst_1,py_1,3); 
    194176ENDYUV2RGBLINE(8) 
    195177    LOADCHROMA(0); 
    196178    PUTRGB(dst_1,py_1,0); 
    197     PUTRGB(dst_2,py_2,0); 
    198179 
    199180    LOADCHROMA(1); 
    200     PUTRGB(dst_2,py_2,1); 
    201181    PUTRGB(dst_1,py_1,1); 
    202182ENDYUV2RGBFUNC() 
    203183 
    204184YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1) 
    205185    LOADCHROMA(0); 
    206186    PUTRGBA(dst_1,py_1,pa_1,0,24); 
    207     PUTRGBA(dst_2,py_2,pa_2,0,24); 
    208187 
    209188    LOADCHROMA(1); 
    210     PUTRGBA(dst_2,py_2,pa_1,1,24); 
    211     PUTRGBA(dst_1,py_1,pa_2,1,24); 
     189    PUTRGBA(dst_1,py_1,pa_1,1,24); 
    212190 
    213191    LOADCHROMA(2); 
    214192    PUTRGBA(dst_1,py_1,pa_1,2,24); 
    215     PUTRGBA(dst_2,py_2,pa_2,2,24); 
    216193 
    217194    LOADCHROMA(3); 
    218     PUTRGBA(dst_2,py_2,pa_1,3,24); 
    219     PUTRGBA(dst_1,py_1,pa_2,3,24); 
     195    PUTRGBA(dst_1,py_1,pa_1,3,24); 
    220196    pa_1 += 8;\ 
    221     pa_2 += 8;\ 
    222197ENDYUV2RGBLINE(8) 
    223198    LOADCHROMA(0); 
    224199    PUTRGBA(dst_1,py_1,pa_1,0,24); 
    225     PUTRGBA(dst_2,py_2,pa_2,0,24); 
    226200 
    227201    LOADCHROMA(1); 
    228     PUTRGBA(dst_2,py_2,pa_1,1,24); 
    229     PUTRGBA(dst_1,py_1,pa_2,1,24); 
     202    PUTRGBA(dst_1,py_1,pa_1,1,24); 
    230203ENDYUV2RGBFUNC() 
    231204 
    232205YUV2RGBFUNC(yuva2argb_c, uint32_t, 1) 
    233206    LOADCHROMA(0); 
    234207    PUTRGBA(dst_1,py_1,pa_1,0,0); 
    235     PUTRGBA(dst_2,py_2,pa_2,0,0); 
    236208 
    237209    LOADCHROMA(1); 
    238     PUTRGBA(dst_2,py_2,pa_2,1,0); 
    239210    PUTRGBA(dst_1,py_1,pa_1,1,0); 
    240211 
    241212    LOADCHROMA(2); 
    242213    PUTRGBA(dst_1,py_1,pa_1,2,0); 
    243     PUTRGBA(dst_2,py_2,pa_2,2,0); 
    244214 
    245215    LOADCHROMA(3); 
    246     PUTRGBA(dst_2,py_2,pa_2,3,0); 
    247216    PUTRGBA(dst_1,py_1,pa_1,3,0); 
    248217    pa_1 += 8;\ 
    249     pa_2 += 8;\ 
    250218ENDYUV2RGBLINE(8) 
    251219    LOADCHROMA(0); 
    252220    PUTRGBA(dst_1,py_1,pa_1,0,0); 
    253     PUTRGBA(dst_2,py_2,pa_2,0,0); 
    254221 
    255222    LOADCHROMA(1); 
    256     PUTRGBA(dst_2,py_2,pa_2,1,0); 
    257223    PUTRGBA(dst_1,py_1,pa_1,1,0); 
    258224ENDYUV2RGBFUNC() 
    259225 
    260226YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0) 
    261227    LOADCHROMA(0); 
    262228    PUTRGB24(dst_1,py_1,0); 
    263     PUTRGB24(dst_2,py_2,0); 
    264229 
    265230    LOADCHROMA(1); 
    266     PUTRGB24(dst_2,py_2,1); 
    267231    PUTRGB24(dst_1,py_1,1); 
    268232 
    269233    LOADCHROMA(2); 
    270234    PUTRGB24(dst_1,py_1,2); 
    271     PUTRGB24(dst_2,py_2,2); 
    272235 
    273236    LOADCHROMA(3); 
    274     PUTRGB24(dst_2,py_2,3); 
    275237    PUTRGB24(dst_1,py_1,3); 
    276238ENDYUV2RGBLINE(24) 
    277239    LOADCHROMA(0); 
    278240    PUTRGB24(dst_1,py_1,0); 
    279     PUTRGB24(dst_2,py_2,0); 
    280241 
    281242    LOADCHROMA(1); 
    282     PUTRGB24(dst_2,py_2,1); 
    283243    PUTRGB24(dst_1,py_1,1); 
    284244ENDYUV2RGBFUNC() 
    285245 
     
    287247YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t, 0) 
    288248    LOADCHROMA(0); 
    289249    PUTBGR24(dst_1,py_1,0); 
    290     PUTBGR24(dst_2,py_2,0); 
    291250 
    292251    LOADCHROMA(1); 
    293     PUTBGR24(dst_2,py_2,1); 
    294252    PUTBGR24(dst_1,py_1,1); 
    295253 
    296254    LOADCHROMA(2); 
    297255    PUTBGR24(dst_1,py_1,2); 
    298     PUTBGR24(dst_2,py_2,2); 
    299256 
    300257    LOADCHROMA(3); 
    301     PUTBGR24(dst_2,py_2,3); 
    302258    PUTBGR24(dst_1,py_1,3); 
    303259ENDYUV2RGBLINE(24) 
    304260    LOADCHROMA(0); 
    305261    PUTBGR24(dst_1,py_1,0); 
    306     PUTBGR24(dst_2,py_2,0); 
    307262 
    308263    LOADCHROMA(1); 
    309     PUTBGR24(dst_2,py_2,1); 
    310264    PUTBGR24(dst_1,py_1,1); 
    311265ENDYUV2RGBFUNC() 
    312266 
    313267// This is exactly the same code as yuv2rgb_c_32 except for the types of 
    314 // r, g, b, dst_1, dst_2 
     268// r, g, b, dst_1 
    315269YUV2RGBFUNC(yuv2rgb_c_16, uint16_t, 0) 
    316270    LOADCHROMA(0); 
    317271    PUTRGB(dst_1,py_1,0); 
    318     PUTRGB(dst_2,py_2,0); 
    319272 
    320273    LOADCHROMA(1); 
    321     PUTRGB(dst_2,py_2,1); 
    322274    PUTRGB(dst_1,py_1,1); 
    323275 
    324276    LOADCHROMA(2); 
    325277    PUTRGB(dst_1,py_1,2); 
    326     PUTRGB(dst_2,py_2,2); 
    327278 
    328279    LOADCHROMA(3); 
    329     PUTRGB(dst_2,py_2,3); 
    330280    PUTRGB(dst_1,py_1,3); 
    331281CLOSEYUV2RGBFUNC(8) 
    332282 
    333283#if 0 // Currently unused 
    334284// This is exactly the same code as yuv2rgb_c_32 except for the types of 
    335 // r, g, b, dst_1, dst_2 
     285// r, g, b, dst_1 
    336286YUV2RGBFUNC(yuv2rgb_c_8, uint8_t, 0) 
    337287    LOADCHROMA(0); 
    338288    PUTRGB(dst_1,py_1,0); 
    339     PUTRGB(dst_2,py_2,0); 
    340289 
    341290    LOADCHROMA(1); 
    342     PUTRGB(dst_2,py_2,1); 
    343291    PUTRGB(dst_1,py_1,1); 
    344292 
    345293    LOADCHROMA(2); 
    346294    PUTRGB(dst_1,py_1,2); 
    347     PUTRGB(dst_2,py_2,2); 
    348295 
    349296    LOADCHROMA(3); 
    350     PUTRGB(dst_2,py_2,3); 
    351297    PUTRGB(dst_1,py_1,3); 
    352298CLOSEYUV2RGBFUNC(8) 
    353299#endif 
    354300 
    355 // r, g, b, dst_1, dst_2 
     301// r, g, b, dst_1 
    356302YUV2RGBFUNC(yuv2rgb_c_12_ordered_dither, uint16_t, 0) 
    357303    const uint8_t *d16 = dither_4x4_16[y&3]; 
    358304#define PUTRGB12(dst,src,i,o)                                   \ 
     
    363309 
    364310    LOADCHROMA(0); 
    365311    PUTRGB12(dst_1,py_1,0,0); 
    366     PUTRGB12(dst_2,py_2,0,0+8); 
    367312 
    368313    LOADCHROMA(1); 
    369     PUTRGB12(dst_2,py_2,1,2+8); 
    370314    PUTRGB12(dst_1,py_1,1,2); 
    371315 
    372316    LOADCHROMA(2); 
    373317    PUTRGB12(dst_1,py_1,2,4); 
    374     PUTRGB12(dst_2,py_2,2,4+8); 
    375318 
    376319    LOADCHROMA(3); 
    377     PUTRGB12(dst_2,py_2,3,6+8); 
    378320    PUTRGB12(dst_1,py_1,3,6); 
    379321CLOSEYUV2RGBFUNC(8) 
    380322 
    381 // r, g, b, dst_1, dst_2 
     323// r, g, b, dst_1 
    382324YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0) 
    383325    const uint8_t *d32 = dither_8x8_32[y&7]; 
    384326    const uint8_t *d64 = dither_8x8_73[y&7]; 
     
    390332 
    391333    LOADCHROMA(0); 
    392334    PUTRGB8(dst_1,py_1,0,0); 
    393     PUTRGB8(dst_2,py_2,0,0+8); 
    394335 
    395336    LOADCHROMA(1); 
    396     PUTRGB8(dst_2,py_2,1,2+8); 
    397337    PUTRGB8(dst_1,py_1,1,2); 
    398338 
    399339    LOADCHROMA(2); 
    400340    PUTRGB8(dst_1,py_1,2,4); 
    401     PUTRGB8(dst_2,py_2,2,4+8); 
    402341 
    403342    LOADCHROMA(3); 
    404     PUTRGB8(dst_2,py_2,3,6+8); 
    405343    PUTRGB8(dst_1,py_1,3,6); 
    406344CLOSEYUV2RGBFUNC(8) 
    407345 
     
    449387 
    450388    LOADCHROMA(0); 
    451389    PUTRGB4D(dst_1,py_1,0,0); 
    452     PUTRGB4D(dst_2,py_2,0,0+8); 
    453390 
    454391    LOADCHROMA(1); 
    455     PUTRGB4D(dst_2,py_2,1,2+8); 
    456392    PUTRGB4D(dst_1,py_1,1,2); 
    457393 
    458394    LOADCHROMA(2); 
    459395    PUTRGB4D(dst_1,py_1,2,4); 
    460     PUTRGB4D(dst_2,py_2,2,4+8); 
    461396 
    462397    LOADCHROMA(3); 
    463     PUTRGB4D(dst_2,py_2,3,6+8); 
    464398    PUTRGB4D(dst_1,py_1,3,6); 
    465399CLOSEYUV2RGBFUNC(4) 
    466400 
    467401#if 0 // Currently unused 
    468402// This is exactly the same code as yuv2rgb_c_32 except for the types of 
    469 // r, g, b, dst_1, dst_2 
     403// r, g, b, dst_1 
    470404YUV2RGBFUNC(yuv2rgb_c_4b, uint8_t, 0) 
    471405    LOADCHROMA(0); 
    472406    PUTRGB(dst_1,py_1,0); 
    473     PUTRGB(dst_2,py_2,0); 
    474407 
    475408    LOADCHROMA(1); 
    476     PUTRGB(dst_2,py_2,1); 
    477409    PUTRGB(dst_1,py_1,1); 
    478410 
    479411    LOADCHROMA(2); 
    480412    PUTRGB(dst_1,py_1,2); 
    481     PUTRGB(dst_2,py_2,2); 
    482413 
    483414    LOADCHROMA(3); 
    484     PUTRGB(dst_2,py_2,3); 
    485415    PUTRGB(dst_1,py_1,3); 
    486416CLOSEYUV2RGBFUNC(8) 
    487417#endif 
     
    498428 
    499429    LOADCHROMA(0); 
    500430    PUTRGB4DB(dst_1,py_1,0,0); 
    501     PUTRGB4DB(dst_2,py_2,0,0+8); 
    502431 
    503432    LOADCHROMA(1); 
    504     PUTRGB4DB(dst_2,py_2,1,2+8); 
    505433    PUTRGB4DB(dst_1,py_1,1,2); 
    506434 
    507435    LOADCHROMA(2); 
    508436    PUTRGB4DB(dst_1,py_1,2,4); 
    509     PUTRGB4DB(dst_2,py_2,2,4+8); 
    510437 
    511438    LOADCHROMA(3); 
    512     PUTRGB4DB(dst_2,py_2,3,6+8); 
    513439    PUTRGB4DB(dst_1,py_1,3,6); 
    514440CLOSEYUV2RGBFUNC(8) 
    515441 
    516442YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0) 
    517443        const uint8_t *d128 = dither_8x8_220[y&7]; 
    518         char out_1 = 0, out_2 = 0; 
     444        char out_1 = 0; 
    519445        g= c->table_gU[128] + c->table_gV[128]; 
    520446 
    521447#define PUTRGB1(out,src,i,o)    \ 
     
    525451    out+= out + g[Y+d128[1+o]]; 
    526452 
    527453    PUTRGB1(out_1,py_1,0,0); 
    528     PUTRGB1(out_2,py_2,0,0+8); 
    529454 
    530     PUTRGB1(out_2,py_2,1,2+8); 
    531455    PUTRGB1(out_1,py_1,1,2); 
    532456 
    533457    PUTRGB1(out_1,py_1,2,4); 
    534     PUTRGB1(out_2,py_2,2,4+8); 
    535458 
    536     PUTRGB1(out_2,py_2,3,6+8); 
    537459    PUTRGB1(out_1,py_1,3,6); 
    538460 
    539461    dst_1[0]= out_1; 
    540     dst_2[0]= out_2; 
    541462CLOSEYUV2RGBFUNC(1) 
    542463 
    543464SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) 
    544465{ 
    545466    SwsFunc t = NULL; 
    546467#if HAVE_MMX 
    547      t = ff_yuv2rgb_init_mmx(c); 
     468    t = ff_yuv2rgb_init_mmx(c); 
    548469#endif 
    549470#if HAVE_VIS 
    550471    t = ff_yuv2rgb_init_vis(c); 
  • libswscale/x86/yuv2rgb_template.c

     
    5050    if (h_size * depth > FFABS(dstStride[0]))                        \ 
    5151        h_size -= 8;                                                 \ 
    5252                                                                     \ 
    53     if (c->srcFormat == PIX_FMT_YUV422P) {                           \ 
    54         srcStride[1] *= 2;                                           \ 
    55         srcStride[2] *= 2;                                           \ 
    56     }                                                                \ 
     53    vshift = c->srcFormat == PIX_FMT_YUV420P;                        \ 
    5754                                                                     \ 
    5855    __asm__ volatile ("pxor %mm4, %mm4\n\t");                        \ 
    5956    for (y = 0; y < srcSliceH; y++) {                                \ 
    6057        uint8_t *image    = dst[0] + (y + srcSliceY) * dstStride[0]; \ 
    6158        const uint8_t *py = src[0] +               y * srcStride[0]; \ 
    62         const uint8_t *pu = src[1] +        (y >> 1) * srcStride[1]; \ 
    63         const uint8_t *pv = src[2] +        (y >> 1) * srcStride[2]; \ 
     59        const uint8_t *pu = src[1] +   (y >> vshift) * srcStride[1]; \ 
     60        const uint8_t *pv = src[2] +   (y >> vshift) * srcStride[2]; \ 
    6461        x86_reg index = -h_size / 2;                                 \ 
    6562 
    6663#define YUV2RGB_INITIAL_LOAD          \ 
     
    193190                                       int srcSliceY, int srcSliceH, 
    194191                                       uint8_t *dst[], int dstStride[]) 
    195192{ 
    196     int y, h_size; 
     193    int y, h_size, vshift; 
    197194 
    198195    YUV2RGB_LOOP(2) 
    199196 
     
    221218                                       int srcSliceY, int srcSliceH, 
    222219                                       uint8_t *dst[], int dstStride[]) 
    223220{ 
    224     int y, h_size; 
     221    int y, h_size, vshift; 
    225222 
    226223    YUV2RGB_LOOP(2) 
    227224 
     
    310307                                       int srcSliceY, int srcSliceH, 
    311308                                       uint8_t *dst[], int dstStride[]) 
    312309{ 
    313     int y, h_size; 
     310    int y, h_size, vshift; 
    314311 
    315312    YUV2RGB_LOOP(3) 
    316313 
     
    328325                                       int srcSliceY, int srcSliceH, 
    329326                                       uint8_t *dst[], int dstStride[]) 
    330327{ 
    331     int y, h_size; 
     328    int y, h_size, vshift; 
    332329 
    333330    YUV2RGB_LOOP(3) 
    334331 
     
    371368                                       int srcSliceY, int srcSliceH, 
    372369                                       uint8_t *dst[], int dstStride[]) 
    373370{ 
    374     int y, h_size; 
     371    int y, h_size, vshift; 
    375372 
    376373    YUV2RGB_LOOP(4) 
    377374 
     
    392389                                        uint8_t *dst[], int dstStride[]) 
    393390{ 
    394391#if HAVE_7REGS 
    395     int y, h_size; 
     392    int y, h_size, vshift; 
    396393 
    397394    YUV2RGB_LOOP(4) 
    398395 
     
    414411                                       int srcSliceY, int srcSliceH, 
    415412                                       uint8_t *dst[], int dstStride[]) 
    416413{ 
    417     int y, h_size; 
     414    int y, h_size, vshift; 
    418415 
    419416    YUV2RGB_LOOP(4) 
    420417 
     
    435432                                        uint8_t *dst[], int dstStride[]) 
    436433{ 
    437434#if HAVE_7REGS 
    438     int y, h_size; 
     435    int y, h_size, vshift; 
    439436 
    440437    YUV2RGB_LOOP(4) 
    441438