[FFmpeg-soc] [soc]: r5866 - mms/mmst.c

spyfeng subversion at mplayerhq.hu
Tue Jul 20 17:30:36 CEST 2010


Author: spyfeng
Date: Tue Jul 20 17:30:36 2010
New Revision: 5866

Log:
synchronize mmst.c with ffmpeg trunk, 
since we submitted the patches to ffmpeg-devel directly.

Modified:
   mms/mmst.c

Modified: mms/mmst.c
==============================================================================
--- mms/mmst.c	Tue Jul 20 17:26:29 2010	(r5865)
+++ mms/mmst.c	Tue Jul 20 17:30:36 2010	(r5866)
@@ -20,6 +20,14 @@
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
+
+/*References
+ * MMS protocol specification:
+ *  [1]http://msdn.microsoft.com/en-us/library/cc234711(PROT.10).aspx
+ *asf specification. Revision 01.20.03.
+ *  [2]http://msdn.microsoft.com/en-us/library/bb643323.aspx
+ */
+
 #include "avformat.h"
 #include "internal.h"
 #include "libavutil/intreadwrite.h"
@@ -282,8 +290,7 @@ static MMSSCPacketType get_tcp_server_re
                         return -1;
                     }
                     hr = AV_RL32(mms->in_buffer + 40);
-                    if (hr)
-                    {
+                    if (hr) {
                         dprintf(NULL, "The server side send back error code:0x%x\n", hr);
                         return -1;
                     }
@@ -336,6 +343,7 @@ static MMSSCPacketType get_tcp_server_re
                                                  mms->remaining_in_len);
                             mms->asf_header_size += mms->remaining_in_len;
                         }
+                        // 0x04 means asf header is sent in multiple packets.
                         if (mms->incoming_flags == 0x04)
                             continue;
                     } else if(packet_id_type == mms->packet_id) {
@@ -382,6 +390,7 @@ static int mms_safe_send_recv(MMSContext
             return ret;
         }
     }
+
     if ((type = get_tcp_server_response(mms)) != expect_type) {
         dprintf(NULL,"Unexpected packet type %d with type %d\n", type, expect_type);
         return -1;
@@ -433,8 +442,7 @@ static int asf_header_parser(MMSContext 
 {
     uint8_t *p = mms->asf_header;
     uint8_t *end;
-    int st_idx = 0;
-    int flags, stream_id, is_stream_num_known = 0;
+    int flags, stream_id;
     mms->stream_num = 0;
 
     if (mms->asf_header_size < sizeof(ff_asf_guid) * 2 + 22 ||
@@ -448,7 +456,7 @@ static int asf_header_parser(MMSContext 
         uint64_t chunksize = AV_RL64(p + sizeof(ff_asf_guid));
         if (!chunksize || chunksize > end - p) {
             dprintf(NULL, "chunksize is exceptional value:%"PRId64"!\n", chunksize);
-            return 0;
+            return -1;
         }
         if (!memcmp(p, ff_asf_file_header, sizeof(ff_asf_guid))) {
             /* read packet size */
@@ -468,30 +476,14 @@ static int asf_header_parser(MMSContext 
             //Please see function send_stream_selection_request().
             if (mms->stream_num < MAX_STREAMS &&
                     46 + mms->stream_num * 6 < sizeof(mms->out_buffer)) {
-                st_idx = is_stream_num_known ? st_idx++ : mms->stream_num;
-                mms->streams[st_idx].id = stream_id;
-                if (!is_stream_num_known)
-                    mms->stream_num++;
+                mms->streams[mms->stream_num].id = stream_id;
+                mms->stream_num++;
             } else {
                 dprintf(NULL, "Too many streams.\n");
                 return -1;
             }
         } else if (!memcmp(p, ff_asf_head1_guid, sizeof(ff_asf_guid))) {
-            chunksize = 46;
-        } else if (!memcmp(p, ff_asf_stream_bitrate_properties, sizeof(ff_asf_guid))) {
-            int record_cnt = AV_RL16(p + sizeof(ff_asf_guid) + 8);
-            if (record_cnt*6 + 16 + 8 + 2 > chunksize) {
-                dprintf(NULL, "Too many stream record count.\n");
-                return -1;
-            }
-            if (mms->stream_num < MAX_STREAMS &&
-                  46 + mms->stream_num * 6 < sizeof(mms->out_buffer)) {
-                mms->stream_num = record_cnt;
-                is_stream_num_known = 1;
-            } else {
-                dprintf(NULL, "Too many streams(bitrate properties)\n");
-                return -1;
-            }
+            chunksize = 46; // see references [2] section 3.4. This should be set 46.
         }
         p += chunksize;
     }


More information about the FFmpeg-soc mailing list