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 ); } }
vlc_epg_t * vlc_epg_Duplicate( const vlc_epg_t *p_src ) { vlc_epg_t *p_epg = vlc_epg_New( p_src->i_id, p_src->i_source_id ); if( p_epg ) { p_epg->psz_name = ( p_src->psz_name ) ? strdup( p_src->psz_name ) : NULL; p_epg->b_present = p_src->b_present; for( size_t i=0; i<p_src->i_event; i++ ) { vlc_epg_event_t *p_dup = vlc_epg_event_Duplicate( p_src->pp_event[i] ); if( p_dup ) { if( p_src->p_current == p_src->pp_event[i] ) p_epg->p_current = p_dup; TAB_APPEND( p_epg->i_event, p_epg->pp_event, p_dup ); } } } return p_epg; }
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 ); }