胡斌

implement save meta,need more test

@@ -259,13 +259,35 @@ int SrsFlvSegment::write_metadata(SrsSharedPtrMessage* metadata) @@ -259,13 +259,35 @@ int SrsFlvSegment::write_metadata(SrsSharedPtrMessage* metadata)
259 } 259 }
260 260
261 // to flv file. 261 // to flv file.
262 - if ((ret = enc->write_metadata(18, payload, size)) != ERROR_SUCCESS) { 262 + if ((ret = enc->write_metadata(0, payload, size)) != ERROR_SUCCESS) {
263 return ret; 263 return ret;
264 } 264 }
265 265
266 return ret; 266 return ret;
267 } 267 }
268 268
  269 +int SrsFlvSegment::write_data(SrsSharedPtrMessage* shared_data)
  270 +{
  271 + int ret = ERROR_SUCCESS;
  272 +
  273 + SrsSharedPtrMessage* data = shared_data->copy();
  274 + SrsAutoFree(SrsSharedPtrMessage, data);
  275 +
  276 + if ((jitter->correct(data, jitter_algorithm)) != ERROR_SUCCESS) {
  277 + return ret;
  278 + }
  279 +
  280 + char* payload = data->payload;
  281 + int size = data->size;
  282 + int64_t timestamp = plan->filter_timestamp(data->timestamp);
  283 + if ((ret = enc->write_metadata( timestamp , payload, size)) != ERROR_SUCCESS) {
  284 + return ret;
  285 + }
  286 +
  287 +
  288 + return ret;
  289 +}
  290 +
269 int SrsFlvSegment::write_audio(SrsSharedPtrMessage* shared_audio) 291 int SrsFlvSegment::write_audio(SrsSharedPtrMessage* shared_audio)
270 { 292 {
271 int ret = ERROR_SUCCESS; 293 int ret = ERROR_SUCCESS;
@@ -291,6 +313,8 @@ int SrsFlvSegment::write_audio(SrsSharedPtrMessage* shared_audio) @@ -291,6 +313,8 @@ int SrsFlvSegment::write_audio(SrsSharedPtrMessage* shared_audio)
291 return ret; 313 return ret;
292 } 314 }
293 315
  316 +
  317 +
294 int SrsFlvSegment::write_video(SrsSharedPtrMessage* shared_video) 318 int SrsFlvSegment::write_video(SrsSharedPtrMessage* shared_video)
295 { 319 {
296 int ret = ERROR_SUCCESS; 320 int ret = ERROR_SUCCESS;
@@ -601,6 +625,17 @@ int SrsDvrPlan::on_meta_data(SrsSharedPtrMessage* shared_metadata) @@ -601,6 +625,17 @@ int SrsDvrPlan::on_meta_data(SrsSharedPtrMessage* shared_metadata)
601 return segment->write_metadata(shared_metadata); 625 return segment->write_metadata(shared_metadata);
602 } 626 }
603 627
  628 +int SrsDvrPlan::on_data(SrsSharedPtrMessage* shared_metadata)
  629 +{
  630 + int ret = ERROR_SUCCESS;
  631 +
  632 + if (!dvr_enabled) {
  633 + return ret;
  634 + }
  635 +
  636 + return segment->write_data(shared_metadata);
  637 +}
  638 +
604 int SrsDvrPlan::on_audio(SrsSharedPtrMessage* shared_audio) 639 int SrsDvrPlan::on_audio(SrsSharedPtrMessage* shared_audio)
605 { 640 {
606 int ret = ERROR_SUCCESS; 641 int ret = ERROR_SUCCESS;
@@ -1054,6 +1089,16 @@ int SrsDvr::on_meta_data(SrsOnMetaDataPacket* m) @@ -1054,6 +1089,16 @@ int SrsDvr::on_meta_data(SrsOnMetaDataPacket* m)
1054 return ret; 1089 return ret;
1055 } 1090 }
1056 1091
  1092 +int SrsDvr::on_data(SrsSharedPtrMessage* shared_data)
  1093 +{
  1094 + // the dvr for this stream is not actived.
  1095 + if (!actived) {
  1096 + return ERROR_SUCCESS;
  1097 + }
  1098 +
  1099 + return plan->on_data(shared_data);
  1100 +}
  1101 +
