[MPlayer-dev-eng] [PATCH 2/2] timing: pass through endpts and time last frame correctly.
Reimar Döffinger
Reimar.Doeffinger at gmx.de
Wed Mar 8 01:15:49 EET 2017
endpts is the only way we can get correct timing
for the last frame.
It should also be useful to implement e.g. correctly
interpolated pts for frame-doubling deinterlacing and
to fix timing for -nodouble rendering (which draws
the frame a decode time, so we need to know the approximately
right time to decode the next frame before it was decoded/filtered).
Fixes trac issue #2315.
---
libmenu/vf_menu.c | 10 +++++-----
libmpcodecs/dec_video.c | 13 +++++++++----
libmpcodecs/dec_video.h | 4 ++--
libmpcodecs/vf.c | 4 ++--
libmpcodecs/vf.h | 9 +++++----
libmpcodecs/vf_1bpp.c | 4 ++--
libmpcodecs/vf_2xsai.c | 4 ++--
libmpcodecs/vf_ass.c | 4 ++--
libmpcodecs/vf_blackframe.c | 4 ++--
libmpcodecs/vf_bmovl.c | 14 +++++++-------
libmpcodecs/vf_boxblur.c | 4 ++--
libmpcodecs/vf_crop.c | 6 +++---
libmpcodecs/vf_cropdetect.c | 4 ++--
libmpcodecs/vf_decimate.c | 4 ++--
libmpcodecs/vf_delogo.c | 4 ++--
libmpcodecs/vf_denoise3d.c | 4 ++--
libmpcodecs/vf_detc.c | 4 ++--
libmpcodecs/vf_dint.c | 4 ++--
libmpcodecs/vf_divtc.c | 6 +++---
libmpcodecs/vf_down3dright.c | 4 ++--
libmpcodecs/vf_eq.c | 4 ++--
libmpcodecs/vf_eq2.c | 4 ++--
libmpcodecs/vf_expand.c | 8 ++++----
libmpcodecs/vf_field.c | 4 ++--
libmpcodecs/vf_fil.c | 6 +++---
libmpcodecs/vf_filmdint.c | 4 ++--
libmpcodecs/vf_fixpts.c | 4 ++--
libmpcodecs/vf_flip.c | 6 +++---
libmpcodecs/vf_framestep.c | 4 ++--
libmpcodecs/vf_fspp.c | 4 ++--
libmpcodecs/vf_geq.c | 4 ++--
libmpcodecs/vf_gradfun.c | 4 ++--
libmpcodecs/vf_halfpack.c | 4 ++--
libmpcodecs/vf_harddup.c | 6 +++---
libmpcodecs/vf_hqdn3d.c | 4 ++--
libmpcodecs/vf_hue.c | 4 ++--
libmpcodecs/vf_il.c | 4 ++--
libmpcodecs/vf_ilpack.c | 4 ++--
libmpcodecs/vf_ivtc.c | 4 ++--
libmpcodecs/vf_kerndeint.c | 6 +++---
libmpcodecs/vf_lavc.c | 4 ++--
libmpcodecs/vf_lavfi.c | 2 +-
libmpcodecs/vf_mcdeint.c | 4 ++--
libmpcodecs/vf_mirror.c | 4 ++--
libmpcodecs/vf_noise.c | 4 ++--
libmpcodecs/vf_ow.c | 4 ++--
libmpcodecs/vf_palette.c | 4 ++--
libmpcodecs/vf_perspective.c | 4 ++--
libmpcodecs/vf_phase.c | 4 ++--
libmpcodecs/vf_pp.c | 4 ++--
libmpcodecs/vf_pp7.c | 4 ++--
libmpcodecs/vf_pullup.c | 6 +++---
libmpcodecs/vf_qp.c | 4 ++--
libmpcodecs/vf_rectangle.c | 4 ++--
libmpcodecs/vf_remove_logo.c | 4 ++--
libmpcodecs/vf_rgbtest.c | 4 ++--
libmpcodecs/vf_rotate.c | 4 ++--
libmpcodecs/vf_sab.c | 4 ++--
libmpcodecs/vf_scale.c | 4 ++--
libmpcodecs/vf_screenshot.c | 4 ++--
libmpcodecs/vf_smartblur.c | 4 ++--
libmpcodecs/vf_softpulldown.c | 8 ++++----
libmpcodecs/vf_softskip.c | 4 ++--
libmpcodecs/vf_spp.c | 4 ++--
libmpcodecs/vf_stereo3d.c | 4 ++--
libmpcodecs/vf_swapuv.c | 4 ++--
libmpcodecs/vf_telecine.c | 8 ++++----
libmpcodecs/vf_test.c | 4 ++--
libmpcodecs/vf_tfields.c | 8 ++++----
libmpcodecs/vf_tile.c | 4 ++--
libmpcodecs/vf_tinterlace.c | 12 ++++++------
libmpcodecs/vf_unsharp.c | 4 ++--
libmpcodecs/vf_uspp.c | 4 ++--
libmpcodecs/vf_vo.c | 9 ++++++++-
libmpcodecs/vf_yadif.c | 6 +++---
libmpcodecs/vf_yuvcsp.c | 4 ++--
libmpcodecs/vf_yvu9.c | 4 ++--
libmpcodecs/vf_zrmjpeg.c | 4 ++--
libmpdemux/demuxer.c | 9 +++++++++
libmpdemux/demuxer.h | 1 +
libmpdemux/stheader.h | 2 ++
mencoder.c | 8 ++++----
mplayer.c | 29 ++++++++++++++++++++++-------
83 files changed, 237 insertions(+), 197 deletions(-)
diff --git a/libmenu/vf_menu.c b/libmenu/vf_menu.c
index cac1c040d..2e601e0dc 100644
--- a/libmenu/vf_menu.c
+++ b/libmenu/vf_menu.c
@@ -54,12 +54,12 @@ struct vf_priv_s {
int passthrough;
};
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts);
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts);
void vf_menu_pause_update(struct vf_instance *vf) {
const vo_functions_t *video_out = mpctx_get_video_out(vf->priv->current->ctx);
if(pause_mpi) {
- put_image(vf,pause_mpi, MP_NOPTS_VALUE);
+ put_image(vf,pause_mpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
// Don't draw the osd atm
//vf->control(vf,VFCTRL_DRAW_OSD,NULL);
video_out->flip_page();
@@ -137,14 +137,14 @@ static int key_cb(int code) {
return menu_read_key(st_priv->current,code);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi = NULL;
if (vf->priv->passthrough) {
dmpi=vf_get_image(vf->next, IMGFMT_MPEGPES, MP_IMGTYPE_EXPORT,
0, mpi->w, mpi->h);
dmpi->planes[0]=mpi->planes[0];
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
// Close all menu who requested it
@@ -202,7 +202,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
dmpi->priv = mpi->priv;
}
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
static void uninit(vf_instance_t *vf) {
diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c
index 97a9ac29c..dd9380fff 100644
--- a/libmpcodecs/dec_video.c
+++ b/libmpcodecs/dec_video.c
@@ -388,7 +388,7 @@ int init_best_video_codec(sh_video_t *sh_video, char **video_codec_list,
}
void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
- int drop_frame, double pts, int *full_frame)
+ int drop_frame, double pts, double endpts, int *full_frame)
{
mp_image_t *mpi = NULL;
unsigned int t = GetTimer();
@@ -420,9 +420,12 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
for (i = 0; i < sh_video->num_buffered_pts; i++)
if (sh_video->buffered_pts[i] < pts)
break;
- for (j = sh_video->num_buffered_pts; j > i; j--)
+ for (j = sh_video->num_buffered_pts; j > i; j--) {
sh_video->buffered_pts[j] = sh_video->buffered_pts[j - 1];
+ sh_video->buffered_endpts[j] = sh_video->buffered_endpts[j - 1];
+ }
sh_video->buffered_pts[i] = pts;
+ sh_video->buffered_endpts[i] = endpts;
sh_video->num_buffered_pts++;
}
}
@@ -454,10 +457,12 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
if (sh_video->num_buffered_pts) {
sh_video->num_buffered_pts--;
sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts];
+ sh_video->endpts = sh_video->buffered_endpts[sh_video->num_buffered_pts];
} else {
mp_msg(MSGT_CPLAYER, MSGL_ERR,
"No pts value from demuxer to use for frame!\n");
sh_video->pts = MP_NOPTS_VALUE;
+ sh_video->endpts = MP_NOPTS_VALUE;
}
if (delay >= 0) {
// limit buffered pts only afterwards so we do not get confused
@@ -479,13 +484,13 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
return mpi;
}
-int filter_video(sh_video_t *sh_video, void *frame, double pts)
+int filter_video(sh_video_t *sh_video, void *frame, double pts, double endpts)
{
mp_image_t *mpi = frame;
unsigned int t2 = GetTimer();
vf_instance_t *vf = sh_video->vfilter;
// apply video filters and call the leaf vo/ve
- int ret = vf->put_image(vf, mpi, pts);
+ int ret = vf->put_image(vf, mpi, pts, endpts);
if (ret > 0) {
// draw EOSD first so it ends up below the OSD.
// Note that changing this is will not work right with vf_ass and the
diff --git a/libmpcodecs/dec_video.h b/libmpcodecs/dec_video.h
index 4be420592..2a53a70e5 100644
--- a/libmpcodecs/dec_video.h
+++ b/libmpcodecs/dec_video.h
@@ -29,8 +29,8 @@ void vfm_help(void);
int init_best_video_codec(sh_video_t *sh_video, char** video_codec_list, char** video_fm_list);
void uninit_video(sh_video_t *sh_video);
-void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size, int drop_frame, double pts, int *full_frame);
-int filter_video(sh_video_t *sh_video, void *frame, double pts);
+void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size, int drop_frame, double pts, double endpts, int *full_frame);
+int filter_video(sh_video_t *sh_video, void *frame, double pts, double endpts);
int get_video_quality_max(sh_video_t *sh_video);
void set_video_quality(sh_video_t *sh_video, int quality);
diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c
index d7d0e5f78..046579151 100644
--- a/libmpcodecs/vf.c
+++ b/libmpcodecs/vf.c
@@ -716,14 +716,14 @@ int vf_next_query_format(struct vf_instance *vf, unsigned int fmt){
return flags;
}
-int vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts){
+int vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts, double endpts){
mpi->usage_count--;
if (mpi->usage_count < 0) {
mp_msg(MSGT_VFILTER, MSGL_V, "Bad mp_image usage count %i in vf_%s (type %i)\n",
mpi->usage_count, vf->info->name, mpi->type);
mpi->usage_count = 0;
}
- return vf->next->put_image(vf->next,mpi, pts);
+ return vf->next->put_image(vf->next,mpi, pts, endpts);
}
void vf_next_draw_slice(struct vf_instance *vf,unsigned char** src, int * stride,int w, int h, int x, int y){
diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h
index 8fad5f2e8..0276e5a2d 100644
--- a/libmpcodecs/vf.h
+++ b/libmpcodecs/vf.h
@@ -66,7 +66,7 @@ typedef struct vf_instance {
void (*get_image)(struct vf_instance *vf,
mp_image_t *mpi);
int (*put_image)(struct vf_instance *vf,
- mp_image_t *mpi, double pts);
+ mp_image_t *mpi, double pts, double endpts);
void (*start_slice)(struct vf_instance *vf,
mp_image_t *mpi);
void (*draw_slice)(struct vf_instance *vf,
@@ -109,8 +109,9 @@ typedef struct vf_seteq_s
#define VFCTRL_INIT_EOSD 15 /* Select EOSD renderer */
#define VFCTRL_DRAW_EOSD 16 /* Render EOSD */
#define VFCTRL_GET_PTS 17 /* Return last pts value that reached vf_vo*/
-#define VFCTRL_SET_DEINTERLACE 18 /* Set deinterlacing status */
-#define VFCTRL_GET_DEINTERLACE 19 /* Get deinterlacing status */
+#define VFCTRL_GET_ENDPTS 18 /* Return last endpts value that reached vf_vo*/
+#define VFCTRL_SET_DEINTERLACE 19 /* Set deinterlacing status */
+#define VFCTRL_GET_DEINTERLACE 20 /* Get deinterlacing status */
#include "vfcap.h"
@@ -138,7 +139,7 @@ int vf_next_config(struct vf_instance *vf,
int vf_next_control(struct vf_instance *vf, int request, void* data);
void vf_extra_flip(struct vf_instance *vf);
int vf_next_query_format(struct vf_instance *vf, unsigned int fmt);
-int vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts);
+int vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts, double endpts);
void vf_next_draw_slice (struct vf_instance *vf, unsigned char** src, int* stride, int w,int h, int x, int y);
vf_instance_t* append_filters(vf_instance_t* last);
diff --git a/libmpcodecs/vf_1bpp.c b/libmpcodecs/vf_1bpp.c
index 8d1373594..5d09935b3 100644
--- a/libmpcodecs/vf_1bpp.c
+++ b/libmpcodecs/vf_1bpp.c
@@ -123,7 +123,7 @@ static void convert(mp_image_t *mpi, mp_image_t *dmpi, int value0, int value1,in
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
// hope we'll get DR buffer:
@@ -173,7 +173,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
return 0;
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_2xsai.c b/libmpcodecs/vf_2xsai.c
index a19420ff9..90eb76ee4 100644
--- a/libmpcodecs/vf_2xsai.c
+++ b/libmpcodecs/vf_2xsai.c
@@ -290,7 +290,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,2*width,2*height,2*d_width,2*d_height,flags,outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
// hope we'll get DR buffer:
@@ -302,7 +302,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
dmpi->planes[0], dmpi->stride[0],
mpi->w, mpi->h, mpi->bpp/8);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_ass.c b/libmpcodecs/vf_ass.c
index a5b50d97e..cc4b8289c 100644
--- a/libmpcodecs/vf_ass.c
+++ b/libmpcodecs/vf_ass.c
@@ -836,7 +836,7 @@ static void prepare_eosd(vf_instance_t *vf, struct mp_eosd_image_list *imgs)
vf->priv->prepare_buffer(vf);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
struct mp_eosd_image_list images;
eosd_render_frame(pts, &images);
@@ -844,7 +844,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
if (images.changed)
prepare_eosd(vf, &images);
vf->priv->render_frame(vf);
- return vf_next_put_image(vf, vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
static int query_format(struct vf_instance *vf, unsigned int fmt)
diff --git a/libmpcodecs/vf_blackframe.c b/libmpcodecs/vf_blackframe.c
index c72552c99..4d745344a 100644
--- a/libmpcodecs/vf_blackframe.c
+++ b/libmpcodecs/vf_blackframe.c
@@ -66,7 +66,7 @@ static int query_format(struct vf_instance *vf, unsigned fmt) {
return 0;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int x, y;
int nblack=0, pblack=0;
@@ -107,7 +107,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf_clone_mpi_attributes(dmpi, mpi);
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control(struct vf_instance *vf, int request, void* data){
diff --git a/libmpcodecs/vf_bmovl.c b/libmpcodecs/vf_bmovl.c
index bfbbe0be7..a40dee4d5 100644
--- a/libmpcodecs/vf_bmovl.c
+++ b/libmpcodecs/vf_bmovl.c
@@ -217,7 +217,7 @@ _read_cmd(int fd, char *cmd, char *args) {
static int
-put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
+put_image(struct vf_instance *vf, mp_image_t* mpi, double pts, double endpts){
int buf_x=0, buf_y=0, buf_pos=0;
int have, got, want;
int xpos=0, ypos=0, pos=0;
@@ -264,10 +264,10 @@ put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
else if( strncmp(cmd,"OPAQUE",6)==0 ) vf->priv->opaque=TRUE;
else if( strncmp(cmd,"SHOW", 4)==0 ) vf->priv->hidden=FALSE;
else if( strncmp(cmd,"HIDE", 4)==0 ) vf->priv->hidden=TRUE;
- else if( strncmp(cmd,"FLUSH" ,5)==0 ) return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ else if( strncmp(cmd,"FLUSH" ,5)==0 ) return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
else {
mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: Unknown command: '%s'. Ignoring.\n", cmd);
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
if(command == CMD_ALPHA) {
@@ -286,7 +286,7 @@ put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
buffer = malloc(imgw*imgh*pxsz);
if(!buffer) {
mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: Couldn't allocate temporary buffer! Skipping...\n\n");
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
/* pipes/sockets might need multiple calls to read(): */
want = (imgw*imgh*pxsz);
@@ -347,7 +347,7 @@ put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
if( (imgx <= vf->priv->x2) && ( (imgx+imgw) >= vf->priv->x2) )
vf->priv->x2 = imgx;
}
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
for( buf_y=0 ; (buf_y < imgh) && (buf_y < (vf->priv->h-imgy)) ; buf_y++ ) {
@@ -405,7 +405,7 @@ put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
}
}
- if(vf->priv->hidden) return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ if(vf->priv->hidden) return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
if(vf->priv->opaque) { // Just copy buffer memory to screen
for( ypos=vf->priv->y1 ; ypos < vf->priv->y2 ; ypos++ ) {
@@ -460,7 +460,7 @@ put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
} // for xpos
} // for ypos
} // if !opaque
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
} // put_image
static int
diff --git a/libmpcodecs/vf_boxblur.c b/libmpcodecs/vf_boxblur.c
index bc1ec8028..004dbea80 100644
--- a/libmpcodecs/vf_boxblur.c
+++ b/libmpcodecs/vf_boxblur.c
@@ -127,7 +127,7 @@ static void vBlur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int s
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
@@ -151,7 +151,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vBlur(dmpi->planes[2], dmpi->planes[2], cw,ch,
dmpi->stride[2], dmpi->stride[2], vf->priv->chromaParam.radius, vf->priv->chromaParam.power);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_crop.c b/libmpcodecs/vf_crop.c
index 20b0228d8..784ce0e3b 100644
--- a/libmpcodecs/vf_crop.c
+++ b/libmpcodecs/vf_crop.c
@@ -84,10 +84,10 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,vf->priv->crop_w,vf->priv->crop_h,d_width,d_height,flags,outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if (mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf,vf->dmpi, pts, endpts);
dmpi=vf_get_image(vf->next,mpi->imgfmt,
MP_IMGTYPE_EXPORT, 0,
vf->priv->crop_w, vf->priv->crop_h);
@@ -108,7 +108,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
}
dmpi->stride[0]=mpi->stride[0];
dmpi->width=mpi->width;
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
static void start_slice(struct vf_instance *vf, mp_image_t *mpi){
diff --git a/libmpcodecs/vf_cropdetect.c b/libmpcodecs/vf_cropdetect.c
index c3de24793..0750418ce 100644
--- a/libmpcodecs/vf_cropdetect.c
+++ b/libmpcodecs/vf_cropdetect.c
@@ -72,7 +72,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int bpp=mpi->bpp/8;
int w,h,x,y,shrink_by;
@@ -161,7 +161,7 @@ if(++vf->priv->fno>0){ // ignore first 2 frames - they may be empty
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf,dmpi, pts, endpts);
}
static int query_format(struct vf_instance *vf, unsigned int fmt) {
diff --git a/libmpcodecs/vf_decimate.c b/libmpcodecs/vf_decimate.c
index 902c29204..5d4c93734 100644
--- a/libmpcodecs/vf_decimate.c
+++ b/libmpcodecs/vf_decimate.c
@@ -128,7 +128,7 @@ static int diff_to_drop(int hi, int lo, float frac, mp_image_t *old, mp_image_t
new->w*(new->bpp/8), new->h, old->stride[0], new->stride[0]);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -161,7 +161,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
mpi->chroma_width, mpi->chroma_height,
dmpi->stride[2], mpi->stride[2]);
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf)
diff --git a/libmpcodecs/vf_delogo.c b/libmpcodecs/vf_delogo.c
index add6dc6b0..dd3714122 100644
--- a/libmpcodecs/vf_delogo.c
+++ b/libmpcodecs/vf_delogo.c
@@ -195,7 +195,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(mpi->flags&MP_IMGFLAG_DIRECT) {
@@ -223,7 +223,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf_clone_mpi_attributes(dmpi, mpi);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_denoise3d.c b/libmpcodecs/vf_denoise3d.c
index a952a2228..7619cca33 100644
--- a/libmpcodecs/vf_denoise3d.c
+++ b/libmpcodecs/vf_denoise3d.c
@@ -109,7 +109,7 @@ static void deNoise(unsigned char *Frame, // mpi->planes[x]
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
int W = mpi->w, H = mpi->h;
@@ -142,7 +142,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf->priv->Coefs[3] + 256);
vf->priv->pmpi=dmpi; // save reference image
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_detc.c b/libmpcodecs/vf_detc.c
index 511ae3160..a27048bb0 100644
--- a/libmpcodecs/vf_detc.c
+++ b/libmpcodecs/vf_detc.c
@@ -310,10 +310,10 @@ static int do_put_image(struct vf_instance *vf, mp_image_t *dmpi)
}
p->outframes++;
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
int ret=0;
mp_image_t *dmpi;
diff --git a/libmpcodecs/vf_dint.c b/libmpcodecs/vf_dint.c
index ac5bf54a5..18740a177 100644
--- a/libmpcodecs/vf_dint.c
+++ b/libmpcodecs/vf_dint.c
@@ -79,7 +79,7 @@ static int config (struct vf_instance *vf,
return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
}
-static int put_image (struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image (struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
int8_t rrow0[MAXROWSIZE];
int8_t rrow1[MAXROWSIZE];
@@ -188,7 +188,7 @@ static int put_image (struct vf_instance *vf, mp_image_t *mpi, double pts)
}
vf->priv->was_dint = 0;
// mp_msg (MSGT_VFILTER, MSGL_INFO, "DI:%d/%d ", vf->priv->rdfr, vf->priv->dfr);
- return vf_next_put_image (vf, mpi, pts);
+ return vf_next_put_image(vf, mpi, pts, endpts);
}
static int vf_open(vf_instance_t *vf, char *args){
diff --git a/libmpcodecs/vf_divtc.c b/libmpcodecs/vf_divtc.c
index 111e16f97..48112a9b6 100644
--- a/libmpcodecs/vf_divtc.c
+++ b/libmpcodecs/vf_divtc.c
@@ -258,7 +258,7 @@ static int match(struct vf_priv_s *p, int *diffs,
return m;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi, *tmpi=0;
int n, m, f, newphase;
@@ -373,12 +373,12 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
imgop(copyop, tmpi, mpi, 0);
imgop(deghost_plane, tmpi, dmpi, p->deghost);
imgop(copyop, dmpi, mpi, 0);
- return vf_next_put_image(vf, tmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, tmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
}
imgop(copyop, dmpi, mpi, 0);
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
static int analyze(struct vf_priv_s *p)
diff --git a/libmpcodecs/vf_down3dright.c b/libmpcodecs/vf_down3dright.c
index f1e1f49b0..d1c015d0f 100644
--- a/libmpcodecs/vf_down3dright.c
+++ b/libmpcodecs/vf_down3dright.c
@@ -96,7 +96,7 @@ static void toright(unsigned char *dst[3], unsigned char *src[3],
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -110,7 +110,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
toright(dmpi->planes, mpi->planes, dmpi->stride,
mpi->stride, mpi->w, mpi->h, vf->priv);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int config(struct vf_instance *vf,
diff --git a/libmpcodecs/vf_eq.c b/libmpcodecs/vf_eq.c
index c432b1368..1ee3a5970 100644
--- a/libmpcodecs/vf_eq.c
+++ b/libmpcodecs/vf_eq.c
@@ -132,7 +132,7 @@ static void (*process)(unsigned char *dest, int dstride, unsigned char *src, int
/* FIXME: add packed yuv version of process */
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -158,7 +158,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
vf->priv->contrast);
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control(struct vf_instance *vf, int request, void* data)
diff --git a/libmpcodecs/vf_eq2.c b/libmpcodecs/vf_eq2.c
index 275f19698..e02a59c88 100644
--- a/libmpcodecs/vf_eq2.c
+++ b/libmpcodecs/vf_eq2.c
@@ -238,7 +238,7 @@ void apply_lut (eq2_param_t *par, unsigned char *dst, unsigned char *src,
}
static
-int put_image (vf_instance_t *vf, mp_image_t *src, double pts)
+int put_image (vf_instance_t *vf, mp_image_t *src, double pts, double endpts)
{
unsigned i;
vf_eq2_t *eq2;
@@ -278,7 +278,7 @@ int put_image (vf_instance_t *vf, mp_image_t *src, double pts)
}
}
- return vf_next_put_image (vf, dst, pts);
+ return vf_next_put_image(vf, dst, pts, endpts);
}
static
diff --git a/libmpcodecs/vf_expand.c b/libmpcodecs/vf_expand.c
index 85fae067c..ef9d9030c 100644
--- a/libmpcodecs/vf_expand.c
+++ b/libmpcodecs/vf_expand.c
@@ -398,12 +398,12 @@ static void draw_slice(struct vf_instance *vf,
vf->priv->first_slice = 0;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
if (vf->priv->passthrough) {
mp_image_t *dmpi = vf_get_image(vf->next, IMGFMT_MPEGPES,
MP_IMGTYPE_EXPORT, 0, mpi->w, mpi->h);
dmpi->planes[0]=mpi->planes[0];
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
if(mpi->flags&MP_IMGFLAG_DIRECT || mpi->flags&MP_IMGFLAG_DRAW_CALLBACK){
@@ -423,7 +423,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
// we've used DR, so we're ready...
if(!(mpi->flags&MP_IMGFLAG_PLANAR))
vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
// hope we'll get DR buffer:
@@ -455,7 +455,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
#ifdef OSD_SUPPORT
if(vf->priv->osd) draw_osd(vf,mpi->w,mpi->h);
#endif
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_field.c b/libmpcodecs/vf_field.c
index fcf24be0b..1d735c9c3 100644
--- a/libmpcodecs/vf_field.c
+++ b/libmpcodecs/vf_field.c
@@ -38,7 +38,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,width,height/2,d_width,d_height,flags,outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE,
mpi->width, mpi->height/2);
@@ -56,7 +56,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
} else
vf->dmpi->planes[1]=mpi->planes[1]; // passthru bgr8 palette!!!
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_fil.c b/libmpcodecs/vf_fil.c
index 7df7eb0af..a16ea66a1 100644
--- a/libmpcodecs/vf_fil.c
+++ b/libmpcodecs/vf_fil.c
@@ -63,10 +63,10 @@ static int config(struct vf_instance *vf,
(d_width*vf->priv->stridefactor)>>1, 2*d_height/vf->priv->stridefactor, flags, outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
if(mpi->flags&MP_IMGFLAG_DIRECT){
// we've used DR, so we're ready...
- return vf_next_put_image(vf,(mp_image_t*)mpi->priv, pts);
+ return vf_next_put_image(vf, (mp_image_t*)mpi->priv, pts, endpts);
}
vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
@@ -84,7 +84,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
} else
vf->dmpi->planes[1]=mpi->planes[1]; // passthru bgr8 palette!!!
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_filmdint.c b/libmpcodecs/vf_filmdint.c
index 2e43bc1a1..3795170a0 100644
--- a/libmpcodecs/vf_filmdint.c
+++ b/libmpcodecs/vf_filmdint.c
@@ -1136,7 +1136,7 @@ find_breaks(struct vf_priv_s *p, struct frame_stats *s)
#define ITOC(X) (!(X) ? ' ' : (X) + ((X)>9 ? 'a'-10 : '0'))
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
struct vf_priv_s *p = vf->priv;
@@ -1331,7 +1331,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
"" : " @@@@@@@@@@@@@@@@@");
p->merge_time += get_time() - diff_time;
- return show_fields ? vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE) : 0;
+ return show_fields ? vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE) : 0;
}
static int query_format(struct vf_instance *vf, unsigned int fmt)
diff --git a/libmpcodecs/vf_fixpts.c b/libmpcodecs/vf_fixpts.c
index ae32b40d8..6bf17ee40 100644
--- a/libmpcodecs/vf_fixpts.c
+++ b/libmpcodecs/vf_fixpts.c
@@ -38,7 +38,7 @@ struct vf_priv_s {
unsigned print:1;
};
-static int put_image(vf_instance_t *vf, mp_image_t *src, double pts)
+static int put_image(vf_instance_t *vf, mp_image_t *src, double pts, double endpts)
{
struct vf_priv_s *p = vf->priv;
@@ -63,7 +63,7 @@ static int put_image(vf_instance_t *vf, mp_image_t *src, double pts)
} else {
pts = MP_NOPTS_VALUE;
}
- return vf_next_put_image(vf, src, pts);
+ return vf_next_put_image(vf, src, pts, endpts);
}
static void uninit(vf_instance_t *vf)
diff --git a/libmpcodecs/vf_flip.c b/libmpcodecs/vf_flip.c
index e8660ceb5..742e9fdfb 100644
--- a/libmpcodecs/vf_flip.c
+++ b/libmpcodecs/vf_flip.c
@@ -59,12 +59,12 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
if(mpi->flags&MP_IMGFLAG_DIRECT){
// we've used DR, so we're ready...
if(!(mpi->flags&MP_IMGFLAG_PLANAR))
((mp_image_t*)mpi->priv)->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
- return vf_next_put_image(vf,(mp_image_t*)mpi->priv, pts);
+ return vf_next_put_image(vf, (mp_image_t*)mpi->priv, pts, endpts);
}
vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
@@ -85,7 +85,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
} else
vf->dmpi->planes[1]=mpi->planes[1]; // passthru bgr8 palette!!!
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_framestep.c b/libmpcodecs/vf_framestep.c
index 701e6afba..8a126790b 100644
--- a/libmpcodecs/vf_framestep.c
+++ b/libmpcodecs/vf_framestep.c
@@ -89,7 +89,7 @@ struct vf_priv_s {
};
/* Filter handler */
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
struct vf_priv_s *priv;
@@ -139,7 +139,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->height = mpi->height;
/* Chain to next filter / output ... */
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
/* Skip the frame */
diff --git a/libmpcodecs/vf_fspp.c b/libmpcodecs/vf_fspp.c
index 09b90096b..9bb967710 100644
--- a/libmpcodecs/vf_fspp.c
+++ b/libmpcodecs/vf_fspp.c
@@ -523,7 +523,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi)
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
@@ -574,7 +574,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
#if HAVE_MMXEXT_INLINE
if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t");
#endif
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf)
diff --git a/libmpcodecs/vf_geq.c b/libmpcodecs/vf_geq.c
index 6360f5da1..6414ec3b2 100644
--- a/libmpcodecs/vf_geq.c
+++ b/libmpcodecs/vf_geq.c
@@ -78,7 +78,7 @@ static double cr(void *vf, double x, double y){
return getpix(vf, x, y, 2);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int x,y, plane;
@@ -124,7 +124,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf->priv->framenum++;
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_gradfun.c b/libmpcodecs/vf_gradfun.c
index 2e64a42c8..8e84027b1 100644
--- a/libmpcodecs/vf_gradfun.c
+++ b/libmpcodecs/vf_gradfun.c
@@ -295,7 +295,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi)
mpi->flags |= MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi = vf->dmpi;
int p;
@@ -326,7 +326,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->stride[p], mpi->stride[p]);
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int query_format(struct vf_instance *vf, unsigned int fmt)
diff --git a/libmpcodecs/vf_halfpack.c b/libmpcodecs/vf_halfpack.c
index 981d09e28..2b4c8c669 100644
--- a/libmpcodecs/vf_halfpack.c
+++ b/libmpcodecs/vf_halfpack.c
@@ -163,7 +163,7 @@ static void (*halfpack)(unsigned char *dst, unsigned char *src[3],
int dststride, int srcstride[3], int w, int h);
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
const uint8_t *src[MP_MAX_PLANES] = {
mpi->planes[0] + mpi->stride[0]*vf->priv->field,
@@ -187,7 +187,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
mpi->stride, mpi->w, mpi->h);
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int config(struct vf_instance *vf,
diff --git a/libmpcodecs/vf_harddup.c b/libmpcodecs/vf_harddup.c
index 5b6c2ff01..249b37ae9 100644
--- a/libmpcodecs/vf_harddup.c
+++ b/libmpcodecs/vf_harddup.c
@@ -31,7 +31,7 @@ struct vf_priv_s {
mp_image_t *last_mpi;
};
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -49,7 +49,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->stride[2] = mpi->stride[2];
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control(struct vf_instance *vf, int request, void* data)
@@ -61,7 +61,7 @@ static int control(struct vf_instance *vf, int request, void* data)
// has been called earlier in the filter chain
// since the last put_image. This is reasonable
// because we're handling a duplicate frame!
- if (put_image(vf, vf->priv->last_mpi, MP_NOPTS_VALUE))
+ if (put_image(vf, vf->priv->last_mpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE))
return CONTROL_TRUE;
break;
}
diff --git a/libmpcodecs/vf_hqdn3d.c b/libmpcodecs/vf_hqdn3d.c
index eba3439d8..922254492 100644
--- a/libmpcodecs/vf_hqdn3d.c
+++ b/libmpcodecs/vf_hqdn3d.c
@@ -208,7 +208,7 @@ static void deNoise(unsigned char *Frame, // mpi->planes[x]
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
int W = mpi->w, H = mpi->h;
@@ -238,7 +238,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf->priv->Coefs[2],
vf->priv->Coefs[3]);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_hue.c b/libmpcodecs/vf_hue.c
index 177142f03..80a3bc0c3 100644
--- a/libmpcodecs/vf_hue.c
+++ b/libmpcodecs/vf_hue.c
@@ -76,7 +76,7 @@ static void (*process)(uint8_t *udst, uint8_t *vdst, uint8_t *usrc, uint8_t *vsr
/* FIXME: add packed yuv version of process */
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -107,7 +107,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
vf->priv->hue, vf->priv->saturation);
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control(struct vf_instance *vf, int request, void* data)
diff --git a/libmpcodecs/vf_il.c b/libmpcodecs/vf_il.c
index 210e30d3f..079ea791d 100644
--- a/libmpcodecs/vf_il.c
+++ b/libmpcodecs/vf_il.c
@@ -73,7 +73,7 @@ static void interleave(uint8_t *dst, uint8_t *src, int w, int h, int dstStride,
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int w;
FilterParam *luma = &vf->priv->lumaParam;
FilterParam *chroma= &vf->priv->chromaParam;
@@ -100,7 +100,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
dmpi->stride[2], mpi->stride[2], chroma->interleave, luma->swap);
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_ilpack.c b/libmpcodecs/vf_ilpack.c
index 731d93f20..214c07c62 100644
--- a/libmpcodecs/vf_ilpack.c
+++ b/libmpcodecs/vf_ilpack.c
@@ -373,7 +373,7 @@ static void ilpack(unsigned char *dst, unsigned char *src[3],
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -384,7 +384,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
ilpack(dmpi->planes[0], mpi->planes, dmpi->stride[0], mpi->stride, mpi->w, mpi->h, vf->priv->pack);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int config(struct vf_instance *vf,
diff --git a/libmpcodecs/vf_ivtc.c b/libmpcodecs/vf_ivtc.c
index 5a19d24ab..9b41533fe 100644
--- a/libmpcodecs/vf_ivtc.c
+++ b/libmpcodecs/vf_ivtc.c
@@ -452,10 +452,10 @@ static int do_put_image(struct vf_instance *vf, mp_image_t *dmpi)
}
p->outframes++;
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
int ret=0;
struct vf_priv_s *p = vf->priv;
diff --git a/libmpcodecs/vf_kerndeint.c b/libmpcodecs/vf_kerndeint.c
index c5197fc54..f69c6e67c 100644
--- a/libmpcodecs/vf_kerndeint.c
+++ b/libmpcodecs/vf_kerndeint.c
@@ -74,7 +74,7 @@ static inline int IsYUY2(mp_image_t *mpi)
#define PLANAR_U 1
#define PLANAR_V 2
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
int W = mpi->w, H = mpi->h;
@@ -98,7 +98,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
mp_image_t *dmpi, *pmpi;
if(!vf->priv->do_deinterlace)
- return vf_next_put_image(vf, mpi, pts);
+ return vf_next_put_image(vf, mpi, pts, endpts);
dmpi=vf_get_image(vf->next,mpi->imgfmt,
MP_IMGTYPE_IP, MP_IMGFLAG_ACCEPT_STRIDE,
@@ -273,7 +273,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
}
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_lavc.c b/libmpcodecs/vf_lavc.c
index 62dcf91a4..e6bbc50d3 100644
--- a/libmpcodecs/vf_lavc.c
+++ b/libmpcodecs/vf_lavc.c
@@ -82,7 +82,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_MPEGPES);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t* dmpi;
int out_size;
AVFrame *pic= vf->priv->pic;
@@ -116,7 +116,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
dmpi->planes[0]=(unsigned char*)&vf->priv->pes;
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_lavfi.c b/libmpcodecs/vf_lavfi.c
index 0f6e71a05..905b13bfe 100644
--- a/libmpcodecs/vf_lavfi.c
+++ b/libmpcodecs/vf_lavfi.c
@@ -300,7 +300,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi)
mpi->priv = buf;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
AVFilterBufferRef *buf;
mp_image_t *cmpi = NULL;
diff --git a/libmpcodecs/vf_mcdeint.c b/libmpcodecs/vf_mcdeint.c
index 1b2d1bbaf..f2fc4711c 100644
--- a/libmpcodecs/vf_mcdeint.c
+++ b/libmpcodecs/vf_mcdeint.c
@@ -282,7 +282,7 @@ return; //caused problems, dunno why
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
@@ -298,7 +298,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_mirror.c b/libmpcodecs/vf_mirror.c
index 5ac05e914..06c299ba1 100644
--- a/libmpcodecs/vf_mirror.c
+++ b/libmpcodecs/vf_mirror.c
@@ -83,7 +83,7 @@ static void mirror(unsigned char* dst,unsigned char* src,int dststride,int srcst
//===========================================================================//
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
// hope we'll get DR buffer:
@@ -108,7 +108,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
dmpi->planes[1]=mpi->planes[1]; // passthrough rgb8 palette
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_noise.c b/libmpcodecs/vf_noise.c
index 0fe9dcb96..244294a7b 100644
--- a/libmpcodecs/vf_noise.c
+++ b/libmpcodecs/vf_noise.c
@@ -339,7 +339,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
@@ -365,7 +365,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t");
#endif
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_ow.c b/libmpcodecs/vf_ow.c
index f7fb02db7..4647068cd 100644
--- a/libmpcodecs/vf_ow.c
+++ b/libmpcodecs/vf_ow.c
@@ -233,7 +233,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
@@ -251,7 +251,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, 0);
filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, 0);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_palette.c b/libmpcodecs/vf_palette.c
index fc6764b0b..eafac4d02 100644
--- a/libmpcodecs/vf_palette.c
+++ b/libmpcodecs/vf_palette.c
@@ -112,7 +112,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,width,height,d_width,d_height,flags,vf->priv->fmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
uint8_t *old_palette = mpi->planes[1];
@@ -171,7 +171,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
}
mpi->planes[1] = old_palette;
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_perspective.c b/libmpcodecs/vf_perspective.c
index f5a9d6be3..e826195ab 100644
--- a/libmpcodecs/vf_perspective.c
+++ b/libmpcodecs/vf_perspective.c
@@ -260,7 +260,7 @@ static inline void resampleLinear(uint8_t *dst, uint8_t *src, int w, int h, int
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
@@ -286,7 +286,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift);
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_phase.c b/libmpcodecs/vf_phase.c
index 101290dec..790ffa199 100644
--- a/libmpcodecs/vf_phase.c
+++ b/libmpcodecs/vf_phase.c
@@ -196,7 +196,7 @@ static enum mode analyze_plane(unsigned char *old, unsigned char *new,
return mode;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
int w;
@@ -237,7 +237,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
&vf->priv->buf[2], mode);
}
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
static void uninit(struct vf_instance *vf)
diff --git a/libmpcodecs/vf_pp.c b/libmpcodecs/vf_pp.c
index a26b28065..9721554d0 100644
--- a/libmpcodecs/vf_pp.c
+++ b/libmpcodecs/vf_pp.c
@@ -128,7 +128,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
// no DR, so get a new image! hope we'll get DR buffer:
vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
@@ -153,7 +153,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
mpi->pict_type);
#endif
}
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_pp7.c b/libmpcodecs/vf_pp7.c
index e47d642ed..6d6963db6 100644
--- a/libmpcodecs/vf_pp7.c
+++ b/libmpcodecs/vf_pp7.c
@@ -372,7 +372,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(mpi->flags&MP_IMGFLAG_DIRECT){
@@ -404,7 +404,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t");
#endif
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_pullup.c b/libmpcodecs/vf_pullup.c
index 5d08768b7..09dbd0f42 100644
--- a/libmpcodecs/vf_pullup.c
+++ b/libmpcodecs/vf_pullup.c
@@ -104,7 +104,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi)
}
#endif
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
struct pullup_context *c = vf->priv->ctx;
struct pullup_buffer *b;
@@ -230,7 +230,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->qstride = mpi->qstride;
dmpi->qscale_type = mpi->qscale_type;
}
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
dmpi = vf_get_image(vf->next, mpi->imgfmt,
MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE,
@@ -249,7 +249,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->qstride = mpi->qstride;
dmpi->qscale_type = mpi->qscale_type;
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
pullup_release_frame(f);
return ret;
}
diff --git a/libmpcodecs/vf_qp.c b/libmpcodecs/vf_qp.c
index 8dd935e59..31c9b5060 100644
--- a/libmpcodecs/vf_qp.c
+++ b/libmpcodecs/vf_qp.c
@@ -99,7 +99,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int x,y;
@@ -139,7 +139,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
}
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_rectangle.c b/libmpcodecs/vf_rectangle.c
index 21bc209de..c169246dc 100644
--- a/libmpcodecs/vf_rectangle.c
+++ b/libmpcodecs/vf_rectangle.c
@@ -83,7 +83,7 @@ control(struct vf_instance *vf, int request, void *data)
return 0;
}
static int
-put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
+put_image(struct vf_instance *vf, mp_image_t* mpi, double pts, double endpts){
mp_image_t* dmpi;
unsigned int bpp = mpi->bpp / 8;
int x, y, w, h;
@@ -152,7 +152,7 @@ put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){
p += dmpi->stride[0];
}
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int
diff --git a/libmpcodecs/vf_remove_logo.c b/libmpcodecs/vf_remove_logo.c
index 7469ced1d..0841ef6aa 100644
--- a/libmpcodecs/vf_remove_logo.c
+++ b/libmpcodecs/vf_remove_logo.c
@@ -774,7 +774,7 @@ static void convert_yv12(const vf_instance_t * const vf, const char * const sour
* filter, has the logo removed by the filter, and is then sent to the next
* filter.
*/
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
dmpi=vf_get_image(vf->next,vf->priv->fmt,
@@ -813,7 +813,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
return 0;
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_rgbtest.c b/libmpcodecs/vf_rgbtest.c
index cbed6ed36..1e15e71eb 100644
--- a/libmpcodecs/vf_rgbtest.c
+++ b/libmpcodecs/vf_rgbtest.c
@@ -113,7 +113,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,width,height,d_width,d_height,flags,vf->priv->fmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int x, y;
int w = vf->priv->w > 0 ? vf->priv->w : mpi->w;
@@ -137,7 +137,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
}
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_rotate.c b/libmpcodecs/vf_rotate.c
index 08d73bec2..8abf6c94a 100644
--- a/libmpcodecs/vf_rotate.c
+++ b/libmpcodecs/vf_rotate.c
@@ -84,7 +84,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,height,width,d_height,d_width,flags,outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
// hope we'll get DR buffer:
@@ -109,7 +109,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
}
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_sab.c b/libmpcodecs/vf_sab.c
index 203c468dd..b131c394f 100644
--- a/libmpcodecs/vf_sab.c
+++ b/libmpcodecs/vf_sab.c
@@ -241,7 +241,7 @@ if((x/32)&1){
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
@@ -255,7 +255,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
blur(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1], &vf->priv->chroma);
blur(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2], &vf->priv->chroma);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c
index 8eca5120a..ef50261ea 100644
--- a/libmpcodecs/vf_scale.c
+++ b/libmpcodecs/vf_scale.c
@@ -459,7 +459,7 @@ static void draw_slice(struct vf_instance *vf,
scale(vf->priv->ctx, vf->priv->ctx2, src, stride, y, h, dmpi->planes, dmpi->stride, vf->priv->interlaced);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi=mpi->priv;
// printf("vf_scale::put_image(): processing whole frame! dmpi=%p flag=%d\n",
@@ -483,7 +483,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
if(vf->priv->palette) dmpi->planes[1]=vf->priv->palette; // export palette!
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control(struct vf_instance *vf, int request, void* data){
diff --git a/libmpcodecs/vf_screenshot.c b/libmpcodecs/vf_screenshot.c
index 992ea6df3..9aafac3a2 100644
--- a/libmpcodecs/vf_screenshot.c
+++ b/libmpcodecs/vf_screenshot.c
@@ -194,7 +194,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi)
mpi->priv=vf->dmpi;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi = (mp_image_t *)mpi->priv;
@@ -224,7 +224,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
vf->priv->store_slices = 0;
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control (vf_instance_t *vf, int request, void *data)
diff --git a/libmpcodecs/vf_smartblur.c b/libmpcodecs/vf_smartblur.c
index 0ccd36938..6de67bf5e 100644
--- a/libmpcodecs/vf_smartblur.c
+++ b/libmpcodecs/vf_smartblur.c
@@ -182,7 +182,7 @@ static inline void blur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride,
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int cw= mpi->w >> mpi->chroma_x_shift;
int ch= mpi->h >> mpi->chroma_y_shift;
int threshold = vf->priv->luma.threshold || vf->priv->chroma.threshold;
@@ -198,7 +198,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
blur(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1], &vf->priv->chroma);
blur(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2], &vf->priv->chroma);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_softpulldown.c b/libmpcodecs/vf_softpulldown.c
index 1a66e5607..fed233971 100644
--- a/libmpcodecs/vf_softpulldown.c
+++ b/libmpcodecs/vf_softpulldown.c
@@ -35,7 +35,7 @@ struct vf_priv_s {
long long out;
};
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
int ret = 0;
@@ -61,7 +61,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
}
if (state == 0) {
- ret = vf_next_put_image(vf, mpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, mpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
vf->priv->out++;
if (flags & MP_IMGFIELD_REPEAT_FIRST) {
my_memcpy_pic(dmpi->planes[0],
@@ -97,10 +97,10 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
mpi->chroma_width, mpi->chroma_height/2,
dmpi->stride[2]*2, mpi->stride[2]*2);
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
vf->priv->out++;
if (flags & MP_IMGFIELD_REPEAT_FIRST) {
- ret |= vf_next_put_image(vf, mpi, MP_NOPTS_VALUE);
+ ret |= vf_next_put_image(vf, mpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
vf->priv->out++;
state=0;
} else {
diff --git a/libmpcodecs/vf_softskip.c b/libmpcodecs/vf_softskip.c
index 150c3e7b7..c0189949f 100644
--- a/libmpcodecs/vf_softskip.c
+++ b/libmpcodecs/vf_softskip.c
@@ -31,7 +31,7 @@ struct vf_priv_s {
int skipflag;
};
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
@@ -51,7 +51,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->stride[2] = mpi->stride[2];
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int control(struct vf_instance *vf, int request, void* data)
diff --git a/libmpcodecs/vf_spp.c b/libmpcodecs/vf_spp.c
index 19257fb09..97cacdc6f 100644
--- a/libmpcodecs/vf_spp.c
+++ b/libmpcodecs/vf_spp.c
@@ -470,7 +470,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
@@ -519,7 +519,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t");
#endif
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_stereo3d.c b/libmpcodecs/vf_stereo3d.c
index f26d95df3..641519e32 100644
--- a/libmpcodecs/vf_stereo3d.c
+++ b/libmpcodecs/vf_stereo3d.c
@@ -283,7 +283,7 @@ static int config(struct vf_instance *vf, int width, int height, int d_width,
d_width, d_height, flags, outfmt);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
if (vf->priv->in.fmt == vf->priv->out.fmt) { //nothing to do
@@ -384,7 +384,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
break;
}
}
- return vf_next_put_image(vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static int query_format(struct vf_instance *vf, unsigned int fmt)
diff --git a/libmpcodecs/vf_swapuv.c b/libmpcodecs/vf_swapuv.c
index 4d0e8fcb1..c8c0d61f9 100644
--- a/libmpcodecs/vf_swapuv.c
+++ b/libmpcodecs/vf_swapuv.c
@@ -48,7 +48,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->priv=(void*)dmpi;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(mpi->flags&MP_IMGFLAG_DIRECT){
@@ -67,7 +67,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf_clone_mpi_attributes(dmpi, mpi);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_telecine.c b/libmpcodecs/vf_telecine.c
index 3ffa87faf..3d90c98d6 100644
--- a/libmpcodecs/vf_telecine.c
+++ b/libmpcodecs/vf_telecine.c
@@ -33,7 +33,7 @@ struct vf_priv_s {
int frame;
};
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
int ret;
@@ -63,7 +63,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
chroma_width, mpi->chroma_height/2,
dmpi->stride[2]*2, mpi->stride[2]*2);
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
/* Fallthrough */
case 1:
case 2:
@@ -77,7 +77,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
chroma_width, mpi->chroma_height,
dmpi->stride[2], mpi->stride[2]);
}
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE) || ret;
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE) || ret;
case 3:
my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0],
mpi->planes[0]+mpi->stride[0], w, mpi->h/2,
@@ -92,7 +92,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
chroma_width, mpi->chroma_height/2,
dmpi->stride[2]*2, mpi->stride[2]*2);
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
my_memcpy_pic(dmpi->planes[0], mpi->planes[0], w, mpi->h/2,
dmpi->stride[0]*2, mpi->stride[0]*2);
if (mpi->flags & MP_IMGFLAG_PLANAR) {
diff --git a/libmpcodecs/vf_test.c b/libmpcodecs/vf_test.c
index bef06120e..a96e077c0 100644
--- a/libmpcodecs/vf_test.c
+++ b/libmpcodecs/vf_test.c
@@ -269,7 +269,7 @@ static void ring2Test(uint8_t *dst, int stride, int off)
}
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int frame= vf->priv->frame_num;
@@ -302,7 +302,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
frame++;
vf->priv->frame_num= frame;
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_tfields.c b/libmpcodecs/vf_tfields.c
index 7eec78673..e97376220 100644
--- a/libmpcodecs/vf_tfields.c
+++ b/libmpcodecs/vf_tfields.c
@@ -328,7 +328,7 @@ static void (*qpel_4tap)(unsigned char *d, unsigned char *s, int w, int h, int d
static int continue_buffered_image(struct vf_instance *vf);
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
vf->priv->buffered_mpi = mpi;
vf->priv->buffered_pts = pts;
@@ -392,7 +392,7 @@ static int continue_buffered_image(struct vf_instance *vf)
dmpi->stride[1] = 2*mpi->stride[1];
dmpi->stride[2] = 2*mpi->stride[2];
}
- ret |= vf_next_put_image(vf, dmpi, calc_pts(pts, i));
+ ret |= vf_next_put_image(vf, dmpi, calc_pts(pts, i), MP_NOPTS_VALUE);
if (correct_pts)
break;
else
@@ -422,7 +422,7 @@ static int continue_buffered_image(struct vf_instance *vf)
deint(dmpi->planes[2], dmpi->stride[2], mpi->planes[2], mpi->stride[2],
mpi->chroma_width, mpi->chroma_height, (i^!tff));
}
- ret |= vf_next_put_image(vf, dmpi, calc_pts(pts, i));
+ ret |= vf_next_put_image(vf, dmpi, calc_pts(pts, i), MP_NOPTS_VALUE);
if (correct_pts)
break;
else
@@ -448,7 +448,7 @@ static int continue_buffered_image(struct vf_instance *vf)
mpi->chroma_width, mpi->chroma_height/2,
dmpi->stride[2], mpi->stride[2]*2, (i^!tff));
}
- ret |= vf_next_put_image(vf, dmpi, calc_pts(pts, i));
+ ret |= vf_next_put_image(vf, dmpi, calc_pts(pts, i), MP_NOPTS_VALUE);
if (correct_pts)
break;
else
diff --git a/libmpcodecs/vf_tile.c b/libmpcodecs/vf_tile.c
index 9ec037ef4..44f14c9fb 100644
--- a/libmpcodecs/vf_tile.c
+++ b/libmpcodecs/vf_tile.c
@@ -107,7 +107,7 @@ static int config(struct vf_instance *vf,
}
/* Filter handler */
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
mp_image_t *dmpi;
struct vf_priv_s *priv;
@@ -184,7 +184,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
/* Display the composition */
dmpi->width = xw;
dmpi->height = yh;
- return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
else {
/* Skip the frame */
diff --git a/libmpcodecs/vf_tinterlace.c b/libmpcodecs/vf_tinterlace.c
index 8cd6ac89b..2fe3c2e7b 100644
--- a/libmpcodecs/vf_tinterlace.c
+++ b/libmpcodecs/vf_tinterlace.c
@@ -37,7 +37,7 @@ struct vf_priv_s {
mp_image_t *dmpi;
};
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts)
{
int ret = 0;
mp_image_t *dmpi;
@@ -76,16 +76,16 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
mpi->chroma_width, mpi->chroma_height,
dmpi->stride[2]*2, mpi->stride[2]);
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
break;
case 1:
if (vf->priv->frame & 1)
- ret = vf_next_put_image(vf, mpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, mpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
break;
case 2:
if ((vf->priv->frame & 1) == 0)
- ret = vf_next_put_image(vf, mpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, mpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
break;
case 3:
dmpi = vf_get_image(vf->next, mpi->imgfmt,
@@ -116,7 +116,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
dmpi->stride[2]*2, mpi->stride[2]);
}
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
break;
case 4:
// Interleave even lines (only) from Frame 'i' with odd
@@ -166,7 +166,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
mpi->chroma_width, mpi->chroma_height/2,
dmpi->stride[2]*2, mpi->stride[2]*2);
}
- ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
+ ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
break;
}
diff --git a/libmpcodecs/vf_unsharp.c b/libmpcodecs/vf_unsharp.c
index 56e85f473..12aec2390 100644
--- a/libmpcodecs/vf_unsharp.c
+++ b/libmpcodecs/vf_unsharp.c
@@ -179,7 +179,7 @@ static void get_image( struct vf_instance *vf, mp_image_t *mpi ) {
mpi->flags |= MP_IMGFLAG_DIRECT;
}
-static int put_image( struct vf_instance *vf, mp_image_t *mpi, double pts) {
+static int put_image( struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts) {
mp_image_t *dmpi = mpi->priv;
mpi->priv = NULL;
@@ -202,7 +202,7 @@ static int put_image( struct vf_instance *vf, mp_image_t *mpi, double pts) {
__asm__ volatile ("sfence\n\t");
#endif
- return vf_next_put_image( vf, dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit( struct vf_instance *vf ) {
diff --git a/libmpcodecs/vf_uspp.c b/libmpcodecs/vf_uspp.c
index dd417009c..9f1709793 100644
--- a/libmpcodecs/vf_uspp.c
+++ b/libmpcodecs/vf_uspp.c
@@ -275,7 +275,7 @@ static void get_image(struct vf_instance *vf, mp_image_t *mpi){
mpi->flags|=MP_IMGFLAG_DIRECT;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
@@ -307,7 +307,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t");
#endif
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
static void uninit(struct vf_instance *vf){
diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c
index 6511460f7..ce5d51345 100644
--- a/libmpcodecs/vf_vo.c
+++ b/libmpcodecs/vf_vo.c
@@ -34,6 +34,7 @@
struct vf_priv_s {
double pts;
+ double endpts;
const vo_functions_t *vo;
};
#define video_out (vf->priv->vo)
@@ -136,6 +137,11 @@ static int control(struct vf_instance *vf, int request, void* data)
*(double *)data = vf->priv->pts;
return CONTROL_TRUE;
}
+ case VFCTRL_GET_ENDPTS:
+ {
+ *(double *)data = vf->priv->endpts;
+ return CONTROL_TRUE;
+ }
}
// return video_out->control(request,data);
return CONTROL_UNKNOWN;
@@ -160,10 +166,11 @@ static void get_image(struct vf_instance *vf,
}
static int put_image(struct vf_instance *vf,
- mp_image_t *mpi, double pts){
+ mp_image_t *mpi, double pts, double endpts){
if(!vo_config_count) return 0; // vo not configured?
// record pts (potentially modified by filters) for main loop
vf->priv->pts = pts;
+ vf->priv->endpts = endpts;
// first check, maybe the vo/vf plugin implements draw_image using mpi:
if(video_out->control(VOCTRL_DRAW_IMAGE,mpi)==VO_TRUE) return 1; // done.
// nope, fallback to old draw_frame/draw_slice:
diff --git a/libmpcodecs/vf_yadif.c b/libmpcodecs/vf_yadif.c
index ccd050f03..aeec5fcc9 100644
--- a/libmpcodecs/vf_yadif.c
+++ b/libmpcodecs/vf_yadif.c
@@ -396,7 +396,7 @@ static int config(struct vf_instance *vf,
static int continue_buffered_image(struct vf_instance *vf);
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int tff;
if(vf->priv->parity < 0) {
@@ -415,7 +415,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf->priv->buffered_pts = pts;
if(vf->priv->do_deinterlace == 0)
- return vf_next_put_image(vf, mpi, pts);
+ return vf_next_put_image(vf, mpi, pts, endpts);
else if(vf->priv->do_deinterlace == 1){
vf->priv->do_deinterlace= 2;
return 0;
@@ -443,7 +443,7 @@ static int continue_buffered_image(struct vf_instance *vf)
filter(vf->priv, dmpi->planes, dmpi->stride, mpi->w, mpi->h, i ^ tff ^ 1, tff);
if (correct_pts && i < (vf->priv->mode & 1))
vf_queue_frame(vf, continue_buffered_image);
- ret |= vf_next_put_image(vf, dmpi, pts /*FIXME*/);
+ ret |= vf_next_put_image(vf, dmpi, pts /*FIXME*/, MP_NOPTS_VALUE);
if (correct_pts)
break;
if(i<(vf->priv->mode&1))
diff --git a/libmpcodecs/vf_yuvcsp.c b/libmpcodecs/vf_yuvcsp.c
index 102ce1453..efb3c7118 100644
--- a/libmpcodecs/vf_yuvcsp.c
+++ b/libmpcodecs/vf_yuvcsp.c
@@ -48,7 +48,7 @@ static inline int clamp_c(int x){
return (x > 240) ? 240 : (x < 16) ? 16 : x;
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
int i,j;
uint8_t *y_in, *cb_in, *cr_in;
uint8_t *y_out, *cb_out, *cr_out;
@@ -76,7 +76,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
cr_out[i*vf->dmpi->stride[2]+j] = clamp_c(cr_in[i*mpi->stride[2]+j]);
}
- return vf_next_put_image(vf,vf->dmpi, pts);
+ return vf_next_put_image(vf, vf->dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_yvu9.c b/libmpcodecs/vf_yvu9.c
index 1f74261cc..28f158d28 100644
--- a/libmpcodecs/vf_yvu9.c
+++ b/libmpcodecs/vf_yvu9.c
@@ -45,7 +45,7 @@ static int config(struct vf_instance *vf,
return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_YV12);
}
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
mp_image_t *dmpi;
int y,w,h;
@@ -75,7 +75,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
vf_clone_mpi_attributes(dmpi, mpi);
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
//===========================================================================//
diff --git a/libmpcodecs/vf_zrmjpeg.c b/libmpcodecs/vf_zrmjpeg.c
index 6d3c7b2aa..ef5d5f00a 100644
--- a/libmpcodecs/vf_zrmjpeg.c
+++ b/libmpcodecs/vf_zrmjpeg.c
@@ -817,7 +817,7 @@ static int config(struct vf_instance *vf, int width, int height, int d_width,
* \param mpi pointer to mp_image_t structure
* \param pts
*/
-static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
+static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
struct vf_priv_s *priv = vf->priv;
int size = 0;
int i;
@@ -833,7 +833,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
MP_IMGTYPE_EXPORT, 0, mpi->w, mpi->h);
dmpi->planes[0] = (uint8_t*)priv->buf;
dmpi->planes[1] = (uint8_t*)size;
- return vf_next_put_image(vf,dmpi, pts);
+ return vf_next_put_image(vf, dmpi, pts, endpts);
}
/// query_format entrypoint for the ZRMJPEG vf filter
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 29e434962..b70dae468 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -886,14 +886,23 @@ int ds_get_packet(demux_stream_t *ds, unsigned char **start)
int ds_get_packet_pts(demux_stream_t *ds, unsigned char **start, double *pts)
{
+ double dummy;
+ return ds_get_packet_pts_endpts(ds, start, pts, &dummy);
+}
+
+int ds_get_packet_pts_endpts(demux_stream_t *ds, unsigned char **start, double *pts, double *endpts)
+{
int len;
*pts = MP_NOPTS_VALUE;
+ *endpts = MP_NOPTS_VALUE;
len = ds_get_packet(ds, start);
if (len < 0)
return len;
// Return pts unless this read starts from the middle of a packet
if (len == ds->buffer_pos)
*pts = ds->current->pts;
+ if (len == ds->buffer_size)
+ *endpts = ds->current->endpts;
return len;
}
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 516e663b5..eeb878bb8 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -405,6 +405,7 @@ static inline int demux_getc(demux_stream_t *ds){
void ds_free_packs(demux_stream_t *ds);
int ds_get_packet(demux_stream_t *ds,unsigned char **start);
int ds_get_packet_pts(demux_stream_t *ds, unsigned char **start, double *pts);
+int ds_get_packet_pts_endpts(demux_stream_t *ds, unsigned char **start, double *pts, double *endpts);
int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start,
double *pts, double *endpts);
double ds_get_next_pts(demux_stream_t *ds);
diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h
index 9060caa02..ddf180b05 100644
--- a/libmpdemux/stheader.h
+++ b/libmpdemux/stheader.h
@@ -38,6 +38,7 @@
/* audio: last known pts value in output from decoder \
* video: predicted/interpolated PTS of the current frame */ \
double pts; \
+ double endpts; \
/* codec-specific: */ \
void* context; /* codec-specific stuff (usually HANDLE or struct pointer) */ \
char* lang; /* track language */ \
@@ -102,6 +103,7 @@ typedef struct sh_video {
float next_frame_time;
double last_pts;
double buffered_pts[64];
+ double buffered_endpts[64];
int num_buffered_pts;
// output format: (set by demuxer)
float fps; // frames per second (set only if constant fps)
diff --git a/mencoder.c b/mencoder.c
index 0f6774c9e..9fc3ebe25 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -463,9 +463,9 @@ static int slowseek(float end_pts, demux_stream_t *d_video,
if (vfilter) {
int softskip = (vfilter->control(vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) == CONTROL_TRUE);
- void *decoded_frame = decode_video(sh_video, frame_data->start, frame_data->in_size, !softskip, MP_NOPTS_VALUE, NULL);
+ void *decoded_frame = decode_video(sh_video, frame_data->start, frame_data->in_size, !softskip, MP_NOPTS_VALUE, MP_NOPTS_VALUE, NULL);
if (decoded_frame)
- filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE);
+ filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
else if (frame_data->flush)
return 2;
}
@@ -1504,7 +1504,7 @@ default:
(!sh_video->vfilter ||
((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) != CONTROL_TRUE);
void *decoded_frame = decode_video(sh_video,frame_data.start,frame_data.in_size,
- drop_frame, MP_NOPTS_VALUE, NULL);
+ drop_frame, MP_NOPTS_VALUE, MP_NOPTS_VALUE, NULL);
if (frame_data.flush && !decoded_frame)
at_eof = 3;
if (did_seek && sh_video->pts != MP_NOPTS_VALUE) {
@@ -1517,7 +1517,7 @@ default:
// sh_video->pts causes flickering with subtitles and complaints from MPEG-4
// encoder due to not being monotonic.
// If you change this please note the reason here!
- blit_frame = decoded_frame && filter_video(sh_video, decoded_frame, v_muxer_time + sub_offset);}
+ blit_frame = decoded_frame && filter_video(sh_video, decoded_frame, v_muxer_time + sub_offset, MP_NOPTS_VALUE);}
v_muxer_time = adjusted_muxer_time(mux_v); // update after muxing
if (sh_video->vf_initialized < 0) mencoder_exit(1, NULL);
diff --git a/mplayer.c b/mplayer.c
index 3bffb9792..c620eb5ed 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -1777,6 +1777,7 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video)
int in_size;
int hit_eof = 0;
double pts;
+ double endpts;
while (1) {
int drop_frame = 0;
@@ -1787,7 +1788,7 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video)
if (vf_output_queued_frame(sh_video->vfilter))
break;
current_module = "video_read_frame";
- in_size = ds_get_packet_pts(d_video, &start, &pts);
+ in_size = ds_get_packet_pts_endpts(d_video, &start, &pts, &endpts);
if (in_size < 0) {
// try to extract last frames in case of decoder lag
in_size = 0;
@@ -1799,13 +1800,13 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video)
if (in_size > max_framesize)
max_framesize = in_size;
current_module = "decode video";
- decoded_frame = decode_video(sh_video, start, in_size, drop_frame, pts, NULL);
+ decoded_frame = decode_video(sh_video, start, in_size, drop_frame, pts, endpts, NULL);
if (decoded_frame) {
update_subtitles(sh_video, sh_video->pts, mpctx->d_sub, 0);
update_teletext(sh_video, mpctx->demuxer, 0);
update_osd_msg();
current_module = "filter video";
- if (filter_video(sh_video, decoded_frame, sh_video->pts))
+ if (filter_video(sh_video, decoded_frame, sh_video->pts, sh_video->endpts))
break;
} else if (drop_frame)
return -1;
@@ -2491,7 +2492,7 @@ static double update_video(int *blit_frame)
// still frame has been reached, no need to decode
if ((in_size > 0 || flush) && !decoded_frame)
decoded_frame = decode_video(sh_video, start, in_size, drop_frame,
- sh_video->pts, &full_frame);
+ sh_video->pts, sh_video->endpts, &full_frame);
if (flush && !decoded_frame)
return -1;
@@ -2512,13 +2513,15 @@ static double update_video(int *blit_frame)
current_module = "filter_video";
*blit_frame = (decoded_frame && filter_video(sh_video, decoded_frame,
- sh_video->pts));
+ sh_video->pts, sh_video->endpts));
} else {
int res = generate_video_frame(sh_video, mpctx->d_video);
if (!res)
return -1;
((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter,
VFCTRL_GET_PTS, &sh_video->pts);
+ ((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter,
+ VFCTRL_GET_ENDPTS, &sh_video->endpts);
if (sh_video->pts == MP_NOPTS_VALUE) {
mp_msg(MSGT_CPLAYER, MSGL_ERR, MSGTR_PtsAfterFiltersMissing);
sh_video->pts = sh_video->last_pts;
@@ -3795,7 +3798,7 @@ goto_enable_cache:
update_osd_msg();
} else {
int frame_time_remaining = 0;
- int blit_frame = 1;
+ int blit_frame = mpctx->num_buffered_frames > 0;
// skip timing after seek
int skip_timing = mpctx->startup_decode_retry > 0;
@@ -3822,13 +3825,25 @@ goto_enable_cache:
goto goto_next_file;
}
if (frame_time < 0) {
+ // try to figure out duration of last frame
+ if (correct_pts && mpctx->sh_video->endpts != MP_NOPTS_VALUE &&
+ mpctx->sh_video->pts != MP_NOPTS_VALUE &&
+ mpctx->sh_video->endpts > mpctx->sh_video->pts) {
+ frame_time = mpctx->sh_video->endpts - mpctx->sh_video->pts;
+ } else {
+ frame_time = mpctx->sh_video->frametime;
+ }
+ mpctx->sh_video->frametime = -1;
+ mpctx->sh_video->endpts = MP_NOPTS_VALUE;
+ }
+ if (frame_time < 0) {
// if we have no more video, sleep some arbitrary time
frame_time = 1.0 / 20.0;
// Ensure vo_pts is updated so that ao_pcm will not hang.
advance_timer(frame_time);
// only stop playing when audio is at end as well
if (!mpctx->sh_audio || (mpctx->d_audio->eof && !ds_fill_buffer(mpctx->d_audio)))
- mpctx->eof = 1;
+ mpctx->eof = mpctx->time_frame <= 0;
} else {
// might return with !eof && !blit_frame if !correct_pts
mpctx->num_buffered_frames += blit_frame;
--
2.11.0
More information about the MPlayer-dev-eng
mailing list