mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-10-06 01:07:36 +08:00
avdevice/decklink: add support for audio and video input selection
Reviewed-by: Deti Fliegl <deti@fliegl.de> Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
@@ -98,6 +98,35 @@ HRESULT ff_decklink_get_display_name(IDeckLink *This, const char **displayName)
|
||||
return hr;
|
||||
}
|
||||
|
||||
static int decklink_select_input(AVFormatContext *avctx, BMDDeckLinkConfigurationID cfg_id)
|
||||
{
|
||||
struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data;
|
||||
struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
|
||||
BMDDeckLinkAttributeID attr_id = (cfg_id == bmdDeckLinkConfigAudioInputConnection) ? BMDDeckLinkAudioInputConnections : BMDDeckLinkVideoInputConnections;
|
||||
int64_t bmd_input = (cfg_id == bmdDeckLinkConfigAudioInputConnection) ? ctx->audio_input : ctx->video_input;
|
||||
const char *type_name = (cfg_id == bmdDeckLinkConfigAudioInputConnection) ? "audio" : "video";
|
||||
int64_t supported_connections = 0;
|
||||
HRESULT res;
|
||||
|
||||
if (bmd_input) {
|
||||
res = ctx->attr->GetInt(attr_id, &supported_connections);
|
||||
if (res != S_OK) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to query supported %s inputs.\n", type_name);
|
||||
return AVERROR_EXTERNAL;
|
||||
}
|
||||
if ((supported_connections & bmd_input) != bmd_input) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Device does not support selected %s input.\n", type_name);
|
||||
return AVERROR(ENOSYS);
|
||||
}
|
||||
res = ctx->cfg->SetInt(cfg_id, bmd_input);
|
||||
if (res != S_OK) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to select %s input.\n", type_name);
|
||||
return AVERROR_EXTERNAL;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_decklink_set_format(AVFormatContext *avctx,
|
||||
int width, int height,
|
||||
int tb_num, int tb_den,
|
||||
@@ -129,6 +158,13 @@ int ff_decklink_set_format(AVFormatContext *avctx,
|
||||
}
|
||||
|
||||
if (direction == DIRECTION_IN) {
|
||||
int ret;
|
||||
ret = decklink_select_input(avctx, bmdDeckLinkConfigAudioInputConnection);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = decklink_select_input(avctx, bmdDeckLinkConfigVideoInputConnection);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
res = ctx->dli->GetDisplayModeIterator (&itermode);
|
||||
} else {
|
||||
res = ctx->dlo->GetDisplayModeIterator (&itermode);
|
||||
@@ -224,6 +260,13 @@ int ff_decklink_list_formats(AVFormatContext *avctx, decklink_direction_t direct
|
||||
HRESULT res;
|
||||
|
||||
if (direction == DIRECTION_IN) {
|
||||
int ret;
|
||||
ret = decklink_select_input(avctx, bmdDeckLinkConfigAudioInputConnection);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = decklink_select_input(avctx, bmdDeckLinkConfigVideoInputConnection);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
res = ctx->dli->GetDisplayModeIterator (&itermode);
|
||||
} else {
|
||||
res = ctx->dlo->GetDisplayModeIterator (&itermode);
|
||||
|
Reference in New Issue
Block a user