회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 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 108026
1850 근래 시작한 일 - RTOS, Atomthreads, 신형 삼성AP [3] 고도리 2017-09-15 757
1849 극심한 불경기에 어떻게 지내시나요 ? [3] 파란새 2017-09-02 423
1848 라즈베리파이에 구글 스피커 엔진인 구글 어시스턴트 API를 올... [5] 천동이 2017-08-25 675
1847 [Exynos 8895관련] [2] 밥줘잉 2017-05-30 398
1846 오렌지파이에 구글 서비스 설치하는 방법을 정리해봤습니다. [6] 천동이 2017-01-17 850
1845 고도리님 2017년 신년계획 부탁드립니다 .... [1] 파란새 2017-01-03 524
1844 Orange Pi PC2 를 테스트 해봤습니다^^ [7] 천동이 2016-11-24 615
1843 IT 쪽은 일꺼리가 많이 줄었는데 ... [1] 파란새 2016-11-21 608
1842 DRAM 가격과 NAND Flash 가격이 엄청 오르고 있네요. [2] 고도리 2016-11-09 331
1841 Orange Pi PC 2 - 20$ 짜리 재밌는 보드 file [7] 고도리 2016-11-09 731
1840 자바·C/C++ 모두 지원하는 RTOS 출시 [4] 포도씨 2016-11-02 478
1839 퀄컴의 NXP인수 [3] 고도리 2016-10-31 427
1838 DragonBoard™ 410c - 퀄컴 사물인터넷 IOE Board ... [2] 파란새 2016-08-27 576
1837 WebRTC 관련 .... [2] 파란새 2016-08-25 332
1836 Rockchip base reference board[의견] [4] 블루스카이 2016-08-01 859
1835 근래 CPU 반도체 칩 패키지 형태 - Exynos7420/Exynos8890 ... file [2] 고도리 2016-05-18 2383
1834 [참고] Linaro에서도 개발보드(?)가 새롭게 나온게 있었네요. [1] 고도리 2016-02-23 675
1833 LG’s NUCLUN 2 SoC Geekbench Results Leaked; Exynos 7... [1] 파란새 2016-02-14 622
1832 [커널버전] 오랜만에 kernel.org 사이트 갔더니 v4.4.1 이라니... [8] 고도리 2016-02-11 706
1831 그동안 8 년간 일인기업을 운영하면서 느끼고 배웠던 것 .... [1] 파란새 2016-02-07 819

사용자 로그인