Package: libmms0
Version: 0.3-2
Severity: normal
Tags: patch

Hi,

libmms does not support streams with id above 23, prohibiting playback
of certain streams such as this one, 
mms://media.lightreading.com/drtv/2006/11/111687_01_256K.wmv

GStreamer bug discussing the problem,
http://bugzilla.gnome.org/show_bug.cgi?id=347151
Upstream bug and patch,
http://sourceforge.net/tracker/index.php?func=detail&aid=1521441&group_id=101989&atid=630609

The attached patch is the one from upstream adjusted for the debian
package and seems to work fine.

-- System Information:
Debian Release: 4.0
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-4-686
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)

Versions of packages libmms0 depends on:
ii  libc6                       2.3.6.ds1-13 GNU C Library: Shared libraries
ii  libglib2.0-0                2.12.11-1    The GLib library of C routines

libmms0 recommends no packages.

-- no debconf information

 LocalWords:  UTF
diff -urp ../libmms-0.3.orig/src/mms.c ./src/mms.c
--- ../libmms-0.3.orig/src/mms.c	2006-07-13 14:32:20.000000000 +0200
+++ ./src/mms.c	2007-03-27 23:15:38.000000000 +0200
@@ -106,6 +106,13 @@ struct mms_packet_header_s {
   uint32_t  packet_seq;
 };
 
