Skip to content

Commit efeaeb4

Browse files
committed
bd: add processing of "secondary" audio tracks
There are actually 2 types. One "secondary" audio type is designated by a distinct stream id. The other "secondary" audio type is disignated by being in a separate "secondary" audio list. Maybe fixes HandBrake#2501
1 parent 948f1b7 commit efeaeb4

File tree

3 files changed

+127
-17
lines changed

3 files changed

+127
-17
lines changed

libhb/bd.c

+110-11
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ static void add_subtitle(int track, hb_list_t *list_subtitle, BLURAY_STREAM_INFO
130130
return;
131131
}
132132

133-
static void add_audio(int track, hb_list_t *list_audio, BLURAY_STREAM_INFO *bdaudio, int substream_type, uint32_t codec, uint32_t codec_param)
133+
static void add_audio(int track, hb_list_t *list_audio, BLURAY_STREAM_INFO *bdaudio, int substream_type, uint32_t codec, uint32_t codec_param, int attributes)
134134
{
135135
const char * codec_name;
136136
hb_audio_t * audio;
@@ -195,7 +195,7 @@ static void add_audio(int track, hb_list_t *list_audio, BLURAY_STREAM_INFO *bdau
195195

196196
lang = lang_for_code2( (char*)bdaudio->lang );
197197

198-
audio->config.lang.attributes = HB_AUDIO_ATTR_NONE;
198+
audio->config.lang.attributes = attributes;
199199

200200
snprintf( audio->config.lang.simple,
201201
sizeof( audio->config.lang.simple ), "%s",
@@ -474,47 +474,146 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration )
474474
case BLURAY_STREAM_TYPE_AUDIO_TRUHD:
475475
// Add 2 audio tracks. One for TrueHD and one for AC-3
476476
add_audio(ii, title->list_audio, bdaudio, HB_SUBSTREAM_BD_AC3,
477-
HB_ACODEC_AC3, AV_CODEC_ID_AC3);
477+
HB_ACODEC_AC3, AV_CODEC_ID_AC3, HB_AUDIO_ATTR_NONE);
478478
add_audio(ii, title->list_audio, bdaudio, HB_SUBSTREAM_BD_TRUEHD,
479-
HB_ACODEC_FFTRUEHD, AV_CODEC_ID_TRUEHD);
479+
HB_ACODEC_FFTRUEHD, AV_CODEC_ID_TRUEHD,
480+
HB_AUDIO_ATTR_NONE);
480481
break;
481482

482483
case BLURAY_STREAM_TYPE_AUDIO_DTS:
483484
add_audio(ii, title->list_audio, bdaudio, 0,
484-
HB_ACODEC_DCA, AV_CODEC_ID_DTS);
485+
HB_ACODEC_DCA, AV_CODEC_ID_DTS, HB_AUDIO_ATTR_NONE);
485486
break;
486487

487488
case BLURAY_STREAM_TYPE_AUDIO_MPEG2:
488489
case BLURAY_STREAM_TYPE_AUDIO_MPEG1:
489490
add_audio(ii, title->list_audio, bdaudio, 0,
490-
HB_ACODEC_FFMPEG, AV_CODEC_ID_MP2);
491+
HB_ACODEC_FFMPEG, AV_CODEC_ID_MP2,
492+
HB_AUDIO_ATTR_NONE);
491493
break;
492494

493495
case BLURAY_STREAM_TYPE_AUDIO_AC3PLUS:
494496
add_audio(ii, title->list_audio, bdaudio, 0,
495-
HB_ACODEC_FFEAC3, AV_CODEC_ID_EAC3);
497+
HB_ACODEC_FFEAC3, AV_CODEC_ID_EAC3,
498+
HB_AUDIO_ATTR_NONE);
499+
break;
500+
501+
case BLURAY_STREAM_TYPE_AUDIO_AC3PLUS_SECONDARY:
502+
add_audio(ii, title->list_audio, bdaudio, 0,
503+
HB_ACODEC_FFEAC3, AV_CODEC_ID_EAC3,
504+
HB_AUDIO_ATTR_NONE);
496505
break;
497506

498507
case BLURAY_STREAM_TYPE_AUDIO_LPCM:
499508
add_audio(ii, title->list_audio, bdaudio, 0,
500-
HB_ACODEC_FFMPEG, AV_CODEC_ID_PCM_BLURAY);
509+
HB_ACODEC_FFMPEG, AV_CODEC_ID_PCM_BLURAY,
510+
HB_AUDIO_ATTR_NONE);
501511
break;
502512

