Ticket #6906: livetv_http_stream.patch

File livetv_http_stream.patch, 11.4 KB (added by buehlmann@…, 10 years ago)
  • libs/libmythtv/livetvchain.h

     
    8181    bool IsHostSocket(const MythSocket *sock) const;
    8282    uint HostSocketCount(void) const;
    8383    void DelHostSocket(MythSocket *sock);
     84   
     85    void SetRecordingProfile(QString profile) { recordingProfile = profile; };
     86    QString GetRecordingProfile() { return recordingProfile; };
    8487 
    8588  private:
    8689    void BroadcastUpdate();
     
    106109
    107110    mutable QMutex m_sockLock;
    108111    QList<MythSocket*> m_inUseSocks;
     112   
     113    QString recordingProfile;
    109114};
    110115
    111116#endif
  • libs/libmythtv/tv_rec.cpp

     
    39543954    QString profileName = "Live TV";
    39553955    if (!tvchain && rec)
    39563956        profileName = rec->GetScheduledRecording()->getProfileName();
     3957    else if ((tvchain!=NULL) && (((LiveTVChain*)tvchain)->GetRecordingProfile()!=NULL)) {
     3958        profileName = ((LiveTVChain*)tvchain)->GetRecordingProfile();
     3959    }
    39573960
    39583961    if (!profile.loadByType(profileName, cardtype))
    39593962    {
  • programs/mythbackend/httplivetv.cpp

     
     1//////////////////////////////////////////////////////////////////////////////
     2// Program Name: httplivetv.cpp
     3//
     4// Purpose - Html & XML status HttpExtension
     5//
     6// Created By  : Rene Buehlmann                 Created On : Aug. 23, 2009
     7// Modified By :                                Modified On:
     8//
     9//////////////////////////////////////////////////////////////////////////////
     10
     11// POSIX headers
     12#include <unistd.h>
     13
     14// ANSI C headers
     15#include <cmath>
     16#include <cstdio>
     17#include <cstdlib>
     18
     19// Qt headers
     20#include <QTextStream>
     21#include <QRegExp>
     22#include <QLocale>
     23
     24// MythTV headers
     25#include "httplivetv.h"
     26#include "backendutil.h"
     27#include "mythxml.h"
     28
     29#include "mythcontext.h"
     30#include "decodeencode.h"
     31#include "mythdbcon.h"
     32#include "compat.h"
     33#include "mythconfig.h"
     34
     35#define STREAM_BLOCK_SIZE 10000 //in bytes
     36
     37/////////////////////////////////////////////////////////////////////////////
     38//
     39/////////////////////////////////////////////////////////////////////////////
     40
     41HttpLiveTV::HttpLiveTV( QMap<int, EncoderLink *> *tvList, Scheduler *sched, AutoExpire *expirer, bool bIsMaster )
     42          : HttpServerExtension( "HttpLiveTV" , QString::null)
     43{
     44    m_pEncoders = tvList;
     45    m_pSched    = sched;
     46    m_pExpirer  = expirer;
     47    m_bIsMaster = bIsMaster;
     48
     49    m_nPreRollSeconds = gContext->GetNumSetting("RecordPreRoll", 0);
     50}
     51
     52/////////////////////////////////////////////////////////////////////////////
     53//
     54/////////////////////////////////////////////////////////////////////////////
     55
     56HttpLiveTV::~HttpLiveTV()
     57{
     58}
     59
     60/////////////////////////////////////////////////////////////////////////////
     61//
     62/////////////////////////////////////////////////////////////////////////////
     63
     64bool HttpLiveTV::ProcessRequest( HttpWorkerThread * /* pThread */, HTTPRequest *pRequest )
     65{
     66    try
     67    {
     68        if (pRequest)
     69        {
     70            if (pRequest->m_sBaseUrl != "/livetv")
     71                return( false );
     72           
     73            VERBOSE(VB_IMPORTANT, "HttpLiveTV: Requested channel:" + pRequest->m_sMethod);
     74            pRequest->m_eResponseType   = ResponseTypeNone;
     75
     76            QString rHeader = QString( "HTTP/%1.%2 %3\r\n"
     77                       "Date: %4\r\n"
     78                       "Server: %5, UPnP/1.0, MythTV %6\r\n"
     79                       "Content-type: video/mpeg\r\n\r\n" )
     80                 .arg( pRequest->m_nMajor )
     81                 .arg( pRequest->m_nMinor )
     82                 .arg( QString("200 OK") )
     83                 .arg( QDateTime::currentDateTime().toString( "d MMM yyyy hh:mm:ss" ) )
     84                 .arg( HttpServer::g_sPlatform )
     85                 .arg( MYTH_BINARY_VERSION );
     86
     87
     88            QByteArray sHeader = rHeader.toUtf8();
     89            pRequest->WriteBlockDirect( sHeader.constData(), sHeader.length() );
     90
     91            QMap<int, EncoderLink *>::Iterator iter = m_pEncoders->find(1);
     92            if (iter == m_pEncoders->end())
     93            {
     94                VERBOSE(VB_IMPORTANT, "HttpLiveTV: " + QString("Unknown encoder: %1").arg(1));
     95                        return false;
     96            }
     97                                                                       
     98           
     99            EncoderLink *enc = *iter;
     100            LiveTVChain *chain =  new LiveTVChain();
     101            chain->SetRecordingProfile(QString("Stream TV"));
     102            enc->SpawnLiveTV(chain, false, pRequest->m_sMethod);
     103            int i = 0;
     104            bool finish=false;
     105           
     106            while (!finish) {
     107                VERBOSE(VB_IMPORTANT, "HttpLiveTV: Getting recording...");
     108                ProgramInfo *pi = enc->GetRecording();
     109                while (pi==NULL && i < 10) {
     110                    VERBOSE(VB_IMPORTANT, "HttpLiveTV: Waiting for recording...");
     111                    sleep(1);
     112                    pi = enc->GetRecording();
     113                }
     114                   
     115                if (pi==NULL) {
     116                    VERBOSE(VB_IMPORTANT, "HttpLiveTV: No recording");
     117                    enc->StopLiveTV();
     118                    return true;
     119                }
     120                VERBOSE(VB_IMPORTANT, "HttpLiveTV: Got recording: "+pi->GetPlaybackURL());
     121                QByteArray   bytes  = pi->GetPlaybackURL().toAscii();
     122
     123                const char * file = bytes.data();
     124                FILE *f = fopen(file,"r");
     125                char buf[STREAM_BLOCK_SIZE];
     126                int len=100;
     127                int zerocount=0;
     128                while (zerocount < 3 && !finish) {
     129                if (len==0) {
     130                    sleep(1);
     131                    zerocount++;
     132                }
     133                else {
     134                    zerocount=0;
     135                }
     136                len = fread((char *)&buf, 1, STREAM_BLOCK_SIZE, f);
     137                int sent = pRequest->WriteBlockDirect(buf,len);
     138                if (sent != len) {
     139                   VERBOSE(VB_IMPORTANT, "HttpLiveTV: Probalby the client disconnected... Exiting...");
     140                   finish=true;
     141                }
     142             }
     143             VERBOSE(VB_IMPORTANT, "HttpLiveTV: End of Stream.");
     144             fclose(f);
     145          }
     146          VERBOSE(VB_IMPORTANT, "HttpLiveTV: Exiting StreamTV.");
     147          enc->StopLiveTV();
     148          return true;
     149        }
     150    }
     151    catch( ... )
     152    {
     153        cerr << "HttpLiveTV::ProcessRequest() - Unexpected Exception" << endl;
     154    }
     155
     156    return( false );
     157}
     158
     159// vim:set shiftwidth=4 tabstop=4 expandtab:
  • programs/mythbackend/main.cpp

     
    4949
    5050#include "mediaserver.h"
    5151#include "httpstatus.h"
     52#include "httplivetv.h"
    5253
    5354#define LOC      QString("MythBackend: ")
    5455#define LOC_WARN QString("MythBackend, Warning: ")
     
    11021103
    11031104        pHS->RegisterExtension( new HttpStatus( &tvList, sched,
    11041105                                                expirer, ismaster ));
     1106       
     1107        pHS->RegisterExtension( new HttpLiveTV( &tvList, sched,
     1108                                                expirer, ismaster ));
    11051109    }
    11061110
    11071111    VERBOSE(VB_IMPORTANT, QString("Enabled verbose msgs: %1").arg(verboseString));
  • programs/mythbackend/mythbackend.pro

     
    1818QMAKE_CLEAN += $(TARGET)
    1919
    2020# Input
    21 HEADERS += autoexpire.h encoderlink.h filetransfer.h httpstatus.h mainserver.h
     21HEADERS += autoexpire.h encoderlink.h filetransfer.h httpstatus.h mainserver.h httplivetv.h
    2222HEADERS += playbacksock.h scheduler.h server.h housekeeper.h backendutil.h
    2323HEADERS += upnpcdstv.h upnpcdsmusic.h upnpcdsvideo.h mediaserver.h
    2424HEADERS += mythxml.h upnpmedia.h
    2525
    26 SOURCES += autoexpire.cpp encoderlink.cpp filetransfer.cpp httpstatus.cpp
     26SOURCES += autoexpire.cpp encoderlink.cpp filetransfer.cpp httpstatus.cpp httplivetv.cpp
    2727SOURCES += main.cpp mainserver.cpp playbacksock.cpp scheduler.cpp server.cpp
    2828SOURCES += housekeeper.cpp backendutil.cpp
    2929SOURCES += upnpcdstv.cpp upnpcdsmusic.cpp upnpcdsvideo.cpp mediaserver.cpp
  • programs/mythbackend/httplivetv.h

     
     1//////////////////////////////////////////////////////////////////////////////
     2// Program Name: httplivetv.h
     3//                                                                           
     4// Purpose - Html & XML status HttpServerExtension
     5//                                                                           
     6// Created By  : Rene Buehlmann                 Created On : Aug. 23, 2009
     7// Modified By :                                Modified On:                 
     8//                                                                           
     9//////////////////////////////////////////////////////////////////////////////
     10
     11#ifndef HTTPLIVETV_H_
     12#define HTTPLIVETV_H_
     13
     14#include <qdom.h>
     15#include <qdatetime.h>
     16
     17#include "httpserver.h"
     18#include "mainserver.h"
     19#include "autoexpire.h"
     20#include "mythcontext.h"
     21#include "jobqueue.h"
     22#include "programinfo.h"
     23
     24
     25/////////////////////////////////////////////////////////////////////////////
     26/////////////////////////////////////////////////////////////////////////////
     27//
     28//
     29//
     30/////////////////////////////////////////////////////////////////////////////
     31/////////////////////////////////////////////////////////////////////////////
     32
     33class HttpLiveTV : public HttpServerExtension
     34{
     35    private:
     36
     37        Scheduler                   *m_pSched;
     38        QMap<int, EncoderLink *>    *m_pEncoders;
     39        AutoExpire                  *m_pExpirer;
     40        bool                         m_bIsMaster;
     41        int                          m_nPreRollSeconds;
     42        QMutex                       m_settingLock;
     43
     44    private:
     45
     46        //HttpLiveTVMethod GetMethod( const QString &sURI );
     47
     48        void    GetStatusXML      ( HTTPRequest *pRequest );
     49        void    GetStatusHTML     ( HTTPRequest *pRequest );
     50
     51        void    FillStatusXML     ( QDomDocument *pDoc);
     52   
     53        void    PrintStatus       ( QTextStream &os, QDomDocument *pDoc );
     54        int     PrintEncoderStatus( QTextStream &os, QDomElement encoders );
     55        int     PrintScheduled    ( QTextStream &os, QDomElement scheduled );
     56        int     PrintJobQueue     ( QTextStream &os, QDomElement jobs );
     57        int     PrintMachineInfo  ( QTextStream &os, QDomElement info );
     58        int     PrintMiscellaneousInfo ( QTextStream &os, QDomElement info );
     59
     60    public:
     61                 HttpLiveTV( QMap<int, EncoderLink *> *tvList, Scheduler *sched, AutoExpire *expirer, bool bIsMaster );
     62        virtual ~HttpLiveTV();
     63
     64        bool     ProcessRequest( HttpWorkerThread *pThread, HTTPRequest *pRequest );
     65};
     66
     67#endif