changeset 6643:01eaf5358176

Changed the way that the streams are requested. Now the streams are requested depending on the bandwidth option. If the option is not set, the higher bitrate stream is chose. Moved the asf_http_streaming_ctrl_t struct to asf.h
author bertrand
date Fri, 05 Jul 2002 02:46:03 +0000
parents e47d54a2cfff
children f3153f8d4fbe
files libmpdemux/asf_streaming.c
diffstat 1 files changed, 62 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/asf_streaming.c	Fri Jul 05 02:37:56 2002 +0000
+++ b/libmpdemux/asf_streaming.c	Fri Jul 05 02:46:03 2002 +0000
@@ -14,13 +14,6 @@
 
 #include "network.h"
 
-typedef struct {
-	ASF_StreamType_e streaming_type;
-	int request;
-	int packet_size;
-        int *audio_streams,n_audio,*video_streams,n_video;
-} asf_http_streaming_ctrl_t;
-
 #ifdef ARCH_X86
 #define	ASF_LOAD_GUID_PREFIX(guid)	(*(uint32_t *)(guid))
 #else
@@ -28,7 +21,6 @@
 	((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0])
 #endif
 
-extern int audio_id,video_id;
 extern int verbose;
 
 // ASF streaming support several network protocol.
@@ -55,7 +47,7 @@
 	int fd = -1;
 	
 	strncpy( proto_s, stream->streaming_ctrl->url->protocol, 10 );
-	
+
 	if( 	!strncasecmp( proto_s, "http", 4) || 
 		!strncasecmp( proto_s, "mms", 3)  ||
 		!strncasecmp( proto_s, "http_proxy", 10)
@@ -247,6 +239,9 @@
 	}
 	asf_ctrl->audio_streams[asf_ctrl->n_audio-1] = streamh.stream_no;
 	pos += streamh.stream_size;
+	if( streaming_ctrl->bandwidth==0 ) {
+	  asf_ctrl->audio_id = streamh.stream_no;
+	}
 	break;
       case 0xBC19EFC0 : // video stream
 	if(asf_ctrl->video_streams == NULL){
@@ -258,9 +253,49 @@
 						     asf_ctrl->n_video*sizeof(int));
 	}
 	asf_ctrl->video_streams[asf_ctrl->n_video-1] = streamh.stream_no;
+	if( streaming_ctrl->bandwidth==0 ) {
+	  asf_ctrl->video_id = streamh.stream_no;
+	}
 	break;
       }
       break;
+    case 0x7bf875ce :  // stream bitrate properties object
+printf("Stream bitrate properties object\n");
+printf("Max bandwidth set to %d\n", streaming_ctrl->bandwidth);
+	asf_ctrl->audio_id = 0;
+	asf_ctrl->video_id = 0;
+	if( streaming_ctrl->bandwidth!=0 ) {
+		int stream_count, stream_id, max_bitrate;
+		char *ptr = buffer+pos;
+		int total_bitrate=0, p_id, p_br;
+		int i;
+		ptr += sizeof(objh);
+		stream_count = le2me_16(*(uint16_t*)ptr);
+		ptr += sizeof(uint16_t);
+printf(" stream count=[0x%x][%u]\n", stream_count, stream_count );
+		for( i=0 ; i<stream_count && ptr<((char*)buffer+pos+objh.size) ; i++ ) {
+			stream_id = le2me_16(*(uint16_t*)ptr);
+			ptr += sizeof(uint16_t);
+			memcpy(&max_bitrate, ptr, sizeof(uint32_t));// workaround unaligment bug on sparc
+			max_bitrate = le2me_32(max_bitrate);
+			if( stream_id==1 ) total_bitrate = max_bitrate;
+			else if( total_bitrate+max_bitrate>streaming_ctrl->bandwidth ) {
+				total_bitrate += p_br;
+printf("total_bitrate=%d\n", total_bitrate);
+printf("id=%d\n", p_id);
+				break;
+			}
+			ptr += sizeof(uint32_t);
+printf("   stream id=[0x%x][%u]\n", stream_id, stream_id );
+printf("   max bitrate=[0x%x][%u]\n", max_bitrate, max_bitrate );
+			p_id = stream_id;
+			p_br = max_bitrate;
+		}
+		asf_ctrl->audio_id = 1;
+		asf_ctrl->video_id = p_id;
+	}
+	pos += objh.size;
+	break;
     default :
       pos += objh.size;
       break;
@@ -419,10 +454,10 @@
 	asf_http_streaming_ctrl_t *asf_http_ctrl;
 	char str[250];
 	char *ptr;
-	int i,as = -1,vs = -1;
+	int i, enable;
 
 	int offset_hi=0, offset_lo=0, length=0;
-	int asf_nb_stream=0;
+	int asf_nb_stream=0, stream_id;
 
 	// Sanity check
 	if( streaming_ctrl==NULL ) return NULL;
@@ -465,38 +500,28 @@
 			ptr = str;
 			ptr += sprintf( ptr, "Pragma: stream-switch-entry=");
 			if(asf_http_ctrl->n_audio > 0) {
-				if(audio_id > 0) {
-					for( i=0; i<asf_http_ctrl->n_audio ; i++ ) {
-						if(asf_http_ctrl->audio_streams[i] == audio_id) {
-							as = audio_id;
-							break;
-						}
+				for( i=0; i<asf_http_ctrl->n_audio ; i++ ) {
+					stream_id = asf_http_ctrl->audio_streams[i];
+					if(stream_id == asf_http_ctrl->audio_id) {
+						enable = 0;
+					} else {
+						enable = 2;
 					}
-				}				
-				if(as < 0) {
-					if(audio_id > 0) 
-		       				mp_msg(MSGT_NETWORK,MSGL_ERR,"Audio stream %d don't exist\n", as);
-					as = asf_http_ctrl->audio_streams[0];
+					asf_nb_stream++;
+					ptr += sprintf(ptr, "ffff:%d:%d ", stream_id, enable);
 				}
-				ptr += sprintf(ptr, " ffff:%d:0",as);
-				asf_nb_stream++;
 			}
 			if(asf_http_ctrl->n_video > 0) {
-				if(video_id > 0) {
-					for( i=0; i<asf_http_ctrl->n_video ; i++ ) {
-						if(asf_http_ctrl->video_streams[i] == video_id) {
-							vs = video_id;
-							break;
-						}
+				for( i=0; i<asf_http_ctrl->n_video ; i++ ) {
+					stream_id = asf_http_ctrl->video_streams[i];
+					if(stream_id == asf_http_ctrl->video_id) {
+						enable = 0;
+					} else {
+						enable = 2;
 					}
+					asf_nb_stream++;
+					ptr += sprintf(ptr, "ffff:%d:%d ", stream_id, enable);
 				}
-				if(vs < 0) {
-					if(video_id > 0) 
-						mp_msg(MSGT_NETWORK,MSGL_ERR,"Video stream %d don't exist\n",vs);
-					vs = asf_http_ctrl->video_streams[0];
-		       		}
-				ptr += sprintf( ptr, " ffff:%d:0",vs);
-				asf_nb_stream++;
 			}
 			http_set_field( http_hdr, str );
 			sprintf( str, "Pragma: stream-switch-count=%d", asf_nb_stream );