Commit 89cc4855 authored by Dave Rice's avatar Dave Rice Committed by Marton Balint

avdevice/decklink_dec: 32 bit audio support

Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent c37de519
...@@ -311,6 +311,10 @@ Sets maximum input buffer size in bytes. If the buffering reaches this value, ...@@ -311,6 +311,10 @@ Sets maximum input buffer size in bytes. If the buffering reaches this value,
incoming frames will be dropped. incoming frames will be dropped.
Defaults to @samp{1073741824}. Defaults to @samp{1073741824}.
@item audio_depth
Sets the audio sample bit depth. Must be @samp{16} or @samp{32}.
Defaults to @samp{16}.
@end table @end table
@subsection Examples @subsection Examples
......
...@@ -97,6 +97,7 @@ struct decklink_ctx { ...@@ -97,6 +97,7 @@ struct decklink_ctx {
int frames_buffer_available_spots; int frames_buffer_available_spots;
int channels; int channels;
int audio_depth;
}; };
typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t; typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t;
......
...@@ -42,6 +42,7 @@ struct decklink_cctx { ...@@ -42,6 +42,7 @@ struct decklink_cctx {
double preroll; double preroll;
int v210; int v210;
int audio_channels; int audio_channels;
int audio_depth;
int duplex_mode; int duplex_mode;
DecklinkPtsSource audio_pts_source; DecklinkPtsSource audio_pts_source;
DecklinkPtsSource video_pts_source; DecklinkPtsSource video_pts_source;
......
...@@ -771,7 +771,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( ...@@ -771,7 +771,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
av_init_packet(&pkt); av_init_packet(&pkt);
//hack among hacks //hack among hacks
pkt.size = audioFrame->GetSampleFrameCount() * ctx->audio_st->codecpar->channels * (16 / 8); pkt.size = audioFrame->GetSampleFrameCount() * ctx->audio_st->codecpar->channels * (ctx->audio_depth / 8);
audioFrame->GetBytes(&audioFrameBytes); audioFrame->GetBytes(&audioFrameBytes);
audioFrame->GetPacketTime(&audio_pts, ctx->audio_st->time_base.den); audioFrame->GetPacketTime(&audio_pts, ctx->audio_st->time_base.den);
pkt.pts = get_pkt_pts(videoFrame, audioFrame, wallclock, ctx->audio_pts_source, ctx->audio_st->time_base, &initial_audio_pts); pkt.pts = get_pkt_pts(videoFrame, audioFrame, wallclock, ctx->audio_pts_source, ctx->audio_st->time_base, &initial_audio_pts);
...@@ -854,6 +854,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -854,6 +854,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
ctx->audio_pts_source = cctx->audio_pts_source; ctx->audio_pts_source = cctx->audio_pts_source;
ctx->video_pts_source = cctx->video_pts_source; ctx->video_pts_source = cctx->video_pts_source;
ctx->draw_bars = cctx->draw_bars; ctx->draw_bars = cctx->draw_bars;
ctx->audio_depth = cctx->audio_depth;
cctx->ctx = ctx; cctx->ctx = ctx;
/* Check audio channel option for valid values: 2, 8 or 16 */ /* Check audio channel option for valid values: 2, 8 or 16 */
...@@ -867,6 +868,16 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -867,6 +868,16 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
/* Check audio bit depth option for valid values: 16 or 32 */
switch (cctx->audio_depth) {
case 16:
case 32:
break;
default:
av_log(avctx, AV_LOG_ERROR, "Value for audio bit depth option must be either 16 or 32\n");
return AVERROR(EINVAL);
}
/* List available devices. */ /* List available devices. */
if (ctx->list_devices) { if (ctx->list_devices) {
ff_decklink_list_devices_legacy(avctx, 1, 0); ff_decklink_list_devices_legacy(avctx, 1, 0);
...@@ -930,7 +941,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -930,7 +941,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
goto error; goto error;
} }
st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE; st->codecpar->codec_id = cctx->audio_depth == 32 ? AV_CODEC_ID_PCM_S32LE : AV_CODEC_ID_PCM_S16LE;
st->codecpar->sample_rate = bmdAudioSampleRate48kHz; st->codecpar->sample_rate = bmdAudioSampleRate48kHz;
st->codecpar->channels = cctx->audio_channels; st->codecpar->channels = cctx->audio_channels;
avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */ avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
...@@ -1021,7 +1032,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -1021,7 +1032,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
} }
av_log(avctx, AV_LOG_VERBOSE, "Using %d input audio channels\n", ctx->audio_st->codecpar->channels); av_log(avctx, AV_LOG_VERBOSE, "Using %d input audio channels\n", ctx->audio_st->codecpar->channels);
result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, ctx->audio_st->codecpar->channels); result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz, cctx->audio_depth == 32 ? bmdAudioSampleType32bitInteger : bmdAudioSampleType16bitInteger, ctx->audio_st->codecpar->channels);
if (result != S_OK) { if (result != S_OK) {
av_log(avctx, AV_LOG_ERROR, "Cannot enable audio input\n"); av_log(avctx, AV_LOG_ERROR, "Cannot enable audio input\n");
......
...@@ -72,6 +72,7 @@ static const AVOption options[] = { ...@@ -72,6 +72,7 @@ static const AVOption options[] = {
{ "wallclock", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PTS_SRC_WALLCLOCK}, 0, 0, DEC, "pts_source"}, { "wallclock", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PTS_SRC_WALLCLOCK}, 0, 0, DEC, "pts_source"},
{ "draw_bars", "draw bars on signal loss" , OFFSET(draw_bars), AV_OPT_TYPE_BOOL, { .i64 = 1}, 0, 1, DEC }, { "draw_bars", "draw bars on signal loss" , OFFSET(draw_bars), AV_OPT_TYPE_BOOL, { .i64 = 1}, 0, 1, DEC },
{ "queue_size", "input queue buffer size", OFFSET(queue_size), AV_OPT_TYPE_INT64, { .i64 = (1024 * 1024 * 1024)}, 0, INT64_MAX, DEC }, { "queue_size", "input queue buffer size", OFFSET(queue_size), AV_OPT_TYPE_INT64, { .i64 = (1024 * 1024 * 1024)}, 0, INT64_MAX, DEC },
{ "audio_depth", "audio bitdepth (16 or 32)", OFFSET(audio_depth), AV_OPT_TYPE_INT, { .i64 = 16}, 16, 32, DEC },
{ NULL }, { NULL },
}; };
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#define LIBAVDEVICE_VERSION_MAJOR 57 #define LIBAVDEVICE_VERSION_MAJOR 57
#define LIBAVDEVICE_VERSION_MINOR 11 #define LIBAVDEVICE_VERSION_MINOR 11
#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_MICRO 101
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \ LIBAVDEVICE_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment