winlin

support decode onMetaData.

@@ -367,8 +367,8 @@ int srs_amf0_read_utf8(SrsStream* stream, std::string& value) @@ -367,8 +367,8 @@ int srs_amf0_read_utf8(SrsStream* stream, std::string& value)
367 char ch = *(str.data() + i); 367 char ch = *(str.data() + i);
368 if ((ch & 0x80) != 0) { 368 if ((ch & 0x80) != 0) {
369 ret = ERROR_RTMP_AMF0_DECODE; 369 ret = ERROR_RTMP_AMF0_DECODE;
370 - srs_error("only support utf8-1, 0x00-0x7F, actual is %#x. ret=%d", (int)ch, ret);  
371 - return ret; 370 + srs_error("ignored. only support utf8-1, 0x00-0x7F, actual is %#x. ret=%d", (int)ch, ret);
  371 + ret = ERROR_SUCCESS;
372 } 372 }
373 } 373 }
374 374
@@ -163,6 +163,22 @@ int SrsClient::streaming_publish() @@ -163,6 +163,22 @@ int SrsClient::streaming_publish()
163 163
164 SrsAutoFree(SrsMessage, msg, false); 164 SrsAutoFree(SrsMessage, msg, false);
165 165
  166 + // process onMetaData
  167 + if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
  168 + if ((ret = msg->decode_packet()) != ERROR_SUCCESS) {
  169 + srs_error("decode onMetaData message failed. ret=%d", ret);
  170 + return ret;
  171 + }
  172 +
  173 + SrsPacket* pkt = msg->get_packet();
  174 + if (dynamic_cast<SrsOnMetaDataPacket*>(pkt)) {
  175 + SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt);
  176 + }
  177 +
  178 + srs_trace("ignore AMF0/AMF3 data message.");
  179 + continue;
  180 + }
  181 +
166 // process UnPublish event. 182 // process UnPublish event.
167 if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) { 183 if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) {
168 if ((ret = msg->decode_packet()) != ERROR_SUCCESS) { 184 if ((ret = msg->decode_packet()) != ERROR_SUCCESS) {
@@ -177,6 +193,7 @@ int SrsClient::streaming_publish() @@ -177,6 +193,7 @@ int SrsClient::streaming_publish()
177 } 193 }
178 194
179 srs_trace("ignore AMF0/AMF3 command message."); 195 srs_trace("ignore AMF0/AMF3 command message.");
  196 + continue;
180 } 197 }
181 } 198 }
182 199
@@ -202,6 +202,8 @@ messages. @@ -202,6 +202,8 @@ messages.
202 #define RTMP_AMF0_COMMAND_UNPUBLISH "FCUnpublish" 202 #define RTMP_AMF0_COMMAND_UNPUBLISH "FCUnpublish"
203 #define RTMP_AMF0_COMMAND_PUBLISH "publish" 203 #define RTMP_AMF0_COMMAND_PUBLISH "publish"
204 #define RTMP_AMF0_DATA_SAMPLE_ACCESS "|RtmpSampleAccess" 204 #define RTMP_AMF0_DATA_SAMPLE_ACCESS "|RtmpSampleAccess"
  205 +#define RTMP_AMF0_DATA_SET_DATAFRAME "@setDataFrame"
  206 +#define RTMP_AMF0_DATA_ON_METADATA "onMetaData"
