/** @internal @This checks if the pump may be allocated. * * @param upipe description structure of the pipe * @param flow_format amended flow format * @return an error code */ static int upipe_qt_html_check(struct upipe *upipe, struct uref *flow_format) { struct upipe_qt_html *upipe_qt_html = upipe_qt_html_from_upipe(upipe); if (flow_format != NULL) upipe_qt_html_store_flow_def(upipe, flow_format); upipe_qt_html_check_upump_mgr(upipe); if (upipe_qt_html->upump_mgr == NULL) return UBASE_ERR_NONE; if (upipe_qt_html->uref_mgr == NULL) { upipe_qt_html_require_uref_mgr(upipe); return UBASE_ERR_NONE; } if (upipe_qt_html->ubuf_mgr == NULL) { struct uref *flow_format = uref_pic_flow_alloc_def(upipe_qt_html->uref_mgr, 1); uref_pic_flow_set_macropixel(flow_format, 1); uref_pic_flow_add_plane(flow_format, 1, 1, 4, "b8g8r8a8"); uref_pic_flow_set_hsize(flow_format, upipe_qt_html->H); uref_pic_flow_set_vsize(flow_format, upipe_qt_html->V); if (unlikely(flow_format == NULL)) { upipe_throw_fatal(upipe, UBASE_ERR_ALLOC); return UBASE_ERR_ALLOC; } upipe_qt_html_require_ubuf_mgr(upipe, flow_format); return UBASE_ERR_NONE; } if (upipe_qt_html->upump == NULL) { upipe_qt_html_wait_upumpstart(upipe, 0, start); } return UBASE_ERR_NONE; }
/** @internal @This sets the input flow def. * * @param upipe description structure of the pipe * @param flow_def the flow format to set * @return an error code */ static int upipe_vblk_set_flow_def(struct upipe *upipe, struct uref *flow_def) { struct upipe_vblk *upipe_vblk = upipe_vblk_from_upipe(upipe); if (!ubase_check(uref_flow_match_def(flow_def, UREF_VOID_FLOW_DEF)) && !ubase_check(upipe_vblk_check_flow_def(upipe, flow_def))) return UBASE_ERR_INVALID; struct uref *input_flow_def = uref_dup(flow_def); if (unlikely(!input_flow_def)) { upipe_throw_fatal(upipe, UBASE_ERR_ALLOC); return UBASE_ERR_ALLOC; } upipe_vblk_store_flow_def_input(upipe, input_flow_def); if (ubase_check(uref_flow_match_def(flow_def, UREF_VOID_FLOW_DEF))) return UBASE_ERR_NONE; uint64_t hsize = 0, vsize = 0; UBASE_RETURN(uref_pic_flow_get_hsize(flow_def, &hsize)); UBASE_RETURN(uref_pic_flow_get_vsize(flow_def, &vsize)); struct uref *flow_def_dup = uref_dup(flow_def); if (unlikely(!flow_def_dup)) { upipe_throw_fatal(upipe, UBASE_ERR_ALLOC); return UBASE_ERR_ALLOC; } struct urational sar; uref_pic_flow_clear_format(flow_def_dup); uref_pic_flow_copy_format(flow_def_dup, flow_def); uref_pic_flow_set_hsize(flow_def_dup, hsize); uref_pic_flow_set_vsize(flow_def_dup, vsize); if (likely(ubase_check(uref_pic_flow_get_sar(flow_def, &sar)))) { uref_pic_flow_set_sar(flow_def_dup, sar); } else { uref_pic_flow_delete_sar(flow_def_dup); } bool overscan; if (likely(ubase_check(uref_pic_flow_get_overscan(flow_def, &overscan)))) { uref_pic_flow_set_overscan(flow_def_dup, overscan); } else { uref_pic_flow_delete_overscan(flow_def_dup); } if (likely(ubase_check(uref_pic_get_progressive(flow_def)))) { uref_pic_set_progressive(flow_def_dup); } else { uref_pic_delete_progressive(flow_def_dup); } upipe_vblk_store_flow_def(upipe, flow_def_dup); if (upipe_vblk->ubuf) { ubuf_free(upipe_vblk->ubuf); upipe_vblk->ubuf = NULL; } if (upipe_vblk->ubuf_mgr && !ubase_check(ubuf_mgr_check(upipe_vblk->ubuf_mgr, flow_def_dup))) { ubuf_mgr_release(upipe_vblk->ubuf_mgr); upipe_vblk->ubuf_mgr = NULL; } return UBASE_ERR_NONE; }