void heap_bubble_down(Heap* heap, int index) { if(heap_left_child_index(index) <= heap_last_index(heap)) { int left_compare = heap->comparator(heap_get(heap, index), heap_left_child(heap, index)); if(1 == left_compare) { heap_swap(heap, index, heap_left_child_index(index)); heap_bubble_down(heap, heap_left_child_index(index)); return; } } if(heap_right_child_index(index) <= heap_last_index(heap)) { int right_compare = heap->comparator(heap_get(heap, index), heap_right_child(heap, index)); if(1 == right_compare) { heap_swap(heap, index, heap_right_child_index(index)); heap_bubble_down(heap, heap_right_child_index(index)); return; } } return; }
void* heap_extract_min(Heap* heap) { void* min = heap_min(heap); if(heap_size(heap) > 0) { heap_set(heap, 0, heap_last(heap)); heap_bubble_down(heap, 0); } heap->size--; return min; }
int avfilter_graph_request_oldest(AVFilterGraph *graph) { while (graph->sink_links_count) { AVFilterLink *oldest = graph->sink_links[0]; int r = avfilter_request_frame(oldest); if (r != AVERROR_EOF) return r; /* EOF: remove the link from the heap */ if (oldest->age_index < --graph->sink_links_count) heap_bubble_down(graph, graph->sink_links[graph->sink_links_count], oldest->age_index); oldest->age_index = -1; } return AVERROR_EOF; }
void heap_remove_top(heap_t* heap) { if(heap->n_elements == 1) { free(heap->top); heap->top = NULL; heap->n_elements--; } else { memcpy(heap->top, ELEMENT(heap, heap->n_elements - 1), heap->element_size); heap->n_elements--; heap->top = realloc(heap->top, heap->element_size * heap->n_elements); heap_bubble_down(heap, 0); } }
int avfilter_graph_request_oldest(AVFilterGraph *graph) { while (graph->sink_links_count) { AVFilterLink *oldest = graph->sink_links[0]; int r = ff_request_frame(oldest); if (r != AVERROR_EOF) return r; av_log(oldest->dst, AV_LOG_DEBUG, "EOF on sink link %s:%s.\n", oldest->dst ? oldest->dst->name : "unknown", oldest->dstpad ? oldest->dstpad->name : "unknown"); /* EOF: remove the link from the heap */ if (oldest->age_index < --graph->sink_links_count) heap_bubble_down(graph, graph->sink_links[graph->sink_links_count], oldest->age_index); oldest->age_index = -1; } return AVERROR_EOF; }
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, AVFilterLink *link) { heap_bubble_up (graph, link, link->age_index); heap_bubble_down(graph, link, link->age_index); }