jni中 YV12转ARGB 与 NV21转ARGB

来源:互联网 发布:马龙职业生涯数据 编辑:程序博客网 时间:2024/05/02 00:30

注意一点,“>>"和"<<" 移位操作符的运行优先级  比加减法低
void JNICALL Java_com_ym_camera_LibBlurModule_YV12toRBGA
  (JNIEnv * env, jclass obj, jbyteArray yuv420sp, jint width, jint height, jintArray rgbOut){
      int sz;
      int i;
      int j;
      int Y;
      int Cr = 0;//v
      int Cb = 0;//u
      int pixPtr = 0;
      int jDiv2 = 0;


      int R = 0;
      int G = 0;
      int B = 0;
      int cOffCr;//v
      int cOffCb;//u


      int w = width;int h = height;
      sz = w * h;
     
      jint *rgbData = (jint*) ((*env)->GetPrimitiveArrayCritical(env, rgbOut, 0));
      jbyte* yuv = (jbyte*) (*env)->GetPrimitiveArrayCritical(env, yuv420sp, 0);
      for(j = 0; j < h; j++) {
          pixPtr = j * w;
          jDiv2 = j >> 1;
           
          for(i = 0; i < w; i++) {


              Y = yuv[pixPtr];
              if(Y < 0) {
                  Y += 255;
              }
              if((i & 0x1) != 1) {//024
                  if(cOffCb >(sz+(sz>>1))){
                    
                  }
                  cOffCb = sz + ((jDiv2 * w)>>1) + (i >> 1) * 1;
                  cOffCr = cOffCb + (sz>>2);
                  Cb = yuv[cOffCb];
                  if(Cb < 0)
                  {
                      Cb += 127;
                  }
                  else{
                      Cb -= 128;
                  }
                  Cr = yuv[cOffCr];
                  if(Cr < 0)
                  {
                      Cr += 127;
                  }
                  else{
                      Cr -= 128;
                  }
              }
               R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
               if(R < 0) {
                  R = 0;
               }
               else if(R > 255) {
                  R = 255;
               }
               G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
               if(G < 0) {
                  G = 0;
               }
               else if(G > 255) {
                  G = 255;
               }
               B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
               if(B < 0) {
                  B = 0;
               }
               else if(B > 255) {
                  B = 255;
               }
              rgbData[pixPtr++] = 0xff000000 + (R << 16) + (G << 8) + B;
           }
      }


       (*env)->ReleasePrimitiveArrayCritical(env, rgbOut, rgbData, 0);
       (*env)->ReleasePrimitiveArrayCritical(env, yuv420sp, yuv, 0);
  }



void JNICALL Java_com_ym_camera_LibBlurModule_NV21toRBGA
  (JNIEnv * env, jclass obj, jbyteArray yuv420sp, jint width, jint height, jintArray rgbOut)
  {
    int sz;
    int i;
    int j;
    int Y;
    int Cr = 0;
    int Cb = 0;
    int pixPtr = 0;
    int jDiv2 = 0;


    int R = 0;
    int G = 0;
    int B = 0;
    int cOff;


    int w = width;int h = height;
    sz = w * h;
    jint *rgbData = (jint*) ((*env)->GetPrimitiveArrayCritical(env, rgbOut, 0));
    jbyte* yuv = (jbyte*) (*env)->GetPrimitiveArrayCritical(env, yuv420sp, 0);
    for(j = 0; j < h; j++) {
        pixPtr = j * w;
        jDiv2 = j >> 1;
        for(i = 0; i < w; i++) {
            Y = yuv[pixPtr];
            if(Y < 0) {
                Y += 255;
            }
            if((i & 0x1) != 1) {
                cOff = sz + jDiv2 * w + (i >> 1) * 2;
                Cb = yuv[cOff];
                if(Cb < 0)
                {
                    Cb += 127;
                }
                else{
                    Cb -= 128;
                }
                Cr = yuv[cOff + 1];
                if(Cr < 0)
                {
                    Cr += 127;
                }
                else{
                    Cr -= 128;
                }
            }
             R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
             if(R < 0) {
                R = 0;
             }
             else if(R > 255) {
                R = 255;
             }
             G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
             if(G < 0) {
                G = 0;
             }
             else if(G > 255) {
                G = 255;
             }
             B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
             if(B < 0) {
                B = 0;
             }
             else if(B > 255) {
                B = 255;
             }
            //rgbData[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
            rgbData[pixPtr++] = 0xff000000 + (R << 16) + (G << 8) + B;
         }
    }
     //gaussBlur(rgbData,width,height,3);
     (*env)->ReleasePrimitiveArrayCritical(env, rgbOut, rgbData, 0);
     (*env)->ReleasePrimitiveArrayCritical(env, yuv420sp, yuv, 0);
  }