|
|
@ -312,9 +312,8 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data; |
|
|
|
struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data; |
|
|
|
struct decklink_ctx *ctx; |
|
|
|
struct decklink_ctx *ctx; |
|
|
|
IDeckLinkIterator *iter; |
|
|
|
|
|
|
|
IDeckLink *dl = NULL; |
|
|
|
|
|
|
|
unsigned int n; |
|
|
|
unsigned int n; |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
ctx = (struct decklink_ctx *) av_mallocz(sizeof(struct decklink_ctx)); |
|
|
|
ctx = (struct decklink_ctx *) av_mallocz(sizeof(struct decklink_ctx)); |
|
|
|
if (!ctx) |
|
|
|
if (!ctx) |
|
|
@ -324,35 +323,15 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx) |
|
|
|
ctx->preroll = cctx->preroll; |
|
|
|
ctx->preroll = cctx->preroll; |
|
|
|
cctx->ctx = ctx; |
|
|
|
cctx->ctx = ctx; |
|
|
|
|
|
|
|
|
|
|
|
iter = CreateDeckLinkIteratorInstance(); |
|
|
|
|
|
|
|
if (!iter) { |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator\n"); |
|
|
|
|
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* List available devices. */ |
|
|
|
/* List available devices. */ |
|
|
|
if (ctx->list_devices) { |
|
|
|
if (ctx->list_devices) { |
|
|
|
ff_decklink_list_devices(avctx); |
|
|
|
ff_decklink_list_devices(avctx); |
|
|
|
return AVERROR_EXIT; |
|
|
|
return AVERROR_EXIT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Open device. */ |
|
|
|
ret = ff_decklink_init_device(avctx, avctx->filename); |
|
|
|
while (iter->Next(&dl) == S_OK) { |
|
|
|
if (ret < 0) |
|
|
|
const char *displayName; |
|
|
|
return ret; |
|
|
|
ff_decklink_get_display_name(dl, &displayName); |
|
|
|
|
|
|
|
if (!strcmp(avctx->filename, displayName)) { |
|
|
|
|
|
|
|
av_free((void *) displayName); |
|
|
|
|
|
|
|
ctx->dl = dl; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
av_free((void *) displayName); |
|
|
|
|
|
|
|
dl->Release(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
iter->Release(); |
|
|
|
|
|
|
|
if (!ctx->dl) { |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Could not open '%s'\n", avctx->filename); |
|
|
|
|
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Get output device. */ |
|
|
|
/* Get output device. */ |
|
|
|
if (ctx->dl->QueryInterface(IID_IDeckLinkOutput, (void **) &ctx->dlo) != S_OK) { |
|
|
|
if (ctx->dl->QueryInterface(IID_IDeckLinkOutput, (void **) &ctx->dlo) != S_OK) { |
|
|
|