summaryrefslogtreecommitdiffstats
path: root/vidix
diff options
context:
space:
mode:
Diffstat (limited to 'vidix')
-rw-r--r--vidix/drivers/radeon_vid.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/vidix/drivers/radeon_vid.c b/vidix/drivers/radeon_vid.c
index 4bdd4a8207..8ffe383cf5 100644
--- a/vidix/drivers/radeon_vid.c
+++ b/vidix/drivers/radeon_vid.c
@@ -838,6 +838,20 @@ static void radeon_vid_display_video( void )
#endif
}
+static unsigned radeon_query_pitch(unsigned fourcc)
+{
+ unsigned pitch;
+ switch(fourcc)
+ {
+ /* 4:2:0 */
+ case IMGFMT_IYUV:
+ case IMGFMT_YV12:
+ case IMGFMT_I420: pitch = 32; break;
+ default: pitch = 16; break;
+ }
+ return pitch;
+}
+
static int radeon_vid_init_video( vidix_playback_t *config )
{
uint32_t tmp,src_w,src_h,dest_w,dest_h,pitch,h_inc,step_by,left,leftUV,top;
@@ -966,10 +980,19 @@ static int radeon_vid_init_video( vidix_playback_t *config )
return 0;
}
+static void radeon_compute_framesize(vidix_playback_t *info)
+{
+ unsigned pitch,awidth;
+ pitch = radeon_query_pitch(info->fourcc);
+ awidth = info->src.w + ((pitch-1) & ~(pitch-1));
+ info->frame_size = awidth*info->src.h+(awidth*info->src.h)/2;
+}
+
int vixConfigPlayback(vidix_playback_t *info)
{
if(!is_supported_fourcc(info->fourcc)) return ENOSYS;
if(info->num_frames>2) info->num_frames=2;
+ radeon_compute_framesize(info);
radeon_overlay_off = radeon_ram_size - info->frame_size*info->num_frames;
radeon_overlay_off &= 0xffff0000;
if(radeon_overlay_off < 0) return EINVAL;