コード例 #1
0
ファイル: FFDecVAAPI.cpp プロジェクト: JandunCN/QMPlay2
bool FFDecVAAPI::open( StreamInfo *streamInfo, Writer *writer )
{
	if ( canUseHWAccel( streamInfo ) )
	{
		AVCodec *codec = init( streamInfo );
		if ( codec && hasHWAccel( "vaapi" ) )
		{
			if ( writer && writer->name() != VAApiWriterName )
				writer = NULL;
			hwAccelWriter = writer ? ( VideoWriter * )writer : new VAApiWriter( getModule() );
			if ( ( writer || hwAccelWriter->open() ) && hwAccelWriter->HWAccellInit( codec_ctx->width, codec_ctx->height, avcodec_get_name( codec_ctx->codec_id ) ) )
			{
				codec_ctx->hwaccel_context = av_mallocz( sizeof( vaapi_context ) );
				( ( vaapi_context * )codec_ctx->hwaccel_context )->display    = ( ( VAApiWriter * )hwAccelWriter )->getVADisplay();
				( ( vaapi_context * )codec_ctx->hwaccel_context )->context_id = ( ( VAApiWriter * )hwAccelWriter )->getVAContext();
				( ( vaapi_context * )codec_ctx->hwaccel_context )->config_id  = ( ( VAApiWriter * )hwAccelWriter )->getVAConfig();
				codec_ctx->thread_count   = 1;
				codec_ctx->get_buffer     = HWAccelHelper::get_buffer;
				codec_ctx->release_buffer = HWAccelHelper::release_buffer;
				codec_ctx->get_format     = get_format;
				codec_ctx->slice_flags    = SLICE_FLAG_CODED_ORDER | SLICE_FLAG_ALLOW_FIELD;
				codec_ctx->opaque         = dynamic_cast< HWAccelHelper * >( hwAccelWriter );
				if ( openCodec( codec ) )
					return true;
			}
			else
			{
				if ( !writer )
					delete hwAccelWriter;
				hwAccelWriter = NULL;
			}
		}
	}
	return false;
}
コード例 #2
0
ファイル: FFDecVDPAU.cpp プロジェクト: mitya57/QMPlay2
bool FFDecVDPAU::open(StreamInfo *streamInfo, Writer *writer)
{
	/*
	 * AV_PIX_FMT_YUVJ420P doesn't work on FFmpeg/VDPAU, but works on VAAPI over VDPAU.
	 * I tested FFmpeg 2.7 and it works, but crashes (assertion failed) in FFmpeg >= 2.8.
	*/
	const bool canUseYUVJ420P = avcodec_version() < 0x383C64;
	if (streamInfo->img_fmt == AV_PIX_FMT_YUV420P || (canUseYUVJ420P && streamInfo->img_fmt == AV_PIX_FMT_YUVJ420P))
	{
		AVCodec *codec = init(streamInfo);
		if (codec && hasHWAccel("vdpau"))
		{
			if (writer && writer->name() != VDPAUWriterName)
				writer = NULL;
			hwAccelWriter = writer ? (VideoWriter *)writer : new VDPAUWriter(getModule());
			if ((writer || hwAccelWriter->open()) && hwAccelWriter->HWAccellInit(codec_ctx->width, codec_ctx->height, avcodec_get_name(codec_ctx->codec_id)))
			{
				codec_ctx->hwaccel_context = av_mallocz(sizeof(AVVDPAUContext));
				((AVVDPAUContext *)codec_ctx->hwaccel_context)->decoder = ((VDPAUWriter *)hwAccelWriter)->getVdpDecoder();
				((AVVDPAUContext *)codec_ctx->hwaccel_context)->render  = ((VDPAUWriter *)hwAccelWriter)->getVdpDecoderRender();
				codec_ctx->thread_count   = 1;
				codec_ctx->get_buffer2    = HWAccelHelper::get_buffer;
				codec_ctx->get_format     = get_format;
				codec_ctx->slice_flags    = SLICE_FLAG_CODED_ORDER | SLICE_FLAG_ALLOW_FIELD;
				codec_ctx->opaque         = dynamic_cast< HWAccelHelper * >(hwAccelWriter);
				if (openCodec(codec))
					return true;
			}
			else
			{
				if (!writer)
					delete hwAccelWriter;
				hwAccelWriter = NULL;
			}
		}
	}
	return false;
}