From 5661fc2676a3b2901d5c1592e0865cde82adca69 Mon Sep 17 00:00:00 2001
From: winlin <winlin@vip.126.com>
Date: Wed, 7 Jan 2015 15:01:58 +0800
Subject: [PATCH] refine dvr and rtmp dump, write the original data.

---
 trunk/src/app/srs_app_dvr.cpp        |  2 +-
 trunk/src/kernel/srs_kernel_flv.cpp  |  4 ++--
 trunk/src/kernel/srs_kernel_flv.hpp  |  3 ++-
 trunk/src/libs/srs_librtmp.cpp       | 13 ++++++++-----
 trunk/src/libs/srs_librtmp.hpp       |  1 +
 trunk/src/utest/srs_utest_kernel.cpp |  2 +-
 6 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/trunk/src/app/srs_app_dvr.cpp b/trunk/src/app/srs_app_dvr.cpp
index 631513698..4d823666c 100644
--- a/trunk/src/app/srs_app_dvr.cpp
+++ b/trunk/src/app/srs_app_dvr.cpp
@@ -273,7 +273,7 @@ int SrsDvrPlan::on_meta_data(SrsOnMetaDataPacket* metadata)
     }
     SrsAutoFree(char, payload);
     
-    if ((ret = enc->write_metadata(payload, size)) != ERROR_SUCCESS) {
+    if ((ret = enc->write_metadata(18, payload, size)) != ERROR_SUCCESS) {
         return ret;
     }
     
diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp
index 504cda803..c7aeb6ac2 100644
--- a/trunk/src/kernel/srs_kernel_flv.cpp
+++ b/trunk/src/kernel/srs_kernel_flv.cpp
@@ -110,7 +110,7 @@ int SrsFlvEncoder::write_header(char flv_header[9])
     return ret;
 }
 
-int SrsFlvEncoder::write_metadata(char* data, int size)
+int SrsFlvEncoder::write_metadata(char type, char* data, int size)
 {
     int ret = ERROR_SUCCESS;
     
@@ -118,7 +118,7 @@ int SrsFlvEncoder::write_metadata(char* data, int size)
     
     // 11 bytes tag header
     static char tag_header[] = {
-        (char)18, // TagType UB [5], 18 = script data
+        (char)type, // TagType UB [5], 18 = script data
         (char)0x00, (char)0x00, (char)0x00, // DataSize UI24 Length of the message.
         (char)0x00, (char)0x00, (char)0x00, // Timestamp UI24 Time in milliseconds at which the data in this tag applies.
         (char)0x00, // TimestampExtended UI8
diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp
index 49a1be685..52a30837f 100644
--- a/trunk/src/kernel/srs_kernel_flv.hpp
+++ b/trunk/src/kernel/srs_kernel_flv.hpp
@@ -66,12 +66,13 @@ public:
     virtual int write_header(char flv_header[9]);
     /**
     * write flv metadata. 
+    * @param type, the type of data, or other message type.
     * @param data, the amf0 metadata which serialize from:
     *   AMF0 string: onMetaData,
     *   AMF0 object: the metadata object.
     * @remark assert data is not NULL.
     */
-    virtual int write_metadata(char* data, int size);
+    virtual int write_metadata(char type, char* data, int size);
     /**
     * write audio/video packet.
     * @remark assert data is not NULL.
diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp
index ccf1918f2..0a85bd170 100644
--- a/trunk/src/libs/srs_librtmp.cpp
+++ b/trunk/src/libs/srs_librtmp.cpp
@@ -843,8 +843,11 @@ int srs_rtmp_read_packet(srs_rtmp_t rtmp, char* type, u_int32_t* timestamp, char
             // detach bytes from packet.
             msg->payload = NULL;
         } else {
-            // ignore and continue
-            continue;
+            *type = msg->header.message_type;
+            *data = (char*)msg->payload;
+            *size = (int)msg->size;
+            // detach bytes from packet.
+            msg->payload = NULL;
         }
         
         // got expected message.
@@ -1714,7 +1717,7 @@ int srs_flv_write_tag(srs_flv_t flv, char type, int32_t time, char* data, int si
     } else if (type == SRS_RTMP_TYPE_VIDEO) {
         return context->enc.write_video(time, data, size);
     } else {
-        return context->enc.write_metadata(data, size);
+        return context->enc.write_metadata(type, data, size);
     }
 
     return ret;
@@ -2476,8 +2479,8 @@ int srs_human_print_rtmp_packet(char type, u_int32_t timestamp, char* data, int
             srs_freep(amf0_str);
         }
     } else {
-        srs_human_trace("Unknown packet type=%s, dts=%d, pts=%d, size=%d", 
-            srs_human_flv_tag_type2string(type), timestamp, pts, size);
+        srs_human_trace("Unknown packet type=%#x, dts=%d, pts=%d, size=%d", 
+            type, timestamp, pts, size);
     }
     
     return ret;
diff --git a/trunk/src/libs/srs_librtmp.hpp b/trunk/src/libs/srs_librtmp.hpp
index c2e365407..3a26519af 100644
--- a/trunk/src/libs/srs_librtmp.hpp
+++ b/trunk/src/libs/srs_librtmp.hpp
@@ -241,6 +241,7 @@ extern int srs_rtmp_bandwidth_check(srs_rtmp_t rtmp,
 *            SRS_RTMP_TYPE_AUDIO, FlvTagAudio
 *            SRS_RTMP_TYPE_VIDEO, FlvTagVideo
 *            SRS_RTMP_TYPE_SCRIPT, FlvTagScript
+*            otherswise, invalid type.
 * @param timestamp, in ms, overflow in 50days
 * @param data, the packet data, according to type:
 *             FlvTagAudio, @see "E.4.2.1 AUDIODATA"
diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp
index 52124ff68..e5fa21f90 100644
--- a/trunk/src/utest/srs_utest_kernel.cpp
+++ b/trunk/src/utest/srs_utest_kernel.cpp
@@ -460,7 +460,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteMetadata)
     };
     char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 };
     
-    ASSERT_TRUE(ERROR_SUCCESS == enc.write_metadata(md, 8));
+    ASSERT_TRUE(ERROR_SUCCESS == enc.write_metadata(18, md, 8));
     ASSERT_TRUE(11 + 8 + 4 == fs.offset);
     
     EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data, 11));