Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
152fee0c
Commit
152fee0c
authored
Nov 17, 2010
by
Pierre Ynard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rtp sout: vorbis packetizer
parent
a7f80fa2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
145 additions
and
0 deletions
+145
-0
modules/stream_out/rtpfmt.c
modules/stream_out/rtpfmt.c
+145
-0
No files found.
modules/stream_out/rtpfmt.c
View file @
152fee0c
...
@@ -32,6 +32,7 @@
...
@@ -32,6 +32,7 @@
#include <vlc_strings.h>
#include <vlc_strings.h>
#include "rtp.h"
#include "rtp.h"
#include "../demux/xiph.h"
#include <assert.h>
#include <assert.h>
...
@@ -53,6 +54,63 @@ static int rtp_packetize_g726_32 (sout_stream_id_t *, block_t *);
...
@@ -53,6 +54,63 @@ static int rtp_packetize_g726_32 (sout_stream_id_t *, block_t *);
static
int
rtp_packetize_g726_40
(
sout_stream_id_t
*
,
block_t
*
);
static
int
rtp_packetize_g726_40
(
sout_stream_id_t
*
,
block_t
*
);
static
int
rtp_packetize_vorbis
(
sout_stream_id_t
*
,
block_t
*
);
static
int
rtp_packetize_vorbis
(
sout_stream_id_t
*
,
block_t
*
);
#define VORBIS_IDENT (0)
static
int
rtp_vorbis_pack_headers
(
size_t
room
,
void
*
p_extra
,
size_t
i_extra
,
uint8_t
**
p_buffer
,
size_t
*
i_buffer
)
{
unsigned
packet_size
[
XIPH_MAX_HEADER_COUNT
];
void
*
packet
[
XIPH_MAX_HEADER_COUNT
];
unsigned
packet_count
;
int
val
=
xiph_SplitHeaders
(
packet_size
,
packet
,
&
packet_count
,
i_extra
,
p_extra
);
if
(
val
!=
VLC_SUCCESS
)
return
val
;
if
(
packet_count
<
3
)
return
VLC_EGENERIC
;
unsigned
length_size
[
2
]
=
{
0
,
0
};
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
unsigned
size
=
packet_size
[
i
];
while
(
size
>
0
)
{
length_size
[
i
]
++
;
size
>>=
7
;
}
}
*
i_buffer
=
room
+
1
+
length_size
[
0
]
+
length_size
[
1
]
+
packet_size
[
0
]
+
packet_size
[
1
]
+
packet_size
[
2
];
*
p_buffer
=
malloc
(
*
i_buffer
);
if
(
*
p_buffer
==
NULL
)
return
VLC_ENOMEM
;
uint8_t
*
p
=
*
p_buffer
+
room
;
/* Number of headers */
*
p
++
=
2
;
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
unsigned
size
=
length_size
[
i
];
while
(
size
>
0
)
{
*
p
=
(
packet_size
[
i
]
>>
(
7
*
(
size
-
1
)))
&
0x7f
;
if
(
--
size
>
0
)
*
p
|=
0x80
;
p
++
;
}
}
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
memcpy
(
p
,
packet
[
i
],
packet_size
[
i
]);
free
(
packet
[
i
]);
p
+=
packet_size
[
i
];
}
return
VLC_SUCCESS
;
}
static
void
sprintf_hexa
(
char
*
s
,
uint8_t
*
p_data
,
int
i_data
)
static
void
sprintf_hexa
(
char
*
s
,
uint8_t
*
p_data
,
int
i_data
)
{
{
static
const
char
hex
[
16
]
=
"0123456789abcdef"
;
static
const
char
hex
[
16
]
=
"0123456789abcdef"
;
...
@@ -337,6 +395,37 @@ int rtp_get_fmt( vlc_object_t *obj, es_format_t *p_fmt, const char *mux,
...
@@ -337,6 +395,37 @@ int rtp_get_fmt( vlc_object_t *obj, es_format_t *p_fmt, const char *mux,
rtp_fmt
->
ptname
=
"SPEEX"
;
rtp_fmt
->
ptname
=
"SPEEX"
;
rtp_fmt
->
pf_packetize
=
rtp_packetize_spx
;
rtp_fmt
->
pf_packetize
=
rtp_packetize_spx
;
break
;
break
;
case
VLC_CODEC_VORBIS
:
rtp_fmt
->
ptname
=
"vorbis"
;
rtp_fmt
->
pf_packetize
=
rtp_packetize_vorbis
;
if
(
p_fmt
->
i_extra
>
0
)
{
rtp_fmt
->
fmtp
=
NULL
;
uint8_t
*
p_buffer
;
size_t
i_buffer
;
if
(
rtp_vorbis_pack_headers
(
9
,
p_fmt
->
p_extra
,
p_fmt
->
i_extra
,
&
p_buffer
,
&
i_buffer
)
!=
VLC_SUCCESS
)
break
;
/* Number of packed headers */
SetDWBE
(
p_buffer
,
1
);
/* Ident */
uint32_t
ident
=
VORBIS_IDENT
;
SetWBE
(
p_buffer
+
4
,
ident
>>
8
);
p_buffer
[
6
]
=
ident
&
0xff
;
/* Length field */
SetWBE
(
p_buffer
+
7
,
i_buffer
);
char
*
config
=
vlc_b64_encode_binary
(
p_buffer
,
i_buffer
);
free
(
p_buffer
);
if
(
config
==
NULL
)
break
;
if
(
asprintf
(
&
rtp_fmt
->
fmtp
,
"configuration=%s;"
,
config
)
==
-
1
)
rtp_fmt
->
fmtp
=
NULL
;
free
(
config
);
}
break
;
case
VLC_CODEC_ITU_T140
:
case
VLC_CODEC_ITU_T140
:
rtp_fmt
->
ptname
=
"t140"
;
rtp_fmt
->
ptname
=
"t140"
;
rtp_fmt
->
clock_rate
=
1000
;
rtp_fmt
->
clock_rate
=
1000
;
...
@@ -358,6 +447,62 @@ rtp_packetize_h264_nal( sout_stream_id_t *id,
...
@@ -358,6 +447,62 @@ rtp_packetize_h264_nal( sout_stream_id_t *id,
const
uint8_t
*
p_data
,
int
i_data
,
int64_t
i_pts
,
const
uint8_t
*
p_data
,
int
i_data
,
int64_t
i_pts
,
int64_t
i_dts
,
bool
b_last
,
int64_t
i_length
);
int64_t
i_dts
,
bool
b_last
,
int64_t
i_length
);
/* rfc5215 */
static
int
rtp_packetize_vorbis
(
sout_stream_id_t
*
id
,
block_t
*
in
)
{
int
i_max
=
rtp_mtu
(
id
)
-
6
;
/* payload max in one packet */
int
i_count
=
(
in
->
i_buffer
+
i_max
-
1
)
/
i_max
;
uint8_t
*
p_data
=
in
->
p_buffer
;
int
i_data
=
in
->
i_buffer
;
for
(
int
i
=
0
;
i
<
i_count
;
i
++
)
{
int
i_payload
=
__MIN
(
i_max
,
i_data
);
block_t
*
out
=
block_Alloc
(
18
+
i_payload
);
unsigned
fragtype
,
numpkts
;
if
(
i_count
==
1
)
{
/* No fragmentation */
fragtype
=
0
;
numpkts
=
1
;
}
else
{
/* Fragmentation */
numpkts
=
0
;
if
(
i
==
0
)
fragtype
=
1
;
else
if
(
i
==
i_count
-
1
)
fragtype
=
3
;
else
fragtype
=
2
;
}
/* Ident:24, Fragment type:2, Vorbis Data Type:2, # of packets:4 */
uint32_t
header
=
((
VORBIS_IDENT
&
0xffffff
)
<<
8
)
|
(
fragtype
<<
6
)
|
(
0
<<
4
)
|
numpkts
;
/* rtp common header */
rtp_packetize_common
(
id
,
out
,
0
,
in
->
i_pts
);
SetDWBE
(
out
->
p_buffer
+
12
,
header
);
SetWBE
(
out
->
p_buffer
+
16
,
i_payload
);
memcpy
(
&
out
->
p_buffer
[
18
],
p_data
,
i_payload
);
out
->
i_buffer
=
18
+
i_payload
;
out
->
i_dts
=
in
->
i_dts
+
i
*
in
->
i_length
/
i_count
;
out
->
i_length
=
in
->
i_length
/
i_count
;
rtp_packetize_send
(
id
,
out
);
p_data
+=
i_payload
;
i_data
-=
i_payload
;
}
return
VLC_SUCCESS
;
}
static
int
rtp_packetize_mpa
(
sout_stream_id_t
*
id
,
block_t
*
in
)
static
int
rtp_packetize_mpa
(
sout_stream_id_t
*
id
,
block_t
*
in
)
{
{
int
i_max
=
rtp_mtu
(
id
)
-
4
;
/* payload max in one packet */
int
i_max
=
rtp_mtu
(
id
)
-
4
;
/* payload max in one packet */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment