Lidj wrote: > Hi Niels, > Appreciate for your help. > > 1. I have try DSFLIP_NONE to see the playing rate, it still take 1.9s to > play 30 frame. > > 2. I use "for" loop to playing 30 frame, and measure how long it take. > like this > > > <========= > while (!quit) { > > lastftick = myclock(); > for(i=0;i<FRAME_NUMBER;I++){ > CopyYUVData(temp[i], videosurface); //temp[i] is 30 frame > > /*Flip the buffers of videosurface on the video layer*/ > videosurface->Flip(videosurface, NULL, DSFLIP_WAITFORSYNC); > } > lastftick = myclock()-lastftick; > printf("playing %d buffer time used: %ld s\n", frame_number,lastftick); > > } > =========> > output: playing 30 buffer time used: 1941 s > Ok, I assume you put DSFLIP_NONE, and not DSFLIP_WAITFORSYNC as you copied here above. What I actually mean if you have done a theoretical throughput calculation, based on the capabilities of your hardware. In other words: how do you know for sure that 30fps is possible?
> 3. My gfx card do support UYVY to RGB, I read 30 UYVY files to memory(above > slice code's temp[i] ) > and copy to videosurface, it can display correctly. > > 4. Actually I regard this surface as "primary surface", is because I use the > DSCAPS_PRIMARY parameter > to create surface, > like this slice code. > <========= > desc.caps = DSCAPS_PRIMARY; > desc.pixelformat = DSPF_RGB16; > desc.width = SCREEN_W; > desc.height = SCREEN_H; > dfb->CreateSurface(dfb, &desc, &primarysurface); > =========> > Am I making some misunderstanding on this? > > DSCAPS_PRIMARY is correct. But, what I see is that you do not show the primarysurface, I mean you are not using it in your 'flip' call. There I see that you are using videosurface. > 5. In fact, my example just can play each single frame in loop. :o > And it takes almost 2 seconds to play 30 frames(too slow, my main issue). > > Here is my guess, maybe root cause is on memcpy too slow? > The XGA UYVY file size is 1.5mb/frame, memcpy can't move data to > "videosurface" in time. > So it can't meet 30frame/s. Is this guess reasonable? > That is possible. You can simply remove the memcpy and see what happens. > Thanks for you help! > Best Regards. > > Lidj. > > > Niels Roest wrote: > >> Hi, had a short look. >> Not quite sure what is your issue so I need to ask a few questions. >> >> You might want to remove DSFLIP_WAITFORSYNC to see how close you are to >> 30. >> Did you do the math to check for the maximum theoretical throughput? >> Also curious if the layer really switched to UYVY, not sure if your gfx >> driver supports this. You can check with dfbdump, best is to run this at >> the same time as your test code (you need to have directfb configured >> multi-app in this case). >> Also, you mention 'primarysurface' but if I understand the code, it >> doesn't take the primary layer. >> >> Is your example displaying the little movie correctly? >> >> Greets >> Niels >> >> Lidj wrote: >> >>> Dear all, >>> I am new to DFB, here I modify df_layer.c to play UYVY data on XGI >>> graphic card, >>> this graphic card support yuv to rgb. Now I playing XGA(1024x768 >>> 16it)picture(about 1.5 mb/frame), >>> the frame rate is just 15 frame/s,I want to achieve 30 frame/s at least. >>> >>> Here is my flow. >>> 1. Create "dfb" super interface. >>> 2. Enumerate display layers "videolayer" from dfb. >>> 3. "videolayer" get "videosurface" ,"dfb" create "primarysurface" >>> 4. copy yuv data into "videosurface", then flip. >>> >>> yuv data already buffer to memory, just playing yuv date cyclically. >>> >>> Here is slice code. >>> <========= >>> while (!quit) { >>> >>> lastftick = myclock(); >>> for(i=0;i<FRAME_NUMBER;I++){ >>> CopyYUVData(temp[i], videosurface); >>> >>> /*Flip the buffers of videosurface on the video layer*/ >>> videosurface->Flip(videosurface, NULL, DSFLIP_WAITFORSYNC); >>> } >>> lastftick = myclock()-lastftick; >>> printf("playing %d buffer time used: %ld s\n", frame_number,lastftick); >>> >>> } >>> =========> >>> >>> >>> <========= >>> #define YUVSRC_W 1024 >>> #define YUVSRC_H 768 >>> >>> #define YUVFRAME_BYTESPerPixel 2 >>> #define YUVFRAME_SIZE (YUVSRC_W * YUVSRC_H) >>> #define YUVFRAME_Pitch (YUVSRC_W * YUVFRAME_BYTESPerPixel) >>> >>> void CopyYUVData(unsigned char *src, IDirectFBSurface *des) >>> { >>> int y; >>> void *data; >>> unsigned int pitch; >>> DFBResult ret; >>> ret = des->Lock (des, DSLF_WRITE, &data, &pitch); >>> if (ret) >>> { >>> fprintf(stderr,"IDirectFBSurface:ock error code =%d", ret); >>> return; >>> } >>> for(y=0; y<YUVSRC_H; y++) >>> { >>> memcpy(data, src+YUVFRAME_Pitch*y, YUVFRAME_Pitch); >>> data += pitch; >>> } >>> des->Unlock (des); >>> } >>> =========> >>> >>> here is entire code. please go to below link, and simply click >>> dowoload. >>> http://www.box.net/shared/7dafavyvrz >>> >>> Any comment will be very appreciated :D >>> >>> Best regard~ >>> Lidj. >>> >>> >>> >> -- >> >> .------------------------------------------. >> | DirectFB - Hardware accelerated graphics | >> | http://www.directfb.org/ | >> "------------------------------------------" >> >> _______________________________________________ >> directfb-users mailing list >> directfb-users@directfb.org >> http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-users >> >> >> > > -- .------------------------------------------. | DirectFB - Hardware accelerated graphics | | http://www.directfb.org/ | "------------------------------------------" _______________________________________________ directfb-users mailing list directfb-users@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-users