Commit df4237b6 authored by Pierre Ynard's avatar Pierre Ynard

rtp input: theora support

Not enabled yet
parent b43a83e5
......@@ -39,19 +39,17 @@
#include "rtp.h"
/* PT=dynamic
* vorbis: Xiph Vorbis audio (RFC 5215)
*/
typedef struct rtp_vorbis_t
typedef struct rtp_xiph_t
{
es_out_id_t *id;
block_t *block;
uint32_t ident;
} rtp_vorbis_t;
bool vorbis;
} rtp_xiph_t;
static void *vorbis_init (demux_t *demux)
static void *xiph_init (bool vorbis)
{
rtp_vorbis_t *self = malloc (sizeof (*self));
rtp_xiph_t *self = malloc (sizeof (*self));
if (self == NULL)
return NULL;
......@@ -59,13 +57,31 @@ static void *vorbis_init (demux_t *demux)
self->id = NULL;
self->block = NULL;
self->ident = 0xffffffff; /* impossible value on the wire */
(void)demux;
self->vorbis = vorbis;
return self;
}
static void vorbis_destroy (demux_t *demux, void *data)
/* PT=dynamic
* vorbis: Xiph Vorbis audio (RFC 5215)
*/
static void *vorbis_init (demux_t *demux)
{
(void)demux;
return xiph_init (true);
}
/* PT=dynamic
* vorbis: Xiph Theora video
*/
static void *theora_init (demux_t *demux)
{
(void)demux;
return xiph_init (false);
}
static void xiph_destroy (demux_t *demux, void *data)
{
rtp_vorbis_t *self = data;
rtp_xiph_t *self = data;
if (!data)
return;
......@@ -79,7 +95,7 @@ static void vorbis_destroy (demux_t *demux, void *data)
}
/* Convert configuration from RTP to VLC format */
static ssize_t vorbis_header (void **pextra, const uint8_t *buf, size_t len)
static ssize_t xiph_header (void **pextra, const uint8_t *buf, size_t len)
{
/* Headers number */
if (len == 0)
......@@ -129,14 +145,14 @@ static ssize_t vorbis_header (void **pextra, const uint8_t *buf, size_t len)
}
static void vorbis_decode (demux_t *demux, void *data, block_t *block)
static void xiph_decode (demux_t *demux, void *data, block_t *block)
{
rtp_vorbis_t *self = data;
rtp_xiph_t *self = data;
if (!data || block->i_buffer < 4)
goto drop;
/* 32-bits Vorbis RTP header (§2.2) */
/* 32-bits RTP header (§2.2) */
uint32_t ident = GetDWBE (block->p_buffer);
block->i_buffer -= 4;
block->p_buffer += 4;
......@@ -146,10 +162,12 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
unsigned pkts = (ident) & 15;
ident >>= 8;
/* Vorbis RTP defragmentation */
/* RTP defragmentation */
if (self->block && (block->i_flags & BLOCK_FLAG_DISCONTINUITY))
{ /* Screwed! discontinuity within a fragmented packet */
msg_Warn (demux, "discontinuity in fragmented Vorbis packet");
msg_Warn (demux, self->vorbis ?
"discontinuity in fragmented Vorbis packet" :
"discontinuity in fragmented Theora packet");
block_Release (self->block);
self->block = NULL;
}
......@@ -205,7 +223,7 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
pkts = 1;
}
/* Vorbis RTP payload packets processing */
/* RTP payload packets processing */
while (pkts > 0)
{
if (block->i_buffer < 2)
......@@ -219,7 +237,7 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
switch (datatype)
{
case 0: /* Raw audio frame */
case 0: /* Raw payload */
{
if (self->ident != ident)
break; /* Ignore raw without configuration */
......@@ -236,17 +254,21 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
break; /* Ignore config retransmission */
void *extv;
ssize_t extc = vorbis_header (&extv, block->p_buffer, len);
ssize_t extc = xiph_header (&extv, block->p_buffer, len);
if (extc < 0)
break;
es_format_t fmt;
es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_VORBIS);
es_format_Init (&fmt, self->vorbis ? AUDIO_ES : VIDEO_ES,
self->vorbis ? VLC_CODEC_VORBIS
: VLC_CODEC_THEORA);
fmt.p_extra = extv;
fmt.i_extra = extc;
codec_destroy (demux, self->id);
msg_Dbg (demux, "Vorbis packed configuration received "
"(%06"PRIx32")", ident);
msg_Dbg (demux, self->vorbis ?
"Vorbis packed configuration received (%06"PRIx32")" :
"Theora packed configuration received (%06"PRIx32")",
ident);
self->ident = ident;
self->id = codec_init (demux, &fmt);
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment