회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 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
번호 제목 글쓴이 날짜 조회 수sort
공지 교육 홍보 및 광고는 "교육 및 세미나 홍보" 게시판을 이용해 ... 관리자 2010-07-15 108488

이솝보드 구매할수 있나요? [1]

지나간 LX800 Board를 구하고 싶습니다. [1]

aesop-mp2530f wince 기본 올라갔습니다. file [1]

[구입] Lx800 구입 원 합니다

Pine64에서 드디어 RK3399 SBC가 출시 되었네요. [1]

2006.12.07_2.6_kernel.iso 파일을 어디서 받을 수 있을까요?(냉...

Kernel 4.14 RC1이 나왔네요.. [7]

안드로이드 OS 개발에 대한 잡설.. [5]

Firefly RK3399 안드로이드 8.1(하드웨어 NN API 지원) SD... [1]

Ubuntu 18.04 소식 [6]

[RK3399 Ev-kit] 작년 중반에 중국 친구가 보내줬던 보드 file [14]

"안드로이드 분석과 포팅" 정말 좋은책입니다. [3]

[SDL2] Android SDL2로의 발전과 OpenGL or OpenGL ES... [2]

라즈베리파이4를 테스트 해봤습니다. [3]

DJI라는 중국 Drone 회사에 다녀왔습니다. [4]

블랙박스 개발 관련 문의 [1]

세상살이 푸념 ...

[놀라움] Orange Pi 라는 보드 사이트 [3]

Rockchip base reference board[의견] [4]

오렌지파이에 구글 서비스 설치하는 방법을 정리해봤습니다. [6]

사용자 로그인