From 3624290f3b18fa51dbb7a3d6c1be5c90d3b33b78 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sun, 25 Apr 2010 18:48:12 +0200 Subject: [PATCH] No functionnal changes (vout) --- src/video_output/video_output.c | 192 +++++++++++++++++--------------- 1 file changed, 103 insertions(+), 89 deletions(-) diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index df544a32b4..39f4257b1e 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -64,9 +64,6 @@ static int FilterCallback( vlc_object_t *, char const *, static int VideoFilter2Callback( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); -/* Display media title in OSD */ -static void DisplayTitleOnOSD( vout_thread_t *p_vout ); - /* */ static void PrintVideoFormat(vout_thread_t *, const char *, const video_format_t *); @@ -878,6 +875,104 @@ static int ThreadDisplayPicture(vout_thread_t *vout, return VLC_SUCCESS; } +static int ThreadManage(vout_thread_t *vout, + mtime_t *deadline, + vout_interlacing_support_t *interlacing, + vout_postprocessing_support_t *postprocessing) +{ + vlc_mutex_lock(&vout->p->picture_lock); + + *deadline = VLC_TS_INVALID; + bool has_displayed = !ThreadDisplayPicture(vout, vout->p->step.is_requested, deadline); + + if (has_displayed) { + vout->p->step.timestamp = vout->p->displayed.timestamp; + if (vout->p->step.last <= VLC_TS_INVALID) + vout->p->step.last = vout->p->step.timestamp; + } + if (vout->p->step.is_requested) { + if (!has_displayed && !vout->p->b_picture_empty) { + picture_t *peek = picture_fifo_Peek(vout->p->decoder_fifo); + if (peek) + picture_Release(peek); + if (!peek) { + vout->p->b_picture_empty = true; + vlc_cond_signal(&vout->p->picture_wait); + } + } + if (has_displayed) { + vout->p->step.is_requested = false; + vlc_cond_signal(&vout->p->picture_wait); + } + } + + const int picture_qtype = vout->p->displayed.qtype; + const bool picture_interlaced = vout->p->displayed.is_interlaced; + + vlc_mutex_unlock(&vout->p->picture_lock); + + /* Post processing */ + vout_SetPostProcessingState(vout, postprocessing, picture_qtype); + + /* Deinterlacing */ + vout_SetInterlacingState(vout, interlacing, picture_interlaced); + + if (vout_ManageWrapper(vout)) { + /* A fatal error occurred, and the thread must terminate + * immediately, without displaying anything - setting b_error to 1 + * causes the immediate end of the main while() loop. */ + // FIXME pf_end + return VLC_EGENERIC; + } + return VLC_SUCCESS; +} + +static void ThreadDisplayOsdTitle(vout_thread_t *vout) +{ + if (!vout->p->title.show || !vout->p->title.value) + return; + + vlc_assert_locked(&vout->p->change_lock); + + const mtime_t start = mdate(); + const mtime_t stop = start + + INT64_C(1000) * vout->p->title.timeout; + + if (stop > start) + vout_ShowTextAbsolute(vout, DEFAULT_CHAN, + vout->p->title.value, NULL, + vout->p->title.position, + 30 + vout->fmt_in.i_width + - vout->fmt_in.i_visible_width + - vout->fmt_in.i_x_offset, + 20 + vout->fmt_in.i_y_offset, + start, stop); + + free(vout->p->title.value); + vout->p->title.value = NULL; +} + +static void ThreadChangeFilter(vout_thread_t *vout) +{ + /* Check for "video filter2" changes */ + vlc_mutex_lock(&vout->p->vfilter_lock); + if (vout->p->psz_vf2) { + es_format_t fmt; + + es_format_Init(&fmt, VIDEO_ES, vout->fmt_render.i_chroma); + fmt.video = vout->fmt_render; + filter_chain_Reset(vout->p->p_vf2_chain, &fmt, &fmt); + + if (filter_chain_AppendFromString(vout->p->p_vf2_chain, + vout->p->psz_vf2) < 0) + msg_Err(vout, "Video filter chain creation failed"); + + free(vout->p->psz_vf2); + vout->p->psz_vf2 = NULL; + } + vlc_mutex_unlock(&vout->p->vfilter_lock); +} + /***************************************************************************** * Thread: video output thread ***************************************************************************** @@ -924,72 +1019,15 @@ static void *Thread(void *object) */ while (!vout->p->b_done && !vout->p->b_error) { /* */ - if(vout->p->title.show && vout->p->title.value) - DisplayTitleOnOSD(vout); - - vlc_mutex_lock(&vout->p->picture_lock); - - mtime_t deadline = VLC_TS_INVALID; - bool has_displayed = !ThreadDisplayPicture(vout, vout->p->step.is_requested, &deadline); - - if (has_displayed) { - vout->p->step.timestamp = vout->p->displayed.timestamp; - if (vout->p->step.last <= VLC_TS_INVALID) - vout->p->step.last = vout->p->step.timestamp; - } - if (vout->p->step.is_requested) { - if (!has_displayed && !vout->p->b_picture_empty) { - picture_t *peek = picture_fifo_Peek(vout->p->decoder_fifo); - if (peek) - picture_Release(peek); - if (!peek) { - vout->p->b_picture_empty = true; - vlc_cond_signal(&vout->p->picture_wait); - } - } - if (has_displayed) { - vout->p->step.is_requested = false; - vlc_cond_signal(&vout->p->picture_wait); - } - } - - const int picture_qtype = vout->p->displayed.qtype; - const bool picture_interlaced = vout->p->displayed.is_interlaced; - - vlc_mutex_unlock(&vout->p->picture_lock); - - if (vout_ManageWrapper(vout)) { - /* A fatal error occurred, and the thread must terminate - * immediately, without displaying anything - setting b_error to 1 - * causes the immediate end of the main while() loop. */ - // FIXME pf_end + mtime_t deadline; + if (ThreadManage(vout, &deadline, + &interlacing, &postprocessing)) { vout->p->b_error = true; break; } - /* Post processing */ - vout_SetPostProcessingState(vout, &postprocessing, picture_qtype); - - /* Deinterlacing */ - vout_SetInterlacingState(vout, &interlacing, picture_interlaced); - - /* Check for "video filter2" changes */ - vlc_mutex_lock(&vout->p->vfilter_lock); - if (vout->p->psz_vf2) { - es_format_t fmt; - - es_format_Init(&fmt, VIDEO_ES, vout->fmt_render.i_chroma); - fmt.video = vout->fmt_render; - filter_chain_Reset(vout->p->p_vf2_chain, &fmt, &fmt); - - if (filter_chain_AppendFromString(vout->p->p_vf2_chain, - vout->p->psz_vf2) < 0) - msg_Err(vout, "Video filter chain creation failed"); - - free(vout->p->psz_vf2); - vout->p->psz_vf2 = NULL; - } - vlc_mutex_unlock(&vout->p->vfilter_lock); + ThreadDisplayOsdTitle(vout); + ThreadChangeFilter(vout); vlc_mutex_unlock(&vout->p->change_lock); @@ -1078,30 +1116,6 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd, return VLC_SUCCESS; } -static void DisplayTitleOnOSD( vout_thread_t *p_vout ) -{ - const mtime_t i_start = mdate(); - const mtime_t i_stop = i_start + INT64_C(1000) * p_vout->p->title.timeout; - - if( i_stop <= i_start ) - return; - - vlc_assert_locked( &p_vout->p->change_lock ); - - vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, - p_vout->p->title.value, NULL, - p_vout->p->title.position, - 30 + p_vout->fmt_in.i_width - - p_vout->fmt_in.i_visible_width - - p_vout->fmt_in.i_x_offset, - 20 + p_vout->fmt_in.i_y_offset, - i_start, i_stop ); - - free( p_vout->p->title.value ); - - p_vout->p->title.value = NULL; -} - /* */ static void PrintVideoFormat(vout_thread_t *vout, const char *description, -- 2.39.2