diff options
author | Robin KAY <komadori@users.sourceforge.net> | 2002-12-14 18:48:57 +0000 |
---|---|---|
committer | Robin KAY <komadori@users.sourceforge.net> | 2002-12-14 18:48:57 +0000 |
commit | 07a59f0e933d3bd7f7cf6304832b7e0a06220595 (patch) | |
tree | e8590d61ab9865fa8a0ddff02c2da6990a394fea | |
parent | c79dba5d012f5f8416c189e76a4b8b9a55c729da (diff) | |
download | xine-lib-07a59f0e933d3bd7f7cf6304832b7e0a06220595.tar.gz xine-lib-07a59f0e933d3bd7f7cf6304832b7e0a06220595.tar.bz2 |
The bandwidth cost is too high to do one-field deinterlacing in hardware.
CVS patchset: 3522
CVS date: 2002/12/14 18:48:57
-rw-r--r-- | src/video_out/video_out_pgx64.c | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/src/video_out/video_out_pgx64.c b/src/video_out/video_out_pgx64.c index 36f9cf631..3886714d9 100644 --- a/src/video_out/video_out_pgx64.c +++ b/src/video_out/video_out_pgx64.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_pgx64.c,v 1.18 2002/12/13 23:41:52 komadori Exp $ + * $Id: video_out_pgx64.c,v 1.19 2002/12/14 18:48:57 komadori Exp $ * * video_out_pgx64.c, Sun PGX64/PGX24 output plugin for xine * @@ -134,6 +134,7 @@ typedef struct { int colour_key, brightness, saturation; int deinterlace, deinterlace_method; + int double_pitch_hack, half_height_hack; } pgx64_driver_t; /* @@ -342,7 +343,7 @@ static void pgx64_display_frame(pgx64_driver_t *this, pgx64_frame_t *frame) write_reg(this, SCALER_BUF0_OFFSET, frame->buf_y); write_reg(this, SCALER_BUF0_OFFSET_U, frame->buf_u); write_reg(this, SCALER_BUF0_OFFSET_V, frame->buf_v); - write_reg(this, SCALER_BUF_PITCH, this->deinterlace && (this->deinterlace_method == DEINTERLACE_ONEFIELD) ? frame->pitch * 2 : frame->pitch); + write_reg(this, SCALER_BUF_PITCH, frame->pitch); write_reg(this, OVERLAY_X_Y_START, ((this->vo_scale.gui_win_x + this->vo_scale.output_xoffset) << 16) | (this->vo_scale.gui_win_y + this->vo_scale.output_yoffset) | OVERLAY_X_Y_LOCK); write_reg(this, OVERLAY_X_Y_END, ((this->vo_scale.gui_win_x + this->vo_scale.output_xoffset + this->vo_scale.output_width) << 16) | (this->vo_scale.gui_win_y + this->vo_scale.output_yoffset + this->vo_scale.output_height)); write_reg(this, OVERLAY_SCALE_INC, (((frame->width << 12) / this->vo_scale.output_width) << 16) | (((this->deinterlace && (this->deinterlace_method == DEINTERLACE_ONEFIELD) ? frame->height/2 : frame->height) << 12) / this->vo_scale.output_height)); @@ -352,38 +353,61 @@ static void pgx64_display_frame(pgx64_driver_t *this, pgx64_frame_t *frame) if (frame->format == XINE_IMGFMT_YV12) { switch (this->deinterlace ? this->deinterlace_method : ~0) { + case DEINTERLACE_ONEFIELD: { + register uint8_t *y = frame->vo_frame.base[0]; + register uint8_t *ydest = this->fbbase+frame->buf_y; + register uint8_t *u = frame->vo_frame.base[1]; + register uint8_t *v = frame->vo_frame.base[2]; + register uint8_t *udest = this->fbbase+frame->buf_u; + register uint8_t *vdest = this->fbbase+frame->buf_v; + int i = 0; + + for (i = 0; i < frame->height/2; i++, y += 2*frame->vo_frame.pitches[0], ydest += frame->vo_frame.pitches[0]) { + memcpy(ydest, y, frame->vo_frame.pitches[0]); + } + + for (i = 0; i < frame->height/4; i++, u += 2*frame->vo_frame.pitches[1], udest += frame->vo_frame.pitches[1], v += 2*frame->vo_frame.pitches[2], vdest += frame->vo_frame.pitches[2]) { + memcpy(udest, u, frame->vo_frame.pitches[1]); + memcpy(vdest, v, frame->vo_frame.pitches[2]); + } + } + break; + case DEINTERLACE_LINEARBLEND: { register uint8_t *first = frame->vo_frame.base[0]; - register uint8_t *second = frame->vo_frame.base[0]+frame->width; - register uint8_t *third = frame->vo_frame.base[0]+(2*frame->width); - register uint8_t *last = frame->vo_frame.base[0]+(frame->width*frame->height); + register uint8_t *second = frame->vo_frame.base[0]+frame->vo_frame.pitches[0]; + register uint8_t *third = frame->vo_frame.base[0]+(2*frame->vo_frame.pitches[0]); + register uint8_t *last = frame->vo_frame.base[0]+(frame->vo_frame.pitches[0]*frame->height); register uint8_t *dest = this->fbbase+frame->buf_y; - memcpy(dest, first, frame->width); - dest += frame->width; + memcpy(dest, first, frame->vo_frame.pitches[0]); + dest += frame->vo_frame.pitches[0]; - for (;third != last;first++,second++,third++,dest++) { + for (; third != last; first++, second++, third++, dest++) { *dest = (*first + (*second << 1) + *third) >> 2; } - memcpy(dest, second, frame->width); + memcpy(dest, second, frame->vo_frame.pitches[0]); + + memcpy(this->fbbase+frame->buf_u, frame->vo_frame.base[1], frame->lengths[1]); + memcpy(this->fbbase+frame->buf_v, frame->vo_frame.base[2], frame->lengths[2]); } break; #ifdef ENABLE_VIS case DEINTERLACE_LINEARBLEND_VIS: { register uint32_t *first = (uint32_t *)(frame->vo_frame.base[0]); - register uint32_t *second = (uint32_t *)(frame->vo_frame.base[0]+frame->width); - register uint32_t *third = (uint32_t *)(frame->vo_frame.base[0]+(2*frame->width)); - register uint32_t *last = (uint32_t *)(frame->vo_frame.base[0]+(frame->width*frame->height)); + register uint32_t *second = (uint32_t *)(frame->vo_frame.base[0]+frame->vo_frame.pitches[0]); + register uint32_t *third = (uint32_t *)(frame->vo_frame.base[0]+(2*frame->vo_frame.pitches[0])); + register uint32_t *last = (uint32_t *)(frame->vo_frame.base[0]+(frame->vo_frame.pitches[0]*frame->height)); register uint32_t *dest = (uint32_t *)(this->fbbase+frame->buf_y); write_gsr((read_gsr() & 0xffffff07) | 0x000000008); - memcpy(dest, first, frame->width); - dest += frame->width/4; + memcpy(dest, first, frame->vo_frame.pitches[0]); + dest += frame->vo_frame.pitches[0]/4; - for (;third != last;first++,second++,third++,dest++) { + for (; third != last; first++, second++, third++, dest++) { asm volatile("ld [%0], %%f0\n\t" "fexpand %%f0, %%f2\n\t" "ld [%1], %%f4\n\t" @@ -400,19 +424,22 @@ static void pgx64_display_frame(pgx64_driver_t *this, pgx64_frame_t *frame) "%f6", "%f7", "%f8", "%f9", "%f10", "%f11"); } - memcpy(dest, second, frame->width); + memcpy(dest, second, frame->vo_frame.pitches[0]); + + memcpy(this->fbbase+frame->buf_u, frame->vo_frame.base[1], frame->lengths[1]); + memcpy(this->fbbase+frame->buf_v, frame->vo_frame.base[2], frame->lengths[2]); } break; #endif default: { memcpy(this->fbbase+frame->buf_y, frame->vo_frame.base[0], frame->lengths[0]); + + memcpy(this->fbbase+frame->buf_u, frame->vo_frame.base[1], frame->lengths[1]); + memcpy(this->fbbase+frame->buf_v, frame->vo_frame.base[2], frame->lengths[2]); } break; } - - memcpy(this->fbbase+frame->buf_u, frame->vo_frame.base[1], frame->lengths[1]); - memcpy(this->fbbase+frame->buf_v, frame->vo_frame.base[2], frame->lengths[2]); } else { memcpy(this->fbbase+frame->buf_y, frame->vo_frame.base[0], frame->lengths[0]); |