Index: myth/trunk/mythtv/libs/libmythtv/avformatdecoder.cpp =================================================================== --- myth.orig/trunk/mythtv/libs/libmythtv/avformatdecoder.cpp +++ myth/trunk/mythtv/libs/libmythtv/avformatdecoder.cpp @@ -27,6 +27,7 @@ using namespace std; #include "subtitlereader.h" #include "interactivetv.h" #include "DVDRingBuffer.h" +#include "BDRingBuffer.h" #include "videodisplayprofile.h" #include "mythuihelper.h" @@ -1851,7 +1852,9 @@ int AvFormatDecoder::ScanStreams(bool no selectedVideoIndex = -1; map lang_sub_cnt; + uint subtitleStreamCount = 0; map lang_aud_cnt; + uint audioStreamCount = 0; if (ringBuffer && ringBuffer->isDVD() && ringBuffer->DVD()->AudioStreamsChanged()) @@ -2219,10 +2222,18 @@ int AvFormatDecoder::ScanStreams(bool no if (enc->codec_type == CODEC_TYPE_SUBTITLE) { - AVMetadataTag *metatag = av_metadata_get(ic->streams[i]->metadata, - "language", NULL, 0); - int lang = metatag ? get_canonical_lang(metatag->value) : iso639_str3_to_key("und"); + int lang; + if (ringBuffer && ringBuffer->isBD()) + lang = ringBuffer->BD()->GetSubtitleLanguage(subtitleStreamCount); + else + { + AVMetadataTag *metatag = av_metadata_get(ic->streams[i]->metadata, + "language", NULL, 0); + lang = metatag ? get_canonical_lang(metatag->value) : iso639_str3_to_key("und"); + } + int lang_indx = lang_sub_cnt[lang]++; + subtitleStreamCount++; tracks[kTrackTypeSubtitle].push_back( StreamInfo(i, lang, lang_indx, ic->streams[i]->id)); @@ -2240,6 +2251,8 @@ int AvFormatDecoder::ScanStreams(bool no if (ringBuffer && ringBuffer->isDVD()) lang = ringBuffer->DVD()->GetAudioLanguage( ringBuffer->DVD()->GetAudioTrackNum(ic->streams[i]->id)); + else if (ringBuffer && ringBuffer->isBD()) + lang = ringBuffer->BD()->GetAudioLanguage(audioStreamCount); else { AVMetadataTag *metatag = av_metadata_get(ic->streams[i]->metadata, @@ -2248,6 +2261,7 @@ int AvFormatDecoder::ScanStreams(bool no } int lang_indx = lang_aud_cnt[lang]++; + audioStreamCount++; if (ic->streams[i]->codec->avcodec_dual_language) { Index: myth/trunk/mythtv/libs/libmythtv/BDRingBuffer.cpp =================================================================== --- myth.orig/trunk/mythtv/libs/libmythtv/BDRingBuffer.cpp +++ myth/trunk/mythtv/libs/libmythtv/BDRingBuffer.cpp @@ -1,7 +1,11 @@ + +#include + #include "bdnav/mpls_parse.h" #include "bdnav/navigation.h" #include "bdnav/bdparse.h" +#include "iso639.h" #include "BDRingBuffer.h" #include "mythverbose.h" #include "mythdirs.h" @@ -53,8 +54,14 @@ bool BDRingBufferPriv::OpenFile(const QS VERBOSE(VB_IMPORTANT, LOC + QString("Opened BDRingBuffer device at %1") .arg(filename.toLatin1().data())); + QString keyfile = QString("%1/KEYDB.cfg").arg(GetConfDir()); + QByteArray keyarray = keyfile.toAscii(); + const char *keyfilepath = keyarray.data(); + bdnav = bd_open(filename.toLatin1().data(), keyfilepath); + VERBOSE(VB_IMPORTANT, LOC + QString("Using %1 as keyfile...") + .arg(QString(keyfilepath))); if (!bdnav) return false; @@ -264,3 +271,46 @@ double BDRingBufferPriv::GetFrameRate(vo else return 0; } + +int BDRingBufferPriv::GetAudioLanguage(uint streamID) +{ + if (!m_currentTitleInfo || + streamID >= m_currentTitleInfo->clips->audio_stream_count) + return iso639_str3_to_key("und"); + + uint8_t lang[4] = { 0, 0, 0, 0 }; + memcpy(lang, m_currentTitleInfo->clips->audio_streams[streamID].lang, 4); + int code = iso639_key_to_canonical_key((lang[0]<<16)|(lang[1]<<8)|lang[2]); + + VERBOSE(VB_IMPORTANT, QString("Audio Lang: %1 Code: %2").arg(code).arg(iso639_key_to_str3(code))); + + return code; +} + +int BDRingBufferPriv::GetSubtitleLanguage(uint streamID) +{ + if (m_currentTitleInfo) + { + int pgCount = m_currentTitleInfo->clips->pg_stream_count; + uint subCount = 0; + for (int i = 0; i < pgCount; ++i) + { + if (m_currentTitleInfo->clips->pg_streams[i].coding_type >= 0x90 && + m_currentTitleInfo->clips->pg_streams[i].coding_type <= 0x92) + { + if (streamID == subCount) + { + + uint8_t lang[4] = { 0, 0, 0, 0 }; + memcpy(lang, m_currentTitleInfo->clips->pg_streams[streamID].lang, 4); + int code = iso639_key_to_canonical_key((lang[0]<<16)|(lang[1]<<8)|lang[2]); + VERBOSE(VB_IMPORTANT, QString("Subtitle Lang: %1 Code: %2").arg(code).arg(iso639_key_to_str3(code))); + return code; + } + subCount++; + } + } + } + + return iso639_str3_to_key("und"); +} \ No newline at end of file Index: myth/trunk/mythtv/libs/libmythtv/BDRingBuffer.h =================================================================== --- myth.orig/trunk/mythtv/libs/libmythtv/BDRingBuffer.h +++ myth/trunk/mythtv/libs/libmythtv/BDRingBuffer.h @@ -41,6 +41,9 @@ class MPUBLIC BDRingBufferPriv void GetDescForPos(QString &desc) const; double GetFrameRate(void); + int GetAudioLanguage(uint streamID); + int GetSubtitleLanguage(uint streamID); + // commands bool OpenFile(const QString &filename); void close(void);