From 63388e8ac351e7f43e64beff208037b0567c501f Mon Sep 17 00:00:00 2001
From: winlin <winlin@vip.126.com>
Date: Thu, 2 Jan 2014 19:09:25 +0800
Subject: [PATCH] merge from wenjie, fix the flower player play bug,
 play(reset=amf0-number)

---
 trunk/src/core/srs_core_protocol.cpp | 50 +++++++++++++---------------
 1 file changed, 24 insertions(+), 26 deletions(-)

diff --git a/trunk/src/core/srs_core_protocol.cpp b/trunk/src/core/srs_core_protocol.cpp
index d07c9ff57..92e150065 100644
--- a/trunk/src/core/srs_core_protocol.cpp
+++ b/trunk/src/core/srs_core_protocol.cpp
@@ -2398,33 +2398,31 @@ int SrsPlayPacket::decode(SrsStream* stream)
 		return ret;
 	}
 
-    SrsAmf0Any* any_value = NULL;
-    if (!stream->empty()) {
-        if ((ret = srs_amf0_read_any(stream, any_value)) != ERROR_SUCCESS) {
-            ret = ERROR_RTMP_AMF0_DECODE;
-            srs_error("amf0 read play reset marker failed. ret=%d", ret);
-            return ret;
-        } else {
-            // check if the value is bool or number
-            // An optional Boolean value or number that specifies whether to flush any previous playlist.
-            if (any_value->is_boolean()) {
-                SrsAmf0Boolean* reset_bool = dynamic_cast<SrsAmf0Boolean*> (any_value);
-                if (reset_bool) {
-                    reset = reset_bool->value;
-                }
-            } else if (any_value->is_number()) {
-                SrsAmf0Number* reset_number = dynamic_cast<SrsAmf0Number*> (any_value);
-                if (reset_number) {
-                    reset = (reset_number->value == 0 ? false : true);
-                }
-            } else {
-                ret = ERROR_RTMP_AMF0_DECODE;
-                srs_error("amf0 decode play reset not support type. desire number or bool, ret=%d", ret);
-                return ret;
-            }
-            SrsAutoFree(SrsAmf0Any, any_value, false);
-        }
+    if (stream->empty()) {
+        return ret;
     }
+    
+    SrsAmf0Any* reset_value = NULL;
+    if ((ret = srs_amf0_read_any(stream, reset_value)) != ERROR_SUCCESS) {
+        ret = ERROR_RTMP_AMF0_DECODE;
+        srs_error("amf0 read play reset marker failed. ret=%d", ret);
+        return ret;
+    }
+    SrsAutoFree(SrsAmf0Any, reset_value, false);
+    
+    // check if the value is bool or number
+    // An optional Boolean value or number that specifies whether
+    // to flush any previous playlist
+    if (reset_value->is_boolean()) {
+        reset = srs_amf0_convert<SrsAmf0Boolean>(reset_value)->value;
+    } else if (reset_value->is_number()) {
+        reset = (srs_amf0_convert<SrsAmf0Number>(reset_value)->value == 0 ? false : true);
+    } else {
+        ret = ERROR_RTMP_AMF0_DECODE;
+        srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret);
+        return ret;
+    }
+
     srs_info("amf0 decode play packet success");
 	
 	return ret;