summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-12-13 20:25:31 +0100
committerwm4 <wm4@nowhere>2014-12-13 20:25:56 +0100
commit5b618ef62976370ca184839d0bd8efd615e9f20e (patch)
tree8be94ca30d18ff40e86fe1b6f4f216cc81078e10 /stream
parentc3275f7e531dc95f68e7a293d1e75684d75725f2 (diff)
downloadmpv-5b618ef62976370ca184839d0bd8efd615e9f20e.tar.bz2
mpv-5b618ef62976370ca184839d0bd8efd615e9f20e.tar.xz
command, dvd: add property which returns list of DVD titles
This was requested. It seems libdvdread can't get the duration for titlesets other than the currently opened title. The data structures contain dangling pointers for these, and MPlayer works this around by opening every title separately for the purpose of dumping the title list.
Diffstat (limited to 'stream')
-rw-r--r--stream/stream.h57
-rw-r--r--stream/stream_dvd.c12
-rw-r--r--stream/stream_dvdnav.c16
3 files changed, 63 insertions, 22 deletions
diff --git a/stream/stream.h b/stream/stream.h
index ccbee9cc1b..4c9805dab3 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -65,33 +65,28 @@ enum streamtype {
#define STREAM_OK 1
enum stream_ctrl {
- STREAM_CTRL_GET_TIME_LENGTH = 1,
- STREAM_CTRL_GET_NUM_CHAPTERS,
- STREAM_CTRL_GET_CURRENT_TIME,
- STREAM_CTRL_SEEK_TO_TIME,
- STREAM_CTRL_GET_SIZE,
- STREAM_CTRL_GET_ASPECT_RATIO,
- STREAM_CTRL_GET_NUM_ANGLES,
- STREAM_CTRL_GET_ANGLE,
- STREAM_CTRL_SET_ANGLE,
- STREAM_CTRL_GET_NUM_TITLES,
- STREAM_CTRL_GET_LANG,
- STREAM_CTRL_GET_CURRENT_TITLE,
- STREAM_CTRL_SET_CURRENT_TITLE,
+ STREAM_CTRL_GET_SIZE = 1,
+
+ // Cache
STREAM_CTRL_GET_CACHE_SIZE,
STREAM_CTRL_SET_CACHE_SIZE,
STREAM_CTRL_GET_CACHE_FILL,
STREAM_CTRL_GET_CACHE_IDLE,
STREAM_CTRL_RESUME_CACHE,
- STREAM_CTRL_RECONNECT,
- STREAM_CTRL_GET_CHAPTER_TIME,
- STREAM_CTRL_GET_DVD_INFO,
+
+ // stream_memory.c
STREAM_CTRL_SET_CONTENTS,
- STREAM_CTRL_GET_METADATA,
+
+ // stream_rar.c
STREAM_CTRL_GET_BASE_FILENAME,
- STREAM_CTRL_GET_NAV_EVENT, // struct mp_nav_event**
- STREAM_CTRL_NAV_CMD, // struct mp_nav_cmd*
- STREAM_CTRL_GET_DISC_NAME,
+
+ // Certain network protocols
+ STREAM_CTRL_RECONNECT,
+ STREAM_CTRL_AVSEEK,
+ STREAM_CTRL_HAS_AVSEEK,
+ STREAM_CTRL_GET_METADATA,
+
+ // TV
STREAM_CTRL_TV_SET_SCAN,
STREAM_CTRL_SET_TV_FREQ,
STREAM_CTRL_GET_TV_FREQ,
@@ -104,8 +99,26 @@ enum stream_ctrl {
STREAM_CTRL_TV_LAST_CHAN,
STREAM_CTRL_DVB_SET_CHANNEL,
STREAM_CTRL_DVB_STEP_CHANNEL,
- STREAM_CTRL_AVSEEK,
- STREAM_CTRL_HAS_AVSEEK,
+
+ // Optical discs
+ STREAM_CTRL_GET_TIME_LENGTH,
+ STREAM_CTRL_GET_DVD_INFO,
+ STREAM_CTRL_GET_NAV_EVENT, // struct mp_nav_event**
+ STREAM_CTRL_NAV_CMD, // struct mp_nav_cmd*
+ STREAM_CTRL_GET_DISC_NAME,
+ STREAM_CTRL_GET_NUM_CHAPTERS,
+ STREAM_CTRL_GET_CURRENT_TIME,
+ STREAM_CTRL_GET_CHAPTER_TIME,
+ STREAM_CTRL_SEEK_TO_TIME,
+ STREAM_CTRL_GET_ASPECT_RATIO,
+ STREAM_CTRL_GET_NUM_ANGLES,
+ STREAM_CTRL_GET_ANGLE,
+ STREAM_CTRL_SET_ANGLE,
+ STREAM_CTRL_GET_NUM_TITLES,
+ STREAM_CTRL_GET_TITLE_LENGTH, // double* (in: title number, out: len)
+ STREAM_CTRL_GET_LANG,
+ STREAM_CTRL_GET_CURRENT_TITLE,
+ STREAM_CTRL_SET_CURRENT_TITLE,
};
struct stream_lang_req {
diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c
index 5ec1e522bd..5be70b2d1d 100644
--- a/stream/stream_dvd.c
+++ b/stream/stream_dvd.c
@@ -541,6 +541,18 @@ static int control(stream_t *stream,int cmd,void* arg)
*((unsigned int *)arg) = d->vmg_file->tt_srpt->nr_of_srpts;
return 1;
}
+ case STREAM_CTRL_GET_TITLE_LENGTH:
+ {
+ int t = *(double *)arg;
+ if (t < 0 || t >= d->vmg_file->tt_srpt->nr_of_srpts)
+ break;
+ if (d->tt_srpt->title[t].title_set_nr !=
+ d->tt_srpt->title[d->dvd_title].title_set_nr)
+ break;
+ *(double *)arg =
+ mp_get_titleset_length(d->vts_file, d->tt_srpt, t) / 1000.0;
+ return 1;
+ }
case STREAM_CTRL_GET_NUM_CHAPTERS:
{
int r;
diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c
index be116e65ba..c1513e9e85 100644
--- a/stream/stream_dvdnav.c
+++ b/stream/stream_dvdnav.c
@@ -535,6 +535,22 @@ static int control(stream_t *stream, int cmd, void *arg)
*((unsigned int*)arg)= num_titles;
return STREAM_OK;
}
+ case STREAM_CTRL_GET_TITLE_LENGTH: {
+ int t = *(double *)arg;
+ int32_t num_titles = 0;
+ if (dvdnav_get_number_of_titles(dvdnav, &num_titles) != DVDNAV_STATUS_OK)
+ break;
+ if (t < 0 || t >= num_titles)
+ break;
+ uint64_t duration = 0;
+ uint64_t *parts = NULL;
+ dvdnav_describe_title_chapters(dvdnav, t + 1, &parts, &duration);
+ if (!parts)
+ break;
+ free(parts);
+ *(double *)arg = duration / 90000.0;
+ return STREAM_OK;
+ }
case STREAM_CTRL_GET_CURRENT_TITLE: {
if (dvdnav_current_title_info(dvdnav, &tit, &part) != DVDNAV_STATUS_OK)
break;