Ticket #9722: streaming.patch

File streaming.patch, 5.4 KB (added by Jonatan <mythtv@…>, 13 years ago)
  • mythtv/libs/libmythtv/avformatdecoder.cpp

    diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
    index bedd20d..87314ea 100644
    a b int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, 
    920920
    921921    InitByteContext();
    922922
     923    if (ringBuffer->IsStream() && !ringBuffer->StartFromBeginning())
     924        return -1;
     925
    923926    int err = av_open_input_stream(&ic, ic->pb, filename, fmt, &params);
    924927    if (err < 0)
    925928    {
    int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, 
    931934    int ret = FindStreamInfo();
    932935
    933936    // Reset DVD/bluray ringbuffers
    934     if (!ringBuffer->StartFromBeginning())
     937    if (ringBuffer->IsDisc() && !ringBuffer->StartFromBeginning())
    935938        return -1;
    936939    ringBuffer->IgnoreWaitStates(false);
    937940
  • mythtv/libs/libmythtv/ringbuffer.cpp

    diff --git a/mythtv/libs/libmythtv/ringbuffer.cpp b/mythtv/libs/libmythtv/ringbuffer.cpp
    index feaf411..405a304 100644
    a b RingBuffer *RingBuffer::Create( 
    114114    bool is_dvd = false;
    115115    bool is_bd  = false;
    116116
    117     if (lfilename.startsWith("http://"))
     117    if (lfilename.startsWith("http://") ||
     118        lfilename.contains(QRegExp("^rtmp.?://")))
    118119    {
    119120        return new StreamingRingBuffer(lfilename);
    120121    }
    void RingBuffer::IgnoreLiveEOF(bool ignore) 
    14131414    rwlock.unlock();
    14141415}
    14151416
     1417const StreamingRingBuffer  *RingBuffer::Stream(void) const
     1418{
     1419    return dynamic_cast<const StreamingRingBuffer*>(this);
     1420}
     1421
    14161422const DVDRingBuffer *RingBuffer::DVD(void) const
    14171423{
    14181424    return dynamic_cast<const DVDRingBuffer*>(this);
    BDRingBuffer *RingBuffer::BD(void) 
    14331439    return dynamic_cast<BDRingBuffer*>(this);
    14341440}
    14351441
     1442StreamingRingBuffer  *RingBuffer::Stream(void)
     1443{
     1444    return dynamic_cast<StreamingRingBuffer*>(this);
     1445}
     1446
    14361447/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • mythtv/libs/libmythtv/ringbuffer.h

    diff --git a/mythtv/libs/libmythtv/ringbuffer.h b/mythtv/libs/libmythtv/ringbuffer.h
    index 69a5c0b..157b452 100644
    a b extern "C" { 
    2727class ThreadedFileWriter;
    2828class DVDRingBuffer;
    2929class BDRingBuffer;
     30class StreamingRingBuffer;
    3031class LiveTVChain;
    3132class RemoteFile;
    3233
    class MTV_PUBLIC RingBuffer : protected QThread 
    6970    bool IsDisc(void) const { return IsDVD() || IsBD(); }
    7071    bool IsDVD(void)  const { return DVD() != NULL;     }
    7172    bool IsBD(void)   const { return BD()  != NULL;     }
     73    bool IsStream(void) const { return Stream() != NULL;  }
     74    const StreamingRingBuffer *Stream(void) const;
    7275    const DVDRingBuffer *DVD(void) const;
    7376    const BDRingBuffer  *BD(void)  const;
    7477    DVDRingBuffer *DVD(void);
    7578    BDRingBuffer  *BD(void);
     79    StreamingRingBuffer *Stream(void);
    7680    virtual bool StartFromBeginning(void)                   { return true;  }
    7781    virtual void IgnoreWaitStates(bool ignore)              { }
    7882    virtual bool IsInDiscMenuOrStillFrame(void) const       { return false; }
  • mythtv/libs/libmythtv/streamingringbuffer.cpp

    diff --git a/mythtv/libs/libmythtv/streamingringbuffer.cpp b/mythtv/libs/libmythtv/streamingringbuffer.cpp
    index ac5d557..94d885c 100644
    a b bool StreamingRingBuffer::OpenFile(const QString &lfilename, uint retry_ms) 
    4444    return true;
    4545}
    4646
     47bool StreamingRingBuffer::StartFromBeginning(void)
     48{
     49    if (m_context)
     50    {
     51        url_close(m_context);
     52        m_context = NULL;
     53    }
     54
     55    return OpenFile(filename);
     56}
     57
    4758long long StreamingRingBuffer::Seek(long long pos, int whence, bool has_lock)
    4859{
     60    if (m_context)
     61    {
     62        if (url_seek(m_context, pos, whence) < 0)
     63        {
     64            ateof = true;
     65            return 0;
     66        }
     67        return pos;
     68    }
    4969    return 0;
    5070}
    5171
    5272int StreamingRingBuffer::safe_read(void *data, uint sz)
    5373{
    5474    if (m_context)
    55         return url_read(m_context, (unsigned char*)data, sz);
     75        return url_read_complete(m_context, (unsigned char*)data, sz);
    5676    return 0;
    5777}
    5878
  • mythtv/libs/libmythtv/streamingringbuffer.h

    diff --git a/mythtv/libs/libmythtv/streamingringbuffer.h b/mythtv/libs/libmythtv/streamingringbuffer.h
    index 69e3f14..48f09b2 100644
    a b class StreamingRingBuffer : public RingBuffer 
    2020    virtual long long Seek(long long pos, int whence, bool has_lock);
    2121    virtual long long GetRealFileSize(void);
    2222    virtual bool IsStreamed(void) { return true; }
     23    bool StartFromBeginning(void);
    2324
    2425  protected:
    2526    virtual int safe_read(void *data, uint sz);
  • mythtv/programs/mythfrontend/main.cpp

    diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp
    index 2d32c3b..1cdfd2b 100644
    a b static int internal_play_media(const QString &mrl, const QString &plot, 
    784784    QFile checkFile(mrl);
    785785    if ((!checkFile.exists() && !mrl.startsWith("dvd:")
    786786         && !mrl.startsWith("bd:")
    787          && !mrl.startsWith("myth:")))
     787         && !mrl.startsWith("myth:")
     788         && !mrl.startsWith("http:")
     789         && !mrl.contains(QRegExp("^rtmp.?://"))))
    788790    {
    789791        QString errorText = QObject::tr("Failed to open \n '%1' in %2 \n"
    790792                                        "Check if the video exists")