Beispiel #1
0
static int
create_signal_thread(pthread_t *id)
{
	int err;
	sigset_t oldmask;

	sigemptyset(&mask);
	sigaddset(&mask, SIGINT);
	sigaddset(&mask, SIGQUIT);

	err = pthread_sigmask(SIG_BLOCK, &mask, &oldmask);
	if (err != 0) {
		err_pthread_sigmask(errno);
		return err;
	}

	err = create_joinable_thread(id, signal_handler, 0);
	if (err < 0) {
		err_create_joinable_thread(errno);
		err_msg("error[create_signal_thread]: Unable to create signal thread.");
		return err;
	}

	return err;
}
Beispiel #2
0
int x11c_initialise(X11Common* x11Common, int reviewDuration, OnScreenDisplay* osd, X11WindowInfo* windowInfo)
{
    memset(x11Common, 0, sizeof(x11Common));

    x11Common->reviewDuration = reviewDuration;
    x11Common->osd = osd;

    x11Common->progressBarInput.data = x11Common;
    x11Common->progressBarInput.set_listener = x11c_set_pbar_listener;
    x11Common->progressBarInput.unset_listener = x11c_unset_pbar_listener;
    x11Common->progressBarInput.close = x11c_close_pbar;

    x11Common->keyboardInput.data = x11Common;
    x11Common->keyboardInput.set_listener = x11c_set_keyboard_listener;
    x11Common->keyboardInput.unset_listener = x11c_unset_keyboard_listener;
    x11Common->keyboardInput.close = x11c_close_keyboard;

    x11Common->mouseInput.data = x11Common;
    x11Common->mouseInput.set_listener = x11c_set_mouse_listener;
    x11Common->mouseInput.unset_listener = x11c_unset_mouse_listener;
    x11Common->mouseInput.close = x11c_close_mouse;

    if (windowInfo)
    {
        x11Common->windowInfo = *windowInfo;
    }

    CHK_ORET(XInitThreads() != 0);
    
    CHK_ORET(init_mutex(&x11Common->eventMutex));

    CHK_ORET(create_joinable_thread(&x11Common->processEventThreadId, process_event_thread, x11Common));

    return 1;
}
Beispiel #3
0
int hac_create_http_access(MediaPlayer* player, int port, HTTPAccess** access)
{
    HTTPAccess* newAccess;

    CALLOC_ORET(newAccess, HTTPAccess, 1);

    CHK_OFAIL(har_create_resources(&newAccess->resources));

    newAccess->control = ply_get_media_control(player);
    if (newAccess->control == NULL)
    {
        fprintf(stderr, "Media player has no control\n");
        goto fail;
    }

    newAccess->playerListener.data = newAccess;
    newAccess->playerListener.frame_displayed_event = hac_frame_displayed_event;
    newAccess->playerListener.frame_dropped_event = hac_frame_dropped_event;
    newAccess->playerListener.state_change_event = hac_state_change_event;
    newAccess->playerListener.end_of_source_event = hac_end_of_source_event;
    newAccess->playerListener.start_of_source_event = hac_start_of_source_event;
    newAccess->playerListener.player_closed = hac_player_closed;

    if (!ply_register_player_listener(player, &newAccess->playerListener))
    {
        fprintf(stderr, "Failed to register http access as player listener\n");
        goto fail;
    }

    CHK_OFAIL((newAccess->ctx = shttpd_init(NULL, "document_root", "/dev/null", NULL)) != NULL);
    shttpd_register_uri(newAccess->ctx, "/", &http_player_page, newAccess);
    shttpd_register_uri(newAccess->ctx, "/player.html", &http_player_page, newAccess);
    shttpd_register_uri(newAccess->ctx, "/index.html", &http_player_page, newAccess);
    shttpd_register_uri(newAccess->ctx, "/resources/*", &http_static_content, newAccess);
    shttpd_register_uri(newAccess->ctx, "/player/state.xml", &http_player_state_xml, newAccess);
    shttpd_register_uri(newAccess->ctx, "/player/state.txt", &http_player_state_txt, newAccess);
    shttpd_register_uri(newAccess->ctx, "/player/control/*", &http_player_control, newAccess);
    CHK_OFAIL(shttpd_listen(newAccess->ctx, port, 0));


    CHK_OFAIL(init_mutex(&newAccess->playerStateMutex));
    CHK_OFAIL(create_joinable_thread(&newAccess->httpThreadId, http_thread, newAccess));


    *access = newAccess;
    return 1;

fail:
    hac_free_http_access(&newAccess);
    return 0;
}
Beispiel #4
0
int
create_iwatch_thread(pthread_t *id, int fd, queue_t q)
{
	int err;
	struct watch_data_t *wdata;

	wdata = malloc(sizeof(struct watch_data_t));
	if (wdata == NULL) {
		err_malloc(errno);
		err_msg("error[create_iwatch_thread]: Unable to malloc watch data.\n");
		return -1;
	}

	wdata->fd = fd;
	wdata->q = q;

	err = create_joinable_thread(id, watch, wdata);
	if (err < 0)
		err_create_joinable_thread(errno);

	return err;
}
Beispiel #5
0
int create_dv_connect(MediaSink* sink, int sinkStreamId, int sourceStreamId,
    const StreamInfo* streamInfo, int numFFMPEGThreads, int useWorkerThread, StreamConnect** connect)
{
    DVDecodeStreamConnect* newConnect;
    StreamInfo decodedStreamInfo;
    int result;

    /* register stream with sink */
    if (streamInfo->format == DV25_YUV420_FORMAT)
    {
        decodedStreamInfo = *streamInfo;
        decodedStreamInfo.format = YUV420_FORMAT;

        result = msk_accept_stream(sink, &decodedStreamInfo);
    }
    else if (streamInfo->format == DV25_YUV411_FORMAT)
    {
        decodedStreamInfo = *streamInfo;
        decodedStreamInfo.format = YUV411_FORMAT;

        result = msk_accept_stream(sink, &decodedStreamInfo);
    }
    else /* streamInfo->format == DV50_FORMAT || streamInfo->format == DV100_FORMAT */
    {
        decodedStreamInfo = *streamInfo;
        decodedStreamInfo.format = YUV422_FORMAT;

        result = msk_accept_stream(sink, &decodedStreamInfo);
    }

    /* try UYVY if default format is not accepted */
    if (!result)
    {
        decodedStreamInfo = *streamInfo;
        decodedStreamInfo.format = UYVY_FORMAT;

        result = msk_accept_stream(sink, &decodedStreamInfo);
    }

    if (!result)
    {
        /* shouldn't be here because a call to dv_connect_accept() should've returned false already */
        ml_log_error("Failed to create DV connector because format is not accepted\n");
        return 0;
    }


    if (!msk_register_stream(sink, sinkStreamId, &decodedStreamInfo))
    {
        /* could have failed if max streams exceeded for example */
        return 0;
    }


    CALLOC_ORET(newConnect, DVDecodeStreamConnect, 1);

    newConnect->useWorkerThread = useWorkerThread;
    newConnect->decodedFormat = decodedStreamInfo.format;

    if (streamInfo->format == DV25_YUV420_FORMAT || streamInfo->format == DV25_YUV411_FORMAT)
    {
        newConnect->dvDataSize = (stream_is_pal_frame_rate(streamInfo) ? 144000 : 120000);
    }
    else if (streamInfo->format == DV50_FORMAT)
    {
        newConnect->dvDataSize = (stream_is_pal_frame_rate(streamInfo) ? 288000 : 240000);
    }
    else /* streamInfo->format == DV100_FORMAT */
    {
        newConnect->dvDataSize = 576000;
    }
    if ((newConnect->dvData = (unsigned char*)calloc(
        newConnect->dvDataSize + FF_INPUT_BUFFER_PADDING_SIZE /* FFMPEG for some reason needs the extra space */,
        sizeof(unsigned char))) == NULL)
    {
        ml_log_error("Failed to allocate memory\n");
        goto fail;
    }

    newConnect->sink = sink;
    newConnect->sourceStreamId = sourceStreamId;
    newConnect->sinkStreamId = sinkStreamId;
    newConnect->streamInfo = *streamInfo;
    if (decodedStreamInfo.format == UYVY_FORMAT)
    {
        newConnect->sinkBufferSize = streamInfo->width * streamInfo->height * 2;
    }
    else if (decodedStreamInfo.format == YUV422_FORMAT)
    {
        newConnect->sinkBufferSize = streamInfo->width * streamInfo->height * 2;
    }
    else /* YUV420 / YUV411 */
    {
        newConnect->sinkBufferSize = streamInfo->width * streamInfo->height * 3 / 2;
    }

    newConnect->streamConnect.data = newConnect;
    newConnect->streamConnect.get_source_listener = ddc_get_source_listener;
    newConnect->streamConnect.sync = ddc_sync;
    newConnect->streamConnect.close = ddc_close;

    newConnect->sourceListener.data = newConnect;
    newConnect->sourceListener.accept_frame = ddc_accept_frame;
    newConnect->sourceListener.allocate_buffer = ddc_allocate_buffer;
    newConnect->sourceListener.deallocate_buffer = ddc_deallocate_buffer;
    newConnect->sourceListener.receive_frame = ddc_receive_frame;
    newConnect->sourceListener.receive_frame_const = ddc_receive_frame_const;



    /* create DV decoder */

    CHK_OFAIL(init_dv_decoder_resources());

    CHK_OFAIL(create_dv_decoder(streamInfo->format, streamInfo->width, streamInfo->height,
        numFFMPEGThreads, &newConnect->decoder));


    /* create worker thread */

    if (useWorkerThread)
    {
        CHK_OFAIL(init_mutex(&newConnect->workerMutex));
        CHK_OFAIL(init_cond_var(&newConnect->frameIsReadyCond));
        CHK_OFAIL(init_cond_var(&newConnect->workerIsBusyCond));

        CHK_OFAIL(create_joinable_thread(&newConnect->workerThreadId, worker_thread, newConnect));
    }


    *connect = &newConnect->streamConnect;
    return 1;

fail:
    ddc_close(newConnect);
    return 0;
}
Beispiel #6
0
int main(int argc, char **argv)
{
	int c, help, version, recursive, err, i;
	struct galaxy_t galaxy;
	struct galaxy_event_t *gevent;

	help = version = recursive = err = 0;
	while ((c = getopt(argc, argv, "hp:rv")) != -1) {
		switch (c) {
			case 'h':
				usage(stdout);
				exit(0);
				break;
			case 'p':
				break;
			case 'r':
				recursive = 1;
				break;
			case 'v':
				version = 1;
				break;
			case '?':
				err = 1;
				break;
		}
	}

	/* Check if any invalid parameters were passed into this program. */
	if (err) {
		usage(stderr);
		exit(1);
	}

	/* Iterate over all remaining lone arguments. Each argument is assumed
	 * to be a directory that needs to be added as a top-level galaxy
	 * watch. */

	printf("argc = %d\n", argc);
	if (argc <= 1) {
		err_msg("Usage: %s <Regular expression to match file with>", argv[0]);
		exit(-1);
	}

	err = galaxy_connect(&galaxy);
	if (err < 0) {
		err_msg("error: Unable to connect to server.");
		err_msg("err = %d", err);
		return 1;
	}

	/* galaxy_watch (galaxy_t, regexp to match, Inotify mask) */
	//galaxy_ignore_mask(&galaxy, IN_OPEN);
/*
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/proc");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/sys");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/media");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/tmp");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/root");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/home");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/mnt");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/dev");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/var");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/usr/src");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/usr/tmp");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/usr/var");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/usr/misc");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/sources");
	galaxy_ignore_watch(&galaxy, IN_ALL_EVENTS, "^/tools");
*/
	galaxy_watch(&galaxy, IN_CREATE | IN_DELETE | IN_MODIFY, argv[1]);
	galaxy_watch(&galaxy, IN_ALL_EVENTS, ".*");
	//galaxy_ignore_watch(&galaxy, IN_CLOSE, argv[1]);

	create_signal_thread(&signal_thread);

	//err = pthread_create(&galaxy_reciever, NULL, receive_notifications, &galaxy);
	err = create_joinable_thread(&galaxy_reciever, receive_notifications, &galaxy);
	if (err < 0) {
		err_create_joinable_thread(errno);
		err_msg("error: Unable to create thread.");
		galaxy_close(&galaxy);
		return 1;
	}

	pthread_join(galaxy_reciever, NULL);
	pthread_join(signal_thread, NULL);

	galaxy_close(&galaxy);

	return 0;
}