Ticket #3260: audio_track_final_fix.diff

File audio_track_final_fix.diff, 12.5 KB (added by skamithi, 14 years ago)

created a qmap in DVDRingPriv that maps streamids to dvd track numbers. this map is used to ensure that the proper audio tracks are in the AFD audio table and that it is in the right order.

  • libs/libmythdvdnav/dvdnav.c

     
    927927 
    928928}
    929929
     930/*
     931 * \brief get dvd audio format for provided stream
     932 * \return 0 - AC3, 2-MP2, 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);
     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                }
    388423               
     424               
    389425                if (blockBuf != dvdBlockWriteBuf)
    390426                {
    391427                    dvdnav_free_cache_block(dvdnav, blockBuf);
     
    10411077 */
    10421078uint DVDRingBufferPriv::GetAudioLanguage(int id)
    10431079{
    1044     int8_t channel = dvdnav_get_audio_logical_stream(dvdnav,id);
     1080    int8_t channel = dvdnav_get_audio_logical_stream(dvdnav, id);
    10451081    uint16_t lang = 0;
    10461082    if (channel != -1)
    10471083        lang = dvdnav_audio_stream_to_lang(dvdnav,channel);
    10481084    return ConvertLangCode(lang);
    10491085}
    10501086
     1087/** \brief get dvd track audio number
     1088 *  \param stream_id. from ffmpeg AVStream information of audio stream
     1089 *  \return -1 if stream not found
     1090 */
     1091int DVDRingBufferPriv::GetAudioTrackNum(uint stream_id)
     1092{
     1093    if (audioTrackMap.empty())
     1094        return -1;
     1095
     1096    QMapConstIterator<uint, uint> it = audioTrackMap.find(stream_id);
     1097    if (it == audioTrackMap.end())
     1098       return -1;
     1099    return (int)it.data();
     1100}
     1101
    10511102/** \brief get the subtitle language from the dvd
    10521103 */
    10531104uint 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    int GetAudioTrackNum(uint stream_id);
    6061    uint GetSubtitleLanguage(int id);
    6162    void SetMenuPktPts(long long pts) { menupktpts = pts; }
    6263    long long GetMenuPktPts(void) { return menupktpts; }
     
    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

     
    15371537            }
    15381538            else
    15391539            {
    1540                 tracks[kTrackTypeAudio].push_back(
    1541                     StreamInfo(i, lang, lang_indx, ic->streams[i]->id));
     1540                if (ringBuffer->isDVD())
     1541                {
     1542                    int dvd_track = ringBuffer->DVD()->GetAudioTrackNum(ic->streams[i]->id);
     1543                    if (dvd_track != -1)
     1544                        tracks[kTrackTypeAudio].push_back(
     1545                            StreamInfo(i, lang, lang_indx, ic->streams[i]->id, -1, false, false, dvd_track));
     1546                    else
     1547                        VERBOSE(VB_PLAYBACK, QString(
     1548                                    "Audio Track #%1 Stream #%2 Codec #%3 not found in current dvd "
     1549                                    "audio map").arg(i).arg(ic->streams[i]->id)
     1550                                    .arg(codec_type_string(enc->codec_type)));
     1551                }
     1552                else
     1553                    tracks[kTrackTypeAudio].push_back(
     1554                        StreamInfo(i, lang, lang_indx, ic->streams[i]->id));
    15421555            }
    15431556
    15441557            VERBOSE(VB_AUDIO, LOC + QString(
     
    15611574    {
    15621575        if (tracks[kTrackTypeAudio].size() > 1)
    15631576        {
     1577            qBubbleSort(tracks[kTrackTypeAudio]);
    15641578            int trackNo = ringBuffer->DVD()->GetTrack(kTrackTypeAudio);
    15651579            if (trackNo >= (int)GetTrackCount(kTrackTypeAudio))
    15661580                trackNo = GetTrackCount(kTrackTypeAudio) - 1;
  • 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,
    29                bool f = false, bool g = false) :
     31               bool f = false, bool g = false, int h = -1) :
    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(h) {}
    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->av_stream_index < b.av_stream_index);
     53    }
     54}; 
    4755typedef vector<StreamInfo> sinfo_vec_t;
    4856
    4957class DecoderBase