Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • Thrillseekr/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
393 results
Show changes
Commits on Source (8)
......@@ -23,6 +23,7 @@
#include "chapter_command.hpp"
#include "demux.hpp"
#include <vlc_subpicture.h> // vlc_spu_highlight_t
#include <algorithm>
namespace mkv {
......@@ -612,7 +613,130 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
return f_result;
}
void dvd_command_interpretor_c::ProcessNavAction( uint16_t button )
{
const pci_t & pci = pci_packet;
if( button <= 0 || button > pci.hli.hl_gi.btn_ns )
return;
SetSPRM( 0x88, button );
const btni_t & button_ptr = pci.hli.btnit[button-1];
if ( button_ptr.auto_action_mode )
{
// process the button action
Interpret( button_ptr.cmd.bytes, 8 );
}
}
void dvd_command_interpretor_c::HandleKeyEvent( NavivationKey key )
{
const pci_t & pci = pci_packet;
uint16_t i_curr_button = GetSPRM( 0x88 );
if( i_curr_button <= 0 || i_curr_button > pci.hli.hl_gi.btn_ns )
return;
const btni_t & button_ptr = pci.hli.btnit[i_curr_button-1];
switch( key )
{
case LEFT: return ProcessNavAction( button_ptr.left );
case RIGHT: return ProcessNavAction( button_ptr.right );
case UP: return ProcessNavAction( button_ptr.up );
case DOWN: return ProcessNavAction( button_ptr.down );
case OK:
// process the button action
Interpret( button_ptr.cmd.bytes, 8 );
break;
default:
break;
}
}
void dvd_command_interpretor_c::HandleMousePressed( unsigned x, unsigned y )
{
const pci_t & pci = pci_packet;
int32_t button;
int32_t best,dist,d;
int32_t mx,my,dx,dy;
// get current button
best = 0;
dist = 0x08000000; /* >> than (720*720)+(567*567); */
for(button = 1; button <= pci.hli.hl_gi.btn_ns; button++)
{
const btni_t & button_ptr = pci.hli.btnit[button-1];
if((x >= button_ptr.x_start)
&& (x <= button_ptr.x_end)
&& (y >= button_ptr.y_start)
&& (y <= button_ptr.y_end))
{
mx = (button_ptr.x_start + button_ptr.x_end)/2;
my = (button_ptr.y_start + button_ptr.y_end)/2;
dx = mx - x;
dy = my - y;
d = (dx*dx) + (dy*dy);
/* If the mouse is within the button and the mouse is closer
* to the center of this button then it is the best choice. */
if(d < dist) {
dist = d;
best = button;
}
}
}
if ( best == 0)
return;
const btni_t & button_ptr = pci.hli.btnit[best-1];
uint16_t i_curr_button = GetSPRM( 0x88 );
vlc_debug( l, "Clicked button %d", best );
// process the button action
SetSPRM( 0x88, best );
Interpret( button_ptr.cmd.bytes, 8 );
vlc_debug( l, "Processed button %d", best );
// select new button
if ( best != i_curr_button )
{
// TODO: make sure we do not overflow in the conversion
vlc_spu_highlight_t spu_hl = vlc_spu_highlight_t();
spu_hl.x_start = (int)button_ptr.x_start;
spu_hl.y_start = (int)button_ptr.y_start;
spu_hl.x_end = (int)button_ptr.x_end;
spu_hl.y_end = (int)button_ptr.y_end;
uint32_t i_palette;
if(button_ptr.btn_coln != 0) {
i_palette = pci.hli.btn_colit.btn_coli[button_ptr.btn_coln-1][1];
} else {
i_palette = 0;
}
for( int i = 0; i < 4; i++ )
{
uint32_t i_yuv = 0xFF;//p_sys->clut[(hl.palette>>(16+i*4))&0x0f];
uint8_t i_alpha = (i_palette>>(i*4))&0x0f;
i_alpha = i_alpha == 0xf ? 0xff : i_alpha << 4;
spu_hl.palette.palette[i][0] = (i_yuv >> 16) & 0xff;
spu_hl.palette.palette[i][1] = (i_yuv >> 0) & 0xff;
spu_hl.palette.palette[i][2] = (i_yuv >> 8) & 0xff;
spu_hl.palette.palette[i][3] = i_alpha;
}
vm.SetHighlight( spu_hl );
}
}
bool dvd_command_interpretor_c::MatchIsDomain( const chapter_codec_cmds_c &data )
{
......@@ -718,6 +842,32 @@ bool dvd_command_interpretor_c::MatchCellNumber( const chapter_codec_cmds_c &dat
return (i_cell_num == i_cell_n);
}
void dvd_command_interpretor_c::SetPci(const pci_t *data)
{
memcpy(&pci_packet, data, sizeof(pci_packet));
#ifndef WORDS_BIGENDIAN
for( uint8_t button = 1; button <= pci_packet.hli.hl_gi.btn_ns &&
button < ARRAY_SIZE(pci_packet.hli.btnit); button++) {
btni_t & button_ptr = pci_packet.hli.btnit[button-1];
binary *p_data = (binary*) &button_ptr;
uint16_t i_x_start = ((p_data[0] & 0x3F) << 4 ) + ( p_data[1] >> 4 );
uint16_t i_x_end = ((p_data[1] & 0x03) << 8 ) + p_data[2];
uint16_t i_y_start = ((p_data[3] & 0x3F) << 4 ) + ( p_data[4] >> 4 );
uint16_t i_y_end = ((p_data[4] & 0x03) << 8 ) + p_data[5];
button_ptr.x_start = i_x_start;
button_ptr.x_end = i_x_end;
button_ptr.y_start = i_y_start;
button_ptr.y_end = i_y_end;
}
for ( uint8_t i = 0; i<3; i++ )
for ( uint8_t j = 0; j<2; j++ )
pci_packet.hli.btn_colit.btn_coli[i][j] = U32_AT( &pci_packet.hli.btn_colit.btn_coli[i][j] );
#endif
}
const std::string matroska_script_interpretor_c::CMD_MS_GOTO_AND_PLAY = "GotoAndPlay";
// see http://www.matroska.org/technical/specs/chapters/index.html#mscript
......
......@@ -26,6 +26,9 @@
#include <vlc_arrays.h>
#include "mkv.hpp"
#include "dvd_types.hpp"
struct vlc_spu_highlight_t;
namespace mkv {
......@@ -42,6 +45,11 @@ public:
virtual virtual_chapter_c *BrowseCodecPrivate( enum chapter_codec_id,
chapter_cmd_match match,
virtual_segment_c * & p_vsegment_found ) = 0;
virtual void SetHighlight( vlc_spu_highlight_t & ) = 0;
};
enum NavivationKey {
LEFT, RIGHT, UP, DOWN, OK
};
class chapter_codec_cmds_c
......@@ -109,6 +117,11 @@ public:
bool Interpret( const binary * p_command, size_t i_size = 8 );
void HandleKeyEvent( NavivationKey );
void HandleMousePressed( unsigned x, unsigned y );
void SetPci(const pci_t *data);
protected:
uint16_t GetPRM( size_t index ) const
{
if ( index < 256 )
......@@ -161,7 +174,8 @@ public:
return false;
}
protected:
void ProcessNavAction( uint16_t button );
std::string GetRegTypeName( bool b_value, uint16_t value ) const
{
std::string result;
......@@ -198,6 +212,7 @@ protected:
uint16_t p_PRMs[256];
struct vlc_logger *l;
chapter_codec_vm & vm;
pci_t pci_packet = {};
// DVD command IDs
......
......@@ -351,4 +351,9 @@ virtual_chapter_c *demux_sys_t::FindVChapter( chapter_uid i_find_uid, virtual_se
return p_result;
}
void demux_sys_t::SetHighlight( vlc_spu_highlight_t & spu_hl )
{
ev.SetHighlight( spu_hl );
}
} // namespace
......@@ -104,6 +104,7 @@ public:
return p_current_vsegment;
}
virtual_chapter_c *FindVChapter( chapter_uid i_find_uid, virtual_segment_c * & p_vsegment_found ) override;
void SetHighlight( vlc_spu_highlight_t & ) override;
void PreloadFamily( const matroska_segment_c & of_segment );
bool PreloadLinked();
......
......@@ -27,7 +27,6 @@
#include <vlc_actions.h>
#include <vlc_threads.h>
#include <vlc_subpicture.h> // vlc_spu_highlight_t
#include <algorithm>
......@@ -38,7 +37,6 @@ event_thread_t::event_thread_t(demux_t *p_demux) : p_demux(p_demux)
vlc_mutex_init( &lock );
vlc_cond_init( &wait );
is_running = false;
memset(&pci_packet, 0, sizeof(pci_packet));
}
event_thread_t::~event_thread_t()
{
......@@ -47,33 +45,17 @@ event_thread_t::~event_thread_t()
void event_thread_t::SetPci(const pci_t *data)
{
demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
vlc_mutex_locker l(&lock);
if(es_list.empty())
return;
memcpy(&pci_packet, data, sizeof(pci_packet));
#ifndef WORDS_BIGENDIAN
for( uint8_t button = 1; button <= pci_packet.hli.hl_gi.btn_ns &&
button < ARRAY_SIZE(pci_packet.hli.btnit); button++) {
btni_t & button_ptr = pci_packet.hli.btnit[button-1];
binary *p_data = (binary*) &button_ptr;
uint16_t i_x_start = ((p_data[0] & 0x3F) << 4 ) + ( p_data[1] >> 4 );
uint16_t i_x_end = ((p_data[1] & 0x03) << 8 ) + p_data[2];
uint16_t i_y_start = ((p_data[3] & 0x3F) << 4 ) + ( p_data[4] >> 4 );
uint16_t i_y_end = ((p_data[4] & 0x03) << 8 ) + p_data[5];
button_ptr.x_start = i_x_start;
button_ptr.x_end = i_x_end;
button_ptr.y_start = i_y_start;
button_ptr.y_end = i_y_end;
auto interpretor = p_sys->GetDVDInterpretor();
if (!interpretor)
return;
}
for ( uint8_t i = 0; i<3; i++ )
for ( uint8_t j = 0; j<2; j++ )
pci_packet.hli.btn_colit.btn_coli[i][j] = U32_AT( &pci_packet.hli.btn_colit.btn_coli[i][j] );
#endif
interpretor->SetPci( data );
if( !is_running )
{
b_abort = false;
......@@ -165,183 +147,84 @@ void *event_thread_t::EventThread(void *data)
return NULL;
}
void event_thread_t::ProcessNavAction( uint16_t button, const pci_t & pci )
void event_thread_t::HandleKeyEvent( EventInfo const& ev )
{
demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
if( button <= 0 || button > pci.hli.hl_gi.btn_ns )
return;
auto interpretor = p_sys->GetDVDInterpretor();
if (!interpretor)
return;
msg_Dbg( p_demux, "Handle Key Event");
interpretor->SetSPRM( 0x88, button );
const btni_t & button_ptr = pci.hli.btnit[button-1];
if ( button_ptr.auto_action_mode )
NavivationKey key;
switch( ev.nav.query )
{
vlc_mutex_unlock( &lock );
vlc_mutex_lock( &p_sys->lock_demuxer );
// process the button action
interpretor->Interpret( button_ptr.cmd.bytes, 8 );
vlc_mutex_unlock( &p_sys->lock_demuxer );
vlc_mutex_lock( &lock );
case DEMUX_NAV_LEFT: key = NavivationKey::LEFT;
case DEMUX_NAV_RIGHT: key = NavivationKey::RIGHT;
case DEMUX_NAV_UP: key = NavivationKey::UP;
case DEMUX_NAV_DOWN: key = NavivationKey::DOWN;
case DEMUX_NAV_ACTIVATE: key = NavivationKey::OK;
default: return;
}
HandleKeyEvent( key );
}
void event_thread_t::HandleKeyEvent( EventInfo const& ev )
void event_thread_t::HandleKeyEvent( NavivationKey key )
{
msg_Dbg( p_demux, "Handle Key Event");
demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
const pci_t & pci = pci_packet;
auto interpretor = p_sys->GetDVDInterpretor();
if (!interpretor)
return;
uint16_t i_curr_button = interpretor->GetSPRM( 0x88 );
if( i_curr_button <= 0 || i_curr_button > pci.hli.hl_gi.btn_ns )
return;
const btni_t & button_ptr = pci.hli.btnit[i_curr_button-1];
switch( ev.nav.query )
{
case DEMUX_NAV_LEFT: return ProcessNavAction( button_ptr.left, pci );
case DEMUX_NAV_RIGHT: return ProcessNavAction( button_ptr.right, pci );
case DEMUX_NAV_UP: return ProcessNavAction( button_ptr.up, pci );
case DEMUX_NAV_DOWN: return ProcessNavAction( button_ptr.down, pci );
case DEMUX_NAV_ACTIVATE:
{
vlc_mutex_unlock( &lock );
vlc_mutex_lock( &p_sys->lock_demuxer );
vlc_mutex_unlock( &lock );
vlc_mutex_lock( &p_sys->lock_demuxer );
// process the button action
interpretor->Interpret( button_ptr.cmd.bytes, 8 );
// process the button action
interpretor->HandleKeyEvent( key );
vlc_mutex_unlock( &p_sys->lock_demuxer );
vlc_mutex_lock( &lock );
}
break;
default:
break;
}
vlc_mutex_unlock( &p_sys->lock_demuxer );
vlc_mutex_lock( &lock );
}
void event_thread_t::HandleMouseEvent( EventInfo const& event )
{
demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
int x = event.mouse.state_new.i_x;
int y = event.mouse.state_new.i_y;
const pci_t & pci = pci_packet;
auto interpretor = p_sys->GetDVDInterpretor();
if (!interpretor)
return;
if( vlc_mouse_HasPressed( &event.mouse.state_old, &event.mouse.state_new,
MOUSE_BUTTON_LEFT ) )
{
int32_t button;
int32_t best,dist,d;
int32_t mx,my,dx,dy;
msg_Dbg( p_demux, "Handle Mouse Event: Mouse clicked x(%d)*y(%d)", x, y);
// get current button
best = 0;
dist = 0x08000000; /* >> than (720*720)+(567*567); */
for(button = 1; button <= pci.hli.hl_gi.btn_ns; button++)
{
const btni_t & button_ptr = pci.hli.btnit[button-1];
if(((unsigned)x >= button_ptr.x_start)
&& ((unsigned)x <= button_ptr.x_end)
&& ((unsigned)y >= button_ptr.y_start)
&& ((unsigned)y <= button_ptr.y_end))
{
mx = (button_ptr.x_start + button_ptr.x_end)/2;
my = (button_ptr.y_start + button_ptr.y_end)/2;
dx = mx - x;
dy = my - y;
d = (dx*dx) + (dy*dy);
/* If the mouse is within the button and the mouse is closer
* to the center of this button then it is the best choice. */
if(d < dist) {
dist = d;
best = button;
}
}
}
HandleMousePressed( (unsigned)x, (unsigned)y );
}
else if( vlc_mouse_HasMoved( &event.mouse.state_old, &event.mouse.state_new ) )
{
// dvdnav_mouse_select( NULL, pci, x, y );
}
}
if ( best != 0)
{
const btni_t & button_ptr = pci.hli.btnit[best-1];
uint16_t i_curr_button = interpretor->GetSPRM( 0x88 );
void event_thread_t::HandleMousePressed( unsigned x, unsigned y )
{
demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
msg_Dbg( &p_sys->demuxer, "Clicked button %d", best );
vlc_mutex_unlock( &lock );
vlc_mutex_lock( &p_sys->lock_demuxer );
auto interpretor = p_sys->GetDVDInterpretor();
if (!interpretor)
return;
// process the button action
interpretor->SetSPRM( 0x88, best );
interpretor->Interpret( button_ptr.cmd.bytes, 8 );
msg_Dbg( p_demux, "Handle Mouse Event: Mouse clicked x(%d)*y(%d)", x, y);
msg_Dbg( &p_sys->demuxer, "Processed button %d", best );
vlc_mutex_unlock( &lock );
vlc_mutex_lock( &p_sys->lock_demuxer );
interpretor->HandleMousePressed( x, y );
vlc_mutex_unlock( &p_sys->lock_demuxer );
vlc_mutex_lock( &lock );
}
// select new button
if ( best != i_curr_button )
{
// TODO: make sure we do not overflow in the conversion
vlc_spu_highlight_t spu_hl = vlc_spu_highlight_t();
spu_hl.x_start = (int)button_ptr.x_start;
spu_hl.y_start = (int)button_ptr.y_start;
spu_hl.x_end = (int)button_ptr.x_end;
spu_hl.y_end = (int)button_ptr.y_end;
uint32_t i_palette;
if(button_ptr.btn_coln != 0) {
i_palette = pci.hli.btn_colit.btn_coli[button_ptr.btn_coln-1][1];
} else {
i_palette = 0;
}
for( int i = 0; i < 4; i++ )
{
uint32_t i_yuv = 0xFF;//p_sys->clut[(hl.palette>>(16+i*4))&0x0f];
uint8_t i_alpha = (i_palette>>(i*4))&0x0f;
i_alpha = i_alpha == 0xf ? 0xff : i_alpha << 4;
spu_hl.palette.palette[i][0] = (i_yuv >> 16) & 0xff;
spu_hl.palette.palette[i][1] = (i_yuv >> 0) & 0xff;
spu_hl.palette.palette[i][2] = (i_yuv >> 8) & 0xff;
spu_hl.palette.palette[i][3] = i_alpha;
}
/* TODO: only control relevant SPU_ES given who fired the event */
for( es_list_t::iterator it = es_list.begin(); it != es_list.end(); ++it )
{
if( it->category != SPU_ES )
continue;
es_out_Control( p_demux->out, ES_OUT_SPU_SET_HIGHLIGHT, it->es, &spu_hl );
}
}
vlc_mutex_unlock( &p_sys->lock_demuxer );
vlc_mutex_lock( &lock );
}
}
else if( vlc_mouse_HasMoved( &event.mouse.state_old, &event.mouse.state_new ) )
void event_thread_t::SetHighlight( vlc_spu_highlight_t & spu_hl )
{
/* TODO: only control relevant SPU_ES given who fired the event */
for( auto it : es_list )
{
// dvdnav_mouse_select( NULL, pci, x, y );
if( it.category != SPU_ES )
continue;
es_out_Control( p_demux->out, ES_OUT_SPU_SET_HIGHLIGHT, it.es, &spu_hl );
}
}
......
......@@ -33,6 +33,8 @@
#include <list>
struct vlc_spu_highlight_t;
namespace mkv {
struct demux_sys_t;
......@@ -46,6 +48,7 @@ public:
void SetPci(const pci_t *data);
void ResetPci();
int SendEventNav( int );
void SetHighlight( vlc_spu_highlight_t & spu_hl );
bool AddES( es_out_id_t* es, int category );
void DelES( es_out_id_t* es );
......@@ -111,8 +114,6 @@ private:
void HandleKeyEvent( EventInfo const& );
void HandleMouseEvent( EventInfo const& );
void ProcessNavAction( uint16_t button, const pci_t & pci );
demux_t *p_demux;
bool is_running;
......@@ -121,13 +122,16 @@ private:
vlc_mutex_t lock;
vlc_cond_t wait;
bool b_abort;
pci_t pci_packet;
typedef std::list<ESInfo> es_list_t;
es_list_t es_list;
typedef std::list<EventInfo> pending_events_t;
pending_events_t pending_events;
private:
void HandleKeyEvent( NavivationKey key );
void HandleMousePressed( unsigned x, unsigned y );
};
} // namespace
......