Ticket #3928: 1.diff
File 1.diff, 23.1 KB (added by , 17 years ago) |
---|
-
libs/libmythtv/avformatdecoder.cpp
1171 1171 const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect); 1172 1172 const PSIPTable psip(pes); 1173 1173 const ProgramMapTable pmt(psip); 1174 1174 1175 1175 for (uint i = 0; i < pmt.StreamCount(); i++) 1176 1176 { 1177 1177 if (pmt.StreamType(i) != 6) … … 1227 1227 const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect); 1228 1228 const PSIPTable psip(pes); 1229 1229 const ProgramMapTable pmt(psip); 1230 1230 1231 1231 for (uint i = 0; i < pmt.StreamCount(); i++) 1232 1232 { 1233 1233 if (! StreamID::IsObjectCarousel(pmt.StreamType(i))) … … 1566 1566 { 1567 1567 qBubbleSort(tracks[kTrackTypeAudio]); 1568 1568 sinfo_vec_t::iterator it = tracks[kTrackTypeAudio].begin(); 1569 int count = 0;1570 1569 for (; it != tracks[kTrackTypeAudio].end(); ++it) 1571 1570 { 1572 it->dvd_track_num = ringBuffer->DVD()->GetAudioTrackNum(count); 1571 it->dvd_track_num = 1572 ringBuffer->DVD()->GetAudioTrackNum(it->stream_id); 1573 1573 VERBOSE(VB_PLAYBACK, LOC + 1574 1574 QString("DVD Audio Track Map " 1575 1575 "Stream id #%1 track #%2 ") 1576 1576 .arg(it->stream_id).arg(it->dvd_track_num)); 1577 count++;1578 1577 } 1579 1578 qBubbleSort(tracks[kTrackTypeAudio]); 1580 1579 int trackNo = ringBuffer->DVD()->GetTrack(kTrackTypeAudio); … … 1585 1584 if (tracks[kTrackTypeSubtitle].size() > 0) 1586 1585 { 1587 1586 qBubbleSort(tracks[kTrackTypeSubtitle]); 1587 sinfo_vec_t::iterator it = tracks[kTrackTypeSubtitle].begin(); 1588 for(; it != tracks[kTrackTypeSubtitle].end(); ++it) 1589 { 1590 it->dvd_track_num = 1591 ringBuffer->DVD()->GetSubTrackNum(it->stream_id); 1592 VERBOSE(VB_PLAYBACK, LOC + 1593 QString("DVD Subtitle Track Map " 1594 "Stream id #%1 track #%2 ") 1595 .arg(it->stream_id).arg(it->dvd_track_num)); 1596 } 1597 qBubbleSort(tracks[kTrackTypeSubtitle]); 1588 1598 int trackNo = ringBuffer->DVD()->GetTrack(kTrackTypeSubtitle); 1589 1599 uint captionmode = GetNVP()->GetCaptionMode(); 1590 1600 int trackcount = (int)GetTrackCount(kTrackTypeSubtitle); -
libs/libmythtv/DVDRingBuffer.cpp
71 71 SetDVDSpeed(-1); 72 72 dvdnav_close(dvdnav); 73 73 dvdnav = NULL; 74 } 74 } 75 75 } 76 76 77 77 bool DVDRingBufferPriv::IsInMenu(void) const … … 96 96 int ffrewSkip = 1; 97 97 if (parent) 98 98 ffrewSkip = parent->GetFFRewSkip(); 99 99 100 100 if (ffrewSkip != 1 && time != 0) 101 101 { 102 102 QMapConstIterator<uint, uint> it = seekSpeedMap.find(labs(time)); … … 122 122 if (time > 0 && ffrewSkip == 1) 123 123 seeking = true; 124 124 } 125 125 126 126 return currentpos; 127 127 } 128 128 129 129 void DVDRingBufferPriv::GetDescForPos(QString &desc) const 130 130 { 131 131 if (IsInMenu()) … … 170 170 safe_read(buf, DVD_BLOCK_SIZE * 5); 171 171 dvdRet = dvdnav_get_number_of_titles(dvdnav, &numTitles); 172 172 } 173 173 174 174 if ( dvdRet == DVDNAV_STATUS_ERR) 175 175 { 176 176 VERBOSE(VB_IMPORTANT, … … 189 189 .arg(curTitle).arg(titleParts)); 190 190 } 191 191 } 192 192 193 193 const char *name; 194 194 const char *serialnum; 195 195 dvdnav_current_title_info(dvdnav, &title, &part); … … 258 258 memcpy(dest + offset, blockBuf, DVD_BLOCK_SIZE); 259 259 tot += DVD_BLOCK_SIZE; 260 260 } 261 261 262 262 if (blockBuf != dvdBlockWriteBuf) 263 263 { 264 264 dvdnav_free_cache_block(dvdnav, blockBuf); 265 265 } 266 266 267 267 break; 268 268 case DVDNAV_CELL_CHANGE: 269 269 { … … 300 300 .arg(pgLength).arg(pgcLength) 301 301 .arg(cellStart).arg(pgStart) 302 302 .arg(title).arg(part).arg(titleParts)); 303 303 304 304 buttonSelected = false; 305 305 if (gotoCellStart) 306 306 { … … 336 336 memcpy(clut, blockBuf, 16 * sizeof(uint32_t)); 337 337 VERBOSE(VB_PLAYBACK, "DVDNAV_SPU_CLUT_CHANGE happened."); 338 338 } 339 break; 339 break; 340 340 case DVDNAV_SPU_STREAM_CHANGE: 341 341 { 342 342 dvdnav_spu_stream_change_event_t* spu = … … 345 345 if (autoselectsubtitle) 346 346 curSubtitleTrack = dvdnav_get_active_spu_stream(dvdnav); 347 347 348 subTrackMap.clear(); 349 uint count = dvdnav_subp_get_stream_count(dvdnav); 350 348 351 VERBOSE(VB_PLAYBACK, 349 352 QString("DVDNAV_SPU_STREAM_CHANGE: " 350 353 "physical_wide==%1, physical_letterbox==%2, " 351 "physical_pan_scan==%3, current_track==%4") 354 "physical_pan_scan==%3, current_track==%4, " 355 "total count %5") 352 356 .arg(spu->physical_wide).arg(spu->physical_letterbox) 353 .arg(spu->physical_pan_scan).arg(curSubtitleTrack)); 357 .arg(spu->physical_pan_scan).arg(curSubtitleTrack) 358 .arg(count)); 354 359 355 360 ClearMenuSPUParameters(); 356 361 ClearSubtitlesOSD(); … … 359 364 { 360 365 buttonstreamid = 32; 361 366 int aspect = dvdnav_get_video_aspect(dvdnav); 362 if (aspect != 0) 367 if (aspect != 0) 363 368 buttonstreamid = spu->physical_wide + buttonstreamid; 364 369 } 370 else 371 { 372 int8_t id = 0; 365 373 374 for (uint i = 0; i < count; i++) 375 { 376 id = dvdnav_get_spu_logical_stream(dvdnav, i); 377 if (id == -1) 378 continue; 379 id = 32 + id; 380 subTrackMap.insert(id, i); 381 } 382 } 383 366 384 if (parent) 367 385 { 368 386 if (IsInMenu() && parent->GetCaptionMode()) … … 372 390 if (blockBuf != dvdBlockWriteBuf) 373 391 { 374 392 dvdnav_free_cache_block(dvdnav, blockBuf); 375 } 393 } 376 394 } 377 395 break; 378 396 case DVDNAV_AUDIO_STREAM_CHANGE: … … 392 410 "Current Active Stream %1 Track Count %2") 393 411 .arg(curAudioTrack).arg(count)); 394 412 413 int8_t audio_format, id; 395 414 for (uint i = 0; i < count; i++) 396 415 { 397 int audio_format = dvdnav_audio_get_format(dvdnav, i); 416 audio_format = dvdnav_audio_get_format(dvdnav, i); 417 id = dvdnav_get_audio_logical_stream(dvdnav, i); 418 if (id == -1) 419 continue; 398 420 switch (audio_format) 399 421 { 400 422 case 0: 401 audioTrackMap.insert(ac3StreamId, i); 402 ac3StreamId++; 423 audioTrackMap.insert(ac3StreamId + id, i); 403 424 break; 404 425 case 2: 405 audioTrackMap.insert(mp2StreamId, i); 406 mp2StreamId++; 426 audioTrackMap.insert(mp2StreamId + id, i); 407 427 break; 408 428 case 4: 409 audioTrackMap.insert(lpcmStreamId, i); 410 lpcmStreamId++; 429 audioTrackMap.insert(lpcmStreamId + id, i); 411 430 break; 412 431 case 6: 413 audioTrackMap.insert(dtsStreamId, i); 414 dtsStreamId++; 432 audioTrackMap.insert(dtsStreamId + id, i); 415 433 break; 416 434 default: 417 435 VERBOSE(VB_PLAYBACK, LOC_ERR + 418 QString("AUDIO_STREAM_CHANGE: Unhandled audio format %1") 419 .arg(i)); 436 QString("AUDIO_STREAM_CHANGE: " 437 "Unhandled audio format %1") 438 .arg(i)); 420 439 break; 421 440 } 422 441 } 423 442 424 443 if (blockBuf != dvdBlockWriteBuf) 425 444 { 426 445 dvdnav_free_cache_block(dvdnav, blockBuf); 427 } 446 } 428 447 } 429 448 break; 430 449 case DVDNAV_NAV_PACKET: … … 468 487 break; 469 488 case DVDNAV_HOP_CHANNEL: 470 489 VERBOSE(VB_PLAYBACK, "DVDNAV_HOP_CHANNEL happened."); 471 break; 490 break; 472 491 case DVDNAV_NOP: 473 492 break; 474 493 case DVDNAV_VTS_CHANGE: … … 491 510 if (blockBuf != dvdBlockWriteBuf) 492 511 { 493 512 dvdnav_free_cache_block(dvdnav, blockBuf); 494 } 513 } 495 514 } 496 515 break; 497 516 case DVDNAV_HIGHLIGHT: … … 522 541 if (blockBuf != dvdBlockWriteBuf) 523 542 { 524 543 dvdnav_free_cache_block(dvdnav, blockBuf); 525 } 544 } 526 545 } 527 546 break; 528 547 case DVDNAV_STILL_FRAME: … … 793 812 dvdMenuButton.rects[0].y = 0; 794 813 return true; 795 814 } 796 return false; 815 return false; 797 816 } 798 817 799 818 /** \brief generate dvd subtitle bitmap or dvd menu bitmap. … … 956 975 } 957 976 } 958 977 } 959 978 960 979 int newh = h - sy; 961 980 tmp_bitmap = (uint8_t*) av_malloc(w * newh); 962 981 memcpy(tmp_bitmap, bitmap + (w * sy), (w * newh)); … … 1081 1100 */ 1082 1101 uint DVDRingBufferPriv::GetAudioLanguage(int id) 1083 1102 { 1084 int8_t channel = dvdnav_get_audio_logical_stream(dvdnav, id); 1085 uint16_t lang = 0; 1086 if (channel != -1) 1087 lang = dvdnav_audio_stream_to_lang(dvdnav,channel); 1103 uint16_t lang = dvdnav_audio_stream_to_lang(dvdnav, id); 1088 1104 return ConvertLangCode(lang); 1089 1105 } 1090 1106 1107 /** \brief get real dvd track subtitle number 1108 * \param stream_id stream_id of dvd track. 1109 * \return 33 (max track num is 31) if track number not found 1110 */ 1111 int DVDRingBufferPriv::GetSubTrackNum(uint stream_id) 1112 { 1113 if (subTrackMap.empty()) 1114 return -1; 1115 QMapConstIterator<uint, uint> it = subTrackMap.begin(); 1116 for (; it != subTrackMap.end(); ++it) 1117 { 1118 if (it.key() == stream_id) 1119 return (int)it.data(); 1120 } 1121 return 33; 1122 } 1123 1091 1124 /** \brief get real dvd track audio number 1092 * \param key position inaudioTrackMap.1093 * \return -1if track number not found1125 * \param key stream_id of dvd track audioTrackMap. 1126 * \return 10 (max track is 7) if track number not found 1094 1127 */ 1095 int DVDRingBufferPriv::GetAudioTrackNum(uint key)1128 int DVDRingBufferPriv::GetAudioTrackNum(uint stream_id) 1096 1129 { 1097 1130 if (audioTrackMap.empty()) 1098 1131 return -1; 1099 uint count = 0;1100 1132 QMapConstIterator<uint, uint> it = audioTrackMap.begin(); 1101 1133 for (; it != audioTrackMap.end(); ++it) 1102 1134 { 1103 if (count == key) 1104 break; 1105 ++count; 1135 if (it.key() == stream_id) 1136 return (int)it.data(); 1106 1137 } 1107 return (int)it.data();1138 return 10; 1108 1139 } 1109 1140 1110 1141 /** \brief get the subtitle language from the dvd 1111 1142 */ 1112 1143 uint DVDRingBufferPriv::GetSubtitleLanguage(int id) 1113 1144 { 1114 int8_t channel = dvdnav_get_spu_logical_stream(dvdnav,id); 1115 uint16_t lang = 0; 1116 if (channel != -1) 1117 lang = dvdnav_spu_stream_to_lang(dvdnav,channel); 1145 uint16_t lang = dvdnav_spu_stream_to_lang(dvdnav, id); 1118 1146 return ConvertLangCode(lang); 1119 1147 } 1120 1148 … … 1128 1156 QChar str2[2]; 1129 1157 str2[0] = QChar(code >> 8); 1130 1158 str2[1] = QChar(code & 0xff); 1131 QString str3 = iso639_str2_to_str3(QString(str2, 2));1159 QString str3 = iso639_str2_to_str3(QString(str2, 2)); 1132 1160 if (str3) 1133 1161 return iso639_str3_to_key(str3); 1134 1162 return 0; -
libs/libmythtv/DVDRingBuffer.h
57 57 uint ButtonWidth(void) { return hl_width; } 58 58 uint ButtonHeight(void) { return hl_height; } 59 59 uint GetAudioLanguage(int id); 60 int GetSubTrackNum(uint key); 60 61 int GetAudioTrackNum(uint key); 61 62 uint GetSubtitleLanguage(int key); 62 63 void SetMenuPktPts(long long pts) { menupktpts = pts; } … … 73 74 int GetCellID(void) { return cellid; } 74 75 int GetVobID(void) { return vobid; } 75 76 bool IsSameChapter(int tmpcellid, int tmpvobid); 76 77 77 78 // commands 78 79 bool OpenFile(const QString &filename); 79 80 void PlayTitleAndPart(int _title, int _part) … … 109 110 void SetParent(NuppelVideoPlayer *p) { parent = p; } 110 111 111 112 112 113 113 protected: 114 114 dvdnav_t *dvdnav; 115 115 unsigned char dvdBlockWriteBuf[DVD_BLOCK_SIZE]; … … 169 169 uint currentTime; 170 170 QMap<uint, uint> seekSpeedMap; 171 171 QMap<uint, uint> audioTrackMap; 172 QMap<uint, uint> subTrackMap; 172 173 173 174 NuppelVideoPlayer *parent; 174 175 … … 184 185 uint ConvertLangCode(uint16_t code); 185 186 void SelectDefaultButton(void); 186 187 void ClearSubtitlesOSD(void); 187 188 188 189 int get_nibble(const uint8_t *buf, int nibble_offset); 189 190 int decode_rle(uint8_t *bitmap, int linesize, int w, int h, 190 191 const uint8_t *buf, int nibble_offset, int buf_size); -
libs/libmythdvdnav/ifo_types.h
394 394 } ATTRIBUTE_PACKED user_ops_t; 395 395 396 396 /** 397 * Subpicture stream mapping for a subtitle 398 * (obtained from the mplayer project) 399 */ 400 typedef struct { 401 #ifdef WORDS_BIGENDIAN 402 unsigned int present : 1; 403 unsigned int zero1 : 2; 404 unsigned int s_4p3 : 5; /* stream for 4:3 on any display */ 405 406 unsigned int zero2 : 3; 407 unsigned int s_wide : 5; /* stream for 16:9 on widescreen display */ 408 409 unsigned int zero3 : 3; 410 unsigned int s_lbox : 5; /* stream for 16:9 on letterboxed 4:3 display */ 411 412 unsigned int zero4 : 3; 413 unsigned int s_panscan : 5; /* stream for 16:9 with pan&scan data on 4:3 display */ 414 #else 415 unsigned int s_4p3 : 5; /* stream for 4:3 on any display */ 416 unsigned int zero1 : 2; 417 unsigned int present : 1; 418 419 unsigned int s_wide : 5; /* stream for 16:9 on widescreen display */ 420 unsigned int zero2 : 3; 421 422 unsigned int s_lbox : 5; /* stream for 16:9 on letterboxed 4:3 display */ 423 unsigned int zero3 : 3; 424 425 unsigned int s_panscan : 5; /* stream for 16:9 with pan&scan data on 4:3 display */ 426 unsigned int zero4 : 3; 427 #endif 428 } ATTRIBUTE_PACKED subp_mapping_t; 429 430 /** 431 * Audio stream mapping for a soundtrack (obtained from mplayer project) 432 */ 433 typedef struct { 434 #ifdef WORDS_BIGENDIAN 435 unsigned int present : 1; 436 unsigned int zero1 : 4; 437 unsigned int s_audio : 3; 438 #else 439 unsigned int s_audio : 3; 440 unsigned int zero1 : 4; 441 unsigned int present : 1; 442 #endif 443 uint8_t zero2; 444 } ATTRIBUTE_PACKED audio_mapping_t; 445 446 /** 397 447 * Program Chain Information. 398 448 */ 399 449 typedef struct { … … 402 452 uint8_t nr_of_cells; 403 453 dvd_time_t playback_time; 404 454 user_ops_t prohibited_ops; 405 uint16_t audio_control[8]; /* New type? */406 uint32_t subp_control[32]; /* New type? */455 audio_mapping_t audio_control[8]; 456 subp_mapping_t subp_control[32]; 407 457 uint16_t next_pgc_nr; 408 458 uint16_t prev_pgc_nr; 409 459 uint16_t goup_pgc_nr; -
libs/libmythdvdnav/ifo_read.c
638 638 B2N_16(pgc->cell_playback_offset); 639 639 B2N_16(pgc->cell_position_offset); 640 640 641 for(i = 0; i < 8; i++)642 B2N_16(pgc->audio_control[i]);643 for(i = 0; i < 32; i++)644 B2N_32(pgc->subp_control[i]);645 641 for(i = 0; i < 16; i++) 646 642 B2N_32(pgc->palette[i]); 647 643 648 644 CHECK_ZERO(pgc->zero_1); 649 645 CHECK_VALUE(pgc->nr_of_programs <= pgc->nr_of_cells); 650 646 651 647 /* verify time (look at print_time) */ 652 648 for(i = 0; i < 8; i++) 653 if(!pgc->audio_control[i] & 0x8000) /* The 'is present' bit */649 if(!pgc->audio_control[i].present) 654 650 CHECK_ZERO(pgc->audio_control[i]); 655 651 for(i = 0; i < 32; i++) 656 if(!pgc->subp_control[i] & 0x80000000) /* The 'is present' bit */652 if(!pgc->subp_control[i].present) 657 653 CHECK_ZERO(pgc->subp_control[i]); 658 654 659 655 /* Check that time is 0:0:0:0 also if nr_of_programs == 0 */ -
libs/libmythdvdnav/dvdnav.c
951 951 } 952 952 953 953 /* 954 * \brief get total dvd subtitle stream count 955 */ 956 int dvdnav_subp_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_subp_stream_count(this->vm); 969 pthread_mutex_unlock(&this->vm_lock); 970 971 return count; 972 } 973 974 /* 954 975 * \brief get total dvd audio stream count 955 976 */ 956 977 int dvdnav_audio_get_stream_count(dvdnav_t *this) { -
libs/libmythdvdnav/vm.c
699 699 audioN = 0; 700 700 701 701 if(audioN < 8) { 702 /* Is there any control info for this logical stream */ 703 if((vm->state).pgc->audio_control[audioN] & (1<<15)) { 704 streamN = ((vm->state).pgc->audio_control[audioN] >> 8) & 0x07; 705 } 702 /* Is there any control info for this logical stream */ 703 if ((vm->state).pgc->audio_control[audioN].present) 704 streamN = (vm->state).pgc->audio_control[audioN].s_audio; 706 705 } 707 706 708 707 if((vm->state).domain != VTS_DOMAIN && streamN == -1) 709 708 streamN = 0; 710 709 711 710 /* FIXME: Should also check in vtsi/vmgi status what kind of stream 712 711 * it is (ac3/lpcm/dts/sdds...) to find the right (sub)stream id */ 713 712 return streamN; … … 728 727 729 728 if(subpN < 32) { /* a valid logical stream */ 730 729 /* Is this logical stream present */ 731 if((vm->state).pgc->subp_control[subpN] & (1<<31)) {730 if((vm->state).pgc->subp_control[subpN].present) { 732 731 if(source_aspect == 0) /* 4:3 */ 733 streamN = ((vm->state).pgc->subp_control[subpN] >> 24) & 0x1f;734 if(source_aspect == 3) /* 16:9 */732 streamN = (vm->state).pgc->subp_control[subpN].s_4p3; 733 if(source_aspect == 3) { /* 16:9 */ 735 734 switch (mode) { 736 case 0: 737 streamN = ((vm->state).pgc->subp_control[subpN] >> 16) & 0x1f; 738 break; 739 case 1: 740 streamN = ((vm->state).pgc->subp_control[subpN] >> 8) & 0x1f; 741 break; 742 case 2: 743 streamN = (vm->state).pgc->subp_control[subpN] & 0x1f; 744 } 735 case 0: 736 streamN = (vm->state).pgc->subp_control[subpN].s_wide; 737 break; 738 case 1: 739 streamN = (vm->state).pgc->subp_control[subpN].s_lbox; 740 break; 741 case 2: 742 streamN = (vm->state).pgc->subp_control[subpN].s_panscan; 743 break; 744 } 745 } 745 746 } 746 } 747 747 } 748 748 if((vm->state).domain != VTS_DOMAIN && streamN == -1) 749 749 streamN = 0; 750 750 … … 761 761 /* If no such stream, then select the first one that exists. */ 762 762 if(streamN == -1) { 763 763 for(audioN = 0; audioN < 8; audioN++) { 764 if((vm->state).pgc->audio_control[audioN] & (1<<15)) {764 if((vm->state).pgc->audio_control[audioN].present) { 765 765 if ((streamN = vm_get_audio_stream(vm, audioN)) >= 0) 766 766 break; 767 767 } … … 780 780 /* If no such stream, then select the first one that exists. */ 781 781 if(streamN == -1) { 782 782 for(subpN = 0; subpN < 32; subpN++) { 783 if((vm->state).pgc->subp_control[subpN] & (1<<31)) {783 if((vm->state).pgc->subp_control[subpN].present) { 784 784 if ((streamN = vm_get_subp_stream(vm, subpN, mode)) >= 0) 785 785 break; 786 786 } … … 829 829 return count; 830 830 } 831 831 832 #if 0 833 /* currently unused */ 834 void vm_get_subp_info(vm_t *vm, int *current, int *num_avail) { 832 int vm_get_subp_stream_count(vm_t *vm) { 833 int count = 0; 835 834 switch ((vm->state).domain) { 836 835 case VTS_DOMAIN: 837 *num_avail = vm->vtsi->vtsi_mat->nr_of_vts_subp_streams; 838 *current = (vm->state).SPST_REG; 836 count = vm->vtsi->vtsi_mat->nr_of_vts_subp_streams; 839 837 break; 840 838 case VTSM_DOMAIN: 841 *num_avail = vm->vtsi->vtsi_mat->nr_of_vtsm_subp_streams; /* 1 */ 842 *current = 0x41; 839 count = vm->vtsi->vtsi_mat->nr_of_vtsm_subp_streams; /* 1 */ 843 840 break; 844 841 case VMGM_DOMAIN: 845 842 case FP_DOMAIN: 846 *num_avail = vm->vmgi->vmgi_mat->nr_of_vmgm_subp_streams; /* 1 */ 847 *current = 0x41; 843 count = vm->vmgi->vmgi_mat->nr_of_vmgm_subp_streams; /* 1 */ 848 844 break; 849 845 } 846 return count; 850 847 } 851 848 852 849 /* currently unused */ … … 873 870 break; 874 871 } 875 872 } 876 #endif877 873 878 874 int vm_get_video_aspect(vm_t *vm) { 879 875 int aspect = vm_get_video_attr(vm).display_aspect_ratio; -
libs/libmythdvdnav/dvdnav.h
576 576 unsigned char dvdnav_audio_get_format(dvdnav_t *self, uint8_t stream); 577 577 578 578 int dvdnav_audio_get_stream_count(dvdnav_t *self); 579 580 int dvdnav_subp_get_stream_count(dvdnav_t *self); 579 581 /* 580 582 * Converts a *logical* subpicture stream id into country code 581 583 * (returns 0xffff if no such stream). -
libs/libmythdvdnav/vm.h
163 163 int vm_get_subp_active_stream(vm_t *vm, int mode); 164 164 void vm_get_angle_info(vm_t *vm, int *current, int *num_avail); 165 165 int vm_get_audio_stream_count(vm_t *vm); 166 int vm_get_subp_stream_count(vm_t *vm); 166 167 #if 0 167 168 /* currently unused */ 168 169 void vm_get_subp_info(vm_t *vm, int *current, int *num_avail);