Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Steve Lhomme
VLC
Commits
775fa8a1
Commit
775fa8a1
authored
Sep 18, 2005
by
gbazin
Browse files
* modules/access/rtsp: real rtsp access module.
parent
369ccbef
Changes
12
Hide whitespace changes
Inline
Side-by-side
configure.ac
View file @
775fa8a1
...
...
@@ -2402,6 +2402,15 @@ if test "${enable_real}" = "yes"; then
VLC_ADD_PLUGINS([realaudio])
fi
dnl
dnl Real RTSP plugin
dnl
AC_ARG_ENABLE(realrtsp,
[ --enable-realrtsp Real RTSP module (default disabled)])
if test "${enable_realrtsp}" = "yes"; then
VLC_ADD_PLUGINS([access_realrtsp])
fi
dnl
dnl MP4 module
dnl
...
...
@@ -4653,6 +4662,7 @@ AC_CONFIG_FILES([
modules/access/pvr/Makefile
modules/access/v4l/Makefile
modules/access/cdda/Makefile
modules/access/rtsp/Makefile
modules/access/vcd/Makefile
modules/access/vcdx/Makefile
modules/access/screen/Makefile
...
...
modules/access/rtsp/Modules.am
0 → 100644
View file @
775fa8a1
SOURCES_access_realrtsp = \
access.c \
rtsp.c \
rtsp.h \
real.c \
real.h \
real_rmff.c \
real_rmff.h \
real_sdpplin.c \
real_sdpplin.h \
real_asmrp.c \
real_asmrp.h \
$(NULL)
modules/access/rtsp/access.c
0 → 100644
View file @
775fa8a1
/*****************************************************************************
* access.c: Real rtsp input
*****************************************************************************
* Copyright (C) 2005 VideoLAN
* $Id: file.c 10310 2005-03-11 22:36:40Z anil $
*
* Authors: Gildas Bazin <gbazin@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/input.h>
#include "network.h"
#include "rtsp.h"
#include "real.h"
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
#define CACHING_TEXT N_("Caching value (ms)")
#define CACHING_LONGTEXT N_( \
"Allows you to modify the default caching value for RTSP streams. This " \
"value should be set in millisecond units." )
vlc_module_begin
();
set_description
(
_
(
"Standard filesystem file input"
)
);
set_shortname
(
_
(
"Real RTSP"
)
);
set_category
(
CAT_INPUT
);
set_subcategory
(
SUBCAT_INPUT_ACCESS
);
add_integer
(
"realrtsp-caching"
,
3000
,
NULL
,
CACHING_TEXT
,
CACHING_LONGTEXT
,
VLC_TRUE
);
set_capability
(
"access2"
,
10
);
set_callbacks
(
Open
,
Close
);
add_shortcut
(
"realrtsp"
);
add_shortcut
(
"rtsp"
);
vlc_module_end
();
/*****************************************************************************
* Exported prototypes
*****************************************************************************/
static
block_t
*
BlockRead
(
access_t
*
);
static
int
Seek
(
access_t
*
,
int64_t
);
static
int
Control
(
access_t
*
,
int
,
va_list
);
struct
access_sys_t
{
vlc_bool_t
b_seekable
;
vlc_bool_t
b_pace_control
;
rtsp_client_t
*
p_rtsp
;
int
fd
;
block_t
*
p_header
;
};
/*****************************************************************************
* Network wrappers
*****************************************************************************/
static
int
RtspConnect
(
void
*
p_userdata
,
char
*
psz_server
,
int
i_port
)
{
access_t
*
p_access
=
(
access_t
*
)
p_userdata
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
/* Open connection */
p_sys
->
fd
=
net_OpenTCP
(
p_access
,
psz_server
,
i_port
);
if
(
p_sys
->
fd
<
0
)
{
msg_Err
(
p_access
,
"cannot connect to %s:%d"
,
psz_server
,
i_port
);
return
VLC_EGENERIC
;
}
return
VLC_SUCCESS
;
}
static
int
RtspDisconnect
(
void
*
p_userdata
)
{
access_t
*
p_access
=
(
access_t
*
)
p_userdata
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
net_Close
(
p_sys
->
fd
);
return
VLC_SUCCESS
;
}
static
int
RtspRead
(
void
*
p_userdata
,
uint8_t
*
p_buffer
,
int
i_buffer
)
{
access_t
*
p_access
=
(
access_t
*
)
p_userdata
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
return
net_Read
(
p_access
,
p_sys
->
fd
,
0
,
p_buffer
,
i_buffer
,
VLC_TRUE
);
}
static
int
RtspReadLine
(
void
*
p_userdata
,
uint8_t
*
p_buffer
,
int
i_buffer
)
{
access_t
*
p_access
=
(
access_t
*
)
p_userdata
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
char
*
psz
=
net_Gets
(
VLC_OBJECT
(
p_access
),
p_sys
->
fd
,
0
);
//fprintf(stderr, "ReadLine: %s\n", psz);
if
(
psz
)
strncpy
(
(
char
*
)
p_buffer
,
psz
,
i_buffer
);
else
*
p_buffer
=
0
;
if
(
psz
)
free
(
psz
);
return
0
;
}
static
int
RtspWrite
(
void
*
p_userdata
,
uint8_t
*
p_buffer
,
int
i_buffer
)
{
access_t
*
p_access
=
(
access_t
*
)
p_userdata
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
//fprintf(stderr, "Write: %s", p_buffer);
net_Printf
(
VLC_OBJECT
(
p_access
),
p_sys
->
fd
,
0
,
"%s"
,
p_buffer
);
return
0
;
}
/*****************************************************************************
* Open: open the rtsp connection
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
access_sys_t
*
p_sys
;
char
*
psz_server
=
0
;
int
i_result
;
if
(
!
p_access
->
b_force
)
return
VLC_EGENERIC
;
p_access
->
pf_read
=
NULL
;
p_access
->
pf_block
=
BlockRead
;
p_access
->
pf_seek
=
Seek
;
p_access
->
pf_control
=
Control
;
p_access
->
info
.
i_update
=
0
;
p_access
->
info
.
i_size
=
0
;
p_access
->
info
.
i_pos
=
0
;
p_access
->
info
.
b_eof
=
VLC_FALSE
;
p_access
->
info
.
i_title
=
0
;
p_access
->
info
.
i_seekpoint
=
0
;
p_access
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
access_sys_t
)
);
p_sys
->
p_rtsp
=
malloc
(
sizeof
(
rtsp_client_t
)
);
p_sys
->
p_header
=
0
;
p_sys
->
p_rtsp
->
p_userdata
=
p_access
;
p_sys
->
p_rtsp
->
pf_connect
=
RtspConnect
;
p_sys
->
p_rtsp
->
pf_disconnect
=
RtspDisconnect
;
p_sys
->
p_rtsp
->
pf_read
=
RtspRead
;
p_sys
->
p_rtsp
->
pf_read_line
=
RtspReadLine
;
p_sys
->
p_rtsp
->
pf_write
=
RtspWrite
;
i_result
=
rtsp_connect
(
p_sys
->
p_rtsp
,
p_access
->
psz_path
,
0
);
if
(
i_result
)
{
msg_Dbg
(
p_access
,
"could not connect to: %s"
,
p_access
->
psz_path
);
free
(
p_sys
->
p_rtsp
);
p_sys
->
p_rtsp
=
0
;
goto
error
;
}
msg_Dbg
(
p_access
,
"rtsp connected"
);
/* looking for server type */
if
(
rtsp_search_answers
(
p_sys
->
p_rtsp
,
"Server"
)
)
psz_server
=
strdup
(
rtsp_search_answers
(
p_sys
->
p_rtsp
,
"Server"
)
);
else
{
if
(
rtsp_search_answers
(
p_sys
->
p_rtsp
,
"RealChallenge1"
)
)
psz_server
=
strdup
(
"Real"
);
else
psz_server
=
strdup
(
"unknown"
);
}
if
(
strstr
(
psz_server
,
"Real"
)
||
strstr
(
psz_server
,
"Helix"
)
)
{
uint32_t
bandwidth
=
10485800
;
rmff_header_t
*
h
;
msg_Dbg
(
p_access
,
"found a real/helix rtsp server"
);
if
(
!
(
h
=
real_setup_and_get_header
(
p_sys
->
p_rtsp
,
bandwidth
))
)
{
/* Check if we got a redirect */
if
(
rtsp_search_answers
(
p_sys
->
p_rtsp
,
"Location"
)
)
{
msg_Dbg
(
p_access
,
"redirect: %s"
,
rtsp_search_answers
(
p_sys
->
p_rtsp
,
"Location"
)
);
msg_Warn
(
p_access
,
"redirect not supported"
);
goto
error
;
}
msg_Err
(
p_access
,
"rtsp session can not be established"
);
goto
error
;
}
p_sys
->
p_header
=
block_New
(
p_access
,
4096
);
p_sys
->
p_header
->
i_buffer
=
rmff_dump_header
(
h
,
p_sys
->
p_header
->
p_buffer
,
1024
);
}
else
{
msg_Dbg
(
p_access
,
"only real/helix rtsp servers supported for now"
);
goto
error
;
}
/* Update default_pts to a suitable value for file access */
var_Create
(
p_access
,
"realrtsp-caching"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
return
VLC_SUCCESS
;
error:
if
(
psz_server
)
free
(
psz_server
);
Close
(
p_this
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
* Close: close the target
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
if
(
p_sys
->
p_rtsp
)
rtsp_close
(
p_sys
->
p_rtsp
);
if
(
p_sys
->
p_rtsp
)
free
(
p_sys
->
p_rtsp
);
free
(
p_sys
);
}
/*****************************************************************************
* Read: standard read on a file descriptor.
*****************************************************************************/
static
block_t
*
BlockRead
(
access_t
*
p_access
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
block_t
*
p_block
;
if
(
p_sys
->
p_header
)
{
p_block
=
p_sys
->
p_header
;
p_sys
->
p_header
=
0
;
return
p_block
;
}
p_block
=
block_New
(
p_access
,
4096
);
p_block
->
i_buffer
=
real_get_rdt_chunk
(
p_access
->
p_sys
->
p_rtsp
,
&
p_block
->
p_buffer
);
return
p_block
;
}
/*****************************************************************************
* Seek: seek to a specific location in a file
*****************************************************************************/
static
int
Seek
(
access_t
*
p_access
,
int64_t
i_pos
)
{
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Control:
*****************************************************************************/
static
int
Control
(
access_t
*
p_access
,
int
i_query
,
va_list
args
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
vlc_bool_t
*
pb_bool
;
int
*
pi_int
;
int64_t
*
pi_64
;
switch
(
i_query
)
{
/* */
case
ACCESS_CAN_SEEK
:
case
ACCESS_CAN_FASTSEEK
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_FALSE
;
//p_sys->b_seekable;
break
;
case
ACCESS_CAN_PAUSE
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_FALSE
;
break
;
case
ACCESS_CAN_CONTROL_PACE
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_TRUE
;
//p_sys->b_pace_control;
break
;
/* */
case
ACCESS_GET_MTU
:
pi_int
=
(
int
*
)
va_arg
(
args
,
int
*
);
*
pi_int
=
0
;
break
;
case
ACCESS_GET_PTS_DELAY
:
pi_64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
*
pi_64
=
var_GetInteger
(
p_access
,
"realrtsp-caching"
)
*
1000
;
break
;
/* */
case
ACCESS_SET_PAUSE_STATE
:
/* Nothing to do */
break
;
case
ACCESS_GET_TITLE_INFO
:
case
ACCESS_SET_TITLE
:
case
ACCESS_SET_SEEKPOINT
:
case
ACCESS_SET_PRIVATE_ID_STATE
:
case
ACCESS_GET_META
:
return
VLC_EGENERIC
;
default:
msg_Warn
(
p_access
,
"unimplemented query in control"
);
return
VLC_EGENERIC
;
}
return
VLC_SUCCESS
;
}
modules/access/rtsp/real.c
0 → 100644
View file @
775fa8a1
/*****************************************************************************
* real.c: real rtsp input
*****************************************************************************
* Copyright (C) 2002-2004 the xine project
* Copyright (C) 2005 VideoLAN
* $Id: file.c 10310 2005-03-11 22:36:40Z anil $
*
* Authors: Gildas Bazin <gbazin@videolan.org>
* Adapted from xine which itself adapted it from joschkas real tools.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <vlc/vlc.h>
#include "rtsp.h"
#include "real.h"
#include "real_sdpplin.h"
const
unsigned
char
xor_table
[]
=
{
0x05
,
0x18
,
0x74
,
0xd0
,
0x0d
,
0x09
,
0x02
,
0x53
,
0xc0
,
0x01
,
0x05
,
0x05
,
0x67
,
0x03
,
0x19
,
0x70
,
0x08
,
0x27
,
0x66
,
0x10
,
0x10
,
0x72
,
0x08
,
0x09
,
0x63
,
0x11
,
0x03
,
0x71
,
0x08
,
0x08
,
0x70
,
0x02
,
0x10
,
0x57
,
0x05
,
0x18
,
0x54
,
0x00
,
0x00
,
0x00
};
#define BE_32(x) GetDWBE(x)
#define LE_32(x) GetDWLE(x)
#define BE_16(x) GetWBE(x)
#define LE_16(x) GetWLE(x)
#define BE_32C(x,y) do {uint32_t in=y; *(uint32_t *)(x)=GetDWBE(&in);} while(0)
#define LE_32C(x,y) do {uint32_t in=y; *(uint32_t *)(x)=GetDWLE(&in);} while(0)
#define MAX(x,y) ((x>y) ? x : y)
static
void
hash
(
char
*
field
,
char
*
param
)
{
uint32_t
a
,
b
,
c
,
d
;
/* fill variables */
a
=
LE_32
(
field
);
b
=
LE_32
(
field
+
4
);
c
=
LE_32
(
field
+
8
);
d
=
LE_32
(
field
+
12
);
lprintf
(
"hash input: %x %x %x %x
\n
"
,
a
,
b
,
c
,
d
);
lprintf
(
"hash parameter:
\n
"
);
a
=
((
b
&
c
)
|
(
~
b
&
d
))
+
LE_32
((
param
+
0x00
))
+
a
-
0x28955B88
;
a
=
((
a
<<
0x07
)
|
(
a
>>
0x19
))
+
b
;
d
=
((
a
&
b
)
|
(
~
a
&
c
))
+
LE_32
((
param
+
0x04
))
+
d
-
0x173848AA
;
d
=
((
d
<<
0x0c
)
|
(
d
>>
0x14
))
+
a
;
c
=
((
d
&
a
)
|
(
~
d
&
b
))
+
LE_32
((
param
+
0x08
))
+
c
+
0x242070DB
;
c
=
((
c
<<
0x11
)
|
(
c
>>
0x0f
))
+
d
;
b
=
((
c
&
d
)
|
(
~
c
&
a
))
+
LE_32
((
param
+
0x0c
))
+
b
-
0x3E423112
;
b
=
((
b
<<
0x16
)
|
(
b
>>
0x0a
))
+
c
;
a
=
((
b
&
c
)
|
(
~
b
&
d
))
+
LE_32
((
param
+
0x10
))
+
a
-
0x0A83F051
;
a
=
((
a
<<
0x07
)
|
(
a
>>
0x19
))
+
b
;
d
=
((
a
&
b
)
|
(
~
a
&
c
))
+
LE_32
((
param
+
0x14
))
+
d
+
0x4787C62A
;
d
=
((
d
<<
0x0c
)
|
(
d
>>
0x14
))
+
a
;
c
=
((
d
&
a
)
|
(
~
d
&
b
))
+
LE_32
((
param
+
0x18
))
+
c
-
0x57CFB9ED
;
c
=
((
c
<<
0x11
)
|
(
c
>>
0x0f
))
+
d
;
b
=
((
c
&
d
)
|
(
~
c
&
a
))
+
LE_32
((
param
+
0x1c
))
+
b
-
0x02B96AFF
;
b
=
((
b
<<
0x16
)
|
(
b
>>
0x0a
))
+
c
;
a
=
((
b
&
c
)
|
(
~
b
&
d
))
+
LE_32
((
param
+
0x20
))
+
a
+
0x698098D8
;
a
=
((
a
<<
0x07
)
|
(
a
>>
0x19
))
+
b
;
d
=
((
a
&
b
)
|
(
~
a
&
c
))
+
LE_32
((
param
+
0x24
))
+
d
-
0x74BB0851
;
d
=
((
d
<<
0x0c
)
|
(
d
>>
0x14
))
+
a
;
c
=
((
d
&
a
)
|
(
~
d
&
b
))
+
LE_32
((
param
+
0x28
))
+
c
-
0x0000A44F
;
c
=
((
c
<<
0x11
)
|
(
c
>>
0x0f
))
+
d
;
b
=
((
c
&
d
)
|
(
~
c
&
a
))
+
LE_32
((
param
+
0x2C
))
+
b
-
0x76A32842
;
b
=
((
b
<<
0x16
)
|
(
b
>>
0x0a
))
+
c
;
a
=
((
b
&
c
)
|
(
~
b
&
d
))
+
LE_32
((
param
+
0x30
))
+
a
+
0x6B901122
;
a
=
((
a
<<
0x07
)
|
(
a
>>
0x19
))
+
b
;
d
=
((
a
&
b
)
|
(
~
a
&
c
))
+
LE_32
((
param
+
0x34
))
+
d
-
0x02678E6D
;
d
=
((
d
<<
0x0c
)
|
(
d
>>
0x14
))
+
a
;
c
=
((
d
&
a
)
|
(
~
d
&
b
))
+
LE_32
((
param
+
0x38
))
+
c
-
0x5986BC72
;
c
=
((
c
<<
0x11
)
|
(
c
>>
0x0f
))
+
d
;
b
=
((
c
&
d
)
|
(
~
c
&
a
))
+
LE_32
((
param
+
0x3c
))
+
b
+
0x49B40821
;
b
=
((
b
<<
0x16
)
|
(
b
>>
0x0a
))
+
c
;
a
=
((
b
&
d
)
|
(
~
d
&
c
))
+
LE_32
((
param
+
0x04
))
+
a
-
0x09E1DA9E
;
a
=
((
a
<<
0x05
)
|
(
a
>>
0x1b
))
+
b
;
d
=
((
a
&
c
)
|
(
~
c
&
b
))
+
LE_32
((
param
+
0x18
))
+
d
-
0x3FBF4CC0
;
d
=
((
d
<<
0x09
)
|
(
d
>>
0x17
))
+
a
;
c
=
((
d
&
b
)
|
(
~
b
&
a
))
+
LE_32
((
param
+
0x2c
))
+
c
+
0x265E5A51
;
c
=
((
c
<<
0x0e
)
|
(
c
>>
0x12
))
+
d
;
b
=
((
c
&
a
)
|
(
~
a
&
d
))
+
LE_32
((
param
+
0x00
))
+
b
-
0x16493856
;
b
=
((
b
<<
0x14
)
|
(
b
>>
0x0c
))
+
c
;
a
=
((
b
&
d
)
|
(
~
d
&
c
))
+
LE_32
((
param
+
0x14
))
+
a
-
0x29D0EFA3
;
a
=
((
a
<<
0x05
)
|
(
a
>>
0x1b
))
+
b
;
d
=
((
a
&
c
)
|
(
~
c
&
b
))
+
LE_32
((
param
+
0x28
))
+
d
+
0x02441453
;
d
=
((
d
<<
0x09
)
|
(
d
>>
0x17
))
+
a
;
c
=
((
d
&
b
)
|
(
~
b
&
a
))
+
LE_32
((
param
+
0x3c
))
+
c
-
0x275E197F
;
c
=
((
c
<<
0x0e
)
|
(
c
>>
0x12
))
+
d
;
b
=
((
c
&
a
)
|
(
~
a
&
d
))
+
LE_32
((
param
+
0x10
))
+
b
-
0x182C0438
;
b
=
((
b
<<
0x14
)
|
(
b
>>
0x0c
))
+
c
;
a
=
((
b
&
d
)
|
(
~
d
&
c
))
+
LE_32
((
param
+
0x24
))
+
a
+
0x21E1CDE6
;
a
=
((
a
<<
0x05
)
|
(
a
>>
0x1b
))
+
b
;
d
=
((
a
&
c
)
|
(
~
c
&
b
))
+
LE_32
((
param
+
0x38
))
+
d
-
0x3CC8F82A
;
d
=
((
d
<<
0x09
)
|
(
d
>>
0x17
))
+
a
;
c
=
((
d
&
b
)
|
(
~
b
&
a
))
+
LE_32
((
param
+
0x0c
))
+
c
-
0x0B2AF279
;
c
=
((
c
<<
0x0e
)
|
(
c
>>
0x12
))
+
d
;
b
=
((
c
&
a
)
|
(
~
a
&
d
))
+
LE_32
((
param
+
0x20
))
+
b
+
0x455A14ED
;
b
=
((
b
<<
0x14
)
|
(
b
>>
0x0c
))
+
c
;
a
=
((
b
&
d
)
|
(
~
d
&
c
))
+
LE_32
((
param
+
0x34
))
+
a
-
0x561C16FB
;
a
=
((
a
<<
0x05
)
|
(
a
>>
0x1b
))
+
b
;
d
=
((
a
&
c
)
|
(
~
c
&
b
))
+
LE_32
((
param
+
0x08
))
+
d
-
0x03105C08
;
d
=
((
d
<<
0x09
)
|
(
d
>>
0x17
))
+
a
;
c
=
((
d
&
b
)
|
(
~
b
&
a
))
+
LE_32
((
param
+
0x1c
))
+
c
+
0x676F02D9
;
c
=
((
c
<<
0x0e
)
|
(
c
>>
0x12
))
+
d
;
b
=
((
c
&
a
)
|
(
~
a
&
d
))
+
LE_32
((
param
+
0x30
))
+
b
-
0x72D5B376
;
b
=
((
b
<<
0x14
)
|
(
b
>>
0x0c
))
+
c
;
a
=
(
b
^
c
^
d
)
+
LE_32
((
param
+
0x14
))
+
a
-
0x0005C6BE
;
a
=
((
a
<<
0x04
)
|
(
a
>>
0x1c
))
+
b
;
d
=
(
a
^
b
^
c
)
+
LE_32
((
param
+
0x20
))
+
d
-
0x788E097F
;
d
=
((
d
<<
0x0b
)
|
(
d
>>
0x15
))
+
a
;
c
=
(
d
^
a
^
b
)
+
LE_32
((
param
+
0x2c
))
+
c
+
0x6D9D6122
;
c
=
((
c
<<
0x10
)
|
(
c
>>
0x10
))
+
d
;
b
=
(
c
^
d
^
a
)
+
LE_32
((
param
+
0x38
))
+
b
-
0x021AC7F4
;
b
=
((
b
<<
0x17
)
|
(
b
>>
0x09
))
+
c
;
a
=
(
b
^
c
^
d
)
+
LE_32
((
param
+
0x04
))
+
a
-
0x5B4115BC
;
a
=
((
a
<<
0x04
)
|
(
a
>>
0x1c
))
+
b
;
d
=
(
a
^
b
^
c
)
+
LE_32
((
param
+
0x10
))
+
d
+
0x4BDECFA9
;
d
=
((
d
<<
0x0b
)
|
(
d
>>
0x15
))
+
a
;
c
=
(
d
^
a
^
b
)
+
LE_32
((
param
+
0x1c
))
+
c
-
0x0944B4A0
;
c
=
((
c
<<
0x10
)
|
(
c
>>
0x10
))
+
d
;
b
=
(
c
^
d
^
a
)
+
LE_32
((
param
+
0x28
))
+
b
-
0x41404390
;
b
=
((
b
<<
0x17
)
|
(
b
>>
0x09
))
+
c
;
a
=
(
b
^
c
^
d
)
+
LE_32
((
param
+
0x34
))
+
a
+
0x289B7EC6
;
a
=
((
a
<<
0x04
)
|
(
a
>>
0x1c
))
+
b
;
d
=
(
a
^
b
^
c
)
+
LE_32
((
param
+
0x00
))
+
d
-
0x155ED806
;
d
=
((
d
<<
0x0b
)
|
(
d
>>
0x15
))
+
a
;
c
=
(
d
^
a
^
b
)
+
LE_32
((
param
+
0x0c
))
+
c
-
0x2B10CF7B
;
c
=
((
c
<<
0x10
)
|
(
c
>>
0x10
))
+
d
;
b
=
(
c
^
d
^
a
)
+
LE_32
((
param
+
0x18
))
+
b
+
0x04881D05
;
b
=
((
b
<<
0x17
)
|
(
b
>>
0x09
))
+
c
;
a
=
(
b
^
c
^
d
)
+
LE_32
((
param
+
0x24
))
+
a
-
0x262B2FC7
;
a
=
((
a
<<
0x04
)
|
(
a
>>
0x1c
))
+
b
;
d
=
(
a
^
b
^
c
)
+
LE_32
((
param
+
0x30
))
+
d
-
0x1924661B
;
d
=
((
d
<<
0x0b
)
|
(
d
>>
0x15
))
+
a
;
c
=
(
d
^
a
^
b
)
+
LE_32
((
param
+
0x3c
))
+
c
+
0x1fa27cf8
;
c
=
((
c
<<
0x10
)
|
(
c
>>
0x10
))
+
d
;
b
=
(
c
^
d
^
a
)
+
LE_32
((
param
+
0x08
))
+
b
-
0x3B53A99B
;
b
=
((
b
<<
0x17
)
|
(
b
>>
0x09
))
+
c
;
a
=
((
~
d
|
b
)
^
c
)
+
LE_32
((
param
+
0x00
))
+
a
-
0x0BD6DDBC
;
a
=
((
a
<<
0x06
)
|
(
a
>>
0x1a
))
+
b
;
d
=
((
~
c
|
a
)
^
b
)
+
LE_32
((
param
+
0x1c
))
+
d
+
0x432AFF97
;
d
=
((
d
<<
0x0a
)
|
(
d
>>
0x16
))
+
a
;
c
=
((
~
b
|
d
)
^
a
)
+
LE_32
((
param
+
0x38
))
+
c
-
0x546BDC59
;
c
=
((
c
<<
0x0f
)
|
(
c
>>
0x11
))
+
d
;
b
=
((
~
a
|
c
)
^
d
)
+
LE_32
((
param
+
0x14
))
+
b
-
0x036C5FC7
;
b
=
((
b
<<
0x15
)
|
(
b
>>
0x0b
))
+
c
;
a
=
((
~
d
|
b
)
^
c
)
+
LE_32
((
param
+
0x30
))
+
a
+
0x655B59C3
;
a
=
((
a
<<
0x06
)
|
(
a
>>
0x1a
))
+
b
;
d
=
((
~
c
|
a
)
^
b
)
+
LE_32
((
param
+
0x0C
))
+
d
-
0x70F3336E
;
d
=
((
d
<<
0x0a
)
|
(
d
>>
0x16
))
+
a
;
c
=
((
~
b
|
d
)
^
a
)
+
LE_32
((
param
+
0x28
))
+
c
-
0x00100B83
;
c
=
((
c
<<
0x0f
)
|
(
c
>>
0x11
))
+
d
;
b
=
((
~
a
|
c
)
^
d
)
+
LE_32
((
param
+
0x04
))
+
b
-
0x7A7BA22F
;
b
=
((
b
<<
0x15
)
|
(
b
>>
0x0b
))
+
c
;
a
=
((
~
d
|
b
)
^
c
)
+
LE_32
((
param
+
0x20
))
+
a
+
0x6FA87E4F
;
a
=
((
a
<<
0x06
)
|
(
a
>>
0x1a
))
+
b
;
d
=
((
~
c
|
a
)
^
b
)
+
LE_32
((
param
+
0x3c
))
+
d
-
0x01D31920
;
d
=
((
d
<<
0x0a
)
|
(
d
>>
0x16
))
+
a
;
c
=
((
~
b
|
d
)
^
a
)
+
LE_32
((
param
+
0x18
))
+
c
-
0x5CFEBCEC
;
c
=
((
c
<<
0x0f
)
|
(
c
>>
0x11
))
+
d
;
b
=
((
~
a
|
c
)
^
d
)
+
LE_32
((
param
+
0x34
))
+
b
+
0x4E0811A1
;
b
=
((
b
<<
0x15
)
|
(
b
>>
0x0b
))
+
c
;
a
=
((
~
d
|
b
)
^
c
)
+
LE_32
((
param
+
0x10
))
+
a
-
0x08AC817E
;
a
=
((
a
<<
0x06
)
|
(
a
>>
0x1a
))
+
b
;
d
=
((
~
c
|
a
)
^
b
)
+
LE_32
((
param
+
0x2c
))
+
d
-
0x42C50DCB
;
d
=
((
d
<<
0x0a
)
|
(
d
>>
0x16
))
+
a
;
c
=
((
~
b
|
d
)
^
a
)
+
LE_32
((
param
+
0x08
))
+
c
+
0x2AD7D2BB
;
c
=
((
c
<<
0x0f
)
|
(
c
>>
0x11
))
+
d
;
b
=
((
~
a
|
c
)
^
d
)
+
LE_32
((
param
+
0x24
))
+
b
-
0x14792C6F
;
b
=
((
b
<<
0x15
)
|
(
b
>>
0x0b
))
+
c
;
lprintf
(
"hash output: %x %x %x %x
\n
"
,
a
,
b
,
c
,
d
);
a
+=
LE_32
(
field
);
b
+=
LE_32
(
field
+
4
);
c
+=
LE_32
(
field
+
8
);
d
+=
LE_32
(
field
+
12
);
LE_32C
(
field
,
a
);
LE_32C
(
field
+
4
,
b
);
LE_32C
(
field
+
8
,
c
);
LE_32C
(
field
+
12
,
d
);