Handle AMF_ECMA_ARRAY and AMF_STRICT_ARRAY objects
authorgoggle1 <goggle1@163.com>
Tue, 30 Oct 2012 15:47:19 +0000 (08:47 -0700)
committerHoward Chu <hyc@highlandsun.com>
Tue, 30 Oct 2012 15:48:07 +0000 (08:48 -0700)
librtmp/amf.c
librtmp/amf.h

index ce84f8121bfcbba04e3dc47b923a3db79749a15b..1406be4e2054ac06bd5e13b6c9b0f2d7c6dfa383 100644 (file)
@@ -396,6 +396,14 @@ AMFProp_Encode(AMFObjectProperty *prop, char *pBuffer, char *pBufEnd)
       pBuffer = AMF_Encode(&prop->p_vu.p_object, pBuffer, pBufEnd);
       break;
 
+    case AMF_ECMA_ARRAY:            
+      pBuffer = AMF_EncodeEcmaArray(&prop->p_vu.p_object, pBuffer, pBufEnd);
+      break;
+      
+    case AMF_STRICT_ARRAY:      
+      pBuffer = AMF_EncodeArray(&prop->p_vu.p_object, pBuffer, pBufEnd);
+      break;
+      
     default:
       RTMP_Log(RTMP_LOGERROR, "%s, invalid type. %d", __FUNCTION__, prop->p_type);
       pBuffer = NULL;
@@ -700,7 +708,7 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize,
        if (nRes == -1)
          return -1;
        nSize -= nRes;
-       prop->p_type = AMF_OBJECT;
+       //prop->p_type = AMF_OBJECT;
        break;
       }
     case AMF_OBJECT_END:
@@ -718,7 +726,7 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize,
        if (nRes == -1)
          return -1;
        nSize -= nRes;
-       prop->p_type = AMF_OBJECT;
+       //prop->p_type = AMF_OBJECT;
        break;
       }
     case AMF_DATE:
@@ -815,6 +823,18 @@ AMFProp_Dump(AMFObjectProperty *prop)
       AMF_Dump(&prop->p_vu.p_object);
       return;
     }
+  else if (prop->p_type == AMF_ECMA_ARRAY)
+    {
+      RTMP_Log(RTMP_LOGDEBUG, "Property: <%sECMA_ARRAY>", strRes);
+      AMF_Dump(&prop->p_vu.p_object);
+      return;
+    }
+  else if (prop->p_type == AMF_STRICT_ARRAY)
+    {
+      RTMP_Log(RTMP_LOGDEBUG, "Property: <%sSTRICT_ARRAY>", strRes);
+      AMF_Dump(&prop->p_vu.p_object);
+      return;
+    }
 
   switch (prop->p_type)
     {
@@ -888,6 +908,76 @@ AMF_Encode(AMFObject *obj, char *pBuffer, char *pBufEnd)
   return pBuffer;
 }
 
+char *
+AMF_EncodeEcmaArray(AMFObject *obj, char *pBuffer, char *pBufEnd)
+{
+  int i;
+
+  if (pBuffer+4 >= pBufEnd)
+    return NULL;
+
+  *pBuffer++ = AMF_ECMA_ARRAY;
+
+  pBuffer = AMF_EncodeInt32(pBuffer, pBufEnd, obj->o_num);
+
+  for (i = 0; i < obj->o_num; i++)
+    {
+      char *res = AMFProp_Encode(&obj->o_props[i], pBuffer, pBufEnd);
+      if (res == NULL)
+       {
+         RTMP_Log(RTMP_LOGERROR, "AMF_Encode - failed to encode property in index %d",
+             i);
+         break;
+       }
+      else
+       {
+         pBuffer = res;
+       }
+    }
+
+  if (pBuffer + 3 >= pBufEnd)
+    return NULL;                       /* no room for the end marker */
+
+  pBuffer = AMF_EncodeInt24(pBuffer, pBufEnd, AMF_OBJECT_END);
+
+  return pBuffer;
+}
+
+char *
+AMF_EncodeArray(AMFObject *obj, char *pBuffer, char *pBufEnd)
+{
+  int i;
+
+  if (pBuffer+4 >= pBufEnd)
+    return NULL;
+
+  *pBuffer++ = AMF_STRICT_ARRAY;
+
+  pBuffer = AMF_EncodeInt32(pBuffer, pBufEnd, obj->o_num);
+
+  for (i = 0; i < obj->o_num; i++)
+    {
+      char *res = AMFProp_Encode(&obj->o_props[i], pBuffer, pBufEnd);
+      if (res == NULL)
+       {
+         RTMP_Log(RTMP_LOGERROR, "AMF_Encode - failed to encode property in index %d",
+             i);
+         break;
+       }
+      else
+       {
+         pBuffer = res;
+       }
+    }
+
+  //if (pBuffer + 3 >= pBufEnd)
+  //  return NULL;                     /* no room for the end marker */
+
+  //pBuffer = AMF_EncodeInt24(pBuffer, pBufEnd, AMF_OBJECT_END);
+
+  return pBuffer;
+}
+
 int
 AMF_DecodeArray(AMFObject *obj, const char *pBuffer, int nSize,
                int nArrayLen, int bDecodeName)
index b945beb5f84f54258773d7046378c907a0b2311e..5a47d7742199eb1ee015b5911ef94ff6011808b6 100644 (file)
@@ -104,6 +104,9 @@ extern "C"
   double AMF_DecodeNumber(const char *data);
 
   char *AMF_Encode(AMFObject * obj, char *pBuffer, char *pBufEnd);
+  char *AMF_EncodeEcmaArray(AMFObject *obj, char *pBuffer, char *pBufEnd);
+  char *AMF_EncodeArray(AMFObject *obj, char *pBuffer, char *pBufEnd);
+  
   int AMF_Decode(AMFObject * obj, const char *pBuffer, int nSize,
                 int bDecodeName);
   int AMF_DecodeArray(AMFObject * obj, const char *pBuffer, int nSize,