From b831c841f570dde9092dfbbf1fc4a40f8b5c301c Mon Sep 17 00:00:00 2001 From: Michael Roitzsch Date: Sun, 4 Jan 2004 22:26:28 +0000 Subject: The most important change is the smallest: * add a small delay before enabling zoom mode, since the card gets confused when we activate zoom mode before the first frame (that's also what the ChangeLog entry accounts for) Then some less important changes: * give a hint about sync mode to the SCR plugin to properly recover the mode when resuming from pause mode * refactor the enhanced mode handling out of the MPEG encoders into video out * inline some decoder functions, because they are only used once anyway * some additional cleanup CVS patchset: 5996 CVS date: 2004/01/04 22:26:28 --- src/dxr3/dxr3_decode_video.c | 34 ++++++++++++++++++++-------------- src/dxr3/dxr3_mpeg_encoders.c | 20 +------------------- src/dxr3/dxr3_scr.c | 29 +++++++++++++++++++---------- src/dxr3/dxr3_scr.h | 6 ++++-- src/dxr3/em8300.h | 19 +++++++++++++++---- src/dxr3/video_out_dxr3.c | 20 +++++++++++++++++--- src/dxr3/video_out_dxr3.h | 5 +++-- src/libffmpeg/xine_encoder.c | 11 +---------- 8 files changed, 80 insertions(+), 64 deletions(-) (limited to 'src') diff --git a/src/dxr3/dxr3_decode_video.c b/src/dxr3/dxr3_decode_video.c index 4b6c2f339..2f1f4c2ae 100644 --- a/src/dxr3/dxr3_decode_video.c +++ b/src/dxr3/dxr3_decode_video.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: dxr3_decode_video.c,v 1.49 2003/12/14 22:13:22 siggi Exp $ + * $Id: dxr3_decode_video.c,v 1.50 2004/01/04 22:26:28 mroi Exp $ */ /* dxr3 video decoder plugin. @@ -136,10 +136,10 @@ typedef struct dxr3_decoder_s { } dxr3_decoder_t; /* helper functions */ -static int dxr3_present(xine_stream_t *stream); -static int dxr3_mvcommand(int fd_control, int command); -static void parse_mpeg_header(dxr3_decoder_t *this, uint8_t *buffer); -static int get_duration(dxr3_decoder_t *this); +static inline int dxr3_present(xine_stream_t *stream); +static inline int dxr3_mvcommand(int fd_control, int command); +static inline void parse_mpeg_header(dxr3_decoder_t *this, uint8_t *buffer); +static inline int get_duration(dxr3_decoder_t *this); /* config callbacks */ static void dxr3_update_sync_mode(void *this_gen, xine_cfg_entry_t *entry); @@ -428,6 +428,9 @@ static void dxr3_decode_data(video_decoder_t *this_gen, buf_element_t *buf) #endif dxr3_mvcommand(this->fd_control, MVCOMMAND_SYNC); this->resync_window = -RESYNC_WINDOW_SIZE; + pthread_mutex_lock(&this->scr->mutex); + this->scr->sync = 1; + pthread_mutex_unlock(&this->scr->mutex); } if (this->resync_window != 0 && this->resync_window > -RESYNC_WINDOW_SIZE) this->resync_window--; @@ -459,6 +462,9 @@ static void dxr3_decode_data(video_decoder_t *this_gen, buf_element_t *buf) #endif dxr3_mvcommand(this->fd_control, MVCOMMAND_START); this->resync_window = RESYNC_WINDOW_SIZE; + pthread_mutex_lock(&this->scr->mutex); + this->scr->sync = 0; + pthread_mutex_unlock(&this->scr->mutex); } if (this->resync_window != 0 && this->resync_window < RESYNC_WINDOW_SIZE) this->resync_window++; @@ -638,7 +644,7 @@ static void dxr3_dispose(video_decoder_t *this_gen) } -static int dxr3_present(xine_stream_t *stream) +static inline int dxr3_present(xine_stream_t *stream) { plugin_node_t *node; video_driver_class_t *vo_class; @@ -658,18 +664,18 @@ static int dxr3_present(xine_stream_t *stream) return present; } -static int dxr3_mvcommand(int fd_control, int command) +static inline int dxr3_mvcommand(int fd_control, int command) { - em8300_register_t regs; + em8300_register_t reg; - regs.microcode_register = 1; - regs.reg = 0; - regs.val = command; + reg.microcode_register = 1; + reg.reg = 0; + reg.val = command; - return ioctl(fd_control, EM8300_IOCTL_WRITEREG, ®s); + return ioctl(fd_control, EM8300_IOCTL_WRITEREG, ®); } -static void parse_mpeg_header(dxr3_decoder_t *this, uint8_t * buffer) +static inline void parse_mpeg_header(dxr3_decoder_t *this, uint8_t * buffer) { this->frame_rate_code = buffer[3] & 15; this->height = (buffer[0] << 16) | @@ -727,7 +733,7 @@ static void parse_mpeg_header(dxr3_decoder_t *this, uint8_t * buffer) } } -static int get_duration(dxr3_decoder_t *this) +static inline int get_duration(dxr3_decoder_t *this) { int duration; diff --git a/src/dxr3/dxr3_mpeg_encoders.c b/src/dxr3/dxr3_mpeg_encoders.c index c478079a2..7ec432eeb 100644 --- a/src/dxr3/dxr3_mpeg_encoders.c +++ b/src/dxr3/dxr3_mpeg_encoders.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: dxr3_mpeg_encoders.c,v 1.16 2003/12/06 13:26:36 f1rmb Exp $ + * $Id: dxr3_mpeg_encoders.c,v 1.17 2004/01/04 22:26:29 mroi Exp $ */ /* mpeg encoders for the dxr3 video out plugin. @@ -251,15 +251,6 @@ static int rte_on_update_format(dxr3_driver_t *drv, dxr3_frame_t *frame) return 0; } - /* set the dxr3 playmode */ - if (drv->enhanced_mode) { - em8300_register_t regs; - regs.microcode_register = 1; - regs.reg = 0; - regs.val = MVCOMMAND_SYNC; - ioctl(drv->fd_control, EM8300_IOCTL_WRITEREG, ®s); - } - return 1; } @@ -447,15 +438,6 @@ static int fame_on_update_format(dxr3_driver_t *drv, dxr3_frame_t *frame) fame_init (this->context, &this->fp, this->buffer, DEFAULT_BUFFER_SIZE); - /* set the dxr3 playmode */ - if (drv->enhanced_mode) { - em8300_register_t regs; - regs.microcode_register = 1; - regs.reg = 0; - regs.val = MVCOMMAND_SYNC; - ioctl(drv->fd_control, EM8300_IOCTL_WRITEREG, ®s); - } - return 1; } diff --git a/src/dxr3/dxr3_scr.c b/src/dxr3/dxr3_scr.c index ac632874e..2be48c3d8 100644 --- a/src/dxr3/dxr3_scr.c +++ b/src/dxr3/dxr3_scr.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: dxr3_scr.c,v 1.12 2003/12/09 00:02:29 f1rmb Exp $ + * $Id: dxr3_scr.c,v 1.13 2004/01/04 22:26:29 mroi Exp $ */ /* dxr3 scr plugin. @@ -49,7 +49,7 @@ static int dxr3_scr_set_speed(scr_plugin_t *scr, int speed); static void dxr3_scr_exit(scr_plugin_t *scr); /* helper function */ -static int dxr3_mvcommand(int fd_control, int command); +static inline int dxr3_mvcommand(int fd_control, int command); /* config callback */ static void dxr3_scr_update_priority(void *this_gen, xine_cfg_entry_t *entry); @@ -62,7 +62,6 @@ dxr3_scr_t *dxr3_scr_init(xine_t *xine) this = (dxr3_scr_t *)xine_xmalloc(sizeof(dxr3_scr_t)); - this->xine = xine; confstr = xine->config->register_string(xine->config, CONF_LOOKUP, CONF_DEFAULT, CONF_NAME, CONF_HELP, 0, NULL, NULL); if ((this->fd_control = open(confstr, O_WRONLY)) < 0) { @@ -72,6 +71,8 @@ dxr3_scr_t *dxr3_scr_init(xine_t *xine) return NULL; } + this->xine = xine; + this->scr_plugin.interface_version = 2; this->scr_plugin.get_priority = dxr3_scr_get_priority; this->scr_plugin.start = dxr3_scr_start; @@ -87,6 +88,7 @@ dxr3_scr_t *dxr3_scr_init(xine_t *xine) this->offset = 0; this->last_pts = 0; this->scanning = 0; + this->sync = 0; pthread_mutex_init(&this->mutex, NULL); @@ -120,6 +122,7 @@ static void dxr3_scr_start(scr_plugin_t *scr, int64_t vpts) vpts32 = 0x900; ioctl(this->fd_control, EM8300_IOCTL_SCR_SETSPEED, &vpts32); this->scanning = 0; + this->sync = 0; pthread_mutex_unlock(&this->mutex); } @@ -176,6 +179,7 @@ static int dxr3_scr_set_speed(scr_plugin_t *scr, int speed) uint32_t em_speed; int playmode; + pthread_mutex_lock(&this->mutex); switch (speed) { case XINE_SPEED_PAUSE: em_speed = 0; @@ -191,7 +195,10 @@ static int dxr3_scr_set_speed(scr_plugin_t *scr, int speed) break; case XINE_SPEED_NORMAL: em_speed = 0x900; - playmode = MVCOMMAND_SYNC; + if (this->sync) + playmode = MVCOMMAND_SYNC; + else + playmode = MVCOMMAND_START; break; case XINE_SPEED_FAST_2: em_speed = 0x900 * 2; @@ -217,6 +224,8 @@ static int dxr3_scr_set_speed(scr_plugin_t *scr, int speed) if (ioctl(this->fd_control, EM8300_IOCTL_SCR_SETSPEED, &em_speed)) xprintf(this->xine, XINE_VERBOSITY_DEBUG, "dxr3_scr: failed to set speed (%s)\n", strerror(errno)); + pthread_mutex_unlock(&this->mutex); + #if LOG_SCR printf("dxr3_scr: speed set to mode %d\n", speed); #endif @@ -233,15 +242,15 @@ static void dxr3_scr_exit(scr_plugin_t *scr) } -static int dxr3_mvcommand(int fd_control, int command) +static inline int dxr3_mvcommand(int fd_control, int command) { - em8300_register_t regs; + em8300_register_t reg; - regs.microcode_register = 1; - regs.reg = 0; - regs.val = command; + reg.microcode_register = 1; + reg.reg = 0; + reg.val = command; - return ioctl(fd_control, EM8300_IOCTL_WRITEREG, ®s); + return ioctl(fd_control, EM8300_IOCTL_WRITEREG, ®); } static void dxr3_scr_update_priority(void *this_gen, xine_cfg_entry_t *entry) diff --git a/src/dxr3/dxr3_scr.h b/src/dxr3/dxr3_scr.h index d14840d41..fe4f1ccbe 100644 --- a/src/dxr3/dxr3_scr.h +++ b/src/dxr3/dxr3_scr.h @@ -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: dxr3_scr.h,v 1.6 2003/12/09 00:02:29 f1rmb Exp $ + * $Id: dxr3_scr.h,v 1.7 2004/01/04 22:26:29 mroi Exp $ */ #include "xine_internal.h" @@ -28,13 +28,15 @@ typedef struct dxr3_scr_s { scr_plugin_t scr_plugin; pthread_mutex_t mutex; + xine_t *xine; + int fd_control; /* to access the dxr3 control device */ int priority; int64_t offset; /* difference between real scr and internal dxr3 clock */ uint32_t last_pts; /* last known value of internal dxr3 clock to detect wrap around */ int scanning; /* are we in a scanning mode */ - xine_t *xine; + int sync; /* are we in sync mode */ } dxr3_scr_t; /* plugin initialization function */ diff --git a/src/dxr3/em8300.h b/src/dxr3/em8300.h index 425bb92a4..411694646 100644 --- a/src/dxr3/em8300.h +++ b/src/dxr3/em8300.h @@ -79,6 +79,7 @@ typedef struct { #define EM8300_IOCTL_SCR_GETSPEED _IOR('C',17,unsigned) #define EM8300_IOCTL_SCR_SETSPEED _IOW('C',17,unsigned) #define EM8300_IOCTL_FLUSH _IOW('C',18,int) +#define EM8300_IOCTL_VBI _IOW('C',19,struct timeval) #define EM8300_OVERLAY_SIGNAL_ONLY 1 #define EM8300_OVERLAY_SIGNAL_WITH_VGA 2 @@ -323,8 +324,10 @@ struct em8300_s int video_ptsfifo_ptr; #if LINUX_VERSION_CODE < 0x020314 struct wait_queue *video_ptsfifo_wait; + struct wait_queue *vbi_wait; #else wait_queue_head_t video_ptsfifo_wait; + wait_queue_head_t vbi_wait; #endif int video_ptsfifo_waiting; int video_first; @@ -358,6 +361,14 @@ struct em8300_s int overlay_xcorr_default; int overlay_70; int overlay_dword_24bb8; + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,0) + /* Memory exported via mmap() */ + struct list_head memory; +#endif + + /* To support different options for different cards */ + unsigned int card_nr; }; #define TIMEDIFF(a,b) a.tv_usec - b.tv_usec + \ @@ -384,7 +395,7 @@ int em8300_audio_flush(struct em8300_s *em); int em8300_audio_open(struct em8300_s *em); int em8300_audio_release(struct em8300_s *em); int em8300_audio_setup(struct em8300_s *em); -int em8300_audio_write(struct em8300_s *em, const char * buf, +ssize_t em8300_audio_write(struct em8300_s *em, const char * buf, size_t count, loff_t *ppos); int mpegaudio_command(struct em8300_s *em, int cmd); @@ -415,13 +426,13 @@ int em8300_video_flush(struct em8300_s *em); int em8300_video_setup(struct em8300_s *em); int em8300_video_release(struct em8300_s *em); void em8300_video_setspeed(struct em8300_s *em, int speed); -int em8300_video_write(struct em8300_s *em, const char * buf, +ssize_t em8300_video_write(struct em8300_s *em, const char * buf, size_t count, loff_t *ppos); int em8300_video_ioctl(struct em8300_s *em, unsigned int cmd, unsigned long arg); void em8300_video_check_ptsfifo(struct em8300_s *em); /* em8300_spu.c */ -int em8300_spu_write(struct em8300_s *em, const char * buf, +ssize_t em8300_spu_write(struct em8300_s *em, const char * buf, size_t count, loff_t *ppos); int em8300_spu_open(struct em8300_s *em); int em8300_spu_ioctl(struct em8300_s *em, unsigned int cmd, unsigned long arg); @@ -439,7 +450,7 @@ int em8300_ioctl_init(struct em8300_s *em, em8300_microcode_t *useruc); void em8300_ioctl_enable_videoout(struct em8300_s *em, int mode); int em8300_ioctl_setplaymode(struct em8300_s *em, int mode); int em8300_ioctl_setaudiomode(struct em8300_s *em, int mode); -int em8300_ioctl_getaudiomode(struct em8300_s *em, int mode); +int em8300_ioctl_getaudiomode(struct em8300_s *em, long int mode); int em8300_ioctl_overlay_calibrate(struct em8300_s *em, em8300_overlay_calibrate_t *c); int em8300_ioctl_overlay_setwindow(struct em8300_s *em,em8300_overlay_window_t *w); int em8300_ioctl_overlay_setscreen(struct em8300_s *em,em8300_overlay_screen_t *s); diff --git a/src/dxr3/video_out_dxr3.c b/src/dxr3/video_out_dxr3.c index 593e8cbd7..f6f3f69f6 100644 --- a/src/dxr3/video_out_dxr3.c +++ b/src/dxr3/video_out_dxr3.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_dxr3.c,v 1.96 2003/12/14 22:13:22 siggi Exp $ + * $Id: video_out_dxr3.c,v 1.97 2004/01/04 22:26:29 mroi Exp $ */ /* mpeg1 encoding video out plugin for the dxr3. @@ -896,6 +896,9 @@ static void dxr3_display_frame(vo_driver_t *this_gen, vo_frame_t *frame_gen) this->aspect = dxr3_set_property(this_gen, VO_PROP_ASPECT_RATIO, (this->widescreen_enabled ? XINE_VO_ASPECT_4_3 : frame->aspect)); if (frame->pan_scan && !this->pan_scan) { + /* the card needs a break before enabling zoom mode, otherwise it fails + * sometimes (like in the initial menu of "Breakfast at Tiffany's" RC2) */ + xine_usec_sleep(50000); dxr3_set_property(this_gen, VO_PROP_ZOOM_X, 1); this->pan_scan = 1; } @@ -937,8 +940,19 @@ static void dxr3_display_frame(vo_driver_t *this_gen, vo_frame_t *frame_gen) if (this->need_update) { /* we cannot do this earlier, because vo_frame.duration is only valid here */ - if (this->enc && this->enc->on_update_format) - this->enc->on_update_format(this, frame); + if (this->enc && this->enc->on_update_format) { + /* set the dxr3 playmode */ + if (this->enc->on_update_format(this, frame) && this->enhanced_mode) { + em8300_register_t reg; + reg.microcode_register = 1; + reg.reg = 0; + reg.val = MVCOMMAND_SYNC; + ioctl(this->fd_control, EM8300_IOCTL_WRITEREG, ®); + pthread_mutex_lock(&this->class->scr->mutex); + this->class->scr->sync = 1; + pthread_mutex_unlock(&this->class->scr->mutex); + } + } this->need_update = 0; } diff --git a/src/dxr3/video_out_dxr3.h b/src/dxr3/video_out_dxr3.h index e9481851f..1e54e1c4d 100644 --- a/src/dxr3/video_out_dxr3.h +++ b/src/dxr3/video_out_dxr3.h @@ -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_dxr3.h,v 1.20 2003/12/05 15:54:58 f1rmb Exp $ + * $Id: video_out_dxr3.h,v 1.21 2004/01/04 22:26:29 mroi Exp $ */ #ifdef HAVE_CONFIG_H @@ -49,6 +49,8 @@ struct coeff { }; typedef struct dxr3_overlay_s { + xine_t *xine; + int fd_control; int xoffset; @@ -65,7 +67,6 @@ typedef struct dxr3_overlay_s { struct coeff colcal_upper[3]; struct coeff colcal_lower[3]; - xine_t *xine; } dxr3_overlay_t; typedef struct dxr3_driver_class_s { diff --git a/src/libffmpeg/xine_encoder.c b/src/libffmpeg/xine_encoder.c index 7c92223e4..3c87a62fb 100644 --- a/src/libffmpeg/xine_encoder.c +++ b/src/libffmpeg/xine_encoder.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: xine_encoder.c,v 1.9 2003/12/05 15:54:59 f1rmb Exp $ + * $Id: xine_encoder.c,v 1.10 2004/01/04 22:26:29 mroi Exp $ */ /* mpeg encoders for the dxr3 video out plugin. */ @@ -199,15 +199,6 @@ static int lavc_on_update_format(dxr3_driver_t *drv, dxr3_frame_t *frame) return 0; } - /* set the dxr3 playmode */ - if (drv->enhanced_mode) { - em8300_register_t regs; - regs.microcode_register = 1; - regs.reg = 0; - regs.val = MVCOMMAND_SYNC; - ioctl(drv->fd_control, EM8300_IOCTL_WRITEREG, ®s); - } - return 1; } -- cgit v1.2.3