⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 open.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include "config.h"#include "mp_msg.h"#include "help_mp.h"#ifdef __FreeBSD__#include <sys/cdrio.h>#endif#include "../m_option.h"#include "stream.h"#include "demuxer.h"#include "mf.h"#ifdef MPLAYER_NETWORK#include "url.h"#include "network.h"extern int streaming_start( stream_t *stream, int *demuxer_type, URL_t *url);#ifdef STREAMING_LIVE_DOT_COM#include "demux_rtp.h"#endifstatic URL_t* url;#endif/// We keep these 2 for the gui atm, but they will be removed.int dvd_title=0;int vcd_track=0;int dvd_chapter=1;int dvd_last_chapter=0;int dvd_angle=1;char* dvd_device=NULL;char* cdrom_device=NULL;#ifdef USE_DVDNAV#include "dvdnav_stream.h"#endif#ifdef USE_DVDREAD#define	DVDREAD_VERSION(maj,min,micro)	((maj)*10000 + (min)*100 + (micro))/* * Try to autodetect the libdvd-0.9.0 library * (0.9.0 removed the <dvdread/dvd_udf.h> header, and moved the two defines * DVD_VIDEO_LB_LEN and MAX_UDF_FILE_NAME_LEN from it to * <dvdread/dvd_reader.h>) */#if defined(DVD_VIDEO_LB_LEN) && defined(MAX_UDF_FILE_NAME_LEN)#define	LIBDVDREAD_VERSION	DVDREAD_VERSION(0,9,0)#else#define	LIBDVDREAD_VERSION	DVDREAD_VERSION(0,8,0)#endifchar * dvd_audio_stream_types[8] =        { "ac3","unknown","mpeg1","mpeg2ext","lpcm","unknown","dts" };char * dvd_audio_stream_channels[6] =	{ "mono", "stereo", "unknown", "unknown", "5.1/6.1", "5.1" };#endif#include "cue_read.h"// Define function about auth the libsmbclient library// FIXME: I really do not not is this function is properly working#ifdef LIBSMBCLIENT#include "libsmbclient.h"static char smb_password[15];static char smb_username[15];static void smb_auth_fn(const char *server, const char *share,             char *workgroup, int wgmaxlen, char *username, int unmaxlen,	     char *password, int pwmaxlen){  char temp[128];    strcpy(temp, "LAN");				    if (temp[strlen(temp) - 1] == 0x0a)    temp[strlen(temp) - 1] = 0x00;					  if (temp[0]) strncpy(workgroup, temp, wgmaxlen - 1);					     strcpy(temp, smb_username);   if (temp[strlen(temp) - 1] == 0x0a)    temp[strlen(temp) - 1] = 0x00;						      if (temp[0]) strncpy(username, temp, unmaxlen - 1);						        strcpy(temp, smb_password);   if (temp[strlen(temp) - 1] == 0x0a)    temp[strlen(temp) - 1] = 0x00;								   if (temp[0]) strncpy(password, temp, pwmaxlen - 1);}								  #endif// Open a new stream  (stdin/file/vcd/url)stream_t* open_stream(char* filename,char** options, int* file_format){stream_t* stream=NULL;int f=-1;off_t len;  // 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;}// for opening of vcds in bincue filesif(strncmp("cue://",filename,6) == 0){  int ret,ret2;  char* p = filename + 6;  vcd_track = 1;  p = strchr(p,':');  if(p && p[1] != '\0') {    vcd_track = strtol(p+1,NULL,0);    if(vcd_track < 1){       mp_msg(MSGT_OPEN,MSGL_ERR,"Invalid cue track %s\n",p+1);      return NULL;    }    p[0] = '\0';  }  f = cue_read_cue (filename + 6);  if(p && p[1] != '\0') p[0] = ':';  if (f == -1) return NULL;  cue_vcd_read_toc();  ret2=cue_vcd_get_track_end(vcd_track);  ret=cue_vcd_seek_to_track(vcd_track);  if(ret<0){ mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n");return NULL;}  mp_msg(MSGT_OPEN,MSGL_V,"VCD start byte position: 0x%X  end: 0x%X\n",ret,ret2);  stream=new_stream(f,STREAMTYPE_VCDBINCUE);  stream->start_pos=ret;  stream->end_pos=ret2;  return stream;}//============ Open DVD title ==============#ifdef USE_DVDNAVif(strncmp("dvdnav://",filename,9) == 0){    dvdnav_priv_t *dvdnav_priv;    int event,len,tmplen=0;    char* name = (filename[9] == '\0') ? NULL : filename + 9;        stream=new_stream(-1,STREAMTYPE_DVDNAV);    if (!stream) {        mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_Exit_error);        return NULL;    }    if(!name) name=DEFAULT_DVD_DEVICE;    if (!(dvdnav_priv=new_dvdnav_stream(name))) {	mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,name);        return NULL;    }    stream->priv=(void*)dvdnav_priv;    return stream;}#endif#ifdef USE_DVDREADif(strncmp("dvd://",filename,6) == 0){//  int ret,ret2;    dvd_priv_t *d;    int ttn,pgc_id,pgn;    dvd_reader_t *dvd;    dvd_file_t *title;    ifo_handle_t *vmg_file;    tt_srpt_t *tt_srpt;    ifo_handle_t *vts_file;    dvd_title = filename[6] == '\0' ? 1 : strtol(filename + 6,NULL,0);    /**     * Open the disc.     */    if(!dvd_device) dvd_device=strdup(DEFAULT_DVD_DEVICE);#ifdef SYS_DARWIN    /* Dynamic DVD drive selection on Darwin */    if (!strcmp(dvd_device, "/dev/rdiskN")) {	int i;	char *temp_device = malloc((strlen(dvd_device)+1)*sizeof(char));		for (i = 1; i < 10; i++) {	    sprintf(temp_device, "/dev/rdisk%d", i);	    dvd = DVDOpen(temp_device);	    if (!dvd) {	        mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,temp_device);	    } else {	        free(temp_device);	        break;	    }	}		if (!dvd)	    return NULL;    } else#endif /* SYS_DARWIN */    {        dvd = DVDOpen(dvd_device);	if( !dvd ) {	    mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,dvd_device);	    return NULL;	}    }    mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_DVDwait);    /**     * Load the video manager to find out the information about the titles on     * this disc.     */    vmg_file = ifoOpen( dvd, 0 );    if( !vmg_file ) {        mp_msg(MSGT_OPEN,MSGL_ERR, "Can't open VMG info!\n");        DVDClose( dvd );        return NULL;    }    tt_srpt = vmg_file->tt_srpt;    /**     * Make sure our title number is valid.     */    mp_msg(MSGT_OPEN,MSGL_INFO, MSGTR_DVDnumTitles,             tt_srpt->nr_of_srpts );    if( dvd_title < 1 || dvd_title > tt_srpt->nr_of_srpts ) {	mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidTitle, dvd_title);        ifoClose( vmg_file );        DVDClose( dvd );        return NULL;    }    --dvd_title; // remap 1.. -> 0..    /**     * Make sure the chapter number is valid for this title.     */    mp_msg(MSGT_OPEN,MSGL_INFO, MSGTR_DVDnumChapters,             tt_srpt->title[dvd_title].nr_of_ptts );    if( dvd_chapter<1 || dvd_chapter>tt_srpt->title[dvd_title].nr_of_ptts ) {	mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidChapter, dvd_chapter);        ifoClose( vmg_file );        DVDClose( dvd );        return NULL;    }    if( dvd_last_chapter>0 ) {	if ( dvd_last_chapter<dvd_chapter || dvd_last_chapter>tt_srpt->title[dvd_title].nr_of_ptts ) {	    mp_msg(MSGT_OPEN,MSGL_ERR, "Invalid DVD last chapter number: %d\n", dvd_last_chapter);	    ifoClose( vmg_file );	    DVDClose( dvd );	    return NULL;	}    }    --dvd_chapter; // remap 1.. -> 0..    /* XXX No need to remap dvd_last_chapter */    /**     * Make sure the angle number is valid for this title.     */    mp_msg(MSGT_OPEN,MSGL_INFO, MSGTR_DVDnumAngles,             tt_srpt->title[dvd_title].nr_of_angles );    if( dvd_angle<1 || dvd_angle>tt_srpt->title[dvd_title].nr_of_angles ) {	mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidAngle, dvd_angle);        ifoClose( vmg_file );        DVDClose( dvd );        return NULL;    }    --dvd_angle; // remap 1.. -> 0..    /**     * Load the VTS information for the title set our title is in.     */    vts_file = ifoOpen( dvd, tt_srpt->title[dvd_title].title_set_nr );    if( !vts_file ) {	mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoIFO,                 tt_srpt->title[dvd_title].title_set_nr );        ifoClose( vmg_file );        DVDClose( dvd );        return NULL;    }    /**     * We've got enough info, time to open the title set data.     */    title = DVDOpenFile( dvd, tt_srpt->title[dvd_title].title_set_nr,                         DVD_READ_TITLE_VOBS );    if( !title ) {	mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoVOBs,                 tt_srpt->title[dvd_title].title_set_nr );        ifoClose( vts_file );        ifoClose( vmg_file );        DVDClose( dvd );        return NULL;    }    mp_msg(MSGT_OPEN,MSGL_INFO, MSGTR_DVDopenOk);    // store data    d=malloc(sizeof(dvd_priv_t)); memset(d,0,sizeof(dvd_priv_t));    d->dvd=dvd;    d->title=title;    d->vmg_file=vmg_file;    d->tt_srpt=tt_srpt;    d->vts_file=vts_file;    /**     * Check number of audio channels and types     */    {     int ac3aid = 128;     int mpegaid = 0;     int pcmaid = 160;          d->nr_of_channels=0;          if ( vts_file->vts_pgcit )       {       int i;       for ( i=0;i<8;i++ )        if ( vts_file->vts_pgcit->pgci_srp[0].pgc->audio_control[i] & 0x8000 )	 {	  audio_attr_t * audio = &vts_file->vtsi_mat->vts_audio_attr[i];	  int language = 0;	  char tmp[] = "unknown";	  	  if ( audio->lang_type == 1 ) 	   {	    language=audio->lang_code;	    tmp[0]=language>>8;	    tmp[1]=language&0xff;	    tmp[2]=0;	   }	            d->audio_streams[d->nr_of_channels].language=language;          d->audio_streams[d->nr_of_channels].id=0;	  switch ( audio->audio_format )	   {	    case 0: // ac3	  	    d->audio_streams[d->nr_of_channels].id=ac3aid;		    ac3aid++;		    break;	    case 6: // dts	            d->audio_streams[d->nr_of_channels].id=ac3aid+8;		    ac3aid++;		    break;	    case 2: // mpeg layer 1/2/3	    case 3: // mpeg2 ext	            d->audio_streams[d->nr_of_channels].id=mpegaid;		    mpegaid++;		    break;	    case 4: // lpcm	            d->audio_streams[d->nr_of_channels].id=pcmaid;		    pcmaid++;		    break;	   }	  d->audio_streams[d->nr_of_channels].type=audio->audio_format;	  // Pontscho: to my mind, tha channels:	  //  1 - stereo	  //  5 - 5.1	  d->audio_streams[d->nr_of_channels].channels=audio->channels;          mp_msg(MSGT_OPEN,MSGL_V,"[open] audio stream: %d audio format: %s (%s) language: %s aid: %d\n",	    d->nr_of_channels,            dvd_audio_stream_types[ audio->audio_format ],	    dvd_audio_stream_channels[ audio->channels ],	    tmp,	    d->audio_streams[d->nr_of_channels].id	    );	  if (identify)	  {	    mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", d->audio_streams[d->nr_of_channels].id);	    if (language && tmp[0])	      mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AID_%d_LANG=%s\n", d->audio_streams[d->nr_of_channels].id, tmp);	  }	    	  d->nr_of_channels++;	 }      }     mp_msg(MSGT_OPEN,MSGL_V,"[open] number of audio channels on disk: %d.\n",d->nr_of_channels );    }    /**     * Check number of subtitles and language     */    {     int i;     d->nr_of_subtitles=0;     for ( i=0;i<32;i++ )      if ( vts_file->vts_pgcit->pgci_srp[0].pgc->subp_control[i] & 0x80000000 )       {        subp_attr_t * subtitle = &vts_file->vtsi_mat->vts_subp_attr[i];	int language = 0;	char tmp[] = "unknown";		if ( subtitle->type == 1 )	 {	  language=subtitle->lang_code;	  tmp[0]=language>>8;	  tmp[1]=language&0xff;	  tmp[2]=0;	 }	 	d->subtitles[ d->nr_of_subtitles ].language=language;	d->subtitles[ d->nr_of_subtitles ].id=d->nr_of_subtitles;	        mp_msg(MSGT_OPEN,MSGL_V,"[open] subtitle ( sid ): %d language: %s\n",	  d->nr_of_subtitles,	  tmp	  );        if (identify)        {	  mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", d->nr_of_subtitles);	  if (language && tmp[0])	    mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_SID_%d_LANG=%s\n", d->nr_of_subtitles, tmp);        }        d->nr_of_subtitles++;       }     mp_msg(MSGT_OPEN,MSGL_V,"[open] number of subtitles on disk: %d\n",d->nr_of_subtitles );    }    /**     * Determine which program chain we want to watch.  This is based on the     * chapter number.     */    ttn = tt_srpt->title[ dvd_title ].vts_ttn; // local    pgc_id = vts_file->vts_ptt_srpt->title[ttn-1].ptt[dvd_chapter].pgcn; // local    pgn    = vts_file->vts_ptt_srpt->title[ttn-1].ptt[dvd_chapter].pgn;  // local    d->cur_pgc = vts_file->vts_pgcit->pgci_srp[pgc_id-1].pgc;    d->cur_cell = d->cur_pgc->program_map[pgn-1] - 1; // start playback here

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -