[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xine-user
Subject:    [xine-user] DVB streams
From:       Egor Shibeko <egor.shibeko () gmail ! com>
Date:       2008-07-16 9:06:13
Message-ID: 20080716120613.18c5bfc0.egor.shibeko () gmail ! com
[Download RAW message or body]

Hello,

The task is to check if the DVB TS is OK. The streams are sent by getstream. I used \
the sources as in the attached files, but sometimes it failed to get elementary \
streams (usually, either audio or video stream), i.e. xine_get_stream_info returned 1 \
for XINE_STREAM_INFO_HAS_AUDIO, but returned 0 for XINE_STREAM_INFO_AUDIO_CHANNELS \
even if I tried with long timeout. Then I checked it in some seconds and it was OK.

What it could be connected with?

Thank You.
-- 
Egor Shibeko <egor.shibeko@gmail.com>


["xine_checker.c" (text/x-csrc)]

#include "xine_checker.h"
#include "log.h"

#include <stdio.h>

enum { stream_state_unknown = 0, stream_state_finished, stream_state_ok };

struct stream_context
{
	struct xine_checker *checker;
	const char *uri;
	#if 0
	xine_stream_t *st;
	#endif
	int state;
};

static inline struct log *xine_checker_log(const struct xine_checker *checker)
{
	return (struct log *)checker->log;
}

static inline struct log *stream_context_log(const struct stream_context *ctx)
{
	return xine_checker_log(ctx->checker);
}

static inline int stream_context_init(struct stream_context *ctx, struct xine_checker \
*checker, const char *uri) {
	ctx->checker = checker;
	ctx->uri = uri;

	#if 0
	ctx->st = xine_stream_new(checker->xine, checker->ao, checker->vo);
	if (ctx->st == NULL)
	{
		log_error(xine_checker_log(checker), "failed to create xine stream object, error \
code %d", xine_get_error(NULL));  return 0;
	}
	#endif

	ctx->state = stream_state_unknown;

	return 1;
}

static inline void stream_context_deinit(struct stream_context *ctx)
{
	#if 0
	xine_dispose(ctx->st);
	#endif
}

static inline xine_stream_t *stream_context_get_stream(struct stream_context *ctx)
{
	return ctx->checker->st;
}

static void xine_event_cb(void *user_data, const xine_event_t *event)
{
	struct stream_context *ctx = user_data;
	uint32_t has_audio, audio_flag;
	uint32_t has_video, video_flag;

	switch (event->type)
	{
	case XINE_EVENT_UI_PLAYBACK_FINISHED:
		if (ctx->state == stream_state_unknown)
			ctx->state = stream_state_finished;
		break;
	case XINE_EVENT_UI_CHANNELS_CHANGED:
		has_audio = xine_get_stream_info(stream_context_get_stream(ctx), \
XINE_STREAM_INFO_HAS_AUDIO);  audio_flag = \
xine_get_stream_info(stream_context_get_stream(ctx), \
XINE_STREAM_INFO_AUDIO_CHANNELS);

		has_video = xine_get_stream_info(stream_context_get_stream(ctx), \
XINE_STREAM_INFO_HAS_VIDEO);  video_flag = \
xine_get_stream_info(stream_context_get_stream(ctx), XINE_STREAM_INFO_VIDEO_RATIO);

		log_xtreme(xine_checker_log(ctx->checker), "%s: %u/%u, %u/%u", ctx->uri,
			has_audio, audio_flag, has_video, video_flag);
		if ((!has_audio || audio_flag != 0) && (!has_video || video_flag != 0))
			ctx->state = stream_state_ok;
		break;
	}
}

static inline int stream_context_check(struct stream_context *ctx, double timeout)
{
	xine_event_queue_t *queue;
	time_t start_time;

	ctx->state = stream_state_unknown;

	queue = xine_event_new_queue(stream_context_get_stream(ctx));
	if (queue != NULL)
	{
		xine_event_create_listener_thread(queue, xine_event_cb, ctx);

		if (!xine_open(stream_context_get_stream(ctx), ctx->uri))
			log_error(stream_context_log(ctx), "failed to open uri %s, error code %d",
				ctx->uri, xine_get_error(stream_context_get_stream(ctx)));
		else
		{
			if (!xine_play(stream_context_get_stream(ctx), 0, 0))
				log_error(stream_context_log(ctx), "failed to play uri %s, error code %d",
					ctx->uri, xine_get_error(stream_context_get_stream(ctx)));
			else
			{
				log_xtreme(stream_context_log(ctx), "%s: check timeout %.2lf", ctx->uri, \
timeout);  start_time = time(NULL);
				while (ctx->state == stream_state_unknown && difftime(time(NULL), start_time) < \
timeout)  usleep(100);
				log_xtreme(stream_context_log(ctx), "%s: check result %d", ctx->uri, ctx->state);
			}
			xine_close(stream_context_get_stream(ctx));
		}

		xine_event_dispose_queue(queue);
	}

	return ctx->state == stream_state_ok;
}

int xine_checker_init(struct xine_checker *checker, struct log *log)
{
	checker->log = log;

	checker->xine = xine_new();
	if (checker->xine == NULL)
		log_error(log, "failed to create xine object");
	else
	{
		xine_init(checker->xine);
		checker->ao = xine_open_audio_driver(checker->xine, "none", NULL);
		if (checker->ao == NULL)
			log_error(log, "failed to create audio driver object");
		else
		{
			checker->vo = xine_open_video_driver(checker->xine, "none", XINE_VISUAL_TYPE_NONE, \
NULL);  if (checker->vo == NULL)
				log_error(log, "failed to create video driver object");
			else
			{
				checker->st = xine_stream_new(checker->xine, checker->ao, checker->vo);
				if (checker->st != NULL)
					return 1;
				log_error(log, "failed to create xine stream object, error code %d", \
xine_get_error(NULL));  xine_close_video_driver(checker->xine, checker->vo);
			}
			xine_close_audio_driver(checker->xine, checker->ao);
		}
		xine_exit(checker->xine);
	}

	return 0;
}

void xine_checker_deinit(struct xine_checker *checker)
{
	xine_dispose(checker->st);
	xine_close_video_driver(checker->xine, checker->vo);
	xine_close_audio_driver(checker->xine, checker->ao);
	xine_exit(checker->xine);
}

int xine_checker_check_uri(struct xine_checker *checker, const char *uri, double \
timeout) {
	struct stream_context ctx;
	int result = 0;

	if (timeout <= 0.0)
	{
		log_error(xine_checker_log(checker), "failed to check uri %s: invalid timeout \
%.2lf", uri, timeout);  return 0;
	}

	if (stream_context_init(&ctx, checker, uri))
	{
		result = stream_context_check(&ctx, timeout);
		stream_context_deinit(&ctx);
	}

	return result;
}


["xine_checker.h" (text/x-chdr)]

#ifndef _XINE_CHECKER_H_
#define _XINE_CHECKER_H_

#include <xine.h>

struct log;

struct xine_checker
{
	struct log *log;

	xine_t *xine;
	xine_audio_port_t *ao;
	xine_video_port_t *vo;
	xine_stream_t *st;
};

int xine_checker_init(struct xine_checker *checker, struct log *log);
void xine_checker_deinit(struct xine_checker *checker);

int xine_checker_check_uri(struct xine_checker *checker, const char *uri, double timeout);

#endif


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/

_______________________________________________
xine-user mailing list
xine-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xine-user


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic