zoukankan      html  css  js  c++  java
  • YUV420 转 RGB 测试

    逐像素浮点运算转换的,很慢,目测 1080p 只有 12fps 左右

    sws_scale(img_convert_context, (const unsigned char *const *)p_frame->data, p_frame->linesize, 0, p_codec_context->height,
    						  p_frame_yuv->data, p_frame_yuv->linesize);
    
    // SDL_UpdateYUVTexture(sdl_texture, &sdl_rect,
    // 					 p_frame_yuv->data[0], p_frame_yuv->linesize[0],
    // 					 p_frame_yuv->data[1], p_frame_yuv->linesize[1],
    // 					 p_frame_yuv->data[2], p_frame_yuv->linesize[2]);
    
    size_t image_h = p_codec_context->height;
    size_t image_w = p_codec_context->width;
    
    Image image(image_w, image_h);
    
    for (int y = 0; y < image_h; y++)
    {
        for (int x = 0; x < image_w; x++)
        {
            int y2 = y / 2;
            int x2 = x / 2;
    
            uint8_t Y = p_frame_yuv->data[0][y * p_frame_yuv->linesize[0] + x];
            uint8_t Cb = p_frame_yuv->data[1][y2 * p_frame_yuv->linesize[1] + x2];
            uint8_t Cr = p_frame_yuv->data[2][y2 * p_frame_yuv->linesize[2] + x2];
    
            uint8_t R = Y + 1.402 * (Cr - 128);
            uint8_t G = Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr - 128);
            uint8_t B = Y + 1.772 * (Cb - 128);
    
            image.Set(x, y, {R, G, B});
        }
    }
    
    uint8_t *pixels = new uint8_t[image_h * image_w * 4];
    for (int y = 0; y < image_h; y++)
    {
        for (int x = 0; x < image_w; x++)
        {
            vec3 vec = image.Get(x, y);
    
            uint8_t r = vec.x;
            uint8_t g = vec.y;
            uint8_t b = vec.z;
    
            pixels[y * image_w * 4 + x * 4 + 0] = 0;
            pixels[y * image_w * 4 + x * 4 + 1] = b;
            pixels[y * image_w * 4 + x * 4 + 2] = g;
            pixels[y * image_w * 4 + x * 4 + 3] = r;
        }
    }
    
    SDL_UpdateTexture(sdl_texture, &sdl_rect, pixels, image_w * 4);
    
    delete[] pixels;
    
    SDL_RenderClear(sdl_renderer);
    SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, &sdl_rect);
    SDL_RenderPresent(sdl_renderer);
    // SDL_Delay(10);
    
    
  • 相关阅读:
    【】C# Sealed、new、virtual、abstract、override的理解
    【】C# Sealed、new、virtual、abstract、override的理解
    C#中的堆和栈理解
    C#中的堆和栈理解
    C#中的堆和栈理解
    C#编译和运行过程图例
    C#编译和运行过程图例
    C#编译和运行过程图例
    【codeforces 257D】Sum
    【codeforces 348B】Apple Tree
  • 原文地址:https://www.cnblogs.com/mollnn/p/14445998.html
Copyright © 2011-2022 走看看