[vlc-commits] es_out: store programs in a list
Rémi Denis-Courmont
git at videolan.org
Wed Jun 13 20:49:25 CEST 2018
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Jun 13 20:38:16 2018 +0300| [19ff03111d2252b338884776c4fdfb1d231cf8aa] | committer: Rémi Denis-Courmont
es_out: store programs in a list
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=19ff03111d2252b338884776c4fdfb1d231cf8aa
---
src/input/es_out.c | 78 +++++++++++++++++++++++++++++-------------------------
1 file changed, 42 insertions(+), 36 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index a6d902e494..2671cea705 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -39,6 +39,7 @@
#include <vlc_aout.h>
#include <vlc_fourcc.h>
#include <vlc_meta.h>
+#include <vlc_list.h>
#include "input_internal.h"
#include "../clock/input_clock.h"
@@ -72,6 +73,7 @@ typedef struct
input_clock_t *p_input_clock;
vlc_meta_t *p_meta;
+ struct vlc_list node;
} es_out_pgrm_t;
struct es_out_id_t
@@ -129,8 +131,7 @@ typedef struct
vlc_mutex_t lock;
/* all programs */
- int i_pgrm;
- es_out_pgrm_t **pgrm;
+ struct vlc_list programs;
es_out_pgrm_t *p_pgrm; /* Master program */
/* all es */
@@ -299,7 +300,7 @@ es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate )
p_sys->b_active = false;
p_sys->i_mode = ES_OUT_MODE_NONE;
- TAB_INIT( p_sys->i_pgrm, p_sys->pgrm );
+ vlc_list_init(&p_sys->programs);
TAB_INIT( p_sys->i_es, p_sys->es );
@@ -331,7 +332,9 @@ static void EsOutDelete( es_out_t *out )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
- assert( !p_sys->i_es && !p_sys->i_pgrm && !p_sys->p_pgrm );
+ assert(p_sys->i_es == 0);
+ assert(vlc_list_is_empty(&p_sys->programs));
+ assert(p_sys->p_pgrm == NULL);
EsOutPropsCleanup( &p_sys->audio );
EsOutPropsCleanup( &p_sys->sub );
@@ -361,16 +364,16 @@ static void EsOutTerminate( es_out_t *out )
TAB_CLEAN( p_sys->i_es, p_sys->es );
/* FIXME duplicate work EsOutProgramDel (but we cannot use it) add a EsOutProgramClean ? */
- for( int i = 0; i < p_sys->i_pgrm; i++ )
+ es_out_pgrm_t *p_pgrm;
+ vlc_list_foreach(p_pgrm, &p_sys->programs, node)
{
- es_out_pgrm_t *p_pgrm = p_sys->pgrm[i];
input_clock_Delete( p_pgrm->p_input_clock );
if( p_pgrm->p_meta )
vlc_meta_Delete( p_pgrm->p_meta );
+ vlc_list_remove(&p_pgrm->node);
free( p_pgrm );
}
- TAB_CLEAN( p_sys->i_pgrm, p_sys->pgrm );
p_sys->p_pgrm = NULL;
@@ -617,8 +620,9 @@ static void EsOutChangePosition( es_out_t *out )
}
}
- for( int i = 0; i < p_sys->i_pgrm; i++ )
- input_clock_Reset( p_sys->pgrm[i]->p_input_clock );
+ es_out_pgrm_t *pgrm;
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ input_clock_Reset(pgrm->p_input_clock);
p_sys->b_buffering = true;
p_sys->i_buffering_extra_initial = 0;
@@ -766,9 +770,10 @@ static bool EsOutIsExtraBufferingAllowed( es_out_t *out )
static void EsOutProgramChangePause( es_out_t *out, bool b_paused, mtime_t i_date )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
+ es_out_pgrm_t *pgrm;
- for( int i = 0; i < p_sys->i_pgrm; i++ )
- input_clock_ChangePause( p_sys->pgrm[i]->p_input_clock, b_paused, i_date );
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ input_clock_ChangePause(pgrm->p_input_clock, b_paused, i_date);
}
static void EsOutDecoderChangeDelay( es_out_t *out, es_out_id_t *p_es )
@@ -791,9 +796,10 @@ static void EsOutDecoderChangeDelay( es_out_t *out, es_out_id_t *p_es )
static void EsOutProgramsChangeRate( es_out_t *out )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
+ es_out_pgrm_t *pgrm;
- for( int i = 0; i < p_sys->i_pgrm; i++ )
- input_clock_ChangeRate( p_sys->pgrm[i]->p_input_clock, p_sys->i_rate );
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ input_clock_ChangeRate(pgrm->p_input_clock, p_sys->i_rate);
}
static void EsOutFrameNext( es_out_t *out )
@@ -1108,7 +1114,7 @@ static es_out_pgrm_t *EsOutProgramAdd( es_out_t *out, int i_group )
input_clock_SetJitter( p_pgrm->p_input_clock, p_sys->i_pts_delay, p_sys->i_cr_average );
/* Append it */
- TAB_APPEND( p_sys->i_pgrm, p_sys->pgrm, p_pgrm );
+ vlc_list_append(&p_pgrm->node, &p_sys->programs);
/* Update "program" variable */
if( EsOutIsProgramVisible( out, i_group ) )
@@ -1127,17 +1133,14 @@ static int EsOutProgramDel( es_out_t *out, int i_group )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
input_thread_t *p_input = p_sys->p_input;
- es_out_pgrm_t *p_pgrm = NULL;
- int i;
+ es_out_pgrm_t *p_pgrm = NULL, *pgrm;
- for( i = 0; i < p_sys->i_pgrm; i++ )
- {
- if( p_sys->pgrm[i]->i_id == i_group )
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ if (pgrm->i_id == i_group)
{
- p_pgrm = p_sys->pgrm[i];
+ p_pgrm = pgrm;
break;
}
- }
if( p_pgrm == NULL )
return VLC_EGENERIC;
@@ -1149,7 +1152,7 @@ static int EsOutProgramDel( es_out_t *out, int i_group )
return VLC_EGENERIC;
}
- TAB_REMOVE( p_sys->i_pgrm, p_sys->pgrm, p_pgrm );
+ vlc_list_remove(&p_pgrm->node);
/* If program is selected we need to unselect it */
if( p_sys->p_pgrm == p_pgrm )
@@ -1172,12 +1175,12 @@ static int EsOutProgramDel( es_out_t *out, int i_group )
static es_out_pgrm_t *EsOutProgramFind( es_out_t *p_out, int i_group )
{
es_out_sys_t *p_sys = container_of(p_out, es_out_sys_t, out);
+ es_out_pgrm_t *pgrm;
+
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ if (pgrm->i_id == i_group)
+ return pgrm;
- for( int i = 0; i < p_sys->i_pgrm; i++ )
- {
- if( p_sys->pgrm[i]->i_id == i_group )
- return p_sys->pgrm[i];
- }
return EsOutProgramAdd( p_out, i_group );
}
@@ -2522,14 +2525,16 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
const mtime_t i_jitter_max = INT64_C(1000) * var_InheritInteger( p_sys->p_input, "clock-jitter" );
if( i_pts_delay > __MIN( i_pts_delay_base + i_jitter_max, INPUT_PTS_DELAY_MAX ) )
{
+ es_out_pgrm_t *pgrm;
+
msg_Err( p_sys->p_input,
"ES_OUT_SET_(GROUP_)PCR is called too late (jitter of %d ms ignored)",
(int)(i_pts_delay - i_pts_delay_base) / 1000 );
i_pts_delay = p_sys->i_pts_delay;
/* reset clock */
- for( int i = 0; i < p_sys->i_pgrm; i++ )
- input_clock_Reset( p_sys->pgrm[i]->p_input_clock );
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ input_clock_Reset(pgrm->p_input_clock);
}
else
{
@@ -2558,15 +2563,14 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
case ES_OUT_SET_GROUP:
{
int i = va_arg( args, int );
- for( int j = 0; j < p_sys->i_pgrm; j++ )
- {
- es_out_pgrm_t *p_pgrm = p_sys->pgrm[j];
+ es_out_pgrm_t *p_pgrm;
+
+ vlc_list_foreach(p_pgrm, &p_sys->programs, node)
if( p_pgrm->i_id == i )
{
EsOutProgramSelect( out, p_pgrm );
return VLC_SUCCESS;
}
- }
return VLC_EGENERIC;
}
@@ -2815,6 +2819,7 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
mtime_t i_pts_delay = va_arg( args, mtime_t );
mtime_t i_pts_jitter = va_arg( args, mtime_t );
int i_cr_average = va_arg( args, int );
+ es_out_pgrm_t *pgrm;
bool b_change_clock =
i_pts_delay + i_pts_jitter != p_sys->i_pts_delay ||
@@ -2825,9 +2830,10 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
p_sys->i_pts_jitter = i_pts_jitter;
p_sys->i_cr_average = i_cr_average;
- for( int i = 0; i < p_sys->i_pgrm && b_change_clock; i++ )
- input_clock_SetJitter( p_sys->pgrm[i]->p_input_clock,
- i_pts_delay + i_pts_jitter, i_cr_average );
+ if (b_change_clock)
+ vlc_list_foreach(pgrm, &p_sys->programs, node)
+ input_clock_SetJitter(pgrm->p_input_clock, i_pts_delay
+ + i_pts_jitter, i_cr_average);
return VLC_SUCCESS;
}
More information about the vlc-commits
mailing list