[vlc-devel] commit: Fixed some DVD menus. (Laurent Aimar )
git version control
git at videolan.org
Wed Mar 11 23:49:29 CET 2009
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Mar 11 23:35:14 2009 +0100| [49897b2f203b47594bff526c275c7a1d949652f3] | committer: Laurent Aimar
Fixed some DVD menus.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=49897b2f203b47594bff526c275c7a1d949652f3
---
modules/access/dvdnav.c | 61 ++++++++++++++++++++++++++++++++--------------
1 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c
index 77a8e3a..1df2516 100644
--- a/modules/access/dvdnav.c
+++ b/modules/access/dvdnav.c
@@ -129,6 +129,9 @@ struct demux_sys_t
{
dvdnav_t *dvdnav;
+ /* */
+ bool b_reset_pcr;
+
/* track */
ps_track_t tk[PS_TK_COUNT];
int i_mux_rate;
@@ -220,6 +223,7 @@ static int Open( vlc_object_t *p_this )
/* Fill p_demux field */
DEMUX_INIT_COMMON(); p_sys = p_demux->p_sys;
p_sys->dvdnav = p_dvdnav;
+ p_sys->b_reset_pcr = false;
ps_track_init( p_sys->tk );
p_sys->i_aspect = -1;
@@ -618,6 +622,11 @@ static int Demux( demux_t *p_demux )
{
case DVDNAV_BLOCK_OK: /* mpeg block */
p_sys->p_ev->b_still = false;
+ if( p_sys->b_reset_pcr )
+ {
+ es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
+ p_sys->b_reset_pcr = false;
+ }
DemuxBlock( p_demux, packet, i_len );
break;
@@ -628,9 +637,25 @@ static int Demux( demux_t *p_demux )
case DVDNAV_STILL_FRAME:
{
dvdnav_still_event_t *event = (dvdnav_still_event_t*)packet;
+ bool b_still_init = false;
+
vlc_mutex_lock( &p_sys->p_ev->lock );
if( !p_sys->p_ev->b_still )
{
+ msg_Dbg( p_demux, "DVDNAV_STILL_FRAME" );
+ msg_Dbg( p_demux, " - length=0x%x", event->length );
+ p_sys->p_ev->b_still = true;
+ b_still_init = true;
+ if( event->length == 0xff )
+ p_sys->p_ev->i_still_end = 0;
+ else
+ p_sys->p_ev->i_still_end = mdate() +
+ event->length * INT64_C(1000000);
+ }
+ vlc_mutex_unlock( &p_sys->p_ev->lock );
+
+ if( b_still_init )
+ {
/* We send a dummy mpeg2 end of sequence to force still frame display */
static const uint8_t buffer[] = {
0x00, 0x00, 0x01, 0xe0, 0x00, 0x07,
@@ -639,20 +664,10 @@ static int Demux( demux_t *p_demux )
};
DemuxBlock( p_demux, buffer, sizeof(buffer) );
- msg_Dbg( p_demux, "DVDNAV_STILL_FRAME" );
- msg_Dbg( p_demux, " - length=0x%x", event->length );
- p_sys->p_ev->b_still = true;
- if( event->length == 0xff )
- {
- p_sys->p_ev->i_still_end = 0;
- }
- else
- {
- p_sys->p_ev->i_still_end = (int64_t)event->length *
- 1000000 + mdate();
- }
+ bool b_empty;
+ es_out_Control( p_demux->out, ES_OUT_GET_EMPTY, &b_empty );
+ p_sys->b_reset_pcr = true;
}
- vlc_mutex_unlock( &p_sys->p_ev->lock );
msleep( 40000 );
break;
}
@@ -827,15 +842,23 @@ static int Demux( demux_t *p_demux )
case DVDNAV_HOP_CHANNEL:
msg_Dbg( p_demux, "DVDNAV_HOP_CHANNEL" );
- /* We should try to flush all our internal buffer */
+ es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
break;
case DVDNAV_WAIT:
msg_Dbg( p_demux, "DVDNAV_WAIT" );
- /* reset PCR */
- es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
- dvdnav_wait_skip( p_sys->dvdnav );
+ bool b_empty;
+ es_out_Control( p_demux->out, ES_OUT_GET_EMPTY, &b_empty );
+ if( !b_empty )
+ {
+ msleep( 40*1000 );
+ }
+ else
+ {
+ dvdnav_wait_skip( p_sys->dvdnav );
+ p_sys->b_reset_pcr = true;
+ }
break;
default:
@@ -1109,7 +1132,7 @@ static int DemuxBlock( demux_t *p_demux, const uint8_t *pkt, int i_pkt )
int i_mux_rate;
if( !ps_pkt_parse_pack( p_pkt, &i_scr, &i_mux_rate ) )
{
- es_out_Control( p_demux->out, ES_OUT_SET_PCR, i_scr );
+ es_out_Control( p_demux->out, ES_OUT_SET_PCR, i_scr + 1 );
if( i_mux_rate > 0 ) p_sys->i_mux_rate = i_mux_rate;
}
block_Release( p_pkt );
@@ -1280,7 +1303,7 @@ static void* EventThread( vlc_object_t *p_this )
var_AddCallback( p_ev->p_libvlc, "key-action", EventKey, p_ev );
/* main loop */
- while( vlc_object_alive (p_ev) )
+ while( vlc_object_alive( p_ev ) )
{
bool b_activated = false;
More information about the vlc-devel
mailing list