ffmpeg:sws_scale在RGB到YUV420转换期间在平面V中返回错误值

ffmpeg: sws_scale returning wrong values in plane V during RGB to YUV420 conversion

本文关键字:平面 错误 返回 YUV420 sws scale RGB ffmpeg 转换      更新时间:2023-10-16

我正在尝试使用sws_scale将图像从RGB转换为YUV420P。我在C++中使用的代码如下:

SwsContext *swscontext = sws_getContext(current_width,
                                        current_height,
                                        PIX_FMT_RGB24,
                                        current_width,
                                        current_height,
                                        PIX_FMT_YUV420P,
                                        SWS_FAST_BILINEAR,
                                        NULL,
                                        NULL,
                                        NULL);
const int srcstride[3] = {current_width * 3, 0, 0};
BYTE *data_pos[3] = {data, NULL, NULL};
BYTE *dest[3] = {yuv,
                yuv + current_width * current_height,
                yuv + (current_width * current_height) 
                    + ((current_width * current_height) / 2)};
const int dststride[3] = {current_width, current_width / 2, current_width / 2};
sws_scale(swscontext, data_pos, srcstride, 0, current_height,
          dest, dststride);

Y和U平面被正确编码,但V平面完全用值0x80写入。我想知道我是否做错了什么。

我仍然不知道它为什么能工作,但这解决了问题:

BYTE *dest[3] = {yuv,
                 yuv + current_width * current_height,
                 yuv + (current_width * current_height) 
                     + ((current_width >> 1) * (current_height >> 1))};

从语义上讲,它们是一样的,所以我将保留这个问题,以防有人提出解释。