회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 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 108005
1850 Digital Cube의 V43 전자파 건을 보면서... [5] 고현철 2006-05-03 2996
1849 건강하시죠 ^^ [6] 이재훈 2006-05-04 2556
1848 [필독] GPL문제.... [6] 고현철 2006-05-04 2772
1847 [잡담]노트북이 이상해요 ㅜㅜ [5] 이상화 2006-05-06 2707
1846 정신없음....그리고, 부트로더 & NetBSD & 잡생각 [2] 고현철 2006-05-06 2814
1845 NetBSD 설치...^^ [1] 고현철 2006-05-07 2979
1844 RTEMS commercial usage에 대한 License문제. [2] 고현철 2006-05-08 2993
1843 FAQ 정리해 보실 분...2.6.16 포팅 & 앞으로의 Linux진행방... [2] 고현철 2006-05-08 2683
1842 GPL이란게 소프트웨어 공유에 대한 얘기가 아니었는지....원... [3] 고현철 2006-05-08 2887
1841 가입인사입니다 [3] 이장호 2006-05-09 2592
1840 이숍보드로 정말 많이 배워야 할 것 같습니다. ^^; [3] 안정섭 2006-05-09 2985
1839 GPL관련 관련 소송.... [4] 고현철 2006-05-09 3056
1838 [잡담] 드디어 민간인이 되었습니다 ㅎㅎ [3] 이기문 2006-05-09 2664
1837 울나라 프로게이머가 세계 최강인 이유? file [8] 고현철 2006-05-09 2796
1836 GNU GPL를 사용하려면... file [3] 노희준 2006-05-11 2986
1835 LCD Controller [2] 박현진 2006-05-11 2937
1834 2410TK(SMDK2410) 보드에 NetBSD 커널 올렸습니다. [5] 고현철 2006-05-11 4272
» 비디오 디코더 선택 했습니다. [2] 박영학 2006-05-11 3110
1832 Linux와 NetBSD 선택에서의 기로....^^ [4] 고현철 2006-05-12 3474
1831 H.264등 비디오 DEC/ENC 관심있으신분 샘플 코드 보세요 박영학 2006-05-12 2988

사용자 로그인