[Mplayer-cvslog] CVS: main/libvo vo_dxr3.c,1.35,1.36
David Holm
mswitch at mplayer.dev.hu
Sat Jan 19 22:20:38 CET 2002
Update of /cvsroot/mplayer/main/libvo
In directory mplayer:/var/tmp.root/cvs-serv28540/libvo
Modified Files:
vo_dxr3.c
Log Message:
Handle timestamps internally
Index: vo_dxr3.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_dxr3.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- vo_dxr3.c 19 Jan 2002 15:01:28 -0000 1.35
+++ vo_dxr3.c 19 Jan 2002 21:20:29 -0000 1.36
@@ -75,6 +75,7 @@
/* Static variable used in ioctl's */
static int ioval = 0;
+static int pts = 0;
static vo_info_t vo_info =
{
@@ -89,7 +90,7 @@
{
size_t data_left = size;
/* Set the timestamp of the next video packet */
- if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts) < 0) {
+ if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &pts) < 0) {
printf("VO: [dxr3] Unable to set pts\n");
}
@@ -183,10 +184,6 @@
printf("VO: [dxr3] Unable to set playmode!\n");
}
- /* Set start pts and speed */
- ioctl(fd_control, EM8300_IOCTL_SCR_SET, &vo_pts);
- ioval = 0x900;
- ioctl(fd_control, EM8300_IOCTL_SCR_SETSPEED, &ioval);
/* Start em8300 prebuffering and sync engine */
reg.microcode_register = 1;
reg.reg = 0;
@@ -390,7 +387,7 @@
if (p->id == 0x20) {
/* Set subpic timestamp */
- if (ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &vo_pts) < 0) {
+ if (ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &pts) < 0) {
printf("VO: [dxr3] Unable to set pts\n");
}
@@ -400,7 +397,7 @@
}
} else {
/* Set frame timestamp */
- if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts) < 0) {
+ if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &pts) < 0) {
printf("VO: [dxr3] Unable to set pts\n");
}
@@ -436,7 +433,7 @@
rgb24toyv12(s, dY, dU, dV, w, h, picture_linesize[0], picture_linesize[1], v_width * 3);
mp1e_buffer.data = picture_data[0];
- mp1e_buffer.time = vo_pts / 90000.0;
+ mp1e_buffer.time = pts / 90000.0;
mp1e_buffer.user_data = NULL;
vo_draw_text(osd_w, osd_h, draw_alpha);
rte_push_video_buffer(mp1e_context, &mp1e_buffer);
@@ -450,24 +447,31 @@
{
static int prev_pts = 0;
/* Flush the device if a seek occured */
- if (prev_pts > vo_pts) {
+ if (prev_pts > pts) {
+ printf("Seek\n");
ioval = EM8300_SUBDEVICE_VIDEO;
ioctl(fd_control, EM8300_IOCTL_FLUSH, &ioval);
+ pts += 90000.0 / vo_fps;
+ ioctl(fd_control, EM8300_IOCTL_SCR_SET, &pts);
+ if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &pts) < 0) {
+ printf("VO: [dxr3] Unable to set pts\n");
+ }
}
- prev_pts = vo_pts;
+ prev_pts = pts;
#ifdef USE_MP1E
if (img_format == IMGFMT_YV12) {
mp1e_buffer.data = picture_data[0];
- mp1e_buffer.time = vo_pts / 90000.0;
+ mp1e_buffer.time = pts / 90000.0;
mp1e_buffer.user_data = NULL;
rte_push_video_buffer(mp1e_context, &mp1e_buffer);
} else if (img_format == IMGFMT_YUY2) {
mp1e_buffer.data = picture_data[0];
- mp1e_buffer.time = vo_pts / 90000.0;
+ mp1e_buffer.time = pts / 90000.0;
mp1e_buffer.user_data = NULL;
rte_push_video_buffer(mp1e_context, &mp1e_buffer);
}
#endif
+ pts += 90000.0 / vo_fps;
}
static uint32_t draw_slice(uint8_t *srcimg[], int stride[], int w, int h, int x0, int y0)
More information about the MPlayer-cvslog
mailing list