📄 xcommon.c
字号:
DestroyCursor( p_vout ); XCloseDisplay( p_vout->p_sys->p_display ); free( p_vout->p_sys ); return VLC_EGENERIC; } /* Open and initialize device. */ if( InitDisplay( p_vout ) ) { msg_Err( p_vout, "cannot initialize X11 display" ); DestroyCursor( p_vout ); DestroyWindow( p_vout, &p_vout->p_sys->original_window ); XCloseDisplay( p_vout->p_sys->p_display ); free( p_vout->p_sys ); return VLC_EGENERIC; } /* Disable screen saver */ DisableXScreenSaver( p_vout ); /* Misc init */ p_vout->p_sys->b_altfullscreen = 0; p_vout->p_sys->i_time_button_last_pressed = 0; TestNetWMSupport( p_vout );#ifdef MODULE_NAME_IS_xvmc p_vout->p_sys->p_last_subtitle_save = NULL; psz_value = config_GetPsz( p_vout, "xvmc-deinterlace-mode" ); /* Look what method was requested */ //var_Create( p_vout, "xvmc-deinterlace-mode", VLC_VAR_STRING ); //var_Change( p_vout, "xvmc-deinterlace-mode", VLC_VAR_INHERITVALUE, &val, NULL ); if( psz_value ) { if( (strcmp(psz_value, "bob") == 0) || (strcmp(psz_value, "blend") == 0) ) p_vout->p_sys->xvmc_deinterlace_method = 2; else if (strcmp(psz_value, "discard") == 0) p_vout->p_sys->xvmc_deinterlace_method = 1; else p_vout->p_sys->xvmc_deinterlace_method = 0; free(psz_value ); } else p_vout->p_sys->xvmc_deinterlace_method = 0; /* Look what method was requested */ //var_Create( p_vout, "xvmc-crop-style", VLC_VAR_STRING ); //var_Change( p_vout, "xvmc-crop-style", VLC_VAR_INHERITVALUE, &val, NULL ); psz_value = config_GetPsz( p_vout, "xvmc-crop-style" ); if( psz_value ) { if( strncmp( psz_value, "eq", 2 ) == 0 ) p_vout->p_sys->xvmc_crop_style = 1; else if( strncmp( psz_value, "4-16", 4 ) == 0) p_vout->p_sys->xvmc_crop_style = 2; else if( strncmp( psz_value, "16-4", 4 ) == 0) p_vout->p_sys->xvmc_crop_style = 3; else p_vout->p_sys->xvmc_crop_style = 0; free( psz_value ); } else p_vout->p_sys->xvmc_crop_style = 0; msg_Dbg(p_vout, "Deinterlace = %d", p_vout->p_sys->xvmc_deinterlace_method); msg_Dbg(p_vout, "Crop = %d", p_vout->p_sys->xvmc_crop_style); if( checkXvMCCap( p_vout ) == VLC_EGENERIC ) { msg_Err( p_vout, "no XVMC capability found" ); Deactivate( p_vout ); return VLC_EGENERIC; } subpicture_t sub_pic; sub_pic.p_sys = NULL; p_vout->p_sys->last_date = 0;#endif#ifdef HAVE_XSP p_vout->p_sys->i_hw_scale = 1;#endif#ifdef HAVE_OSSO p_vout->p_sys->i_backlight_on_counter = i_backlight_on_interval; p_vout->p_sys->p_octx = osso_initialize( "vlc", VERSION, 0, NULL ); if ( p_vout->p_sys->p_octx == NULL ) { msg_Err( p_vout, "Could not get osso context" ); } else { msg_Dbg( p_vout, "Initialized osso context" ); }#endif /* Variable to indicate if the window should be on top of others */ /* Trigger a callback right now */ var_Get( p_vout, "video-on-top", &val ); var_Set( p_vout, "video-on-top", val ); return VLC_SUCCESS;}/***************************************************************************** * Deactivate: destroy X11 video thread output method ***************************************************************************** * Terminate an output method created by Open *****************************************************************************/void Deactivate ( vlc_object_t *p_this ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; /* If the fullscreen window is still open, close it */ if( p_vout->b_fullscreen ) { ToggleFullScreen( p_vout ); } /* Restore cursor if it was blanked */ if( !p_vout->p_sys->b_mouse_pointer_visible ) { ToggleCursor( p_vout ); }#ifdef MODULE_NAME_IS_x11 /* Destroy colormap */ if( XDefaultDepth(p_vout->p_sys->p_display, p_vout->p_sys->i_screen) == 8 ) { XFreeColormap( p_vout->p_sys->p_display, p_vout->p_sys->colormap ); }#elif defined(MODULE_NAME_IS_xvideo) XVideoReleasePort( p_vout, p_vout->p_sys->i_xvport );#elif defined(MODULE_NAME_IS_xvmc) if( p_vout->p_sys->xvmc_cap ) { xvmc_context_writer_lock( &p_vout->p_sys->xvmc_lock ); xxmc_dispose_context( p_vout ); if( p_vout->p_sys->old_subpic ) { xxmc_xvmc_free_subpicture( p_vout, p_vout->p_sys->old_subpic ); p_vout->p_sys->old_subpic = NULL; } if( p_vout->p_sys->new_subpic ) { xxmc_xvmc_free_subpicture( p_vout, p_vout->p_sys->new_subpic ); p_vout->p_sys->new_subpic = NULL; } free( p_vout->p_sys->xvmc_cap ); xvmc_context_writer_unlock( &p_vout->p_sys->xvmc_lock ); }#endif#ifdef HAVE_XSP DisablePixelDoubling(p_vout);#endif DestroyCursor( p_vout ); EnableXScreenSaver( p_vout ); DestroyWindow( p_vout, &p_vout->p_sys->original_window ); XCloseDisplay( p_vout->p_sys->p_display ); /* Destroy structure */ vlc_mutex_destroy( &p_vout->p_sys->lock );#ifdef MODULE_NAME_IS_xvmc free_context_lock( &p_vout->p_sys->xvmc_lock );#endif#ifdef HAVE_OSSO if ( p_vout->p_sys->p_octx != NULL ) { msg_Dbg( p_vout, "Deinitializing osso context" ); osso_deinitialize( p_vout->p_sys->p_octx ); }#endif free( p_vout->p_sys );}#ifdef MODULE_NAME_IS_xvmc#define XINE_IMGFMT_YV12 (('2'<<24)|('1'<<16)|('V'<<8)|'Y')/* called xlocked */static int xvmc_check_yv12( Display *display, XvPortID port ){ XvImageFormatValues *formatValues; int formats; int i; formatValues = XvListImageFormats( display, port, &formats ); for( i = 0; i < formats; i++ ) { if( ( formatValues[i].id == XINE_IMGFMT_YV12 ) && ( !( strncmp( formatValues[i].guid, "YV12", 4 ) ) ) ) { XFree (formatValues); return 0; } } XFree (formatValues); return 1;}static void xvmc_sync_surface( vout_thread_t *p_vout, XvMCSurface * srf ){ XvMCSyncSurface( p_vout->p_sys->p_display, srf );}static void xvmc_update_XV_DOUBLE_BUFFER( vout_thread_t *p_vout ){ Atom atom; int xv_double_buffer; xv_double_buffer = 1; XLockDisplay( p_vout->p_sys->p_display ); atom = XInternAtom( p_vout->p_sys->p_display, "XV_DOUBLE_BUFFER", False );#if 0 XvSetPortAttribute (p_vout->p_sys->p_display, p_vout->p_sys->i_xvport, atom, xv_double_buffer);#endif XvMCSetAttribute( p_vout->p_sys->p_display, &p_vout->p_sys->context, atom, xv_double_buffer ); XUnlockDisplay( p_vout->p_sys->p_display ); //xprintf(this->xine, XINE_VERBOSITY_DEBUG, // "video_out_xxmc: double buffering mode = %d\n", xv_double_buffer);}static void RenderVideo( vout_thread_t *p_vout, picture_t *p_pic ){ vlc_xxmc_t *xxmc = NULL; vlc_mutex_lock( &p_vout->p_sys->lock ); xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock ); xxmc = &p_pic->p_sys->xxmc_data; if( (!xxmc->decoded || !xxmc_xvmc_surface_valid( p_vout, p_pic->p_sys->xvmc_surf )) ) { vlc_mutex_unlock( &p_vout->p_sys->lock ); xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock ); return; }#if 0 vlc_mutex_lock( &p_vout->lastsubtitle_lock ); if (p_vout->p_sys->p_last_subtitle != NULL) { if( p_vout->p_sys->p_last_subtitle_save != p_vout->p_sys->p_last_subtitle ) { p_vout->p_sys->new_subpic = xxmc_xvmc_alloc_subpicture( p_vout, &p_vout->p_sys->context, p_vout->p_sys->xvmc_width, p_vout->p_sys->xvmc_height, p_vout->p_sys->xvmc_cap[p_vout->p_sys->xvmc_cur_cap].subPicType.id ); if (p_vout->p_sys->new_subpic) { XVMCLOCKDISPLAY( p_vout->p_sys->p_display ); XvMCClearSubpicture( p_vout->p_sys->p_display, p_vout->p_sys->new_subpic, 0, 0, p_vout->p_sys->xvmc_width, p_vout->p_sys->xvmc_height, 0x00 ); XVMCUNLOCKDISPLAY( p_vout->p_sys->p_display ); clear_xx44_palette( &p_vout->p_sys->palette ); if( sub_pic.p_sys == NULL ) { sub_pic.p_sys = malloc( sizeof( picture_sys_t ) ); if( sub_pic.p_sys != NULL ) { sub_pic.p_sys->p_vout = p_vout; sub_pic.p_sys->xvmc_surf = NULL; sub_pic.p_sys->p_image = p_vout->p_sys->subImage; } } sub_pic.p_sys->p_image = p_vout->p_sys->subImage; sub_pic.p->p_pixels = sub_pic.p_sys->p_image->data; sub_pic.p->i_pitch = p_vout->output.i_width; memset( p_vout->p_sys->subImage->data, 0, (p_vout->p_sys->subImage->width * p_vout->p_sys->subImage->height) ); if (p_vout->p_last_subtitle != NULL) { blend_xx44( p_vout->p_sys->subImage->data, p_vout->p_last_subtitle, p_vout->p_sys->subImage->width, p_vout->p_sys->subImage->height, p_vout->p_sys->subImage->width, &p_vout->p_sys->palette, (p_vout->p_sys->subImage->id == FOURCC_IA44) ); } XVMCLOCKDISPLAY( p_vout->p_sys->p_display ); XvMCCompositeSubpicture( p_vout->p_sys->p_display, p_vout->p_sys->new_subpic, p_vout->p_sys->subImage, 0, /* overlay->x */ 0, /* overlay->y */ p_vout->output.i_width, /* overlay->width, */ p_vout->output.i_height, /* overlay->height */ 0, /* overlay->x */ 0 ); /*overlay->y */ XVMCUNLOCKDISPLAY( p_vout->p_sys->p_display ); if (p_vout->p_sys->old_subpic) { xxmc_xvmc_free_subpicture( p_vout, p_vout->p_sys->old_subpic); p_vout->p_sys->old_subpic = NULL; } if (p_vout->p_sys->new_subpic) { p_vout->p_sys->old_subpic = p_vout->p_sys->new_subpic; p_vout->p_sys->new_subpic = NULL; xx44_to_xvmc_palette( &p_vout->p_sys->palette, p_vout->p_sys->xvmc_palette, 0, p_vout->p_sys->old_subpic->num_palette_entries, p_vout->p_sys->old_subpic->entry_bytes, p_vout->p_sys->old_subpic->component_order ); XVMCLOCKDISPLAY( p_vout->p_sys->p_display ); XvMCSetSubpicturePalette( p_vout->p_sys->p_display, p_vout->p_sys->old_subpic, p_vout->p_sys->xvmc_palette ); XvMCFlushSubpicture( p_vout->p_sys->p_display, p_vout->p_sys->old_subpic); XvMCSyncSubpicture( p_vout->p_sys->p_display, p_vout->p_sys->old_subpic ); XVMCUNLOCKDISPLAY( p_vout->p_sys->p_display ); } XVMCLOCKDISPLAY( p_vout->p_sys->p_display); if (p_vout->p_sys->xvmc_backend_subpic ) { XvMCBlendSubpicture( p_vout->p_sys->p_display, p_pic->p_sys->xvmc_surf, p_vout->p_sys->old_subpic, 0, 0, p_vout->p_sys->xvmc_width, p_vout->p_sys->xvmc_height, 0, 0, p_vout->p_sys->xvmc_width, p_vout->p_sys->xvmc_height ); } else { XvMCBlendSubpicture2( p_vout->p_sys->p_display, p_pic->p_sys->xvmc_surf, p_pic->p_sys->xvmc_surf,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -