mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
avdevice/decklink: 10 Bit support for Decklink input device
Example to capture video clip at 1080i50 10 bit: ffmpeg -bm_v210 1 -f decklink -i 'UltraStudio Mini Recorder@11' -acodec copy -vcodec copy output.avi Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
6a8a3bfb87
commit
97a27065c8
@ -28,5 +28,6 @@ struct decklink_cctx {
|
||||
int list_devices;
|
||||
int list_formats;
|
||||
double preroll;
|
||||
int v210;
|
||||
};
|
||||
|
||||
|
@ -233,6 +233,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
|
||||
ctx->video_st->time_base.den);
|
||||
|
||||
if (videoFrame->GetFlags() & bmdFrameHasNoInputSource) {
|
||||
if (videoFrame->GetPixelFormat() == bmdFormat8BitYUV) {
|
||||
unsigned bars[8] = {
|
||||
0xEA80EA80, 0xD292D210, 0xA910A9A5, 0x90229035,
|
||||
0x6ADD6ACA, 0x51EF515A, 0x286D28EF, 0x10801080 };
|
||||
@ -244,6 +245,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
|
||||
for (int x = 0; x < width; x += 2)
|
||||
*p++ = bars[(x * 8) / width];
|
||||
}
|
||||
}
|
||||
|
||||
if (!no_video) {
|
||||
av_log(avctx, AV_LOG_WARNING, "Frame received (#%lu) - No input signal detected "
|
||||
@ -466,15 +468,21 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
|
||||
goto error;
|
||||
}
|
||||
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
st->codec->codec_id = AV_CODEC_ID_RAWVIDEO;
|
||||
st->codec->width = ctx->bmd_width;
|
||||
st->codec->height = ctx->bmd_height;
|
||||
|
||||
st->codec->pix_fmt = AV_PIX_FMT_UYVY422;
|
||||
st->codec->time_base.den = ctx->bmd_tb_den;
|
||||
st->codec->time_base.num = ctx->bmd_tb_num;
|
||||
st->codec->bit_rate = avpicture_get_size(st->codec->pix_fmt, ctx->bmd_width, ctx->bmd_height) * 1/av_q2d(st->codec->time_base) * 8;
|
||||
st->codec->codec_tag = MKTAG('U', 'Y', 'V', 'Y');
|
||||
|
||||
if (cctx->v210) {
|
||||
st->codec->codec_id = AV_CODEC_ID_V210;
|
||||
st->codec->codec_tag = MKTAG('V', '2', '1', '0');
|
||||
} else {
|
||||
st->codec->codec_id = AV_CODEC_ID_RAWVIDEO;
|
||||
st->codec->pix_fmt = AV_PIX_FMT_UYVY422;
|
||||
st->codec->codec_tag = MKTAG('U', 'Y', 'V', 'Y');
|
||||
}
|
||||
|
||||
avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
|
||||
|
||||
@ -487,7 +495,9 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
|
||||
goto error;
|
||||
}
|
||||
|
||||
result = ctx->dli->EnableVideoInput(ctx->bmd_mode, bmdFormat8BitYUV, bmdVideoInputFlagDefault);
|
||||
result = ctx->dli->EnableVideoInput(ctx->bmd_mode,
|
||||
cctx->v210 ? bmdFormat10BitYUV : bmdFormat8BitYUV,
|
||||
bmdVideoInputFlagDefault);
|
||||
|
||||
if (result != S_OK) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Cannot enable video input\n");
|
||||
|
@ -31,6 +31,7 @@
|
||||
static const AVOption options[] = {
|
||||
{ "list_devices", "list available devices" , OFFSET(list_devices), AV_OPT_TYPE_INT , { .i64 = 0 }, 0, 1, DEC },
|
||||
{ "list_formats", "list supported formats" , OFFSET(list_formats), AV_OPT_TYPE_INT , { .i64 = 0 }, 0, 1, DEC },
|
||||
{ "bm_v210", "v210 10 bit per channel" , OFFSET(v210), AV_OPT_TYPE_INT , { .i64 = 0 }, 0, 1, DEC },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user