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

📄 stream_dvdnav.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 2 页
字号:
      double tm;      tm = dvdnav_get_current_time(priv->dvdnav)/90000.0f;      if(tm != -1)      {        *((double *)arg) = tm;        return 1;      }      break;    }    case STREAM_CTRL_SEEK_TO_TIME:    {      uint64_t tm = (uint64_t) (*((double*)arg) * 90000);      if(dvdnav_time_search(priv->dvdnav, tm) == DVDNAV_STATUS_OK)        return 1;      break;    }#endif  }  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;  dvdnav_priv_t *priv;  if(p->device) filename = p->device;   else if(dvd_device) filename= dvd_device;   else filename = DEFAULT_DVD_DEVICE;  if(!(priv=new_dvdnav_stream(filename))) {    mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,filename);    return STREAM_UNSUPPORTED;  }  if(p->track > 0) {    if(dvd_chapter > 0 && dvd_last_chapter > 0 && dvd_chapter > dvd_last_chapter) {      mp_msg(MSGT_OPEN,MSGL_FATAL,"dvdnav_stream, invalid chapter range: %d > %d\n", dvd_chapter, dvd_last_chapter);      return STREAM_UNSUPPORTED;    }    priv->title = p->track;    if(dvdnav_title_play(priv->dvdnav, p->track) != DVDNAV_STATUS_OK) {      mp_msg(MSGT_OPEN,MSGL_FATAL,"dvdnav_stream, couldn't select title %d, error '%s'\n", p->track, dvdnav_err_to_string(priv->dvdnav));      return STREAM_UNSUPPORTED;    }    if(dvd_chapter > 0)      dvdnav_part_play(priv->dvdnav, p->track, dvd_chapter);  } else if(p->track == -1)    dvdnav_menu_call(priv->dvdnav, DVD_MENU_Root);  else {    mp_msg(MSGT_OPEN,MSGL_INFO,"dvdnav_stream, you didn't specify a track number (as in dvdnav://1), playing whole disc\n");    dvdnav_menu_call(priv->dvdnav, DVD_MENU_Title);  }  if(dvd_angle > 1)    dvdnav_angle_change(priv->dvdnav, dvd_angle);  stream->sector_size = 2048;  stream->flags = STREAM_READ | STREAM_SEEK;  stream->fill_buffer = fill_buffer;  stream->seek = seek;  stream->control = control;  stream->close = stream_dvdnav_close;  stream->type = STREAMTYPE_DVDNAV;  stream->priv=(void*)priv;  *file_format = DEMUXER_TYPE_MPEG_PS;  update_title_len(stream);  if(!stream->pos)    mp_msg(MSGT_OPEN,MSGL_ERR, "INIT ERROR: couldn't get init pos %s\r\n", dvdnav_err_to_string(priv->dvdnav));  mp_msg(MSGT_OPEN,MSGL_INFO, "Remember to disable MPlayer's cache when playing dvdnav:// streams (adding -nocache to your command line)\r\n");  return STREAM_OK;}int mp_dvdnav_handle_input(stream_t *stream, int cmd, int *button) {  dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;  dvdnav_t *nav = priv->dvdnav;  dvdnav_status_t status=DVDNAV_STATUS_ERR;  pci_t *pci = dvdnav_get_current_nav_pci(nav);  int reset = 0;  if(cmd != MP_CMD_DVDNAV_SELECT && !pci)    return 0;  switch(cmd) {    case MP_CMD_DVDNAV_UP:      status = dvdnav_upper_button_select(nav, pci);      break;    case MP_CMD_DVDNAV_DOWN:      status = dvdnav_lower_button_select(nav, pci);      break;    case MP_CMD_DVDNAV_LEFT:      status = dvdnav_left_button_select(nav, pci);      break;    case MP_CMD_DVDNAV_RIGHT:      status = dvdnav_right_button_select(nav, pci);      break;    case MP_CMD_DVDNAV_MENU:      status = dvdnav_menu_call(nav,DVD_MENU_Root);      reset = 1;      break;    case MP_CMD_DVDNAV_PREVMENU: {      int title=0, part=0;      dvdnav_current_title_info(nav, &title, &part);      if(title) {        if(dvdnav_menu_call(nav, DVD_MENU_Part) == DVDNAV_STATUS_OK           || dvdnav_menu_call(nav, DVD_MENU_Title) == DVDNAV_STATUS_OK) {          reset = 1;          break;        }      }      if(dvdnav_menu_call(nav, DVD_MENU_Root) == DVDNAV_STATUS_OK)        reset = 1;      }      break;    case MP_CMD_DVDNAV_SELECT:      status = dvdnav_button_activate(nav, pci);      if(status == DVDNAV_STATUS_OK) reset = 1;      break;    case MP_CMD_DVDNAV_MOUSECLICK:      /*        this is a workaround: in theory the simple dvdnav_lower_button_select()+dvdnav_button_activate()        should be enough (and generally it is), but there are cases when the calls to dvdnav_lower_button_select()        and friends fail! Hence we have to call dvdnav_mouse_activate(priv->mousex, priv->mousey) with        the coodinates saved by mp_dvdnav_update_mouse_pos().        This last call always works well      */      status = dvdnav_mouse_activate(nav, pci, priv->mousex, priv->mousey);      if(status == DVDNAV_STATUS_OK) reset = 1;      break;    default:      mp_msg(MSGT_CPLAYER, MSGL_V, "Unknown DVDNAV cmd %d\n", cmd);      break;  }  if(status == DVDNAV_STATUS_OK)    dvdnav_get_current_highlight(nav, button);  return reset;}void mp_dvdnav_update_mouse_pos(stream_t *stream, int32_t x, int32_t y, int* button) {  dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;  dvdnav_t *nav = priv->dvdnav;  dvdnav_status_t status;  pci_t *pci = dvdnav_get_current_nav_pci(nav);  if(!pci) return;  status = dvdnav_mouse_select(nav, pci, x, y);  if(status == DVDNAV_STATUS_OK) dvdnav_get_current_highlight(nav, button);  else *button = -1;  priv->mousex = x;  priv->mousey = y;}/** * \brief dvdnav_aid_from_lang() returns the audio id corresponding to the language code 'lang' * \param stream: - stream pointer * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */int dvdnav_aid_from_lang(stream_t *stream, unsigned char *language) {  dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;  int k;  uint8_t format, lg;  uint16_t lang, lcode;;#ifdef DVDNAV_FORMAT_AC3  //this macro is defined only in libdvdnav-cvs  while(language && strlen(language)>=2) {    lcode = (language[0] << 8) | (language[1]);    for(k=0; k<32; k++) {      lg = dvdnav_get_audio_logical_stream(priv->dvdnav, k);      if(lg == 0xff) continue;      lang = dvdnav_audio_stream_to_lang(priv->dvdnav, lg);      if(lang != 0xFFFF && lang == lcode) {        format = dvdnav_audio_stream_format(priv->dvdnav, lg);        switch(format) {          case DVDNAV_FORMAT_AC3:            return k+128;          case DVDNAV_FORMAT_DTS:            return k+136;          case DVDNAV_FORMAT_LPCM:            return k+160;          case DVDNAV_FORMAT_MPEGAUDIO:            return k;          default:            return -1;        }      }    }    language += 2;    while(language[0]==',' || language[0]==' ') ++language;  }#endif  return -1;}/** * \brief dvdnav_lang_from_aid() assigns to buf the language corresponding to audio id 'aid' * \param stream: - stream pointer * \param sid: physical subtitle id * \param buf: buffer to contain the 2-chars language string * \return 0 on error, 1 if successful */int dvdnav_lang_from_aid(stream_t *stream, int aid, unsigned char *buf) {  uint8_t lg;  uint16_t lang;  dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;  if(aid < 0)    return 0;  lg = dvdnav_get_audio_logical_stream(priv->dvdnav, aid & 0x7);  if(lg == 0xff) return 0;  lang = dvdnav_audio_stream_to_lang(priv->dvdnav, lg);  if(lang == 0xffff) return 0;  buf[0] = lang >> 8;  buf[1] = lang & 0xFF;  buf[2] = 0;  return 1;}/** * \brief dvdnav_sid_from_lang() returns the subtitle id corresponding to the language code 'lang' * \param stream: - stream pointer * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */int dvdnav_sid_from_lang(stream_t *stream, unsigned char *language) {  dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;  uint8_t lg, k;  uint16_t lang, lcode;  while(language && strlen(language)>=2) {    lcode = (language[0] << 8) | (language[1]);    for(k=0; k<32; k++) {      lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k);      if(lg == 0xff) continue;      lang = dvdnav_spu_stream_to_lang(priv->dvdnav, lg);      if(lang != 0xFFFF && lang == lcode) {        return k;      }    }    language += 2;    while(language[0]==',' || language[0]==' ') ++language;  }  return -1;}/** * \brief dvdnav_lang_from_sid() assigns to buf the language corresponding to subtitle id 'sid' * \param stream: - stream pointer * \param sid: physical subtitle id * \param buf: buffer to contain the 2-chars language string * \return 0 on error, 1 if successful */int dvdnav_lang_from_sid(stream_t *stream, int sid, unsigned char *buf) {    uint8_t lg;    uint16_t lang;    dvdnav_priv_t *priv=(dvdnav_priv_t*)stream->priv;    if(sid < 0) return 0;    lg = dvdnav_get_spu_logical_stream(priv->dvdnav, sid);    lang = dvdnav_spu_stream_to_lang(priv->dvdnav, lg);    if(lang == 0xffff) return 0;    buf[0] = lang >> 8;    buf[1] = lang & 0xFF;    buf[2] = 0;    return 1;}/** * \brief dvdnav_number_of_subs() returns the count of available subtitles * \param stream: - stream pointer * \return 0 on error, something meaningful otherwise */int dvdnav_number_of_subs(stream_t *stream) {  dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;  uint8_t lg, k, n=0;  for(k=0; k<32; k++) {    lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k);    if(lg == 0xff) continue;    n++;  }  return n;}/** * \brief mp_dvdnav_get_spu_clut() returns the spu clut * \param stream: - stream pointer * \return spu clut pointer */unsigned int *mp_dvdnav_get_spu_clut(stream_t *stream) {    dvdnav_priv_t *priv=(dvdnav_priv_t*)stream->priv;    if(!priv->spu_set) return NULL;    return priv->spu_clut;}/** * \brief mp_dvdnav_get_highlight() get dvdnav highlight struct * \param stream: - stream pointer * \param hl    : - highlight struct pointer */void mp_dvdnav_get_highlight (stream_t *stream, nav_highlight_t *hl) {  dvdnav_priv_t *priv = (dvdnav_priv_t *) stream->priv;  dvdnav_highlight_event_t hlev = priv->hlev;  hl->sx = hlev.sx;  hl->sy = hlev.sy;  hl->ex = hlev.ex;  hl->ey = hlev.ey;}stream_info_t stream_info_dvdnav = {  "DVDNAV stream",  "null",  "",  "",  open_s,  { "dvdnav", NULL },  &stream_opts,  1 // Urls are an option string};

⌨️ 快捷键说明

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