bool VAApiWriter::set() { #ifdef HAVE_VPP allowVDPAU = sets().getBool( "AllowVDPAUinVAAPI" ); VAProcDeinterlacingType _vpp_deint_type; switch ( sets().getInt( "VAAPIDeintMethod" ) ) { case 0: _vpp_deint_type = VAProcDeinterlacingNone; break; case 2: _vpp_deint_type = VAProcDeinterlacingMotionCompensated; break; default: _vpp_deint_type = VAProcDeinterlacingMotionAdaptive; } const bool reload_vpp = ok && use_vpp && vpp_deint_type != _vpp_deint_type; vpp_deint_type = _vpp_deint_type; if ( reload_vpp ) { clr_vpp(); init_vpp(); } #endif return true; }
void VAApiWriter::init_vpp() { #ifdef HAVE_VPP use_vpp = true; if ( vaCreateConfig( VADisp, ( VAProfile )-1, VAEntrypointVideoProc, NULL, 0, &config_vpp ) == VA_STATUS_SUCCESS && vaCreateContext( VADisp, config_vpp, 0, 0, 0, NULL, 0, &context_vpp ) == VA_STATUS_SUCCESS && vaCreateSurfaces( &id_vpp, 1 ) ) { unsigned num_filters = VAProcFilterCount; VAProcFilterType filters[ VAProcFilterCount ]; if ( vaQueryVideoProcFilters( VADisp, context_vpp, filters, &num_filters ) != VA_STATUS_SUCCESS ) num_filters = 0; if ( num_filters ) { if ( vpp_deint_type != VAProcDeinterlacingNone ) for ( unsigned i = 0 ; i < num_filters ; ++i ) if ( filters[ i ] == VAProcFilterDeinterlacing ) { VAProcFilterCapDeinterlacing deinterlacing_caps[ VAProcDeinterlacingCount ]; unsigned num_deinterlacing_caps = VAProcDeinterlacingCount; if ( vaQueryVideoProcFilterCaps( VADisp, context_vpp, VAProcFilterDeinterlacing, &deinterlacing_caps, &num_deinterlacing_caps ) != VA_STATUS_SUCCESS ) num_deinterlacing_caps = 0; bool vpp_deint_types[ 2 ] = { false }; for ( unsigned j = 0 ; j < num_deinterlacing_caps ; ++j ) { switch ( deinterlacing_caps[ j ].type ) { case VAProcDeinterlacingMotionAdaptive: vpp_deint_types[ 0 ] = true; break; case VAProcDeinterlacingMotionCompensated: vpp_deint_types[ 1 ] = true; break; default: break; } } if ( vpp_deint_type == VAProcDeinterlacingMotionCompensated && !vpp_deint_types[ 1 ] ) { QMPlay2Core.log( tr( "Nie obsługiwany algorytm usuwania przeplotu" ) + " - Motion compensated", ErrorLog | LogOnce ); vpp_deint_type = VAProcDeinterlacingMotionAdaptive; } if ( vpp_deint_type == VAProcDeinterlacingMotionAdaptive && !vpp_deint_types[ 0 ] ) { QMPlay2Core.log( tr( "Nie obsługiwany algorytm usuwania przeplotu" ) + " - Motion adaptive", ErrorLog | LogOnce ); vpp_deint_type = VAProcDeinterlacingNone; } if ( vpp_deint_type != VAProcDeinterlacingNone ) { VAProcFilterParameterBufferDeinterlacing deint_params = { VAProcFilterDeinterlacing, vpp_deint_type, VPP_TFF }; if ( vaCreateBuffer( VADisp, context_vpp, VAProcFilterParameterBufferType, sizeof deint_params, 1, &deint_params, &vpp_deint ) != VA_STATUS_SUCCESS ) vpp_deint = VA_INVALID_ID; } break; } return; } } if ( vpp_deint_type != VAProcDeinterlacingNone ) QMPlay2Core.log( tr( "Nie można otworzyć filtrów usuwających przeplot" ), ErrorLog | LogOnce ); clr_vpp(); #endif }
void VAApiWriter::init_vpp() { #ifdef HAVE_VPP use_vpp = true; if ( vaCreateConfig( VADisp, ( VAProfile )-1, VAEntrypointVideoProc, NULL, 0, &config_vpp ) == VA_STATUS_SUCCESS && vaCreateContext( VADisp, config_vpp, 0, 0, 0, NULL, 0, &context_vpp ) == VA_STATUS_SUCCESS && vaCreateSurfaces( &id_vpp, 1 ) ) { unsigned num_filters = VAProcFilterCount; VAProcFilterType filters[ VAProcFilterCount ]; if ( vaQueryVideoProcFilters( VADisp, context_vpp, filters, &num_filters ) != VA_STATUS_SUCCESS ) num_filters = 0; if ( num_filters ) { /* Creating dummy filter (some drivers/api versions crashes without any filter) */ VAProcFilterParameterBufferBase none_params = { VAProcFilterNone }; if ( vaCreateBuffer( VADisp, context_vpp, VAProcFilterParameterBufferType, sizeof none_params, 1, &none_params, &vpp_buffers[ VAProcFilterNone ] ) != VA_STATUS_SUCCESS ) vpp_buffers[ VAProcFilterNone ] = VA_INVALID_ID; /* Searching deinterlacing filter */ if ( vpp_deint_type != VAProcDeinterlacingNone ) for ( unsigned i = 0 ; i < num_filters ; ++i ) if ( filters[ i ] == VAProcFilterDeinterlacing ) { VAProcFilterCapDeinterlacing deinterlacing_caps[ VAProcDeinterlacingCount ]; unsigned num_deinterlacing_caps = VAProcDeinterlacingCount; if ( vaQueryVideoProcFilterCaps( VADisp, context_vpp, VAProcFilterDeinterlacing, &deinterlacing_caps, &num_deinterlacing_caps ) != VA_STATUS_SUCCESS ) num_deinterlacing_caps = 0; bool vpp_deint_types[ 2 ] = { false }; for ( unsigned j = 0 ; j < num_deinterlacing_caps ; ++j ) { switch ( deinterlacing_caps[ j ].type ) { case VAProcDeinterlacingMotionAdaptive: vpp_deint_types[ 0 ] = true; break; case VAProcDeinterlacingMotionCompensated: vpp_deint_types[ 1 ] = true; break; default: break; } } if ( vpp_deint_type == VAProcDeinterlacingMotionCompensated && !vpp_deint_types[ 1 ] ) { QMPlay2Core.log( tr( "Nie obsługiwany algorytm usuwania przeplotu" ) + " - Motion compensated", ErrorLog | LogOnce ); vpp_deint_type = VAProcDeinterlacingMotionAdaptive; } if ( vpp_deint_type == VAProcDeinterlacingMotionAdaptive && !vpp_deint_types[ 0 ] ) { QMPlay2Core.log( tr( "Nie obsługiwany algorytm usuwania przeplotu" ) + " - Motion adaptive", ErrorLog | LogOnce ); vpp_deint_type = VAProcDeinterlacingNone; } if ( vpp_deint_type != VAProcDeinterlacingNone ) { VAProcFilterParameterBufferDeinterlacing deint_params = { VAProcFilterDeinterlacing, vpp_deint_type, 0 }; if ( vaCreateBuffer( VADisp, context_vpp, VAProcFilterParameterBufferType, sizeof deint_params, 1, &deint_params, &vpp_buffers[ VAProcFilterDeinterlacing ] ) != VA_STATUS_SUCCESS ) vpp_buffers[ VAProcFilterDeinterlacing ] = VA_INVALID_ID; } break; } return; } } if ( vpp_deint_type != VAProcDeinterlacingNone ) //Show error only when filter is required QMPlay2Core.log( "VA-API :: " + tr( "Nie można otworzyć filtrów obrazu" ), ErrorLog | LogOnce ); clr_vpp(); #endif }