summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodeo <[email protected]>2014-01-26 16:12:23 +0000
committerRodeo <[email protected]>2014-01-26 16:12:23 +0000
commit1d7db22df59be148ed995eee7755f21d8f0b9d5b (patch)
tree32eb0acf048550576259f0798f8da0a7975c5703
parentee621317fb45852db29b94308b87690827a9a0df (diff)
libhb: support AV_FRAME_DATA_MATRIXENCODING side data.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6000 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/common.c3
-rw-r--r--libhb/common.h2
-rw-r--r--libhb/deca52.c8
-rw-r--r--libhb/decavcodec.c22
-rw-r--r--libhb/declpcm.c1
-rw-r--r--libhb/scan.c40
-rw-r--r--win/CS/HandBrake.Interop/HandBrakeInterop/HbLib/hb_audio.cs3
7 files changed, 72 insertions, 7 deletions
diff --git a/libhb/common.c b/libhb/common.c
index 813ece48e..720ff4976 100644
--- a/libhb/common.c
+++ b/libhb/common.c
@@ -3431,7 +3431,8 @@ void hb_audio_config_init(hb_audio_config_t * audiocfg)
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;
diff --git a/libhb/common.h b/libhb/common.h
index cf037e579..eece75e55 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -677,6 +677,7 @@ struct hb_audio_config_s
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;
@@ -1010,6 +1011,7 @@ typedef struct hb_work_info_s
uint64_t channel_layout;
hb_chan_map_t * channel_map;
int samples_per_frame;
+ int matrix_encoding;
};
};
} hb_work_info_t;
diff --git a/libhb/deca52.c b/libhb/deca52.c
index 5dde0378a..015d00b39 100644
--- a/libhb/deca52.c
+++ b/libhb/deca52.c
@@ -537,6 +537,14 @@ static int deca52BSInfo( hb_work_object_t *w, const hb_buffer_t *b,
info->mode = raw & 0x7; /* bsmod is the following 3 bits */
info->samples_per_frame = 1536;
+ if ((flags & A52_CHANNEL_MASK) == A52_DOLBY)
+ {
+ info->matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
+ }
+ else
+ {
+ info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
+ }
info->channel_layout = (acmod2layout[(flags & A52_CHANNEL_MASK)] |
lfeon2layout[(flags & A52_LFE) != 0]);
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 1e760583b..73692de5f 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -721,10 +721,30 @@ static int decavcodecaBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
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;
diff --git a/libhb/declpcm.c b/libhb/declpcm.c
index a8f2e32d4..156b58056 100644
--- a/libhb/declpcm.c
+++ b/libhb/declpcm.c
@@ -378,6 +378,7 @@ static int declpcmBSInfo( hb_work_object_t *w, const hb_buffer_t *b,
info->rate_base = 1;
info->bitrate = bitrate;
info->flags = ( b->data[3] << 16 ) | ( b->data[4] << 8 ) | b->data[5];
+ info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
info->channel_layout = hdr2layout[nchannels - 1];
info->channel_map = &hb_libav_chan_map;
info->samples_per_frame = ( duration * rate ) / 90000;
diff --git a/libhb/scan.c b/libhb/scan.c
index 6dc5f6fc6..fc13810ed 100644
--- a/libhb/scan.c
+++ b/libhb/scan.c
@@ -1029,6 +1029,7 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
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;
@@ -1145,11 +1146,7 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
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));
@@ -1157,6 +1154,39 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
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,
diff --git a/win/CS/HandBrake.Interop/HandBrakeInterop/HbLib/hb_audio.cs b/win/CS/HandBrake.Interop/HandBrakeInterop/HbLib/hb_audio.cs
index 72ed63483..f0627670d 100644
--- a/win/CS/HandBrake.Interop/HandBrakeInterop/HbLib/hb_audio.cs
+++ b/win/CS/HandBrake.Interop/HandBrakeInterop/HbLib/hb_audio.cs
@@ -115,6 +115,9 @@ namespace HandBrake.Interop.HbLib
/* Input bitrate (bps) */
public int bitrate;
+ /* Source matrix encoding mode, set by the audio decoder */
+ public int matrix_encoding;
+
/* Source channel layout, set by the audio decoder */
public ulong channel_layout;