diff options
author | Robert Nagy <ronag89@gmail.com> | 2012-04-15 17:12:02 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-04-17 19:41:16 +0200 |
commit | e90dfa6881afccf23a3dc494fa30c58d75945cbc (patch) | |
tree | bbd08597e5b7e3e0fd4eec9471f0f36736e2845b | |
parent | 7a3d2258a603fa177d688e4b661866bd8782c96c (diff) | |
download | ffmpeg-e90dfa6881afccf23a3dc494fa30c58d75945cbc.tar.gz |
yadif: Improve pts calculation for is_second.
Tested-by: Robert Nagy <ronag89@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavfilter/vf_yadif.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c index c31a283bad..d8e2ad6b02 100644 --- a/libavfilter/vf_yadif.c +++ b/libavfilter/vf_yadif.c @@ -218,9 +218,20 @@ static void return_frame(AVFilterContext *ctx, int is_second) if (is_second) { if (yadif->next->pts != AV_NOPTS_VALUE && yadif->cur->pts != AV_NOPTS_VALUE) { - yadif->out->pts = - (yadif->next->pts&yadif->cur->pts) + - ((yadif->next->pts^yadif->cur->pts)>>1); + uint64_t next_pts = yadif->next->pts; + uint64_t cur_pts = yadif->cur->pts; + uint64_t prev_pts = yadif->prev->pts; + + uint64_t ft = FFMIN3( cur_pts-prev_pts, + next_pts-cur_pts, + (next_pts-prev_pts)/2); + + if(next_pts - cur_pts < 2*ft) + yadif->out->pts = + (next_pts&cur_pts) + + ((next_pts^cur_pts)>>1); + else + yadif->out->pts = cur_pts + ft/2; } else { yadif->out->pts = AV_NOPTS_VALUE; } |