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