From 1ef7820e6e2a581ee0c3f4b5e4086b8d2f95945e Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 3 Aug 2015 23:40:41 +0200 Subject: stream_dvdnav: rip out lower-level menu implementation Separate because it might cause regressions. --- stream/stream_dvdnav.c | 262 ++----------------------------------------------- 1 file changed, 7 insertions(+), 255 deletions(-) (limited to 'stream/stream_dvdnav.c') diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c index e9a78d398c..e2562dbcbc 100644 --- a/stream/stream_dvdnav.c +++ b/stream/stream_dvdnav.c @@ -39,7 +39,6 @@ #include "osdep/timer.h" #include "stream.h" #include "demux/demux.h" -#include "discnav.h" #include "video/out/vo.h" #include "stream_dvd_common.h" @@ -54,11 +53,6 @@ struct priv { int title; uint32_t spu_clut[16]; bool spu_clut_valid; - dvdnav_highlight_event_t hlev; - int still_length; // still frame duration - unsigned long next_event; // bitmask of events to return to player - bool suspended_read; - bool nav_enabled; bool had_initial_vts; int dvd_speed; @@ -97,126 +91,9 @@ static const char *const mp_dvdnav_events[] = { DNE(DVDNAV_WAIT), }; -static const char *const mp_nav_cmd_types[] = { - DNE(MP_NAV_CMD_NONE), - DNE(MP_NAV_CMD_ENABLE), - DNE(MP_NAV_CMD_DRAIN_OK), - DNE(MP_NAV_CMD_RESUME), - DNE(MP_NAV_CMD_SKIP_STILL), - DNE(MP_NAV_CMD_MENU), - DNE(MP_NAV_CMD_MOUSE_POS), -}; - -static const char *const mp_nav_event_types[] = { - DNE(MP_NAV_EVENT_NONE), - DNE(MP_NAV_EVENT_RESET), - DNE(MP_NAV_EVENT_RESET_CLUT), - DNE(MP_NAV_EVENT_RESET_ALL), - DNE(MP_NAV_EVENT_DRAIN), - DNE(MP_NAV_EVENT_STILL_FRAME), - DNE(MP_NAV_EVENT_HIGHLIGHT), - DNE(MP_NAV_EVENT_MENU_MODE), - DNE(MP_NAV_EVENT_EOF), -}; - #define LOOKUP_NAME(array, i) \ (((i) >= 0 && (i) < MP_ARRAY_SIZE(array)) ? array[(i)] : "?") -static void dvdnav_get_highlight(struct priv *priv, int display_mode) -{ - pci_t *pnavpci = NULL; - dvdnav_highlight_event_t *hlev = &(priv->hlev); - int btnum; - - if (!priv || !priv->dvdnav) - return; - - pnavpci = dvdnav_get_current_nav_pci(priv->dvdnav); - if (!pnavpci) { - hlev->display = 0; - return; - } - - dvdnav_get_current_highlight(priv->dvdnav, &(hlev->buttonN)); - hlev->display = display_mode; /* show */ - - if (hlev->buttonN > 0 && pnavpci->hli.hl_gi.btn_ns > 0 && hlev->display) { - for (btnum = 0; btnum < pnavpci->hli.hl_gi.btn_ns; btnum++) { - btni_t *btni = &(pnavpci->hli.btnit[btnum]); - - if (hlev->buttonN == btnum + 1) { - hlev->sx = FFMIN(btni->x_start, btni->x_end); - hlev->ex = FFMAX(btni->x_start, btni->x_end); - hlev->sy = FFMIN(btni->y_start, btni->y_end); - hlev->ey = FFMAX(btni->y_start, btni->y_end); - - hlev->palette = (btni->btn_coln == 0) ? - 0 : pnavpci->hli.btn_colit.btn_coli[btni->btn_coln - 1][0]; - break; - } - } - } else { /* hide button or no button */ - hlev->sx = hlev->ex = 0; - hlev->sy = hlev->ey = 0; - hlev->palette = hlev->buttonN = 0; - } -} - -static void handle_menu_input(stream_t *stream, const char *cmd) -{ - struct priv *priv = stream->priv; - dvdnav_t *nav = priv->dvdnav; - dvdnav_status_t status = DVDNAV_STATUS_ERR; - pci_t *pci = dvdnav_get_current_nav_pci(nav); - - MP_VERBOSE(stream, "DVDNAV: input '%s'\n", cmd); - - if (!pci) - return; - - if (strcmp(cmd, "up") == 0) { - status = dvdnav_upper_button_select(nav, pci); - } else if (strcmp(cmd, "down") == 0) { - status = dvdnav_lower_button_select(nav, pci); - } else if (strcmp(cmd, "left") == 0) { - status = dvdnav_left_button_select(nav, pci); - } else if (strcmp(cmd, "right") == 0) { - status = dvdnav_right_button_select(nav, pci); - } else if (strcmp(cmd, "menu") == 0) { - status = dvdnav_menu_call(nav, DVD_MENU_Root); - } else if (strcmp(cmd, "prev") == 0) { - int title = 0, part = 0; - dvdnav_current_title_info(nav, &title, &part); - if (title) - status = dvdnav_menu_call(nav, DVD_MENU_Part); - if (status != DVDNAV_STATUS_OK) - status = dvdnav_menu_call(nav, DVD_MENU_Title); - if (status != DVDNAV_STATUS_OK) - status = dvdnav_menu_call(nav, DVD_MENU_Root); - } else if (strcmp(cmd, "select") == 0) { - status = dvdnav_button_activate(nav, pci); - } else if (strcmp(cmd, "mouse") == 0) { - status = dvdnav_mouse_activate(nav, pci, priv->mousex, priv->mousey); - } else { - MP_VERBOSE(stream, "Unknown DVDNAV command: '%s'\n", cmd); - } -} - -static dvdnav_status_t handle_mouse_pos(stream_t *stream, int x, int y) -{ - struct priv *priv = stream->priv; - dvdnav_t *nav = priv->dvdnav; - pci_t *pci = dvdnav_get_current_nav_pci(nav); - - if (!pci) - return DVDNAV_STATUS_ERR; - - dvdnav_status_t status = dvdnav_mouse_select(nav, pci, x, y); - priv->mousex = x; - priv->mousey = y; - return status; -} - /** * \brief mp_dvdnav_lang_from_aid() returns the language corresponding to audio id 'aid' * \param stream: - stream pointer @@ -284,77 +161,6 @@ static int mp_dvdnav_number_of_subs(stream_t *stream) return n; } -static void handle_cmd(stream_t *s, struct mp_nav_cmd *ev) -{ - struct priv *priv = s->priv; - MP_VERBOSE(s, "DVDNAV: input '%s'\n", - LOOKUP_NAME(mp_nav_cmd_types, ev->event)); - switch (ev->event) { - case MP_NAV_CMD_ENABLE: - priv->nav_enabled = true; - break; - case MP_NAV_CMD_DRAIN_OK: - dvdnav_wait_skip(priv->dvdnav); - break; - case MP_NAV_CMD_RESUME: - priv->suspended_read = false; - break; - case MP_NAV_CMD_SKIP_STILL: - dvdnav_still_skip(priv->dvdnav); - break; - case MP_NAV_CMD_MENU: - handle_menu_input(s, ev->u.menu.action); - break; - case MP_NAV_CMD_MOUSE_POS: - ev->mouse_on_button = handle_mouse_pos(s, ev->u.mouse_pos.x, ev->u.mouse_pos.y); - break; - } - -} - -static inline bool set_event_type(struct priv *priv, int type, - struct mp_nav_event *event) -{ - if (!(priv->next_event & (1 << type))) - return false; - priv->next_event &= ~(1 << type); - event->event = type; - return true; -} - -static void fill_next_event(stream_t *s, struct mp_nav_event **ret) -{ - struct priv *priv = s->priv; - struct mp_nav_event e = {0}; - if (!set_event_type(priv, MP_NAV_EVENT_RESET_ALL, &e)) - for (int n = 0; n < 30 && !set_event_type(priv, n, &e); n++) ; - switch (e.event) { - case MP_NAV_EVENT_NONE: - return; - case MP_NAV_EVENT_HIGHLIGHT: { - dvdnav_highlight_event_t hlev = priv->hlev; - e.u.highlight.display = hlev.display; - e.u.highlight.sx = hlev.sx; - e.u.highlight.sy = hlev.sy; - e.u.highlight.ex = hlev.ex; - e.u.highlight.ey = hlev.ey; - e.u.highlight.palette = hlev.palette; - break; - } - case MP_NAV_EVENT_MENU_MODE: - e.u.menu_mode.enable = !dvdnav_is_domain_vts(priv->dvdnav); - break; - case MP_NAV_EVENT_STILL_FRAME: - e.u.still_frame.seconds = priv->still_length; - break; - } - *ret = talloc(NULL, struct mp_nav_event); - **ret = e; - - MP_VERBOSE(s, "DVDNAV: player event '%s'\n", - LOOKUP_NAME(mp_nav_event_types, e.event)); -} - static int fill_buffer(stream_t *s, char *buf, int max_len) { struct priv *priv = s->priv; @@ -364,9 +170,6 @@ static int fill_buffer(stream_t *s, char *buf, int max_len) return -1; while (1) { - if (priv->suspended_read) - return -1; - int len = -1; int event = DVDNAV_NOP; if (dvdnav_get_next_block(dvdnav, buf, &event, &len) != DVDNAV_STATUS_OK) @@ -378,52 +181,26 @@ static int fill_buffer(stream_t *s, char *buf, int max_len) if (event != DVDNAV_BLOCK_OK) { const char *name = LOOKUP_NAME(mp_dvdnav_events, event); MP_VERBOSE(s, "DVDNAV: event %s (%d).\n", name, event); - dvdnav_get_highlight(priv, 1); } switch (event) { case DVDNAV_BLOCK_OK: return len; - case DVDNAV_STOP: { - priv->next_event |= 1 << MP_NAV_EVENT_EOF; + case DVDNAV_STOP: return 0; - } case DVDNAV_NAV_PACKET: { pci_t *pnavpci = dvdnav_get_current_nav_pci(dvdnav); uint32_t start_pts = pnavpci->pci_gi.vobu_s_ptm; MP_TRACE(s, "start pts = %"PRIu32"\n", start_pts); break; } - case DVDNAV_STILL_FRAME: { - dvdnav_still_event_t *still_event = (dvdnav_still_event_t *) buf; - priv->still_length = still_event->length; - if (priv->still_length == 255) - priv->still_length = -1; - MP_VERBOSE(s, "len=%d\n", priv->still_length); - /* set still frame duration */ - if (priv->still_length <= 1) { - pci_t *pnavpci = dvdnav_get_current_nav_pci(dvdnav); - priv->duration = mp_dvdtimetomsec(&pnavpci->pci_gi.e_eltm); - } - if (priv->nav_enabled) { - priv->next_event |= 1 << MP_NAV_EVENT_STILL_FRAME; - } else { - dvdnav_still_skip(dvdnav); - } + case DVDNAV_STILL_FRAME: + dvdnav_still_skip(dvdnav); return 0; - } - case DVDNAV_WAIT: { - if (priv->nav_enabled) { - priv->next_event |= 1 << MP_NAV_EVENT_DRAIN; - } else { - dvdnav_wait_skip(dvdnav); - } + case DVDNAV_WAIT: + dvdnav_wait_skip(dvdnav); return 0; - } - case DVDNAV_HIGHLIGHT: { - dvdnav_get_highlight(priv, 1); - priv->next_event |= 1 << MP_NAV_EVENT_HIGHLIGHT; + case DVDNAV_HIGHLIGHT: break; - } case DVDNAV_VTS_CHANGE: { int tit = 0, part = 0; dvdnav_vts_change_event_t *vts_event = @@ -437,38 +214,25 @@ static int fill_buffer(stream_t *s, char *buf, int max_len) priv->had_initial_vts = true; break; } - // clear all previous events - priv->next_event = 0; - priv->next_event |= 1 << MP_NAV_EVENT_RESET; - priv->next_event |= 1 << MP_NAV_EVENT_RESET_ALL; if (dvdnav_current_title_info(dvdnav, &tit, &part) == DVDNAV_STATUS_OK) { MP_VERBOSE(s, "DVDNAV, NEW TITLE %d\n", tit); - dvdnav_get_highlight(priv, 0); - if (priv->title > 0 && tit != priv->title) { - priv->next_event |= 1 << MP_NAV_EVENT_EOF;; + if (priv->title > 0 && tit != priv->title) MP_WARN(s, "Requested title not found\n"); - } } - if (priv->nav_enabled) - priv->suspended_read = true; break; } case DVDNAV_CELL_CHANGE: { dvdnav_cell_change_event_t *ev = (dvdnav_cell_change_event_t *)buf; - priv->next_event |= 1 << MP_NAV_EVENT_RESET; - priv->next_event |= 1 << MP_NAV_EVENT_MENU_MODE; if (ev->pgc_length) priv->duration = ev->pgc_length / 90; - dvdnav_get_highlight(priv, 1); break; } case DVDNAV_SPU_CLUT_CHANGE: { memcpy(priv->spu_clut, buf, 16 * sizeof(uint32_t)); priv->spu_clut_valid = true; - priv->next_event |= 1 << MP_NAV_EVENT_RESET_CLUT; break; } } @@ -666,16 +430,6 @@ static int control(stream_t *stream, int cmd, void *arg) memcpy(req->palette, priv->spu_clut, sizeof(req->palette)); return STREAM_OK; } - case STREAM_CTRL_GET_NAV_EVENT: { - struct mp_nav_event **ev = arg; - if (ev) - fill_next_event(stream, ev); - return STREAM_OK; - } - case STREAM_CTRL_NAV_CMD: { - handle_cmd(stream, (struct mp_nav_cmd *)arg); - return STREAM_OK; - } case STREAM_CTRL_GET_DISC_NAME: { const char *volume = NULL; if (dvdnav_get_title_string(dvdnav, &volume) != DVDNAV_STATUS_OK) @@ -783,8 +537,6 @@ static int open_s(stream_t *stream) } else { MP_FATAL(stream, "DVD menu support has been removed.\n"); return STREAM_ERROR; - if (dvdnav_menu_call(priv->dvdnav, DVD_MENU_Root) != DVDNAV_STATUS_OK) - dvdnav_menu_call(priv->dvdnav, DVD_MENU_Title); } if (stream->opts->dvd_angle > 1) dvdnav_angle_change(priv->dvdnav, stream->opts->dvd_angle); -- cgit v1.2.3