Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
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-1.1
Commits
3a1061ba
Commit
3a1061ba
authored
Feb 16, 2003
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* udp: forgot this file...
parent
31fa9d1e
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
107 additions
and
104 deletions
+107
-104
modules/access_output/udp.c
modules/access_output/udp.c
+107
-104
No files found.
modules/access_output/udp.c
View file @
3a1061ba
...
...
@@ -2,7 +2,7 @@
* udp.c
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
* $Id: udp.c,v 1.
3 2003/02/16 14:03:56
fenrir Exp $
* $Id: udp.c,v 1.
4 2003/02/16 14:51:23
fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org>
...
...
@@ -63,8 +63,8 @@
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
int
Write
(
sout_
instance
_t
*
,
sout_buffer_t
*
);
static
int
Seek
(
sout_instance
_t
*
,
off_t
);
static
int
Write
(
sout_
access_out
_t
*
,
sout_buffer_t
*
);
static
int
Seek
(
sout_access_out
_t
*
,
off_t
);
static
void
ThreadWrite
(
vlc_object_t
*
p_this
);
...
...
@@ -91,7 +91,7 @@ typedef struct sout_access_thread_s
}
sout_access_thread_t
;
typedef
struct
sout_access_data_s
struct
sout_access_out_sys_t
{
int
b_rtpts
;
// 1 if add rtp/ts header
uint16_t
i_sequence_number
;
...
...
@@ -103,15 +103,15 @@ typedef struct sout_access_data_s
sout_access_thread_t
*
p_thread
;
}
sout_access_data_t
;
};
/*****************************************************************************
* Open: open the file
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
sout_
instance_t
*
p_sout
=
(
sout_instance
_t
*
)
p_this
;
sout_access_
data_t
*
p_acces
s
;
sout_
access_out_t
*
p_access
=
(
sout_access_out
_t
*
)
p_this
;
sout_access_
out_sys_t
*
p_sy
s
;
char
*
psz_parser
;
char
*
psz_dst_addr
;
...
...
@@ -120,31 +120,33 @@ static int Open( vlc_object_t *p_this )
module_t
*
p_network
;
network_socket_t
socket_desc
;
if
(
!
(
p_access
=
malloc
(
sizeof
(
sout_access_data_t
)
)
)
)
if
(
!
(
p_sys
=
p_access
->
p_sys
=
malloc
(
sizeof
(
sout_access_out_sys_t
)
)
)
)
{
msg_Err
(
p_
sout
,
"Not enough memory"
);
return
(
-
1
);
msg_Err
(
p_
access
,
"Not enough memory"
);
return
(
VLC_EGENERIC
);
}
if
(
p_
sout
->
psz_access
!=
NULL
&&
!
strcmp
(
p_
sout
->
psz_access
,
"rtp"
)
)
if
(
p_
access
->
psz_access
!=
NULL
&&
!
strcmp
(
p_
access
->
psz_access
,
"rtp"
)
)
{
if
(
p_sout
->
psz_mux
!=
NULL
&&
*
p_sout
->
psz_mux
&&
strcmp
(
p_sout
->
psz_mux
,
"ts"
)
&&
strcmp
(
p_sout
->
psz_mux
,
"ts_dvbpsi"
))
if
(
p_access
->
p_sout
->
psz_mux
!=
NULL
&&
*
p_access
->
p_sout
->
psz_mux
&&
strcmp
(
p_access
->
p_sout
->
psz_mux
,
"ts"
)
&&
strcmp
(
p_access
->
p_sout
->
psz_mux
,
"ts_dvbpsi"
)
)
{
msg_Err
(
p_
sout
,
"rtp ouput work only with ts payload"
);
free
(
p_
acces
s
);
return
(
-
1
);
msg_Err
(
p_
access
,
"rtp ouput work only with ts payload"
);
free
(
p_
sy
s
);
return
(
VLC_EGENERIC
);
}
p_
acces
s
->
b_rtpts
=
1
;
p_
sy
s
->
b_rtpts
=
1
;
}
else
{
p_
acces
s
->
b_rtpts
=
0
;
p_
sy
s
->
b_rtpts
=
0
;
}
psz_parser
=
strdup
(
p_
sout
->
psz_name
);
psz_parser
=
strdup
(
p_
access
->
psz_name
);
psz_dst_addr
=
psz_parser
;
i_dst_port
=
0
;
...
...
@@ -164,54 +166,53 @@ static int Open( vlc_object_t *p_this )
i_dst_port
=
DEFAULT_PORT
;
}
p_access
->
p_thread
=
vlc_object_create
(
p_sout
,
p_sys
->
p_thread
=
vlc_object_create
(
p_access
,
sizeof
(
sout_access_thread_t
)
);
if
(
!
p_
acces
s
->
p_thread
)
if
(
!
p_
sy
s
->
p_thread
)
{
msg_Err
(
p_
sout
,
"out of memory"
);
return
(
-
1
);
msg_Err
(
p_
access
,
"out of memory"
);
return
(
VLC_EGENERIC
);
}
p_
access
->
p_thread
->
p_sout
=
p_sout
;
p_
acces
s
->
p_thread
->
b_die
=
0
;
p_
acces
s
->
p_thread
->
b_error
=
0
;
p_
access
->
p_thread
->
p_fifo
=
sout_FifoCreate
(
p_sout
);
p_
sys
->
p_thread
->
p_sout
=
p_access
->
p_sout
;
p_
sy
s
->
p_thread
->
b_die
=
0
;
p_
sy
s
->
p_thread
->
b_error
=
0
;
p_
sys
->
p_thread
->
p_fifo
=
sout_FifoCreate
(
p_access
->
p_sout
);
socket_desc
.
i_type
=
NETWORK_UDP
;
socket_desc
.
psz_server_addr
=
psz_dst_addr
;
socket_desc
.
i_server_port
=
i_dst_port
;
socket_desc
.
psz_bind_addr
=
""
;
socket_desc
.
i_bind_port
=
0
;
p_
acces
s
->
p_thread
->
p_private
=
(
void
*
)
&
socket_desc
;
if
(
!
(
p_network
=
module_Need
(
p_
access
->
p_thread
,
p_
sy
s
->
p_thread
->
p_private
=
(
void
*
)
&
socket_desc
;
if
(
!
(
p_network
=
module_Need
(
p_
sys
->
p_thread
,
"network"
,
""
)
)
)
{
msg_Err
(
p_
sout
,
"failed to open a connection (udp)"
);
return
(
-
1
);
msg_Err
(
p_
access
,
"failed to open a connection (udp)"
);
return
(
VLC_EGENERIC
);
}
module_Unneed
(
p_
acces
s
->
p_thread
,
p_network
);
module_Unneed
(
p_
sy
s
->
p_thread
,
p_network
);
p_
acces
s
->
p_thread
->
i_handle
=
socket_desc
.
i_handle
;
p_
acces
s
->
i_mtu
=
socket_desc
.
i_mtu
;
p_
sy
s
->
p_thread
->
i_handle
=
socket_desc
.
i_handle
;
p_
sy
s
->
i_mtu
=
socket_desc
.
i_mtu
;
if
(
vlc_thread_create
(
p_
acces
s
->
p_thread
,
"sout write thread"
,
if
(
vlc_thread_create
(
p_
sy
s
->
p_thread
,
"sout write thread"
,
ThreadWrite
,
VLC_THREAD_PRIORITY_LOW
,
VLC_FALSE
)
)
{
msg_Err
(
p_sout
,
"cannot spawn sout access thread"
);
vlc_object_destroy
(
p_
acces
s
->
p_thread
);
return
(
-
1
);
msg_Err
(
p_
access
->
p_
sout
,
"cannot spawn sout access thread"
);
vlc_object_destroy
(
p_
sy
s
->
p_thread
);
return
(
VLC_EGENERIC
);
}
p_
access
->
p_buffer
=
NULL
;
p_
acces
s
->
i_sequence_number
=
12
;
// FIXME should be random, used by rtp
p_
acces
s
->
i_ssrc
=
4212
;
// FIXME " " " " " "
p_
sys
->
p_buffer
=
NULL
;
p_
sy
s
->
i_sequence_number
=
12
;
// FIXME should be random, used by rtp
p_
sy
s
->
i_ssrc
=
4212
;
// FIXME " " " " " "
p_sout
->
i_method
=
SOUT_METHOD_NETWORK
;
p_sout
->
p_access_data
=
(
void
*
)
p_access
;
p_sout
->
pf_write
=
Write
;
p_sout
->
pf_seek
=
Seek
;
p_access
->
pf_write
=
Write
;
p_access
->
pf_seek
=
Seek
;
msg_Info
(
p_
sout
,
msg_Info
(
p_
access
,
"Open: addr:`%s' port:`%d'"
,
psz_dst_addr
,
i_dst_port
);
...
...
@@ -224,55 +225,57 @@ static int Open( vlc_object_t *p_this )
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
sout_
instance_t
*
p_sout
=
(
sout_instance
_t
*
)
p_this
;
sout_access_
data_t
*
p_access
=
(
sout_access_data_t
*
)
p_sout
->
p_access_data
;
sout_
access_out_t
*
p_access
=
(
sout_access_out
_t
*
)
p_this
;
sout_access_
out_sys_t
*
p_sys
=
p_access
->
p_sys
;
int
i
;
p_
acces
s
->
p_thread
->
b_die
=
1
;
p_
sy
s
->
p_thread
->
b_die
=
1
;
for
(
i
=
0
;
i
<
10
;
i
++
)
{
sout_buffer_t
*
p_dummy
;
p_dummy
=
sout_BufferNew
(
p_
sout
,
p_acces
s
->
i_mtu
);
p_dummy
=
sout_BufferNew
(
p_
access
->
p_sout
,
p_sy
s
->
i_mtu
);
p_dummy
->
i_dts
=
0
;
p_dummy
->
i_pts
=
0
;
p_dummy
->
i_length
=
0
;
sout_FifoPut
(
p_
acces
s
->
p_thread
->
p_fifo
,
p_dummy
);
sout_FifoPut
(
p_
sy
s
->
p_thread
->
p_fifo
,
p_dummy
);
}
vlc_thread_join
(
p_
acces
s
->
p_thread
);
vlc_thread_join
(
p_
sy
s
->
p_thread
);
sout_FifoDestroy
(
p_
sout
,
p_acces
s
->
p_thread
->
p_fifo
);
sout_FifoDestroy
(
p_
access
->
p_sout
,
p_sy
s
->
p_thread
->
p_fifo
);
if
(
p_
acces
s
->
p_buffer
)
if
(
p_
sy
s
->
p_buffer
)
{
sout_BufferDelete
(
p_
sout
,
p_acces
s
->
p_buffer
);
sout_BufferDelete
(
p_
access
->
p_sout
,
p_sy
s
->
p_buffer
);
}
#if defined( UNDER_CE )
CloseHandle
(
(
HANDLE
)
p_
acces
s
->
p_thread
->
i_handle
);
CloseHandle
(
(
HANDLE
)
p_
sy
s
->
p_thread
->
i_handle
);
#elif defined( WIN32 )
closesocket
(
p_
acces
s
->
p_thread
->
i_handle
);
closesocket
(
p_
sy
s
->
p_thread
->
i_handle
);
#else
close
(
p_
acces
s
->
p_thread
->
i_handle
);
close
(
p_
sy
s
->
p_thread
->
i_handle
);
#endif
msg_Info
(
p_sout
,
"Close"
);
free
(
p_sys
);
msg_Info
(
p_access
,
"Close"
);
}
/*****************************************************************************
* Read: standard read on a file descriptor.
*****************************************************************************/
static
int
Write
(
sout_
instance_t
*
p_sout
,
sout_buffer_t
*
p_buffer
)
static
int
Write
(
sout_
access_out_t
*
p_access
,
sout_buffer_t
*
p_buffer
)
{
sout_access_
data_t
*
p_access
=
(
sout_access_data_t
*
)
p_sout
->
p_access_data
;
sout_access_
out_sys_t
*
p_sys
=
p_access
->
p_sys
;
unsigned
int
i_write
;
while
(
p_buffer
)
{
sout_buffer_t
*
p_next
;
if
(
p_buffer
->
i_size
>
p_
acces
s
->
i_mtu
)
if
(
p_buffer
->
i_size
>
p_
sy
s
->
i_mtu
)
{
msg_Warn
(
p_
sout
,
"arggggggggggggg packet size > mtu"
);
i_write
=
p_
acces
s
->
i_mtu
;
msg_Warn
(
p_
access
,
"arggggggggggggg packet size > mtu"
);
i_write
=
p_
sy
s
->
i_mtu
;
}
else
{
...
...
@@ -280,70 +283,70 @@ static int Write( sout_instance_t *p_sout, sout_buffer_t *p_buffer )
}
/* if we have enough data, enque the buffer */
if
(
p_
acces
s
->
p_buffer
&&
p_
access
->
p_buffer
->
i_size
+
i_write
>
p_acces
s
->
i_mtu
)
if
(
p_
sy
s
->
p_buffer
&&
p_
sys
->
p_buffer
->
i_size
+
i_write
>
p_sy
s
->
i_mtu
)
{
sout_FifoPut
(
p_
access
->
p_thread
->
p_fifo
,
p_acces
s
->
p_buffer
);
p_
acces
s
->
p_buffer
=
NULL
;
sout_FifoPut
(
p_
sys
->
p_thread
->
p_fifo
,
p_sy
s
->
p_buffer
);
p_
sy
s
->
p_buffer
=
NULL
;
}
if
(
!
p_
acces
s
->
p_buffer
)
if
(
!
p_
sy
s
->
p_buffer
)
{
p_
access
->
p_buffer
=
sout_BufferNew
(
p_sout
,
p_acces
s
->
i_mtu
);
p_
acces
s
->
p_buffer
->
i_dts
=
p_buffer
->
i_dts
;
p_
acces
s
->
p_buffer
->
i_size
=
0
;
if
(
p_
acces
s
->
b_rtpts
)
p_
sys
->
p_buffer
=
sout_BufferNew
(
p_access
->
p_sout
,
p_sy
s
->
i_mtu
);
p_
sy
s
->
p_buffer
->
i_dts
=
p_buffer
->
i_dts
;
p_
sy
s
->
p_buffer
->
i_size
=
0
;
if
(
p_
sy
s
->
b_rtpts
)
{
mtime_t
i_timestamp
=
p_
acces
s
->
p_buffer
->
i_dts
*
9
/
100
;
mtime_t
i_timestamp
=
p_
sy
s
->
p_buffer
->
i_dts
*
9
/
100
;
/* add rtp/ts header */
p_
acces
s
->
p_buffer
->
p_buffer
[
0
]
=
0x80
;
p_
acces
s
->
p_buffer
->
p_buffer
[
1
]
=
0x21
;
// mpeg2-ts
p_
acces
s
->
p_buffer
->
p_buffer
[
2
]
=
(
p_
acces
s
->
i_sequence_number
>>
8
)
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
3
]
=
p_
acces
s
->
i_sequence_number
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
4
]
=
(
i_timestamp
>>
24
)
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
5
]
=
(
i_timestamp
>>
16
)
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
6
]
=
(
i_timestamp
>>
8
)
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
7
]
=
i_timestamp
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
8
]
=
(
p_
acces
s
->
i_ssrc
>>
24
)
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
9
]
=
(
p_
acces
s
->
i_ssrc
>>
16
)
&
0xff
;
p_
acces
s
->
p_buffer
->
p_buffer
[
10
]
=
(
p_
acces
s
->
i_ssrc
>>
8
)
&
0xff
;
p_
access
->
p_buffer
->
p_buffer
[
11
]
=
p_acces
s
->
i_ssrc
&
0xff
;
p_
acces
s
->
p_buffer
->
i_size
=
12
;
p_
sy
s
->
p_buffer
->
p_buffer
[
0
]
=
0x80
;
p_
sy
s
->
p_buffer
->
p_buffer
[
1
]
=
0x21
;
// mpeg2-ts
p_
sy
s
->
p_buffer
->
p_buffer
[
2
]
=
(
p_
sy
s
->
i_sequence_number
>>
8
)
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
3
]
=
p_
sy
s
->
i_sequence_number
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
4
]
=
(
i_timestamp
>>
24
)
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
5
]
=
(
i_timestamp
>>
16
)
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
6
]
=
(
i_timestamp
>>
8
)
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
7
]
=
i_timestamp
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
8
]
=
(
p_
sy
s
->
i_ssrc
>>
24
)
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
9
]
=
(
p_
sy
s
->
i_ssrc
>>
16
)
&
0xff
;
p_
sy
s
->
p_buffer
->
p_buffer
[
10
]
=
(
p_
sy
s
->
i_ssrc
>>
8
)
&
0xff
;
p_
sys
->
p_buffer
->
p_buffer
[
11
]
=
p_sy
s
->
i_ssrc
&
0xff
;
p_
sy
s
->
p_buffer
->
i_size
=
12
;
}
}
if
(
p_buffer
->
i_size
>
0
)
{
memcpy
(
p_
access
->
p_buffer
->
p_buffer
+
p_acces
s
->
p_buffer
->
i_size
,
memcpy
(
p_
sys
->
p_buffer
->
p_buffer
+
p_sy
s
->
p_buffer
->
i_size
,
p_buffer
->
p_buffer
,
i_write
);
p_
acces
s
->
p_buffer
->
i_size
+=
i_write
;
p_
sy
s
->
p_buffer
->
i_size
+=
i_write
;
}
p_next
=
p_buffer
->
p_next
;
sout_BufferDelete
(
p_sout
,
p_buffer
);
sout_BufferDelete
(
p_
access
->
p_
sout
,
p_buffer
);
p_buffer
=
p_next
;
}
return
(
p_
acces
s
->
p_thread
->
b_error
?
-
1
:
0
);
return
(
p_
sy
s
->
p_thread
->
b_error
?
-
1
:
0
);
}
/*****************************************************************************
* Seek: seek to a specific location in a file
*****************************************************************************/
static
int
Seek
(
sout_
instance_t
*
p_sout
,
off_t
i_pos
)
static
int
Seek
(
sout_
access_out_t
*
p_access
,
off_t
i_pos
)
{
msg_Err
(
p_
sout
,
"udp sout access cannot seek"
);
msg_Err
(
p_
access
,
"udp sout access cannot seek"
);
return
(
-
1
);
}
...
...
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