회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

SAA7113에서 SAA7111로 결정했습니다.

YUV에서 RGB로 변환하는 과정이 PXA255에서 버겁다고 판단하고 바로 RGB16비트 출력이 나오는 칩으로 결정했습니다.
어차피 데이터는 저장용이 아니고 바로 디스플레이 할놈이라서요.

아래는 간단한 변환코드인데 참고용입니다.
전체는 보지 마시고 이렇게 YUV<=>RGB를 하는구나만 느끼시면 됩니다.

난중에는 7113가지고도 실험해볼 예정입니다.

아무래도 압축된데이터가 저장등에 유리하리라 생각이 되서요.

테스트 완료하면 결과 올리겠습니다.

if (strcmp("plug_in_rgb_yuv",name) == 0)
    {
      // RGB -> YUV
      // !!! Warning !!! Duplicated code... 'cause it'is quick'n dirty :)
        gimp_progress_init("Converting RGB to YUV...");
        progress = 0;

        // Process
        gimp_pixel_rgn_init (&dest_rgn, drawable, sel_x1, sel_y1,
                             (sel_x2-sel_x1), (sel_y2-sel_y1), TRUE, TRUE);
        gimp_pixel_rgn_init (&src_rgn, drawable, sel_x1, sel_y1,
                              (sel_x2-sel_x1), (sel_y2-sel_y1), FALSE, FALSE);

        // Methode de traitement par dest_rgns -----------------------
        for (pr = gimp_pixel_rgns_register (2, &src_rgn, &dest_rgn);
             pr != NULL;
             pr = gimp_pixel_rgns_process (pr))
         { //Fun Goes On Here
           dest_row = dest_rgn.data;
           src_row = src_rgn.data;
           for (row = 0; row < dest_rgn.h; row++) {
             dest = dest_row;
             src = src_row;
             for (col = 0; col < dest_rgn.w; col++) {

               // Début du traitement spécifique *************
               r = *src++; //y
               g = *src++; //u
               b = *src++; //v
               if (img_has_alpha)       a = *src++;

               /* First set of formula, probably not the best... ----
               y =   (0.257*r) + (0.504*g) + (0.098*b) + 16;
               u =   (0.439*r) - (0.368*g) + (0.071*b) + 128;
               v = - (0.148*r) - (0.291*g) + (0.439*b) + 128;

               // YUV->RGB
               // r = 1.164 * (y-16) + 1.596*(v-128);
               // g = 1.164 * (y-16) + 0.813*(v-128) - 0.391*(u-128);
               // b = 1.164 * (y-16) + 2.018*(u-128);
               */

               /* Second set, not much better...*/
               y =   (0.299*r) + (0.587*g) + (0.114*b);
               u =  -(0.169*r) - (0.331*g) + (0.500*b) + 128.0;
               v =   (0.500*r) - (0.419*g) - (0.081*b) + 128.0;

               // YUV->RGB^M
               //r = y + 1.402*(v-128.0);
               //g = y - 0.34414*(u-128.0) + 0.71414*(v-128.0);
               //b = y + 1.772*(u-128.0);
               //
                           // From SciLab : This is the good one.
                           //r = 1 * y -  0.0009267*(u-128)  + 1.4016868*(v-128);^M
                           //g = 1 * y -  0.3436954*(u-128)  - 0.7141690*(v-128);^M
                           //b = 1 * y +  1.7721604*(u-128)  + 0.0009902*(v-128);^M

               /** Third : home-made...*/
                           /*y = 0.333 * r + 0.333 * g + 0.333 * b;
                           u = r - y;
                           v = g - y;
                           r = y + u;
                           g = y + v;
                           b = y -u -v;
                           */

               *dest++ = (guchar) (y>255)?255:((y<0)?0:y);
               *dest++ = (guchar) (u>255)?255:((u<0)?0:u);
               *dest++ = (guchar) (v>255)?255:((v<0)?0:v);

               if (img_has_alpha)       *dest++ = a;
               // Fin du traitement spécifique ****************

           } // for
           dest_row += dest_rgn.rowstride;
           src_row += src_rgn.rowstride;
          } // for
          // Update progress
          progress += dest_rgn.w * dest_rgn.h;
          gimp_progress_update((double) progress / max_progress);
       }

    }
    else if (strcmp("plug_in_yuv_rgb",name) == 0)
    {
      // RGB -> YUV
      // !!! Warning !!! Duplicated code... 'cause it'is quick'n dirty :)
      // You should consider just edit the previous version and copy/paste this one.
        gimp_progress_init("Converting YUV to RGB...");
        progress = 0;

        // Process
        gimp_pixel_rgn_init (&dest_rgn, drawable, sel_x1, sel_y1,
                             (sel_x2-sel_x1), (sel_y2-sel_y1), TRUE, TRUE);
        gimp_pixel_rgn_init (&src_rgn, drawable, sel_x1, sel_y1,
                             (sel_x2-sel_x1), (sel_y2-sel_y1), FALSE, FALSE);

        // Methode de traitement par dest_rgns -----------------------
        for (pr = gimp_pixel_rgns_register (2, &src_rgn, &dest_rgn);
             pr != NULL;
             pr = gimp_pixel_rgns_process (pr))
         { //Fun Goes On Here
           dest_row = dest_rgn.data;
           src_row = src_rgn.data;
           for (row = 0; row < dest_rgn.h; row++) {
             dest = dest_row;
             src = src_row;
             for (col = 0; col < dest_rgn.w; col++) {

               // Début du traitement spécifique *************
               y = *src++;
               u = *src++;
               v = *src++;
               if (img_has_alpha)       a = *src++;

               /* Second set, not much better...*/
               //y =   (0.299*r) + (0.587*g) + (0.114*b);
               //u =  -(0.169*r) - (0.331*g) + (0.500*b) + 128.0;
               //v =   (0.500*r) - (0.419*g) - (0.081*b) + 128.0;
               // From SciLab

                                 r = 1 * y -  0.0009267*(u-128)  + 1.4016868*(v-128);
                                 g = 1 * y -  0.3436954*(u-128)  - 0.7141690*(v-128);
                                 b = 1 * y +  1.7721604*(u-128)  + 0.0009902*(v-128);


               *dest++ = (guchar) (r>255)?255:((r<0)?0:r);
               *dest++ = (guchar) (g>255)?255:((g<0)?0:g);
               *dest++ = (guchar) (b>255)?255:((b<0)?0:b);
               if (img_has_alpha)       *dest++ = a;
               // Fin du traitement spécifique ****************

           } // for
           dest_row += dest_rgn.rowstride;
           src_row += src_rgn.rowstride;
          } // for
          // Update progress
          progress += dest_rgn.w * dest_rgn.h;
          gimp_progress_update((double) progress / max_progress);

       }

    }

고현철

2006.05.11 22:29:30
*.117.46.252

소스 감사드립니다.

음....이렇게 계산하면 느릴겁니다...^^
대신 값은 정확해지지요.

해서 mpeg같은 경우는 YUV to RGB 변환 테이블을 미리 만들어서 lookup만 하는 방식으로 사용합니다.

mpeg2 decode소스를 보시거나, 아니면, SDL YUV overlay
mplayer의 postproc쪽을 보시면 관련 소스들이 있습니다.

JPEG의 경우는 위의 변환식을 많이 사용하고, mpeg등의 동영상에서는
lookup table을 사용합니다.

박영학

2006.05.12 19:41:09
*.45.116.126

아네~ Lookup table 아주 중요한 포인트인것 같습니다.

감사합니다.
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 교육 홍보 및 광고는 "교육 및 세미나 홍보" 게시판을 이용해 ... 관리자 2010-07-15 108005

사용자 로그인