+typedef struct mms_stream_s mms_stream_t;
+struct mms_stream_s {
+  int           stream_id;
+  int           stream_type;
+  uint32_t      bitrate;
+  uint32_t      bitrate_pos;
+};
 
 struct mms_s {
 
@@ -140,15 +147,12 @@ struct mms_s {
   uint32_t      asf_header_read;
   int           seq_num;
   int           num_stream_ids;
-  int           stream_ids[ASF_MAX_NUM_STREAMS];
-  int           stream_types[ASF_MAX_NUM_STREAMS];
+  mms_stream_t  streams[ASF_MAX_NUM_STREAMS];
   off_t         start_packet_seq; /* for live streams != 0, need to keep it around */
   int           need_discont; /* whether we need to set start_packet_seq */
   uint32_t      asf_packet_len;
   uint64_t      file_len;
   char          guid[37];
-  uint32_t      bitrates[ASF_MAX_NUM_STREAMS];
-  uint32_t      bitrates_pos[ASF_MAX_NUM_STREAMS];
   int           bandwidth;
   
   int           has_audio;
@@ -776,9 +780,9 @@ static void interp_asf_header (mms_t *th
           lprintf ("stream object, stream id: %d, type: %d, encrypted: %d\n",
 		   stream_id, type, encrypted);
 
-	  if (this->num_stream_ids < ASF_MAX_NUM_STREAMS && stream_id < ASF_MAX_NUM_STREAMS) {
-	    this->stream_types[stream_id] = type;
-	    this->stream_ids[this->num_stream_ids] = stream_id;
+	  if (this->num_stream_ids < ASF_MAX_NUM_STREAMS) {
+	    this->streams[this->num_stream_ids].stream_type = type;
+	    this->streams[this->num_stream_ids].stream_id = stream_id;
 	    this->num_stream_ids++;
 	  } else {
 	    lprintf ("too many streams, skipping\n");
@@ -796,12 +800,19 @@ static void interp_asf_header (mms_t *th
           lprintf ("streams %d\n", streams); 
 
           for(j = 0; j < streams; j++) {
+            int stream_index;
             stream_id = LE_16(this->asf_header + i + 2 + j * 6);
-            lprintf ("stream id %d\n", stream_id); 
-            this->bitrates[stream_id] = LE_32(this->asf_header + i + 4 + j * 6);
-            this->bitrates_pos[stream_id] = i + 4 + j * 6;
-            lprintf ("stream id %d, bitrate %d\n", stream_id, 
-                     this->bitrates[stream_id]);
+            lprintf ("stream id %d\n", stream_id);
+            for(stream_index = 0; stream_index < this->num_stream_ids; stream_index++) {
+              if (this->streams[stream_index].stream_id == stream_id)
+                break;
+            }
+            if (stream_index < this->num_stream_ids) {
+              this->streams[stream_index].bitrate = LE_32(this->asf_header + i + 4 + j * 6);
+              this->streams[stream_index].bitrate_pos = i + 4 + j * 6;
+              lprintf ("stream id %d, bitrate %d\n", stream_id, 
+                     this->[stream_index].bitrate);
+            }
           }
         }
         break;
@@ -913,7 +924,6 @@ int static mms_choose_best_streams(mms_i
   int     max_arate    = 0;
   int     min_vrate    = 0;
   int     min_bw_left  = 0;
-  int     stream_id;
   int     bandwitdh_left;
   int     res;
 
@@ -922,12 +932,11 @@ int static mms_choose_best_streams(mms_i
   /* i've never seen more than one audio stream */
   lprintf("num_stream_ids=%d\n", this->num_stream_ids);
   for (i = 0; i < this->num_stream_ids; i++) {
-    stream_id = this->stream_ids[i];
-    switch (this->stream_types[stream_id]) {
+    switch (this->streams[i].stream_type) {
       case ASF_STREAM_TYPE_AUDIO:
-        if (this->bitrates[stream_id] > max_arate) {
-          audio_stream = stream_id;
-          max_arate = this->bitrates[stream_id];
+        if (this->streams[i].bitrate > max_arate) {
+          audio_stream = this->streams[i].stream_id;
+          max_arate = this->streams[i].bitrate;
         }
         break;
       default:
@@ -944,13 +953,12 @@ int static mms_choose_best_streams(mms_i
 
   min_bw_left = bandwitdh_left;
   for (i = 0; i < this->num_stream_ids; i++) {
-    stream_id = this->stream_ids[i];
-    switch (this->stream_types[stream_id]) {
+    switch (this->streams[i].stream_type) {
       case ASF_STREAM_TYPE_VIDEO:
-        if (((bandwitdh_left - this->bitrates[stream_id]) < min_bw_left) &&
-            (bandwitdh_left >= this->bitrates[stream_id])) {
-          video_stream = stream_id;
-          min_bw_left = bandwitdh_left - this->bitrates[stream_id];
+        if (((bandwitdh_left - this->streams[i].bitrate) < min_bw_left) &&
+            (bandwitdh_left >= this->streams[i].bitrate)) {
+          video_stream = this->streams[i].stream_id;
+          min_bw_left = bandwitdh_left - this->streams[i].bitrate;
         }
         break;
       default:
@@ -961,13 +969,12 @@ int static mms_choose_best_streams(mms_i
   /* choose the lower bitrate of */
   if (!video_stream && this->has_video) {
     for (i = 0; i < this->num_stream_ids; i++) {
-      stream_id = this->stream_ids[i];
-      switch (this->stream_types[stream_id]) {
+      switch (this->streams[i].stream_type) {
         case ASF_STREAM_TYPE_VIDEO:
-          if ((this->bitrates[stream_id] < min_vrate) ||
+          if ((this->streams[i].bitrate < min_vrate) ||
               (!min_vrate)) {
-            video_stream = stream_id;
-            min_vrate = this->bitrates[stream_id];
+            video_stream = this->streams[i].stream_id;
+            min_vrate = this->streams[i].bitrate;
           }
           break;
         default:
@@ -982,10 +989,10 @@ int static mms_choose_best_streams(mms_i
   for (i = 1; i < this->num_stream_ids; i++) {
     this->scmd_body [ (i - 1) * 6 + 2 ] = 0xFF;
     this->scmd_body [ (i - 1) * 6 + 3 ] = 0xFF;
-    this->scmd_body [ (i - 1) * 6 + 4 ] = this->stream_ids[i] ;
-    this->scmd_body [ (i - 1) * 6 + 5 ] = this->stream_ids[i] >> 8;
-    if ((this->stream_ids[i] == audio_stream) ||
-        (this->stream_ids[i] == video_stream)) {
+    this->scmd_body [ (i - 1) * 6 + 4 ] = this->streams[i].stream_id ;
+    this->scmd_body [ (i - 1) * 6 + 5 ] = this->streams[i].stream_id >> 8;
+    if ((this->streams[i].stream_id == audio_stream) ||
+        (this->streams[i].stream_id == video_stream)) {
       this->scmd_body [ (i - 1) * 6 + 6 ] = 0x00;
       this->scmd_body [ (i - 1) * 6 + 7 ] = 0x00;
     } else {
@@ -994,17 +1001,17 @@ int static mms_choose_best_streams(mms_i
       this->scmd_body [ (i - 1) * 6 + 7 ] = 0x00;
       
       /* forces the asf demuxer to not choose this stream */
-      if (this->bitrates_pos[this->stream_ids[i]]) {
-        this->asf_header[this->bitrates_pos[this->stream_ids[i]]]     = 0;
-        this->asf_header[this->bitrates_pos[this->stream_ids[i]] + 1] = 0;
-        this->asf_header[this->bitrates_pos[this->stream_ids[i]] + 2] = 0;
-        this->asf_header[this->bitrates_pos[this->stream_ids[i]] + 3] = 0;
+      if (this->streams[i].bitrate_pos) {
+        this->asf_header[this->streams[i].bitrate_pos    ] = 0;
+        this->asf_header[this->streams[i].bitrate_pos + 1] = 0;
+        this->asf_header[this->streams[i].bitrate_pos + 2] = 0;
+        this->asf_header[this->streams[i].bitrate_pos + 3] = 0;
       }
     }
   }
 
   if (!send_command (io, this, 0x33, this->num_stream_ids, 
-                     0xFFFF | this->stream_ids[0] << 16, 
+                     0xFFFF | this->streams[0].stream_id << 16, 
                      this->num_stream_ids * 6 + 2)) {
   /* FIXME: de-xine-ification */
     lprintf ( "***LOG:*** -- "

Reply via email to