1057 int SrsDvr::on_audio(SrsSharedPtrMessage* shared_audio) 1102 int SrsDvr::on_audio(SrsSharedPtrMessage* shared_audio)
1058 { 1103 {
1059 // the dvr for this stream is not actived. 1104 // the dvr for this stream is not actived.
@@ -142,6 +142,10 @@ public: @@ -142,6 +142,10 @@ public:
142 */ 142 */
143 virtual int write_metadata(SrsSharedPtrMessage* metadata); 143 virtual int write_metadata(SrsSharedPtrMessage* metadata);
144 /** 144 /**
  145 + * @param shared_data, directly ptr, copy it if need to save it.
  146 + */
  147 + virtual int write_data(SrsSharedPtrMessage* shared_data);
  148 + /**
145 * @param shared_audio, directly ptr, copy it if need to save it. 149 * @param shared_audio, directly ptr, copy it if need to save it.
146 */ 150 */
147 virtual int write_audio(SrsSharedPtrMessage* shared_audio); 151 virtual int write_audio(SrsSharedPtrMessage* shared_audio);
@@ -222,6 +226,10 @@ public: @@ -222,6 +226,10 @@ public:
222 */ 226 */
223 virtual int on_meta_data(SrsSharedPtrMessage* shared_metadata); 227 virtual int on_meta_data(SrsSharedPtrMessage* shared_metadata);
224 /** 228 /**
  229 + * when got metadata.
  230 + */
  231 + virtual int on_data(SrsSharedPtrMessage* shared_metadata);
  232 + /**
225 * @param shared_audio, directly ptr, copy it if need to save it. 233 * @param shared_audio, directly ptr, copy it if need to save it.
226 */ 234 */
227 virtual int on_audio(SrsSharedPtrMessage* shared_audio); 235 virtual int on_audio(SrsSharedPtrMessage* shared_audio);
@@ -335,6 +343,11 @@ public: @@ -335,6 +343,11 @@ public:
335 */ 343 */
336 virtual int on_meta_data(SrsOnMetaDataPacket* m); 344 virtual int on_meta_data(SrsOnMetaDataPacket* m);
337 /** 345 /**
  346 + * the data packets to dvr.
  347 + * @param shared_data, directly ptr, copy it if need to save it.
  348 + */
  349 + virtual int on_data(SrsSharedPtrMessage* shared_data);
  350 + /**
338 * mux the audio packets to dvr. 351 * mux the audio packets to dvr.
339 * @param shared_audio, directly ptr, copy it if need to save it. 352 * @param shared_audio, directly ptr, copy it if need to save it.
340 */ 353 */
@@ -266,7 +266,7 @@ int SrsFlvStreamEncoder::write_video(int64_t timestamp, char* data, int size) @@ -266,7 +266,7 @@ int SrsFlvStreamEncoder::write_video(int64_t timestamp, char* data, int size)
266 266
267 int SrsFlvStreamEncoder::write_metadata(int64_t timestamp, char* data, int size) 267 int SrsFlvStreamEncoder::write_metadata(int64_t timestamp, char* data, int size)
268 { 268 {
269 - return enc->write_metadata(SrsCodecFlvTagScript, data, size); 269 + return enc->write_metadata(timestamp, data, size);
270 } 270 }
271 271
272 bool SrsFlvStreamEncoder::has_cache() 272 bool SrsFlvStreamEncoder::has_cache()
@@ -1298,6 +1298,7 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms @@ -1298,6 +1298,7 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms
1298 1298
1299 // process onMetaData 1299 // process onMetaData
1300 if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) { 1300 if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
  1301 +#if 0
1301 SrsPacket* pkt = NULL; 1302 SrsPacket* pkt = NULL;
1302 if ((ret = rtmp->decode_message(msg, &pkt)) != ERROR_SUCCESS) { 1303 if ((ret = rtmp->decode_message(msg, &pkt)) != ERROR_SUCCESS) {
1303 srs_error("decode onMetaData message failed. ret=%d", ret); 1304 srs_error("decode onMetaData message failed. ret=%d", ret);
@@ -1317,6 +1318,14 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms @@ -1317,6 +1318,14 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms
1317 1318
1318 srs_info("ignore AMF0/AMF3 data message."); 1319 srs_info("ignore AMF0/AMF3 data message.");
1319 return ret; 1320 return ret;
  1321 +#else
  1322 + if ((ret = source->on_data(msg)) != ERROR_SUCCESS) {
  1323 + srs_error("source process onMetaData message failed. ret=%d", ret);
  1324 + return ret;
  1325 + }
  1326 + srs_info("process onMetaData message success.");
  1327 + return ret;
  1328 +#endif
1320 } 1329 }
1321 1330
1322 return ret; 1331 return ret;
@@ -948,6 +948,31 @@ int SrsOriginHub::on_original_metadata(SrsOnMetaDataPacket* metadata) @@ -948,6 +948,31 @@ int SrsOriginHub::on_original_metadata(SrsOnMetaDataPacket* metadata)
948 return ret; 948 return ret;
949 } 949 }
950 950
  951 +int SrsOriginHub::on_original_data(SrsSharedPtrMessage* shared_data)
  952 +{
  953 + int ret = ERROR_SUCCESS;
  954 +
  955 +#ifdef SRS_AUTO_DVR
  956 + if (shared_data && (ret = dvr->on_data(shared_data)) != ERROR_SUCCESS) {
  957 + srs_error("dvr process onData message failed. ret=%d", ret);
  958 + return ret;
  959 + }
  960 +#endif
  961 +
  962 + // copy to all forwarders
  963 + if (true) {
  964 + std::vector<SrsForwarder*>::iterator it;
  965 + for (it = forwarders.begin(); it != forwarders.end(); ++it) {
  966 + SrsForwarder* forwarder = *it;
  967 + if ((ret = forwarder->on_meta_data(shared_data)) != ERROR_SUCCESS) {
  968 + srs_error("forwarder process onMetaData message failed. ret=%d", ret);
  969 + return ret;
  970 + }
  971 + }
  972 + }
  973 + return ret;
  974 +}
  975 +
