mirror of https://git.videolan.org/git/ffmpeg.git
avdevice/decklink: refactor ff_decklink_set_format function
This is done to enable input format autodetection in decklink_dec. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
0e7865ce41
commit
aa7b0329ff
|
@ -148,23 +148,12 @@ static DECKLINK_BOOL field_order_eq(enum AVFieldOrder field_order, BMDFieldDomin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ff_decklink_set_format(AVFormatContext *avctx,
|
int ff_decklink_set_configs(AVFormatContext *avctx,
|
||||||
int width, int height,
|
decklink_direction_t direction) {
|
||||||
int tb_num, int tb_den,
|
|
||||||
enum AVFieldOrder field_order,
|
|
||||||
decklink_direction_t direction, int num)
|
|
||||||
{
|
|
||||||
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 *)cctx->ctx;
|
struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
|
||||||
BMDDisplayModeSupport support;
|
|
||||||
IDeckLinkDisplayModeIterator *itermode;
|
|
||||||
IDeckLinkDisplayMode *mode;
|
|
||||||
int i = 1;
|
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Trying to find mode for frame size %dx%d, frame timing %d/%d, field order %d, direction %d, mode number %d, format code %s\n",
|
|
||||||
width, height, tb_num, tb_den, field_order, direction, num, (cctx->format_code) ? cctx->format_code : "(unset)");
|
|
||||||
|
|
||||||
if (ctx->duplex_mode) {
|
if (ctx->duplex_mode) {
|
||||||
DECKLINK_BOOL duplex_supported = false;
|
DECKLINK_BOOL duplex_supported = false;
|
||||||
|
|
||||||
|
@ -181,7 +170,6 @@ int ff_decklink_set_format(AVFormatContext *avctx,
|
||||||
av_log(avctx, AV_LOG_WARNING, "Unable to set duplex mode, because it is not supported.\n");
|
av_log(avctx, AV_LOG_WARNING, "Unable to set duplex mode, because it is not supported.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (direction == DIRECTION_IN) {
|
if (direction == DIRECTION_IN) {
|
||||||
int ret;
|
int ret;
|
||||||
ret = decklink_select_input(avctx, bmdDeckLinkConfigAudioInputConnection);
|
ret = decklink_select_input(avctx, bmdDeckLinkConfigAudioInputConnection);
|
||||||
|
@ -190,6 +178,28 @@ int ff_decklink_set_format(AVFormatContext *avctx,
|
||||||
ret = decklink_select_input(avctx, bmdDeckLinkConfigVideoInputConnection);
|
ret = decklink_select_input(avctx, bmdDeckLinkConfigVideoInputConnection);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ff_decklink_set_format(AVFormatContext *avctx,
|
||||||
|
int width, int height,
|
||||||
|
int tb_num, int tb_den,
|
||||||
|
enum AVFieldOrder field_order,
|
||||||
|
decklink_direction_t direction, int num)
|
||||||
|
{
|
||||||
|
struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
|
||||||
|
struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
|
||||||
|
BMDDisplayModeSupport support;
|
||||||
|
IDeckLinkDisplayModeIterator *itermode;
|
||||||
|
IDeckLinkDisplayMode *mode;
|
||||||
|
int i = 1;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
av_log(avctx, AV_LOG_DEBUG, "Trying to find mode for frame size %dx%d, frame timing %d/%d, field order %d, direction %d, mode number %d, format code %s\n",
|
||||||
|
width, height, tb_num, tb_den, field_order, direction, num, (cctx->format_code) ? cctx->format_code : "(unset)");
|
||||||
|
|
||||||
|
if (direction == DIRECTION_IN) {
|
||||||
res = ctx->dli->GetDisplayModeIterator (&itermode);
|
res = ctx->dli->GetDisplayModeIterator (&itermode);
|
||||||
} else {
|
} else {
|
||||||
res = ctx->dlo->GetDisplayModeIterator (&itermode);
|
res = ctx->dlo->GetDisplayModeIterator (&itermode);
|
||||||
|
|
|
@ -134,6 +134,7 @@ static const BMDVideoConnection decklink_video_connection_map[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
HRESULT ff_decklink_get_display_name(IDeckLink *This, const char **displayName);
|
HRESULT ff_decklink_get_display_name(IDeckLink *This, const char **displayName);
|
||||||
|
int ff_decklink_set_configs(AVFormatContext *avctx, decklink_direction_t direction);
|
||||||
int ff_decklink_set_format(AVFormatContext *avctx, int width, int height, int tb_num, int tb_den, enum AVFieldOrder field_order, decklink_direction_t direction = DIRECTION_OUT, int num = 0);
|
int ff_decklink_set_format(AVFormatContext *avctx, int width, int height, int tb_num, int tb_den, enum AVFieldOrder field_order, decklink_direction_t direction = DIRECTION_OUT, int num = 0);
|
||||||
int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction, int num);
|
int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction, int num);
|
||||||
int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs);
|
int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs);
|
||||||
|
|
|
@ -916,6 +916,12 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ff_decklink_set_configs(avctx, DIRECTION_IN) < 0) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Could not set input configuration\n");
|
||||||
|
ret = AVERROR(EIO);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (mode_num > 0 || cctx->format_code) {
|
if (mode_num > 0 || cctx->format_code) {
|
||||||
if (ff_decklink_set_format(avctx, DIRECTION_IN, mode_num) < 0) {
|
if (ff_decklink_set_format(avctx, DIRECTION_IN, mode_num) < 0) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Could not set mode number %d or format code %s for %s\n",
|
av_log(avctx, AV_LOG_ERROR, "Could not set mode number %d or format code %s for %s\n",
|
||||||
|
|
|
@ -162,6 +162,10 @@ static int decklink_setup_video(AVFormatContext *avctx, AVStream *st)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ff_decklink_set_configs(avctx, DIRECTION_OUT) < 0) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Could not set output configuration\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (ff_decklink_set_format(avctx, c->width, c->height,
|
if (ff_decklink_set_format(avctx, c->width, c->height,
|
||||||
st->time_base.num, st->time_base.den, c->field_order)) {
|
st->time_base.num, st->time_base.den, c->field_order)) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Unsupported video size, framerate or field order!"
|
av_log(avctx, AV_LOG_ERROR, "Unsupported video size, framerate or field order!"
|
||||||
|
|
Loading…
Reference in New Issue