diff options
-rw-r--r-- | src/video_out/video_out_vidix.c | 87 | ||||
-rw-r--r-- | src/xine-utils/color.c | 29 |
2 files changed, 72 insertions, 44 deletions
diff --git a/src/video_out/video_out_vidix.c b/src/video_out/video_out_vidix.c index c1d6a00d1..227438748 100644 --- a/src/video_out/video_out_vidix.c +++ b/src/video_out/video_out_vidix.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_vidix.c,v 1.67 2004/12/12 22:01:29 mroi Exp $ + * $Id: video_out_vidix.c,v 1.68 2005/01/23 23:01:12 jstembridge Exp $ * * video_out_vidix.c * @@ -180,16 +180,19 @@ static void free_framedata(vidix_frame_t* frame) static void write_frame_YUV420P2(vidix_driver_t* this, vidix_frame_t* frame) { - uint8_t* y = (uint8_t *)frame->vo_frame.base[0]; - uint8_t* cb = (uint8_t *)frame->vo_frame.base[1]; - uint8_t* cr = (uint8_t *)frame->vo_frame.base[2]; + uint8_t* y = frame->vo_frame.base[0] + this->sc.displayed_xoffset + + this->sc.displayed_yoffset*frame->vo_frame.pitches[0]; + uint8_t* cb = frame->vo_frame.base[1] + this->sc.displayed_xoffset/2 + + this->sc.displayed_yoffset*frame->vo_frame.pitches[1]/2; + uint8_t* cr = frame->vo_frame.base[2]+this->sc.displayed_xoffset/2 + + this->sc.displayed_yoffset*frame->vo_frame.pitches[2]/2; uint8_t* dst8 = (this->vidix_mem + this->vidix_play.offsets[this->next_frame] + this->vidix_play.offset.y); int h, w; - for(h = 0; h < frame->height; h++) { - xine_fast_memcpy(dst8, y, frame->width); + for(h = 0; h < this->sc.displayed_height; h++) { + xine_fast_memcpy(dst8, y, this->sc.displayed_width); y += frame->vo_frame.pitches[0]; dst8 += this->dstrides.y; } @@ -197,8 +200,8 @@ static void write_frame_YUV420P2(vidix_driver_t* this, vidix_frame_t* frame) dst8 = (this->vidix_mem + this->vidix_play.offsets[this->next_frame] + this->vidix_play.offset.v); - for(h = 0; h < (frame->height / 2); h++) { - for(w = 0; w < (frame->width / 2); w++) { + for(h = 0; h < (this->sc.displayed_height / 2); h++) { + for(w = 0; w < (this->sc.displayed_height / 2); w++) { dst8[2*w+0] = cb[w]; dst8[2*w+1] = cr[w]; } @@ -216,43 +219,53 @@ static void write_frame_sfb(vidix_driver_t* this, vidix_frame_t* frame) case XINE_IMGFMT_YUY2: yuy2_to_yuy2( /* src */ - frame->vo_frame.base[0], frame->vo_frame.pitches[0], + frame->vo_frame.base[0]+this->sc.displayed_xoffset*2+ + this->sc.displayed_yoffset*frame->vo_frame.pitches[0], + frame->vo_frame.pitches[0], /* dst */ base+this->vidix_play.offset.y, this->dstrides.y, /* width x height */ - frame->width, frame->height); + this->sc.displayed_width, this->sc.displayed_height); break; - case XINE_IMGFMT_YV12: + case XINE_IMGFMT_YV12: { + uint8_t* y = frame->vo_frame.base[0] + this->sc.displayed_xoffset + + this->sc.displayed_yoffset*frame->vo_frame.pitches[0]; + uint8_t* cb = frame->vo_frame.base[1] + this->sc.displayed_xoffset/2 + + this->sc.displayed_yoffset*frame->vo_frame.pitches[1]/2; + uint8_t* cr = frame->vo_frame.base[2] + this->sc.displayed_xoffset/2 + + this->sc.displayed_yoffset*frame->vo_frame.pitches[2]/2; + if(this->supports_yv12) { if(this->vidix_play.flags & VID_PLAY_INTERLEAVED_UV) write_frame_YUV420P2(this, frame); else yv12_to_yv12( /* Y */ - frame->vo_frame.base[0], frame->vo_frame.pitches[0], + y, frame->vo_frame.pitches[0], base+this->vidix_play.offset.y, this->dstrides.y, /* U */ - frame->vo_frame.base[2], frame->vo_frame.pitches[2], + cr, frame->vo_frame.pitches[2], base+this->vidix_play.offset.u, this->dstrides.u/2, /* V */ - frame->vo_frame.base[1], frame->vo_frame.pitches[1], + cb, frame->vo_frame.pitches[1], base+this->vidix_play.offset.v, this->dstrides.v/2, /* width x height */ - frame->width, frame->height); + this->sc.displayed_width, this->sc.displayed_height); } else yv12_to_yuy2( /* src */ - frame->vo_frame.base[0], frame->vo_frame.pitches[0], - frame->vo_frame.base[1], frame->vo_frame.pitches[1], - frame->vo_frame.base[2], frame->vo_frame.pitches[2], + y, frame->vo_frame.pitches[0], + cb, frame->vo_frame.pitches[1], + cr, frame->vo_frame.pitches[2], /* dst */ base+this->vidix_play.offset.y, this->dstrides.y, /* width x height */ - frame->width, frame->height, + this->sc.displayed_width, this->sc.displayed_height, /* progressive */ frame->vo_frame.progressive_frame); break; + } default: xprintf(this->xine, XINE_VERBOSITY_DEBUG, @@ -399,6 +412,18 @@ static void vidix_config_playback (vidix_driver_t *this) { _x_vo_scale_compute_output_size( &this->sc ); + /* We require that the displayed xoffset and width are even. + * To prevent displaying more than we're supposed to we round the + * xoffset up and the width down */ + this->sc.displayed_xoffset = (this->sc.displayed_xoffset+1) & ~1; + this->sc.displayed_width = this->sc.displayed_width & ~1; + + /* For yv12 source displayed yoffset and height need to be even too */ + if(this->delivered_format == XINE_IMGFMT_YV12) { + this->sc.displayed_yoffset = (this->sc.displayed_yoffset+1) & ~1; + this->sc.displayed_height = this->sc.displayed_height & ~1; + } + if( this->vidix_started > 0 ) { lprintf("video_out_vidix: overlay off\n"); vdlPlaybackOff(this->vidix_handler); @@ -413,8 +438,8 @@ static void vidix_config_playback (vidix_driver_t *this) { this->vidix_play.capability = this->vidix_cap.flags; /* every ;) */ this->vidix_play.blend_factor = 0; /* for now */ - this->vidix_play.src.x = this->sc.displayed_xoffset; - this->vidix_play.src.y = this->sc.displayed_yoffset; + this->vidix_play.src.x = 0; + this->vidix_play.src.y = 0; this->vidix_play.src.w = this->sc.displayed_width; this->vidix_play.src.h = this->sc.displayed_height; this->vidix_play.dest.x = this->sc.gui_win_x+this->sc.output_xoffset; @@ -432,27 +457,27 @@ static void vidix_config_playback (vidix_driver_t *this) { return; } - lprintf("video_out_vidix: dga_addr = %p frame_size = %d frames = %d\n", + lprintf("video_out_vidix: dga_addr = %p frame_size = %u frames = %u\n", this->vidix_play.dga_addr, this->vidix_play.frame_size, this->vidix_play.num_frames ); - lprintf("video_out_vidix: offsets[0..2] = %d %d %d\n", + lprintf("video_out_vidix: offsets[0..2] = %u %u %u\n", this->vidix_play.offsets[0], this->vidix_play.offsets[1], this->vidix_play.offsets[2] ); - lprintf("video_out_vidix: offset.y/u/v = %d/%d/%d\n", + lprintf("video_out_vidix: offset.y/u/v = %u/%u/%u\n", this->vidix_play.offset.y, this->vidix_play.offset.u, this->vidix_play.offset.v ); - lprintf("video_out_vidix: src.x/y/w/h = %d/%d/%d/%d\n", + lprintf("video_out_vidix: src.x/y/w/h = %u/%u/%u/%u\n", this->vidix_play.src.x, this->vidix_play.src.y, this->vidix_play.src.w, this->vidix_play.src.h ); - lprintf("video_out_vidix: dest.x/y/w/h = %d/%d/%d/%d\n", + lprintf("video_out_vidix: dest.x/y/w/h = %u/%u/%u/%u\n", this->vidix_play.dest.x, this->vidix_play.dest.y, this->vidix_play.dest.w, this->vidix_play.dest.h ); - lprintf("video_out_vidix: dest.pitch.y/u/v = %d/%d/%d\n", + lprintf("video_out_vidix: dest.pitch.y/u/v = %u/%u/%u\n", this->vidix_play.dest.pitch.y, this->vidix_play.dest.pitch.u, this->vidix_play.dest.pitch.v ); @@ -468,15 +493,15 @@ static void vidix_config_playback (vidix_driver_t *this) { switch(this->vidix_play.fourcc) { case IMGFMT_YV12: apitch = this->vidix_play.dest.pitch.y-1; - this->dstrides.y = (this->sc.delivered_width + apitch) & ~apitch; + this->dstrides.y = (this->sc.displayed_width + apitch) & ~apitch; apitch = this->vidix_play.dest.pitch.v-1; - this->dstrides.v = (this->sc.delivered_width + apitch) & ~apitch; + this->dstrides.v = (this->sc.displayed_width + apitch) & ~apitch; apitch = this->vidix_play.dest.pitch.u-1; - this->dstrides.u = (this->sc.delivered_width + apitch) & ~apitch; + this->dstrides.u = (this->sc.displayed_width + apitch) & ~apitch; break; case IMGFMT_YUY2: apitch = this->vidix_play.dest.pitch.y-1; - this->dstrides.y = (this->sc.delivered_width*2 + apitch) & ~apitch; + this->dstrides.y = (this->sc.displayed_width*2 + apitch) & ~apitch; break; default: xprintf(this->xine, XINE_VERBOSITY_DEBUG, diff --git a/src/xine-utils/color.c b/src/xine-utils/color.c index a300eb109..d01e8b649 100644 --- a/src/xine-utils/color.c +++ b/src/xine-utils/color.c @@ -61,7 +61,7 @@ * instructions), these macros will automatically map to those special * instructions. * - * $Id: color.c,v 1.24 2003/12/09 00:02:38 f1rmb Exp $ + * $Id: color.c,v 1.25 2005/01/23 23:01:13 jstembridge Exp $ */ #include "xine_internal.h" @@ -701,12 +701,9 @@ static void yv12_to_yuy2_c p_y1 = p_y2; p_y2 += y_src_pitch; - for( i_x = width / 8 ; i_x-- ; ) + for( i_x = width / 2 ; i_x-- ; ) { C_YUV420_YUYV( ); - C_YUV420_YUYV( ); - C_YUV420_YUYV( ); - C_YUV420_YUYV( ); } p_y2 += i_source_margin; @@ -734,12 +731,9 @@ static void yv12_to_yuy2_c p_y1 = p_y2; p_y2 += 2 * y_src_pitch; - for( i_x = width / 8 ; i_x-- ; ) + for( i_x = width / 2 ; i_x-- ; ) { C_YUV420_YUYV( ); - C_YUV420_YUYV( ); - C_YUV420_YUYV( ); - C_YUV420_YUYV( ); } p_y2 += i_source_margin + y_src_pitch; @@ -770,12 +764,9 @@ static void yv12_to_yuy2_c p_y1 = p_y2; p_y2 += 2 * y_src_pitch; - for( i_x = width / 8 ; i_x-- ; ) + for( i_x = width / 2 ; i_x-- ; ) { C_YUV420_YUYV( ); - C_YUV420_YUYV( ); - C_YUV420_YUYV( ); - C_YUV420_YUYV( ); } p_y2 += i_source_margin + y_src_pitch; @@ -868,6 +859,10 @@ static void yv12_to_yuy2_mmxext { MMXEXT_YUV420_YUYV( ); } + for( i_x = (width % 8) / 2 ; i_x-- ; ) + { + C_YUV420_YUYV( ); + } p_y2 += i_source_margin; p_u += i_source_u_margin; @@ -898,6 +893,10 @@ static void yv12_to_yuy2_mmxext { MMXEXT_YUV420_YUYV( ); } + for( i_x = (width % 8) / 2 ; i_x-- ; ) + { + C_YUV420_YUYV( ); + } p_y2 += i_source_margin + y_src_pitch; p_u += i_source_u_margin + u_src_pitch; @@ -931,6 +930,10 @@ static void yv12_to_yuy2_mmxext { MMXEXT_YUV420_YUYV( ); } + for( i_x = (width % 8) / 2 ; i_x-- ; ) + { + C_YUV420_YUYV( ); + } p_y2 += i_source_margin + y_src_pitch; p_u += i_source_u_margin + u_src_pitch; |