winlin

refine config, check chunk size.

@@ -1180,6 +1180,8 @@ int SrsConfig::parse_file(const char* filename) @@ -1180,6 +1180,8 @@ int SrsConfig::parse_file(const char* filename)
1180 int SrsConfig::check_config() 1180 int SrsConfig::check_config()
1181 { 1181 {
1182 int ret = ERROR_SUCCESS; 1182 int ret = ERROR_SUCCESS;
  1183 +
  1184 + vector<SrsConfDirective*> vhosts = get_vhosts();
1183 1185
1184 //////////////////////////////////////////////////////////////////////// 1186 ////////////////////////////////////////////////////////////////////////
1185 // check empty 1187 // check empty
@@ -1256,7 +1258,6 @@ int SrsConfig::check_config() @@ -1256,7 +1258,6 @@ int SrsConfig::check_config()
1256 } 1258 }
1257 } 1259 }
1258 if (true) { 1260 if (true) {
1259 - vector<SrsConfDirective*> vhosts = get_vhosts();  
1260 for (int i = 0; i < (int)vhosts.size(); i++) { 1261 for (int i = 0; i < (int)vhosts.size(); i++) {
1261 SrsConfDirective* conf = vhosts[i]; 1262 SrsConfDirective* conf = vhosts[i];
1262 for (int i = 0; conf && i < (int)conf->directives.size(); i++) { 1263 for (int i = 0; conf && i < (int)conf->directives.size(); i++) {
@@ -1441,7 +1442,30 @@ int SrsConfig::check_config() @@ -1441,7 +1442,30 @@ int SrsConfig::check_config()
1441 return ret; 1442 return ret;
1442 } 1443 }
1443 1444
1444 - // TODO: FIXME: check others. 1445 + ////////////////////////////////////////////////////////////////////////
  1446 + // check chunk size
  1447 + ////////////////////////////////////////////////////////////////////////
  1448 + if (get_global_chunk_size() < SRS_CONSTS_RTMP_MIN_CHUNK_SIZE
  1449 + || get_global_chunk_size() > SRS_CONSTS_RTMP_MAX_CHUNK_SIZE
  1450 + ) {
  1451 + ret = ERROR_SYSTEM_CONFIG_INVALID;
  1452 + srs_error("directive chunk_size invalid, chunk_size=%d, must in [%d, %d], ret=%d",
  1453 + get_global_chunk_size(), SRS_CONSTS_RTMP_MIN_CHUNK_SIZE,
  1454 + SRS_CONSTS_RTMP_MAX_CHUNK_SIZE, ret);
  1455 + return ret;
  1456 + }
  1457 + for (int i = 0; i < (int)vhosts.size(); i++) {
  1458 + SrsConfDirective* vhost = vhosts[i];
  1459 + if (get_chunk_size(vhost->arg0()) < SRS_CONSTS_RTMP_MIN_CHUNK_SIZE
  1460 + || get_chunk_size(vhost->arg0()) > SRS_CONSTS_RTMP_MAX_CHUNK_SIZE
  1461 + ) {
  1462 + ret = ERROR_SYSTEM_CONFIG_INVALID;
  1463 + srs_error("directive vhost %s chunk_size invalid, chunk_size=%d, must in [%d, %d], ret=%d",
  1464 + vhost->arg0().c_str(), get_chunk_size(vhost->arg0()), SRS_CONSTS_RTMP_MIN_CHUNK_SIZE,
  1465 + SRS_CONSTS_RTMP_MAX_CHUNK_SIZE, ret);
  1466 + return ret;
  1467 + }
  1468 + }
1445 1469
1446 //////////////////////////////////////////////////////////////////////// 1470 ////////////////////////////////////////////////////////////////////////
1447 // check log name and level 1471 // check log name and level
@@ -1475,7 +1499,6 @@ int SrsConfig::check_config() @@ -1475,7 +1499,6 @@ int SrsConfig::check_config()
1475 srs_warn("http_api is disabled by configure"); 1499 srs_warn("http_api is disabled by configure");
1476 } 1500 }
1477 #endif 1501 #endif
1478 - vector<SrsConfDirective*> vhosts = get_vhosts();  
1479 for (int i = 0; i < (int)vhosts.size(); i++) { 1502 for (int i = 0; i < (int)vhosts.size(); i++) {
1480 SrsConfDirective* vhost = vhosts[i]; 1503 SrsConfDirective* vhost = vhosts[i];
1481 srs_assert(vhost != NULL); 1504 srs_assert(vhost != NULL);
@@ -49,6 +49,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -49,6 +49,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
49 #define SRS_CONSTS_RTMP_SRS_CHUNK_SIZE 60000 49 #define SRS_CONSTS_RTMP_SRS_CHUNK_SIZE 60000
50 // 6. Chunking, RTMP protocol default chunk size. 50 // 6. Chunking, RTMP protocol default chunk size.
51 #define SRS_CONSTS_RTMP_PROTOCOL_CHUNK_SIZE 128 51 #define SRS_CONSTS_RTMP_PROTOCOL_CHUNK_SIZE 128
  52 +
  53 +/**
  54 +* 6. Chunking
  55 +* The chunk size is configurable. It can be set using a control
  56 +* message(Set Chunk Size) as described in section 7.1. The maximum
  57 +* chunk size can be 65536 bytes and minimum 128 bytes. Larger values
  58 +* reduce CPU usage, but also commit to larger writes that can delay
  59 +* other content on lower bandwidth connections. Smaller chunks are not
  60 +* good for high-bit rate streaming. Chunk size is maintained
  61 +* independently for each direction.
  62 +*/
  63 +#define SRS_CONSTS_RTMP_MIN_CHUNK_SIZE 128
  64 +#define SRS_CONSTS_RTMP_MAX_CHUNK_SIZE 65536
  65 +
52 66
53 // the following is the timeout for rtmp protocol, 67 // the following is the timeout for rtmp protocol,
54 // to avoid death connection. 68 // to avoid death connection.
@@ -169,19 +169,6 @@ messages. @@ -169,19 +169,6 @@ messages.
169 ***************************************************************************** 169 *****************************************************************************
170 ****************************************************************************/ 170 ****************************************************************************/
171 /** 171 /**
172 -* 6. Chunking  
173 -* The chunk size is configurable. It can be set using a control  
174 -* message(Set Chunk Size) as described in section 7.1. The maximum  
175 -* chunk size can be 65536 bytes and minimum 128 bytes. Larger values  
176 -* reduce CPU usage, but also commit to larger writes that can delay  
177 -* other content on lower bandwidth connections. Smaller chunks are not  
178 -* good for high-bit rate streaming. Chunk size is maintained  
179 -* independently for each direction.  
180 -*/  
181 -#define RTMP_MIN_CHUNK_SIZE 128  
182 -#define RTMP_MAX_CHUNK_SIZE 65536  
183 -  
184 -/**  
185 * 6.1. Chunk Format 172 * 6.1. Chunk Format
186 * Extended timestamp: 0 or 4 bytes 173 * Extended timestamp: 0 or 4 bytes
187 * This field MUST be sent when the normal timsestamp is set to 174 * This field MUST be sent when the normal timsestamp is set to
@@ -3724,16 +3711,16 @@ int SrsSetChunkSizePacket::decode(SrsStream* stream) @@ -3724,16 +3711,16 @@ int SrsSetChunkSizePacket::decode(SrsStream* stream)
3724 chunk_size = stream->read_4bytes(); 3711 chunk_size = stream->read_4bytes();
3725 srs_info("decode chunk size success. chunk_size=%d", chunk_size); 3712 srs_info("decode chunk size success. chunk_size=%d", chunk_size);
3726 3713
3727 - if (chunk_size < RTMP_MIN_CHUNK_SIZE) { 3714 + if (chunk_size < SRS_CONSTS_RTMP_MIN_CHUNK_SIZE) {
3728 ret = ERROR_RTMP_CHUNK_SIZE; 3715 ret = ERROR_RTMP_CHUNK_SIZE;
3729 srs_error("invalid chunk size. min=%d, actual=%d, ret=%d", 3716 srs_error("invalid chunk size. min=%d, actual=%d, ret=%d",
3730 ERROR_RTMP_CHUNK_SIZE, chunk_size, ret); 3717 ERROR_RTMP_CHUNK_SIZE, chunk_size, ret);
3731 return ret; 3718 return ret;
3732 } 3719 }
3733 - if (chunk_size > RTMP_MAX_CHUNK_SIZE) { 3720 + if (chunk_size > SRS_CONSTS_RTMP_MAX_CHUNK_SIZE) {
3734 ret = ERROR_RTMP_CHUNK_SIZE; 3721 ret = ERROR_RTMP_CHUNK_SIZE;
3735 srs_error("invalid chunk size. max=%d, actual=%d, ret=%d", 3722 srs_error("invalid chunk size. max=%d, actual=%d, ret=%d",
3736 - RTMP_MAX_CHUNK_SIZE, chunk_size, ret); 3723 + SRS_CONSTS_RTMP_MAX_CHUNK_SIZE, chunk_size, ret);
3737 return ret; 3724 return ret;
3738 } 3725 }
3739 3726