Ticket #143: yuv422p_to_rgb.patch

File yuv422p_to_rgb.patch, 12.8 KB (added by Peter B., 15 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