RGBA output images have their alpha values set to 0 (fully transparent)
delthas <[email protected]> Wed, 29 May 2019 16:21:27 +0800
| Newsgroups | gmane.comp.video.xvid.devel |
|---|---|
| Message-ID | <[email protected]> |
Hey, I noticed that when decoding a frame to the XVID_CSP_RGBA color space, the alpha values of all pixels are set to 0. In the RGBA color space an alpha value of 0 means fully transparent and 255 means fully opaque, so the decoder effectively returns an image that is fully transparent: the RGB values are correct but all the pixels are fully transparent. Setting the alpha to 0 is done in src/image/colorspace.c, in the WRITE_RGB macro (at line 389 in the current revision, 2176). The code is as follows: ===== #define WRITE_RGB(SIZE,ROW,UV_ROW,C1,C2,C3,C4) \ rgb_y = RGB_Y_tab[ y_ptr[(ROW)*y_stride + 0] ]; \ x_ptr[(ROW)*x_stride+(C3)] = MAX(0, MIN(255, (rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(C2)] = MAX(0, MIN(255, (rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(C1)] = MAX(0, MIN(255, (rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT)); \ if ((SIZE)>3) x_ptr[(ROW)*x_stride+(C4)] = 0; \ rgb_y = RGB_Y_tab[ y_ptr[(ROW)*y_stride + 1] ]; \ x_ptr[(ROW)*x_stride+(SIZE)+(C3)] = MAX(0, MIN(255, (rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(SIZE)+(C2)] = MAX(0, MIN(255, (rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(SIZE)+(C1)] = MAX(0, MIN(255, (rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT)); \ if ((SIZE)>3) x_ptr[(ROW)*x_stride+(SIZE)+(C4)] = 0; ===== The lines responsible for setting the value to 0 are: if ((SIZE)>3) x_ptr[(ROW)*x_stride+(C4)] = 0; and if ((SIZE)>3) x_ptr[(ROW)*x_stride+(SIZE)+(C4)] = 0; The values 0 could be replaced by 255 to output fully opaque data rather than fully transparent data. It seems to me that outputting fully transparent data is a bug and that the alpha values should be set to 255 instead. Is it the case, or is this intended? A simple diff is provided below in case this is actually a bug. Thanks, delthas Index: xvidcore/src/image/colorspace.c =================================================================== --- xvidcore/src/image/colorspace.c (revision 2176) +++ xvidcore/src/image/colorspace.c (working copy) @@ -391,12 +391,12 @@ x_ptr[(ROW)*x_stride+(C3)] = MAX(0, MIN(255, (rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(C2)] = MAX(0, MIN(255, (rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(C1)] = MAX(0, MIN(255, (rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT)); \ - if ((SIZE)>3) x_ptr[(ROW)*x_stride+(C4)] = 0; \ + if ((SIZE)>3) x_ptr[(ROW)*x_stride+(C4)] = 255; \ rgb_y = RGB_Y_tab[ y_ptr[(ROW)*y_stride + 1] ]; \ x_ptr[(ROW)*x_stride+(SIZE)+(C3)] = MAX(0, MIN(255, (rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(SIZE)+(C2)] = MAX(0, MIN(255, (rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT)); \ x_ptr[(ROW)*x_stride+(SIZE)+(C1)] = MAX(0, MIN(255, (rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT)); \ - if ((SIZE)>3) x_ptr[(ROW)*x_stride+(SIZE)+(C4)] = 0; + if ((SIZE)>3) x_ptr[(ROW)*x_stride+(SIZE)+(C4)] = 255;