/* Create a new array of properties, or NULL on error */ GPtrArray * gst_vaapi_encoder_properties_append (GPtrArray * props, gint prop_id, GParamSpec * pspec) { GstVaapiEncoderPropData *prop; if (!props) { props = g_ptr_array_new_with_free_func ((GDestroyNotify) prop_free); if (!props) return NULL; } prop = prop_new (prop_id, pspec); if (!prop) goto error_allocation_failed; g_ptr_array_add (props, prop); return props; /* ERRORS */ error_allocation_failed: { GST_ERROR ("failed to allocate encoder property info structure"); g_ptr_array_unref (props); return NULL; } }
/* create new propctx which duplicates the contents of an existing propctx * returns -1 on error */ int prop_dup(struct propctx *src_ctx, struct propctx **dst_ctx) { struct proppool *pool; struct propctx *retval = NULL; unsigned i; int result; unsigned total_size = 0; size_t values_size; if(!src_ctx || !dst_ctx) return SASL_BADPARAM; /* What is the total allocated size of src_ctx? */ pool = src_ctx->mem_base; while(pool) { total_size += (unsigned) pool->size; pool = pool->next; } /* allocate the new context */ retval = prop_new(total_size); if(!retval) return SASL_NOMEM; retval->used_values = src_ctx->used_values; retval->allocated_values = src_ctx->used_values + 1; values_size = (retval->allocated_values * sizeof(struct propval)); retval->mem_base->unused = retval->mem_base->size - values_size; retval->list_end = (char **)(retval->mem_base->data + values_size); /* data_end should still be OK */ /* Now dup the values */ for(i=0; i<src_ctx->used_values; i++) { retval->values[i].name = src_ctx->values[i].name; result = prop_setvals(retval, retval->values[i].name, src_ctx->values[i].values); if(result != SASL_OK) goto fail; } retval->prev_val = src_ctx->prev_val; *dst_ctx = retval; return SASL_OK; fail: if(retval) prop_dispose(&retval); return result; }