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

📄 stream_dvd.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 3 页
字号:
            *((double *)arg) = !d->vts_file->vtsi_mat->vts_video_attr.display_aspect_ratio ? 4.0/3.0 : 16.0/9.0;            return 1;        }    }    return STREAM_UNSUPPORTED;}static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {  struct stream_priv_s* p = (struct stream_priv_s*)opts;  char *filename;  int k;  filename = strdup(stream->url);  mp_msg(MSGT_OPEN,MSGL_V,"URL: %s\n", filename);  dvd_title = p->title;  if(1){    //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;    pgc_t *pgc;    /**     * Open the disc.     */    if(!dvd_device) dvd_device=strdup(DEFAULT_DVD_DEVICE);    dvd_set_speed(dvd_device, dvd_speed);#ifdef SYS_DARWIN    /* Dynamic DVD drive selection on Darwin */    if(!strcmp(dvd_device, "/dev/rdiskN")) {      int i;      size_t len = strlen(dvd_device)+1;      char *temp_device = malloc(len);      for (i = 1; i < 10; i++) {        snprintf(temp_device, len, "/dev/rdisk%d", i);        dvd = DVDOpen(temp_device);        if(!dvd) {          mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,temp_device);        } else {#if DVDREAD_VERSION <= LIBDVDREAD_VERSION(0,9,4)          dvd_file_t *dvdfile = DVDOpenFile(dvd,dvd_title,DVD_READ_INFO_FILE);          if(!dvdfile) {            mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,temp_device);            DVDClose(dvd);            continue;          }          DVDCloseFile(dvdfile);#endif          break;        }      }      free(temp_device);      if(!dvd) {        m_struct_free(&stream_opts,opts);        return STREAM_UNSUPPORTED;      }    } else#endif /* SYS_DARWIN */    {        dvd = DVDOpen(dvd_device);        if(!dvd) {          mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,dvd_device);          m_struct_free(&stream_opts,opts);          return STREAM_UNSUPPORTED;        }    }    mp_msg(MSGT_OPEN,MSGL_V,"Reading disc structure, please wait...\n");    /**     * 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, MSGTR_DVDnoVMG);      DVDClose( dvd );      m_struct_free(&stream_opts,opts);      return STREAM_UNSUPPORTED;    }    tt_srpt = vmg_file->tt_srpt;    if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO))    {      int title_no; ///< title number      mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLES=%d\n", tt_srpt->nr_of_srpts);      for (title_no = 0; title_no < tt_srpt->nr_of_srpts; title_no++)      {        mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLE_%d_CHAPTERS=%d\n", title_no + 1, tt_srpt->title[title_no].nr_of_ptts);        mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLE_%d_ANGLES=%d\n", title_no + 1, tt_srpt->title[title_no].nr_of_angles);      }    }    if (mp_msg_test(MSGT_IDENTIFY, MSGL_V))    {      unsigned char discid [16]; ///< disk ID, a 128 bit MD5 sum      int vts_no;   ///< video title set number      for (vts_no = 1; vts_no <= vmg_file->vts_atrt->nr_of_vtss; vts_no++)        mp_describe_titleset(dvd, tt_srpt, vts_no);      if (DVDDiscID(dvd, discid) >= 0)      {        int i;        mp_msg(MSGT_IDENTIFY, MSGL_V, "ID_DVD_DISC_ID=");        for (i = 0; i < 16; i ++)          mp_msg(MSGT_IDENTIFY, MSGL_V, "%02X", discid[i]);        mp_msg(MSGT_IDENTIFY, MSGL_V, "\n");      }    }    /**     * Make sure our title number is valid.     */    mp_msg(MSGT_OPEN,MSGL_STATUS, 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 );      m_struct_free(&stream_opts,opts);      return STREAM_UNSUPPORTED;    }    mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_CURRENT_TITLE=%d\n", dvd_title);    --dvd_title; // remap 1.. -> 0..    /**     * Make sure the chapter number is valid for this title.     */    mp_msg(MSGT_OPEN,MSGL_STATUS, 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);      goto fail;    }    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, MSGTR_DVDinvalidLastChapter, dvd_last_chapter);        goto fail;      }    }    --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_STATUS, 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);      goto fail;    }    --dvd_angle; // remap 1.. -> 0..    ttn = tt_srpt->title[dvd_title].vts_ttn - 1;    /**     * 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 );      goto fail;    }    /**     * 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 );      goto fail;    }    mp_msg(MSGT_OPEN,MSGL_V, "DVD successfully opened.\n");    // 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;    d->cur_title = dvd_title+1;    pgc = vts_file->vts_pgcit ? vts_file->vts_pgcit->pgci_srp[ttn].pgc : NULL;    /**     * Check number of audio channels and types     */    {      d->nr_of_channels=0;      if(vts_file->vts_pgcit) {        int i;        for(i=0;i<8;i++)#ifdef USE_DVDREAD_INTERNAL          if(pgc->audio_control[i].present) {#else          if(pgc->audio_control[i] & 0x8000) {#endif            audio_attr_t * audio = &vts_file->vtsi_mat->vts_audio_attr[i];            int language = 0;            char tmp[] = "unknown";            stream_language_t *audio_stream = &d->audio_streams[d->nr_of_channels];            if(audio->lang_type == 1) {              language=audio->lang_code;              tmp[0]=language>>8;              tmp[1]=language&0xff;              tmp[2]=0;            }            audio_stream->language=language;#ifdef USE_DVDREAD_INTERNAL            audio_stream->id=pgc->audio_control[i].s_audio;#else            audio_stream->id=pgc->audio_control[i] >> 8 & 7;#endif            switch(audio->audio_format) {              case 0: // ac3                audio_stream->id+=FIRST_AC3_AID;                break;              case 6: // dts                audio_stream->id+=FIRST_DTS_AID;                break;              case 2: // mpeg layer 1/2/3              case 3: // mpeg2 ext                audio_stream->id+=FIRST_MPG_AID;                break;              case 4: // lpcm                audio_stream->id+=FIRST_PCM_AID;                break;           }           audio_stream->type=audio->audio_format;           // Pontscho: to my mind, tha channels:           //  1 - stereo           //  5 - 5.1           audio_stream->channels=audio->channels;           mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDaudioStreamInfo,             d->nr_of_channels,             dvd_audio_stream_types[ audio->audio_format ],             dvd_audio_stream_channels[ audio->channels ],             tmp,             audio_stream->id           );           mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", audio_stream->id);           if(language && tmp[0])             mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", audio_stream->id, tmp);           d->nr_of_channels++;         }      }      mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDnumAudioChannels,d->nr_of_channels );    }    /**     * Check number of subtitles and language     */    {      int i;      d->nr_of_subtitles=0;      for(i=0;i<32;i++)#ifdef USE_DVDREAD_INTERNAL      if(pgc->subp_control[i].present) {#else      if(pgc->subp_control[i] & 0x80000000) {#endif        subp_attr_t * subtitle = &vts_file->vtsi_mat->vts_subp_attr[i];        video_attr_t *video = &vts_file->vtsi_mat->vts_video_attr;        int language = 0;        char tmp[] = "unknown";        stream_language_t *sub_stream = &d->subtitles[d->nr_of_subtitles];        if(subtitle->type == 1) {          language=subtitle->lang_code;          tmp[0]=language>>8;          tmp[1]=language&0xff;          tmp[2]=0;        }        sub_stream->language=language;        sub_stream->id=d->nr_of_subtitles;        if(video->display_aspect_ratio == 0) /* 4:3 */#ifdef USE_DVDREAD_INTERNAL          sub_stream->id = pgc->subp_control[i].s_4p3;#else          sub_stream->id = pgc->subp_control[i] >> 24 & 31;#endif        else if(video->display_aspect_ratio == 3) /* 16:9 */#ifdef USE_DVDREAD_INTERNAL          sub_stream->id = pgc->subp_control[i].s_lbox;#else          sub_stream->id = pgc->subp_control[i] >> 8 & 31;#endif        mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDsubtitleLanguage, sub_stream->id, tmp);        mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sub_stream->id);        if(language && tmp[0])          mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sub_stream->id, tmp);        d->nr_of_subtitles++;      }      mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDnumSubtitles,d->nr_of_subtitles);    }    /**     * Determine which program chain we want to watch.  This is based on the     * chapter number.     */    pgc_id = vts_file->vts_ptt_srpt->title[ttn].ptt[dvd_chapter].pgcn; // local    pgn  = vts_file->vts_ptt_srpt->title[ttn].ptt[dvd_chapter].pgn;  // local    d->cur_pgc_idx = pgc_id-1;    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    d->packs_left=-1;      // for Navi stuff    d->angle_seek=0;    /* XXX dvd_last_chapter is in the range 1..nr_of_ptts */    if(dvd_last_chapter > 0 && dvd_last_chapter < tt_srpt->title[dvd_title].nr_of_ptts) {      pgn=vts_file->vts_ptt_srpt->title[ttn].ptt[dvd_last_chapter].pgn;      d->last_cell=d->cur_pgc->program_map[pgn-1] - 1;    } else      d->last_cell=d->cur_pgc->nr_of_cells;    if(d->cur_pgc->cell_playback[d->cur_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK )       d->cur_cell+=dvd_angle;    d->cur_pack = d->cur_pgc->cell_playback[ d->cur_cell ].first_sector;    d->cell_last_pack=d->cur_pgc->cell_playback[ d->cur_cell ].last_sector;    mp_msg(MSGT_DVD,MSGL_V, "DVD start cell: %d  pack: 0x%X-0x%X  \n",d->cur_cell,d->cur_pack,d->cell_last_pack);    //assign cell_times_table    d->cell_times_table = malloc(sizeof(unsigned int) * d->cur_pgc->nr_of_cells);    if(d->cell_times_table == NULL)      return STREAM_UNSUPPORTED;    for(k=0; k<d->cur_pgc->nr_of_cells; k++)      d->cell_times_table[k] = mp_dvdtimetomsec(&d->cur_pgc->cell_playback[k].playback_time);    list_chapters(d->cur_pgc);    // ... (unimplemented)    //    return NULL;    stream->type = STREAMTYPE_DVD;    stream->sector_size = 2048;    stream->flags = STREAM_READ | STREAM_SEEK;    stream->fill_buffer = fill_buffer;    stream->seek = seek;    stream->control = control;    stream->close = stream_dvd_close;    stream->start_pos = (off_t)d->cur_pack*2048;    stream->end_pos = (off_t)(d->cur_pgc->cell_playback[d->last_cell-1].last_sector)*2048;    *file_format = DEMUXER_TYPE_MPEG_PS;    mp_msg(MSGT_DVD,MSGL_V,"DVD start=%d end=%d  \n",d->cur_pack,d->cur_pgc->cell_playback[d->last_cell-1].last_sector);    stream->priv = (void*)d;    return STREAM_OK;fail:      ifoClose(vmg_file);      DVDClose(dvd);      m_struct_free(&stream_opts, opts);      return STREAM_UNSUPPORTED;  }  mp_msg(MSGT_DVD,MSGL_ERR,MSGTR_NoDVDSupport);  m_struct_free(&stream_opts,opts);  return STREAM_UNSUPPORTED;}stream_info_t stream_info_dvd = {  "DVD stream",  "null",  "",  "",  open_s,  { "dvd", NULL },  &stream_opts,  1 // Urls are an option string};

⌨️ 快捷键说明

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