#  $Id$
# -----------------------------------------------------------------------------
#  The part of 'VideoNEXT MediaClient SDK'
# -----------------------------------------------------------------------------
#  Author: Petrov Maxim, 03/04/2009
#  Edited by:
#  QA by:
#  Copyright: videoNEXT LLC
# -----------------------------------------------------------------------------

PREBUILD_DIR=../../3rdparty/prebuild/$(BUILD_TARGET)
BUILD_DIR = ../../.build.$(BUILD_TARGET)
CXXFLAGS += -DVN_SDK -Wall -Wno-unused-local-typedefs -O2 -ggdb -D__STDC_CONSTANT_MACROS \
	    -Iimpl -Iinclude -Iimpl/ot  -Iimpl/renderer

OBJ=$(BUILD_TARGET).o
ifneq (mingw32, $(findstring mingw32,$(BUILD_TARGET)))
OBJS+=impl/HTTPMediaStreamProducerImpl.$(OBJ)
endif

# impl
OBJS+=impl/WebSocketMediaStreamProducerImpl.$(OBJ) impl/StreamStats.$(OBJ) impl/Mutex.$(OBJ) impl/osdep.$(OBJ) impl/NetIO.$(OBJ) impl/PlayoutBuffer.$(OBJ) impl/VideoFrameRateController.$(OBJ) impl/FrameConsumer.$(OBJ) impl/AudioVideoPlaybackController.$(OBJ) impl/MediaClient.$(OBJ) \
      impl/AdaptiveUsageEnvironment.$(OBJ) impl/AudioFrameConsumer.$(OBJ) impl/Cache.$(OBJ)  \
      impl/MediaStreamProducer.$(OBJ) impl/RTSPMediaStreamProducerImpl.$(OBJ) impl/FileMediaStreamProducerImpl.$(OBJ) impl/FileRecorder.$(OBJ) impl/VideoFrameConsumer.$(OBJ)  impl/rfc3174.$(OBJ)

# ot
OBJS+=impl/ot/json/json_reader.$(OBJ) impl/ot/json/json_value.$(OBJ) impl/ot/json/json_writer.$(OBJ)

# renderer
OBJS+=impl/renderer/Renderer.$(OBJ) impl/renderer/Renderer_Impl.$(OBJ) impl/renderer/sdl2/SDL2_Renderer_Impl.$(OBJ) impl/renderer/win32/D3D9_Renderer_Impl.$(OBJ) impl/renderer/win32/D3D9_Overlay.$(OBJ)


# sdk
OBJS+=vn_renderer.$(OBJ) vn_client_internal.$(OBJ) vn_client.$(OBJ) vn_client_curl.$(OBJ) vn_kv_list.$(OBJ) vn_malloc.$(OBJ) vn_result.$(OBJ) vn_asynch_result_internal.$(OBJ) vn_asynch_result.$(OBJ) vn_json.$(OBJ) vn_player.$(OBJ) vn_player_stream_handler.$(OBJ)
CXXFLAGS += -I.

# jni
ifeq (mingw32, $(findstring mingw32,$(BUILD_TARGET)))
JNI_OBJS+=jni/JMediaCapturer.$(OBJ) jni/JMediaPlayer.$(OBJ)
CXXFLAGS += -Ijni -Ijni/jdk-jni -Ijni/jdk-jni/$(BUILD_TARGET)
endif

# resources
ifeq (mingw32, $(findstring mingw32,$(BUILD_TARGET)))
RESOURCES=impl/renderer/win32/D3D9_Resource.$(OBJ) resource.$(OBJ)
endif

ifeq (iphone, $(findstring iphone,$(BUILD_TARGET)))
else
ifeq (darwin, $(findstring darwin,$(BUILD_TARGET)))
JNI_OBJS+=jni/JMediaPlayer.$(OBJ)
CXXFLAGS += -Ijni -Ijni/jdk-jni -Ijni/jdk-jni/$(BUILD_TARGET)
endif
endif

ifeq (linux, $(findstring linux,$(BUILD_TARGET)))
JNI_OBJS+=jni/JMediaPlayer.$(OBJ)
CXXFLAGS += -Ijni -Ijni/jdk-jni -Ijni/jdk-jni/$(BUILD_TARGET)
endif


all: libVNMediaClient

$(BUILD_DIR)/%.$(OBJ) : %.cpp
	if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
	$(CXX) -c $(subst $(BUILD_DIR)/,,$<) $(CXXFLAGS) -o $@

