rendered paste bodyIndex: 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<int,uint> lang_sub_cnt;+ uint subtitleStreamCount = 0; map<int,uint> 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 <cstring>+ #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 fileIndex: 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);