mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-23 11:17:09 +08:00
Merge branch 'master' into dev
This commit is contained in:
commit
9cb5d82b04
@ -1 +1 @@
|
|||||||
Subproject commit 5d74e09b8c84cccc46036ed2ef1a62f670c423d4
|
Subproject commit b11582c38e8dbbb8d93ca9ce33c9a0b0cd58f59a
|
@ -39,6 +39,7 @@ option(ENABLE_FAAC "Enable FAAC" OFF)
|
|||||||
option(ENABLE_FFMPEG "Enable FFmpeg" OFF)
|
option(ENABLE_FFMPEG "Enable FFmpeg" OFF)
|
||||||
option(ENABLE_HLS "Enable HLS" ON)
|
option(ENABLE_HLS "Enable HLS" ON)
|
||||||
option(ENABLE_JEMALLOC_STATIC "Enable static linking to the jemalloc library" OFF)
|
option(ENABLE_JEMALLOC_STATIC "Enable static linking to the jemalloc library" OFF)
|
||||||
|
option(ENABLE_JEMALLOC_DUMP "Enable jemalloc to dump malloc statistics" OFF)
|
||||||
option(ENABLE_MEM_DEBUG "Enable Memory Debug" OFF)
|
option(ENABLE_MEM_DEBUG "Enable Memory Debug" OFF)
|
||||||
option(ENABLE_MP4 "Enable MP4" ON)
|
option(ENABLE_MP4 "Enable MP4" ON)
|
||||||
option(ENABLE_HLS_FMP4 "Enable HLS-FMP4" ON)
|
option(ENABLE_HLS_FMP4 "Enable HLS-FMP4" ON)
|
||||||
@ -335,7 +336,11 @@ if(ENABLE_JEMALLOC_STATIC)
|
|||||||
if(NOT EXISTS ${DEP_ROOT_DIR})
|
if(NOT EXISTS ${DEP_ROOT_DIR})
|
||||||
file(MAKE_DIRECTORY ${DEP_ROOT_DIR})
|
file(MAKE_DIRECTORY ${DEP_ROOT_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
if (ENABLE_JEMALLOC_DUMP)
|
||||||
|
set(ENABLE_JEMALLOC_STAT ON)
|
||||||
|
else ()
|
||||||
|
set(ENABLE_JEMALLOC_STAT OFF)
|
||||||
|
endif ()
|
||||||
include(Jemalloc)
|
include(Jemalloc)
|
||||||
include_directories(SYSTEM ${DEP_ROOT_DIR}/${JEMALLOC_NAME}/include/jemalloc)
|
include_directories(SYSTEM ${DEP_ROOT_DIR}/${JEMALLOC_NAME}/include/jemalloc)
|
||||||
link_directories(${DEP_ROOT_DIR}/${JEMALLOC_NAME}/lib)
|
link_directories(${DEP_ROOT_DIR}/${JEMALLOC_NAME}/lib)
|
||||||
@ -349,6 +354,12 @@ if(JEMALLOC_FOUND)
|
|||||||
message(STATUS "found library: ${JEMALLOC_LIBRARIES}")
|
message(STATUS "found library: ${JEMALLOC_LIBRARIES}")
|
||||||
include_directories(${JEMALLOC_INCLUDE_DIR})
|
include_directories(${JEMALLOC_INCLUDE_DIR})
|
||||||
update_cached_list(MK_LINK_LIBRARIES ${JEMALLOC_LIBRARIES})
|
update_cached_list(MK_LINK_LIBRARIES ${JEMALLOC_LIBRARIES})
|
||||||
|
add_definitions(-DUSE_JEMALLOC)
|
||||||
|
message(STATUS "jemalloc will be used to avoid memory fragmentation")
|
||||||
|
if (ENABLE_JEMALLOC_DUMP)
|
||||||
|
add_definitions(-DENABLE_JEMALLOC_DUMP)
|
||||||
|
message(STATUS "jemalloc will save memory usage statistics when the program exits")
|
||||||
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# 查找 openssl 是否安装
|
# 查找 openssl 是否安装
|
||||||
|
@ -1,21 +1,34 @@
|
|||||||
# Download and build Jemalloc
|
# Download and build Jemalloc
|
||||||
|
|
||||||
set(JEMALLOC_VERSION 5.2.1)
|
set(JEMALLOC_VERSION 5.3.0)
|
||||||
set(JEMALLOC_NAME jemalloc-${JEMALLOC_VERSION})
|
set(JEMALLOC_NAME jemalloc-${JEMALLOC_VERSION})
|
||||||
set(JEMALLOC_TAR_PATH ${DEP_ROOT_DIR}/${JEMALLOC_NAME}.tar.bz2)
|
set(JEMALLOC_TAR_PATH ${DEP_ROOT_DIR}/${JEMALLOC_NAME}.tar.bz2)
|
||||||
|
|
||||||
list(APPEND jemalloc_CONFIG_ARGS --disable-initial-exec-tls)
|
list(APPEND jemalloc_CONFIG_ARGS --disable-initial-exec-tls)
|
||||||
list(APPEND jemalloc_CONFIG_ARGS --without-export)
|
#list(APPEND jemalloc_CONFIG_ARGS --without-export)
|
||||||
|
if (ENABLE_JEMALLOC_STAT)
|
||||||
|
list(APPEND jemalloc_CONFIG_ARGS --enable-stats)
|
||||||
|
message(STATUS "Jemalloc stats enabled")
|
||||||
|
else ()
|
||||||
list(APPEND jemalloc_CONFIG_ARGS --disable-stats)
|
list(APPEND jemalloc_CONFIG_ARGS --disable-stats)
|
||||||
|
message(STATUS "Jemalloc stats disabled")
|
||||||
|
endif ()
|
||||||
list(APPEND jemalloc_CONFIG_ARGS --disable-libdl)
|
list(APPEND jemalloc_CONFIG_ARGS --disable-libdl)
|
||||||
#list(APPEND jemalloc_CONFIG_ARGS --disable-cxx)
|
#list(APPEND jemalloc_CONFIG_ARGS --disable-cxx)
|
||||||
#list(APPEND jemalloc_CONFIG_ARGS --with-jemalloc-prefix=je_)
|
#list(APPEND jemalloc_CONFIG_ARGS --with-jemalloc-prefix=je_)
|
||||||
#list(APPEND jemalloc_CONFIG_ARGS --enable-debug)
|
#list(APPEND jemalloc_CONFIG_ARGS --enable-debug)
|
||||||
|
|
||||||
if(NOT EXISTS ${JEMALLOC_TAR_PATH})
|
if(NOT EXISTS ${JEMALLOC_TAR_PATH})
|
||||||
message(STATUS "Downloading ${JEMALLOC_NAME}...")
|
set(JEMALLOC_URL https://github.com/jemalloc/jemalloc/releases/download/${JEMALLOC_VERSION}/${JEMALLOC_NAME}.tar.bz2)
|
||||||
file(DOWNLOAD https://github.com/jemalloc/jemalloc/releases/download/${JEMALLOC_VERSION}/${JEMALLOC_NAME}.tar.bz2
|
message(STATUS "Downloading ${JEMALLOC_NAME} from ${JEMALLOC_URL}")
|
||||||
${JEMALLOC_TAR_PATH})
|
file(DOWNLOAD ${JEMALLOC_URL} ${JEMALLOC_TAR_PATH} SHOW_PROGRESS STATUS JEMALLOC_DOWNLOAD_STATUS LOG JEMALLOC_DOWNLOAD_LOG)
|
||||||
|
list(GET JEMALLOC_DOWNLOAD_STATUS 0 JEMALLOC_DOWNLOAD_STATUS_CODE)
|
||||||
|
if(NOT JEMALLOC_DOWNLOAD_STATUS_CODE EQUAL 0)
|
||||||
|
file(REMOVE ${JEMALLOC_TAR_PATH})
|
||||||
|
message(STATUS "${JEMALLOC_DOWNLOAD_LOG}")
|
||||||
|
message(FATAL_ERROR "${JEMALLOC_NAME} download failed! error is ${JEMALLOC_DOWNLOAD_STATUS}")
|
||||||
|
return()
|
||||||
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
SET( DIR_CONTAINING_JEMALLOC ${DEP_ROOT_DIR}/${JEMALLOC_NAME} )
|
SET( DIR_CONTAINING_JEMALLOC ${DEP_ROOT_DIR}/${JEMALLOC_NAME} )
|
||||||
|
@ -244,7 +244,7 @@ forwarded_ip_header=
|
|||||||
#默认允许所有跨域请求
|
#默认允许所有跨域请求
|
||||||
allow_cross_domains=1
|
allow_cross_domains=1
|
||||||
#允许访问http api和http文件索引的ip地址范围白名单,置空情况下不做限制
|
#允许访问http api和http文件索引的ip地址范围白名单,置空情况下不做限制
|
||||||
allow_ip_range=127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255
|
allow_ip_range=::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255
|
||||||
|
|
||||||
[multicast]
|
[multicast]
|
||||||
#rtp组播截止组播ip地址
|
#rtp组播截止组播ip地址
|
||||||
|
144
default.pem
144
default.pem
@ -1,89 +1,89 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
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
|
||||||
-----END RSA PRIVATE KEY-----
|
-----END RSA PRIVATE KEY-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIGAjCCBOqgAwIBAgIQAiXv68Xco/vd9YeB4g3HLjANBgkqhkiG9w0BAQsFADBu
|
MIIGBTCCBO2gAwIBAgIQDNIYeWoFoT3jxF2+HmEbTDANBgkqhkiG9w0BAQsFADBu
|
||||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||||
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
|
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
|
||||||
RFYgVExTIENBIC0gRzEwHhcNMjIwOTE4MDAwMDAwWhcNMjMwOTE4MjM1OTU5WjAh
|
RFYgVExTIENBIC0gRzIwHhcNMjMwOTI4MDAwMDAwWhcNMjQwOTI3MjM1OTU5WjAh
|
||||||
MR8wHQYDVQQDExZkZWZhdWx0LnpsbWVkaWFraXQuY29tMIIBIjANBgkqhkiG9w0B
|
MR8wHQYDVQQDExZkZWZhdWx0LnpsbWVkaWFraXQuY29tMIIBIjANBgkqhkiG9w0B
|
||||||
AQEFAAOCAQ8AMIIBCgKCAQEAjTFnNz2btUHR/K8TegU2n06lXsQuW4AfsMGthBLv
|
AQEFAAOCAQ8AMIIBCgKCAQEAtgg0vsIc8bIMb9hAO1Lwq2TVNYMiD928WCVwq7Bj
|
||||||
nz2zdgL2uVxfRCuleoRpECEV9I80ibTXAJlouRLbnhLHto8gzyLeQue9/DtxTEGc
|
3B9LM8cifN+mBxHz35SeC9JnQysbKAf8VVfVi7GVzwFq4VaRreoIl8DoMbBORb2i
|
||||||
S7y2aMha0wAoUcOBv7tAITSnFepGHXoYgyU7HOCvn96U1bzqLTOhxOCH/xy003dw
|
KxfLXKEHS283bbl17csAYHTTBqFsKnO3kKvYoDHRKFX0T0rzZibI0ACQiylW+ALE
|
||||||
oEC7+PjldsWs/16cpvYiZV/dZvzDDKIpHSIvQy1whi6N0SDpzz/ncThn1z8xcJDx
|
3fVS0hFI8fmoZnIAOyQ15RLp7KPO4bMRVdZaOqRUZeW0YzbvOBeGZKbx3bXiscL9
|
||||||
0I1jVR76juP7TttbyhqJkO+fOlLn4yP9K5wZ/dPFJn2+bQRCrzGc4SM7J5YOq8ck
|
RwfGSxlFMCLahaJsBrVDo4/IGDRCmSydK8k/41MHd86pGPzCixBx7cqtKO/6+cVe
|
||||||
TTTbZtSp9yPpm7O5QyfdzePhOpRrjWroLsqaDOPV2UQlzwIDAQABo4IC5zCCAuMw
|
EuGxfJPfJVuxNq6vkRSt2HxCc6i2iagA2uL/WYdg3Pa/4wIDAQABo4IC6jCCAuYw
|
||||||
HwYDVR0jBBgwFoAUVXRPsnJP9WC6UNHX5lFcmgGHGtcwHQYDVR0OBBYEFPnRZrfz
|
HwYDVR0jBBgwFoAUeN+RkF/u3qz2xXXr1UxVU+8kSrYwHQYDVR0OBBYEFHmEMVp9
|
||||||
q/QAf5u4Xp4eGWvhMdvfMCEGA1UdEQQaMBiCFmRlZmF1bHQuemxtZWRpYWtpdC5j
|
9EHIPWA2U1iLKogCosGFMCEGA1UdEQQaMBiCFmRlZmF1bHQuemxtZWRpYWtpdC5j
|
||||||
b20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
|
b20wPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3
|
||||||
AjA+BgNVHSAENzA1MDMGBmeBDAECATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3
|
dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggr
|
||||||
LmRpZ2ljZXJ0LmNvbS9DUFMwgYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYY
|
BgEFBQcDAQYIKwYBBQUHAwIwgYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYY
|
||||||
aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEoGCCsGAQUFBzAChj5odHRwOi8vY2Fj
|
aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEoGCCsGAQUFBzAChj5odHRwOi8vY2Fj
|
||||||
ZXJ0cy5kaWdpY2VydC5jb20vRW5jcnlwdGlvbkV2ZXJ5d2hlcmVEVlRMU0NBLUcx
|
ZXJ0cy5kaWdpY2VydC5jb20vRW5jcnlwdGlvbkV2ZXJ5d2hlcmVEVlRMU0NBLUcy
|
||||||
LmNydDAJBgNVHRMEAjAAMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgDoPtDa
|
LmNydDAMBgNVHRMBAf8EAjAAMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgDu
|
||||||
PvUGNTLnVyi8iWvJA9PL0RFr7Otp4Xd9bQa9bgAAAYNQt3JvAAAEAwBHMEUCIEaO
|
zdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYravqonAAAEAwBHMEUC
|
||||||
G4ffzzaE6OMqiu6PUr+Y+wO2tsXCkGt1jt04Ix1qAiEAhNZwqFACieds1ZbY3r/p
|
IQDX+gqsd7I0yzjkhgp2YrccUlTx4wkFptFvmQxeChImRgIgJdgJa2Uamd790BCI
|
||||||
wlF3iFbhqp+kNfPzon7kwc8AdgA1zxkbv7FsV78PrUxtQsu7ticgJlHqP+Eq76gD
|
/CZwSqmRlor5eU8exAixdcopYpcAdwBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZ
|
||||||
wzvWTAAAAYNQt3JVAAAEAwBHMEUCIBOErqyKvihAEKItLWG/Plgtxh/hCTMsE+t5
|
u7+rOdiEcwAAAYravqqCAAAEAwBIMEYCIQCP6rkKg2FlF92CyMbVMk3ESh/9gVaM
|
||||||
+MfsAQLCAiEA76d50S4iy1wxya+8IUASVlKStaHNqBkJAS+Oadxs2sMAdwCzc3cH
|
tRsv5I//i5IVigIhAINHERhy7812wR47fwmvqWDjxyOB1ZodU7WA9D5L/1bVAHYA
|
||||||
4YRQ+GOG1gWp3BEJSnktsWcMC4fc8AMOeTalmgAAAYNQt3LIAAAEAwBIMEYCIQC/
|
2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGK2r6qQQAABAMARzBF
|
||||||
kfFCpwF76sw/Qx3sxR8b3srW+Ds0k/6VrIIDZcYV5gIhAKkLmuyeDvzulp0y4f0t
|
AiAiz3bp/j4SlnVxKg1HZY+YdUboi+kaKf5G8X6aFLIqUgIhAPPCm5UN05p7Oqrc
|
||||||
GDgIN/OoURq6CuHA67UJlsWzMA0GCSqGSIb3DQEBCwUAA4IBAQB0BwVxPRihSdPJ
|
sP/wdHDB7O/2AbUksYSLhidmwfmhMA0GCSqGSIb3DQEBCwUAA4IBAQBmaG51jU1E
|
||||||
FUPLQ+ClHy9O/UisnRD7NadQQtbcMXn6L9Lwd0f2la0ytLQAKHADOZDA08KfQ5qW
|
MsgT1VzutQUXglEvJGVf54cA+0TSfjfnP1n9ALdKjGxHL3KBh4UkPx5zdE5//FUX
|
||||||
B19OeQOlTwp2nhY2ZvoLEG+paeh0gYxIgD76APnd/m3g2H7GeW144ymjPcZRoldj
|
dacua6BQEWSCmMtYL0CFieFnLGXh0mgkfvRaP6+3xe6TkJ4kuyJkMS9YMDpVl80F
|
||||||
ZKYSdzStJJIFYXzL3FR9wjkMc4xOEes/IY5PFtj8OT8CFf7zl0R7L2Vcw9RGYi9u
|
2GLlE09EsZ3Xk9+SCpmWOPLOCDFURbwpc5ht+acROfzYJQyCY0L8EGbyL5/q9oMn
|
||||||
vLjGwwJW9kXTX8UlKXFyjJN0ZyrmxBQHq5uNtigx8xy6HtMnPsc58tp1IqitIELp
|
ugRGh4oyGvXgKvFIPzpZkaOmb0b63/uBc5JkiyQhuFdYaS2cLOwupXmCtIHL4Od6
|
||||||
HIur2XrRPBJA5XtpDg3AE8bXhRTM8oFMPL0UoSFWyWRYGgBo1Msc10dpXPtmbgIc
|
OU8/8smT8NEkD7d3lUijtc84q2TihW7ebT7RtOco49PDvFP/7w28QjxM8Ohv9/Gz
|
||||||
pPW8w+2c
|
Xyta8ICQVwmK
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
|
MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh
|
||||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
|
||||||
QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
|
MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT
|
||||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
||||||
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
|
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
|
||||||
MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
|
MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE
|
||||||
oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
|
eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv
|
||||||
lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
|
NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch
|
||||||
pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
|
QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn
|
||||||
yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
|
NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP
|
||||||
wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
|
ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI
|
||||||
pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
|
lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf
|
||||||
BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
|
BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw
|
||||||
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
|
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
|
||||||
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
|
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
|
||||||
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
|
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
|
||||||
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
|
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
|
||||||
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
|
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
|
||||||
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
|
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ
|
||||||
SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
|
L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi
|
||||||
M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
|
98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe
|
||||||
4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
|
xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN
|
||||||
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
|
GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2
|
||||||
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
|
n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
@ -108,7 +108,7 @@ static int cloneFunc(void *ptr) {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Process::run(const string &cmd, string &log_file) {
|
void Process::run(const string &cmd, string log_file) {
|
||||||
kill(2000);
|
kill(2000);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
STARTUPINFO si = { 0 };
|
STARTUPINFO si = { 0 };
|
||||||
|
@ -26,7 +26,7 @@ class Process {
|
|||||||
public:
|
public:
|
||||||
Process();
|
Process();
|
||||||
~Process();
|
~Process();
|
||||||
void run(const std::string &cmd, std::string &log_file);
|
void run(const std::string &cmd, std::string log_file);
|
||||||
void kill(int max_delay,bool force = false);
|
void kill(int max_delay,bool force = false);
|
||||||
bool wait(bool block = true);
|
bool wait(bool block = true);
|
||||||
int exit_code();
|
int exit_code();
|
||||||
|
@ -22,10 +22,11 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Common/JemallocUtil.h"
|
||||||
|
#include "Common/macros.h"
|
||||||
|
#include "System.h"
|
||||||
#include "Util/logger.h"
|
#include "Util/logger.h"
|
||||||
#include "Util/uv_errno.h"
|
#include "Util/uv_errno.h"
|
||||||
#include "System.h"
|
|
||||||
#include "Common/macros.h"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace toolkit;
|
using namespace toolkit;
|
||||||
@ -55,6 +56,16 @@ string System::execute(const string &cmd) {
|
|||||||
|
|
||||||
static constexpr int MAX_STACK_FRAMES = 128;
|
static constexpr int MAX_STACK_FRAMES = 128;
|
||||||
|
|
||||||
|
static void save_jemalloc_stats() {
|
||||||
|
string jemalloc_status = JemallocUtil::get_malloc_stats();
|
||||||
|
if (jemalloc_status.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ofstream out(StrPrinter << exeDir() << "/jemalloc.json", ios::out | ios::binary | ios::trunc);
|
||||||
|
out << jemalloc_status;
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
static void sig_crash(int sig) {
|
static void sig_crash(int sig) {
|
||||||
signal(sig, SIG_DFL);
|
signal(sig, SIG_DFL);
|
||||||
void *array[MAX_STACK_FRAMES];
|
void *array[MAX_STACK_FRAMES];
|
||||||
@ -149,6 +160,12 @@ void System::startDaemon(bool &kill_parent_if_failed) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void System::systemSetup(){
|
void System::systemSetup(){
|
||||||
|
|
||||||
|
#ifdef ENABLE_JEMALLOC_DUMP
|
||||||
|
//Save memory report when program exits
|
||||||
|
atexit(save_jemalloc_stats);
|
||||||
|
#endif //ENABLE_JEMALLOC_DUMP
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
struct rlimit rlim,rlim_new;
|
struct rlimit rlim,rlim_new;
|
||||||
if (getrlimit(RLIMIT_CORE, &rlim)==0) {
|
if (getrlimit(RLIMIT_CORE, &rlim)==0) {
|
||||||
|
74
src/Common/JemallocUtil.cpp
Normal file
74
src/Common/JemallocUtil.cpp
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by MIT license that can be found in the
|
||||||
|
* LICENSE file in the root of the source tree. All contributing project authors
|
||||||
|
* may be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "JemallocUtil.h"
|
||||||
|
#include "Util/logger.h"
|
||||||
|
#ifdef USE_JEMALLOC
|
||||||
|
#include <iostream>
|
||||||
|
#include <jemalloc/jemalloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace mediakit {
|
||||||
|
|
||||||
|
void set_profile_active(bool active) {
|
||||||
|
#ifdef USE_JEMALLOC
|
||||||
|
int err = mallctl("prof.active", nullptr, nullptr, (void *)&active, sizeof(active));
|
||||||
|
if (err != 0) {
|
||||||
|
WarnL << "mallctl failed with: " << err;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void JemallocUtil::enable_profiling() {
|
||||||
|
set_profile_active(true);
|
||||||
|
}
|
||||||
|
void JemallocUtil::disable_profiling() {
|
||||||
|
set_profile_active(false);
|
||||||
|
}
|
||||||
|
void JemallocUtil::dump(const std::string &file_name) {
|
||||||
|
#ifdef USE_JEMALLOC
|
||||||
|
auto *c_str = file_name.c_str();
|
||||||
|
int err = mallctl("prof.dump", nullptr, nullptr, &c_str, sizeof(const char *));
|
||||||
|
if (err != 0) {
|
||||||
|
std::cerr << "mallctl failed with: " << err << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
std::string JemallocUtil::get_malloc_stats() {
|
||||||
|
#ifdef USE_JEMALLOC
|
||||||
|
std::string res;
|
||||||
|
malloc_stats_print([](void *opaque, const char *s) { ((std::string *)opaque)->append(s); }, &res, "J");
|
||||||
|
return res;
|
||||||
|
#else
|
||||||
|
return "";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void JemallocUtil::some_malloc_stats(const std::function<void(const char *, uint64_t)> &fn) {
|
||||||
|
#ifdef USE_JEMALLOC
|
||||||
|
constexpr std::array<const char *, 8> STATS = {
|
||||||
|
"stats.allocated", "stats.active", "stats.metadata", "stats.metadata_thp",
|
||||||
|
"stats.resident", "stats.mapped", "stats.retained", "stats.zero_reallocs",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const char *stat : STATS) {
|
||||||
|
size_t value;
|
||||||
|
size_t len = sizeof(value);
|
||||||
|
auto err = mallctl(stat, &value, &len, nullptr, 0);
|
||||||
|
if (err != 0) {
|
||||||
|
ErrorL << "Failed reading " << stat << ": " << err;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
fn(stat, value);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
} // namespace mediakit
|
30
src/Common/JemallocUtil.h
Normal file
30
src/Common/JemallocUtil.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by MIT license that can be found in the
|
||||||
|
* LICENSE file in the root of the source tree. All contributing project authors
|
||||||
|
* may be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ZLMEDIAKIT_JEMALLOCUTIL_H
|
||||||
|
#define ZLMEDIAKIT_JEMALLOCUTIL_H
|
||||||
|
#include <functional>
|
||||||
|
#include <string>
|
||||||
|
namespace mediakit {
|
||||||
|
class JemallocUtil {
|
||||||
|
public:
|
||||||
|
JemallocUtil() = default;
|
||||||
|
~JemallocUtil() = default;
|
||||||
|
|
||||||
|
static void enable_profiling();
|
||||||
|
|
||||||
|
static void disable_profiling();
|
||||||
|
|
||||||
|
static void dump(const std::string &file_name);
|
||||||
|
static std::string get_malloc_stats();
|
||||||
|
static void some_malloc_stats(const std::function<void(const char *, uint64_t)> &fn);
|
||||||
|
};
|
||||||
|
} // namespace mediakit
|
||||||
|
#endif // ZLMEDIAKIT_JEMALLOCUTIL_H
|
@ -50,7 +50,7 @@ int64_t DeltaStamp::deltaStamp(int64_t stamp) {
|
|||||||
_last_stamp = stamp;
|
_last_stamp = stamp;
|
||||||
|
|
||||||
// 如果时间戳回退不多,那么返回负值,否则返回加1
|
// 如果时间戳回退不多,那么返回负值,否则返回加1
|
||||||
return -ret < MAX_CTS ? ret : 1;
|
return -ret < MAX_DELTA_STAMP ? ret : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stamp::setPlayBack(bool playback) {
|
void Stamp::setPlayBack(bool playback) {
|
||||||
|
@ -194,7 +194,7 @@ static onceToken token([]() {
|
|||||||
mINI::Instance()[kForbidCacheSuffix] = "";
|
mINI::Instance()[kForbidCacheSuffix] = "";
|
||||||
mINI::Instance()[kForwardedIpHeader] = "";
|
mINI::Instance()[kForwardedIpHeader] = "";
|
||||||
mINI::Instance()[kAllowCrossDomains] = 1;
|
mINI::Instance()[kAllowCrossDomains] = 1;
|
||||||
mINI::Instance()[kAllowIPRange] = "127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255";
|
mINI::Instance()[kAllowIPRange] = "::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255";
|
||||||
});
|
});
|
||||||
|
|
||||||
} // namespace Http
|
} // namespace Http
|
||||||
|
@ -61,7 +61,7 @@ bool HttpServerCookie::isExpired() {
|
|||||||
return _ticker.elapsedTime() > _max_elapsed * 1000;
|
return _ticker.elapsedTime() > _max_elapsed * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpServerCookie::setAttach(std::shared_ptr<void> attach) {
|
void HttpServerCookie::setAttach(toolkit::Any attach) {
|
||||||
_attach = std::move(attach);
|
_attach = std::move(attach);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,8 +114,7 @@ void HttpCookieManager::onManager() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpServerCookie::Ptr HttpCookieManager::addCookie(const string &cookie_name, const string &uid_in,
|
HttpServerCookie::Ptr HttpCookieManager::addCookie(const string &cookie_name, const string &uid_in, uint64_t max_elapsed, toolkit::Any attach, int max_client) {
|
||||||
uint64_t max_elapsed, std::shared_ptr<void> attach, int max_client) {
|
|
||||||
lock_guard<recursive_mutex> lck(_mtx_cookie);
|
lock_guard<recursive_mutex> lck(_mtx_cookie);
|
||||||
auto cookie = _generator.obtain();
|
auto cookie = _generator.obtain();
|
||||||
auto uid = uid_in.empty() ? cookie : uid_in;
|
auto uid = uid_in.empty() ? cookie : uid_in;
|
||||||
|
@ -85,14 +85,14 @@ public:
|
|||||||
/**
|
/**
|
||||||
* 设置附加数据
|
* 设置附加数据
|
||||||
*/
|
*/
|
||||||
void setAttach(std::shared_ptr<void> attach);
|
void setAttach(toolkit::Any attach);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 获取附加数据
|
* 获取附加数据
|
||||||
*/
|
*/
|
||||||
template <class T>
|
template <class T>
|
||||||
T& getAttach() {
|
T& getAttach() {
|
||||||
return *static_cast<T *>(_attach.get());
|
return _attach.get<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -104,7 +104,7 @@ private:
|
|||||||
std::string _cookie_uuid;
|
std::string _cookie_uuid;
|
||||||
uint64_t _max_elapsed;
|
uint64_t _max_elapsed;
|
||||||
toolkit::Ticker _ticker;
|
toolkit::Ticker _ticker;
|
||||||
std::shared_ptr<void> _attach;
|
toolkit::Any _attach;
|
||||||
std::weak_ptr<HttpCookieManager> _manager;
|
std::weak_ptr<HttpCookieManager> _manager;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
HttpServerCookie::Ptr addCookie(
|
HttpServerCookie::Ptr addCookie(
|
||||||
const std::string &cookie_name, const std::string &uid, uint64_t max_elapsed = COOKIE_DEFAULT_LIFE,
|
const std::string &cookie_name, const std::string &uid, uint64_t max_elapsed = COOKIE_DEFAULT_LIFE,
|
||||||
std::shared_ptr<void> attach = nullptr,
|
toolkit::Any = toolkit::Any{},
|
||||||
int max_client = 1);
|
int max_client = 1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,13 +31,16 @@ namespace mediakit {
|
|||||||
// 每次访问一次该cookie,那么将重新刷新cookie有效期
|
// 每次访问一次该cookie,那么将重新刷新cookie有效期
|
||||||
// 假如播放器在60秒内都未访问该cookie,那么将重新触发hls播放鉴权
|
// 假如播放器在60秒内都未访问该cookie,那么将重新触发hls播放鉴权
|
||||||
static int kHlsCookieSecond = 60;
|
static int kHlsCookieSecond = 60;
|
||||||
|
static int kFindSrcIntervalSecond = 3;
|
||||||
static const string kCookieName = "ZL_COOKIE";
|
static const string kCookieName = "ZL_COOKIE";
|
||||||
static const string kHlsSuffix = "/hls.m3u8";
|
static const string kHlsSuffix = "/hls.m3u8";
|
||||||
static const string kHlsFMP4Suffix = "/hls.fmp4.m3u8";
|
static const string kHlsFMP4Suffix = "/hls.fmp4.m3u8";
|
||||||
|
|
||||||
struct HttpCookieAttachment {
|
struct HttpCookieAttachment {
|
||||||
//是否已经查找到过MediaSource
|
// 是否已经查找到过MediaSource
|
||||||
bool _find_src = false;
|
bool _find_src = false;
|
||||||
|
// 查找MediaSource计时
|
||||||
|
Ticker _find_src_ticker;
|
||||||
//cookie生效作用域,本cookie只对该目录下的文件生效
|
//cookie生效作用域,本cookie只对该目录下的文件生效
|
||||||
string _path;
|
string _path;
|
||||||
//上次鉴权失败信息,为空则上次鉴权成功
|
//上次鉴权失败信息,为空则上次鉴权成功
|
||||||
@ -50,29 +53,69 @@ const string &HttpFileManager::getContentType(const char *name) {
|
|||||||
return HttpConst::getHttpContentType(name);
|
return HttpConst::getHttpContentType(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ntohll
|
namespace {
|
||||||
static uint64_t ntohll(uint64_t val) {
|
class UInt128 {
|
||||||
return (((uint64_t)ntohl(val)) << 32) + ntohl(val >> 32);
|
public:
|
||||||
}
|
UInt128() = default;
|
||||||
#endif
|
|
||||||
|
|
||||||
static uint64_t get_ip_uint64(const std::string &ip) {
|
UInt128(const struct sockaddr_storage &storage) {
|
||||||
|
_family = storage.ss_family;
|
||||||
|
memset(_bytes, 0, 16);
|
||||||
|
switch (storage.ss_family) {
|
||||||
|
case AF_INET: {
|
||||||
|
memcpy(_bytes, &(reinterpret_cast<const struct sockaddr_in &>(storage).sin_addr), 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AF_INET6: {
|
||||||
|
memcpy(_bytes, &(reinterpret_cast<const struct sockaddr_in6 &>(storage).sin6_addr), 16);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: CHECK(false, "Invalid socket family"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const UInt128 &that) const { return _family == that._family && !memcmp(_bytes, that._bytes, 16); }
|
||||||
|
|
||||||
|
bool operator<=(const UInt128 &that) const { return *this < that || *this == that; }
|
||||||
|
|
||||||
|
bool operator>=(const UInt128 &that) const { return *this > that || *this == that; }
|
||||||
|
|
||||||
|
bool operator>(const UInt128 &that) const { return that < *this; }
|
||||||
|
|
||||||
|
bool operator<(const UInt128 &that) const {
|
||||||
|
auto sz = _family == AF_INET ? 4 : 16;
|
||||||
|
for (int i = 0; i < sz; ++i) {
|
||||||
|
if (_bytes[i] < that._bytes[i]) {
|
||||||
|
return true;
|
||||||
|
} else if (_bytes[i] > that._bytes[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator bool() const { return _family != -1; }
|
||||||
|
|
||||||
|
bool same_type(const UInt128 &that) const { return _family == that._family; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _family = -1;
|
||||||
|
uint8_t _bytes[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static UInt128 get_ip_uint64(const std::string &ip) {
|
||||||
try {
|
try {
|
||||||
auto storage = SockUtil::make_sockaddr(ip.data(), 0);
|
return UInt128(SockUtil::make_sockaddr(ip.data(), 0));
|
||||||
if (storage.ss_family == AF_INET) {
|
|
||||||
return ntohl(reinterpret_cast<uint32_t &>(reinterpret_cast<struct sockaddr_in &>(storage).sin_addr));
|
|
||||||
}
|
|
||||||
if (storage.ss_family == AF_INET6) {
|
|
||||||
return ntohll(reinterpret_cast<uint64_t &>(reinterpret_cast<struct sockaddr_in6 &>(storage).sin6_addr));
|
|
||||||
}
|
|
||||||
} catch (std::exception &ex) {
|
} catch (std::exception &ex) {
|
||||||
WarnL << ex.what();
|
WarnL << ex.what();
|
||||||
}
|
}
|
||||||
return 0;
|
return UInt128();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HttpFileManager::isIPAllowed(const std::string &ip) {
|
bool HttpFileManager::isIPAllowed(const std::string &ip) {
|
||||||
using IPRangs = std::vector<std::pair<uint64_t /*min_ip*/, uint64_t /*max_ip*/>>;
|
using IPRangs = std::vector<std::pair<UInt128 /*min_ip*/, UInt128 /*max_ip*/>>;
|
||||||
GET_CONFIG_FUNC(IPRangs, allow_ip_range, Http::kAllowIPRange, [](const string &str) -> IPRangs {
|
GET_CONFIG_FUNC(IPRangs, allow_ip_range, Http::kAllowIPRange, [](const string &str) -> IPRangs {
|
||||||
IPRangs ret;
|
IPRangs ret;
|
||||||
auto vec = split(str, ",");
|
auto vec = split(str, ",");
|
||||||
@ -84,13 +127,17 @@ bool HttpFileManager::isIPAllowed(const std::string &ip) {
|
|||||||
if (range.size() == 2) {
|
if (range.size() == 2) {
|
||||||
auto ip_min = get_ip_uint64(trim(range[0]));
|
auto ip_min = get_ip_uint64(trim(range[0]));
|
||||||
auto ip_max = get_ip_uint64(trim(range[1]));
|
auto ip_max = get_ip_uint64(trim(range[1]));
|
||||||
if (ip_min && ip_max) {
|
if (ip_min && ip_max && ip_min.same_type(ip_max)) {
|
||||||
ret.emplace_back(ip_min, ip_max);
|
ret.emplace_back(ip_min, ip_max);
|
||||||
|
} else {
|
||||||
|
WarnL << "Invalid ip range or family: " << item;
|
||||||
}
|
}
|
||||||
} else if (range.size() == 1) {
|
} else if (range.size() == 1) {
|
||||||
auto ip = get_ip_uint64(trim(range[0]));
|
auto ip = get_ip_uint64(trim(range[0]));
|
||||||
if (ip) {
|
if (ip) {
|
||||||
ret.emplace_back(ip, ip);
|
ret.emplace_back(ip, ip);
|
||||||
|
} else {
|
||||||
|
WarnL << "Invalid ip: " << item;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
WarnL << "Invalid ip range: " << item;
|
WarnL << "Invalid ip range: " << item;
|
||||||
@ -104,7 +151,7 @@ bool HttpFileManager::isIPAllowed(const std::string &ip) {
|
|||||||
}
|
}
|
||||||
auto ip_int = get_ip_uint64(ip);
|
auto ip_int = get_ip_uint64(ip);
|
||||||
for (auto &range : allow_ip_range) {
|
for (auto &range : allow_ip_range) {
|
||||||
if (ip_int >= range.first && ip_int <= range.second) {
|
if (ip_int.same_type(range.first) && ip_int >= range.first && ip_int <= range.second) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -370,7 +417,9 @@ static void canAccessPath(Session &sender, const Parser &parser, const MediaInfo
|
|||||||
// hls相关信息
|
// hls相关信息
|
||||||
attach->_hls_data = std::make_shared<HlsCookieData>(media_info, info);
|
attach->_hls_data = std::make_shared<HlsCookieData>(media_info, info);
|
||||||
}
|
}
|
||||||
callback(err_msg, HttpCookieManager::Instance().addCookie(kCookieName, uid, life_second, attach));
|
toolkit::Any any;
|
||||||
|
any.set(std::move(attach));
|
||||||
|
callback(err_msg, HttpCookieManager::Instance().addCookie(kCookieName, uid, life_second, std::move(any)));
|
||||||
} else {
|
} else {
|
||||||
callback(err_msg, nullptr);
|
callback(err_msg, nullptr);
|
||||||
}
|
}
|
||||||
@ -488,14 +537,15 @@ static void accessFile(Session &sender, const Parser &parser, const MediaInfo &m
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto src = cookie->getAttach<HttpCookieAttachment>()._hls_data->getMediaSource();
|
auto &attach = cookie->getAttach<HttpCookieAttachment>();
|
||||||
|
auto src = attach._hls_data->getMediaSource();
|
||||||
if (src) {
|
if (src) {
|
||||||
//直接从内存获取m3u8索引文件(而不是从文件系统)
|
// 直接从内存获取m3u8索引文件(而不是从文件系统)
|
||||||
response_file(cookie, cb, file_path, parser, src->getIndexFile());
|
response_file(cookie, cb, file_path, parser, src->getIndexFile());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (cookie->getAttach<HttpCookieAttachment>()._find_src) {
|
if (attach._find_src && attach._find_src_ticker.elapsedTime() < kFindSrcIntervalSecond * 1000) {
|
||||||
//查找过MediaSource,但是流已经注销了,不用再查找
|
// 最近已经查找过MediaSource了,为了防止频繁查找导致占用全局互斥锁的问题,我们尝试直接从磁盘返回hls索引文件
|
||||||
response_file(cookie, cb, file_path, parser);
|
response_file(cookie, cb, file_path, parser);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -511,11 +561,14 @@ static void accessFile(Session &sender, const Parser &parser, const MediaInfo &m
|
|||||||
|
|
||||||
auto &attach = cookie->getAttach<HttpCookieAttachment>();
|
auto &attach = cookie->getAttach<HttpCookieAttachment>();
|
||||||
attach._hls_data->setMediaSource(hls);
|
attach._hls_data->setMediaSource(hls);
|
||||||
//添加HlsMediaSource的观看人数(HLS是按需生成的,这样可以触发HLS文件的生成)
|
// 添加HlsMediaSource的观看人数(HLS是按需生成的,这样可以触发HLS文件的生成)
|
||||||
attach._hls_data->addByteUsage(0);
|
attach._hls_data->addByteUsage(0);
|
||||||
//标记找到MediaSource
|
// 标记找到MediaSource
|
||||||
attach._find_src = true;
|
attach._find_src = true;
|
||||||
|
|
||||||
|
// 重置查找MediaSource计时
|
||||||
|
attach._find_src_ticker.resetTime();
|
||||||
|
|
||||||
// m3u8文件可能不存在, 等待m3u8索引文件按需生成
|
// m3u8文件可能不存在, 等待m3u8索引文件按需生成
|
||||||
hls->getIndexFile([response_file, file_path, cookie, cb, parser](const string &file) {
|
hls->getIndexFile([response_file, file_path, cookie, cb, parser](const string &file) {
|
||||||
response_file(cookie, cb, file_path, parser, file);
|
response_file(cookie, cb, file_path, parser, file);
|
||||||
|
@ -54,7 +54,10 @@ void FlvPlayer::onResponseCompleted(const SockException &ex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FlvPlayer::onResponseBody(const char *buf, size_t size) {
|
void FlvPlayer::onResponseBody(const char *buf, size_t size) {
|
||||||
|
if (!_benchmark_mode) {
|
||||||
|
// 性能测试模式不做数据解析,节省cpu
|
||||||
FlvSplitter::input(buf, size);
|
FlvSplitter::input(buf, size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FlvPlayer::onRecvMetadata(const AMFValue &metadata) {
|
bool FlvPlayer::onRecvMetadata(const AMFValue &metadata) {
|
||||||
@ -64,6 +67,7 @@ bool FlvPlayer::onRecvMetadata(const AMFValue &metadata) {
|
|||||||
void FlvPlayer::onRecvRtmpPacket(RtmpPacket::Ptr packet) {
|
void FlvPlayer::onRecvRtmpPacket(RtmpPacket::Ptr packet) {
|
||||||
if (!_play_result && !packet->isConfigFrame()) {
|
if (!_play_result && !packet->isConfigFrame()) {
|
||||||
_play_result = true;
|
_play_result = true;
|
||||||
|
_benchmark_mode = (*this)[Client::kBenchmarkMode].as<int>();
|
||||||
onPlayResult(SockException(Err_success, "play http-flv success"));
|
onPlayResult(SockException(Err_success, "play http-flv success"));
|
||||||
}
|
}
|
||||||
onRtmpPacket(std::move(packet));
|
onRtmpPacket(std::move(packet));
|
||||||
|
@ -40,6 +40,7 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool _play_result = false;
|
bool _play_result = false;
|
||||||
|
bool _benchmark_mode = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
using FlvPlayerImp = FlvPlayerBase<FlvPlayer>;
|
using FlvPlayerImp = FlvPlayerBase<FlvPlayer>;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
此目录下的所有.cpp文件将被编译成可执行程序(不包含此目录下的子目录).
|
此目录下的所有.cpp文件将被编译成可执行程序(不包含此目录下的子目录).
|
||||||
子目录DeviceHK为海康IPC的适配程序,需要先下载海康的SDK才能编译,
|
子目录DeviceHK为海康IPC的适配程序,需要先下载海康的SDK才能编译,
|
||||||
由于操作麻烦,所以仅把源码放在这仅供参考.
|
由于操作麻烦,所以仅把源码放在这里仅供参考.
|
||||||
|
|
||||||
- test_benchmark.cpp
|
- test_benchmark.cpp
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@
|
|||||||
var recvOnly = true;
|
var recvOnly = true;
|
||||||
var resArr = [];
|
var resArr = [];
|
||||||
|
|
||||||
var ishttps = 'https:' == document.location.protocol ? true : false;
|
var ishttps = 'https:' === document.location.protocol;
|
||||||
var isLocal = "file:" == document.location.protocol ? true : false;
|
var isLocal = "file:" === document.location.protocol;
|
||||||
|
|
||||||
const searchParams = new URL(document.location.href).searchParams;
|
const searchParams = new URL(document.location.href).searchParams;
|
||||||
let type = searchParams.get('type');
|
let type = searchParams.get('type');
|
||||||
@ -105,7 +105,7 @@
|
|||||||
const apiPath = `/index/api/webrtc?app=${searchParams.get('app') ?? 'live'}&stream=${searchParams.get('stream') ?? 'test'}&type=${type}`;
|
const apiPath = `/index/api/webrtc?app=${searchParams.get('app') ?? 'live'}&stream=${searchParams.get('stream') ?? 'test'}&type=${type}`;
|
||||||
|
|
||||||
if(!ishttps && !isLocal){
|
if(!ishttps && !isLocal){
|
||||||
alert('本demo需要在https的网站访问 ,如果你要推流的话(this demo must access in site of https if you want push stream)');
|
alert('本demo需要在https的网站访问, 如果你要推流的话(this demo must access in site of https if you want to push stream)');
|
||||||
}
|
}
|
||||||
|
|
||||||
const apiHost = isLocal ? "http://127.0.0.1" : `${document.location.protocol}//${window.location.host}`;
|
const apiHost = isLocal ? "http://127.0.0.1" : `${document.location.protocol}//${window.location.host}`;
|
||||||
|
Loading…
Reference in New Issue
Block a user