bool VaapiGlobalContext::init() { GNASH_REPORT_FUNCTION; VADisplay dpy = display(); VAStatus status; int num_profiles = 0; _profiles.resize(vaMaxNumProfiles(dpy)); status = vaQueryConfigProfiles(dpy, &_profiles[0], &num_profiles); if (!vaapi_check_status(status, "vaQueryConfigProfiles()")) { return false; } _profiles.resize(num_profiles); int num_image_formats = 0; _image_formats.resize(vaMaxNumImageFormats(dpy)); status = vaQueryImageFormats(dpy, &_image_formats[0], &num_image_formats); if (!vaapi_check_status(status, "vaQueryImageFormats()")) { return false; } _image_formats.resize(num_image_formats); unsigned int num_subpicture_formats = 0; std::vector<unsigned int> flags; flags.resize(vaMaxNumSubpictureFormats(dpy)); _subpicture_formats.resize(vaMaxNumSubpictureFormats(dpy)); status = vaQuerySubpictureFormats(dpy, &_subpicture_formats[0], &flags[0], &num_subpicture_formats); if (!vaapi_check_status(status, "vaQuerySubpictureFormats()")) { return false; } _subpicture_formats.resize(num_subpicture_formats); return true; }
bool VAApiWriter::HWAccellInit( int W, int H, const char *codec_name ) { VAProfile p = ( VAProfile )-1; //VAProfileNone if ( !qstrcmp( codec_name, "h264" ) ) { if ( profileList.contains( VAProfileH264High ) ) p = VAProfileH264High; else if ( profileList.contains( VAProfileH264Main ) ) p = VAProfileH264Main; else if ( profileList.contains( VAProfileH264Baseline ) ) p = VAProfileH264Baseline; } else if ( !qstrcmp( codec_name, "mpeg2video" ) ) { if ( profileList.contains( VAProfileMPEG2Main ) ) p = VAProfileMPEG2Main; else if ( profileList.contains( VAProfileMPEG2Simple ) ) p = VAProfileMPEG2Simple; } else if ( !qstrcmp( codec_name, "mpeg4" ) ) { if ( profileList.contains( VAProfileMPEG4Main ) ) p = VAProfileMPEG4Main; else if ( profileList.contains( VAProfileMPEG4Simple ) ) p = VAProfileMPEG4Simple; } else if ( !qstrcmp( codec_name, "vc1" ) ) { if ( profileList.contains( VAProfileVC1Advanced ) ) p = VAProfileVC1Advanced; else if ( profileList.contains( VAProfileVC1Main ) ) p = VAProfileVC1Main; else if ( profileList.contains( VAProfileVC1Simple ) ) p = VAProfileVC1Simple; } else if ( !qstrcmp( codec_name, "h263" ) && profileList.contains( VAProfileH263Baseline ) ) p = VAProfileH263Baseline; if ( !ok || profile != p || outW != W || outH != H ) { clr(); profile = p; outW = W; outH = H; if ( !vaCreateSurfaces( surfaces, surfacesCount ) ) return false; surfacesCreated = true; if ( !vaCreateConfigAndContext() ) return false; for ( int i = 0 ; i < surfacesCount ; i++ ) surfacesQueue.enqueue( surfaces[ i ] ); unsigned numSubpicFmts = vaMaxNumSubpictureFormats( VADisp ); VAImageFormat subpicFmtList[ numSubpicFmts ]; unsigned subpic_flags[ numSubpicFmts ]; if ( vaQuerySubpictureFormats( VADisp, subpicFmtList, subpic_flags, &numSubpicFmts ) == VA_STATUS_SUCCESS ) { for ( unsigned i = 0 ; i < numSubpicFmts ; ++i ) if ( !qstrncmp( ( const char * )&subpicFmtList[ i ].fourcc, "BGRA", 4 ) ) { subpict_dest_is_screen_coord = subpic_flags[ i ] & VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD; rgbImgFmt = new VAImageFormat( subpicFmtList[ i ] ); break; } } init_vpp(); if ( isXvBA ) { QWidget::destroy(); QWidget::create(); } ok = true; } else { #ifdef HAVE_VPP forward_reference = VA_INVALID_SURFACE; vpp_second = false; #endif if ( isVDPAU ) { if ( context ) { vaDestroyContext( VADisp, context ); context = 0; } if ( config ) { vaDestroyConfig( VADisp, config ); config = 0; } if ( !vaCreateConfigAndContext() ) return false; } } return ok; }