
# Copyright (C) 2018 Intel Corporation. All Rights Reserved.
# 
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sub license, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# 
# The above copyright notice and this permission notice (including the
# next paragraph) shall be included in all copies or substantial portions
# of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
# IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


bin_PROGRAMS = sfcsample


AM_CPPFLAGS = \
	-Wall	\
	-fstack-protector	\
	$(LIBVA_CFLAGS)		\
	-I$(top_srcdir)/common	\
	-I$(top_srcdir)/vendor/intel/sfcsample	\
	$(NULL)

TEST_LIBS = \
	$(LIBVA_LIBS)				\
	$(top_builddir)/common/libva-display.la	\
	$(NULL)


sfcsample_LDADD = $(TEST_LIBS)

source_c = TestMain.cpp
source_c += VDecAccelVA.cpp

sfcsample_SOURCES = $(source_c)


valgrind:$(bin_PROGRAMS)
	for a in $(bin_PROGRAMS); do \
		valgrind --leak-check=full --show-reachable=yes .libs/$$a; \
	done

EXTRA_DIST =		\
	VDecAccelVA.h 	\
	DecodeParamBuffer.h	\
	$(NULL)
