xingzilong
2017-08-18 9e5babf9db52e64bdae60137be7696e56241fca6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//
//  LiveRTSPServer.cpp
//  FFmpegRTSPServer
//
//  Created by Mina Saad on 9/22/15.
//  Copyright (c) 2015 Mina Saad. All rights reserved.
//
 
#include "../logger.h"
#include "LiveRTSPServer.h"
 
namespace MESAI
{
    LiveRTSPServer::LiveRTSPServer( IEncoder * a_Encoder, int port, int httpPort )
        : env(nullptr), framedSource(nullptr),
        m_Encoder (a_Encoder), portNumber(port), httpTunnelingPort(httpPort)
    {
        quit = 0;
    }
 
    LiveRTSPServer::~LiveRTSPServer()
    {
 
    }
 
    void LiveRTSPServer::init()
    {
        TaskScheduler* scheduler = BasicTaskScheduler::createNew();
        env = BasicUsageEnvironment::createNew(*scheduler);
    }
 
    void LiveRTSPServer::run()
    {
        if (env == nullptr)
            init();
 
        char RTSP_Address[1024];
        RTSP_Address[0]=0x00;
 
        UserAuthenticationDatabase* authDB = NULL;
        
        // if (m_Enable_Pass){
        //     authDB = new UserAuthenticationDatabase;
        //     authDB->addUserRecord(UserN, PassW);
        // }
        
        OutPacketBuffer::maxSize = 2000000;
        RTSPServer* rtspServer = RTSPServer::createNew(*env, portNumber, authDB);
        
        if (rtspServer == NULL)
        {
            LOG_ERROR <<"LIVE555: Failed to create RTSP server: " << env->getResultMsg() << LOG_ENDL;
        }
        else
        {
            if(httpTunnelingPort)
            {
                rtspServer->setUpTunnelingOverHTTP(httpTunnelingPort);
            }
            
            char const* descriptionString = "MESAI Streaming Session";
            
            if (framedSource == nullptr)
                framedSource = FFmpegH264Source::createNew(*env,m_Encoder);
            StreamReplicator * inputDevice = StreamReplicator::createNew(*env, framedSource, false);
 
            ServerMediaSession* sms = ServerMediaSession::createNew(*env, RTSP_Address, RTSP_Address, descriptionString);
            sms->addSubsession(MESAI::LiveServerMediaSubsession::createNew(*env, inputDevice));
            rtspServer->addServerMediaSession(sms);
            
            char* url = rtspServer->rtspURL(sms);
            LOG_INFO << "Play this stream using the URL " << url << LOG_ENDL;
            delete [] url;
            
            //signal(SIGNIT,sighandler);
            env->taskScheduler().doEventLoop(&quit); // does not return
            
            Medium::close(rtspServer);
            Medium::close(inputDevice);
        }
        
        env->reclaim();
        //delete scheduler; // #todo
    }
}