vlc | branch: master | Steve Lhomme <[email protected]> | Fri Jun 30 13:21:41 2017 +0200| [93bfed1e6292413c69573564475bda0a40770ff2] | committer: Jean-Baptiste Kempf
deinterlace: move the IVTC PTS handling in the common code Use a flag in the algorithm settings for IVTC to tell it needs special PTS handling on output. Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=93bfed1e6292413c69573564475bda0a40770ff2 --- modules/video_filter/deinterlace/algo_ivtc.c | 7 ------- modules/video_filter/deinterlace/algo_ivtc.h | 2 -- modules/video_filter/deinterlace/common.c | 22 ++++++++++++++++++++++ modules/video_filter/deinterlace/common.h | 2 +- modules/video_filter/deinterlace/deinterlace.c | 20 ++++++++++---------- 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/modules/video_filter/deinterlace/algo_ivtc.c b/modules/video_filter/deinterlace/algo_ivtc.c index 0de608ccba..145f981334 100644 --- a/modules/video_filter/deinterlace/algo_ivtc.c +++ b/modules/video_filter/deinterlace/algo_ivtc.c @@ -1521,9 +1521,6 @@ int RenderIVTC( filter_t *p_filter, picture_t *p_dst, picture_t *p_pic ) /* Now we can... */ bool b_have_output_frame = IVTCOutputOrDropFrame( p_filter, p_dst ); - /* The next frame will get a custom timestamp, too. */ - p_sys->context.i_frame_offset = CUSTOM_PTS; - if( b_have_output_frame ) return VLC_SUCCESS; else @@ -1569,10 +1566,6 @@ int RenderIVTC( filter_t *p_filter, picture_t *p_dst, picture_t *p_pic ) */ p_ivtc->pi_final_scores[1] = p_ivtc->pi_scores[FIELD_PAIR_TNBN]; - /* At the next frame, the filter starts. The next frame will get - a custom timestamp. */ - p_sys->context.i_frame_offset = CUSTOM_PTS; - picture_Copy( p_dst, p_next ); return VLC_SUCCESS; } diff --git a/modules/video_filter/deinterlace/algo_ivtc.h b/modules/video_filter/deinterlace/algo_ivtc.h index 2a090132e9..c12dc60abf 100644 --- a/modules/video_filter/deinterlace/algo_ivtc.h +++ b/modules/video_filter/deinterlace/algo_ivtc.h @@ -127,8 +127,6 @@ typedef struct * There is no input frame parameter, because the input frames * are taken from the history buffer. * - * This algorithm does CUSTOM_PTS timestamp mangling. - * * See the file comment for a detailed description of the algorithm. * * @param p_filter The filter instance. Must be non-NULL. diff --git a/modules/video_filter/deinterlace/common.c b/modules/video_filter/deinterlace/common.c index 3d144f5fc1..ea9c6af464 100644 --- a/modules/video_filter/deinterlace/common.c +++ b/modules/video_filter/deinterlace/common.c @@ -38,6 +38,7 @@ void InitDeinterlacingContext( struct deinterlace_ctx *p_context ) p_context->settings.b_double_rate = false; p_context->settings.b_half_height = false; p_context->settings.b_use_frame_history = false; + p_context->settings.b_custom_pts = false; p_context->meta[0].pi_date = VLC_TS_INVALID; p_context->meta[0].pi_nb_fields = 2; @@ -122,6 +123,8 @@ void GetDeinterlacingOutput( const struct deinterlace_ctx *p_context, } } +#define CUSTOM_PTS -1 + picture_t *DoDeinterlacing( filter_t *p_filter, struct deinterlace_ctx *p_context, picture_t *p_pic ) { @@ -280,6 +283,25 @@ picture_t *DoDeinterlacing( filter_t *p_filter, 2, !b_top_field_first ); } + if ( p_context->settings.b_custom_pts ) + { + assert(p_context->settings.b_use_frame_history); + if( p_context->pp_history[0] && p_context->pp_history[1] ) + { + /* The next frame will get a custom timestamp, too. */ + p_context->i_frame_offset = CUSTOM_PTS; + } + else if( !p_context->pp_history[0] && !p_context->pp_history[1] ) /* first frame */ + { + } + else /* second frame */ + { + /* At the next frame, the filter starts. The next frame will get + a custom timestamp. */ + p_context->i_frame_offset = CUSTOM_PTS; + } + } + /* Set output timestamps, if the algorithm didn't request CUSTOM_PTS for this frame. */ assert( i_frame_offset <= METADATA_SIZE || diff --git a/modules/video_filter/deinterlace/common.h b/modules/video_filter/deinterlace/common.h index 0c5fa91e75..940a87e2a9 100644 --- a/modules/video_filter/deinterlace/common.h +++ b/modules/video_filter/deinterlace/common.h @@ -54,11 +54,11 @@ typedef struct { #define METADATA_SIZE (3) #define HISTORY_SIZE (3) -#define CUSTOM_PTS -1 typedef struct { bool b_double_rate; /**< Shall we double the framerate? */ bool b_use_frame_history; /**< Use the input frame history buffer? */ + bool b_custom_pts; /**< for inverse telecine */ bool b_half_height; /**< Shall be divide the height by 2 */ } deinterlace_algo; diff --git a/modules/video_filter/deinterlace/deinterlace.c b/modules/video_filter/deinterlace/deinterlace.c index 5608d63811..d028834998 100644 --- a/modules/video_filter/deinterlace/deinterlace.c +++ b/modules/video_filter/deinterlace/deinterlace.c @@ -151,25 +151,25 @@ static struct filter_mode_t filter_mode [] = { { "discard", .pf_render_single_pic = RenderDiscard, { false, false, false, true }, true, true }, { "bob", .pf_render_ordered = RenderBob, - { true, false, false }, true, true }, + { true, false, false, false }, true, true }, { "progressive-scan", .pf_render_ordered = RenderBob, - { true, false, false }, true, true }, + { true, false, false, false }, true, true }, { "linear", .pf_render_ordered = RenderLinear, - { true, false, false }, true, true }, + { true, false, false, false }, true, true }, { "mean", .pf_render_single_pic = RenderMean, - { false, false, true }, true, true }, + { false, false, false, true }, true, true }, { "blend", .pf_render_single_pic = RenderBlend, - { false, false, false }, true, true }, + { false, false, false, false }, true, true }, { "yadif", .pf_render_single_pic = RenderYadifSingle, - { false, true, false }, false, true }, + { false, true, false, false }, false, true }, { "yadif2x", .pf_render_ordered = RenderYadif, - { true, true, false }, false, true }, + { true, true, false, false }, false, true }, { "x", .pf_render_single_pic = RenderX, - { false, false, false }, false, false }, + { false, false, false, false }, false, false }, { "phosphor", .pf_render_ordered = RenderPhosphor, - { true, true, false }, false, false }, + { true, true, false, false }, false, false }, { "ivtc", .pf_render_single_pic = RenderIVTC, - { false, true, false }, false, false }, + { false, true, true, false }, false, false }, }; /** _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
