stream_t* open_output_stream(const char* filename, char** options) { int file_format; //unused if(!filename) { mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_StreamNULLFilename); return NULL; } return open_stream_full(filename,STREAM_WRITE,options,&file_format); }
stream_t* open_output_stream(char* filename,char** options) { int file_format; //unused if(!filename) { mp_msg(MSGT_OPEN,MSGL_ERR,"open_output_stream(), NULL filename, report this bug\n"); return NULL; } return open_stream_full(filename,STREAM_WRITE,options,&file_format); }
stream_t *open_stream(const char *filename, struct MPOpts *options, int *file_format) { if (!file_format) file_format = &(int) { DEMUXER_TYPE_UNKNOWN }; if (*file_format != DEMUXER_TYPE_PLAYLIST) *file_format = DEMUXER_TYPE_UNKNOWN; return open_stream_full(filename, STREAM_READ, options, file_format); }
stream_t* open_stream(char* filename,char** options, int* file_format){ // Check if playlist or unknown if (*file_format != DEMUXER_TYPE_PLAYLIST){ *file_format=DEMUXER_TYPE_UNKNOWN; } if(!filename) { mp_msg(MSGT_OPEN,MSGL_ERR,"NULL filename, report this bug\n"); return NULL; } //============ Open STDIN or plain FILE ============ return open_stream_full(filename,STREAM_READ,options,file_format); }
stream_t *open_stream_full(const char *filename, int mode, struct MPOpts *options, int *file_format) { int i,j,l,r; const stream_info_t* sinfo; stream_t* s; char *redirected_url = NULL; for(i = 0 ; auto_open_streams[i] ; i++) { sinfo = auto_open_streams[i]; if(!sinfo->protocols) { mp_msg(MSGT_OPEN,MSGL_WARN, "Stream type %s has protocols == NULL, it's a bug\n", sinfo->name); continue; } for(j = 0 ; sinfo->protocols[j] ; j++) { l = strlen(sinfo->protocols[j]); // l == 0 => Don't do protocol matching (ie network and filenames) if((l == 0 && !strstr(filename, "://")) || ((strncasecmp(sinfo->protocols[j],filename,l) == 0) && (strncmp("://",filename+l,3) == 0))) { *file_format = DEMUXER_TYPE_UNKNOWN; s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r, &redirected_url); if(s) return s; if(r == STREAM_REDIRECTED && redirected_url) { mp_msg(MSGT_OPEN,MSGL_V, "[%s] open %s redirected to %s\n", sinfo->info, filename, redirected_url); s = open_stream_full(redirected_url, mode, options, file_format); free(redirected_url); return s; } else if(r != STREAM_UNSUPPORTED) { mp_tmsg(MSGT_OPEN,MSGL_ERR, "Failed to open %s.\n",filename); return NULL; } break; } } } mp_tmsg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n", filename); return NULL; }
stream_t* open_stream_full(const char* filename,int mode, char** options, int* file_format) { int i,j; for(i = 0 ; auto_open_streams[i] ; i++) { const stream_info_t *sinfo = auto_open_streams[i]; for(j = 0 ; sinfo->protocols[j] ; j++) { int l = strlen(sinfo->protocols[j]); // l == 0 => Don't do protocol matching (ie network and filenames) if((l == 0 && !strstr(filename, "://")) || ((strncasecmp(sinfo->protocols[j],filename,l) == 0) && (strncmp("://",filename+l,3) == 0))) { int r; char *redirected_url = NULL; stream_t* s; *file_format = DEMUXER_TYPE_UNKNOWN; s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r, &redirected_url); if(s) return s; if(r == STREAM_REDIRECTED && redirected_url) { mp_msg(MSGT_OPEN,MSGL_V, "[%s] open %s redirected to %s\n", sinfo->info, filename, redirected_url); s = open_stream_full(redirected_url, mode, options, file_format); free(redirected_url); return s; } else if(r != STREAM_UNSUPPORTED) { mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_FailedToOpen,filename); return NULL; } break; } } } mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_StreamCantHandleURL,filename); return NULL; }