yv12_to_rgb

这是一个C语言实现的YV12到RGB色彩空间转换的函数,用于处理视频帧数据。函数通过遍历YV12格式的图像数据,应用色彩转换公式将YUV值转换为RGB,并使用CLIP宏确保像素值在0-255之间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define CLIP(value) (uchar)(((value)>0xFF)?0xff:(((value)<0)?0:(value)))

int yv12_to_rgb(uchar *yv12, uchar *rgb, uint width,uint height)
{
    uchar *py;
    uchar *pu;
    uchar *pv;//此部分注释见另一篇yuyv_to_yv12
    uint linesize = width * 3;
    uint uvlinesize = width / 2;
    uint offset=0;
    uint offset1=0;
    uint offsety=0;
    uint offsety1=0;
    uint offsetuv=0;

    py = yv12;
    pv = py+(width*height);
    pu = pv+((width*height)/4);

    uint h=0;
    uint w=0;

    uint wy=0;
    uint huv=0;
    uint wuv=0;

    for(h=0;h<height;h+=2)
    {
        wy=0;
        wuv=0;
        offset = h * linesize;
        offset1 = (h + 1) * linesize;
        offsety = h * width;
        offsety1 = (h + 1) * width;
        offsetuv = huv * uvlinesize;

        for(w=0;w<linesize;w+=6)
        {
            /* standart: r = y0 + 1.402 (v-128) */
            /* logitech: r = y0 + 1.370705 (v-128) */
            rgb[w + offset] = CLIP(py[wy + offsety] + 1.402 * (pv[wuv + offsetuv]-128));
            /* standart: g = y0 - 0.34414 (u-128) - 0.71414 (v-128)*/
            /* logitech: g = y0 - 0.337633 (u-128)- 0.698001 (v-128)*/
            rgb[(w + 1) + offset] = CLIP(py[wy + offsety] - 0.34414 * (pu[wuv + offsetuv]-128) -0.71414*(pv[wuv + offsetuv]-128));
            /* standart: b = y0 + 1.772 (u-128) */
            /* logitech: b = y0 + 1.732446 (u-128) */
            rgb[(w + 2) + offset] = CLIP(py[wy + offsety] + 1.772 *(pu[wuv + offsetuv]-128));

            rgb[(w + 3) + offset] = CLIP(py[wy + 1 + offsety] + 1.402 * (pv[wuv + offsetuv]-128));
            rgb[(w + 4) + offset] = CLIP(py[wy +1  + offsety] - 0.34414 * (pu[wuv + offsetuv]-128) -0.71414*(pv[wuv + offsetuv]-128));
            rgb[(w + 5) + offset] = CLIP(py[wy + 1 + offsety] + 1.772 *(pu[wuv + offsetuv]-128));

            rgb[w + offset1] = CLIP(py[wy + offsety1] + 1.402 * (pv[wuv + offsetuv]-128));
            rgb[(w + 1) + offset1] = CLIP(py[wy + offsety1] - 0.34414 * (pu[wuv + offsetuv]-128) -0.71414*(pv[wuv + offsetuv]-128));
            rgb[(w + 2) + offset1] = CLIP(py[wy + offsety1] + 1.772 *(pu[wuv + offsetuv]-128));

            rgb[(w + 3) + offset1] = CLIP(py[wy + 1 + offsety1] + 1.402 * (pv[wuv + offsetuv]-128));
            rgb[(w + 4) + offset1] = CLIP(py[wy + 1 + offsety1] - 0.34414 * (pu[wuv + offsetuv]-128) -0.71414*(pv[wuv + offsetuv]-128));
            rgb[(w + 5) + offset1] = CLIP(py[wy + 1 + offsety1] + 1.772 *(pu[wuv + offsetuv]-128));

            wuv++;
            wy+=2;
        }
        huv++;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值