X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvideo_output.c;h=a8e4e24c98add3c71d1fcfd694889ced2fb2079f;hb=36ab287e77e9df059f261ed1cfb13fc4674182ec;hp=f390e7db510046428e4da08d088684d40f6d353f;hpb=8f85c827640f78e4b5bdc8e83c733ff62c624b7b;p=vlc diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index f390e7db51..a8e4e24c98 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -5,26 +5,26 @@ * It includes functions allowing to open a new thread, send pictures to a * thread, and destroy a previously oppened video output thread. ***************************************************************************** - * Copyright (C) 2000-2007 the VideoLAN team + * Copyright (C) 2000-2007 VLC authors and VideoLAN * $Id$ * * Authors: Vincent Seguin * Gildas Bazin * Laurent Aimar * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -75,7 +75,8 @@ static void VoutDestructor(vlc_object_t *); static int VoutValidateFormat(video_format_t *dst, const video_format_t *src) { - if (src->i_width <= 0 || src->i_height <= 0) + if (src->i_width <= 0 || src->i_width > 8192 || + src->i_height <= 0 || src->i_height > 8192) return VLC_EGENERIC; if (src->i_sar_num <= 0 || src->i_sar_den <= 0) return VLC_EGENERIC; @@ -119,7 +120,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object, /* Allocate descriptor */ vout_thread_t *vout = vlc_custom_create(object, sizeof(*vout) + sizeof(*vout->p), - VLC_OBJECT_VOUT, "video output"); + "video output"); if (!vout) { video_format_Clean(&original); return NULL; @@ -143,9 +144,6 @@ static vout_thread_t *VoutCreate(vlc_object_t *object, vlc_mutex_init(&vout->p->filter.lock); vlc_mutex_init(&vout->p->spu_lock); - /* Attach the new object now so we can use var inheritance below */ - vlc_object_attach(vout, object); - /* Initialize subpicture unit */ vout->p->spu = spu_Create(vout); @@ -551,6 +549,11 @@ void vout_ControlChangeFilters(vout_thread_t *vout, const char *filters) vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_FILTERS, filters); } +void vout_ControlChangeSubSources(vout_thread_t *vout, const char *filters) +{ + vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_SUB_SOURCES, + filters); +} void vout_ControlChangeSubFilters(vout_thread_t *vout, const char *filters) { vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_SUB_FILTERS, @@ -907,11 +910,28 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) const bool do_dr_spu = !do_snapshot && vd->info.subpicture_chromas && *vd->info.subpicture_chromas != 0; - const bool do_early_spu = true; /* TODO */ + const bool do_early_spu = !do_dr_spu && + (vd->info.is_slow || + sys->display.use_dr || + do_snapshot || + !vout_IsDisplayFiltered(vd) || + vd->fmt.i_width * vd->fmt.i_height <= vd->source.i_width * vd->source.i_height); + const vlc_fourcc_t *subpicture_chromas; video_format_t fmt_spu; if (do_dr_spu) { - fmt_spu = vd->source; /* TODO improve */ + vout_display_place_t place; + vout_display_PlacePicture(&place, &vd->source, vd->cfg, false); + + fmt_spu = vd->source; + if (fmt_spu.i_width * fmt_spu.i_height < place.width * place.height) { + fmt_spu.i_sar_num = vd->cfg->display.sar.num; + fmt_spu.i_sar_den = vd->cfg->display.sar.den; + fmt_spu.i_width = + fmt_spu.i_visible_width = place.width; + fmt_spu.i_height = + fmt_spu.i_visible_height = place.height; + } subpicture_chromas = vd->info.subpicture_chromas; } else { if (do_early_spu) { @@ -949,21 +969,15 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) * - be sure to end up with a direct buffer. * - blend subtitles, and in a fast access buffer */ - bool is_direct; - picture_t *todisplay; - - if (filtered && do_early_spu && vout->p->spu_blend && subpic) { - if (vd->info.is_slow) { - is_direct = false; - todisplay = picture_NewFromFormat(&vd->source); /* FIXME a pool ? */ - } else { - is_direct = true; - todisplay = picture_pool_Get(vout->p->display_pool); - } + bool is_direct = vout->p->decoder_pool == vout->p->display_pool; + picture_t *todisplay = filtered; + if (do_early_spu && subpic) { + todisplay = picture_pool_Get(vout->p->private_pool); if (todisplay) { VideoFormatCopyCropAr(&todisplay->format, &filtered->format); picture_Copy(todisplay, filtered); - picture_BlendSubpicture(todisplay, vout->p->spu_blend, subpic); + if (vout->p->spu_blend) + picture_BlendSubpicture(todisplay, vout->p->spu_blend, subpic); } picture_Release(filtered); subpicture_Delete(subpic); @@ -971,9 +985,6 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) if (!todisplay) return VLC_EGENERIC; - } else { - is_direct = vout->p->decoder_pool == vout->p->display_pool; - todisplay = filtered; } picture_t *direct; @@ -1014,6 +1025,8 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) } if (!do_dr_spu && subpic) subpicture_Delete(subpic); + if (!sys->display.filtered) + return VLC_EGENERIC; } vout_chrono_Stop(&vout->p->render); @@ -1161,10 +1174,16 @@ static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string) string); } +static void ThreadChangeSubSources(vout_thread_t *vout, const char *filters) +{ + spu_ChangeSources(vout->p->spu, filters); +} + static void ThreadChangeSubFilters(vout_thread_t *vout, const char *filters) { spu_ChangeFilters(vout->p->spu, filters); } + static void ThreadChangeSubMargin(vout_thread_t *vout, int margin) { spu_ChangeMargin(vout->p->spu, margin); @@ -1504,6 +1523,9 @@ static void *Thread(void *object) case VOUT_CONTROL_CHANGE_FILTERS: ThreadChangeFilters(vout, NULL, cmd.u.string, false); break; + case VOUT_CONTROL_CHANGE_SUB_SOURCES: + ThreadChangeSubSources(vout, cmd.u.string); + break; case VOUT_CONTROL_CHANGE_SUB_FILTERS: ThreadChangeSubFilters(vout, cmd.u.string); break;