static int tee_write_header(AVFormatContext *avf) { TeeContext *tee = avf->priv_data; unsigned nb_slaves = 0, i; const char *filename = avf->filename; char **slaves = NULL; int ret; while (*filename) { char *slave = av_get_token(&filename, slave_delim); if (!slave) { ret = AVERROR(ENOMEM); goto fail; } ret = av_dynarray_add_nofree(&slaves, &nb_slaves, slave); if (ret < 0) { av_free(slave); goto fail; } if (strspn(filename, slave_delim)) filename++; } if (!(tee->slaves = av_mallocz_array(nb_slaves, sizeof(*tee->slaves)))) { ret = AVERROR(ENOMEM); goto fail; } tee->nb_slaves = tee->nb_alive = nb_slaves; for (i = 0; i < nb_slaves; i++) { if ((ret = open_slave(avf, slaves[i], &tee->slaves[i])) < 0) { ret = tee_process_slave_failure(avf, i, ret); if (ret < 0) goto fail; } else { log_slave(&tee->slaves[i], avf, AV_LOG_VERBOSE); } av_freep(&slaves[i]); } for (i = 0; i < avf->nb_streams; i++) { int j, mapped = 0; for (j = 0; j < tee->nb_slaves; j++) if (tee->slaves[j].avf) mapped += tee->slaves[j].stream_map[i] >= 0; if (!mapped) av_log(avf, AV_LOG_WARNING, "Input stream #%d is not mapped " "to any slave.\n", i); } av_free(slaves); return 0; fail: for (i = 0; i < nb_slaves; i++) av_freep(&slaves[i]); close_slaves(avf); av_free(slaves); return ret; }
int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf) { return av_dynarray_add_nofree(&lst->bsfs, &lst->nb_bsfs, bsf); }
int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs) { IDeckLink *dl = NULL; IDeckLinkIterator *iter = decklink_create_iterator(avctx); int ret = 0; if (!iter) return AVERROR(EIO); while (ret == 0 && iter->Next(&dl) == S_OK) { IDeckLinkOutput *output_config; IDeckLinkInput *input_config; const char *displayName; AVDeviceInfo *new_device = NULL; int add = 0; ff_decklink_get_display_name(dl, &displayName); if (show_outputs) { if (dl->QueryInterface(IID_IDeckLinkOutput, (void **)&output_config) == S_OK) { output_config->Release(); add = 1; } } if (show_inputs) { if (dl->QueryInterface(IID_IDeckLinkInput, (void **)&input_config) == S_OK) { input_config->Release(); add = 1; } } if (add == 1) { new_device = (AVDeviceInfo *) av_mallocz(sizeof(AVDeviceInfo)); if (!new_device) { ret = AVERROR(ENOMEM); goto next; } new_device->device_name = av_strdup(displayName); new_device->device_description = av_strdup(displayName); if (!new_device->device_name || !new_device->device_description || av_dynarray_add_nofree(&device_list->devices, &device_list->nb_devices, new_device) < 0) { ret = AVERROR(ENOMEM); av_freep(&new_device->device_name); av_freep(&new_device->device_description); av_freep(&new_device); goto next; } } next: av_freep(&displayName); dl->Release(); } iter->Release(); return ret; }