Ticket #13025: 20170414_streamchange.patch

File 20170414_streamchange.patch, 5.5 KB (added by Peter Bennett, 7 years ago)

Updated patch for #13025 and #12955, with safety improvement.

  • 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) 
    6161    if (!ringBuffer->IsBD())
    6262        return;
    6363
     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
    6477    if (m_parent->AtNormalSpeed() && ringBuffer->BD()->TitleChanged())
    6578    {
    6679        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) 
    595595    if (!ringBuffer->IsDVD())
    596596        return;
    597597
     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
    598607    // Update the title length
    599608    if (m_parent->AtNormalSpeed() &&
    600609        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, 
    409409      disable_passthru(false),
    410410      m_fps(0.0f),
    411411      codec_is_mpeg(false),
    412       m_processFrames(true)
     412      m_processFrames(true),
     413      m_streams_changed(false)
    413414{
    414415    memset(&readcontext, 0, sizeof(readcontext));
    415416    memset(ccX08_in_pmt, 0, sizeof(ccX08_in_pmt));
    extern "C" void HandleStreamChange(void *data) 
    980981        QString("streams_changed 0x%1 -- stream count %2")
    981982            .arg((uint64_t)data,0,16).arg(cnt));
    982983
    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;
    1016985}
    1017986
    1018987int AvFormatDecoder::FindStreamInfo(void)
    int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, 
    12271196    }
    12281197
    12291198    ic->streams_changed = HandleStreamChange;
    1230     if (ringBuffer->IsDVD())
    1231         ic->streams_changed = HandleDVDStreamChange;
    1232     else if (ringBuffer->IsBD())
    1233         ic->streams_changed = HandleBDStreamChange;
    1234 
    12351199    ic->stream_change_data = this;
    12361200
    12371201    fmt->flags &= ~AVFMT_NOFILE;
    bool AvFormatDecoder::GetFrame(DecodeType decodetype) 
    50515015                        .arg(ff_codec_type_string(codec_type))
    50525016                        .arg(ff_codec_id_string(curstream->codec->codec_id))
    50535017                        .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;
    50545021            }
    50555022            av_packet_unref(pkt);
    50565023            continue;
    bool AvFormatDecoder::GetFrame(DecodeType decodetype) 
    51255092    return true;
    51265093}
    51275094
     5095void 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
    51285105int AvFormatDecoder::ReadPacket(AVFormatContext *ctx, AVPacket *pkt, bool &/*storePacket*/)
    51295106{
    51305107    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 
    262262    virtual void UpdateFramesPlayed(void);
    263263    virtual bool DoRewindSeek(long long desiredFrame);
    264264    virtual void DoFastForwardSeek(long long desiredFrame, bool &needflush);
    265     virtual void StreamChangeCheck(void) { }
     265    virtual void StreamChangeCheck(void);
    266266    virtual void PostProcessTracks(void) { }
    267267    virtual bool IsValidStream(int streamid) {return true;}
    268268
    class AvFormatDecoder : public DecoderBase 
    371371    float m_fps;
    372372    bool  codec_is_mpeg;
    373373    bool  m_processFrames;
     374    bool  m_streams_changed;
    374375};
    375376
    376377#endif