503513
case BLURAY_STREAM_TYPE_AUDIO_AC3:
504514
add_audio(ii, title->list_audio, bdaudio, 0,
505-
HB_ACODEC_AC3, AV_CODEC_ID_AC3);
515+
HB_ACODEC_AC3, AV_CODEC_ID_AC3, HB_AUDIO_ATTR_NONE);
506516
break;
507517

508518
case BLURAY_STREAM_TYPE_AUDIO_DTSHD_MASTER:
509519
case BLURAY_STREAM_TYPE_AUDIO_DTSHD:
510520
// Add 2 audio tracks. One for DTS-HD and one for DTS
511521
add_audio(ii, title->list_audio, bdaudio, HB_SUBSTREAM_BD_DTS,
512-
HB_ACODEC_DCA, AV_CODEC_ID_DTS);
522+
HB_ACODEC_DCA, AV_CODEC_ID_DTS, HB_AUDIO_ATTR_NONE);
513523
// DTS-HD is special. The substreams must be concatinated
514524
// DTS-core followed by DTS-hd-extensions. Setting
515525
// a substream id of 0 says use all substreams.
516526
add_audio(ii, title->list_audio, bdaudio, 0,
517-
HB_ACODEC_DCA_HD, AV_CODEC_ID_DTS);
527+
HB_ACODEC_DCA_HD, AV_CODEC_ID_DTS,
528+
HB_AUDIO_ATTR_NONE);
529+
break;
530+
531+
case BLURAY_STREAM_TYPE_AUDIO_DTSHD_SECONDARY:
532+
// BD "DTSHD_SECONDARY" is DTS Express which has no
533+
// DTS core
534+
add_audio(ii, title->list_audio, bdaudio, 0,
535+
HB_ACODEC_DCA_HD, AV_CODEC_ID_DTS,
536+
HB_AUDIO_ATTR_NONE);
537+
break;
538+
539+
default:
540+
hb_log("scan: unknown audio pid 0x%x codec 0x%x", bdaudio->pid,
541+
bdaudio->coding_type);
542+
break;
543+
}
544+
}
545+
546+
// Add all the secondary audios found in the above clip.
547+
for (jj = 0; jj < ti->clips[audio_clip_index].sec_audio_stream_count; jj++, ii++)
548+
{
549+
BLURAY_STREAM_INFO * bdaudio;
550+
551+
bdaudio = &ti->clips[audio_clip_index].sec_audio_streams[jj];
552+
553+
switch (bdaudio->coding_type)
554+
{
555+
case BLURAY_STREAM_TYPE_AUDIO_TRUHD:
556+
// Add 2 audio tracks. One for TrueHD and one for AC-3
557+
add_audio(ii, title->list_audio, bdaudio, HB_SUBSTREAM_BD_AC3,
558+
HB_ACODEC_AC3, AV_CODEC_ID_AC3,
559+
HB_AUDIO_ATTR_SECONDARY);
560+
add_audio(ii, title->list_audio, bdaudio, HB_SUBSTREAM_BD_TRUEHD,
561+
HB_ACODEC_FFTRUEHD, AV_CODEC_ID_TRUEHD,
562+
HB_AUDIO_ATTR_SECONDARY);
563+
break;
564+
565+
case BLURAY_STREAM_TYPE_AUDIO_DTS:
566+
add_audio(ii, title->list_audio, bdaudio, 0,
567+
HB_ACODEC_DCA, AV_CODEC_ID_DTS,
568+
HB_AUDIO_ATTR_SECONDARY);
569+
break;
570+
571+
case BLURAY_STREAM_TYPE_AUDIO_MPEG2:
572+
case BLURAY_STREAM_TYPE_AUDIO_MPEG1:
573+
add_audio(ii, title->list_audio, bdaudio, 0,
574+
HB_ACODEC_FFMPEG, AV_CODEC_ID_MP2,
575+
HB_AUDIO_ATTR_SECONDARY);
576+
break;
577+
578+
case BLURAY_STREAM_TYPE_AUDIO_AC3PLUS:
579+
case BLURAY_STREAM_TYPE_AUDIO_AC3PLUS_SECONDARY:
580+
add_audio(ii, title->list_audio, bdaudio, 0,
581+
HB_ACODEC_FFEAC3, AV_CODEC_ID_EAC3,
582+
HB_AUDIO_ATTR_SECONDARY);
583+
break;
584+
585+
case BLURAY_STREAM_TYPE_AUDIO_LPCM:
586+
add_audio(ii, title->list_audio, bdaudio, 0,
587+
HB_ACODEC_FFMPEG, AV_CODEC_ID_PCM_BLURAY,
588+
HB_AUDIO_ATTR_SECONDARY);
589+
break;
590+
591+
case BLURAY_STREAM_TYPE_AUDIO_AC3:
592+
add_audio(ii, title->list_audio, bdaudio, 0,
593+
HB_ACODEC_AC3, AV_CODEC_ID_AC3,
594+
HB_AUDIO_ATTR_SECONDARY);
595+
break;
596+
597+
case BLURAY_STREAM_TYPE_AUDIO_DTSHD_MASTER:
598+
case BLURAY_STREAM_TYPE_AUDIO_DTSHD:
599+
// Add 2 audio tracks. One for DTS-HD and one for DTS
600+
add_audio(ii, title->list_audio, bdaudio, HB_SUBSTREAM_BD_DTS,
601+
HB_ACODEC_DCA, AV_CODEC_ID_DTS,
602+
HB_AUDIO_ATTR_SECONDARY);
603+
// DTS-HD is special. The substreams must be concatinated
604+
// DTS-core followed by DTS-hd-extensions. Setting
605+
// a substream id of 0 says use all substreams.
606+
add_audio(ii, title->list_audio, bdaudio, 0,
607+
HB_ACODEC_DCA_HD, AV_CODEC_ID_DTS,
608+
HB_AUDIO_ATTR_SECONDARY);
609+
break;
610+
611+
case BLURAY_STREAM_TYPE_AUDIO_DTSHD_SECONDARY:
612+
// BD "DTSHD_SECONDARY" is DTS Express which has no
613+
// DTS core
614+
add_audio(ii, title->list_audio, bdaudio, 0,
615+
HB_ACODEC_DCA_HD, AV_CODEC_ID_DTS,
616+
HB_AUDIO_ATTR_SECONDARY);
518617
break;
519618

520619
default:

libhb/scan.c

+6
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,12 @@ static void LookForAudio(hb_scan_t *scan, hb_title_t * title, hb_buffer_t * b)
13341334
sizeof(audio->config.lang.description) -
13351335
strlen(audio->config.lang.description) - 1);
13361336
}
1337+
if (audio->config.lang.attributes & HB_AUDIO_ATTR_SECONDARY)
1338+
{
1339+
strncat(audio->config.lang.description, " (Secondary)",
1340+
sizeof(audio->config.lang.description) -
1341+
strlen(audio->config.lang.description) - 1);
1342+
}
13371343

13381344
if (audio->config.in.channel_layout)
13391345
{

libhb/stream.c

+11-6
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ static const stream2codec_t st2codec[256] = {
9595
// BD E-AC3 Secondary audio
9696
st(0xa1, U, 0, 0, "E-AC3"),
9797
// BD DTS-HD Secondary audio
98-
st(0xa2, U, 0, 0, "DTS-HD LBR"),
98+
st(0xa2, U, HB_ACODEC_DCA_HD, AV_CODEC_ID_DTS, "DTS-HD LBR"),
9999

100100
st(0xea, V, WORK_DECAVCODECV, AV_CODEC_ID_VC1, "VC-1"),
101101
};
@@ -4288,11 +4288,16 @@ static void hb_ts_resolve_pid_types(hb_stream_t *stream)
42884288
stream->pes.list[pes_idx].codec_param = AV_CODEC_ID_EAC3;
42894289
continue;
42904290
}
4291-
// 0xa2 is DTS-HD LBR used in HD-DVD and bluray for
4292-
// secondary audio streams. FFmpeg can not decode yet.
4293-
// Having it in the audio list causes delays during scan
4294-
// while we try to get stream parameters. So skip
4295-
// this type for now.
4291+
if ( stype == 0xa2 &&
4292+
stream->reg_desc == STR4_TO_UINT32("HDMV") )
4293+
{
4294+
// Blueray DTS-HD LBR audio
4295+
// This is no interleaved DTS core
4296+
update_ts_streams( stream, pid, 0, stype, A, &pes_idx );
4297+
stream->pes.list[pes_idx].codec = HB_ACODEC_DCA_HD;
4298+
stream->pes.list[pes_idx].codec_param = AV_CODEC_ID_DTS;
4299+
continue;
4300+
}
42964301
if ( stype == 0x85 &&
42974302
stream->reg_desc == STR4_TO_UINT32("HDMV") )
42984303
{

0 commit comments

Comments
 (0)