This patch also makes BlackMagic drivers v10.6.1 a hard requirement.
Unified · Split
| @@ -5625,7 +5625,8 @@ enabled cuvid && { check_lib cuviddec.h cuvidCreateDecoder -lnvcuvid · 5624 unmodified lines | |||
| 5625 | enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint | 5625 | enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint |
| 5626 | enabled coreimage_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimage_filter; } | 5626 | enabled coreimage_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimage_filter; } |
| 5627 | enabled coreimagesrc_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimagesrc_filter; } | 5627 | enabled coreimagesrc_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimagesrc_filter; } |
| 5628 | enabled decklink && { check_header DeckLinkAPI.h || die "ERROR: DeckLinkAPI.h header not found"; } | 5628 | enabled decklink && { { check_header DeckLinkAPI.h || die "ERROR: DeckLinkAPI.h header not found"; } && |
| 5629 | { check_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a060100" || die "ERROR: Decklink API version must be >= 10.6.1."; } } | ||
| 5629 | enabled frei0r && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; } | 5630 | enabled frei0r && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; } |
| 5630 | enabled gmp && require2 gmp gmp.h mpz_export -lgmp | 5631 | enabled gmp && require2 gmp gmp.h mpz_export -lgmp |
| 5631 | enabled gnutls && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init | 5632 | enabled gnutls && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init |
| @@ -251,6 +251,10 @@ To use this option, ffmpeg needs to be compiled with @code{--enable-libzvbi}. · 250 unmodified lines | |||
| 251 | Defines number of audio channels to capture. Must be @samp{2}, @samp{8} or @samp{16}. | 251 | Defines number of audio channels to capture. Must be @samp{2}, @samp{8} or @samp{16}. |
| 252 | Defaults to @samp{2}. | 252 | Defaults to @samp{2}. |
| 253 | 253 | ||
| 254 | @item duplex_mode | ||
| 255 | Sets the decklink device duplex mode. Must be @samp{unset}, @samp{half} or @samp{full}. | ||
| 256 | Defaults to @samp{unset}. | ||
| 257 | |||
| 254 | @end table | 258 | @end table |
| 255 | 259 | ||
| 256 | @subsection Examples | 260 | @subsection Examples |
| @@ -111,6 +111,23 @@ int ff_decklink_set_format(AVFormatContext *avctx, · 110 unmodified lines | |||
| 111 | int i = 1; | 111 | int i = 1; |
| 112 | HRESULT res; | 112 | HRESULT res; |
| 113 | 113 | ||
| 114 | if (ctx->duplex_mode) { | ||
| 115 | bool duplex_supported = false; | ||
| 116 | |||
| 117 | if (ctx->attr->GetFlag(BMDDeckLinkSupportsDuplexModeConfiguration, &duplex_supported) != S_OK) | ||
| 118 | duplex_supported = false; | ||
| 119 | |||
| 120 | if (duplex_supported) { | ||
| 121 | res = ctx->cfg->SetInt(bmdDeckLinkConfigDuplexMode, ctx->duplex_mode == 2 ? bmdDuplexModeFull : bmdDuplexModeHalf); | ||
| 122 | if (res != S_OK) | ||
| 123 | av_log(avctx, AV_LOG_WARNING, "Setting duplex mode failed.\n"); | ||
| 124 | else | ||
| 125 | av_log(avctx, AV_LOG_VERBOSE, "Succesfully set duplex mode to %s duplex.\n", ctx->duplex_mode == 2 ? "full" : "half"); | ||
| 126 | } else { | ||
| 127 | av_log(avctx, AV_LOG_WARNING, "Unable to set duplex mode, because it is not supported.\n"); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 114 | if (direction == DIRECTION_IN) { | 131 | if (direction == DIRECTION_IN) { |
| 115 | res = ctx->dli->GetDisplayModeIterator (&itermode); | 132 | res = ctx->dli->GetDisplayModeIterator (&itermode); |
| 116 | } else { | 133 | } else { |
| @@ -249,6 +266,10 @@ void ff_decklink_cleanup(AVFormatContext *avctx) · 132 unmodified lines | |||
| 249 | ctx->dli->Release(); | 266 | ctx->dli->Release(); |
| 250 | if (ctx->dlo) | 267 | if (ctx->dlo) |
| 251 | ctx->dlo->Release(); | 268 | ctx->dlo->Release(); |
| 269 | if (ctx->attr) | ||
| 270 | ctx->attr->Release(); | ||
| 271 | if (ctx->cfg) | ||
| 272 | ctx->cfg->Release(); | ||
| 252 | if (ctx->dl) | 273 | if (ctx->dl) |
| 253 | ctx->dl->Release(); | 274 | ctx->dl->Release(); |
| 254 | } | 275 | } |
| @@ -279,5 +300,17 @@ int ff_decklink_init_device(AVFormatContext *avctx, const char* name) · 24 unmodified lines | |||
| 279 | if (!ctx->dl) | 300 | if (!ctx->dl) |
| 280 | return AVERROR(ENXIO); | 301 | return AVERROR(ENXIO); |
| 281 | 302 | ||
| 303 | if (ctx->dl->QueryInterface(IID_IDeckLinkConfiguration, (void **)&ctx->cfg) != S_OK) { | ||
| 304 | av_log(avctx, AV_LOG_ERROR, "Could not get configuration interface for '%s'\n", name); | ||
| 305 | ff_decklink_cleanup(avctx); | ||
| 306 | return AVERROR_EXTERNAL; | ||
| 307 | } | ||
| 308 | |||
| 309 | if (ctx->dl->QueryInterface(IID_IDeckLinkAttributes, (void **)&ctx->attr) != S_OK) { | ||
| 310 | av_log(avctx, AV_LOG_ERROR, "Could not get attributes interface for '%s'\n", name); | ||
| 311 | ff_decklink_cleanup(avctx); | ||
| 312 | return AVERROR_EXTERNAL; | ||
| 313 | } | ||
| 314 | |||
| 282 | return 0; | 315 | return 0; |
| 283 | } | 316 | } |
| @@ -44,6 +44,8 @@ struct decklink_ctx { · 43 unmodified lines | |||
| 44 | IDeckLink *dl; | 44 | IDeckLink *dl; |
| 45 | IDeckLinkOutput *dlo; | 45 | IDeckLinkOutput *dlo; |
| 46 | IDeckLinkInput *dli; | 46 | IDeckLinkInput *dli; |
| 47 | IDeckLinkConfiguration *cfg; | ||
| 48 | IDeckLinkAttributes *attr; | ||
| 47 | decklink_output_callback *output_callback; | 49 | decklink_output_callback *output_callback; |
| 48 | decklink_input_callback *input_callback; | 50 | decklink_input_callback *input_callback; |
| 49 | 51 | ||
| @@ -77,6 +79,7 @@ struct decklink_ctx { · 27 unmodified lines | |||
| 77 | int list_formats; | 79 | int list_formats; |
| 78 | int64_t teletext_lines; | 80 | int64_t teletext_lines; |
| 79 | double preroll; | 81 | double preroll; |
| 82 | int duplex_mode; | ||
| 80 | 83 | ||
| 81 | int frames_preroll; | 84 | int frames_preroll; |
| 82 | int frames_buffer; | 85 | int frames_buffer; |
| @@ -34,6 +34,7 @@ struct decklink_cctx { · 33 unmodified lines | |||
| 34 | double preroll; | 34 | double preroll; |
| 35 | int v210; | 35 | int v210; |
| 36 | int audio_channels; | 36 | int audio_channels; |
| 37 | int duplex_mode; | ||
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | #endif /* AVDEVICE_DECKLINK_COMMON_C_H */ | 40 | #endif /* AVDEVICE_DECKLINK_COMMON_C_H */ |
| @@ -445,6 +445,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) · 444 unmodified lines | |||
| 445 | ctx->list_formats = cctx->list_formats; | 445 | ctx->list_formats = cctx->list_formats; |
| 446 | ctx->teletext_lines = cctx->teletext_lines; | 446 | ctx->teletext_lines = cctx->teletext_lines; |
| 447 | ctx->preroll = cctx->preroll; | 447 | ctx->preroll = cctx->preroll; |
| 448 | ctx->duplex_mode = cctx->duplex_mode; | ||
| 448 | cctx->ctx = ctx; | 449 | cctx->ctx = ctx; |
| 449 | 450 | ||
| 450 | #if !CONFIG_LIBZVBI | 451 | #if !CONFIG_LIBZVBI |
| @@ -36,6 +36,10 @@ static const AVOption options[] = { · 35 unmodified lines | |||
| 36 | { "standard", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7fff9fffeLL}, 0, 0, DEC, "teletext_lines"}, | 36 | { "standard", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7fff9fffeLL}, 0, 0, DEC, "teletext_lines"}, |
| 37 | { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7ffffffffLL}, 0, 0, DEC, "teletext_lines"}, | 37 | { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7ffffffffLL}, 0, 0, DEC, "teletext_lines"}, |
| 38 | { "channels", "number of audio channels", OFFSET(audio_channels), AV_OPT_TYPE_INT , { .i64 = 2 }, 2, 16, DEC }, | 38 | { "channels", "number of audio channels", OFFSET(audio_channels), AV_OPT_TYPE_INT , { .i64 = 2 }, 2, 16, DEC }, |
| 39 | { "duplex_mode", "duplex mode", OFFSET(duplex_mode), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, DEC, "duplex_mode"}, | ||
| 40 | { "unset", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0}, 0, 0, DEC, "duplex_mode"}, | ||
| 41 | { "half", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1}, 0, 0, DEC, "duplex_mode"}, | ||
| 42 | { "full", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2}, 0, 0, DEC, "duplex_mode"}, | ||
| 39 | { NULL }, | 43 | { NULL }, |
| 40 | }; | 44 | }; |
| 41 | 45 | ||