$(BUILD_DIR)/%.$(OBJ) : %.c
	if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
	$(CC) -c $(subst $(BUILD_DIR)/,,$<) $(CXXFLAGS) -o $@

$(BUILD_DIR)/%.$(OBJ) : %.rc
	if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
	$(WINDRES) -i $(subst $(BUILD_DIR)/,,$<) -o $@

ifeq (arm-mingw32ce, $(BUILD_TARGET))
WS2_LIB=ws2
else
WS2_LIB=ws2_32
endif

ifeq (mingw32, $(findstring mingw32,$(BUILD_TARGET)))
LIB_SUFFIX=dll
else ifeq (linux, $(findstring linux,$(BUILD_TARGET)))
LIB_SUFFIX=so
else
LIB_SUFFIX=dylib
endif

# patching object files (adding build dir as prefix)
OBJS      := $(addprefix $(BUILD_DIR)/, $(OBJS))
JNI_OBJS  := $(addprefix $(BUILD_DIR)/, $(JNI_OBJS))
RESOURCES := $(addprefix $(BUILD_DIR)/, $(RESOURCES))

libVNMediaClient: $(OBJS) $(DEP_LIBS) $(RESOURCES)
ifeq (mingw32, $(findstring mingw32,$(BUILD_TARGET)))
# use c:\lib.exe /machine:i386 /def:VNMediaClient.def
# then link against VNMediaClient.lib to MSVC
	if [ ! -d ../../lib/$(BUILD_TARGET) ]; then mkdir -p ../../lib/$(BUILD_TARGET); fi
	$(CXX) -shared -static-libgcc -static-libstdc++ -o ../../lib/$(BUILD_TARGET)/VNMediaClient.dll \
	    -Wl,--no-undefined \
	    -Wl,--export-all-symbols \
            -Wl,--version-script,libVNMediaClient.ver \
            -Wl,--enable-runtime-pseudo-reloc \
	    -Wl,--output-def,../../lib/$(BUILD_TARGET)/VNMediaClient.def \
            -Wl,--out-implib,../../lib/$(BUILD_TARGET)/VNMediaClient.lib \
	    -Wl,--enable-auto-import \
	$(OBJS) $(RESOURCES) $(DEP_LIBS) -Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -lole32 -loleaut32 -lshlwapi -luuid -lpsapi -lstrmiids -ladvapi32 -lshell32 -ld3d9 -ld3dx9 -ldxerr9 -ldxguid -lgdi32 -lavicap32 -lgdiplus -l$(WS2_LIB) -liphlpapi -lmingw32 -mwindows -Wl,--no-undefined -lm -ldinput8 -luser32 -lwinmm -limm32 -lshell32 -lsetupapi -lversion -lcrypt32 -lbcrypt
	$(STRIP) ../../lib/$(BUILD_TARGET)/VNMediaClient.dll
	rm -f ../../examples/VNMediaClient.dll
	cp ../../lib/$(BUILD_TARGET)/VNMediaClient.dll ../../examples/
endif

ifeq (android, $(findstring android,$(BUILD_TARGET)))
	if [ ! -d ../../lib/$(BUILD_TARGET) ]; then mkdir -p ../../lib/$(BUILD_TARGET); fi
	$(LD) -r -o ../../lib/$(BUILD_TARGET)/libVNMediaClient_static.a $(LDFLAGS) $(OBJS)
else
	if [ ! -d ../../lib/$(BUILD_TARGET) ]; then mkdir -p ../../lib/$(BUILD_TARGET); fi
	$(LD) -r -o ../../lib/$(BUILD_TARGET)/libVNMediaClient_static.a $(LDFLAGS) $(OBJS) $(DEP_LIBS)
endif

ifeq (darwin,  $(findstring darwin,$(BUILD_TARGET)))
	$(CXX) -shared -Wl,-exported_symbols_list,libVNMediaClient_darwin.ver -o ../../lib/$(BUILD_TARGET)/libVNMediaClient.$(LIB_SUFFIX) $(LDDFLAGS) $(OBJS) $(DEP_LIBS) -lstdc++ -lz -lxml2 -lbz2 -framework CoreFoundation -framework VideoDecodeAcceleration -framework CoreVideo  -framework AVFoundation -framework CoreMedia -framework CoreData -framework CoreGraphics -framework VideoToolbox -framework Foundation -framework CoreAudio -framework AudioToolbox -framework ForceFeedback -framework IOKit -framework Cocoa -framework Carbon -framework Metal -framework GameController
	strip -Sx ../../lib/$(BUILD_TARGET)/libVNMediaClient.$(LIB_SUFFIX)
