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

Reply via email to