vlc | branch: master | Pierre Ynard <[email protected]> | Thu Dec 2 18:30:08 2010 +0100| [df4237b6f1529d2f9460e4f3bb18e853ec96029d] | committer: Pierre Ynard
rtp input: theora support Not enabled yet > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=df4237b6f1529d2f9460e4f3bb18e853ec96029d --- modules/access/rtp/xiph.c | 66 ++++++++++++++++++++++++++++++--------------- 1 files changed, 44 insertions(+), 22 deletions(-) diff --git a/modules/access/rtp/xiph.c b/modules/access/rtp/xiph.c index 03ef83a..4866513 100644 --- a/modules/access/rtp/xiph.c +++ b/modules/access/rtp/xiph.c @@ -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; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
