Ticket #3260: audio_track_final_fix_v2.diff

File audio_track_final_fix_v2.diff, 12.3 KB (added by skamithi, 18 years ago)

audio_track_final patch with some bugfixes. found some problems with it on the jet li heros dvd.

  • libs/libmythdvdnav/dvdnav.c

     
    927927 
    928928}
    929929
     930/*
     931 * \brief get dvd audio format for provided stream
     932 * \return 0 - AC3, 2-MP2, 4-LPCM, 6-DTS,
     933 */
     934unsigned char dvdnav_audio_get_format(dvdnav_t *this, uint8_t stream){
     935  audio_attr_t attr;
     936
     937  if(!this) {
     938    printerr("Passed a NULL pointer.");
     939    return 0xff;
     940  }
     941  if(!this->started) {
     942    printerr("Virtual DVD machine not started.");
     943    return 0xff;
     944  }
     945
     946  pthread_mutex_lock(&this->vm_lock);
     947  attr = vm_get_audio_attr(this->vm, stream);
     948  pthread_mutex_unlock(&this->vm_lock);
     949
     950  return attr.audio_format;
     951}
     952
     953/*
     954 * \brief get total dvd audio stream count
     955 */
     956int dvdnav_audio_get_stream_count(dvdnav_t *this) {
     957  int count = 0;
     958  if (!this) {
     959    printerr("Passed a NULL pointer.");
     960    return 0;
     961  }
     962  if(!this->started) {
     963    printerr("Virtual DVD machine not started.");
     964    return 0;
     965  }
     966
     967  pthread_mutex_lock(&this->vm_lock);
     968  count = vm_get_audio_stream_count(this->vm);
     969  pthread_mutex_unlock(&this->vm_lock);
     970
     971  return count;
     972}
     973
    930974uint16_t dvdnav_spu_stream_to_lang(dvdnav_t *this, uint8_t stream) {
    931975  subp_attr_t  attr;
    932976 
  • libs/libmythdvdnav/vm.c

     
    812812  }
    813813}
    814814
    815 #if 0
    816 /* currently unused */
    817 void vm_get_audio_info(vm_t *vm, int *current, int *num_avail) {
     815int vm_get_audio_stream_count(vm_t *vm) {
     816  int count = 0;
    818817  switch ((vm->state).domain) {
    819818  case VTS_DOMAIN:
    820     *num_avail = vm->vtsi->vtsi_mat->nr_of_vts_audio_streams;
    821     *current = (vm->state).AST_REG;
     819    count = vm->vtsi->vtsi_mat->nr_of_vts_audio_streams;
    822820    break;
    823821  case VTSM_DOMAIN:
    824     *num_avail = vm->vtsi->vtsi_mat->nr_of_vtsm_audio_streams; /*  1 */
    825     *current = 1;
     822    count = vm->vtsi->vtsi_mat->nr_of_vtsm_audio_streams; /*  1 */
    826823    break;
    827824  case VMGM_DOMAIN:
    828825  case FP_DOMAIN:
    829     *num_avail = vm->vmgi->vmgi_mat->nr_of_vmgm_audio_streams; /*  1 */
    830     *current = 1;
     826    count = vm->vmgi->vmgi_mat->nr_of_vmgm_audio_streams; /*  1 */
    831827    break;
    832828  }
     829  return count;
    833830}
    834831
     832#if 0
    835833/* currently unused */
    836834void vm_get_subp_info(vm_t *vm, int *current, int *num_avail) {
    837835  switch ((vm->state).domain) {
  • libs/libmythdvdnav/dvdnav.h

     
    573573 */
    574574unsigned char dvdnav_audio_get_channels(dvdnav_t *self, uint8_t stream);
    575575
     576unsigned char dvdnav_audio_get_format(dvdnav_t *self, uint8_t stream);
     577
     578int dvdnav_audio_get_stream_count(dvdnav_t *self);
    576579/*
    577580 * Converts a *logical* subpicture stream id into country code
    578581 * (returns 0xffff if no such stream).
  • libs/libmythdvdnav/vm.h

     
    162162int vm_get_audio_active_stream(vm_t *vm);
    163163int vm_get_subp_active_stream(vm_t *vm, int mode);
    164164void vm_get_angle_info(vm_t *vm, int *current, int *num_avail);
     165int vm_get_audio_stream_count(vm_t *vm);
    165166#if 0
    166167/* currently unused */
    167 void vm_get_audio_info(vm_t *vm, int *current, int *num_avail);
    168168void vm_get_subp_info(vm_t *vm, int *current, int *num_avail);
    169169void vm_get_video_res(vm_t *vm, int *width, int *height);
    170170#endif
  • libs/libmythtv/DVDRingBuffer.cpp

     
    341341            {
    342342                dvdnav_spu_stream_change_event_t* spu =
    343343                    (dvdnav_spu_stream_change_event_t*)(blockBuf);
     344
     345                if (autoselectsubtitle)
     346                    curSubtitleTrack = dvdnav_get_active_spu_stream(dvdnav);
     347
    344348                VERBOSE(VB_PLAYBACK,
    345349                        QString("DVDNAV_SPU_STREAM_CHANGE: "
    346350                                "physical_wide==%1, physical_letterbox==%2, "
    347                                 "physical_pan_scan==%3, logical==%4")
     351                                "physical_pan_scan==%3, current_track==%4")
    348352                        .arg(spu->physical_wide).arg(spu->physical_letterbox)
    349                         .arg(spu->physical_pan_scan).arg(spu->logical));
     353                        .arg(spu->physical_pan_scan).arg(curSubtitleTrack));
    350354
    351355                ClearMenuSPUParameters();
    352356                ClearSubtitlesOSD();
     
    359363                        buttonstreamid = spu->physical_wide + buttonstreamid;
    360364                }
    361365
    362                 if (autoselectsubtitle)
    363                     curSubtitleTrack = dvdnav_get_active_spu_stream(dvdnav);
    364 
    365366                if (parent)
    366367                {
    367368                    if (IsInMenu() && parent->GetCaptionMode())
     
    376377            break;
    377378            case DVDNAV_AUDIO_STREAM_CHANGE:
    378379            {
    379                 dvdnav_audio_stream_change_event_t* apu =
    380                     (dvdnav_audio_stream_change_event_t*)(blockBuf);
     380                if (autoselectaudio)
     381                    curAudioTrack = dvdnav_get_active_audio_stream(dvdnav);
     382
     383                audioTrackMap.clear();
     384                uint count = dvdnav_audio_get_stream_count(dvdnav);
     385                uint ac3StreamId = 128;
     386                uint mp2StreamId = 448;
     387                uint lpcmStreamId = 160;
     388                uint dtsStreamId = 136;
     389
    381390                VERBOSE(VB_PLAYBACK,
    382391                        QString("DVDNAV_AUDIO_STREAM_CHANGE: "
    383                                 "physical==%1, logical==%2")
    384                         .arg(apu->physical).arg(apu->logical));
    385                        
    386                 if (autoselectaudio)
    387                     curAudioTrack = dvdnav_get_active_audio_stream(dvdnav);
    388                
     392                        "Current Active Stream %1 Track Count %2")
     393                        .arg(curAudioTrack).arg(count));
     394
     395                for (uint i = 0; i < count; i++)
     396                {
     397                    int audio_format = dvdnav_audio_get_format(dvdnav, i);
     398                    switch (audio_format)
     399                    {
     400                        case 0:
     401                            audioTrackMap.insert(ac3StreamId, i);
     402                            ac3StreamId++;
     403                            break;
     404                        case 2:
     405                            audioTrackMap.insert(mp2StreamId, i);
     406                            mp2StreamId++;
     407                            break;
     408                        case 4:
     409                            audioTrackMap.insert(lpcmStreamId, i);
     410                            lpcmStreamId++;
     411                            break;
     412                        case 6:
     413                            audioTrackMap.insert(dtsStreamId, i);
     414                            dtsStreamId++;
     415                            break;
     416                        default:
     417                            VERBOSE(VB_PLAYBACK, LOC_ERR +
     418                                QString("AUDIO_STREAM_CHANGE: Unhandled audio format %1")
     419                                .arg(i));
     420                            break;
     421                    }
     422                }
     423               
    389424                if (blockBuf != dvdBlockWriteBuf)
    390425                {
    391426                    dvdnav_free_cache_block(dvdnav, blockBuf);
     
    10411076 */
    10421077uint DVDRingBufferPriv::GetAudioLanguage(int id)
    10431078{
    1044     int8_t channel = dvdnav_get_audio_logical_stream(dvdnav,id);
     1079    int8_t channel = dvdnav_get_audio_logical_stream(dvdnav, id);
    10451080    uint16_t lang = 0;
    10461081    if (channel != -1)
    10471082        lang = dvdnav_audio_stream_to_lang(dvdnav,channel);
    10481083    return ConvertLangCode(lang);
    10491084}
    10501085
     1086/** \brief get dvd track audio number
     1087 *  \param key position in audioTrackMap.
     1088 *  \return -1 if track number not found
     1089 */
     1090int DVDRingBufferPriv::GetAudioTrackNum(uint key)
     1091{
     1092    if (audioTrackMap.empty())
     1093        return -1;
     1094    uint count = 0;
     1095    QMapConstIterator<uint, uint> it = audioTrackMap.begin();
     1096    for (; it != audioTrackMap.end(); ++it)
     1097    {
     1098        if (count == key)
     1099            break;
     1100        ++count;
     1101    }
     1102    return (int)it.data();
     1103}
     1104
    10511105/** \brief get the subtitle language from the dvd
    10521106 */
    10531107uint DVDRingBufferPriv::GetSubtitleLanguage(int id)
  • libs/libmythtv/DVDRingBuffer.h

     
    5757    uint ButtonWidth(void)  { return hl_width; }
    5858    uint ButtonHeight(void) { return hl_height; }
    5959    uint GetAudioLanguage(int id);
    60     uint GetSubtitleLanguage(int id);
     60    int GetAudioTrackNum(uint stream_id);
     61    uint GetSubtitleLanguage(int key);
    6162    void SetMenuPktPts(long long pts) { menupktpts = pts; }
    6263    long long GetMenuPktPts(void) { return menupktpts; }
    6364    bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles,
     
    167168    uint64_t       seektime;
    168169    uint           currentTime;
    169170    QMap<uint, uint> seekSpeedMap;
     171    QMap<uint, uint> audioTrackMap;
    170172
    171173    NuppelVideoPlayer *parent;
    172174
  • libs/libmythtv/avformatdecoder.cpp

     
    15611561    {
    15621562        if (tracks[kTrackTypeAudio].size() > 1)
    15631563        {
     1564            qBubbleSort(tracks[kTrackTypeAudio]);
     1565            sinfo_vec_t::iterator it = tracks[kTrackTypeAudio].begin();
     1566            int count = 0;
     1567            for (; it != tracks[kTrackTypeAudio].end(); ++it)
     1568            {
     1569                it->dvd_track_num = ringBuffer->DVD()->GetAudioTrackNum(count);
     1570                VERBOSE(VB_PLAYBACK, LOC +
     1571                            QString("DVD Audio Track Map "
     1572                                    "Stream id #%1 track #%2 ")
     1573                            .arg(it->stream_id).arg(it->dvd_track_num));
     1574                count++;
     1575            }
     1576            qBubbleSort(tracks[kTrackTypeAudio]);
    15641577            int trackNo = ringBuffer->DVD()->GetTrack(kTrackTypeAudio);
    15651578            if (trackNo >= (int)GetTrackCount(kTrackTypeAudio))
    15661579                trackNo = GetTrackCount(kTrackTypeAudio) - 1;
     
    27302743                    RemoveAudioStreams();
    27312744                    storevideoframes = false;
    27322745                    dvdTitleChanged = false;
     2746                    ScanStreams(false);
    27332747                }
    27342748                else
    27352749                    storevideoframes = true;
  • libs/libmythtv/decoderbase.h

     
    2020    StreamInfo() :
    2121        av_stream_index(-1), av_substream_index(-1),
    2222        language(-2), language_index(0),
    23         stream_id(-1), easy_reader(false), wide_aspect_ratio(false) {}
     23        stream_id(-1), easy_reader(false),
     24        wide_aspect_ratio(false), dvd_track_num(-1) {}
    2425    StreamInfo(int a, int b, uint c, int d, bool e = false, bool f = false) :
    2526        av_stream_index(a), av_substream_index(-1),
    2627        language(b), language_index(c), stream_id(d),
    27         easy_reader(e), wide_aspect_ratio(f) {}
     28        easy_reader(e), wide_aspect_ratio(f),
     29        dvd_track_num(-1) {}
    2830    StreamInfo(int a, int b, uint c, int d, int e,
    2931               bool f = false, bool g = false) :
    3032        av_stream_index(a), av_substream_index(e),
    3133        language(b), language_index(c), stream_id(d),
    32         easy_reader(f), wide_aspect_ratio(g) {}
     34        easy_reader(f), wide_aspect_ratio(g),
     35        dvd_track_num(-1) {}
    3336
    3437  public:
    3538    int  av_stream_index;
     
    4043    int  stream_id;
    4144    bool easy_reader;
    4245    bool wide_aspect_ratio;
     46    int  dvd_track_num;
    4347
    4448    bool operator<(const StreamInfo& b) const
    45         { return (this->stream_id < b.stream_id) ; }
    46 };
     49    {
     50        if (this->dvd_track_num >= 0)
     51             return (this->dvd_track_num < b.dvd_track_num);
     52        return (this->stream_id < b.stream_id);
     53    }
     54}; 
    4755typedef vector<StreamInfo> sinfo_vec_t;
    4856
    4957class DecoderBase