951 int SrsOriginHub::on_meta_data(SrsSharedPtrMessage* shared_metadata) 976 int SrsOriginHub::on_meta_data(SrsSharedPtrMessage* shared_metadata)
952 { 977 {
953 int ret = ERROR_SUCCESS; 978 int ret = ERROR_SUCCESS;
@@ -1972,6 +1997,27 @@ bool SrsSource::can_publish(bool is_edge) @@ -1972,6 +1997,27 @@ bool SrsSource::can_publish(bool is_edge)
1972 return _can_publish; 1997 return _can_publish;
1973 } 1998 }
1974 1999
  2000 +
  2001 +int SrsSource::on_data(SrsCommonMessage* shared_data)
  2002 +{
  2003 + int ret = ERROR_SUCCESS;
  2004 + last_packet_time = shared_data->header.timestamp;
  2005 +
  2006 + // convert shared_audio to msg, user should not use shared_audio again.
  2007 + // the payload is transfer to msg, and set to NULL in shared_audio.
  2008 + SrsSharedPtrMessage msg;
  2009 + if ((ret = msg.create(shared_data)) != ERROR_SUCCESS) {
  2010 + srs_error("initialize the audio failed. ret=%d", ret);
  2011 + return ret;
  2012 + }
  2013 +
  2014 + // Notify hub about the original metadata.
  2015 + if ((ret = hub->on_original_data(&msg)) != ERROR_SUCCESS) {
  2016 + return ret;
  2017 + }
  2018 + return ret;
  2019 +}
  2020 +
