Ticket #7638: dvd-audio-stream-ordering-v6.patch

File dvd-audio-stream-ordering-v6.patch, 4.4 KB (added by linux@…, 14 years ago)

corrected oversight in patch version 5: one more instance of audioN had to be replaced by stream_id in vm_get_audio_stream

  • mythtv/libs/libmythdvdnav/dvdnav/vm/vm.c

    diff --git a/mythtv/libs/libmythdvdnav/dvdnav/vm/vm.c b/mythtv/libs/libmythdvdnav/dvdnav/vm/vm.c
    index c8f25eb..d198d33 100644
    a b int vm_get_current_title_part(vm_t *vm, int *title_result, int *part_result) { 
    698698 */
    699699int vm_get_audio_stream(vm_t *vm, int audioN) {
    700700  int streamN = -1;
    701 
     701  const uint AC3_OFFSET = 0x80;
     702  const uint DTS_OFFSET = 0x88;
     703  const uint LPCM_OFFSET = 0xA0;
     704
     705  int stream_id = audioN;
     706  if (stream_id >= LPCM_OFFSET) {
     707    stream_id -= LPCM_OFFSET;
     708  } else if (stream_id >= DTS_OFFSET) {
     709    stream_id -= DTS_OFFSET;
     710  } else if (stream_id >= AC3_OFFSET) {
     711    stream_id -= AC3_OFFSET;
     712  }
     713   
    702714  if((vm->state).domain != VTS_DOMAIN)
    703     audioN = 0;
     715    stream_id = 0;
    704716
    705   if(audioN < 8) {
     717  if(stream_id < 8) {
    706718    /* Is there any control info for this logical stream */
    707     if((vm->state).pgc->audio_control[audioN] & (1<<15)) {
    708       streamN = ((vm->state).pgc->audio_control[audioN] >> 8) & 0x07;
     719    if((vm->state).pgc->audio_control[stream_id] & (1<<15)) {
     720      streamN = ((vm->state).pgc->audio_control[stream_id] >> 8) & 0x07;
    709721    }
    710722  }
    711723
    712724  if((vm->state).domain != VTS_DOMAIN && streamN == -1)
    713725    streamN = 0;
    714726
    715   /* FIXME: Should also check in vtsi/vmgi status what kind of stream
    716    * it is (ac3/lpcm/dts/sdds...) to find the right (sub)stream id */
    717727  return streamN;
    718728}
    719729
  • mythtv/libs/libmythtv/DVDRingBuffer.cpp

    diff --git a/mythtv/libs/libmythtv/DVDRingBuffer.cpp b/mythtv/libs/libmythtv/DVDRingBuffer.cpp
    index 30c66a6..2f5a785 100644
    a b uint DVDRingBufferPriv::GetAudioLanguage(int id) 
    11011101    return ConvertLangCode(lang);
    11021102}
    11031103
     1104/** \brief get real dvd track audio number
     1105  * \param key stream_id
     1106*/
     1107int DVDRingBufferPriv::GetAudioTrackNum(uint stream_id)
     1108{
     1109    return dvdnav_get_audio_logical_stream(m_dvdnav, stream_id);
     1110}
     1111
    11041112/** \brief get the subtitle language from the dvd
    11051113 */
    11061114uint DVDRingBufferPriv::GetSubtitleLanguage(int id)
  • mythtv/libs/libmythtv/DVDRingBuffer.h

    diff --git a/mythtv/libs/libmythtv/DVDRingBuffer.h b/mythtv/libs/libmythtv/DVDRingBuffer.h
    index 6cc288c..5351d7e 100644
    a b class MPUBLIC DVDRingBufferPriv 
    5858
    5959    bool IgnoringStillorWait(void) { return m_skipstillorwait; }
    6060    uint GetAudioLanguage(int id);
     61    int  GetAudioTrackNum(uint key);
    6162    uint GetSubtitleLanguage(int key);
    6263    void SetMenuPktPts(long long pts) { m_menupktpts = pts; }
    6364    long long GetMenuPktPts(void) { return m_menupktpts; }
  • mythtv/libs/libmythtv/avformatdecoder.cpp

    diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
    index ab4017d..6e0b543 100644
    a b int AvFormatDecoder::ScanStreams(bool novideo) 
    20032003            }
    20042004            else
    20052005            {
     2006                int logical_stream_id;
     2007                if (ringBuffer && ringBuffer->isDVD())
     2008                    logical_stream_id = ringBuffer->DVD()->GetAudioTrackNum(ic->streams[i]->id);
     2009                else
     2010                    logical_stream_id = ic->streams[i]->id;
     2011
    20062012                tracks[kTrackTypeAudio].push_back(
    2007                     StreamInfo(i, lang, lang_indx, ic->streams[i]->id));
     2013                    StreamInfo(i, lang, lang_indx, logical_stream_id));
    20082014            }
    20092015
    20102016            VERBOSE(VB_AUDIO, LOC + QString(
    int AvFormatDecoder::ScanStreams(bool novideo) 
    20272033    {
    20282034        if (tracks[kTrackTypeAudio].size() > 1)
    20292035        {
     2036            sort(tracks[kTrackTypeAudio].begin(),
     2037                 tracks[kTrackTypeAudio].end());
    20302038            sinfo_vec_t::iterator it = tracks[kTrackTypeAudio].begin();
    20312039            for (; it != tracks[kTrackTypeAudio].end(); ++it)
    20322040            {
    20332041                VERBOSE(VB_PLAYBACK, LOC +
    20342042                            QString("DVD Audio Track Map "
    2035                                     "Stream id #%1 ")
    2036                                     .arg(it->stream_id));
     2043                                    "Stream id #%1, MPEG stream %2")
     2044                                    .arg(it->stream_id)
     2045                                    .arg(ic->streams[it->av_stream_index]->id));
    20372046            }
    20382047            int trackNo = ringBuffer->DVD()->GetTrack(kTrackTypeAudio);
    20392048            if (trackNo >= (int)GetTrackCount(kTrackTypeAudio))