void input_item_SetEpgEvent( input_item_t *p_item, const vlc_epg_event_t *p_epg_evt ) { bool b_changed = false; vlc_mutex_lock( &p_item->lock ); for( int i = 0; i < p_item->i_epg; i++ ) { vlc_epg_t *p_epg = p_item->pp_epg[i]; for( size_t j = 0; j < p_epg->i_event; j++ ) { /* Same event can exist in more than one table */ if( p_epg->pp_event[j]->i_id == p_epg_evt->i_id ) { vlc_epg_event_t *p_dup = vlc_epg_event_Duplicate( p_epg_evt ); if( p_dup ) { if( p_epg->p_current == p_epg->pp_event[j] ) p_epg->p_current = p_dup; vlc_epg_event_Delete( p_epg->pp_event[j] ); p_epg->pp_event[j] = p_dup; b_changed = true; } break; } } } vlc_mutex_unlock( &p_item->lock ); if ( b_changed ) { vlc_event_t event = { .type = vlc_InputItemInfoChanged, }; vlc_event_send( &p_item->event_manager, &event ); } }
static void vlc_epg_Clean( vlc_epg_t *p_epg ) { size_t i; for( i = 0; i < p_epg->i_event; i++ ) vlc_epg_event_Delete( p_epg->pp_event[i] ); TAB_CLEAN( p_epg->i_event, p_epg->pp_event ); free( p_epg->psz_name ); }
bool vlc_epg_AddEvent( vlc_epg_t *p_epg, vlc_epg_event_t *p_evt ) { ssize_t i_pos = -1; /* Insertions are supposed in sequential order first */ if( p_epg->i_event ) { if( p_epg->pp_event[0]->i_start > p_evt->i_start ) { i_pos = 0; } else if ( p_epg->pp_event[p_epg->i_event - 1]->i_start >= p_evt->i_start ) { /* Do bisect search lower start time entry */ size_t i_lower = 0; size_t i_upper = p_epg->i_event - 1; while( i_lower < i_upper ) { size_t i_split = ( i_lower + i_upper ) / 2; vlc_epg_event_t *p_cur = p_epg->pp_event[i_split]; if( p_cur->i_start < p_evt->i_start ) { i_lower = i_split + 1; } else if ( p_cur->i_start >= p_evt->i_start ) { i_upper = i_split; } } i_pos = i_lower; } } if( i_pos != -1 ) { /* There can be only one event at same time */ if( p_epg->pp_event[i_pos]->i_start == p_evt->i_start ) { vlc_epg_event_Delete( p_epg->pp_event[i_pos] ); if( p_epg->p_current == p_epg->pp_event[i_pos] ) p_epg->p_current = p_evt; p_epg->pp_event[i_pos] = p_evt; return true; } else { TAB_INSERT( p_epg->i_event, p_epg->pp_event, p_evt, i_pos ); } } else TAB_APPEND( p_epg->i_event, p_epg->pp_event, p_evt ); return true; }
static void vlc_epg_Prune( vlc_epg_t *p_dst ) { /* Keep only 1 old event */ if( p_dst->p_current ) { while( p_dst->i_event > 1 && p_dst->pp_event[0] != p_dst->p_current && p_dst->pp_event[1] != p_dst->p_current ) { vlc_epg_event_Delete( p_dst->pp_event[0] ); TAB_ERASE( p_dst->i_event, p_dst->pp_event, 0 ); } } }
void vlc_epg_Merge( vlc_epg_t *p_dst_epg, const vlc_epg_t *p_src_epg ) { if( p_src_epg->i_event == 0 ) return; size_t i_dst=0; size_t i_src=0; for( ; i_src < p_src_epg->i_event; i_src++ ) { bool b_current = ( p_src_epg->pp_event[i_src] == p_src_epg->p_current ); vlc_epg_event_t *p_src = vlc_epg_event_Duplicate( p_src_epg->pp_event[i_src] ); if( unlikely(!p_src) ) return; const int64_t i_src_end = p_src->i_start + p_src->i_duration; while( i_dst < p_dst_epg->i_event ) { vlc_epg_event_t *p_dst = p_dst_epg->pp_event[i_dst]; const int64_t i_dst_end = p_dst->i_start + p_dst->i_duration; /* appended is before current, no overlap */ if( p_dst->i_start >= i_src_end ) { break; } /* overlap case: appended would contain current's start (or are identical) */ else if( ( p_dst->i_start >= p_src->i_start && p_dst->i_start < i_src_end ) || /* overlap case: appended would contain current's end */ ( i_dst_end > p_src->i_start && i_dst_end <= i_src_end ) ) { vlc_epg_event_Delete( p_dst ); if( p_dst_epg->p_current == p_dst ) { b_current |= true; p_dst_epg->p_current = NULL; } TAB_ERASE( p_dst_epg->i_event, p_dst_epg->pp_event, i_dst ); } else { i_dst++; } } TAB_INSERT( p_dst_epg->i_event, p_dst_epg->pp_event, p_src, i_dst ); if( b_current ) p_dst_epg->p_current = p_src; } /* Remaining/trailing ones */ for( ; i_src < p_src_epg->i_event; i_src++ ) { vlc_epg_event_t *p_src = vlc_epg_event_Duplicate( p_src_epg->pp_event[i_src] ); if( unlikely(!p_src) ) return; TAB_APPEND( p_dst_epg->i_event, p_dst_epg->pp_event, p_src ); if( p_src_epg->pp_event[i_src] == p_src_epg->p_current ) p_dst_epg->p_current = p_src; } vlc_epg_Prune( p_dst_epg ); }