summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-02-18 09:33:45 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-02-18 09:33:45 +0000
commite77a7954de2675dd41af2efcaf16dc258c8d2af4 (patch)
tree286b6f0d744a5af7ee7c1f4917ea32bd766b65f1 /libvo
parent6f797ffeabd3f00edc453e8cd9a90b0cde3d6b62 (diff)
downloadmpv-e77a7954de2675dd41af2efcaf16dc258c8d2af4.tar.bz2
mpv-e77a7954de2675dd41af2efcaf16dc258c8d2af4.tar.xz
Avoid parts of xvmc reinit when source format does not change
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22255 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/video_out.c11
-rw-r--r--libvo/video_out.h1
-rw-r--r--libvo/vo_xvmc.c62
3 files changed, 45 insertions, 29 deletions
diff --git a/libvo/video_out.c b/libvo/video_out.c
index b8ec45ed14..a6b48b71e9 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -327,6 +327,8 @@ vo_functions_t* init_best_video_out(char** vo_list){
int config_video_out(vo_functions_t *vo, uint32_t width, uint32_t height,
uint32_t d_width, uint32_t d_height, uint32_t flags,
char *title, uint32_t format) {
+ static uint32_t old_width, old_height, old_format;
+ int res;
panscan_init();
aspect_save_orig(width,height);
aspect_save_prescale(d_width,d_height);
@@ -342,7 +344,14 @@ int config_video_out(vo_functions_t *vo, uint32_t width, uint32_t height,
vo_dwidth = d_width;
vo_dheight = d_height;
- return vo->config(width, height, d_width, d_height, flags, title, format);
+ if (vo_config_count && width == old_width && height == old_height &&
+ format == old_format)
+ flags |= VOFLAG_SAME_INPUT;
+ res = vo->config(width, height, d_width, d_height, flags, title, format);
+ if (!res) {
+ old_width = width; old_height = height; old_format = format;
+ }
+ return res;
}
#if defined(HAVE_FBDEV)||defined(HAVE_VESA)
diff --git a/libvo/video_out.h b/libvo/video_out.h
index 3efe047361..3ab46bf3ab 100644
--- a/libvo/video_out.h
+++ b/libvo/video_out.h
@@ -95,6 +95,7 @@ typedef struct {
#define VOFLAG_MODESWITCHING 0x02
#define VOFLAG_SWSCALE 0x04
#define VOFLAG_FLIPPING 0x08
+#define VOFLAG_SAME_INPUT 0x10
#define VOFLAG_XOVERLAY_SUB_VO 0x10000
typedef struct vo_info_s
diff --git a/libvo/vo_xvmc.c b/libvo/vo_xvmc.c
index 6fc415cb24..4d40b06985 100644
--- a/libvo/vo_xvmc.c
+++ b/libvo/vo_xvmc.c
@@ -419,33 +419,14 @@ opt_t subopts [] =
return 0;
}
-static int config(uint32_t width, uint32_t height,
- uint32_t d_width, uint32_t d_height,
- uint32_t flags, char *title, uint32_t format){
+static int init_xvmc(int width, int height, unsigned format) {
int i,mode_id,rez;
int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12
-//from vo_xv
-char *hello = (title == NULL) ? "XvMC render" : title;
-XSizeHints hint;
-XVisualInfo vinfo;
-XGCValues xgcv;
-XSetWindowAttributes xswa;
-XWindowAttributes attribs;
-unsigned long xswamask;
-int depth;
-#ifdef HAVE_XF86VM
-int vm=0;
-unsigned int modeline_width, modeline_height;
-static uint32_t vm_width;
-static uint32_t vm_height;
-#endif
-//end of vo_xv
-
if( !IMGFMT_IS_XVMC(format) )
{
assert(0);//should never happen, abort on debug or
- return 1;//return error on relese
+ return -1;//return error on relese
}
// Find free port that supports MC, by querying adaptors
@@ -600,6 +581,38 @@ found_subpic:
vo_xv_enable_vsync();//it won't break anything
+ /* store image dimesions for displaying */
+ p_render_surface_visible = NULL;
+ p_render_surface_to_show = NULL;
+
+ free_element = 0;
+ first_frame = 1;
+ return 0;
+}
+
+static int config(uint32_t width, uint32_t height,
+ uint32_t d_width, uint32_t d_height,
+ uint32_t flags, char *title, uint32_t format){
+//from vo_xv
+char *hello = (title == NULL) ? "XvMC render" : title;
+XSizeHints hint;
+XVisualInfo vinfo;
+XGCValues xgcv;
+XSetWindowAttributes xswa;
+XWindowAttributes attribs;
+unsigned long xswamask;
+int depth;
+#ifdef HAVE_XF86VM
+int vm=0;
+unsigned int modeline_width, modeline_height;
+static uint32_t vm_width;
+static uint32_t vm_height;
+#endif
+//end of vo_xv
+
+ if (!(flags & VOFLAG_SAME_INPUT))
+ if (init_xvmc(width, height, format) < 0) return -1;
+
//taken from vo_xv
image_height = height;
image_width = width;
@@ -744,13 +757,6 @@ found_subpic:
//end vo_xv
- /* store image dimesions for displaying */
- p_render_surface_visible = NULL;
- p_render_surface_to_show = NULL;
-
- free_element = 0;
- first_frame = 1;
-
vo_directrendering = 1;//ugly hack, coz xvmc works only with direct rendering
return 0;
}