Ticket #1043: dvdmenu_cleanup2.patch

File dvdmenu_cleanup2.patch, 4.5 KB (added by skamithi@…, 20 years ago)

additional dvd nav improvements.

  • libs/libmythtv/DVDRingBuffer.h

     
    118118    bool           buttonSelected;
    119119    bool           buttonExists;
    120120    long long      menuspupts;
    121 
     121    int            cellid;
     122    int            lastcellid;
     123    int            vobid;
     124    int            lastvobid;
     125    bool           cellRepeated;
     126   
    122127    NuppelVideoPlayer *parent;
    123128
    124129    bool DrawMenuButton(uint8_t *spu_pkt, int buf_size);
     
    126131    void ClearMenuSPUParameters(void);
    127132    bool MenuButtonChanged(void);
    128133    uint ConvertLangCode(uint16_t code); // converts 2char key to 3char key
     134    void SelectDefaultButton(void);
    129135   
    130136    /* copied from dvdsub.c from ffmpeg */
    131137    int get_nibble(const uint8_t *buf, int nibble_offset);
  • libs/libmythtv/DVDRingBuffer.cpp

     
    3434      skipstillorwait(true), spuStreamLetterbox(false),
    3535      cellstartPos(0), buttonSelected(false),
    3636      buttonExists(false), menuspupts(0),
    37       parent(0)
     37      cellid(0), lastcellid(0),
     38      vobid(0), lastvobid(0),
     39      cellRepeated(false), parent(0)
    3840{
    3941    dvdMenuButton = (AVSubtitleRect*)av_mallocz(sizeof(AVSubtitleRect));
    4042}
     
    222224                dvdnav_get_position(dvdnav, &pos, &length);
    223225                titleLength = length *DVD_BLOCK_SIZE;
    224226                cellstartPos = GetReadPosition();
    225                 buttonSelected = false;
     227                buttonSelected = false;
     228                lastvobid = vobid;
     229                lastcellid = cellid;
     230                vobid = 0;
     231                cellid = 0;
     232                cellRepeated = false;
    226233
    227                 if (parent && parent->GetOSD())
    228                 {
    229                     parent->GetOSD()->HideSet("subtitles");
    230                     parent->GetOSD()->ClearAll("subtitles");
    231                 }
    232 
    233234                if (blockBuf != dvdBlockWriteBuf)
    234235                {
    235236                    dvdnav_free_cache_block(dvdnav, blockBuf);
     
    284285            case DVDNAV_NAV_PACKET:
    285286            {
    286287                lastNav = (dvdnav_t *)blockBuf;
    287                 if (IsInMenu() && NumMenuButtons() > 0 &&
    288                         !buttonSelected)
     288                if (vobid == 0 && cellid == 0)
    289289                {
    290                     pci_t *pci = dvdnav_get_current_nav_pci(dvdnav);
    291 
    292                     uint8_t button = pci->hli.hl_gi.fosl_btnn;
    293                     if (button > 0)
    294                         dvdnav_button_select(dvdnav,pci,button);
    295                     else
    296                         dvdnav_button_select(dvdnav,pci,1);
    297 
    298                     buttonSelected = true;
    299                     spuchanged = false;
     290                    dsi_t *dsi = dvdnav_get_current_nav_dsi(dvdnav);
     291                    vobid  = dsi->dsi_gi.vobu_vob_idn;
     292                    cellid = dsi->dsi_gi.vobu_c_idn;
     293                    if ((lastvobid == vobid) && (lastcellid == cellid)
     294                            && IsInMenu())
     295                        cellRepeated = true;
     296                    if (parent && parent->GetOSD() && !cellRepeated)
     297                    {
     298                        parent->GetOSD()->HideSet("subtitles");
     299                        parent->GetOSD()->ClearAll("subtitles");
     300                    }
     301                   
     302                    if (NumMenuButtons() > 0 && !buttonSelected
     303                                && !cellRepeated)
     304                    {
     305                        SelectDefaultButton();
     306                        buttonSelected = true;
     307                        spuchanged = false;
     308                    }
    300309                }
    301310                if (blockBuf != dvdBlockWriteBuf)
    302311                {
     
    810819    return 0;
    811820}
    812821
     822void DVDRingBufferPriv::SelectDefaultButton(void)
     823{
     824    pci_t *pci = dvdnav_get_current_nav_pci(dvdnav);
     825    int button = pci->hli.hl_gi.fosl_btnn;
     826    if (button > 0)
     827    {
     828        dvdnav_button_select(dvdnav,pci,button);
     829        return;
     830    }
     831    dvdnav_get_current_highlight(dvdnav,&button);
     832    if (button > 0 && button < NumMenuButtons())
     833        dvdnav_button_select(dvdnav,pci,button);
     834    else
     835        dvdnav_button_select(dvdnav,pci,1);   
     836}
     837
    813838void DVDRingBufferPriv::guess_palette(uint32_t *rgba_palette,uint8_t *palette,
    814839                                        uint8_t *alpha)
    815840{