winlin

drop metadata when drop sequence header. support PCUC 0x1a

@@ -1463,7 +1463,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -1463,7 +1463,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
1463 srs_verbose("initialize shared ptr metadata success."); 1463 srs_verbose("initialize shared ptr metadata success.");
1464 1464
1465 // copy to all consumer 1465 // copy to all consumer
1466 - if (true) { 1466 + bool drop_for_reduce = false;
  1467 + if (cache_metadata && _srs_config->get_reduce_sequence_header(_req->vhost)) {
  1468 + drop_for_reduce = true;
  1469 + }
  1470 + if (!drop_for_reduce) {
1467 std::vector<SrsConsumer*>::iterator it; 1471 std::vector<SrsConsumer*>::iterator it;
1468 for (it = consumers.begin(); it != consumers.end(); ++it) { 1472 for (it = consumers.begin(); it != consumers.end(); ++it) {
1469 SrsConsumer* consumer = *it; 1473 SrsConsumer* consumer = *it;
@@ -2084,10 +2088,10 @@ void SrsSource::on_unpublish() @@ -2084,10 +2088,10 @@ void SrsSource::on_unpublish()
2084 hds->on_unpublish(); 2088 hds->on_unpublish();
2085 #endif 2089 #endif
2086 2090
2087 - // only clear the gop cache metadata,  
2088 - // donot clear the sequence header, for it maybe not changed. 2091 + // only clear the gop cache,
  2092 + // donot clear the sequence header, for it maybe not changed,
  2093 + // when drop dup sequence header, drop the metadata also.
2089 gop_cache->clear(); 2094 gop_cache->clear();
2090 - srs_freep(cache_metadata);  
2091 2095
2092 srs_info("clear cache/metadata when unpublish."); 2096 srs_info("clear cache/metadata when unpublish.");
2093 srs_trace("cleanup when unpublish"); 2097 srs_trace("cleanup when unpublish");
@@ -4240,10 +4240,22 @@ int SrsPlayPacket::get_message_type() @@ -4240,10 +4240,22 @@ int SrsPlayPacket::get_message_type()
4240 4240
4241 int SrsPlayPacket::get_size() 4241 int SrsPlayPacket::get_size()
4242 { 4242 {
4243 - return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()  
4244 - + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name)  
4245 - + SrsAmf0Size::number() + SrsAmf0Size::number()  
4246 - + SrsAmf0Size::boolean(); 4243 + int size = SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  4244 + + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name);
  4245 +
  4246 + if (start != -2 || duration != -1 || !reset) {
  4247 + size += SrsAmf0Size::number();
  4248 + }
  4249 +
  4250 + if (duration != -1 || !reset) {
  4251 + size += SrsAmf0Size::number();
  4252 + }
  4253 +
  4254 + if (!reset) {
  4255 + size += SrsAmf0Size::boolean();
  4256 + }
  4257 +
  4258 + return size;
4247 } 4259 }
4248 4260
4249 int SrsPlayPacket::encode_packet(SrsStream* stream) 4261 int SrsPlayPacket::encode_packet(SrsStream* stream)
@@ -4274,19 +4286,19 @@ int SrsPlayPacket::encode_packet(SrsStream* stream) @@ -4274,19 +4286,19 @@ int SrsPlayPacket::encode_packet(SrsStream* stream)
4274 } 4286 }
4275 srs_verbose("encode stream_name success."); 4287 srs_verbose("encode stream_name success.");
4276 4288
4277 - if ((ret = srs_amf0_write_number(stream, start)) != ERROR_SUCCESS) { 4289 + if ((start != -2 || duration != -1 || !reset) && (ret = srs_amf0_write_number(stream, start)) != ERROR_SUCCESS) {
4278 srs_error("encode start failed. ret=%d", ret); 4290 srs_error("encode start failed. ret=%d", ret);
4279 return ret; 4291 return ret;
4280 } 4292 }
4281 srs_verbose("encode start success."); 4293 srs_verbose("encode start success.");
4282 4294
4283 - if ((ret = srs_amf0_write_number(stream, duration)) != ERROR_SUCCESS) { 4295 + if ((duration != -1 || !reset) && (ret = srs_amf0_write_number(stream, duration)) != ERROR_SUCCESS) {
4284 srs_error("encode duration failed. ret=%d", ret); 4296 srs_error("encode duration failed. ret=%d", ret);
4285 return ret; 4297 return ret;
4286 } 4298 }
4287 srs_verbose("encode duration success."); 4299 srs_verbose("encode duration success.");
4288 4300
4289 - if ((ret = srs_amf0_write_boolean(stream, reset)) != ERROR_SUCCESS) { 4301 + if (!reset && (ret = srs_amf0_write_boolean(stream, reset)) != ERROR_SUCCESS) {
4290 srs_error("encode reset failed. ret=%d", ret); 4302 srs_error("encode reset failed. ret=%d", ret);
4291 return ret; 4303 return ret;
4292 } 4304 }
@@ -5117,14 +5129,29 @@ int SrsUserControlPacket::decode(SrsStream* stream) @@ -5117,14 +5129,29 @@ int SrsUserControlPacket::decode(SrsStream* stream)
5117 { 5129 {
5118 int ret = ERROR_SUCCESS; 5130 int ret = ERROR_SUCCESS;
5119 5131
5120 - if (!stream->require(6)) { 5132 + if (!stream->require(2)) {
5121 ret = ERROR_RTMP_MESSAGE_DECODE; 5133 ret = ERROR_RTMP_MESSAGE_DECODE;
5122 srs_error("decode user control failed. ret=%d", ret); 5134 srs_error("decode user control failed. ret=%d", ret);
5123 return ret; 5135 return ret;
5124 } 5136 }
5125 5137
5126 event_type = stream->read_2bytes(); 5138 event_type = stream->read_2bytes();
5127 - event_data = stream->read_4bytes(); 5139 +
  5140 + if (event_type == SrsPCUCFmsEvent0) {
  5141 + if (!stream->require(1)) {
  5142 + ret = ERROR_RTMP_MESSAGE_DECODE;
  5143 + srs_error("decode user control failed. ret=%d", ret);
  5144 + return ret;
  5145 + }
  5146 + event_data = stream->read_1bytes();
  5147 + } else {
  5148 + if (!stream->require(4)) {
  5149 + ret = ERROR_RTMP_MESSAGE_DECODE;
  5150 + srs_error("decode user control failed. ret=%d", ret);
  5151 + return ret;
  5152 + }
  5153 + event_data = stream->read_4bytes();
  5154 + }
5128 5155
5129 if (event_type == SrcPCUCSetBufferLength) { 5156 if (event_type == SrcPCUCSetBufferLength) {
5130 if (!stream->require(4)) { 5157 if (!stream->require(4)) {
@@ -5154,11 +5181,19 @@ int SrsUserControlPacket::get_message_type() @@ -5154,11 +5181,19 @@ int SrsUserControlPacket::get_message_type()
5154 5181
5155 int SrsUserControlPacket::get_size() 5182 int SrsUserControlPacket::get_size()
5156 { 5183 {
5157 - if (event_type == SrcPCUCSetBufferLength) {  
5158 - return 2 + 4 + 4; 5184 + int size = 2;
  5185 +
  5186 + if (event_type == SrsPCUCFmsEvent0) {
  5187 + size += 1;
5159 } else { 5188 } else {
5160 - return 2 + 4; 5189 + size += 4;
  5190 + }
  5191 +
  5192 + if (event_type == SrcPCUCSetBufferLength) {
  5193 + size += 4;
5161 } 5194 }
  5195 +
  5196 + return size;
5162 } 5197 }
5163 5198
5164 int SrsUserControlPacket::encode_packet(SrsStream* stream) 5199 int SrsUserControlPacket::encode_packet(SrsStream* stream)
@@ -5172,7 +5207,12 @@ int SrsUserControlPacket::encode_packet(SrsStream* stream) @@ -5172,7 +5207,12 @@ int SrsUserControlPacket::encode_packet(SrsStream* stream)
5172 } 5207 }
5173 5208
5174 stream->write_2bytes(event_type); 5209 stream->write_2bytes(event_type);
5175 - stream->write_4bytes(event_data); 5210 +
  5211 + if (event_type == SrsPCUCFmsEvent0) {
  5212 + stream->write_1bytes(event_data);
  5213 + } else {
  5214 + stream->write_4bytes(event_data);
  5215 + }
5176 5216
5177 // when event type is set buffer length, 5217 // when event type is set buffer length,
5178 // write the extra buffer length. 5218 // write the extra buffer length.
@@ -1991,6 +1991,13 @@ enum SrcPCUCEventType @@ -1991,6 +1991,13 @@ enum SrcPCUCEventType
1991 * kMsgPingRequest request. 1991 * kMsgPingRequest request.
1992 */ 1992 */
1993 SrcPCUCPingResponse = 0x07, 1993 SrcPCUCPingResponse = 0x07,
  1994 +
  1995 + /**
  1996 + * for PCUC size=3, the payload is "00 1A 01",
  1997 + * where we think the event is 0x001a, fms defined msg,
  1998 + * which has only 1bytes event data.
  1999 + */
  2000 + SrsPCUCFmsEvent0 = 0x1a,
1994 }; 2001 };
1995 2002
1996 /** 2003 /**
@@ -2019,6 +2026,11 @@ public: @@ -2019,6 +2026,11 @@ public:
2019 * @see: SrcPCUCEventType 2026 * @see: SrcPCUCEventType
2020 */ 2027 */
2021 int16_t event_type; 2028 int16_t event_type;
  2029 + /**
  2030 + * the event data generally in 4bytes.
  2031 + * @remark for event type is 0x001a, only 1bytes.
  2032 + * @see SrsPCUCFmsEvent0
  2033 + */
2022 int32_t event_data; 2034 int32_t event_data;
2023 /** 2035 /**
2024 * 4bytes if event_type is SetBufferLength; otherwise 0. 2036 * 4bytes if event_type is SetBufferLength; otherwise 0.