📄 open.c
字号:
#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 + -