vrplayer: work on removing server side timing
This commit is contained in:
parent
2570319869
commit
f5e9bc3308
@ -13,6 +13,7 @@ Decoder::Decoder(QObject *parent) :
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int Decoder::init(QString filename)
|
int Decoder::init(QString filename)
|
||||||
{
|
{
|
||||||
|
printf("Decoder::init\n");
|
||||||
if (channel)
|
if (channel)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
|
||||||
|
|
||||||
|
// not used
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "decoderthread.h"
|
#include "decoderthread.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -155,7 +175,6 @@ void DecoderThread::audioTimerCallback()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("audio2\n");
|
|
||||||
pkt = audioQueue.dequeue();
|
pkt = audioQueue.dequeue();
|
||||||
delayInMs = (int) ((float) pkt->delay_in_us / 1000.0);
|
delayInMs = (int) ((float) pkt->delay_in_us / 1000.0);
|
||||||
send_audio_pkt(channel, 101, pkt->av_pkt);
|
send_audio_pkt(channel, 101, pkt->av_pkt);
|
||||||
@ -179,7 +198,7 @@ void DecoderThread::videoTimerCallback()
|
|||||||
}
|
}
|
||||||
|
|
||||||
pkt = videoQueue.dequeue();
|
pkt = videoQueue.dequeue();
|
||||||
delayInMs = (int) ((float) pkt->delay_in_us / 1000.0);
|
delayInMs = (int) 10; // ((float) pkt->delay_in_us / 1000.0);
|
||||||
send_video_pkt(channel, 101, pkt->av_pkt);
|
send_video_pkt(channel, 101, pkt->av_pkt);
|
||||||
delete pkt;
|
delete pkt;
|
||||||
updateSlider();
|
updateSlider();
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
#include "ourinterface.h"
|
#include "ourinterface.h"
|
||||||
|
|
||||||
OurInterface::OurInterface(QObject *parent) :
|
OurInterface::OurInterface(QObject *parent) :
|
||||||
@ -84,6 +85,7 @@ int OurInterface::openVirtualChannel()
|
|||||||
if (channel)
|
if (channel)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
printf("OurInterface::openVirtualChannel:\n");
|
||||||
/* open a virtual channel and connect to remote client */
|
/* open a virtual channel and connect to remote client */
|
||||||
channel = WTSVirtualChannelOpenEx(WTS_CURRENT_SESSION, "xrdpvr", 0);
|
channel = WTSVirtualChannelOpenEx(WTS_CURRENT_SESSION, "xrdpvr", 0);
|
||||||
if (channel == NULL)
|
if (channel == NULL)
|
||||||
@ -116,13 +118,20 @@ int OurInterface::closeVirtualChannel()
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int OurInterface::sendMetadataFile()
|
int OurInterface::sendMetadataFile()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (xrdpvr_init_player(channel, 101, filename.toAscii().data()))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "failed to initialize the player\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
if (xrdpvr_create_metadata_file(channel, filename.toAscii().data()))
|
if (xrdpvr_create_metadata_file(channel, filename.toAscii().data()))
|
||||||
{
|
{
|
||||||
emit on_ErrorMsg("I/O Error",
|
emit on_ErrorMsg("I/O Error",
|
||||||
"An error occurred while sending data to remote client");
|
"An error occurred while sending data to remote client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,15 +80,18 @@ void PlayVideo::play()
|
|||||||
|
|
||||||
label1:
|
label1:
|
||||||
|
|
||||||
|
printf("video\n");
|
||||||
if (videoQueue->isEmpty())
|
if (videoQueue->isEmpty())
|
||||||
{
|
{
|
||||||
|
printf("---empty\n");
|
||||||
|
usleep(1000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pkt = videoQueue->dequeue();
|
pkt = videoQueue->dequeue();
|
||||||
sendMutex->lock();
|
sendMutex->lock();
|
||||||
send_video_pkt(channel, stream_id, pkt->av_pkt);
|
send_video_pkt(channel, stream_id, pkt->av_pkt);
|
||||||
sendMutex->unlock();
|
sendMutex->unlock();
|
||||||
usl = pkt->delay_in_us;
|
usl = 1000; // pkt->delay_in_us;
|
||||||
if (usl < 0)
|
if (usl < 0)
|
||||||
{
|
{
|
||||||
usl = 0;
|
usl = 0;
|
||||||
|
138
xrdpvr/xrdpvr.c
138
xrdpvr/xrdpvr.c
@ -83,11 +83,14 @@ void hexdump(char *p, int len)
|
|||||||
int
|
int
|
||||||
xrdpvr_init_player(void *channel, int stream_id, char *filename)
|
xrdpvr_init_player(void *channel, int stream_id, char *filename)
|
||||||
{
|
{
|
||||||
|
printf("xrdpvr_init_player:\n");
|
||||||
if ((channel == NULL) || (stream_id <= 0) || (filename == NULL))
|
if ((channel == NULL) || (stream_id <= 0) || (filename == NULL))
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xrdpvr_send_init(channel);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* send metadata from media file to client */
|
/* send metadata from media file to client */
|
||||||
if (xrdpvr_create_metadata_file(channel, filename))
|
if (xrdpvr_create_metadata_file(channel, filename))
|
||||||
@ -95,7 +98,6 @@ xrdpvr_init_player(void *channel, int stream_id, char *filename)
|
|||||||
printf("error sending metadata to client\n");
|
printf("error sending metadata to client\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ask client to get video format from media file */
|
/* ask client to get video format from media file */
|
||||||
if (xrdpvr_set_video_format(channel, 101))
|
if (xrdpvr_set_video_format(channel, 101))
|
||||||
@ -113,6 +115,8 @@ xrdpvr_init_player(void *channel, int stream_id, char *filename)
|
|||||||
printf("xrdpvr_set_audio_format() failed\n");
|
printf("xrdpvr_set_audio_format() failed\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -280,6 +284,12 @@ xrdpvr_play_media(void *channel, int stream_id, char *filename)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("%d\n", g_psi.p_audio_codec_ctx->extradata_size);
|
||||||
|
hexdump(g_psi.p_audio_codec_ctx->extradata, g_psi.p_audio_codec_ctx->extradata_size);
|
||||||
|
printf("%d %d %d %d\n", g_psi.p_audio_codec_ctx->sample_rate,
|
||||||
|
g_psi.p_audio_codec_ctx->bit_rate, g_psi.p_audio_codec_ctx->channels,
|
||||||
|
g_psi.p_audio_codec_ctx->block_align);
|
||||||
|
|
||||||
/* open decoder for video stream */
|
/* open decoder for video stream */
|
||||||
//if (avcodec_open2(g_psi.p_video_codec_ctx, g_psi.p_video_codec,
|
//if (avcodec_open2(g_psi.p_video_codec_ctx, g_psi.p_video_codec,
|
||||||
// NULL) < 0)
|
// NULL) < 0)
|
||||||
@ -292,13 +302,34 @@ xrdpvr_play_media(void *channel, int stream_id, char *filename)
|
|||||||
g_psi.bsfc = av_bitstream_filter_init("h264_mp4toannexb");
|
g_psi.bsfc = av_bitstream_filter_init("h264_mp4toannexb");
|
||||||
printf("g_psi.bsfc %p\n", g_psi.bsfc);
|
printf("g_psi.bsfc %p\n", g_psi.bsfc);
|
||||||
|
|
||||||
|
if (xrdpvr_set_video_format(channel, 101))
|
||||||
|
{
|
||||||
|
printf("xrdpvr_set_video_format() failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("xrdpvr_play_media: calling xrdpvr_set_audio_format\n");
|
||||||
|
if (xrdpvr_set_audio_format(channel, 101,
|
||||||
|
g_psi.p_audio_codec_ctx->extradata,
|
||||||
|
g_psi.p_audio_codec_ctx->extradata_size,
|
||||||
|
g_psi.p_audio_codec_ctx->sample_rate,
|
||||||
|
g_psi.p_audio_codec_ctx->bit_rate,
|
||||||
|
g_psi.p_audio_codec_ctx->channels,
|
||||||
|
g_psi.p_audio_codec_ctx->block_align))
|
||||||
|
{
|
||||||
|
printf("xrdpvr_set_audio_format() failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int firstAudioPkt = 1;
|
static int firstAudioPkt = 1;
|
||||||
static int firstVideoPkt = 1;
|
static int firstVideoPkt = 1;
|
||||||
|
|
||||||
int xrdpvr_get_frame(void **av_pkt_ret, int *is_video_frame, int *delay_in_us)
|
/******************************************************************************/
|
||||||
|
int
|
||||||
|
xrdpvr_get_frame(void **av_pkt_ret, int *is_video_frame, int *delay_in_us)
|
||||||
{
|
{
|
||||||
AVPacket *av_pkt;
|
AVPacket *av_pkt;
|
||||||
double dts;
|
double dts;
|
||||||
@ -346,7 +377,7 @@ int xrdpvr_get_frame(void **av_pkt_ret, int *is_video_frame, int *delay_in_us)
|
|||||||
{
|
{
|
||||||
|
|
||||||
bsfc = g_psi.bsfc;
|
bsfc = g_psi.bsfc;
|
||||||
printf("hi %p\n", bsfc);
|
//printf("hi %p\n", bsfc);
|
||||||
while (bsfc != 0)
|
while (bsfc != 0)
|
||||||
{
|
{
|
||||||
new_pkt = *av_pkt;
|
new_pkt = *av_pkt;
|
||||||
@ -404,7 +435,9 @@ int xrdpvr_get_frame(void **av_pkt_ret, int *is_video_frame, int *delay_in_us)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int send_audio_pkt(void *channel, int stream_id, void *pkt_p)
|
/******************************************************************************/
|
||||||
|
int
|
||||||
|
send_audio_pkt(void *channel, int stream_id, void *pkt_p)
|
||||||
{
|
{
|
||||||
AVPacket *av_pkt = (AVPacket *) pkt_p;
|
AVPacket *av_pkt = (AVPacket *) pkt_p;
|
||||||
|
|
||||||
@ -413,7 +446,9 @@ int send_audio_pkt(void *channel, int stream_id, void *pkt_p)
|
|||||||
free(av_pkt);
|
free(av_pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int send_video_pkt(void *channel, int stream_id, void *pkt_p)
|
/******************************************************************************/
|
||||||
|
int
|
||||||
|
send_video_pkt(void *channel, int stream_id, void *pkt_p)
|
||||||
{
|
{
|
||||||
AVPacket *av_pkt = (AVPacket *) pkt_p;
|
AVPacket *av_pkt = (AVPacket *) pkt_p;
|
||||||
|
|
||||||
@ -422,7 +457,9 @@ int send_video_pkt(void *channel, int stream_id, void *pkt_p)
|
|||||||
free(av_pkt);
|
free(av_pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int xrdpvr_play_frame(void *channel, int stream_id, int *videoTimeout, int *audioTimeout)
|
/******************************************************************************/
|
||||||
|
int
|
||||||
|
xrdpvr_play_frame(void *channel, int stream_id, int *videoTimeout, int *audioTimeout)
|
||||||
{
|
{
|
||||||
AVPacket av_pkt;
|
AVPacket av_pkt;
|
||||||
double dts;
|
double dts;
|
||||||
@ -460,7 +497,7 @@ int xrdpvr_play_frame(void *channel, int stream_id, int *videoTimeout, int *audi
|
|||||||
g_psi.audioTimeout = dts;
|
g_psi.audioTimeout = dts;
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("audio delay: %d\n", delay_in_us);
|
printf("audio delay: %d\n", delay_in_us);
|
||||||
usleep(delay_in_us);
|
usleep(delay_in_us);
|
||||||
//usleep(1000 * 1);
|
//usleep(1000 * 1);
|
||||||
}
|
}
|
||||||
@ -475,7 +512,6 @@ int xrdpvr_play_frame(void *channel, int stream_id, int *videoTimeout, int *audi
|
|||||||
&new_pkt.data, &new_pkt.size,
|
&new_pkt.data, &new_pkt.size,
|
||||||
av_pkt.data, av_pkt.size,
|
av_pkt.data, av_pkt.size,
|
||||||
av_pkt.flags & AV_PKT_FLAG_KEY);
|
av_pkt.flags & AV_PKT_FLAG_KEY);
|
||||||
// av_pkt.flags & PKT_FLAG_KEY);
|
|
||||||
if (error > 0)
|
if (error > 0)
|
||||||
{
|
{
|
||||||
av_free_packet(&av_pkt);
|
av_free_packet(&av_pkt);
|
||||||
@ -512,7 +548,7 @@ int xrdpvr_play_frame(void *channel, int stream_id, int *videoTimeout, int *audi
|
|||||||
//printf("xrdpvr_play_frame:video2: saved=%f dts=%f delay_in_us=%d\n", g_psi.videoTimeout, dts, delay_in_us);
|
//printf("xrdpvr_play_frame:video2: saved=%f dts=%f delay_in_us=%d\n", g_psi.videoTimeout, dts, delay_in_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("video delay: %d\n", delay_in_us);
|
printf("video delay: %d\n", delay_in_us);
|
||||||
usleep(delay_in_us);
|
usleep(delay_in_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -520,6 +556,7 @@ int xrdpvr_play_frame(void *channel, int stream_id, int *videoTimeout, int *audi
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
int
|
int
|
||||||
xrdpvr_seek_media(int64_t pos, int backward)
|
xrdpvr_seek_media(int64_t pos, int backward)
|
||||||
{
|
{
|
||||||
@ -547,6 +584,7 @@ xrdpvr_seek_media(int64_t pos, int backward)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
void
|
void
|
||||||
xrdpvr_get_media_duration(int64_t *start_time, int64_t *duration)
|
xrdpvr_get_media_duration(int64_t *start_time, int64_t *duration)
|
||||||
{
|
{
|
||||||
@ -554,6 +592,7 @@ xrdpvr_get_media_duration(int64_t *start_time, int64_t *duration)
|
|||||||
*duration = g_psi.p_format_ctx->duration / AV_TIME_BASE;
|
*duration = g_psi.p_format_ctx->duration / AV_TIME_BASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
int
|
int
|
||||||
xrdpvr_set_geometry(void *channel, int stream_id, int xpos, int ypos, int width, int height)
|
xrdpvr_set_geometry(void *channel, int stream_id, int xpos, int ypos, int width, int height)
|
||||||
{
|
{
|
||||||
@ -562,7 +601,7 @@ xrdpvr_set_geometry(void *channel, int stream_id, int xpos, int ypos, int width,
|
|||||||
int rv;
|
int rv;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
printf("xrdpvr_set_geometry: entered; x=%d y=%d\n", xpos, ypos);
|
printf("xrdpvr_set_geometry: entered; x=%d y=%d\n", xpos, ypos);
|
||||||
|
|
||||||
stream_new(s, MAX_PDU_SIZE);
|
stream_new(s, MAX_PDU_SIZE);
|
||||||
|
|
||||||
@ -604,7 +643,6 @@ xrdpvr_set_video_format(void *channel, uint32_t stream_id)
|
|||||||
int len;
|
int len;
|
||||||
|
|
||||||
stream_new(s, MAX_PDU_SIZE);
|
stream_new(s, MAX_PDU_SIZE);
|
||||||
|
|
||||||
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
||||||
stream_ins_u32_le(s, CMD_SET_VIDEO_FORMAT);
|
stream_ins_u32_le(s, CMD_SET_VIDEO_FORMAT);
|
||||||
stream_ins_u32_le(s, stream_id);
|
stream_ins_u32_le(s, stream_id);
|
||||||
@ -631,7 +669,9 @@ xrdpvr_set_video_format(void *channel, uint32_t stream_id)
|
|||||||
* @return 0 on success, -1 on error
|
* @return 0 on success, -1 on error
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int
|
||||||
xrdpvr_set_audio_format(void *channel, uint32_t stream_id)
|
xrdpvr_set_audio_format(void *channel, uint32_t stream_id, char *extradata,
|
||||||
|
int extradata_size, int sample_rate, int bit_rate,
|
||||||
|
int channels, int block_align)
|
||||||
{
|
{
|
||||||
STREAM *s;
|
STREAM *s;
|
||||||
char *cptr;
|
char *cptr;
|
||||||
@ -640,9 +680,20 @@ xrdpvr_set_audio_format(void *channel, uint32_t stream_id)
|
|||||||
|
|
||||||
stream_new(s, MAX_PDU_SIZE);
|
stream_new(s, MAX_PDU_SIZE);
|
||||||
|
|
||||||
|
printf("extradata_size %d sample_rate %d bit_rate %d channels %d "
|
||||||
|
"block_align %d\n", extradata_size, sample_rate, bit_rate,
|
||||||
|
channels, block_align);
|
||||||
|
|
||||||
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
||||||
stream_ins_u32_le(s, CMD_SET_AUDIO_FORMAT);
|
stream_ins_u32_le(s, CMD_SET_AUDIO_FORMAT);
|
||||||
stream_ins_u32_le(s, stream_id);
|
stream_ins_u32_le(s, stream_id);
|
||||||
|
stream_ins_u32_le(s, extradata_size);
|
||||||
|
memcpy(s->p, extradata, extradata_size);
|
||||||
|
s->p += extradata_size;
|
||||||
|
stream_ins_u32_le(s, sample_rate);
|
||||||
|
stream_ins_u32_le(s, bit_rate);
|
||||||
|
stream_ins_u32_le(s, channels);
|
||||||
|
stream_ins_u32_le(s, block_align);
|
||||||
|
|
||||||
/* insert number of bytes in stream */
|
/* insert number of bytes in stream */
|
||||||
len = stream_length(s) - 4;
|
len = stream_length(s) - 4;
|
||||||
@ -675,6 +726,7 @@ xrdpvr_send_video_data(void *channel, uint32_t stream_id, uint32_t data_len, uin
|
|||||||
int rv;
|
int rv;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
printf("xrdpvr_send_video_data:\n");
|
||||||
stream_new(s, MAX_PDU_SIZE + data_len);
|
stream_new(s, MAX_PDU_SIZE + data_len);
|
||||||
|
|
||||||
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
||||||
@ -719,6 +771,7 @@ xrdpvr_send_audio_data(void *channel, uint32_t stream_id, uint32_t data_len, uin
|
|||||||
int rv;
|
int rv;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
printf("xrdpvr_send_audio_data:\n");
|
||||||
stream_new(s, MAX_PDU_SIZE + data_len);
|
stream_new(s, MAX_PDU_SIZE + data_len);
|
||||||
|
|
||||||
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
||||||
@ -737,6 +790,13 @@ xrdpvr_send_audio_data(void *channel, uint32_t stream_id, uint32_t data_len, uin
|
|||||||
/* write data to virtual channel */
|
/* write data to virtual channel */
|
||||||
rv = xrdpvr_write_to_client(channel, s);
|
rv = xrdpvr_write_to_client(channel, s);
|
||||||
stream_free(s);
|
stream_free(s);
|
||||||
|
|
||||||
|
// read ack back
|
||||||
|
stream_new(s, MAX_PDU_SIZE);
|
||||||
|
xrdpvr_read_from_client(channel, s, 4, 1000);
|
||||||
|
//hexdump(s->data, s->p - s->data);
|
||||||
|
stream_free(s);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -815,6 +875,33 @@ xrdpvr_create_metadata_file(void *channel, char *filename)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
******************************************************************************/
|
||||||
|
static int
|
||||||
|
xrdpvr_read_from_client(void *channel, STREAM *s, int bytes, int timeout)
|
||||||
|
{
|
||||||
|
unsigned int bytes_read;
|
||||||
|
int total_read;
|
||||||
|
int ok;
|
||||||
|
|
||||||
|
//printf("xrdpvr_read_from_client:\n");
|
||||||
|
total_read = 0;
|
||||||
|
while (total_read < bytes)
|
||||||
|
{
|
||||||
|
//printf("xrdpvr_read_from_client: loop\n");
|
||||||
|
bytes_read = bytes - total_read;
|
||||||
|
ok = WTSVirtualChannelRead(channel, timeout, s->p, bytes_read, &bytes_read);
|
||||||
|
//printf("xrdpvr_read_from_client: loop ok %d\n", ok);
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
//printf("xrdpvr_read_from_client: bytes_read %d\n", bytes_read);
|
||||||
|
total_read += bytes_read;
|
||||||
|
s->p += bytes_read;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* write data to a xrdpvr client
|
* write data to a xrdpvr client
|
||||||
*
|
*
|
||||||
@ -893,3 +980,30 @@ xrdpvr_set_volume(void *channel, int volume)
|
|||||||
stream_free(s);
|
stream_free(s);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
xrdpvr_send_init(void *channel)
|
||||||
|
{
|
||||||
|
STREAM *s;
|
||||||
|
char *cptr;
|
||||||
|
int rv;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
printf("xrdpvr_send_init:\n");
|
||||||
|
stream_new(s, MAX_BUFSIZE);
|
||||||
|
|
||||||
|
stream_ins_u32_le(s, 0); /* number of bytes to follow */
|
||||||
|
stream_ins_u32_le(s, CMD_INIT_XRDPVR);
|
||||||
|
|
||||||
|
/* insert number of bytes in stream */
|
||||||
|
len = stream_length(s) - 4;
|
||||||
|
cptr = s->p;
|
||||||
|
s->p = s->data;
|
||||||
|
stream_ins_u32_le(s, len);
|
||||||
|
s->p = cptr;
|
||||||
|
|
||||||
|
/* write data to virtual channel */
|
||||||
|
rv = xrdpvr_write_to_client(channel, s);
|
||||||
|
stream_free(s);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
@ -34,7 +34,9 @@ int xrdpvr_deinit_player(void *channel, int stream_id);
|
|||||||
int xrdpvr_play_media(void *channel, int stream_id, char *filename);
|
int xrdpvr_play_media(void *channel, int stream_id, char *filename);
|
||||||
int xrdpvr_set_geometry(void *channel, int stream_id, int xpos, int ypos, int width, int height);
|
int xrdpvr_set_geometry(void *channel, int stream_id, int xpos, int ypos, int width, int height);
|
||||||
int xrdpvr_set_video_format(void *channel, uint32_t stream_id);
|
int xrdpvr_set_video_format(void *channel, uint32_t stream_id);
|
||||||
int xrdpvr_set_audio_format(void *channel, uint32_t stream_id);
|
int xrdpvr_set_audio_format(void *channel, uint32_t stream_id, char *extradata,
|
||||||
|
int extradata_size, int sample_rate, int bit_rate,
|
||||||
|
int channels, int block_align);
|
||||||
int xrdpvr_send_video_data(void *channel, uint32_t stream_id, uint32_t data_len, uint8_t *data);
|
int xrdpvr_send_video_data(void *channel, uint32_t stream_id, uint32_t data_len, uint8_t *data);
|
||||||
int xrdpvr_send_audio_data(void *channel, uint32_t stream_id, uint32_t data_len, uint8_t *data);
|
int xrdpvr_send_audio_data(void *channel, uint32_t stream_id, uint32_t data_len, uint8_t *data);
|
||||||
int xrdpvr_create_metadata_file(void *channel, char *filename);
|
int xrdpvr_create_metadata_file(void *channel, char *filename);
|
||||||
@ -45,6 +47,7 @@ int xrdpvr_get_frame(void **av_pkt_ret, int *is_video_frame, int *delay_in_us);
|
|||||||
int send_audio_pkt(void *channel, int stream_id, void *pkt_p);
|
int send_audio_pkt(void *channel, int stream_id, void *pkt_p);
|
||||||
int send_video_pkt(void *channel, int stream_id, void *pkt_p);
|
int send_video_pkt(void *channel, int stream_id, void *pkt_p);
|
||||||
int xrdpvr_set_volume(void *channel, int volume);
|
int xrdpvr_set_volume(void *channel, int volume);
|
||||||
|
int xrdpvr_send_init(void *channel);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,7 @@
|
|||||||
#define CMD_DEINIT_XRDPVR 8
|
#define CMD_DEINIT_XRDPVR 8
|
||||||
#define CMD_SET_GEOMETRY 9
|
#define CMD_SET_GEOMETRY 9
|
||||||
#define CMD_SET_VOLUME 10
|
#define CMD_SET_VOLUME 10
|
||||||
|
#define CMD_INIT_XRDPVR 11
|
||||||
|
|
||||||
/* max number of bytes we can send in one pkt */
|
/* max number of bytes we can send in one pkt */
|
||||||
#define MAX_PDU_SIZE 1600
|
#define MAX_PDU_SIZE 1600
|
||||||
@ -221,6 +222,7 @@ typedef struct _player_state_info
|
|||||||
|
|
||||||
} PLAYER_STATE_INFO;
|
} PLAYER_STATE_INFO;
|
||||||
|
|
||||||
|
static int xrdpvr_read_from_client(void *channel, STREAM *s, int bytes, int timeout);
|
||||||
static int xrdpvr_write_to_client(void *channel, STREAM *s);
|
static int xrdpvr_write_to_client(void *channel, STREAM *s);
|
||||||
|
|
||||||
#endif /* __XRDPVR_INTERNAL_H__ */
|
#endif /* __XRDPVR_INTERNAL_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user