1## 2## Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3## 4## Use of this source code is governed by a BSD-style license 5## that can be found in the LICENSE file in the root of the source 6## tree. An additional intellectual property rights grant can be found 7## in the file PATENTS. All contributing project authors may 8## be found in the AUTHORS file in the root of the source tree. 9## 10 11LIBYUV_SRCS += third_party/libyuv/include/libyuv/basic_types.h \ 12 third_party/libyuv/include/libyuv/convert.h \ 13 third_party/libyuv/include/libyuv/convert_argb.h \ 14 third_party/libyuv/include/libyuv/convert_from.h \ 15 third_party/libyuv/include/libyuv/cpu_id.h \ 16 third_party/libyuv/include/libyuv/planar_functions.h \ 17 third_party/libyuv/include/libyuv/rotate.h \ 18 third_party/libyuv/include/libyuv/row.h \ 19 third_party/libyuv/include/libyuv/scale.h \ 20 third_party/libyuv/include/libyuv/scale_row.h \ 21 third_party/libyuv/source/cpu_id.cc \ 22 third_party/libyuv/source/planar_functions.cc \ 23 third_party/libyuv/source/row_any.cc \ 24 third_party/libyuv/source/row_common.cc \ 25 third_party/libyuv/source/row_mips.cc \ 26 third_party/libyuv/source/row_neon.cc \ 27 third_party/libyuv/source/row_neon64.cc \ 28 third_party/libyuv/source/row_posix.cc \ 29 third_party/libyuv/source/row_win.cc \ 30 third_party/libyuv/source/scale.cc \ 31 third_party/libyuv/source/scale_common.cc \ 32 third_party/libyuv/source/scale_mips.cc \ 33 third_party/libyuv/source/scale_neon.cc \ 34 third_party/libyuv/source/scale_neon64.cc \ 35 third_party/libyuv/source/scale_posix.cc \ 36 third_party/libyuv/source/scale_win.cc \ 37 38LIBWEBM_MUXER_SRCS += third_party/libwebm/mkvmuxer.cpp \ 39 third_party/libwebm/mkvmuxerutil.cpp \ 40 third_party/libwebm/mkvwriter.cpp \ 41 third_party/libwebm/mkvmuxer.hpp \ 42 third_party/libwebm/mkvmuxertypes.hpp \ 43 third_party/libwebm/mkvmuxerutil.hpp \ 44 third_party/libwebm/mkvparser.hpp \ 45 third_party/libwebm/mkvwriter.hpp \ 46 third_party/libwebm/webmids.hpp 47 48LIBWEBM_PARSER_SRCS = third_party/libwebm/mkvparser.cpp \ 49 third_party/libwebm/mkvreader.cpp \ 50 third_party/libwebm/mkvparser.hpp \ 51 third_party/libwebm/mkvreader.hpp 52 53# List of examples to build. UTILS are tools meant for distribution 54# while EXAMPLES demonstrate specific portions of the API. 55UTILS-$(CONFIG_DECODERS) += vpxdec.c 56vpxdec.SRCS += md5_utils.c md5_utils.h 57vpxdec.SRCS += vpx_ports/mem_ops.h 58vpxdec.SRCS += vpx_ports/mem_ops_aligned.h 59vpxdec.SRCS += vpx_ports/vpx_timer.h 60vpxdec.SRCS += vpx/vpx_integer.h 61vpxdec.SRCS += args.c args.h 62vpxdec.SRCS += ivfdec.c ivfdec.h 63vpxdec.SRCS += tools_common.c tools_common.h 64vpxdec.SRCS += y4menc.c y4menc.h 65ifeq ($(CONFIG_LIBYUV),yes) 66 vpxdec.SRCS += $(LIBYUV_SRCS) 67endif 68ifeq ($(CONFIG_WEBM_IO),yes) 69 vpxdec.SRCS += $(LIBWEBM_PARSER_SRCS) 70 vpxdec.SRCS += webmdec.cc webmdec.h 71endif 72vpxdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950 73vpxdec.DESCRIPTION = Full featured decoder 74UTILS-$(CONFIG_ENCODERS) += vpxenc.c 75vpxenc.SRCS += args.c args.h y4minput.c y4minput.h vpxenc.h 76vpxenc.SRCS += ivfdec.c ivfdec.h 77vpxenc.SRCS += ivfenc.c ivfenc.h 78vpxenc.SRCS += rate_hist.c rate_hist.h 79vpxenc.SRCS += tools_common.c tools_common.h 80vpxenc.SRCS += warnings.c warnings.h 81vpxenc.SRCS += vpx_ports/mem_ops.h 82vpxenc.SRCS += vpx_ports/mem_ops_aligned.h 83vpxenc.SRCS += vpx_ports/vpx_timer.h 84vpxenc.SRCS += vpxstats.c vpxstats.h 85ifeq ($(CONFIG_LIBYUV),yes) 86 vpxenc.SRCS += $(LIBYUV_SRCS) 87endif 88ifeq ($(CONFIG_WEBM_IO),yes) 89 vpxenc.SRCS += $(LIBWEBM_MUXER_SRCS) 90 vpxenc.SRCS += webmenc.cc webmenc.h 91endif 92vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1 93vpxenc.DESCRIPTION = Full featured encoder 94ifeq ($(CONFIG_SPATIAL_SVC),yes) 95 EXAMPLES-$(CONFIG_VP9_ENCODER) += vp9_spatial_svc_encoder.c 96 vp9_spatial_svc_encoder.SRCS += args.c args.h 97 vp9_spatial_svc_encoder.SRCS += ivfenc.c ivfenc.h 98 vp9_spatial_svc_encoder.SRCS += tools_common.c tools_common.h 99 vp9_spatial_svc_encoder.SRCS += video_common.h 100 vp9_spatial_svc_encoder.SRCS += video_writer.h video_writer.c 101 vp9_spatial_svc_encoder.SRCS += vpxstats.c vpxstats.h 102 vp9_spatial_svc_encoder.GUID = 4A38598D-627D-4505-9C7B-D4020C84100D 103 vp9_spatial_svc_encoder.DESCRIPTION = VP9 Spatial SVC Encoder 104endif 105 106ifneq ($(CONFIG_SHARED),yes) 107EXAMPLES-$(CONFIG_VP9_ENCODER) += resize_util.c 108endif 109 110EXAMPLES-$(CONFIG_ENCODERS) += vpx_temporal_svc_encoder.c 111vpx_temporal_svc_encoder.SRCS += ivfenc.c ivfenc.h 112vpx_temporal_svc_encoder.SRCS += tools_common.c tools_common.h 113vpx_temporal_svc_encoder.SRCS += video_common.h 114vpx_temporal_svc_encoder.SRCS += video_writer.h video_writer.c 115vpx_temporal_svc_encoder.GUID = B18C08F2-A439-4502-A78E-849BE3D60947 116vpx_temporal_svc_encoder.DESCRIPTION = Temporal SVC Encoder 117EXAMPLES-$(CONFIG_DECODERS) += simple_decoder.c 118simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC 119simple_decoder.SRCS += ivfdec.h ivfdec.c 120simple_decoder.SRCS += tools_common.h tools_common.c 121simple_decoder.SRCS += video_common.h 122simple_decoder.SRCS += video_reader.h video_reader.c 123simple_decoder.SRCS += vpx_ports/mem_ops.h 124simple_decoder.SRCS += vpx_ports/mem_ops_aligned.h 125simple_decoder.DESCRIPTION = Simplified decoder loop 126EXAMPLES-$(CONFIG_DECODERS) += postproc.c 127postproc.SRCS += ivfdec.h ivfdec.c 128postproc.SRCS += tools_common.h tools_common.c 129postproc.SRCS += video_common.h 130postproc.SRCS += video_reader.h video_reader.c 131postproc.SRCS += vpx_ports/mem_ops.h 132postproc.SRCS += vpx_ports/mem_ops_aligned.h 133postproc.GUID = 65E33355-F35E-4088-884D-3FD4905881D7 134postproc.DESCRIPTION = Decoder postprocessor control 135EXAMPLES-$(CONFIG_DECODERS) += decode_to_md5.c 136decode_to_md5.SRCS += md5_utils.h md5_utils.c 137decode_to_md5.SRCS += ivfdec.h ivfdec.c 138decode_to_md5.SRCS += tools_common.h tools_common.c 139decode_to_md5.SRCS += video_common.h 140decode_to_md5.SRCS += video_reader.h video_reader.c 141decode_to_md5.SRCS += vpx_ports/mem_ops.h 142decode_to_md5.SRCS += vpx_ports/mem_ops_aligned.h 143decode_to_md5.GUID = 59120B9B-2735-4BFE-B022-146CA340FE42 144decode_to_md5.DESCRIPTION = Frame by frame MD5 checksum 145EXAMPLES-$(CONFIG_ENCODERS) += simple_encoder.c 146simple_encoder.SRCS += ivfenc.h ivfenc.c 147simple_encoder.SRCS += tools_common.h tools_common.c 148simple_encoder.SRCS += video_common.h 149simple_encoder.SRCS += video_writer.h video_writer.c 150simple_encoder.GUID = 4607D299-8A71-4D2C-9B1D-071899B6FBFD 151simple_encoder.DESCRIPTION = Simplified encoder loop 152EXAMPLES-$(CONFIG_VP9_ENCODER) += vp9_lossless_encoder.c 153vp9_lossless_encoder.SRCS += ivfenc.h ivfenc.c 154vp9_lossless_encoder.SRCS += tools_common.h tools_common.c 155vp9_lossless_encoder.SRCS += video_common.h 156vp9_lossless_encoder.SRCS += video_writer.h video_writer.c 157vp9_lossless_encoder.GUID = B63C7C88-5348-46DC-A5A6-CC151EF93366 158vp9_lossless_encoder.DESCRIPTION = Simplified lossless VP9 encoder 159EXAMPLES-$(CONFIG_ENCODERS) += twopass_encoder.c 160twopass_encoder.SRCS += ivfenc.h ivfenc.c 161twopass_encoder.SRCS += tools_common.h tools_common.c 162twopass_encoder.SRCS += video_common.h 163twopass_encoder.SRCS += video_writer.h video_writer.c 164twopass_encoder.GUID = 73494FA6-4AF9-4763-8FBB-265C92402FD8 165twopass_encoder.DESCRIPTION = Two-pass encoder loop 166EXAMPLES-$(CONFIG_DECODERS) += decode_with_drops.c 167decode_with_drops.SRCS += ivfdec.h ivfdec.c 168decode_with_drops.SRCS += tools_common.h tools_common.c 169decode_with_drops.SRCS += video_common.h 170decode_with_drops.SRCS += video_reader.h video_reader.c 171decode_with_drops.SRCS += vpx_ports/mem_ops.h 172decode_with_drops.SRCS += vpx_ports/mem_ops_aligned.h 173decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26 174decode_with_drops.DESCRIPTION = Drops frames while decoding 175EXAMPLES-$(CONFIG_ENCODERS) += set_maps.c 176set_maps.SRCS += ivfenc.h ivfenc.c 177set_maps.SRCS += tools_common.h tools_common.c 178set_maps.SRCS += video_common.h 179set_maps.SRCS += video_writer.h video_writer.c 180set_maps.GUID = ECB2D24D-98B8-4015-A465-A4AF3DCC145F 181set_maps.DESCRIPTION = Set active and ROI maps 182EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8cx_set_ref.c 183vp8cx_set_ref.SRCS += ivfenc.h ivfenc.c 184vp8cx_set_ref.SRCS += tools_common.h tools_common.c 185vp8cx_set_ref.SRCS += video_common.h 186vp8cx_set_ref.SRCS += video_writer.h video_writer.c 187vp8cx_set_ref.GUID = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A 188vp8cx_set_ref.DESCRIPTION = VP8 set encoder reference frame 189 190 191ifeq ($(CONFIG_MULTI_RES_ENCODING),yes) 192ifeq ($(CONFIG_LIBYUV),yes) 193EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_multi_resolution_encoder.c 194vp8_multi_resolution_encoder.SRCS += ivfenc.h ivfenc.c 195vp8_multi_resolution_encoder.SRCS += tools_common.h tools_common.c 196vp8_multi_resolution_encoder.SRCS += video_writer.h video_writer.c 197vp8_multi_resolution_encoder.SRCS += $(LIBYUV_SRCS) 198vp8_multi_resolution_encoder.GUID = 04f8738e-63c8-423b-90fa-7c2703a374de 199vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding 200endif 201endif 202 203# Handle extra library flags depending on codec configuration 204 205# We should not link to math library (libm) on RVCT 206# when building for bare-metal targets 207ifeq ($(CONFIG_OS_SUPPORT), yes) 208CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m 209CODEC_EXTRA_LIBS-$(CONFIG_VP9) += m 210else 211 ifeq ($(CONFIG_GCC), yes) 212 CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m 213 CODEC_EXTRA_LIBS-$(CONFIG_VP9) += m 214 endif 215endif 216# 217# End of specified files. The rest of the build rules should happen 218# automagically from here. 219# 220 221 222# Examples need different flags based on whether we're building 223# from an installed tree or a version controlled tree. Determine 224# the proper paths. 225ifeq ($(HAVE_ALT_TREE_LAYOUT),yes) 226 LIB_PATH-yes := $(SRC_PATH_BARE)/../lib 227 INC_PATH-yes := $(SRC_PATH_BARE)/../include 228else 229 LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.) 230 INC_PATH-$(CONFIG_VP8_DECODER) += $(SRC_PATH_BARE)/vp8 231 INC_PATH-$(CONFIG_VP8_ENCODER) += $(SRC_PATH_BARE)/vp8 232 INC_PATH-$(CONFIG_VP9_DECODER) += $(SRC_PATH_BARE)/vp9 233 INC_PATH-$(CONFIG_VP9_ENCODER) += $(SRC_PATH_BARE)/vp9 234endif 235INC_PATH-$(CONFIG_LIBYUV) += $(SRC_PATH_BARE)/third_party/libyuv/include 236LIB_PATH := $(call enabled,LIB_PATH) 237INC_PATH := $(call enabled,INC_PATH) 238INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH)) 239INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH)) 240 241 242# Expand list of selected examples to build (as specified above) 243UTILS = $(call enabled,UTILS) 244EXAMPLES = $(addprefix examples/,$(call enabled,EXAMPLES)) 245ALL_EXAMPLES = $(UTILS) $(EXAMPLES) 246UTIL_SRCS = $(foreach ex,$(UTILS),$($(ex:.c=).SRCS)) 247ALL_SRCS = $(foreach ex,$(ALL_EXAMPLES),$($(notdir $(ex:.c=)).SRCS)) 248CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS)) 249 250 251# Expand all example sources into a variable containing all sources 252# for that example (not just them main one specified in UTILS/EXAMPLES) 253# and add this file to the list (for MSVS workspace generation) 254$(foreach ex,$(ALL_EXAMPLES),$(eval $(notdir $(ex:.c=)).SRCS += $(ex) examples.mk)) 255 256 257# If this is a universal (fat) binary, then all the subarchitectures have 258# already been built and our job is to stitch them together. The 259# BUILD_OBJS variable indicates whether we should be building 260# (compiling, linking) the library. The LIPO_OBJS variable indicates 261# that we're stitching. 262$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes) 263 264 265# Create build/install dependencies for all examples. The common case 266# is handled here. The MSVS case is handled below. 267NOT_MSVS = $(if $(CONFIG_MSVS),,yes) 268DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX))) 269INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX))) 270DIST-SRCS-yes += $(ALL_SRCS) 271INSTALL-SRCS-yes += $(UTIL_SRCS) 272OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS))) 273BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX))) 274 275 276# Instantiate linker template for all examples. 277CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx) 278SHARED_LIB_SUF=$(if $(filter darwin%,$(TGT_OS)),.dylib,.so) 279CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a) 280$(foreach bin,$(BINS-yes),\ 281 $(if $(BUILD_OBJS),$(eval $(bin):\ 282 $(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\ 283 $(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\ 284 $(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \ 285 -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\ 286 )))\ 287 $(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\ 288 ) 289 290 291# The following pairs define a mapping of locations in the distribution 292# tree to locations in the source/build trees. 293INSTALL_MAPS += src/%.c %.c 294INSTALL_MAPS += src/% $(SRC_PATH_BARE)/% 295INSTALL_MAPS += bin/% % 296INSTALL_MAPS += % % 297 298 299# Set up additional MSVS environment 300ifeq ($(CONFIG_MSVS),yes) 301CODEC_LIB=$(if $(CONFIG_SHARED),vpx,$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)) 302# This variable uses deferred expansion intentionally, since the results of 303# $(wildcard) may change during the course of the Make. 304VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d)))) 305INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),bin/$(p)/% $(p)/Release/%) 306endif 307 308# Build Visual Studio Projects. We use a template here to instantiate 309# explicit rules rather than using an implicit rule because we want to 310# leverage make's VPATH searching rather than specifying the paths on 311# each file in ALL_EXAMPLES. This has the unfortunate side effect that 312# touching the source files trigger a rebuild of the project files 313# even though there is no real dependency there (the dependency is on 314# the makefiles). We may want to revisit this. 315define vcproj_template 316$(1): $($(1:.$(VCPROJ_SFX)=).SRCS) vpx.$(VCPROJ_SFX) 317 @echo " [vcproj] $$@" 318 $$(GEN_VCPROJ)\ 319 --exe\ 320 --target=$$(TOOLCHAIN)\ 321 --name=$$(@:.$(VCPROJ_SFX)=)\ 322 --ver=$$(CONFIG_VS_VERSION)\ 323 --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\ 324 --src-path-bare="$(SRC_PATH_BARE)" \ 325 $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \ 326 --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \ 327 $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^ 328endef 329ALL_EXAMPLES_BASENAME := $(notdir $(ALL_EXAMPLES)) 330PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES_BASENAME:.c=.$(VCPROJ_SFX)) 331INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\ 332 $(addprefix bin/$(p)/,$(ALL_EXAMPLES_BASENAME:.c=.exe))) 333$(foreach proj,$(call enabled,PROJECTS),\ 334 $(eval $(call vcproj_template,$(proj)))) 335 336# 337# Documentation Rules 338# 339%.dox: %.c 340 @echo " [DOXY] $@" 341 @echo "/*!\page example_$(@F:.dox=) $(@F:.dox=)" > $@ 342 @echo " \includelineno $(<F)" >> $@ 343 @echo "*/" >> $@ 344 345samples.dox: examples.mk 346 @echo " [DOXY] $@" 347 @echo "/*!\page samples Sample Code" > $@ 348 @echo " This SDK includes a number of sample applications."\ 349 "Each sample documents a feature of the SDK in both prose"\ 350 "and the associated C code."\ 351 "The following samples are included: ">>$@ 352 @$(foreach ex,$(sort $(notdir $(EXAMPLES:.c=))),\ 353 echo " - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;) 354 @echo >> $@ 355 @echo " In addition, the SDK contains a number of utilities."\ 356 "Since these utilities are built upon the concepts described"\ 357 "in the sample code listed above, they are not documented in"\ 358 "pieces like the samples are. Their source is included here"\ 359 "for reference. The following utilities are included:" >> $@ 360 @$(foreach ex,$(sort $(UTILS:.c=)),\ 361 echo " - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;) 362 @echo "*/" >> $@ 363 364CLEAN-OBJS += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox) 365DOCS-yes += examples.doxy samples.dox 366examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox) 367 @echo "INPUT += $^" > $@ 368