1975 int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata) 2021 int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata)
1976 { 2022 {
1977 int ret = ERROR_SUCCESS; 2023 int ret = ERROR_SUCCESS;
@@ -1980,7 +2026,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -1980,7 +2026,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
1980 if ((ret = hub->on_original_metadata(metadata)) != ERROR_SUCCESS) { 2026 if ((ret = hub->on_original_metadata(metadata)) != ERROR_SUCCESS) {
1981 return ret; 2027 return ret;
1982 } 2028 }
1983 - 2029 +
1984 // if allow atc_auto and bravo-atc detected, open atc for vhost. 2030 // if allow atc_auto and bravo-atc detected, open atc for vhost.
1985 SrsAmf0Any* prop = NULL; 2031 SrsAmf0Any* prop = NULL;
1986 atc = _srs_config->get_atc(req->vhost); 2032 atc = _srs_config->get_atc(req->vhost);
@@ -2007,7 +2053,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -2007,7 +2053,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
2007 drop_for_reduce = true; 2053 drop_for_reduce = true;
2008 srs_warn("drop for reduce sh metadata, size=%d", msg->size); 2054 srs_warn("drop for reduce sh metadata, size=%d", msg->size);
2009 } 2055 }
2010 - 2056 +
2011 // copy to all consumer 2057 // copy to all consumer
2012 if (!drop_for_reduce) { 2058 if (!drop_for_reduce) {
2013 std::vector<SrsConsumer*>::iterator it; 2059 std::vector<SrsConsumer*>::iterator it;
@@ -458,6 +458,8 @@ public: @@ -458,6 +458,8 @@ public:
458 public: 458 public:
459 // When got a original metadata. 459 // When got a original metadata.
460 virtual int on_original_metadata(SrsOnMetaDataPacket* metadata); 460 virtual int on_original_metadata(SrsOnMetaDataPacket* metadata);
  461 + // When got a original metadata.
  462 + virtual int on_original_data(SrsSharedPtrMessage* shared_data);
461 // When got a parsed metadata. 463 // When got a parsed metadata.
462 virtual int on_meta_data(SrsSharedPtrMessage* shared_metadata); 464 virtual int on_meta_data(SrsSharedPtrMessage* shared_metadata);
463 // When got a parsed audio packet. 465 // When got a parsed audio packet.
@@ -645,6 +647,7 @@ public: @@ -645,6 +647,7 @@ public:
645 virtual bool can_publish(bool is_edge); 647 virtual bool can_publish(bool is_edge);
646 virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata); 648 virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata);
647 public: 649 public:
  650 + virtual int on_data(SrsCommonMessage* data);
