Commit df4237b6 authored by Pierre Ynard's avatar Pierre Ynard

rtp input: theora support

Not enabled yet
parent b43a83e5
...@@ -39,19 +39,17 @@ ...@@ -39,19 +39,17 @@
#include "rtp.h" #include "rtp.h"
/* PT=dynamic typedef struct rtp_xiph_t
* vorbis: Xiph Vorbis audio (RFC 5215)
*/
typedef struct rtp_vorbis_t
{ {
es_out_id_t *id; es_out_id_t *id;
block_t *block; block_t *block;
uint32_t ident; 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) if (self == NULL)
return NULL; return NULL;
...@@ -59,13 +57,31 @@ static void *vorbis_init (demux_t *demux) ...@@ -59,13 +57,31 @@ static void *vorbis_init (demux_t *demux)
self->id = NULL; self->id = NULL;
self->block = NULL; self->block = NULL;
self->ident = 0xffffffff; /* impossible value on the wire */ self->ident = 0xffffffff; /* impossible value on the wire */
(void)demux; self->vorbis = vorbis;
return self; 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) if (!data)
return; return;
...@@ -79,7 +95,7 @@ static void vorbis_destroy (demux_t *demux, void *data) ...@@ -79,7 +95,7 @@ static void vorbis_destroy (demux_t *demux, void *data)
} }
/* Convert configuration from RTP to VLC format */ /* 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 */ /* Headers number */
if (len == 0) if (len == 0)
...@@ -129,14 +145,14 @@ static ssize_t vorbis_header (void **pextra, const uint8_t *buf, size_t len) ...@@ -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) if (!data || block->i_buffer < 4)
goto drop; goto drop;
/* 32-bits Vorbis RTP header (§2.2) */ /* 32-bits RTP header (§2.2) */
uint32_t ident = GetDWBE (block->p_buffer); uint32_t ident = GetDWBE (block->p_buffer);
block->i_buffer -= 4; block->i_buffer -= 4;
block->p_buffer += 4; block->p_buffer += 4;
...@@ -146,10 +162,12 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block) ...@@ -146,10 +162,12 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
unsigned pkts = (ident) & 15; unsigned pkts = (ident) & 15;
ident >>= 8; ident >>= 8;
/* Vorbis RTP defragmentation */ /* RTP defragmentation */
if (self->block && (block->i_flags & BLOCK_FLAG_DISCONTINUITY)) if (self->block && (block->i_flags & BLOCK_FLAG_DISCONTINUITY))
{ /* Screwed! discontinuity within a fragmented packet */ { /* 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); block_Release (self->block);
self->block = NULL; self->block = NULL;
} }
...@@ -205,7 +223,7 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block) ...@@ -205,7 +223,7 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
pkts = 1; pkts = 1;
} }
/* Vorbis RTP payload packets processing */ /* RTP payload packets processing */
while (pkts > 0) while (pkts > 0)
{ {
if (block->i_buffer < 2) if (block->i_buffer < 2)
...@@ -219,7 +237,7 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block) ...@@ -219,7 +237,7 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
switch (datatype) switch (datatype)
{ {
case 0: /* Raw audio frame */ case 0: /* Raw payload */
{ {
if (self->ident != ident) if (self->ident != ident)
break; /* Ignore raw without configuration */ break; /* Ignore raw without configuration */
...@@ -236,17 +254,21 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block) ...@@ -236,17 +254,21 @@ static void vorbis_decode (demux_t *demux, void *data, block_t *block)
break; /* Ignore config retransmission */ break; /* Ignore config retransmission */
void *extv; 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) if (extc < 0)
break; break;
es_format_t fmt; 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.p_extra = extv;
fmt.i_extra = extc; fmt.i_extra = extc;
codec_destroy (demux, self->id); codec_destroy (demux, self->id);
msg_Dbg (demux, "Vorbis packed configuration received " msg_Dbg (demux, self->vorbis ?
"(%06"PRIx32")", ident); "Vorbis packed configuration received (%06"PRIx32")" :
"Theora packed configuration received (%06"PRIx32")",
ident);
self->ident = ident; self->ident = ident;
self->id = codec_init (demux, &fmt); self->id = codec_init (demux, &fmt);
break; 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