Ticket #13025: 20170414_streamchange.patch
File 20170414_streamchange.patch, 5.5 KB (added by , 7 years ago) |
---|
-
mythtv/libs/libmythtv/Bluray/avformatdecoderbd.cpp
diff --git a/mythtv/libs/libmythtv/Bluray/avformatdecoderbd.cpp b/mythtv/libs/libmythtv/Bluray/avformatdecoderbd.cpp index 7d80df7..91eb4a9 100644
a b void AvFormatDecoderBD::StreamChangeCheck(void) 61 61 if (!ringBuffer->IsBD()) 62 62 return; 63 63 64 if (m_streams_changed) 65 { 66 // This was originally in HandleBDStreamChange 67 LOG(VB_PLAYBACK, LOG_INFO, LOC + "resetting"); 68 QMutexLocker locker(avcodeclock); 69 Reset(true, false, false); 70 CloseCodecs(); 71 FindStreamInfo(); 72 ScanStreams(false); 73 avcodeclock->unlock(); 74 m_streams_changed=false; 75 } 76 64 77 if (m_parent->AtNormalSpeed() && ringBuffer->BD()->TitleChanged()) 65 78 { 66 79 ResetPosMap(); -
mythtv/libs/libmythtv/DVD/avformatdecoderdvd.cpp
diff --git a/mythtv/libs/libmythtv/DVD/avformatdecoderdvd.cpp b/mythtv/libs/libmythtv/DVD/avformatdecoderdvd.cpp index 4f00c4c..b9119b2 100644
a b void AvFormatDecoderDVD::StreamChangeCheck(void) 595 595 if (!ringBuffer->IsDVD()) 596 596 return; 597 597 598 if (m_streams_changed) 599 { 600 // This was originally in HandleDVDStreamChange 601 QMutexLocker locker(avcodeclock); 602 ScanStreams(true); 603 avcodeclock->unlock(); 604 m_streams_changed=false; 605 } 606 598 607 // Update the title length 599 608 if (m_parent->AtNormalSpeed() && 600 609 ringBuffer->DVD()->PGCLengthChanged()) -
mythtv/libs/libmythtv/avformatdecoder.cpp
diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp index 689f25b..1455df6 100644
a b AvFormatDecoder::AvFormatDecoder(MythPlayer *parent, 409 409 disable_passthru(false), 410 410 m_fps(0.0f), 411 411 codec_is_mpeg(false), 412 m_processFrames(true) 412 m_processFrames(true), 413 m_streams_changed(false) 413 414 { 414 415 memset(&readcontext, 0, sizeof(readcontext)); 415 416 memset(ccX08_in_pmt, 0, sizeof(ccX08_in_pmt)); … … extern "C" void HandleStreamChange(void *data) 980 981 QString("streams_changed 0x%1 -- stream count %2") 981 982 .arg((uint64_t)data,0,16).arg(cnt)); 982 983 983 decoder->SeekReset(0, 0, true, true); 984 QMutexLocker locker(avcodeclock); 985 decoder->ScanStreams(false); 986 } 987 988 extern "C" void HandleDVDStreamChange(void *data) 989 { 990 AvFormatDecoder *decoder = 991 reinterpret_cast<AvFormatDecoder*>(data); 992 993 int cnt = decoder->ic->nb_streams; 994 995 LOG(VB_PLAYBACK, LOG_INFO, LOC + 996 QString("streams_changed 0x%1 -- stream count %2") 997 .arg((uint64_t)data,0,16).arg(cnt)); 998 999 //decoder->SeekReset(0, 0, true, true); 1000 QMutexLocker locker(avcodeclock); 1001 decoder->ScanStreams(true); 1002 } 1003 1004 extern "C" void HandleBDStreamChange(void *data) 1005 { 1006 AvFormatDecoder *decoder = 1007 reinterpret_cast<AvFormatDecoder*>(data); 1008 1009 LOG(VB_PLAYBACK, LOG_INFO, LOC + "resetting"); 1010 1011 QMutexLocker locker(avcodeclock); 1012 decoder->Reset(true, false, false); 1013 decoder->CloseCodecs(); 1014 decoder->FindStreamInfo(); 1015 decoder->ScanStreams(false); 984 decoder->m_streams_changed = true; 1016 985 } 1017 986 1018 987 int AvFormatDecoder::FindStreamInfo(void) … … int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, 1227 1196 } 1228 1197 1229 1198 ic->streams_changed = HandleStreamChange; 1230 if (ringBuffer->IsDVD())1231 ic->streams_changed = HandleDVDStreamChange;1232 else if (ringBuffer->IsBD())1233 ic->streams_changed = HandleBDStreamChange;1234 1235 1199 ic->stream_change_data = this; 1236 1200 1237 1201 fmt->flags &= ~AVFMT_NOFILE; … … bool AvFormatDecoder::GetFrame(DecodeType decodetype) 5051 5015 .arg(ff_codec_type_string(codec_type)) 5052 5016 .arg(ff_codec_id_string(curstream->codec->codec_id)) 5053 5017 .arg(curstream->codec->codec_id)); 5018 // Process Stream Change in case we have no audio 5019 if (codec_type == AVMEDIA_TYPE_AUDIO && !m_audio->HasAudioIn()) 5020 m_streams_changed = true; 5054 5021 } 5055 5022 av_packet_unref(pkt); 5056 5023 continue; … … bool AvFormatDecoder::GetFrame(DecodeType decodetype) 5125 5092 return true; 5126 5093 } 5127 5094 5095 void AvFormatDecoder::StreamChangeCheck() { 5096 if (m_streams_changed) 5097 { 5098 SeekReset(0, 0, true, true); 5099 QMutexLocker locker(avcodeclock); 5100 ScanStreams(false); 5101 m_streams_changed=false; 5102 } 5103 } 5104 5128 5105 int AvFormatDecoder::ReadPacket(AVFormatContext *ctx, AVPacket *pkt, bool &/*storePacket*/) 5129 5106 { 5130 5107 QMutexLocker locker(avcodeclock); -
mythtv/libs/libmythtv/avformatdecoder.h
diff --git a/mythtv/libs/libmythtv/avformatdecoder.h b/mythtv/libs/libmythtv/avformatdecoder.h index ae3df77..9a062c9 100644
a b class AvFormatDecoder : public DecoderBase 262 262 virtual void UpdateFramesPlayed(void); 263 263 virtual bool DoRewindSeek(long long desiredFrame); 264 264 virtual void DoFastForwardSeek(long long desiredFrame, bool &needflush); 265 virtual void StreamChangeCheck(void) { }265 virtual void StreamChangeCheck(void); 266 266 virtual void PostProcessTracks(void) { } 267 267 virtual bool IsValidStream(int streamid) {return true;} 268 268 … … class AvFormatDecoder : public DecoderBase 371 371 float m_fps; 372 372 bool codec_is_mpeg; 373 373 bool m_processFrames; 374 bool m_streams_changed; 374 375 }; 375 376 376 377 #endif