648 virtual int on_audio(SrsCommonMessage* audio); 651 virtual int on_audio(SrsCommonMessage* audio);
649 private: 652 private:
650 virtual int on_audio_imp(SrsSharedPtrMessage* audio); 653 virtual int on_audio_imp(SrsSharedPtrMessage* audio);
@@ -420,13 +420,13 @@ int SrsFlvEncoder::write_header(char flv_header[9]) @@ -420,13 +420,13 @@ int SrsFlvEncoder::write_header(char flv_header[9])
420 return ret; 420 return ret;
421 } 421 }
422 422
423 -int SrsFlvEncoder::write_metadata(char type, char* data, int size) 423 +int SrsFlvEncoder::write_metadata(int64_t timestamp, char* data, int size)
424 { 424 {
425 int ret = ERROR_SUCCESS; 425 int ret = ERROR_SUCCESS;
426 426
427 srs_assert(data); 427 srs_assert(data);
428 428
429 - if ((ret = write_metadata_to_cache(type, data, size, tag_header)) != ERROR_SUCCESS) { 429 + if ((ret = write_metadata_to_cache(timestamp, data, size, tag_header)) != ERROR_SUCCESS) {
430 return ret; 430 return ret;
431 } 431 }
432 432
@@ -532,7 +532,7 @@ int SrsFlvEncoder::write_tags(SrsSharedPtrMessage** msgs, int count) @@ -532,7 +532,7 @@ int SrsFlvEncoder::write_tags(SrsSharedPtrMessage** msgs, int count)
532 return ret; 532 return ret;
533 } 533 }
534 } else { 534 } else {
535 - if ((ret = write_metadata_to_cache(SrsCodecFlvTagScript, msg->payload, msg->size, cache)) != ERROR_SUCCESS) { 535 + if ((ret = write_metadata_to_cache(msg->timestamp, msg->payload, msg->size, cache)) != ERROR_SUCCESS) {
536 return ret; 536 return ret;
537 } 537 }
538 } 538 }
@@ -567,7 +567,7 @@ int SrsFlvEncoder::write_tags(SrsSharedPtrMessage** msgs, int count) @@ -567,7 +567,7 @@ int SrsFlvEncoder::write_tags(SrsSharedPtrMessage** msgs, int count)
567 } 567 }
568 #endif 568 #endif
569 569
570 -int SrsFlvEncoder::write_metadata_to_cache(char type, char* data, int size, char* cache) 570 +int SrsFlvEncoder::write_metadata_to_cache(int64_t timestamp, char* data, int size, char* cache)
571 { 571 {
572 int ret = ERROR_SUCCESS; 572 int ret = ERROR_SUCCESS;
573 573
@@ -586,10 +586,11 @@ int SrsFlvEncoder::write_metadata_to_cache(char type, char* data, int size, char @@ -586,10 +586,11 @@ int SrsFlvEncoder::write_metadata_to_cache(char type, char* data, int size, char
586 if ((ret = tag_stream->initialize(cache, 11)) != ERROR_SUCCESS) { 586 if ((ret = tag_stream->initialize(cache, 11)) != ERROR_SUCCESS) {
587 return ret; 587 return ret;
588 } 588 }
589 - tag_stream->write_1bytes(type); 589 + tag_stream->write_1bytes(SrsCodecFlvTagScript);
590 tag_stream->write_3bytes(size); 590 tag_stream->write_3bytes(size);
591 - tag_stream->write_3bytes(0x00);  
592 - tag_stream->write_1bytes(0x00); 591 + tag_stream->write_3bytes((int32_t)timestamp);
  592 + // default to little-endian
  593 + tag_stream->write_1bytes((timestamp >> 24) & 0xFF);
593 tag_stream->write_3bytes(0x00); 594 tag_stream->write_3bytes(0x00);
594 595
595 return ret; 596 return ret;
@@ -469,14 +469,13 @@ public: @@ -469,14 +469,13 @@ public:
469 virtual int write_header(char flv_header[9]); 469 virtual int write_header(char flv_header[9]);
470 /** 470 /**
471 * write flv metadata. 471 * write flv metadata.
472 - * @param type, the type of data, or other message type.  
473 - * @see SrsCodecFlvTag 472 + * @param timestamp
474 * @param data, the amf0 metadata which serialize from: 473 * @param data, the amf0 metadata which serialize from:
475 * AMF0 string: onMetaData, 474 * AMF0 string: onMetaData,
476 * AMF0 object: the metadata object. 475 * AMF0 object: the metadata object.
477 * @remark assert data is not NULL. 476 * @remark assert data is not NULL.
478 */ 477 */
479 - virtual int write_metadata(char type, char* data, int size); 478 + virtual int write_metadata(int64_t timestamp, char* data, int size);
480 /** 479 /**
481 * write audio/video packet. 480 * write audio/video packet.
482 * @remark assert data is not NULL. 481 * @remark assert data is not NULL.
@@ -508,7 +507,7 @@ public: @@ -508,7 +507,7 @@ public:
508 virtual int write_tags(SrsSharedPtrMessage** msgs, int count); 507 virtual int write_tags(SrsSharedPtrMessage** msgs, int count);
509 #endif 508 #endif
510 private: 509 private:
511 - virtual int write_metadata_to_cache(char type, char* data, int size, char* cache); 510 + virtual int write_metadata_to_cache(int64_t timestamp, char* data, int size, char* cache);
512 virtual int write_audio_to_cache(int64_t timestamp, char* data, int size, char* cache); 511 virtual int write_audio_to_cache(int64_t timestamp, char* data, int size, char* cache);
513 virtual int write_video_to_cache(int64_t timestamp, char* data, int size, char* cache); 512 virtual int write_video_to_cache(int64_t timestamp, char* data, int size, char* cache);
514 virtual int write_pts_to_cache(int size, char* cache); 513 virtual int write_pts_to_cache(int size, char* cache);
@@ -1735,7 +1735,7 @@ int srs_flv_write_tag(srs_flv_t flv, char type, int32_t time, char* data, int si @@ -1735,7 +1735,7 @@ int srs_flv_write_tag(srs_flv_t flv, char type, int32_t time, char* data, int si
1735 } else if (type == SRS_RTMP_TYPE_VIDEO) { 1735 } else if (type == SRS_RTMP_TYPE_VIDEO) {
1736 return context->enc.write_video(time, data, size); 1736 return context->enc.write_video(time, data, size);
1737 } else { 1737 } else {
1738 - return context->enc.write_metadata(type, data, size); 1738 + return context->enc.write_metadata(time, data, size);
1739 } 1739 }
1740 1740
1741 return ret; 1741 return ret;
@@ -697,13 +697,29 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsBuffer* stream, @@ -697,13 +697,29 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsBuffer* stream,
697 int ret = ERROR_SUCCESS; 697 int ret = ERROR_SUCCESS;
698 698
699 SrsPacket* packet = NULL; 699 SrsPacket* packet = NULL;
700 - 700 + if (header.is_amf0_data() || header.is_amf3_data()) {
  701 + if (header.is_amf3_data() && stream->require(1)) {
  702 + srs_verbose("skip 1bytes to decode DATA3 ");
  703 + stream->skip(1);
  704 + }
  705 + std::string name;
  706 + if ((ret = srs_amf0_read_string(stream, name)) != ERROR_SUCCESS) {
  707 + srs_error(
  708 + "decode AMF0/AMF3 script name failed. message type:%d ret=%d",
  709 + header.message_type, ret);
  710 + return ret;
  711 + }
  712 + srs_verbose("do docode script data:%s", name);
  713 + *ppacket = packet = new SrsOnMetaDataPacket();
  714 + return ret;
  715 + }
  716 +
701 // decode specified packet type 717 // decode specified packet type
702 - if (header.is_amf0_command() || header.is_amf3_command() || header.is_amf0_data() || header.is_amf3_data()) { 718 + if (header.is_amf0_command() || header.is_amf3_command()) {
703 srs_verbose("start to decode AMF0/AMF3 command message."); 719 srs_verbose("start to decode AMF0/AMF3 command message.");
704 720
705 // skip 1bytes to decode the amf3 command. 721 // skip 1bytes to decode the amf3 command.
706 - if ((header.is_amf3_command() || header.is_amf3_data()) && stream->require(1)) { 722 + if (header.is_amf3_command() && stream->require(1)) {
707 srs_verbose("skip 1bytes to decode AMF3 command"); 723 srs_verbose("skip 1bytes to decode AMF3 command");
708 stream->skip(1); 724 stream->skip(1);
709 } 725 }
@@ -461,7 +461,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteMetadata) @@ -461,7 +461,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteMetadata)
461 }; 461 };
462 char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 }; 462 char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 };
463 463
464 - ASSERT_TRUE(ERROR_SUCCESS == enc.write_metadata(18, md, 8)); 464 + ASSERT_TRUE(ERROR_SUCCESS == enc.write_metadata(0, md, 8));
465 ASSERT_TRUE(11 + 8 + 4 == fs.offset); 465 ASSERT_TRUE(11 + 8 + 4 == fs.offset);
466 466
467 EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data, 11)); 467 EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data, 11));