Ticket #3260: remove_audio_streams.diff
File remove_audio_streams.diff, 3.9 KB (added by , 17 years ago) |
---|
-
libs/libmythtv/avformatdecoder.h
189 189 190 190 bool SetupAudioStream(void); 191 191 void SetupAudioStreamSubIndexes(int streamIndex); 192 void RemoveAudioStreams(); 192 193 193 194 /// Update our position map, keyframe distance, and the like. 194 195 /// Called for key frame packets. … … 258 259 bool dvdvideopause; 259 260 bool dvd_xvmc_enabled; 260 261 bool dvd_video_codec_changed; 262 bool dvdTitleChanged; 261 263 262 264 }; 263 265 -
libs/libmythtv/avformatdecoder.cpp
296 296 // DVD 297 297 lastdvdtitle(-1), lastcellstart(0), 298 298 dvdmenupktseen(false), dvdvideopause(false), 299 dvd_xvmc_enabled(false), dvd_video_codec_changed(false) 299 dvd_xvmc_enabled(false), dvd_video_codec_changed(false), 300 dvdTitleChanged(false) 300 301 { 301 302 bzero(¶ms, sizeof(AVFormatParameters)); 302 303 bzero(audioSamples, AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof(short int)); … … 1684 1685 return 1; 1685 1686 } 1686 1687 1688 /** \brief remove audio streams from the context 1689 * used by dvd code during title transitions to remove 1690 * stale audio streams 1691 */ 1692 void AvFormatDecoder::RemoveAudioStreams() 1693 { 1694 QMutexLocker locker(&avcodeclock); 1695 for (uint i = 0; i < ic->nb_streams;) 1696 { 1697 AVStream *st = ic->streams[i]; 1698 if (st->codec->codec_type == CODEC_TYPE_AUDIO) 1699 { 1700 av_remove_stream(ic, st->id, 0); 1701 i--; 1702 } 1703 else 1704 i++; 1705 } 1706 av_read_frame_flush(ic); 1707 } 1708 1687 1709 void release_avf_buffer(struct AVCodecContext *c, AVFrame *pic) 1688 1710 { 1689 1711 (void)c; … … 2692 2714 ringBuffer->DVD()->GetPartAndTitle(dvdpart, dvdtitle); 2693 2715 uint cellstart = ringBuffer->DVD()->GetCellStart(); 2694 2716 selectedVideoIndex = 0; 2717 if (dvdTitleChanged) 2718 { 2719 if ((storedPackets.count() > 10 && !dvdvideopause) || 2720 dvdvideopause) 2721 { 2722 RemoveAudioStreams(); 2723 storevideoframes = false; 2724 dvdTitleChanged = false; 2725 } 2726 else 2727 storevideoframes = true; 2728 } 2729 else 2730 { 2731 if (storedPackets.count() < 2 && !dvdvideopause) 2732 storevideoframes = true; 2733 else 2734 storevideoframes = false; 2735 } 2736 2695 2737 if (GetNVP()->AtNormalSpeed() && 2696 2738 ((lastcellstart != cellstart) || (lastdvdtitle != dvdtitle))) 2697 2739 { … … 2703 2745 VERBOSE(VB_PLAYBACK, LOC + "DVD Title Changed"); 2704 2746 ScanStreams(true); 2705 2747 lastdvdtitle = dvdtitle; 2748 if (lastdvdtitle != -1 ) 2749 dvdTitleChanged = true; 2706 2750 if (GetNVP() && GetNVP()->getVideoOutput()) 2707 2751 { 2708 2752 if (ringBuffer->InDVDMenuOrStillFrame()) … … 2717 2761 .arg(framesPlayed)); 2718 2762 lastcellstart = cellstart; 2719 2763 } 2720 2721 if (storedPackets.count() < 2 && !dvdvideopause)2722 storevideoframes = true;2723 else2724 storevideoframes = false;2725 2764 } 2726 2765 2727 2766 if (gotvideo) … … 3270 3309 gotvideo = 1; 3271 3310 framesPlayed++; 3272 3311 3273 if (dvdmenupktseen )3312 if (dvdmenupktseen && !dvdTitleChanged) 3274 3313 { 3275 3314 ringBuffer->DVD()->SetMenuPktPts(pts); 3276 3315 dvdmenupktseen = false;