aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarthick J <kjeyapal@akamai.com>2017-11-07 09:32:23 +0530
committerMarton Balint <cus@passwd.hu>2017-11-21 22:55:49 +0100
commitaa7b0329ff282ea8afb3c26dcbbc64209a280219 (patch)
tree4146710600547c5c2c321fca8eff5c8cbce9d54a
parent0e7865ce4152f8b04cda6a698bbee4fd4a94009d (diff)
downloadffmpeg-aa7b0329ff282ea8afb3c26dcbbc64209a280219.tar.gz
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>
-rw-r--r--libavdevice/decklink_common.cpp38
-rw-r--r--libavdevice/decklink_common.h1
-rw-r--r--libavdevice/decklink_dec.cpp6
-rw-r--r--libavdevice/decklink_enc.cpp4
4 files changed, 35 insertions, 14 deletions
diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp
index 2bd63ac820..b952e74955 100644
--- a/libavdevice/decklink_common.cpp
+++ b/libavdevice/decklink_common.cpp
@@ -148,23 +148,12 @@ static DECKLINK_BOOL field_order_eq(enum AVFieldOrder field_order, BMDFieldDomin
return false;
}
-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)
-{
+int ff_decklink_set_configs(AVFormatContext *avctx,
+ decklink_direction_t direction) {
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 (ctx->duplex_mode) {
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");
}
}
-
if (direction == DIRECTION_IN) {
int ret;
ret = decklink_select_input(avctx, bmdDeckLinkConfigAudioInputConnection);
@@ -190,6 +178,28 @@ int ff_decklink_set_format(AVFormatContext *avctx,
ret = decklink_select_input(avctx, bmdDeckLinkConfigVideoInputConnection);
if (ret < 0)
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);
} else {
res = ctx->dlo->GetDisplayModeIterator (&itermode);
diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h
index b6acb01bb9..4345156d8e 100644
--- a/libavdevice/decklink_common.h
+++ b/libavdevice/decklink_common.h
@@ -134,6 +134,7 @@ static const BMDVideoConnection decklink_video_connection_map[] = {
};
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, decklink_direction_t direction, int num);
int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs);
diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
index e90b42811a..03a049a21e 100644
--- a/libavdevice/decklink_dec.cpp
+++ b/libavdevice/decklink_dec.cpp
@@ -916,6 +916,12 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
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 (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",
diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp
index 81df563b3b..c06ca4668f 100644
--- a/libavdevice/decklink_enc.cpp
+++ b/libavdevice/decklink_enc.cpp
@@ -162,6 +162,10 @@ static int decklink_setup_video(AVFormatContext *avctx, AVStream *st)
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,
st->time_base.num, st->time_base.den, c->field_order)) {
av_log(avctx, AV_LOG_ERROR, "Unsupported video size, framerate or field order!"