205 207
206 /**************************************************************************** 208 /****************************************************************************
207 ***************************************************************************** 209 *****************************************************************************
@@ -861,11 +863,21 @@ bool SrsMessageHeader::is_amf0_command() @@ -861,11 +863,21 @@ bool SrsMessageHeader::is_amf0_command()
861 return message_type == RTMP_MSG_AMF0CommandMessage; 863 return message_type == RTMP_MSG_AMF0CommandMessage;
862 } 864 }
863 865
  866 +bool SrsMessageHeader::is_amf0_data()
  867 +{
  868 + return message_type == RTMP_MSG_AMF0DataMessage;
  869 +}
  870 +
864 bool SrsMessageHeader::is_amf3_command() 871 bool SrsMessageHeader::is_amf3_command()
865 { 872 {
866 return message_type == RTMP_MSG_AMF3CommandMessage; 873 return message_type == RTMP_MSG_AMF3CommandMessage;
867 } 874 }
868 875
  876 +bool SrsMessageHeader::is_amf3_data()
  877 +{
  878 + return message_type == RTMP_MSG_AMF3DataMessage;
  879 +}
  880 +
869 bool SrsMessageHeader::is_window_ackledgement_size() 881 bool SrsMessageHeader::is_window_ackledgement_size()
870 { 882 {
871 return message_type == RTMP_MSG_WindowAcknowledgementSize; 883 return message_type == RTMP_MSG_WindowAcknowledgementSize;
@@ -931,7 +943,7 @@ int SrsMessage::decode_packet() @@ -931,7 +943,7 @@ int SrsMessage::decode_packet()
931 srs_verbose("decode stream initialized success"); 943 srs_verbose("decode stream initialized success");
932 944
933 // decode specified packet type 945 // decode specified packet type
934 - if (header.is_amf0_command() || header.is_amf3_command()) { 946 + if (header.is_amf0_command() || header.is_amf3_command() || header.is_amf0_data() || header.is_amf3_data()) {
935 srs_verbose("start to decode AMF0/AMF3 command message."); 947 srs_verbose("start to decode AMF0/AMF3 command message.");
936 948
937 // skip 1bytes to decode the amf3 command. 949 // skip 1bytes to decode the amf3 command.
@@ -984,6 +996,10 @@ int SrsMessage::decode_packet() @@ -984,6 +996,10 @@ int SrsMessage::decode_packet()
984 srs_info("decode the AMF0/AMF3 command(unpublish message)."); 996 srs_info("decode the AMF0/AMF3 command(unpublish message).");
985 packet = new SrsFMLEStartPacket(); 997 packet = new SrsFMLEStartPacket();
986 return packet->decode(stream); 998 return packet->decode(stream);
  999 + } else if(command == RTMP_AMF0_DATA_SET_DATAFRAME || command == RTMP_AMF0_DATA_ON_METADATA) {
  1000 + srs_info("decode the AMF0/AMF3 data(onMetaData message).");
  1001 + packet = new SrsOnMetaDataPacket();
  1002 + return packet->decode(stream);
987 } 1003 }
988 1004
989 // default packet to drop message. 1005 // default packet to drop message.
@@ -1255,7 +1271,6 @@ int SrsConnectAppResPacket::encode_packet(SrsStream* stream) @@ -1255,7 +1271,6 @@ int SrsConnectAppResPacket::encode_packet(SrsStream* stream)
1255 } 1271 }
1256 srs_verbose("encode info success."); 1272 srs_verbose("encode info success.");
1257 1273
1258 -  
1259 srs_info("encode connect app response packet success."); 1274 srs_info("encode connect app response packet success.");
1260 1275
1261 return ret; 1276 return ret;
@@ -1881,6 +1896,81 @@ int SrsSampleAccessPacket::encode_packet(SrsStream* stream) @@ -1881,6 +1896,81 @@ int SrsSampleAccessPacket::encode_packet(SrsStream* stream)
1881 return ret; 1896 return ret;
1882 } 1897 }
1883 1898
  1899 +SrsOnMetaDataPacket::SrsOnMetaDataPacket()
  1900 +{
  1901 + name = RTMP_AMF0_DATA_ON_METADATA;
  1902 + metadata = new SrsAmf0Object();
  1903 +}
  1904 +
  1905 +SrsOnMetaDataPacket::~SrsOnMetaDataPacket()
  1906 +{
  1907 + srs_freep(metadata);
  1908 +}
  1909 +
  1910 +int SrsOnMetaDataPacket::decode(SrsStream* stream)
  1911 +{
  1912 + int ret = ERROR_SUCCESS;
  1913 +
  1914 + if ((ret = srs_amf0_read_string(stream, name)) != ERROR_SUCCESS) {
  1915 + srs_error("decode metadata name failed. ret=%d", ret);
  1916 + return ret;
  1917 + }
  1918 +
  1919 + // ignore the @setDataFrame
  1920 + if (name == RTMP_AMF0_DATA_SET_DATAFRAME) {
  1921 + if ((ret = srs_amf0_read_string(stream, name)) != ERROR_SUCCESS) {
  1922 + srs_error("decode metadata name failed. ret=%d", ret);
  1923 + return ret;
  1924 + }
  1925 + }
  1926 +
  1927 + srs_verbose("decode metadata name success. name=%s", name.c_str());
  1928 +
  1929 + if ((ret = srs_amf0_read_object(stream, metadata)) != ERROR_SUCCESS) {
  1930 + srs_error("decode metadata metadata failed. ret=%d", ret);
  1931 + return ret;
  1932 + }
  1933 +
  1934 + srs_info("decode metadata success");
  1935 +
  1936 + return ret;
  1937 +}
  1938 +
  1939 +int SrsOnMetaDataPacket::get_perfer_cid()
  1940 +{
  1941 + return RTMP_CID_OverConnection2;
  1942 +}
  1943 +
  1944 +int SrsOnMetaDataPacket::get_message_type()
  1945 +{
  1946 + return RTMP_MSG_AMF0DataMessage;
  1947 +}
  1948 +
  1949 +int SrsOnMetaDataPacket::get_size()
  1950 +{
  1951 + return srs_amf0_get_string_size(name) + srs_amf0_get_object_size(metadata);
  1952 +}
  1953 +
  1954 +int SrsOnMetaDataPacket::encode_packet(SrsStream* stream)
  1955 +{
  1956 + int ret = ERROR_SUCCESS;
  1957 +
  1958 + if ((ret = srs_amf0_write_string(stream, name)) != ERROR_SUCCESS) {
  1959 + srs_error("encode name failed. ret=%d", ret);
  1960 + return ret;
  1961 + }
  1962 + srs_verbose("encode name success.");
  1963 +
  1964 + if ((ret = srs_amf0_write_object(stream, metadata)) != ERROR_SUCCESS) {
  1965 + srs_error("encode metadata failed. ret=%d", ret);
  1966 + return ret;
  1967 + }
  1968 + srs_verbose("encode metadata success.");
  1969 +
  1970 + srs_info("encode onMetaData packet success.");
  1971 + return ret;
  1972 +}
  1973 +
1884 SrsSetWindowAckSizePacket::SrsSetWindowAckSizePacket() 1974 SrsSetWindowAckSizePacket::SrsSetWindowAckSizePacket()
1885 { 1975 {
1886 ackowledgement_window_size = 0; 1976 ackowledgement_window_size = 0;
@@ -180,7 +180,9 @@ struct SrsMessageHeader @@ -180,7 +180,9 @@ struct SrsMessageHeader
180 virtual ~SrsMessageHeader(); 180 virtual ~SrsMessageHeader();
181 181
182 bool is_amf0_command(); 182 bool is_amf0_command();
  183 + bool is_amf0_data();
183 bool is_amf3_command(); 184 bool is_amf3_command();
  185 + bool is_amf3_data();
184 bool is_window_ackledgement_size(); 186 bool is_window_ackledgement_size();
185 bool is_set_chunk_size(); 187 bool is_set_chunk_size();
186 }; 188 };
@@ -693,6 +695,37 @@ protected: @@ -693,6 +695,37 @@ protected:
693 }; 695 };
694 696
695 /** 697 /**
  698 +* the stream metadata.
  699 +* FMLE: @setDataFrame
  700 +* others: onMetaData
  701 +*/
  702 +class SrsOnMetaDataPacket : public SrsPacket
  703 +{
  704 +private:
  705 + typedef SrsPacket super;
  706 +protected:
  707 + virtual const char* get_class_name()
  708 + {
  709 + return CLASS_NAME_STRING(SrsOnMetaDataPacket);
  710 + }
  711 +public:
  712 + std::string name;
  713 + SrsAmf0Object* metadata;
  714 +public:
  715 + SrsOnMetaDataPacket();
  716 + virtual ~SrsOnMetaDataPacket();
  717 +public:
  718 + virtual int decode(SrsStream* stream);
  719 +public:
  720 + virtual int get_perfer_cid();
  721 +public:
  722 + virtual int get_message_type();
  723 +protected:
  724 + virtual int get_size();
  725 + virtual int encode_packet(SrsStream* stream);
  726 +};
  727 +
  728 +/**
696 * 5.5. Window Acknowledgement Size (5) 729 * 5.5. Window Acknowledgement Size (5)
697 * The client or the server sends this message to inform the peer which 730 * The client or the server sends this message to inform the peer which
698 * window size to use when sending acknowledgment. 731 * window size to use when sending acknowledgment.