[vlc-devel] commit: Fix rate slower/faster in rewind mode. (Laurent Aimar )
git version control
git at videolan.org
Fri Nov 21 15:35:40 CET 2008
vlc | branch: 0.9-bugfix | Laurent Aimar <fenrir at videolan.org> | Thu Nov 20 19:21:22 2008 +0100| [15f3efd9842ee3bceca4518a2c31861943a5ca31] | committer: Jean-Paul Saman
Fix rate slower/faster in rewind mode.
(cherry picked from commit: 4ad64a6000d86ac689be9bc0ba8248203c90ccb7)
Signed-off-by: Jean-Paul Saman <jpsaman at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=15f3efd9842ee3bceca4518a2c31861943a5ca31
---
modules/demux/live555.cpp | 1 -
src/input/input.c | 41 ++++++++++++++++++++++++++++++++---------
2 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/modules/demux/live555.cpp b/modules/demux/live555.cpp
index dd243f1..b7b92a1 100644
--- a/modules/demux/live555.cpp
+++ b/modules/demux/live555.cpp
@@ -1369,7 +1369,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
p_sys->i_npt_start = 0;
p_sys->i_pcr = 0;
p_sys->i_npt = 0.0;
- es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
*pi_int = (int)( INPUT_RATE_DEFAULT / p_sys->ms->scale() );
msg_Dbg( p_demux, "PLAY with new Scale %0.2f (%d)", p_sys->ms->scale(), (*pi_int) );
diff --git a/src/input/input.c b/src/input/input.c
index d0393f9..f0b773a 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -1599,10 +1599,13 @@ static bool Control( input_thread_t *p_input, int i_type,
case INPUT_CONTROL_SET_RATE_FASTER:
{
int i_rate;
+ int i_rate_sign;
+ /* Get rate and direction */
if( i_type == INPUT_CONTROL_SET_RATE )
{
- i_rate = val.i_int;
+ i_rate = abs( val.i_int );
+ i_rate_sign = val.i_int < 0 ? -1 : 1;
}
else
{
@@ -1616,12 +1619,14 @@ static bool Control( input_thread_t *p_input, int i_type,
int i_idx;
int i;
+ i_rate_sign = p_input->p->i_rate < 0 ? -1 : 1;
+
i_error = INT_MAX;
i_idx = -1;
for( i = 0; ppi_factor[i][0] != 0; i++ )
{
const int i_test_r = INPUT_RATE_DEFAULT * ppi_factor[i][0] / ppi_factor[i][1];
- const int i_test_e = abs(p_input->p->i_rate - i_test_r);
+ const int i_test_e = abs( abs( p_input->p->i_rate ) - i_test_r );
if( i_test_e < i_error )
{
i_idx = i;
@@ -1648,12 +1653,8 @@ static bool Control( input_thread_t *p_input, int i_type,
}
}
- if( (i_rate < 0) && p_input->p->input.b_rescale_ts )
- {
- msg_Dbg( p_input, "cannot set negative rate" );
- i_rate = INPUT_RATE_MIN;
- }
- else if( (i_rate > 0) && (i_rate < INPUT_RATE_MIN) )
+ /* Check rate bound */
+ if( i_rate < INPUT_RATE_MIN )
{
msg_Dbg( p_input, "cannot set rate faster" );
i_rate = INPUT_RATE_MIN;
@@ -1663,6 +1664,22 @@ static bool Control( input_thread_t *p_input, int i_type,
msg_Dbg( p_input, "cannot set rate slower" );
i_rate = INPUT_RATE_MAX;
}
+
+ /* Apply direction */
+ if( i_rate_sign < 0 )
+ {
+ if( p_input->p->input.b_rescale_ts )
+ {
+ msg_Dbg( p_input, "cannot set negative rate" );
+ i_rate = p_input->p->i_rate;
+ assert( i_rate > 0 );
+ }
+ else
+ {
+ i_rate *= i_rate_sign;
+ }
+ }
+
if( i_rate != INPUT_RATE_DEFAULT &&
( ( !p_input->b_can_pace_control && !p_input->p->b_can_rate_control ) ||
( p_input->p->p_sout && !p_input->p->b_out_pace_control ) ) )
@@ -1675,10 +1692,17 @@ static bool Control( input_thread_t *p_input, int i_type,
{
int i_ret;
if( p_input->p->input.p_access )
+ {
i_ret = VLC_EGENERIC;
+ }
else
+ {
+ if( !p_input->p->input.b_rescale_ts )
+ es_out_Control( p_input->p->p_es_out, ES_OUT_RESET_PCR );
+
i_ret = demux_Control( p_input->p->input.p_demux,
DEMUX_SET_RATE, &i_rate );
+ }
if( i_ret )
{
msg_Warn( p_input, "ACCESS/DEMUX_SET_RATE failed" );
@@ -1695,7 +1719,6 @@ static bool Control( input_thread_t *p_input, int i_type,
p_input->p->i_rate = i_rate;
- /* FIXME do we need a RESET_PCR when !p_input->p->input.b_rescale_ts ? */
if( p_input->p->input.b_rescale_ts )
input_EsOutChangeRate( p_input->p->p_es_out, i_rate );
More information about the vlc-devel
mailing list