+static ts_pid_t *PID( demux_sys_t *p_sys, uint16_t i_pid )
+{
+ switch( i_pid )
+ {
+ case 0:
+ return &p_sys->pids.pat;
+ case 0x1FFF:
+ return &p_sys->pids.dummy;
+ default:
+ if( p_sys->pids.i_last_pid == i_pid )
+ return p_sys->pids.p_last;
+ break;
+ }
+
+ for( int i=0; i < p_sys->pids.i_all; i++ )
+ {
+ if( p_sys->pids.pp_all[i]->i_pid == i_pid )
+ {
+ p_sys->pids.p_last = p_sys->pids.pp_all[i];
+ p_sys->pids.i_last_pid = i_pid;
+ return p_sys->pids.p_last;
+ }
+ }
+
+ if( p_sys->pids.i_all >= p_sys->pids.i_all_alloc )
+ {
+ ts_pid_t **p_realloc = realloc( p_sys->pids.pp_all,
+ (p_sys->pids.i_all_alloc + PID_ALLOC_CHUNK) * sizeof(ts_pid_t *) );
+ if( !p_realloc )
+ return NULL;
+ p_sys->pids.pp_all = p_realloc;
+ p_sys->pids.i_all_alloc += PID_ALLOC_CHUNK;
+ }
+
+ ts_pid_t *p_pid = calloc( 1, sizeof(*p_pid) );
+ if( !p_pid )
+ {
+ abort();
+ //return NULL;
+ }
+
+ p_pid->i_pid = i_pid;
+ p_sys->pids.pp_all[p_sys->pids.i_all++] = p_pid;
+
+ p_sys->pids.p_last = p_pid;
+ p_sys->pids.i_last_pid = i_pid;
+
+ return p_pid;
+}
+