/** @internal @This sets the input flow definition. * * @param upipe description structure of the pipe * @param flow_def flow definition packet * @return an error code */ static int upipe_agg_set_flow_def(struct upipe *upipe, struct uref *flow_def) { if (flow_def == NULL) return UBASE_ERR_INVALID; UBASE_RETURN(uref_flow_match_def(flow_def, EXPECTED_FLOW_DEF)) struct upipe_agg *upipe_agg = upipe_agg_from_upipe(upipe); uint64_t size = 0; uref_block_flow_get_size(flow_def, &size); upipe_agg->input_size = size; uint64_t octetrate = 0; uref_block_flow_get_octetrate(flow_def, &octetrate); uint64_t latency = 0; uref_clock_get_latency(flow_def, &latency); struct uref *flow_def_dup; if ((flow_def_dup = uref_dup(flow_def)) == NULL) return UBASE_ERR_ALLOC; UBASE_RETURN(uref_block_flow_set_size(flow_def_dup, upipe_agg->output_size)) if (octetrate) { UBASE_RETURN(uref_clock_set_latency(flow_def_dup, latency + (uint64_t)upipe_agg->output_size * UCLOCK_FREQ / octetrate)) } upipe_agg_store_flow_def(upipe, flow_def_dup); return UBASE_ERR_NONE; }
/** @internal @This sets the input flow definition. * * @param upipe description structure of the pipe * @param flow_def flow definition packet * @return an error code */ static int upipe_ts_check_set_flow_def(struct upipe *upipe, struct uref *flow_def) { if (flow_def == NULL) return UBASE_ERR_INVALID; UBASE_RETURN(uref_flow_match_def(flow_def, EXPECTED_FLOW_DEF)) struct uref *flow_def_dup; if (unlikely((flow_def_dup = uref_dup(flow_def)) == NULL)) { upipe_throw_fatal(upipe, UBASE_ERR_ALLOC); return UBASE_ERR_ALLOC; } struct upipe_ts_check *upipe_ts_check = upipe_ts_check_from_upipe(upipe); UBASE_RETURN(uref_block_flow_set_size(flow_def_dup, upipe_ts_check->output_size)) UBASE_RETURN(uref_flow_set_def(flow_def_dup, OUTPUT_FLOW_DEF)) upipe_ts_check_store_flow_def(upipe, flow_def_dup); return UBASE_ERR_NONE; }