⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 5 页
字号:
   b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u) >> SCALEBITS_OUT);
   g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv) >> SCALEBITS_OUT);
   r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v) >> SCALEBITS_OUT);
   *(uint16_t *) (x_ptr+((ROW)*x_stride)+0) = C1::MK(r[ROW], g[ROW], b[ROW]);
   rgb_y = YUV_RGB_DATA<CCIR>::RGB_Y_tab[ y_ptr[y_stride*(ROW) + 1] ];
   b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u) >> SCALEBITS_OUT);
   g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv) >> SCALEBITS_OUT);
   r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v) >> SCALEBITS_OUT);
   *(uint16_t *) (x_ptr+((ROW)*x_stride)+2) = C1::MK(r[ROW], g[ROW], b[ROW]);
  }

 template<int ROW> static __forceinline void READ_RGB16_Y(uint8_t *x_ptr,stride_t x_stride,
                                                          uint8_t *y_ptr,stride_t y_stride,
                                                          uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
  {
   uint32_t rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 0);
   b0 += b = C1::B(rgb);
   g0 += g = C1::G(rgb);
   r0 += r = C1::R(rgb);
   y_ptr[(ROW)*y_stride+0] =
           (uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
                                   FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
   rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2);
   b0 += b = C1::B(rgb);
   g0 += g = C1::G(rgb);
   r0 += r = C1::R(rgb);
   y_ptr[(ROW)*y_stride+1] =
           (uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
                                   FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
  }
 template<int ROW,int UV_ROW> static __forceinline void READ_RGB16_UV(uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                                           uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
  {
   u_ptr[(UV_ROW)*uv_stride] =
           (uint8_t)((uint8_t) ((-FIX_IN(YUV_RGB_DATA<CCIR>::U_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::U_G_IN) * g0 +
                                   FIX_IN(YUV_RGB_DATA<CCIR>::U_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::U_ADD_IN);
   v_ptr[(UV_ROW)*uv_stride] =
           (uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::V_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::V_G_IN) * g0 -
                                   FIX_IN(YUV_RGB_DATA<CCIR>::V_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::V_ADD_IN);
  }

 template<int ROW> static __forceinline void WRITE_RGB(uint8_t *x_ptr,stride_t x_stride,
                                                       uint8_t *y_ptr,stride_t y_stride,
                                                       int r[2],int g[2],int b[2],
                                                       const int b_u,const int g_uv,const int r_v)
  {
   int rgb_y = YUV_RGB_DATA<CCIR>::RGB_Y_tab[ y_ptr[(ROW)*y_stride + 0] ];
   x_ptr[(ROW)*x_stride+(C3)] = limit_uint8((rgb_y + b_u) >> SCALEBITS_OUT);
   x_ptr[(ROW)*x_stride+(C2)] = limit_uint8((rgb_y - g_uv) >> SCALEBITS_OUT);
   x_ptr[(ROW)*x_stride+(C1::value)] = limit_uint8((rgb_y + r_v) >> SCALEBITS_OUT);
   if ((SIZE)>3) x_ptr[(ROW)*x_stride+(C4)] = 0;
   rgb_y = YUV_RGB_DATA<CCIR>::RGB_Y_tab[ y_ptr[(ROW)*y_stride + 1] ];
   x_ptr[(ROW)*x_stride+(SIZE)+(C3)] = limit_uint8((rgb_y + b_u) >> SCALEBITS_OUT);
   x_ptr[(ROW)*x_stride+(SIZE)+(C2)] = limit_uint8((rgb_y - g_uv) >> SCALEBITS_OUT);
   x_ptr[(ROW)*x_stride+(SIZE)+(C1::value)] = limit_uint8((rgb_y + r_v) >> SCALEBITS_OUT);
   if ((SIZE)>3) x_ptr[(ROW)*x_stride+(SIZE)+(C4)] = 0;
  }

 template<int ROW> static __forceinline void READ_RGB_Y(uint8_t *x_ptr,stride_t x_stride,
                                                          uint8_t *y_ptr,stride_t y_stride,
                                                          uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
  {
   r0 += r = x_ptr[(ROW)*x_stride+(C1::value)];
   g0 += g = x_ptr[(ROW)*x_stride+(C2)];
   b0 += b = x_ptr[(ROW)*x_stride+(C3)];
   y_ptr[(ROW)*y_stride+0] =
           (uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
                                   FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
   r0 += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1::value)];
   g0 += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)];
   b0 += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)];
   y_ptr[(ROW)*y_stride+1] =
           (uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
                   FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
  }

 template<int ROW,int UV_ROW> static __forceinline void READ_RGB_UV(uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                                           uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
  {
        u_ptr[(UV_ROW)*uv_stride] =
                (uint8_t)((uint8_t) ((-FIX_IN(YUV_RGB_DATA<CCIR>::U_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::U_G_IN) * g0 +
                                        FIX_IN(YUV_RGB_DATA<CCIR>::U_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::U_ADD_IN);
        v_ptr[(UV_ROW)*uv_stride] =
                (uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::V_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::V_G_IN) * g0 -
                                        FIX_IN(YUV_RGB_DATA<CCIR>::V_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::V_ADD_IN);
  }

 struct YV12_TO_RGB16
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
     r[0] = r[1] = g[0] = g[1] = b[0] = b[1] = 0;
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
     int b_u = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
     int g_uv = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
     int r_v = YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
     WRITE_RGB16<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
     WRITE_RGB16<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
    }
  };

 struct YV12_TO_RGB16I
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
     r[0] = r[1] = r[2] = r[3] = 0;
     g[0] = g[1] = g[2] = g[3] = 0;
     b[0] = b[1] = b[2] = b[3] = 0;
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
     int b_u0 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
     int g_uv0 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
     int r_v0 = YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
     int b_u1=0,g_uv1=0,r_v1=0;
     WRITE_RGB16<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
     if(full)
      {
       b_u1 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[uv_stride] ];
       g_uv1 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[uv_stride] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[uv_stride] ];
       r_v1 = YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[uv_stride] ];
       WRITE_RGB16<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
       WRITE_RGB16<2>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
       WRITE_RGB16<3>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
      }
     else
      WRITE_RGB16<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
    }
  };

 struct YV12_TO_RGB
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
     {
      int b_u = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
      int g_uv = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
      int r_v= YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
      WRITE_RGB<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
      WRITE_RGB<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
     }
  };

 struct YV12_TO_RGBI
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
     int b_u0 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
     int g_uv0 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
     int r_v0= YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
     int b_u1=0,g_uv1=0,r_v1=0;

     WRITE_RGB<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
     if(full) // Without flag(full), it crashes when input size is not multiple of 4.
      {
       b_u1 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[uv_stride] ];
       g_uv1 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[uv_stride] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[uv_stride] ];
       r_v1= YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[uv_stride] ];
       WRITE_RGB<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
       WRITE_RGB<2>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
       WRITE_RGB<3>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
      }
     else
      WRITE_RGB<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
    }
  };

 template<int ROW,int UV_ROW> static __forceinline void WRITE_YUYV(uint8_t *x_ptr,stride_t x_stride,uint8_t *y_ptr,stride_t y_stride,uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride)
  {
   x_ptr[(ROW)*x_stride+(C1::value)] = y_ptr[   (ROW)*y_stride +0];
   x_ptr[(ROW)*x_stride+(C2)] = u_ptr[(UV_ROW)*uv_stride+0];
   x_ptr[(ROW)*x_stride+(C3)] = y_ptr[   (ROW)*y_stride +1];
   x_ptr[(ROW)*x_stride+(C4)] = v_ptr[(UV_ROW)*uv_stride+0];
  }

 struct YV12_TO_YUYV
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
     WRITE_YUYV<0, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
     WRITE_YUYV<1, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
    }
  };

 template<int ROW> static __forceinline void READ_YUYV_Y(uint8_t *y_ptr,stride_t y_stride,uint8_t *x_ptr,stride_t x_stride)
  {
   y_ptr[(ROW)*y_stride+0] = x_ptr[(ROW)*x_stride+(C1::value)];
   y_ptr[(ROW)*y_stride+1] = x_ptr[(ROW)*x_stride+(C3)];
  }
 template<int UV_ROW,int ROW1,int ROW2> static __forceinline void READ_YUYV_UV(uint8_t *x_ptr,stride_t x_stride,uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride)
  {
   u_ptr[(UV_ROW)*uv_stride] = (uint8_t)((x_ptr[(ROW1)*x_stride+(C2)] + x_ptr[(ROW2)*x_stride+(C2)] + 1) / 2);
   v_ptr[(UV_ROW)*uv_stride] = (uint8_t)((x_ptr[(ROW1)*x_stride+(C4)] + x_ptr[(ROW2)*x_stride+(C4)] + 1) / 2);
  }

 struct YV12_TO_YUYVI
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
     WRITE_YUYV<0, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
     WRITE_YUYV<1, 1>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
     WRITE_YUYV<2, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
     WRITE_YUYV<3, 1>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
    }
  };

 struct YUYV_TO_YV12
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
        READ_YUYV_Y<0>(y_ptr,y_stride,x_ptr,x_stride);
        READ_YUYV_Y<1>(y_ptr,y_stride,x_ptr,x_stride);
        READ_YUYV_UV<0, 0,1>(x_ptr,x_stride,u_ptr,v_ptr,uv_stride);
    }
  };
 struct YUYVI_TO_YV12
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
                                     uint8_t *y_ptr,stride_t y_stride,
                                     uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
                                     int r[4],int g[4],int b[4],
                                     bool full=true)
    {
     READ_YUYV_Y<0>(y_ptr,y_stride,x_ptr,x_stride);
     READ_YUYV_Y<1>(y_ptr,y_stride,x_ptr,x_stride);
     READ_YUYV_Y<2>(y_ptr,y_stride,x_ptr,x_stride);
     READ_YUYV_Y<3>(y_ptr,y_stride,x_ptr,x_stride);
     READ_YUYV_UV<0, 0,2>(x_ptr,x_stride,u_ptr,v_ptr,uv_stride);
     READ_YUYV_UV<1, 1,3>(x_ptr,x_stride,u_ptr,v_ptr,uv_stride);
    }
  };

 struct RGB16_TO_YV12
  {
   static __forceinline void ROW(int r[4],int g[4],int b[4])
    {
    }
   static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -