|  | ## | 
|  | ## Copyright (c) 2016, Alliance for Open Media. All rights reserved | 
|  | ## | 
|  | ## This source code is subject to the terms of the BSD 2 Clause License and | 
|  | ## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | 
|  | ## was not distributed with this source code in the LICENSE file, you can | 
|  | ## obtain it at www.aomedia.org/license/software. If the Alliance for Open | 
|  | ## Media Patent License 1.0 was not distributed with this source code in the | 
|  | ## PATENTS file, you can obtain it at www.aomedia.org/license/patent. | 
|  | ## | 
|  |  | 
|  |  | 
|  | LIBYUV_SRCS +=  third_party/libyuv/include/libyuv/basic_types.h  \ | 
|  | third_party/libyuv/include/libyuv/convert.h \ | 
|  | third_party/libyuv/include/libyuv/convert_argb.h \ | 
|  | third_party/libyuv/include/libyuv/convert_from.h \ | 
|  | third_party/libyuv/include/libyuv/cpu_id.h  \ | 
|  | third_party/libyuv/include/libyuv/planar_functions.h  \ | 
|  | third_party/libyuv/include/libyuv/rotate.h  \ | 
|  | third_party/libyuv/include/libyuv/row.h  \ | 
|  | third_party/libyuv/include/libyuv/scale.h  \ | 
|  | third_party/libyuv/include/libyuv/scale_row.h  \ | 
|  | third_party/libyuv/source/cpu_id.cc \ | 
|  | third_party/libyuv/source/planar_functions.cc \ | 
|  | third_party/libyuv/source/row_any.cc \ | 
|  | third_party/libyuv/source/row_common.cc \ | 
|  | third_party/libyuv/source/row_gcc.cc \ | 
|  | third_party/libyuv/source/row_mips.cc \ | 
|  | third_party/libyuv/source/row_neon.cc \ | 
|  | third_party/libyuv/source/row_neon64.cc \ | 
|  | third_party/libyuv/source/row_win.cc \ | 
|  | third_party/libyuv/source/scale.cc \ | 
|  | third_party/libyuv/source/scale_any.cc \ | 
|  | third_party/libyuv/source/scale_common.cc \ | 
|  | third_party/libyuv/source/scale_gcc.cc \ | 
|  | third_party/libyuv/source/scale_mips.cc \ | 
|  | third_party/libyuv/source/scale_neon.cc \ | 
|  | third_party/libyuv/source/scale_neon64.cc \ | 
|  | third_party/libyuv/source/scale_win.cc \ | 
|  |  | 
|  | LIBWEBM_COMMON_SRCS += third_party/libwebm/common/hdr_util.cc \ | 
|  | third_party/libwebm/common/hdr_util.h \ | 
|  | third_party/libwebm/common/webmids.h | 
|  |  | 
|  | LIBWEBM_MUXER_SRCS += third_party/libwebm/mkvmuxer/mkvmuxer.cc \ | 
|  | third_party/libwebm/mkvmuxer/mkvmuxerutil.cc \ | 
|  | third_party/libwebm/mkvmuxer/mkvwriter.cc \ | 
|  | third_party/libwebm/mkvmuxer/mkvmuxer.h \ | 
|  | third_party/libwebm/mkvmuxer/mkvmuxertypes.h \ | 
|  | third_party/libwebm/mkvmuxer/mkvmuxerutil.h \ | 
|  | third_party/libwebm/mkvparser/mkvparser.h \ | 
|  | third_party/libwebm/mkvmuxer/mkvwriter.h | 
|  |  | 
|  | LIBWEBM_PARSER_SRCS = third_party/libwebm/mkvparser/mkvparser.cc \ | 
|  | third_party/libwebm/mkvparser/mkvreader.cc \ | 
|  | third_party/libwebm/mkvparser/mkvparser.h \ | 
|  | third_party/libwebm/mkvparser/mkvreader.h | 
|  |  | 
|  | # Add compile flags and include path for libwebm sources. | 
|  | ifeq ($(CONFIG_WEBM_IO),yes) | 
|  | CXXFLAGS     += -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS | 
|  | INC_PATH-yes += $(SRC_PATH_BARE)/third_party/libwebm | 
|  | endif | 
|  |  | 
|  |  | 
|  | # List of examples to build. UTILS are tools meant for distribution | 
|  | # while EXAMPLES demonstrate specific portions of the API. | 
|  | UTILS-$(CONFIG_DECODERS)    += aomdec.c | 
|  | aomdec.SRCS                 += md5_utils.c md5_utils.h | 
|  | aomdec.SRCS                 += aom_ports/mem_ops.h | 
|  | aomdec.SRCS                 += aom_ports/mem_ops_aligned.h | 
|  | aomdec.SRCS                 += aom_ports/msvc.h | 
|  | aomdec.SRCS                 += aom_ports/aom_timer.h | 
|  | aomdec.SRCS                 += aom/aom_integer.h | 
|  | aomdec.SRCS                 += args.c args.h | 
|  | aomdec.SRCS                 += ivfdec.c ivfdec.h | 
|  | aomdec.SRCS                 += tools_common.c tools_common.h | 
|  | aomdec.SRCS                 += y4menc.c y4menc.h | 
|  | ifeq ($(CONFIG_LIBYUV),yes) | 
|  | aomdec.SRCS                 += $(LIBYUV_SRCS) | 
|  | endif | 
|  | ifeq ($(CONFIG_WEBM_IO),yes) | 
|  | aomdec.SRCS                 += $(LIBWEBM_COMMON_SRCS) | 
|  | aomdec.SRCS                 += $(LIBWEBM_MUXER_SRCS) | 
|  | aomdec.SRCS                 += $(LIBWEBM_PARSER_SRCS) | 
|  | aomdec.SRCS                 += webmdec.cc webmdec.h | 
|  | endif | 
|  | aomdec.GUID                  = BA5FE66F-38DD-E034-F542-B1578C5FB950 | 
|  | aomdec.DESCRIPTION           = Full featured decoder | 
|  | UTILS-$(CONFIG_ENCODERS)    += aomenc.c | 
|  | aomenc.SRCS                 += args.c args.h y4minput.c y4minput.h aomenc.h | 
|  | aomenc.SRCS                 += ivfdec.c ivfdec.h | 
|  | aomenc.SRCS                 += ivfenc.c ivfenc.h | 
|  | aomenc.SRCS                 += rate_hist.c rate_hist.h | 
|  | aomenc.SRCS                 += tools_common.c tools_common.h | 
|  | aomenc.SRCS                 += warnings.c warnings.h | 
|  | aomenc.SRCS                 += aom_ports/mem_ops.h | 
|  | aomenc.SRCS                 += aom_ports/mem_ops_aligned.h | 
|  | aomenc.SRCS                 += aom_ports/msvc.h | 
|  | aomenc.SRCS                 += aom_ports/aom_timer.h | 
|  | aomenc.SRCS                 += aomstats.c aomstats.h | 
|  | ifeq ($(CONFIG_LIBYUV),yes) | 
|  | aomenc.SRCS                 += $(LIBYUV_SRCS) | 
|  | endif | 
|  | ifeq ($(CONFIG_WEBM_IO),yes) | 
|  | aomenc.SRCS                 += $(LIBWEBM_COMMON_SRCS) | 
|  | aomenc.SRCS                 += $(LIBWEBM_MUXER_SRCS) | 
|  | aomenc.SRCS                 += $(LIBWEBM_PARSER_SRCS) | 
|  | aomenc.SRCS                 += webmenc.cc webmenc.h | 
|  | endif | 
|  | aomenc.GUID                  = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1 | 
|  | aomenc.DESCRIPTION           = Full featured encoder | 
|  |  | 
|  | EXAMPLES-$(CONFIG_DECODERS)        += simple_decoder.c | 
|  | simple_decoder.GUID                 = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC | 
|  | simple_decoder.SRCS                += ivfdec.h ivfdec.c | 
|  | simple_decoder.SRCS                += tools_common.h tools_common.c | 
|  | simple_decoder.SRCS                += video_common.h | 
|  | simple_decoder.SRCS                += video_reader.h video_reader.c | 
|  | simple_decoder.SRCS                += aom_ports/mem_ops.h | 
|  | simple_decoder.SRCS                += aom_ports/mem_ops_aligned.h | 
|  | simple_decoder.SRCS                += aom_ports/msvc.h | 
|  | simple_decoder.DESCRIPTION          = Simplified decoder loop | 
|  | EXAMPLES-$(CONFIG_DECODERS)        += decode_to_md5.c | 
|  | decode_to_md5.SRCS                 += md5_utils.h md5_utils.c | 
|  | decode_to_md5.SRCS                 += ivfdec.h ivfdec.c | 
|  | decode_to_md5.SRCS                 += tools_common.h tools_common.c | 
|  | decode_to_md5.SRCS                 += video_common.h | 
|  | decode_to_md5.SRCS                 += video_reader.h video_reader.c | 
|  | decode_to_md5.SRCS                 += aom_ports/mem_ops.h | 
|  | decode_to_md5.SRCS                 += aom_ports/mem_ops_aligned.h | 
|  | decode_to_md5.SRCS                 += aom_ports/msvc.h | 
|  | decode_to_md5.GUID                  = 59120B9B-2735-4BFE-B022-146CA340FE42 | 
|  | decode_to_md5.DESCRIPTION           = Frame by frame MD5 checksum | 
|  | EXAMPLES-$(CONFIG_ENCODERS)     += simple_encoder.c | 
|  | simple_encoder.SRCS             += ivfenc.h ivfenc.c | 
|  | simple_encoder.SRCS             += tools_common.h tools_common.c | 
|  | simple_encoder.SRCS             += video_common.h | 
|  | simple_encoder.SRCS             += video_writer.h video_writer.c | 
|  | simple_encoder.SRCS             += aom_ports/msvc.h | 
|  | simple_encoder.GUID              = 4607D299-8A71-4D2C-9B1D-071899B6FBFD | 
|  | simple_encoder.DESCRIPTION       = Simplified encoder loop | 
|  | EXAMPLES-$(CONFIG_AV1_ENCODER)  += lossless_encoder.c | 
|  | lossless_encoder.SRCS           += ivfenc.h ivfenc.c | 
|  | lossless_encoder.SRCS           += tools_common.h tools_common.c | 
|  | lossless_encoder.SRCS           += video_common.h | 
|  | lossless_encoder.SRCS           += video_writer.h video_writer.c | 
|  | lossless_encoder.SRCS           += aom_ports/msvc.h | 
|  | lossless_encoder.GUID            = B63C7C88-5348-46DC-A5A6-CC151EF93366 | 
|  | lossless_encoder.DESCRIPTION     = Simplified lossless encoder | 
|  | EXAMPLES-$(CONFIG_ENCODERS)     += twopass_encoder.c | 
|  | twopass_encoder.SRCS            += ivfenc.h ivfenc.c | 
|  | twopass_encoder.SRCS            += tools_common.h tools_common.c | 
|  | twopass_encoder.SRCS            += video_common.h | 
|  | twopass_encoder.SRCS            += video_writer.h video_writer.c | 
|  | twopass_encoder.SRCS            += aom_ports/msvc.h | 
|  | twopass_encoder.GUID             = 73494FA6-4AF9-4763-8FBB-265C92402FD8 | 
|  | twopass_encoder.DESCRIPTION      = Two-pass encoder loop | 
|  | EXAMPLES-$(CONFIG_DECODERS)     += decode_with_drops.c | 
|  | decode_with_drops.SRCS          += ivfdec.h ivfdec.c | 
|  | decode_with_drops.SRCS          += tools_common.h tools_common.c | 
|  | decode_with_drops.SRCS          += video_common.h | 
|  | decode_with_drops.SRCS          += video_reader.h video_reader.c | 
|  | decode_with_drops.SRCS          += aom_ports/mem_ops.h | 
|  | decode_with_drops.SRCS          += aom_ports/mem_ops_aligned.h | 
|  | decode_with_drops.SRCS          += aom_ports/msvc.h | 
|  | decode_with_drops.GUID           = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26 | 
|  | decode_with_drops.DESCRIPTION    = Drops frames while decoding | 
|  | EXAMPLES-$(CONFIG_ENCODERS)        += set_maps.c | 
|  | set_maps.SRCS                      += ivfenc.h ivfenc.c | 
|  | set_maps.SRCS                      += tools_common.h tools_common.c | 
|  | set_maps.SRCS                      += video_common.h | 
|  | set_maps.SRCS                      += video_writer.h video_writer.c | 
|  | set_maps.SRCS                      += aom_ports/msvc.h | 
|  | set_maps.GUID                       = ECB2D24D-98B8-4015-A465-A4AF3DCC145F | 
|  | set_maps.DESCRIPTION                = Set active and ROI maps | 
|  | ifeq ($(CONFIG_ENCODERS),yes) | 
|  | ifeq ($(CONFIG_DECODERS),yes) | 
|  | EXAMPLES-$(CONFIG_ENCODERS)        += aom_cx_set_ref.c | 
|  | aom_cx_set_ref.SRCS                += ivfenc.h ivfenc.c | 
|  | aom_cx_set_ref.SRCS                += tools_common.h tools_common.c | 
|  | aom_cx_set_ref.SRCS                += video_common.h | 
|  | aom_cx_set_ref.SRCS                += video_writer.h video_writer.c | 
|  | aom_cx_set_ref.SRCS                += aom_ports/msvc.h | 
|  | aom_cx_set_ref.GUID                 = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A | 
|  | aom_cx_set_ref.DESCRIPTION          = AV1 set encoder reference frame | 
|  | endif | 
|  | endif | 
|  |  | 
|  | # Handle extra library flags depending on codec configuration | 
|  |  | 
|  | # We should not link to math library (libm) on RVCT | 
|  | # when building for bare-metal targets | 
|  | ifeq ($(CONFIG_OS_SUPPORT), yes) | 
|  | CODEC_EXTRA_LIBS-$(CONFIG_AV1)            += m | 
|  | else | 
|  | ifeq ($(CONFIG_GCC), yes) | 
|  | CODEC_EXTRA_LIBS-$(CONFIG_AV1)        += m | 
|  | endif | 
|  | endif | 
|  | # | 
|  | # End of specified files. The rest of the build rules should happen | 
|  | # automagically from here. | 
|  | # | 
|  |  | 
|  |  | 
|  | # Examples need different flags based on whether we're building | 
|  | # from an installed tree or a version controlled tree. Determine | 
|  | # the proper paths. | 
|  | ifeq ($(HAVE_ALT_TREE_LAYOUT),yes) | 
|  | LIB_PATH-yes := $(SRC_PATH_BARE)/../lib | 
|  | INC_PATH-yes := $(SRC_PATH_BARE)/../include | 
|  | else | 
|  | LIB_PATH-yes                     += $(if $(BUILD_PFX),$(BUILD_PFX),.) | 
|  | INC_PATH-$(CONFIG_AV1_DECODER)   += $(SRC_PATH_BARE)/av1 | 
|  | INC_PATH-$(CONFIG_AV1_ENCODER)   += $(SRC_PATH_BARE)/av1 | 
|  | endif | 
|  | INC_PATH-$(CONFIG_LIBYUV) += $(SRC_PATH_BARE)/third_party/libyuv/include | 
|  | LIB_PATH := $(call enabled,LIB_PATH) | 
|  | INC_PATH := $(call enabled,INC_PATH) | 
|  | INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH)) | 
|  | INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH)) | 
|  |  | 
|  |  | 
|  | # Expand list of selected examples to build (as specified above) | 
|  | UTILS           = $(call enabled,UTILS) | 
|  | EXAMPLES        = $(addprefix examples/,$(call enabled,EXAMPLES)) | 
|  | ALL_EXAMPLES    = $(UTILS) $(EXAMPLES) | 
|  | UTIL_SRCS       = $(foreach ex,$(UTILS),$($(ex:.c=).SRCS)) | 
|  | ALL_SRCS        = $(foreach ex,$(ALL_EXAMPLES),$($(notdir $(ex:.c=)).SRCS)) | 
|  | CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS)) | 
|  |  | 
|  |  | 
|  | # Expand all example sources into a variable containing all sources | 
|  | # for that example (not just them main one specified in UTILS/EXAMPLES) | 
|  | # and add this file to the list (for MSVS workspace generation) | 
|  | $(foreach ex,$(ALL_EXAMPLES),$(eval $(notdir $(ex:.c=)).SRCS += $(ex) examples.mk)) | 
|  |  | 
|  |  | 
|  | # Create build/install dependencies for all examples. The common case | 
|  | # is handled here. The MSVS case is handled below. | 
|  | NOT_MSVS = $(if $(CONFIG_MSVS),,yes) | 
|  | DIST-BINS-$(NOT_MSVS)      += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX))) | 
|  | INSTALL-BINS-$(NOT_MSVS)   += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX))) | 
|  | DIST-SRCS-yes              += $(ALL_SRCS) | 
|  | INSTALL-SRCS-yes           += $(UTIL_SRCS) | 
|  | OBJS-$(NOT_MSVS)           += $(call objs,$(ALL_SRCS)) | 
|  | BINS-$(NOT_MSVS)           += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX))) | 
|  |  | 
|  |  | 
|  | # Instantiate linker template for all examples. | 
|  | CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),aom_g,aom) | 
|  | ifneq ($(filter darwin%,$(TGT_OS)),) | 
|  | SHARED_LIB_SUF=.dylib | 
|  | else | 
|  | ifneq ($(filter os2%,$(TGT_OS)),) | 
|  | SHARED_LIB_SUF=_dll.a | 
|  | else | 
|  | SHARED_LIB_SUF=.so | 
|  | endif | 
|  | endif | 
|  | CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a) | 
|  | $(foreach bin,$(BINS-yes),\ | 
|  | $(eval $(bin):$(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF))\ | 
|  | $(eval $(call linker_template,$(bin),\ | 
|  | $(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \ | 
|  | -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\ | 
|  | ))) | 
|  |  | 
|  | # The following pairs define a mapping of locations in the distribution | 
|  | # tree to locations in the source/build trees. | 
|  | INSTALL_MAPS += src/%.c   %.c | 
|  | INSTALL_MAPS += src/%     $(SRC_PATH_BARE)/% | 
|  | INSTALL_MAPS += bin/%     % | 
|  | INSTALL_MAPS += %         % | 
|  |  | 
|  |  | 
|  | # Set up additional MSVS environment | 
|  | ifeq ($(CONFIG_MSVS),yes) | 
|  | CODEC_LIB=$(if $(CONFIG_SHARED),aom,$(if $(CONFIG_STATIC_MSVCRT),aommt,aommd)) | 
|  | # This variable uses deferred expansion intentionally, since the results of | 
|  | # $(wildcard) may change during the course of the Make. | 
|  | VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d)))) | 
|  | INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),bin/$(p)/%  $(p)/Release/%) | 
|  | endif | 
|  |  | 
|  | # Build Visual Studio Projects. We use a template here to instantiate | 
|  | # explicit rules rather than using an implicit rule because we want to | 
|  | # leverage make's VPATH searching rather than specifying the paths on | 
|  | # each file in ALL_EXAMPLES. This has the unfortunate side effect that | 
|  | # touching the source files trigger a rebuild of the project files | 
|  | # even though there is no real dependency there (the dependency is on | 
|  | # the makefiles). We may want to revisit this. | 
|  | define vcproj_template | 
|  | $(1): $($(1:.$(VCPROJ_SFX)=).SRCS) aom.$(VCPROJ_SFX) | 
|  | $(if $(quiet),@echo "    [vcproj] $$@") | 
|  | $(qexec)$$(GEN_VCPROJ)\ | 
|  | --exe\ | 
|  | --target=$$(TOOLCHAIN)\ | 
|  | --name=$$(@:.$(VCPROJ_SFX)=)\ | 
|  | --ver=$$(CONFIG_VS_VERSION)\ | 
|  | --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\ | 
|  | --src-path-bare="$(SRC_PATH_BARE)" \ | 
|  | $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \ | 
|  | --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \ | 
|  | $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^ | 
|  | endef | 
|  | ALL_EXAMPLES_BASENAME := $(notdir $(ALL_EXAMPLES)) | 
|  | PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES_BASENAME:.c=.$(VCPROJ_SFX)) | 
|  | INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\ | 
|  | $(addprefix bin/$(p)/,$(ALL_EXAMPLES_BASENAME:.c=.exe))) | 
|  | $(foreach proj,$(call enabled,PROJECTS),\ | 
|  | $(eval $(call vcproj_template,$(proj)))) | 
|  |  | 
|  | # | 
|  | # Documentation Rules | 
|  | # | 
|  | %.dox: %.c | 
|  | @echo "    [DOXY] $@" | 
|  | @mkdir -p $(dir $@) | 
|  | @echo "/*!\page example_$(@F:.dox=) $(@F:.dox=)" > $@ | 
|  | @echo "   \includelineno $(<F)" >> $@ | 
|  | @echo "*/" >> $@ | 
|  |  | 
|  | samples.dox: examples.mk | 
|  | @echo "    [DOXY] $@" | 
|  | @echo "/*!\page samples Sample Code" > $@ | 
|  | @echo "    This SDK includes a number of sample applications."\ | 
|  | "Each sample documents a feature of the SDK in both prose"\ | 
|  | "and the associated C code."\ | 
|  | "The following samples are included: ">>$@ | 
|  | @$(foreach ex,$(sort $(notdir $(EXAMPLES:.c=))),\ | 
|  | echo "     - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;) | 
|  | @echo >> $@ | 
|  | @echo "    In addition, the SDK contains a number of utilities."\ | 
|  | "Since these utilities are built upon the concepts described"\ | 
|  | "in the sample code listed above, they are not documented in"\ | 
|  | "pieces like the samples are. Their source is included here"\ | 
|  | "for reference. The following utilities are included:" >> $@ | 
|  | @$(foreach ex,$(sort $(UTILS:.c=)),\ | 
|  | echo "     - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;) | 
|  | @echo "*/" >> $@ | 
|  |  | 
|  | CLEAN-OBJS += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox) | 
|  | DOCS-yes += examples.doxy samples.dox | 
|  | examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox) | 
|  | @echo "INPUT += $^" > $@ |