--- 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);