Sophie

Sophie

distrib > Arklinux > devel > i586 > by-pkgid > 9482443bfa78fcd0975e9204e634806b > files > 23

mplayer-1.0-0.svn34182.1ark.src.rpm

--- mplayer/libmpdemux/asf.h.nestedasx~	2011-06-06 17:44:10.000000000 +0200
+++ mplayer/libmpdemux/asf.h	2011-06-06 17:58:37.453267579 +0200
@@ -124,7 +124,8 @@ typedef enum {
 	ASF_Prerecorded_e,
 	ASF_Redirector_e,
 	ASF_PlainText_e,
-	ASF_Authenticate_e
+	ASF_Authenticate_e,
+	ASF_ASXPlaylist_e
 } ASF_StreamType_e;
 
 typedef struct {
--- mplayer/playtreeparser.c.nestedasx~	2011-04-15 14:10:27.000000000 +0200
+++ mplayer/playtreeparser.c	2011-06-06 17:58:37.456600912 +0200
@@ -65,17 +65,42 @@ static char*
 play_tree_parser_get_line(play_tree_parser_t* p) {
   char *end,*line_end;
   int r,resize = 0;
+  int buffered_stream = 0;
+
+  if(p == NULL) return NULL;
+
+  if(p->stream != NULL &&
+     p->stream->streaming_ctrl != NULL &&
+     p->stream->streaming_ctrl->buffer != NULL &&
+     p->stream->streaming_ctrl->buffer_size > 0)
+    buffered_stream = 1;
 
   if(p->buffer == NULL) {
+   if(!buffered_stream) {
     p->buffer = malloc(BUF_STEP);
     p->buffer_size = BUF_STEP;
     p->buffer[0] = 0;
-    p->iter = p->buffer;
+   } else {
+    p->buffer_size = p->stream->streaming_ctrl->buffer_size + 1;
+    p->buffer = malloc(p->buffer_size);
+    memcpy(p->buffer, p->stream->streaming_ctrl->buffer, p->stream->streaming_ctrl->buffer_size);
+    p->buffer[p->buffer_size-1]=0;
+    p->buffer_end = p->buffer_size;
+    p->stream->eof = 1;
+    free(p->stream->streaming_ctrl->buffer);
+    p->stream->streaming_ctrl->buffer = NULL;
+    p->stream->streaming_ctrl->buffer_size = 0;
+   }
+   p->iter = p->buffer;
   }
 
   if(p->stream->eof && (p->buffer_end == 0 || p->iter[0] == '\0'))
     return NULL;
 
+  if(buffered_stream) {
+    end=strchr(p->iter, '\n');
+    if(!end) end = p->buffer + p->buffer_end;
+  } else {
   assert(p->buffer_end < p->buffer_size);
   assert(!p->buffer[p->buffer_end]);
   while(1) {
@@ -117,6 +142,7 @@ play_tree_parser_get_line(play_tree_pars
       continue;
     }
     break;
+   }
   }
 
   line_end = (end > p->iter && *(end-1) == '\r') ? end-1 : end;
@@ -925,7 +951,6 @@ play_tree_parser_get_play_tree(play_tree
   assert(p != NULL);
 #endif
 
-
   while(play_tree_parser_get_line(p) != NULL) {
     play_tree_parser_reset(p);
 
--- mplayer/stream/asf_streaming.c.nestedasx~	2011-04-15 14:10:22.000000000 +0200
+++ mplayer/stream/asf_streaming.c	2011-06-06 17:58:37.456600912 +0200
@@ -44,6 +44,9 @@
 
 #include "libavutil/intreadwrite.h"
 
+#include "../playtree.h"
+extern int playtree_add_playlist(play_tree_t* entry);
+
 #include "libmpdemux/asfguid.h"
 
 static int asf_http_streaming_start(stream_t *stream, int *demuxer_type);
@@ -749,11 +752,39 @@ static int asf_http_streaming_start( str
 			mp_msg(MSGT_NETWORK,MSGL_DBG2,"Response [%s]\n", http_hdr->buffer );
 		}
 		ret = asf_http_parse_response(asf_http_ctrl, http_hdr);
+		
+		if (strstr(url->url,".asx")!=NULL) {
+		  mp_msg(MSGT_NETWORK,MSGL_V,"ASXPlaylist detected: url=%s, bodysize=%i\n",url->url,http_hdr->body_size);
+		  ret = 0;
+		  asf_http_ctrl->streaming_type=ASF_ASXPlaylist_e;
+		}
+
 		if( ret<0 ) {
 			mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_HeaderParseFailed);
 			goto err_out;
 		}
 		switch( asf_http_ctrl->streaming_type ) {
+			case ASF_ASXPlaylist_e:
+
+				if( http_hdr->body_size>0 ) {
+				  if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) {
+				    goto err_out;
+				  }
+				}
+
+				//TODO: read potentially remaining
+				//asx playlist data into buffer
+				//{ int r;
+				//for( r=?; r < http_hdr->body_size; ) {
+				//i = nop_streaming_read(fd,((char*)stream->streaming_ctrl->buffer)+r,http_hdr->body_size - r,stream->streaming_ctrl);
+				//if(i <= 0) return -1;
+				//r += i;
+				//}
+				//}
+				*demuxer_type = DEMUXER_TYPE_PLAYLIST;
+				done=1;
+			  break;
+	
 			case ASF_Live_e:
 			case ASF_Prerecorded_e:
 			case ASF_PlainText_e:
@@ -801,7 +832,7 @@ static int asf_http_streaming_start( str
 	} while(!done);
 
 	stream->fd = fd;
-	if( asf_http_ctrl->streaming_type==ASF_PlainText_e || asf_http_ctrl->streaming_type==ASF_Redirector_e ) {
+	if( asf_http_ctrl->streaming_type==ASF_PlainText_e || asf_http_ctrl->streaming_type==ASF_Redirector_e || asf_http_ctrl->streaming_type==ASF_ASXPlaylist_e) {
 		stream->streaming_ctrl->streaming_read = nop_streaming_read;
 		stream->streaming_ctrl->streaming_seek = nop_streaming_seek;
 	} else {
@@ -836,12 +867,14 @@ static int open_s(stream_t *stream,int m
 	url_free(url);
 
 	mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_MPDEMUX_ASF_InfoStreamASFURL, stream->url);
-	if((!strncmp(stream->url, "http", 4)) && (*file_format!=DEMUXER_TYPE_ASF && *file_format!=DEMUXER_TYPE_UNKNOWN)) {
+	if((!strncmp(stream->url, "http", 4)) && (*file_format!=DEMUXER_TYPE_ASF && *file_format!=DEMUXER_TYPE_UNKNOWN && *file_format!=DEMUXER_TYPE_PLAYLIST)) {
 		streaming_ctrl_free(stream->streaming_ctrl);
 		stream->streaming_ctrl = NULL;
 		return STREAM_UNSUPPORTED;
 	}
 
+	if(*file_format != DEMUXER_TYPE_PLAYLIST)
+		*file_format = DEMUXER_TYPE_ASF;
 	if(asf_streaming_start(stream, file_format) < 0) {
 		mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_ASF_StreamingFailed);
 		streaming_ctrl_free(stream->streaming_ctrl);