summaryrefslogtreecommitdiff
path: root/src/dxr3/dxr3_scr.c
diff options
context:
space:
mode:
authorMichael Roitzsch <mroi@users.sourceforge.net>2004-01-04 22:26:28 +0000
committerMichael Roitzsch <mroi@users.sourceforge.net>2004-01-04 22:26:28 +0000
commitb831c841f570dde9092dfbbf1fc4a40f8b5c301c (patch)
tree49eb53dbbc44ea6ab82042f1f0ae471fdc7141c9 /src/dxr3/dxr3_scr.c
parent5d919982e44bae40e8f9f0c57713b870e7a96582 (diff)
downloadxine-lib-b831c841f570dde9092dfbbf1fc4a40f8b5c301c.tar.gz
xine-lib-b831c841f570dde9092dfbbf1fc4a40f8b5c301c.tar.bz2
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
Diffstat (limited to 'src/dxr3/dxr3_scr.c')
-rw-r--r--src/dxr3/dxr3_scr.c29
1 files changed, 19 insertions, 10 deletions
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, &regs);
+ return ioctl(fd_control, EM8300_IOCTL_WRITEREG, &reg);
}
static void dxr3_scr_update_priority(void *this_gen, xine_cfg_entry_t *entry)