endif
ifeq (linux,  $(findstring linux,$(BUILD_TARGET)))
	$(CXX) -Wl,-Bsymbolic -shared -static-libgcc -Wl,--version-script,libVNMediaClient.ver -o ../../lib/$(BUILD_TARGET)/libVNMediaClient.$(LIB_SUFFIX) $(LDDFLAGS) $(OBJS) $(DEP_LIBS) $(PREBUILD_DIR)/libxml2/lib/libxml2.a -lz -lpthread
	$(STRIP) -Sx ../../lib/$(BUILD_TARGET)/libVNMediaClient.$(LIB_SUFFIX)
endif


$(BUILD_DIR)/impl/osdep.$(OBJ): impl/osdep.cpp impl/osdep.h
$(BUILD_DIR)/impl/Mutex.$(OBJ): impl/Mutex.cpp impl/Mutex.h
$(BUILD_DIR)/impl/NetIO.$(OBJ): impl/NetIO.cpp impl/NetIO.h
$(BUILD_DIR)/impl/AdaptiveUsageEnvironment.$(OBJ): impl/AdaptiveUsageEnvironment.cpp impl/AdaptiveUsageEnvironment.h
$(BUILD_DIR)/impl/Cache.$(OBJ): impl/Cache.cpp impl/Cache.h
$(BUILD_DIR)/impl/RTSPMediaStreamProducerImpl.$(OBJ): impl/RTSPMediaStreamProducerImpl.cpp impl/RTSPMediaStreamProducerImpl.h
$(BUILD_DIR)/impl/HTTPMediaStreamProducerImpl.$(OBJ): impl/HTTPMediaStreamProducerImpl.cpp impl/HTTPMediaStreamProducerImpl.h
$(BUILD_DIR)/impl/WebSocketMediaStreamProducerImpl.$(OBJ): impl/WebSocketMediaStreamProducerImpl.cpp impl/WebSocketMediaStreamProducerImpl.h
$(BUILD_DIR)/impl/FileMediaStreamProducerImpl.$(OBJ): impl/FileMediaStreamProducerImpl.cpp impl/FileMediaStreamProducerImpl.h
$(BUILD_DIR)/impl/AudioFrameConsumer.$(OBJ): impl/AudioFrameConsumer.cpp impl/AudioFrameConsumer.h
$(BUILD_DIR)/impl/FrameConsumer.$(OBJ): impl/FrameConsumer.cpp impl/FrameConsumer.h
$(BUILD_DIR)/impl/MediaStreamProducer.$(OBJ): impl/MediaStreamProducer.cpp impl/MediaStreamProducer.h
$(BUILD_DIR)/impl/FileRecorder.$(OBJ): impl/FileRecorder.cpp impl/FileRecorder.h
$(BUILD_DIR)/impl/VideoFrameConsumer.$(OBJ): impl/VideoFrameConsumer.cpp impl/VideoFrameConsumer.h
$(BUILD_DIR)/impl/AudioVideoPlaybackController.$(OBJ): impl/AudioVideoPlaybackController.cpp impl/AudioVideoPlaybackController.h
$(BUILD_DIR)/impl/VideoFrameRateController.$(OBJ): impl/VideoFrameRateController.cpp impl/VideoFrameRateController.h
$(BUILD_DIR)/impl/PlayoutBuffer.$(OBJ): impl/PlayoutBuffer.cpp impl/PlayoutBuffer.h
$(BUILD_DIR)/impl/MediaClient.$(OBJ): impl/MediaClient.cpp impl/MediaClient.h
$(BUILD_DIR)/impl/rfc3174.$(OBJ): impl/rfc3174.cpp impl/rfc3174.h
$(BUILD_DIR)/impl/ot/GraphicsProxy.$(OBJ): impl/ot/GraphicsProxy.cpp impl/ot/GraphicsProxy.h
$(BUILD_DIR)/impl/ot/JsonObjectsTracker.$(OBJ): impl/ot/JsonObjectsTracker.cpp impl/ot/JsonObjectsTracker.h
$(BUILD_DIR)/impl/ot/json/json_reader.$(OBJ): impl/ot/json/json_reader.cpp
$(BUILD_DIR)/impl/ot/json/json_value.$(OBJ): impl/ot/json/json_value.cpp
$(BUILD_DIR)/impl/ot/json/json_writer.$(OBJ): impl/ot/json/json_writer.cpp
$(BUILD_DIR)/impl/StreamStats.$(OBJ): impl/StreamStats.cpp impl/StreamStats.h
$(BUILD_DIR)/vn_player.$(OBJ): vn_player.cpp include/vn_player.h vn_player_internal.h
$(BUILD_DIR)/vn_capture.$(OBJ): include/vn_capture.h
$(BUILD_DIR)/vn_capture_dshow.$(OBJ): vn_capture_dshow.h
$(BUILD_DIR)/vn_player_stream_handler.$(OBJ): vn_player_stream_handler.cpp vn_player_stream_handler.h
$(BUILD_DIR)/vn_json.$(OBJ): vn_json.c vn_json.h
$(BUILD_DIR)/vn_malloc.$(OBJ): vn_malloc.cpp include/vn_malloc.h
$(BUILD_DIR)/vn_kv_list.$(OBJ): vn_kv_list.cpp include/vn_kv_list.h
$(BUILD_DIR)/vn_result.$(OBJ): vn_result.cpp include/vn_result.h
$(BUILD_DIR)/vn_asynch_result_internal.$(OBJ): vn_asynch_result_internal.cpp vn_asynch_result_internal.h
$(BUILD_DIR)/vn_asynch_result.$(OBJ): vn_asynch_result.cpp include/vn_asynch_result.h vn_asynch_result_internal.h
$(BUILD_DIR)/vn_client_curl.$(OBJ): vn_client_curl.cpp vn_client_curl.h
$(BUILD_DIR)/vn_client.$(OBJ): vn_client.cpp include/vn_client.h
$(BUILD_DIR)/vn_client_internal.$(OBJ): vn_client_internal.cpp vn_client_internal.h
$(BUILD_DIR)/resource.$(OBJ): resource.rc vn_version.h
$(BUILD_DIR)/jni/JMediaPlayer.$(OBJ): jni/JMediaPlayer.cpp jni/JMediaPlayer.h
$(BUILD_DIR)/jni/JMediaCapturer.$(OBJ): jni/JMediaCapturer.cpp jni/JMediaCapturer.h
$(BUILD_DIR)/vn_renderer.$(OBJ): vn_renderer.cpp include/vn_renderer.h
$(BUILD_DIR)/vn_renderer_d3d_impl.$(OBJ): vn_renderer_d3d_impl.cpp vn_renderer_d3d_impl.h
$(BUILD_DIR)/vn_renderer_null_impl.$(OBJ): vn_renderer_null_impl.cpp vn_renderer_null_impl.h
$(BUILD_DIR)/impl/renderer/Renderer.$(OBJ): impl/renderer/Renderer.cpp impl/renderer/Renderer.h impl/renderer/Renderer_Impl.h
$(BUILD_DIR)/impl/renderer/Renderer_Impl.$(OBJ): impl/renderer/Renderer_Impl.cpp impl/renderer/Renderer_Impl.h impl/renderer/win32/D3D9_Renderer_Impl.h impl/renderer/sdl2/SDL2_Renderer_Impl.h
$(BUILD_DIR)/impl/renderer/sdl2/SDL2_Renderer_Impl.$(OBJ): impl/renderer/sdl2/SDL2_Renderer_Impl.cpp impl/renderer/sdl2/SDL2_Renderer_Impl.h
$(BUILD_DIR)/impl/renderer/win32/D3D9_Renderer_Impl.$(OBJ): impl/renderer/win32/D3D9_Renderer_Impl.cpp impl/renderer/win32/D3D9_Renderer_Impl.h impl/renderer/Renderer_Impl.h impl/renderer/win32/D3D9_Overlay.h impl/renderer/win32/D3D9_Common.h
$(BUILD_DIR)/impl/renderer/win32/D3D9_Resource.$(OBJ): impl/renderer/win32/D3D9_Resource.rc impl/renderer/win32/D3D9_Resource.h impl/renderer/win32/shaders/pixel.fx impl/renderer/win32/shaders/vertex.fx
$(BUILD_DIR)/impl/renderer/win32/D3D9_Overlay.$(OBJ): impl/renderer/win32/D3D9_Overlay.cpp impl/renderer/win32/D3D9_Overlay.h impl/renderer/win32/D3D9_Common.h


clean:
	rm -rf $(BUILD_DIR)
