[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] /srv/bzr/gnash/rtmp r9984: get the relationship beteen st
From: |
rob |
Subject: |
[Gnash-commit] /srv/bzr/gnash/rtmp r9984: get the relationship beteen streamid and clientids correct. |
Date: |
Fri, 13 Feb 2009 16:45:08 -0700 |
User-agent: |
Bazaar (1.5) |
------------------------------------------------------------
revno: 9984
committer: address@hidden
branch nick: rtmp
timestamp: Fri 2009-02-13 16:45:08 -0700
message:
get the relationship beteen streamid and clientids correct.
create new stream ids correctly.
clean up creating a new stream.
modified:
cygnal/rtmp_server.cpp
cygnal/rtmp_server.h
=== modified file 'cygnal/rtmp_server.cpp'
--- a/cygnal/rtmp_server.cpp 2009-02-10 19:24:33 +0000
+++ b/cygnal/rtmp_server.cpp 2009-02-13 23:45:08 +0000
@@ -46,6 +46,7 @@
#include "GnashSleep.h"
#include "crc.h"
#include "cache.h"
+#include "diskstream.h"
using namespace gnash;
using namespace std;
@@ -63,7 +64,8 @@
extern map<int, Handler *> handlers;
RTMPServer::RTMPServer()
- : _filesize(0)
+ : _filesize(0),
+ _streamid(1)
{
// GNASH_REPORT_FUNCTION;
// _inbytes = 0;
@@ -369,18 +371,34 @@
RTMPServer::encodeResult(RTMPMsg::rtmp_status_e status)
{
// GNASH_REPORT_FUNCTION;
- return encodeResult(status, _filespec, 0.0);
+ return encodeResult(status, _filespec, _streamid);
}
boost::shared_ptr<amf::Buffer>
RTMPServer::encodeResult(gnash::RTMPMsg::rtmp_status_e status, const
std::string &filename)
{
// GNASH_REPORT_FUNCTION;
- return encodeResult(status, filename, 0.0);
-}
-
-boost::shared_ptr<amf::Buffer>
-RTMPServer::encodeResult(gnash::RTMPMsg::rtmp_status_e status, const
std::string &filename, double clientid)
+ double clientid = 0.0;
+ return encodeResult(status, filename, _streamid, clientid);
+}
+
+boost::shared_ptr<amf::Buffer>
+RTMPServer::encodeResult(gnash::RTMPMsg::rtmp_status_e status, const
std::string &filename, double &clientid)
+{
+// GNASH_REPORT_FUNCTION;
+ return encodeResult(status, filename, _streamid, clientid);
+}
+
+boost::shared_ptr<amf::Buffer>
+RTMPServer::encodeResult(gnash::RTMPMsg::rtmp_status_e status, double
&streamid)
+{
+// GNASH_REPORT_FUNCTION;
+ double clientid = 0.0;
+ return encodeResult(status, "", streamid, clientid);
+}
+
+boost::shared_ptr<amf::Buffer>
+RTMPServer::encodeResult(gnash::RTMPMsg::rtmp_status_e status, const
std::string &filename, double &streamid, double &clientid)
{
// GNASH_REPORT_FUNCTION;
// Buffer *buf = new Buffer;
@@ -398,7 +416,7 @@
Element *number = new Element;
// add The server ID
- number->makeNumber(1); // FIXME: needs a real value, which should
increment
+ number->makeNumber(streamid); // FIXME: needs a real value, which
should increment
Element top;
// top.makeObject("application");
@@ -495,11 +513,11 @@
top.addProperty(code);
boost::shared_ptr<amf::Element> description(new Element);
- string field = "Started playing ";
+ string field = "Playing and resetting ";
if (!filename.empty()) {
- field + filename;
+ field += filename;
}
- description->makeString("description", "Started playing");
+ description->makeString("description", field);
top.addProperty(description);
boost::shared_ptr<amf::Element> details(new Element);
@@ -507,7 +525,7 @@
top.addProperty(details);
boost::shared_ptr<amf::Element> cid(new Element);
- code->makeNumber("clientid", clientid);
+ cid->makeNumber("clientid", clientid);
top.addProperty(cid);
break;
@@ -515,7 +533,7 @@
case RTMPMsg::NS_PLAY_START:
{
str->makeString("onStatus");
-// "clientid"
+
boost::shared_ptr<amf::Element> level(new Element);
level->makeString("level", "status");
top.addProperty(level);
@@ -527,17 +545,17 @@
boost::shared_ptr<amf::Element> description(new Element);
string field = "Started playing ";
if (!filename.empty()) {
- field + filename;
+ field += filename;
}
- description->makeString("description", "Started playing");
+ description->makeString("description", field);
top.addProperty(description);
boost::shared_ptr<amf::Element> details(new Element);
details->makeString("details", filename);
top.addProperty(details);
-
+
boost::shared_ptr<amf::Element> cid(new Element);
- code->makeNumber("clientid", clientid);
+ cid->makeNumber("clientid", clientid);
top.addProperty(cid);
break;
@@ -567,13 +585,9 @@
// Don't encode as an object, just the properties
notobject = true;
-// boost::shared_ptr<amf::Element> id1(new Element);
-// id1->makeNumber(2);
-// top.addProperty(id1);
- number->makeNumber(2); // FIXME: needs a real value, which
should increment
-
boost::shared_ptr<amf::Element> id2(new Element);
- id2->makeNumber(1);
+ double sid = createStreamID();
+ id2->makeNumber(sid);
top.addProperty(id2);
break;
@@ -773,6 +787,7 @@
return buf;
}
+// Create a new client ID, which appears to be a random double.
double
RTMPServer::createClientID()
{
@@ -782,12 +797,89 @@
boost::uniform_real<> numbers(1, 65535);
double id = numbers(seed);
-
_clientids.push_back(id);
return id;
}
+
+// Get the next streamID
+double
+RTMPServer::createStreamID()
+{
+// GNASH_REPORT_FUNCTION;
+ return _streamid++;
+}
+
+bool
+RTMPServer::sendFile(int fd, const std::string &filespec)
+{
+ GNASH_REPORT_FUNCTION;
+ // See if the file is in the cache and already opened.
+ boost::shared_ptr<DiskStream> filestream(cache.findFile(filespec));
+ if (filestream) {
+ cerr << "FIXME: found file in cache!" << endl;
+ } else {
+ filestream.reset(new DiskStream);
+// cerr << "New Filestream at 0x" << hex << filestream.get() << endl;
+
+// cache.addFile(url, filestream); FIXME: always reload from disk
for now.
+
+ // Oopen the file and read the first chunk into memory
+ if (filestream->open(filespec)) {
+ return false;
+ } else {
+ // Get the file size for the HTTP header
+ if (filestream->getFileType() == DiskStream::FILETYPE_NONE) {
+ return false;
+ } else {
+ cache.addPath(filespec, filestream->getFilespec());
+ }
+ }
+ }
+ size_t filesize = filestream->getFileSize();
+ size_t bytes_read = 0;
+ int ret;
+ size_t page = 0;
+ if (filesize) {
+#ifdef USE_STATS_CACHE
+ struct timespec start;
+ clock_gettime (CLOCK_REALTIME, &start);
+#endif
+ size_t getbytes = 0;
+ if (filesize <= filestream->getPagesize()) {
+ getbytes = filesize;
+ } else {
+ getbytes = filestream->getPagesize();
+ }
+ if (filesize >= CACHE_LIMIT) {
+ do {
+ filestream->loadToMem(page);
+ ret = writeNet(fd, filestream->get(), getbytes);
+ if (ret <= 0) {
+ break;
+ }
+ bytes_read += ret;
+ page += filestream->getPagesize();
+ } while (bytes_read <= filesize);
+ } else {
+ filestream->loadToMem(filesize, 0);
+ ret = writeNet(fd, filestream->get(), filesize);
+ }
+ filestream->close();
+#ifdef USE_STATS_CACHE
+ struct timespec end;
+ clock_gettime (CLOCK_REALTIME, &end);
+ double time = (end.tv_sec - start.tv_sec) + ((end.tv_nsec -
start.tv_nsec)/1e9);
+ cerr << "File " << _filespec
+ << " transferred " << filesize << " bytes in: " << fixed
+ << time << " seconds for net fd #" << fd << endl;
+#endif
+ }
+
+ return true;
+}
+
// This is the thread for all incoming RTMP connections
bool
rtmp_handler(Network::thread_params_t *args)
@@ -985,15 +1077,14 @@
double streamid = body->getStreamID();
log_debug("The streamID from
NetStream::createStream() is: %d", streamid);
response_head_size = RTMP::HEADER_8;
- double clientid =
rtmp->createClientID();
- response =
rtmp->encodeResult(RTMPMsg::NS_CREATE_STREAM, filespec, clientid);
- body->dump();
+ response =
rtmp->encodeResult(RTMPMsg::NS_CREATE_STREAM, streamid);
+// body->dump();
}
if (body->getMethodName() ==
"deleteStream") {
double streamid = body->getStreamID();
log_debug("The streamID from
NetStream::deleyeStream() is: %d", streamid);
response_head_size = RTMP::HEADER_8;
- response =
rtmp->encodeResult(RTMPMsg::NS_DELETE_STREAM);
+ response =
rtmp->encodeResult(RTMPMsg::NS_DELETE_STREAM, streamid);
body->dump();
}
// Invoke the NetStream::play() method
@@ -1002,8 +1093,18 @@
log_debug("The streamID from
NetStream::plays: %d", streamid);
filespec = body->at(1)->to_string();
response_head_size = RTMP::HEADER_8;
- response =
rtmp->encodeResult(RTMPMsg::NS_PLAY_START, filespec);
- body->dump();
+ double clientid =
rtmp->createClientID();
+// response =
rtmp->encodeResult(RTMPMsg::NS_PLAY_RESET, filespec);
+// // body->setChannel(4);
+// rtmp->sendMsg(args->netfd,
body->getChannel(), response_head_size, response->allocated(),
+// RTMP::INVOKE,
RTMPMsg::FROM_SERVER, *response);
+// response.reset();
+// body->setChannel(4);
+ response =
rtmp->encodeResult(RTMPMsg::NS_PLAY_START, filespec, clientid);
+ rtmp->sendMsg(args->netfd,
body->getChannel(), response_head_size, response->allocated(),
+ RTMP::INVOKE,
RTMPMsg::FROM_SERVER, *response);
+ rtmp->sendFile(args->netfd, filespec);
+// body->dump();
}
if (body->getMethodName() == "recData") {
}
=== modified file 'cygnal/rtmp_server.h'
--- a/cygnal/rtmp_server.h 2009-02-10 19:24:33 +0000
+++ b/cygnal/rtmp_server.h 2009-02-13 23:45:08 +0000
@@ -48,7 +48,9 @@
// These are handlers for the various types
boost::shared_ptr<amf::Buffer> encodeResult(gnash::RTMPMsg::rtmp_status_e
status);
boost::shared_ptr<amf::Buffer> encodeResult(gnash::RTMPMsg::rtmp_status_e
status, const std::string &filename);
- boost::shared_ptr<amf::Buffer> encodeResult(gnash::RTMPMsg::rtmp_status_e
status, const std::string &filename, double clientid);
+ boost::shared_ptr<amf::Buffer> encodeResult(gnash::RTMPMsg::rtmp_status_e
status, const std::string &filename, double &streamid);
+ boost::shared_ptr<amf::Buffer> encodeResult(gnash::RTMPMsg::rtmp_status_e
status, double &streamid);
+ boost::shared_ptr<amf::Buffer> encodeResult(gnash::RTMPMsg::rtmp_status_e
status, const std::string &filename, double &streamid, double &clientid);
boost::shared_ptr<amf::Buffer> encodePing(rtmp_ping_e type,
boost::uint32_t milliseconds);
boost::shared_ptr<amf::Buffer> encodePing(rtmp_ping_e type);
@@ -61,8 +63,13 @@
boost::shared_ptr<amf::Buffer> formatEchoResponse(double num,
boost::uint8_t *data, size_t size);
void addReference(boost::uint16_t index, amf::Element &el) {
_references[index] = el; };
amf::Element &getReference(boost::uint16_t index) { return
_references[index]; };
-
+
+ bool sendFile(int fd, const std::string &filespec);
+
double createClientID();
+ double createStreamID();
+ void setStreamID(double id) { _streamid = id; };
+ double getStreamID() { return _streamid; };
void dump();
private:
@@ -72,7 +79,8 @@
std::string _filespec;
boost::uint32_t _filesize;
std::map<boost::uint16_t, amf::Element> _references;
- std::vector<double> _clientids;
+ std::vector<double> _clientids;
+ double _streamid;
};
// This is the thread for all incoming RTMP connections
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] /srv/bzr/gnash/rtmp r9984: get the relationship beteen streamid and clientids correct.,
rob <=