회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 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 107998
90 [잡담] 진짜 공감되네요 -_- [1] 이기문 2006-05-19 2654
89 삼성 2442에 대하여.. [3] 이제현 2006-05-19 3143
88 [잡담] 결국 다 해야하는 상황이 ㅠ.ㅠ [5] 이재훈 2006-05-17 2850
87 가입인사입니다. [2] 김동환 2006-05-16 2475
86 [가입인사]안녕하세요^^ [1] 이윤규 2006-05-16 2516
85 혹시 삼성 sw 멤버십 생각하고 계신분? [2] 오용석 2006-05-15 2963
84 2.6.x 대 커널의 block device의 속도 문제... 고현철 2006-05-14 2673
83 [잡담] ㅠㅠ 결국엔 컴터 포멧이네요 ㅠㅠ [2] 이기문 2006-05-14 2728
82 여담인데요 ... file [2] 장석원 2006-05-13 2544
81 Linux-2.6.16-aesop2440 기본 포팅 성공...^^ [1] 고현철 2006-05-13 2992
80 H.264등 비디오 DEC/ENC 관심있으신분 샘플 코드 보세요 박영학 2006-05-12 2988
79 Linux와 NetBSD 선택에서의 기로....^^ [4] 고현철 2006-05-12 3474
» 비디오 디코더 선택 했습니다. [2] 박영학 2006-05-11 3110
77 2410TK(SMDK2410) 보드에 NetBSD 커널 올렸습니다. [5] 고현철 2006-05-11 4272
76 LCD Controller [2] 박현진 2006-05-11 2937
75 GNU GPL를 사용하려면... file [3] 노희준 2006-05-11 2986
74 울나라 프로게이머가 세계 최강인 이유? file [8] 고현철 2006-05-09 2796
73 [잡담] 드디어 민간인이 되었습니다 ㅎㅎ [3] 이기문 2006-05-09 2664
72 GPL관련 관련 소송.... [4] 고현철 2006-05-09 3056
71 이숍보드로 정말 많이 배워야 할 것 같습니다. ^^; [3] 안정섭 2006-05-09 2985

사용자 로그인