Ticket #2593: 2593-v1.patch

File 2593-v1.patch, 19.0 KB (added by danielk, 17 years ago)

Patch with remaining changes in branch (a patch against SVN head).

  • libs/libmythtv/libmythtv.pro

     
    402402        HEADERS += iptv/iptvchannelfetcher.h  iptv/iptvchannelinfo.h
    403403        HEADERS += iptv/iptvmediasink.h       iptv/iptvlistener.h
    404404        HEADERS += iptv/iptvfeeder.h          iptv/iptvfeederwrapper.h
    405         HEADERS += iptv/iptvfeederrtsp.h      iptv/iptvfeederlive.h
     405        HEADERS += iptv/iptvfeederrtsp.h      iptv/iptvfeederudp.h
     406        HEADERS += iptv/iptvfeederfile.h      iptv/iptvfeederlive.h
     407        HEADERS += iptv/iptvfeederrtp.h
    406408        HEADERS += iptv/urlfetcher.h          iptv/timeoutedtaskscheduler.h
    407409
    408410        SOURCES += iptvchannel.cpp            iptvrecorder.cpp
     
    410412        SOURCES += iptv/iptvchannelfetcher.cpp
    411413        SOURCES += iptv/iptvmediasink.cpp
    412414        SOURCES += iptv/iptvfeeder.cpp        iptv/iptvfeederwrapper.cpp
    413         SOURCES += iptv/iptvfeederrtsp.cpp    iptv/iptvfeederlive.cpp
     415        SOURCES += iptv/iptvfeederrtsp.cpp    iptv/iptvfeederudp.cpp
     416        SOURCES += iptv/iptvfeederfile.cpp    iptv/iptvfeederlive.cpp
     417        SOURCES += iptv/iptvfeederrtp.cpp
    414418        SOURCES += iptv/urlfetcher.cpp        iptv/timeoutedtaskscheduler.cpp
    415419
    416420        DEFINES += USING_IPTV
  • libs/libmythtv/iptv/iptvfeederwrapper.cpp

     
    88
    99#include "iptvfeeder.h"
    1010#include "iptvfeederrtsp.h"
     11#include "iptvfeederudp.h"
     12#include "iptvfeederrtp.h"
     13#include "iptvfeederfile.h"
    1114#include "mythcontext.h"
    1215
    1316#define LOC QString("IPTVFeed: ")
     
    4851    {
    4952        tmp_feeder = new IPTVFeederRTSP();
    5053    }
     54    else if (IPTVFeederUDP::IsUDP(url))
     55    {
     56        tmp_feeder = new IPTVFeederUDP();
     57    }
     58    else if (IPTVFeederRTP::IsRTP(url))
     59    {
     60        tmp_feeder = new IPTVFeederRTP();
     61    }
     62    else if (IPTVFeederFile::IsFile(url))
     63    {
     64        tmp_feeder = new IPTVFeederFile();
     65    }
    5166    else
    5267    {
    5368        VERBOSE(VB_RECORD, LOC_ERR +
  • libs/libmythtv/iptv/iptvfeederfile.h

     
     1/** -*- Mode: c++ -*-
     2 *  IPTVFeederFile
     3 *  Copyright (c) 2006 by Mike Mironov & Mickaël Remars
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#ifndef _IPTV_FEEDER_FILE_H_
     8#define _IPTV_FEEDER_FILE_H_
     9
     10// MythTV headers
     11#include "iptvfeederlive.h"
     12
     13class IPTVListener;
     14class ByteStreamFileSource;
     15class IPTVMediaSink;
     16
     17
     18class IPTVFeederFile : public IPTVFeederLive
     19{
     20  public:
     21    IPTVFeederFile();
     22    virtual ~IPTVFeederFile();
     23
     24    bool CanHandle(const QString &url) const { return IsFile(url); }
     25    bool IsOpen(void) const { return _source; }
     26
     27    bool Open(const QString &url);
     28    void Close(void);
     29
     30    void AddListener(IPTVListener*);
     31    void RemoveListener(IPTVListener*);
     32
     33    static bool IsFile(const QString &url);
     34
     35  private:
     36    IPTVFeederFile &operator=(const IPTVFeederFile&);
     37    IPTVFeederFile(const IPTVFeederFile&);
     38
     39  private:
     40    ByteStreamFileSource *_source;
     41    IPTVMediaSink        *_sink;
     42};
     43
     44#endif //_IPTV_FEEDER_FILE_H_
  • libs/libmythtv/iptv/iptvfeederudp.cpp

     
     1/** -*- Mode: c++ -*-
     2 *  IPTVFeederUdp
     3 *  Copyright (c) 2006 by Mike Mironov & Mickaël Remars
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#include "iptvfeederudp.h"
     8
     9// Qt headers
     10#include <qurl.h>
     11
     12// Live555 headers
     13#include <BasicUsageEnvironment.hh>
     14#include <Groupsock.hh>
     15#include <GroupsockHelper.hh>
     16#include <BasicUDPSource.hh>
     17#include <TunnelEncaps.hh>
     18
     19// MythTV headers
     20#include "iptvmediasink.h"
     21#include "mythcontext.h"
     22#include "tspacket.h"
     23
     24#define LOC QString("IPTVFeedUDP: ")
     25#define LOC_ERR QString("IPTVFeedUDP, Error: ")
     26
     27IPTVFeederUDP::IPTVFeederUDP() :
     28    _source(NULL),
     29    _sink(NULL)
     30{
     31    VERBOSE(VB_RECORD, LOC + "ctor -- success");
     32}
     33
     34IPTVFeederUDP::~IPTVFeederUDP()
     35{
     36    VERBOSE(VB_RECORD, LOC + "dtor -- begin");
     37    Close();
     38    VERBOSE(VB_RECORD, LOC + "dtor -- end");
     39}
     40
     41bool IPTVFeederUDP::IsUDP(const QString &url)
     42{
     43    return url.startsWith("udp://", false);
     44}
     45
     46bool IPTVFeederUDP::Open(const QString &url)
     47{
     48    VERBOSE(VB_RECORD, LOC + QString("Open(%1) -- begin").arg(url));
     49
     50    QMutexLocker locker(&_lock);
     51
     52    if (_source)
     53    {
     54        VERBOSE(VB_RECORD, LOC + "Open() -- end 1");
     55        return true;
     56    }
     57       
     58    QUrl parse(url);
     59    if (!parse.isValid() || !parse.hasHost() || !parse.hasPort())
     60    {
     61        VERBOSE(VB_RECORD, LOC + "Open() -- end 2");
     62        return false;
     63    }
     64       
     65    struct in_addr addr;
     66    addr.s_addr = our_inet_addr(parse.host().latin1());
     67
     68    // Begin by setting up our usage environment:
     69    if (!InitEnv())
     70        return false;
     71   
     72    Groupsock *socket = new Groupsock(*_live_env, addr, parse.port(), 0);
     73    if (!socket)
     74    {
     75        VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live UDP Socket.");
     76        FreeEnv();
     77        return false;
     78    }
     79    _source = BasicUDPSource::createNew(*_live_env, socket);
     80    if (!_source)
     81    {
     82        VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live UDP Source.");
     83
     84        if (socket)
     85            delete socket;
     86
     87        FreeEnv();
     88        return false;
     89    }
     90
     91    _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::SIZE * 128*1024);
     92    if (!_sink)
     93    {
     94        VERBOSE(VB_IMPORTANT,
     95                QString("IPTV # Failed to create sink: %1")
     96                .arg(_live_env->getResultMsg()));
     97
     98        Medium::close(_source);
     99        _source = NULL;
     100        if (socket)
     101            delete socket;
     102        FreeEnv();
     103
     104        return false;
     105    }
     106
     107    _sink->startPlaying(*_source, NULL, NULL);
     108    vector<IPTVListener*>::iterator it = _listeners.begin();
     109    for (; it != _listeners.end(); ++it)
     110        _sink->AddListener(*it);
     111       
     112    VERBOSE(VB_RECORD, LOC + "Open() -- end");
     113
     114    return true;
     115}
     116
     117void IPTVFeederUDP::Close(void)
     118{
     119    VERBOSE(VB_RECORD, LOC + "Close() -- begin");
     120    Stop();
     121
     122    QMutexLocker locker(&_lock);
     123
     124    if (_sink)
     125    {
     126        Medium::close(_sink);
     127        _sink = NULL;
     128    }
     129
     130    if (_source)
     131    {
     132        Groupsock *socket = _source->gs();
     133        Medium::close(_source);
     134        _source = NULL;
     135        if (socket)
     136            delete socket;
     137    }
     138
     139    FreeEnv();
     140
     141    VERBOSE(VB_RECORD, LOC + "Close() -- end");
     142}
     143
     144void IPTVFeederUDP::AddListener(IPTVListener *item)
     145{
     146    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin");
     147    if (!item)
     148    {
     149        VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
     150        return;
     151    }
     152
     153    // avoid duplicates
     154    RemoveListener(item);
     155
     156    // add to local list
     157    QMutexLocker locker(&_lock);
     158    _listeners.push_back(item);
     159   
     160    if (_sink)
     161        _sink->AddListener(item);
     162
     163    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
     164}
     165
     166void IPTVFeederUDP::RemoveListener(IPTVListener *item)
     167{
     168    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin");
     169    QMutexLocker locker(&_lock);
     170    vector<IPTVListener*>::iterator it =
     171        find(_listeners.begin(), _listeners.end(), item);
     172
     173    if (it == _listeners.end())
     174    {
     175        VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 1");
     176        return;
     177    }
     178
     179    // remove from local list..
     180    *it = *_listeners.rbegin();
     181    _listeners.resize(_listeners.size() - 1);
     182
     183    if (_sink)
     184        _sink->RemoveListener(item);
     185
     186    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 2");
     187}
  • libs/libmythtv/iptv/iptvfeederudp.h

     
     1/** -*- Mode: c++ -*-
     2 *  IPTVFeederUDP
     3 *  Copyright (c) 2006 by Mike Mironov & Mickaël Remars
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#ifndef _IPTV_FEEDER_UDP_H_
     8#define _IPTV_FEEDER_UDP_H_
     9
     10// MythTV headers
     11#include "iptvfeederlive.h"
     12
     13class BasicUDPSource;
     14class IPTVMediaSink;
     15
     16
     17class IPTVFeederUDP : public IPTVFeederLive
     18{
     19  public:
     20    IPTVFeederUDP();
     21    virtual ~IPTVFeederUDP();
     22
     23    bool CanHandle(const QString &url) const { return IsUDP(url); }
     24    bool IsOpen(void) const { return _source; }
     25
     26    bool Open(const QString &url);
     27    void Close(void);
     28
     29    void AddListener(IPTVListener*);
     30    void RemoveListener(IPTVListener*);
     31
     32    static bool IsUDP(const QString &url);
     33
     34  private:
     35    BasicUDPSource *_source;
     36    IPTVMediaSink  *_sink;
     37};
     38
     39#endif // _IPTV_FEEDER_UDP_H_
  • libs/libmythtv/iptv/iptvfeederrtp.cpp

     
     1/** -*- Mode: c++ -*-
     2 *  IPTVFeederRtp
     3 *  Copyright (c) 2006 by Mike Mironov & Mickaël Remars
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#include "iptvfeederrtp.h"
     8
     9// Qt headers
     10#include <qurl.h>
     11
     12// Live555 headers
     13#include <BasicUsageEnvironment.hh>
     14#include <Groupsock.hh>
     15#include <GroupsockHelper.hh>
     16#include <SimpleRTPSource.hh>
     17#include <TunnelEncaps.hh>
     18
     19// MythTV headers
     20#include "iptvmediasink.h"
     21#include "mythcontext.h"
     22#include "tspacket.h"
     23
     24#define LOC QString("IPTVFeedRTP: ")
     25#define LOC_ERR QString("IPTVFeedRTP, Error: ")
     26
     27IPTVFeederRTP::IPTVFeederRTP() :
     28    _source(NULL),
     29    _sink(NULL)
     30{
     31    VERBOSE(VB_RECORD, LOC + "ctor -- success");
     32}
     33
     34IPTVFeederRTP::~IPTVFeederRTP()
     35{
     36    VERBOSE(VB_RECORD, LOC + "dtor -- begin");
     37    Close();
     38    VERBOSE(VB_RECORD, LOC + "dtor -- end");
     39}
     40
     41bool IPTVFeederRTP::IsRTP(const QString &url)
     42{
     43    return url.startsWith("rtp://", false);
     44}
     45
     46bool IPTVFeederRTP::Open(const QString &url)
     47{
     48    VERBOSE(VB_RECORD, LOC + QString("Open(%1) -- begin").arg(url));
     49
     50    QMutexLocker locker(&_lock);
     51
     52    if (_source)
     53    {
     54        VERBOSE(VB_RECORD, LOC + "Open() -- end 1");
     55        return true;
     56    }
     57       
     58    QUrl parse(url);
     59    if (!parse.isValid() || !parse.hasHost() || !parse.hasPort())
     60    {
     61        VERBOSE(VB_RECORD, LOC + "Open() -- end 2");
     62        return false;
     63    }
     64       
     65    struct in_addr addr;
     66    addr.s_addr = our_inet_addr(parse.host().latin1());
     67
     68    // Begin by setting up our usage environment:
     69    if (!InitEnv())
     70        return false;
     71   
     72    Groupsock *socket = new Groupsock(*_live_env, addr, parse.port(), 0);
     73    if (!socket)
     74    {
     75        VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live RTP Socket.");
     76        FreeEnv();
     77        return false;
     78    }
     79   
     80    _source = SimpleRTPSource::createNew(*_live_env, socket, 33, 90000,
     81                                         "video/MP2T", 0, False);
     82    if (!_source)
     83    {
     84        VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live RTP Source.");
     85
     86        if (socket)
     87            delete socket;
     88
     89        FreeEnv();
     90        return false;
     91    }
     92
     93    _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::SIZE * 128*1024);
     94    if (!_sink)
     95    {
     96        VERBOSE(VB_IMPORTANT,
     97                QString("IPTV # Failed to create sink: %1")
     98                .arg(_live_env->getResultMsg()));
     99
     100        Medium::close(_source);
     101        _source = NULL;
     102        if (socket)
     103            delete socket;
     104        FreeEnv();
     105
     106        return false;
     107    }
     108
     109    _sink->startPlaying(*_source, NULL, NULL);
     110    vector<IPTVListener*>::iterator it = _listeners.begin();
     111    for (; it != _listeners.end(); ++it)
     112        _sink->AddListener(*it);
     113       
     114    VERBOSE(VB_RECORD, LOC + "Open() -- end");
     115
     116    return true;
     117}
     118
     119void IPTVFeederRTP::Close(void)
     120{
     121    VERBOSE(VB_RECORD, LOC + "Close() -- begin");
     122    Stop();
     123
     124    QMutexLocker locker(&_lock);
     125
     126    if (_sink)
     127    {
     128        Medium::close(_sink);
     129        _sink = NULL;
     130    }
     131
     132    if (_source)
     133    {
     134        Groupsock *socket = _source->RTPgs();
     135        Medium::close(_source);
     136        _source = NULL;
     137        if (socket)
     138            delete socket;
     139    }
     140
     141    FreeEnv();
     142   
     143    VERBOSE(VB_RECORD, LOC + "Close() -- end");
     144}
     145
     146void IPTVFeederRTP::AddListener(IPTVListener *item)
     147{
     148    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin");
     149    if (!item)
     150    {
     151        VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
     152        return;
     153    }
     154
     155    // avoid duplicates
     156    RemoveListener(item);
     157
     158    // add to local list
     159    QMutexLocker locker(&_lock);
     160    _listeners.push_back(item);
     161   
     162    if (_sink)
     163        _sink->AddListener(item);
     164
     165    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
     166}
     167
     168void IPTVFeederRTP::RemoveListener(IPTVListener *item)
     169{
     170    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin");
     171    QMutexLocker locker(&_lock);
     172    vector<IPTVListener*>::iterator it =
     173        find(_listeners.begin(), _listeners.end(), item);
     174
     175    if (it == _listeners.end())
     176    {
     177        VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 1");
     178        return;
     179    }
     180
     181    // remove from local list..
     182    *it = *_listeners.rbegin();
     183    _listeners.resize(_listeners.size() - 1);
     184
     185    if (_sink)
     186        _sink->RemoveListener(item);
     187
     188    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 2");
     189}
  • libs/libmythtv/iptv/iptvfeederrtp.h

     
     1/** -*- Mode: c++ -*-
     2 *  IPTVFeederRTP
     3 *  Copyright (c) 2006 by Mike Mironov & Mickaël Remars
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#ifndef _IPTV_FEEDER_RTP_H_
     8#define _IPTV_FEEDER_RTP_H_
     9
     10// MythTV headers
     11#include "iptvfeederlive.h"
     12
     13class SimpleRTPSource;
     14class IPTVMediaSink;
     15
     16
     17class IPTVFeederRTP : public IPTVFeederLive
     18{
     19  public:
     20    IPTVFeederRTP();
     21    virtual ~IPTVFeederRTP();
     22
     23    bool CanHandle(const QString &url) const { return IsRTP(url); }
     24    bool IsOpen(void) const { return _source; }
     25
     26    bool Open(const QString &url);
     27    void Close(void);
     28
     29    void AddListener(IPTVListener*);
     30    void RemoveListener(IPTVListener*);
     31
     32    static bool IsRTP(const QString &url);
     33
     34  private:
     35    IPTVFeederRTP &operator=(const IPTVFeederRTP&);
     36    IPTVFeederRTP(const IPTVFeederRTP&);
     37
     38  private:
     39    SimpleRTPSource *_source;
     40    IPTVMediaSink   *_sink;
     41};
     42
     43#endif // _IPTV_FEEDER_RTP_H_
  • libs/libmythtv/iptv/iptvfeederfile.cpp

     
     1/** -*- Mode: c++ -*-
     2 *  IPTVFeederFile
     3 *
     4 *  Please, don't submit bug reports if it
     5 *  can't read your file. Just use MythVideo!
     6 *
     7 *  Copyright (c) 2006 by Mike Mironov & Mickaël Remars
     8 *  Distributed as part of MythTV under GPL v2 and later.
     9 */
     10
     11#include "iptvfeederfile.h"
     12
     13// Qt headers
     14#include <qurl.h>
     15
     16// Live555 headers
     17#include <BasicUsageEnvironment.hh>
     18#include <Groupsock.hh>
     19#include <GroupsockHelper.hh>
     20#include <ByteStreamFileSource.hh>
     21#include <TunnelEncaps.hh>
     22
     23// MythTV headers
     24#include "iptvmediasink.h"
     25#include "mythcontext.h"
     26#include "tspacket.h"
     27
     28#define LOC QString("FbFeedFile: ")
     29#define LOC_ERR QString("FbFeedFile, Error: ")
     30
     31
     32IPTVFeederFile::IPTVFeederFile() :
     33    _source(NULL),
     34    _sink(NULL)
     35{
     36}
     37
     38IPTVFeederFile::~IPTVFeederFile()
     39{
     40    Close();
     41}
     42
     43bool IPTVFeederFile::IsFile(const QString &url)
     44{
     45    return url.startsWith("file:", false);
     46}
     47
     48bool IPTVFeederFile::Open(const QString &url)
     49{
     50    VERBOSE(VB_RECORD, LOC + QString("Open(%1) -- begin").arg(url));
     51
     52    QMutexLocker locker(&_lock);
     53
     54    if (_source)
     55    {
     56        VERBOSE(VB_RECORD, LOC + "Open() -- end 1");
     57        return true;
     58    }
     59       
     60    QUrl parse(url);
     61    if (!parse.hasPath() || !parse.isLocalFile())
     62    {
     63        VERBOSE(VB_RECORD, LOC + "Open() -- end 2");
     64        return false;
     65    }
     66       
     67    // Begin by setting up our usage environment:
     68    if (!InitEnv())
     69        return false;
     70   
     71    _source = ByteStreamFileSource::createNew(
     72        *_live_env, parse.path().local8Bit());
     73    if (!_source)
     74    {
     75        VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live File Source.");
     76        FreeEnv();
     77        return false;
     78    }
     79
     80    _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::SIZE * 128*1024);
     81    if (!_sink)
     82    {
     83        VERBOSE(VB_IMPORTANT,
     84                QString("IPTV # Failed to create sink: %1")
     85                .arg(_live_env->getResultMsg()));
     86
     87        Medium::close(_source);
     88        _source = NULL;
     89        FreeEnv();
     90
     91        return false;
     92    }
     93
     94    _sink->startPlaying(*_source, NULL, NULL);
     95    vector<IPTVListener*>::iterator it = _listeners.begin();
     96    for (; it != _listeners.end(); ++it)
     97        _sink->AddListener(*it);
     98       
     99    VERBOSE(VB_RECORD, LOC + "Open() -- end");
     100
     101    return true;
     102}
     103
     104void IPTVFeederFile::Close(void)
     105{
     106    VERBOSE(VB_RECORD, LOC + "Close() -- begin");
     107    Stop();
     108
     109    QMutexLocker locker(&_lock);
     110
     111    if (_sink)
     112    {
     113        Medium::close(_sink);
     114        _sink = NULL;
     115    }
     116
     117    if (_source)
     118    {
     119        Medium::close(_source);
     120        _source = NULL;
     121    }
     122
     123    FreeEnv();
     124
     125    VERBOSE(VB_RECORD, LOC + "Close() -- end");
     126}
     127
     128void IPTVFeederFile::AddListener(IPTVListener *item)
     129{
     130    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin");
     131    if (!item)
     132    {
     133        VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
     134        return;
     135    }
     136
     137    // avoid duplicates
     138    RemoveListener(item);
     139
     140    // add to local list
     141    QMutexLocker locker(&_lock);
     142    _listeners.push_back(item);
     143   
     144    if (_sink)
     145        _sink->AddListener(item);
     146
     147    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
     148}
     149
     150void IPTVFeederFile::RemoveListener(IPTVListener *item)
     151{
     152    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin");
     153    QMutexLocker locker(&_lock);
     154    vector<IPTVListener*>::iterator it =
     155        find(_listeners.begin(), _listeners.end(), item);
     156
     157    if (it == _listeners.end())
     158    {
     159        VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 1");
     160        return;
     161    }
     162
     163    // remove from local list..
     164    *it = *_listeners.rbegin();
     165    _listeners.resize(_listeners.size() - 1);
     166
     167    if (_sink)
     168        _sink->RemoveListener(item);
     169
     170    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 2");
     171}