首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libVPX转换VPX_IMG_FMT_I420 -> RGB

libVPX转换VPX_IMG_FMT_I420 -> RGB
EN

Stack Overflow用户
提问于 2015-03-29 09:49:39
回答 1查看 854关注 0票数 2

如何将VPX_IMG_FMT_I420 vpx_image_t转换为RGB?

示例代码:

代码语言:javascript
复制
int DecodeFrame()
{
  vpx_video_reader_read_frame(reader);
  vpx_codec_iter_t iter = NULL;
  vpx_image_t *img = NULL;
  size_t frame_size = 0;
  const unsigned char *frame = vpx_video_reader_get_frame(reader, &frame_size);
  if (vpx_codec_decode(&codec, frame, (unsigned int)frame_size, NULL, 0)) return 0;

  img = vpx_codec_get_frame(&codec, &iter);

// here I need to convert img to RGB array

  return 1;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 10:19:31

uTox代码

代码语言:javascript
复制
void yuv420tobgr(uint16_t width, uint16_t height, 
                 const uint8_t *y, const uint8_t *u, const uint8_t *v,
                 unsigned int ystride, 
                 unsigned int ustride, 
                 unsigned int vstride, 
                 uint8_t *out)
{
    unsigned long int i, j;
    for (i = 0; i < height; ++i) {
        for (j = 0; j < width; ++j) {
            uint8_t *point = out + 4 * ((i * width) + j);
            int t_y = y[((i * ystride) + j)];
            int t_u = u[(((i / 2) * ustride) + (j / 2))];
            int t_v = v[(((i / 2) * vstride) + (j / 2))];
            t_y = t_y < 16 ? 16 : t_y;

            int r = (298 * (t_y - 16) + 409 * (t_v - 128) + 128) >> 8;
            int g = (298 * (t_y - 16) - 100 * (t_u - 128) - 208 * (t_v - 128) + 128) >> 8;
            int b = (298 * (t_y - 16) + 516 * (t_u - 128) + 128) >> 8;

            point[2] = r>255? 255 : r<0 ? 0 : r;
            point[1] = g>255? 255 : g<0 ? 0 : g;
            point[0] = b>255? 255 : b<0 ? 0 : b;
            point[3] = ~0;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29327705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档