On Thu, Dec 4, 2008 at 10:18 PM, [EMAIL PROTECTED]
<[EMAIL PROTECTED]> wrote:
>
> can OpenGL convert YUV422P to RGB565,thanks
No. YUV formats are not supported in standard by OpenGL ES 1.x
> On 12月5日, 下午12时42分, Dave Sparks <[EMAIL PROTECTED]> wrote:
>> The reference software implementation of SurfaceFlinger doesn't
>> support YUV color conversion. It uses the Y plane for monochrome so
>> that something is displayed.
>>
>> On Dec 4, 3:22 am, Shirish <[EMAIL PROTECTED]> wrote:
>>
>>
>>
>> > Hi,
>>
>> > I want to use the YUV format and its a different format. In that case
>> > do I need to only change the Surface Flinger to use the Open GL
>> > extension for YUV format. Is there some other module which needs to
>> > change?
>> > Does currently Android 1.0 Release has Open GL extensions for the YUV
>> > format?
>>
>> > Thanks,
>> > -Shirish
>>
>> > On Dec 4, 2:44 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
>>
>> > > yuv422 to rgb565 doesn't work well
>>
>> > > uint32_t mCoefTbl32[516];
>> > > uint8_t *mCoefTbl = NULL;
>> > > static void init_coff()
>> > > {
>> > > uint8_t *clip;
>> > > int i;
>> > > mCoefTbl = (uint8_t *)mCoefTbl32;
>> > > *((uint32_t*)mCoefTbl) = (int)(65536*0.4681); //0.714);
>> > > *((uint32_t*)(mCoefTbl+4)) = (int)(65536*1.5748);//1.402);
>> > > *((uint32_t*)(mCoefTbl+8)) = (int)(65536*0.1873);//0.344);
>> > > *((uint32_t*)(mCoefTbl+12)) = (int)(65536*1.8556);//1.772);
>>
>> > > clip = mCoefTbl + 400;
>> > > /* do 5 bit conversion */
>> > > memset( &clip[-384], 0, 385*sizeof( *clip));
>> > > memset( &clip[ 640], 0, 385*sizeof( *clip));
>>
>> > > for (i=1; i<255; i++){ // range of (x>>3) between -24 and 56
>> > > clip[i] = i>>3;
>> > > clip[i+1024] = i>>2;
>> > > }
>> > > memset( &clip[255], 31, 385*sizeof( *clip));
>> > > memset( &clip[1279], 63, 385*sizeof( *clip));
>>
>> > > }
>>
>> > > static int32_t cc16(uint16_t *pY,uint8_t *pCb, uint8_t *pCr, uint8_t
>> > > *dst, int32_t *disp, uint8_t *coff_tbl)
>> > > {
>> > > #define OFFSET_5_0 2
>> > > #define OFFSET_6_0 (1+1024)
>> > > #define OFFSET_5_1 6
>> > > #define OFFSET_6_1 (3+1024)
>>
>> > > uint16_t *pDst;
>> > > int32_t src_pitch, dst_pitch, src_width;
>> > > int32_t Y, Cb, Cr, Cg;
>> > > int32_t deltaY, deltaDst, deltaCbCr;
>> > > int32_t row, col;
>> > > int32_t tmp0, tmp1, tmp2;
>> > > uint32_t rgb;
>> > > uint8_t *clip = coff_tbl+400;
>> > > int32_t cc1 = (*((int32_t*)(clip - 400)));
>> > > int32_t cc3 = (*((int32_t*)(clip - 396)));
>> > > int32_t cc2 = (*((int32_t*)(clip - 392)));
>> > > int32_t cc4 = (*((int32_t*)(clip - 388)));
>>
>> > > src_pitch = disp[0];
>> > > dst_pitch = disp[1];
>> > > src_width = disp[2];
>>
>> > > if(disp[6]) /* rotate 180 and flip */
>> > > { /* move the starting point to the bottom-left corner of the
>> > > picture */
>> > > deltaY = src_pitch*(disp[3]-1);
>> > > deltaY = (src_pitch>>1)*((disp[3]>>1)-1);
>> > > deltaY = -src_width-(src_pitch<<1);
>> > > deltaCbCr = -((src_width+src_pitch)>>1);
>> > > src_pitch = -(src_pitch>>1);
>> > > }
>> > > else
>> > > {
>> > > deltaY = (src_pitch<<1)-src_width;
>> > > deltaCbCr = (src_pitch-src_width)>>1;
>> > > src_pitch >>= 1;
>> > > }
>>
>> > > deltaDst = (dst_pitch<<1)-src_width;
>> > > pDst = (uint16_t *)dst;
>>
>> > > for(row = disp[3]; row >0; row-=2){
>>
>> > > for(col = src_width-1; col >=0; col-=2){
>>
>> > > Cb = *pCb++; Cr = *pCr++;
>> > > Y = pY[src_pitch];
>>
>> > > Cb -= 128; Cr -= 128;
>> > > Cg = Cr*cc1;
>> > > Cr *= cc3;
>>
>> > > Cg += Cb*cc2;
>> > > Cb *= cc4;
>>
>> > > tmp0 = (Y & 0xFF); //Low endian left pixel
>> > > tmp0 += OFFSET_5_0;
>>
>> > > tmp1 = tmp0 - (Cg>>16);
>> > > tmp2 = tmp0 + (Cb>>16);
>> > > tmp0 = tmp0 + (Cr>>16);
>>
>> > > tmp0 = clip[tmp0];
>> > > tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0];
>> > > tmp2 = clip[tmp2];
>> > > //RGB_565
>>
>> > > rgb = tmp1|(tmp0<<6);
>> > > rgb = tmp2|(rgb<<5);
>>
>> > > Y = (Y>>8) & 0xFF;
>>
>> > > Y += OFFSET_5_1;
>> > > tmp1 = (Y) - (Cg>>16);
>> > > tmp2 = (Y) + (Cb>>16);
>> > > tmp0 = (Y) + (Cr>>16);
>>
>> > > tmp0 = clip[tmp0];
>> > > tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1];
>> > > tmp2 = clip[tmp2];
>>
>> > > //RGB_565
>>
>> > > tmp0 = tmp1|(tmp0<<6);
>> > > tmp0 = tmp2|(tmp0<<5);
>>
>> > > rgb |= (tmp0<<16);
>>
>> > > *( (uint32_t*)(pDst+dst_pitch) ) = rgb;
>>
>> > > //load the top two pixels
>> > > Y = *pY++;
>>
>> > > tmp0 = (Y & 0xFF); //Low endian left pixel
>> > > tmp0 += OFFSET_5_1;
>>
>> > > tmp1 = tmp0 - (Cg>>16);
>> > > tmp2 = tmp0 + (Cb>>16);
>> > > tmp0 = tmp0 + (Cr>>16);
>>
>> > > tmp0 = clip[tmp0];
>> > > tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1];
>> > > tmp2 = clip[tmp2];
>> > > //RGB_565
>>
>> > > rgb = tmp1|(tmp0<<6);
>> > > rgb = tmp2|(rgb<<5);
>>
>> > > Y = (Y>>8) & 0xFF;
>>
>> > > Y += OFFSET_5_0;
>> > > tmp1 = (Y) - (Cg>>16);
>> > > tmp2 = (Y) + (Cb>>16);
>> > > tmp0 = (Y) + (Cr>>16);
>>
>> > > tmp0 = clip[tmp0];
>> > > tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0];
>> > > tmp2 = clip[tmp2];
>>
>> > > //RGB_565
>>
>> > > tmp0 = tmp1|(tmp0<<6);
>> > > tmp0 = tmp2|(tmp0<<5);
>>
>> > > rgb |= (tmp0<<16);
>> > > *( (uint32_t *)pDst) = rgb; pDst+=2;
>>
>> > > }//end of COL
>>
>> > > pY += (deltaY>>1);
>> > > pCb += deltaCbCr;
>> > > pCr += deltaCbCr;
>> > > pDst+= (deltaDst); //coz pDst defined as UINT *
>> > > }
>> > > return 1;
>>
>> > > }
>>
>> > > On 11月19日, 下午5时02分, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
>>
>> > > > thanks very much,cpu is pxa300,camera only provides yuv422 & RawRGB,
>>
>> > > > "On the G1 we use another code path to draw video frames" which
>> > > > path,thanks~
>>
>> > > > On 11月19日, 下午4时07分, Mathias Agopian <[EMAIL PROTECTED]> wrote:
>>
>> > > > > Hi,
>>
>> > > > > On Tue, Nov 18, 2008 at 11:15 PM, [EMAIL PROTECTED]
>>
>> > > > > <[EMAIL PROTECTED]> wrote:
>>
>> > > > > > the camera provide yuv422 data,butopenGL"just show the Y plane of
>> > > > > >YUVbuffers"(frameworks\base\libs\surfaceflinger\LayerBase.cpp
>> > > > > > 624),must convert yuv422 to rgb565,camera preview is ok,a little
>> > > > > > slow,why,thanks
>>
>> > > > > No,OpenGLdoesn't supportYUVtextures. That's just that.
>>
>> > > > > On the G1 we use another code path to draw video frames, it doesn't
>> > > > > useOpenGLES, instead it uses the 2D engine. The code that you are
>> > > > > referring to exists only so that theYUVvideo node will display
>> > > > > "something" when used on the emulator or on a device that doesn't do
>> > > > >YUV(in which case the video node should not try to produceYUV
>> > > > > output). It's mostly there for debugging.
>>
>> > > > > Of course, *some*YUVextensions forOpenGLES exist, and the code
>> > > > > in SurfaceFlinger doesn't make use of them at this time. Exercise
>> > > > > left
>> > > > > to the reader... or until real h/w with these capabilities falls into
>> > > > > my hands.
>>
>> > > > > What h/w are you using?
>>
>> > > > > Mathias- 隐藏被引用文字 -
>>
>> > > > - 显示引用的文字 -- Hide quoted text -
>>
>> > > - Show quoted text -- 隐藏被引用文字 -
>>
>> - 显示引用的文字 -
> >
>
--~--~---------~--~----~------------~-------~--~----~
unsubscribe: [EMAIL PROTECTED]
website: http://groups.google.com/group/android-porting
-~----------~----~----~----~------~----~------~--~---