audiocfg->in.samplerate = -1;
audiocfg->in.samples_per_frame = -1;
audiocfg->in.bitrate = -1;
- audiocfg->in.channel_layout = -1;
+ audiocfg->in.matrix_encoding = AV_MATRIX_ENCODING_NONE;
+ audiocfg->in.channel_layout = 0;
audiocfg->in.channel_map = NULL;
audiocfg->lang.description[0] = 0;
audiocfg->lang.simple[0] = 0;
PRIVATE int samplerate; /* Input sample rate (Hz) */
PRIVATE int samples_per_frame; /* Number of samples per frame */
PRIVATE int bitrate; /* Input bitrate (bps) */
+ PRIVATE int matrix_encoding; /* Source matrix encoding mode, set by the audio decoder */
PRIVATE uint64_t channel_layout; /* Source channel layout, set by the audio decoder */
PRIVATE hb_chan_map_t * channel_map; /* Source channel map, set by the audio decoder */
} in;
uint64_t channel_layout;
hb_chan_map_t * channel_map;
int samples_per_frame;
+ int matrix_encoding;
};
};
} hb_work_info_t;
if (truehd_mono)
{
info->channel_layout = AV_CH_LAYOUT_MONO;
+ info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
}
else
{
- info->channel_layout = frame->channel_layout;
+ AVFrameSideData *side_data;
+ if ((side_data =
+ av_frame_get_side_data(frame,
+ AV_FRAME_DATA_MATRIXENCODING)) != NULL)
+ {
+ info->matrix_encoding = *side_data->data;
+ }
+ else
+ {
+ info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
+ }
+ if (info->matrix_encoding == AV_MATRIX_ENCODING_DOLBY ||
+ info->matrix_encoding == AV_MATRIX_ENCODING_DPLII)
+ {
+ info->channel_layout = AV_CH_LAYOUT_STEREO_DOWNMIX;
+ }
+ else
+ {
+ info->channel_layout = frame->channel_layout;
+ }
}
ret = 1;
audio->config.in.samplerate = info.rate;
audio->config.in.samples_per_frame = info.samples_per_frame;
audio->config.in.bitrate = info.bitrate;
+ audio->config.in.matrix_encoding = info.matrix_encoding;
audio->config.in.channel_layout = info.channel_layout;
audio->config.in.channel_map = info.channel_map;
audio->config.in.version = info.version;
break;
}
- if (audio->config.in.channel_layout == AV_CH_LAYOUT_STEREO_DOWNMIX)
- {
- strcat(audio->config.lang.description, " (Dolby Surround)");
- }
- else if (audio->config.in.channel_layout)
+ if (audio->config.in.channel_layout)
{
int lfes = (!!(audio->config.in.channel_layout & AV_CH_LOW_FREQUENCY) +
!!(audio->config.in.channel_layout & AV_CH_LOW_FREQUENCY_2));
char *desc = audio->config.lang.description +
strlen(audio->config.lang.description);
sprintf(desc, " (%d.%d ch)", channels - lfes, lfes);
+
+ // describe the matrix encoding mode, if any
+ switch (audio->config.in.matrix_encoding)
+ {
+ case AV_MATRIX_ENCODING_DOLBY:
+ if (audio->config.in.codec == HB_ACODEC_AC3 ||
+ audio->config.in.codec_param == AV_CODEC_ID_AC3 ||
+ audio->config.in.codec_param == AV_CODEC_ID_EAC3 ||
+ audio->config.in.codec_param == AV_CODEC_ID_TRUEHD)
+ {
+ strcat(audio->config.lang.description, " (Dolby Surround)");
+ break;
+ }
+ strcat(audio->config.lang.description, " (Lt/Rt)");
+ break;
+ case AV_MATRIX_ENCODING_DPLII:
+ strcat(audio->config.lang.description, " (Dolby Pro Logic II)");
+ break;
+ case AV_MATRIX_ENCODING_DPLIIX:
+ strcat(audio->config.lang.description, " (Dolby Pro Logic IIx)");
+ break;
+ case AV_MATRIX_ENCODING_DPLIIZ:
+ strcat(audio->config.lang.description, " (Dolby Pro Logic IIz)");
+ break;
+ case AV_MATRIX_ENCODING_DOLBYEX:
+ strcat(audio->config.lang.description, " (Dolby Digital EX)");
+ break;
+ case AV_MATRIX_ENCODING_DOLBYHEADPHONE:
+ strcat(audio->config.lang.description, " (Dolby Headphone)");
+ break;
+ default:
+ break;
+ }
}
hb_log( "scan: audio 0x%x: %s, rate=%dHz, bitrate=%d %s", audio->id,