From 6d1af10e3947faceab6011e15fc6fcf2d0cd5a0f Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Mon, 22 Apr 2013 14:22:36 +0200 Subject: [PATCH] Miscellaneous fixes, mainly modules --- Makefile.in | 7 +++-- configure.ac | 12 ++++---- src/debug.h | 8 +++++ src/gl_context.h | 2 +- src/host.c | 45 +++++++++++++++++++---------- src/rtp/decoders.c | 2 ++ src/utils/worker.cpp | 2 +- src/video.c | 2 +- src/video.h | 2 ++ src/video_capture.c | 20 +++++++------ src/video_capture/deltacast_dvi.cpp | 11 ++----- src/video_capture/swmix.cpp | 18 ++++++++---- src/video_decompress.c | 2 +- src/video_display.c | 9 +++++- 14 files changed, 90 insertions(+), 52 deletions(-) diff --git a/Makefile.in b/Makefile.in index 93eb68702..124e1cba3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -10,7 +10,7 @@ CXXFLAGS = -g @DEFS@ @CXXFLAGS@ -DPATH_PREFIX=@prefix@ -DLIB_DIR=@libdir@ - NVCCFLAGS = @NVCCFLAGS@ LDFLAGS = @LDFLAGS@ LIBS += @LIBS@ @JACK_TRANS_LIB@ @MATHLIBS@ @COREAUDIO_LIB@ \ - @X_PRE_LIBS@ @X_LIBS@ @X_EXTRA_LIBS@ -lm -pthread + -lm -pthread INC = -I. -Isrc -Itest @DVS_INC@ @DELTACAST_INC@ @FASTDXT_INC@ @QUICKTIME_INC@ @DECKLINK_INC@ @PORTAUDIO_INC@ \ @GL_INC@ @SAGE_INC@ @LINSYS_INC@ @JACK_TRANS_INC@ @JPEG_INC@ @COREAUDIO_INC@ @SPEEX_INC@ \ @BLUEFISH444_INC@ @NCURSES_CFLAGS@ @@ -128,6 +128,7 @@ LIB_COMMON = \ src/tv.o \ src/utils/fs_lock.o \ src/utils/ring_buffer.o \ + src/utils/worker.o \ src/video.o \ src/video_codec.o \ @@ -494,7 +495,7 @@ libavcodec: @LIBAVCODEC_DECOMPRESS_LIB_TARGET@ @LIBAVCODEC_COMPRESS_LIB_TARGET@ mkdir -p lib/ultragrid $(LINKER) $(LDFLAGS) -shared -Wl,-soname,vidcap_testcard.so.@video_capture_abi_version@ $^ @TESTCARD_LIB@ -o $@ -@SWMIX_LIB_TARGET@: @GL_COMMON_OBJ@ @SWMIX_OBJ@ src/host.o +@SWMIX_LIB_TARGET@: @GL_COMMON_OBJ@ @SWMIX_OBJ@ @X_OBJ@ src/host.o mkdir -p lib/ultragrid $(LINKER) $(LDFLAGS) -shared -Wl,-soname,vidcap_swmix.so.@video_capture_abi_version@ $^ @SWMIX_LIB@ -o $@ @@ -538,7 +539,7 @@ libavcodec: @LIBAVCODEC_DECOMPRESS_LIB_TARGET@ @LIBAVCODEC_COMPRESS_LIB_TARGET@ mkdir -p lib/ultragrid $(LINKER) $(LDFLAGS) -shared -Wl,-soname,display_dvs.so.@video_display_abi_version@ $^ @DVS_LIB@ -o $@ -@SCREEN_CAP_LIB_TARGET@: @SCREEN_CAP_OBJ@ +@SCREEN_CAP_LIB_TARGET@: @SCREEN_CAP_OBJ@ @X_OBJ@ mkdir -p lib/ultragrid $(LINKER) $(LDFLAGS) -shared -Wl,-soname,vidcap_screen.so.@video_capture_abi_version@ $^ @SCREEN_CAP_LIB@ -o $@ diff --git a/configure.ac b/configure.ac index 52ffbdfae..51087d6ce 100644 --- a/configure.ac +++ b/configure.ac @@ -1169,7 +1169,7 @@ case "$host_os" in ) if test $sdl_req != no -a "$FOUND_SDL_L" = yes then - SDL_LIBS="-lSDL" + SDL_LIBS="-lSDL $X_LIBS" SDL_OBJ="$SDL_OBJ src/video_display/sdl.o" AC_DEFINE([HAVE_SDL], [1], [Build with SDL support]) SDL_VERSION=1.2.10 @@ -1221,7 +1221,7 @@ then LIBS=$SAVED_LIBS if test "$ac_cv_lib_SDL_mixer_Mix_PlayMusic" = yes then - TESTCARD_LIB="-lSDL -lSDL_mixer" + TESTCARD_LIB="-lSDL -lSDL_mixer $X11_LIB" fi TESTCARD2_OBJ= @@ -1501,7 +1501,7 @@ AC_ARG_ENABLE(swmix, if test $swmix_req != no -a $OPENGL = yes then swmix=yes - SWMIX_LIB="$OPENGL_LIB" + SWMIX_LIB="$OPENGL_LIB $X11_LIB" SWMIX_OBJ="$SWMIX_OBJ src/video_capture/swmix.o" AC_SUBST(SWMIX_LIB_TARGET, "lib/ultragrid/vidcap_swmix.so.$video_capture_abi_version") LIB_TARGETS="$LIB_TARGETS $SWMIX_LIB_TARGET" @@ -1682,7 +1682,7 @@ AC_DEFINE([USE_PBO_DXT_ENCODER], [1], [We want to use OpenGL pixel buffer object if test $rtdxt_req != no -a $OPENGL = yes then rtdxt=yes - RTDXT_LIB="$OPENGL_LIB" + RTDXT_LIB="$OPENGL_LIB $X_LIBS" AC_DEFINE([HAVE_DXT_GLSL], [1], [Build with DXT_GLSL support]) RTDXT_COMMON_OBJ="$RTDXT_COMMON_OBJ dxt_compress/dxt_util.o" RTDXT_COMMON_HEADERS="$RTDXT_COMMON_HEADERS dxt_compress/dxt_glsl.h" @@ -1725,7 +1725,7 @@ SAVED_LIBS=$LIBS if test $uyvy_req != no -a "$ac_cv_lib_X11_XCreateWindow" = yes -a $FOUND_GLEW = yes -a "$FOUND_GLX_L" = yes -a "$FOUND_GLX_H" = yes \ -a "$FOUND_GL_H" = yes -a "$system" = Linux then - UYVY_LIB=" -lGLEW -lGL -lX11" + UYVY_LIB=" -lGLEW -lGL -lX11 $X_LIBS" uyvy=yes fi @@ -2261,7 +2261,7 @@ AC_ARG_ENABLE(scale, if test $scale_req != no -a $OPENGL = yes then scale=yes - SCALE_LIB="$SCALE_LIB $OPENGL_LIB" + SCALE_LIB="$SCALE_LIB $OPENGL_LIB $X11_LIB" SCALE_OBJ="$SCALE_OBJ src/vo_postprocess/scale.o" AC_SUBST(SCALE_LIB_TARGET, "lib/ultragrid/vo_pp_scale.so.$vo_pp_abi_version") LIB_TARGETS="$LIB_TARGETS $SCALE_LIB_TARGET" diff --git a/src/debug.h b/src/debug.h index 2fdc1821f..b8469d0d1 100644 --- a/src/debug.h +++ b/src/debug.h @@ -44,8 +44,16 @@ #define debug_msg _dprintf("[pid/%d +%d %s] ", getpid(), __LINE__, __FILE__), _dprintf #define error_msg _errprintf("[pid/%d +%d %s] ", getpid(), __LINE__, __FILE__), _errprintf +#ifdef __cplusplus +extern "C" { +#endif + void _errprintf(const char *format, ...); void _dprintf(const char *format, ...); void debug_dump(void*lp, int len); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/gl_context.h b/src/gl_context.h index 4514ef4be..85d637abf 100644 --- a/src/gl_context.h +++ b/src/gl_context.h @@ -41,7 +41,7 @@ struct gl_context { bool init_gl_context(struct gl_context *context, int which); void gl_context_make_current(struct gl_context *context); void destroy_gl_context(struct gl_context *context); -static void gl_check_error(); +static void gl_check_error() __attribute__((unused)); static void gl_check_error() { diff --git a/src/host.c b/src/host.c index 402f572a4..e1ce5fd3d 100644 --- a/src/host.c +++ b/src/host.c @@ -34,6 +34,19 @@ char **uv_argv; char *export_dir = NULL; char *sage_network_device = NULL; +extern void (*vidcap_free_devices_extrn)(); +extern display_type_t *(*display_get_device_details_extrn)(int i); +extern struct vidcap_type *(*vidcap_get_device_details_extrn)(int i); +extern void (*display_free_devices_extrn)(void); +extern vidcap_id_t (*vidcap_get_null_device_id_extrn)(); +extern display_id_t (*display_get_null_device_id_extrn)(); +extern void (*decoder_destroy_extrn)(struct state_decoder *decoder); +extern struct vidcap *(*vidcap_init_extrn)(vidcap_id_t id, char *fmt, unsigned int flags); +extern struct display *(*display_init_extrn)(display_id_t id, char *fmt, unsigned int flags); +extern int (*vidcap_get_device_count_extrn)(void); +extern int (*display_get_device_count_extrn)(void); +extern int (*vidcap_init_devices_extrn)(void); +extern int (*display_init_devices_extrn)(void); struct vidcap *initialize_video_capture(const char *requested_capture, char *fmt, unsigned int flags) @@ -43,30 +56,30 @@ struct vidcap *initialize_video_capture(const char *requested_capture, int i; if(!strcmp(requested_capture, "none")) - id = vidcap_get_null_device_id(); + id = vidcap_get_null_device_id_extrn(); pthread_mutex_t *vidcap_lock = rm_acquire_shared_lock("VIDCAP_LOCK"); pthread_mutex_lock(vidcap_lock); - vidcap_init_devices(); - for (i = 0; i < vidcap_get_device_count(); i++) { - vt = vidcap_get_device_details(i); + vidcap_init_devices_extrn(); + for (i = 0; i < vidcap_get_device_count_extrn(); i++) { + vt = vidcap_get_device_details_extrn(i); if (strcmp(vt->name, requested_capture) == 0) { id = vt->id; break; } } - if(i == vidcap_get_device_count()) { + if(i == vidcap_get_device_count_extrn()) { fprintf(stderr, "WARNING: Selected '%s' capture card " "was not found.\n", requested_capture); return NULL; } - vidcap_free_devices(); + vidcap_free_devices_extrn(); pthread_mutex_unlock(vidcap_lock); rm_release_shared_lock("VIDCAP_LOCK"); - return vidcap_init(id, fmt, flags); + return vidcap_init_extrn(id, fmt, flags); } struct display *initialize_video_display(const char *requested_display, @@ -78,17 +91,17 @@ struct display *initialize_video_display(const char *requested_display, int i; if(!strcmp(requested_display, "none")) - id = display_get_null_device_id(); + id = display_get_null_device_id_extrn(); - if (display_init_devices() != 0) { + if (display_init_devices_extrn() != 0) { printf("Unable to initialise devices\n"); abort(); } else { debug_msg("Found %d display devices\n", - display_get_device_count()); + display_get_device_count_extrn()); } - for (i = 0; i < display_get_device_count(); i++) { - dt = display_get_device_details(i); + for (i = 0; i < display_get_device_count_extrn(); i++) { + dt = display_get_device_details_extrn(i); if (strcmp(requested_display, dt->name) == 0) { id = dt->id; debug_msg("Found device\n"); @@ -98,14 +111,14 @@ struct display *initialize_video_display(const char *requested_display, requested_display); } } - if(i == display_get_device_count()) { + if(i == display_get_device_count_extrn()) { fprintf(stderr, "WARNING: Selected '%s' display card " "was not found.\n", requested_display); return NULL; } - display_free_devices(); + display_free_devices_extrn(); - d = display_init(id, fmt, flags); + d = display_init_extrn(id, fmt, flags); return d; } @@ -114,7 +127,7 @@ void destroy_decoder(struct vcodec_state *video_decoder_state) { return; } - decoder_destroy(video_decoder_state->decoder); + decoder_destroy_extrn(video_decoder_state->decoder); free(video_decoder_state); } diff --git a/src/rtp/decoders.c b/src/rtp/decoders.c index e547c9e2c..3997bd07d 100644 --- a/src/rtp/decoders.c +++ b/src/rtp/decoders.c @@ -59,6 +59,8 @@ #include "video_display.h" #include "vo_postprocess.h" +void (*decoder_destroy_extrn)(struct state_decoder *decoder) = decoder_destroy; + struct state_decoder; static struct video_frame * reconfigure_decoder(struct state_decoder * const decoder, struct video_desc desc, diff --git a/src/utils/worker.cpp b/src/utils/worker.cpp index b43cdeb76..f6e0ea4ba 100644 --- a/src/utils/worker.cpp +++ b/src/utils/worker.cpp @@ -224,7 +224,7 @@ void *worker_pool::wait_task(task_result_handle_t handle) return w->pop(); } -class worker_pool instance; +static class worker_pool instance; task_result_handle_t task_run_async(task_t task, void *data) { diff --git a/src/video.c b/src/video.c index 6a9689cbe..4a11eda23 100644 --- a/src/video.c +++ b/src/video.c @@ -159,7 +159,7 @@ void vf_write_desc(struct video_frame *buf, struct video_desc desc) buf->color_spec = desc.color_spec; buf->fps = desc.fps; buf->interlacing = desc.interlacing; - for(int i = 0; i < buf->tile_count; ++i) { + for(unsigned int i = 0; i < buf->tile_count; ++i) { buf->tiles[0].width = desc.width; buf->tiles[0].height = desc.height; } diff --git a/src/video.h b/src/video.h index c94cb9dd3..cf85bc73e 100644 --- a/src/video.h +++ b/src/video.h @@ -150,6 +150,8 @@ struct tile { unsigned int offset; // Offset of the fragment (bytes) }; +struct tile * tile_alloc(void); + struct video_frame * vf_alloc(int count); /** * Allocates video frame accordig given desc diff --git a/src/video_capture.c b/src/video_capture.c index fdb210a65..78a79c8d1 100644 --- a/src/video_capture.c +++ b/src/video_capture.c @@ -53,6 +53,7 @@ #include "config_unix.h" #include "config_win32.h" #include "debug.h" +#include "lib_common.h" #include "video_codec.h" #include "video_capture.h" #include "video_capture/DirectShowGrabber.h" @@ -74,14 +75,15 @@ #define VIDCAP_MAGIC 0x76ae98f0 -#ifdef BUILD_LIBRARIES -#include -#define MK_NAME(A) NULL, #A -#else -#define MK_NAME(A) A, NULL -#endif /* BUILD_LIBRARIES */ - -#define MK_STATIC(A) A, NULL +void (*vidcap_free_devices_extrn)() = vidcap_free_devices; +void (*vidcap_finish_extrn)(struct vidcap *) = vidcap_finish; +void (*vidcap_done_extrn)(struct vidcap *) = vidcap_done; +vidcap_id_t (*vidcap_get_null_device_id_extrn)(void) = vidcap_get_null_device_id; +struct vidcap_type *(*vidcap_get_device_details_extrn)(int index) = vidcap_get_device_details; +struct vidcap *(*vidcap_init_extrn)(vidcap_id_t id, char *fmt, unsigned int flags) = vidcap_init; +struct video_frame *(*vidcap_grab_extrn)(struct vidcap *state, struct audio_frame **audio) = vidcap_grab; +int (*vidcap_get_device_count_extrn)(void) = vidcap_get_device_count; +int (*vidcap_init_devices_extrn)(void) = vidcap_init_devices; struct vidcap { void *state; @@ -222,7 +224,7 @@ struct vidcap_device_api vidcap_device_table[] = { }, { 0, - "deltacast-dvi", + "deltacast", MK_NAME(vidcap_deltacast_dvi_probe), MK_NAME(vidcap_deltacast_dvi_init), MK_NAME(vidcap_deltacast_dvi_finish), diff --git a/src/video_capture/deltacast_dvi.cpp b/src/video_capture/deltacast_dvi.cpp index 8771f2f19..3c31b255a 100644 --- a/src/video_capture/deltacast_dvi.cpp +++ b/src/video_capture/deltacast_dvi.cpp @@ -254,11 +254,6 @@ vidcap_deltacast_dvi_probe(void) return vt; } -static bool set_format_eedid(HANDLE BoardHandle, HANDLE StreamHandle, - ULONG &Width, ULONG &Height, ULONG &RefreshRate) { - -} - static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool have_preset, VHD_DVI_MODE DviMode, ULONG Width, ULONG Height, ULONG RefreshRate) @@ -519,13 +514,13 @@ vidcap_deltacast_dvi_init(char *init_fmt, unsigned int flags) have_preset = true; char *ptr = tok + strlen("preset="); char *save_ptr, *item; - if(item = strtok_r(ptr, "x@", &save_ptr)) { + if((item = strtok_r(ptr, "x@", &save_ptr))) { Width = atoi(item); } - if(item = strtok_r(NULL, "x@", &save_ptr)) { + if((item = strtok_r(NULL, "x@", &save_ptr))) { Height = atoi(item); } - if(item = strtok_r(NULL, "x@", &save_ptr)) { + if((item = strtok_r(NULL, "x@", &save_ptr))) { RefreshRate = atof(item); } } else { diff --git a/src/video_capture/swmix.cpp b/src/video_capture/swmix.cpp index 6537beb77..b47e77e82 100644 --- a/src/video_capture/swmix.cpp +++ b/src/video_capture/swmix.cpp @@ -69,6 +69,10 @@ typedef enum { BILINEAR } interpolation_t; +extern void (*vidcap_finish_extrn)(struct vidcap*); +extern void (*vidcap_done_extrn)(struct vidcap*); +extern struct video_frame *(*vidcap_grab_extrn)(struct vidcap *state, struct audio_frame **audio); + /* * Bicubic interpolation taken from: * http://www.codeproject.com/Articles/236394/Bi-Cubic-and-Bi-Linear-Interpolation-with-GLSL @@ -176,13 +180,14 @@ static bool get_device_config_from_file(FILE* config_file, char *slave_name, static char *get_config_name() { + const char *rc_suffix = "/.ug-swmix.rc"; static char buf[PATH_MAX]; if(!getenv("HOME")) { return NULL; } - strncpy(buf, getenv("HOME"), sizeof(buf)); - strncat(buf, "/.ug-swmix.rc", sizeof(buf)); + strncpy(buf, getenv("HOME"), sizeof(buf) - 1); + strncat(buf, rc_suffix, sizeof(buf) - 1); return buf; } @@ -548,6 +553,9 @@ static void *master_worker(void *arg) case RGBA: format = GL_RGBA; break; + default: + error_msg("Unexpected color space!"); + abort(); } glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, @@ -693,7 +701,7 @@ static void *slave_worker(void *arg) struct video_frame *frame; struct audio_frame *unused_af; - frame = vidcap_grab(device, &unused_af); + frame = vidcap_grab_extrn(device, &unused_af); if(frame) { struct video_frame *frame_copy = vf_get_copy(frame); pthread_mutex_lock(&s->lock); @@ -705,8 +713,8 @@ static void *slave_worker(void *arg) } } - vidcap_finish(device); - vidcap_done(device); + vidcap_finish_extrn(device); + vidcap_done_extrn(device); return NULL; } diff --git a/src/video_decompress.c b/src/video_decompress.c index 1c2c8cf28..57019f02e 100644 --- a/src/video_decompress.c +++ b/src/video_decompress.c @@ -161,7 +161,7 @@ decoder_table_t decoders[] = { MK_NAME(libavcodec_decompress_done), NULL}, #endif -#if defined HAVE_TRANSCODE || defined BUILD_LIBRARIES +#if defined HAVE_TRANSCODE && ! defined BUILD_LIBRARIES { TRANSCODE_MAGIC, "transcode", MK_STATIC(transcode_decompress_init), MK_STATIC(transcode_decompress_reconfigure), MK_STATIC(transcode_decompress), MK_STATIC(transcode_decompress_get_property), MK_STATIC(transcode_decompress_done), NULL}, diff --git a/src/video_display.c b/src/video_display.c index 71d01f6b1..4ede1b563 100644 --- a/src/video_display.c +++ b/src/video_display.c @@ -70,6 +70,13 @@ #include +display_type_t *(*display_get_device_details_extrn)(int index) = display_get_device_details; +void (*display_free_devices_extrn)(void) = display_free_devices; +display_id_t (*display_get_null_device_id_extrn)(void) = display_get_null_device_id; +struct display *(*display_init_extrn)(display_id_t id, char *fmt, unsigned int flags) = display_init; +int (*display_get_device_count_extrn)(void) = display_get_device_count; +int (*display_init_devices_extrn)(void) = display_init_devices; + /* * Interface to probing the valid display types. * @@ -330,7 +337,7 @@ static int display_fill_symbols(display_table_t *device) dlsym(handle, device->func_finish_str); device->func_getf = (struct video_frame *(*) (void *)) dlsym(handle, device->func_getf_str); - device->func_putf = (int (*) (void *, char *)) + device->func_putf = (int (*) (void *, struct video_frame *)) dlsym(handle, device->func_putf_str); device->func_reconfigure = (int (*)(void *, struct video_desc)) dlsym(handle, device->func_reconfigure_str);