void sendCreateStream(rtmp::RTMP& r, FakeNC& nc) { const size_t cn = nc.callNumber(); SimpleBuffer buf; amf::write(buf, "createStream"); amf::write(buf, static_cast<double>(cn)); buf.appendByte(amf::NULL_AMF0); nc.queueCall(cn, "createStream"); r.call(buf); }
/// These functions create an RTMP call buffer and send it. They mimic /// NetConnection.call() methods and replies to server calls. // /// If a call is initiated by us, we send our own call number. /// If we are replying to a server call, we send the server's call number back. void sendConnectPacket(rtmp::RTMP& r, FakeNC& nc, const std::string& app, const std::string& ver, const std::string& swfurl, const std::string& tcurl, const std::string& pageurl) { log_debug("Sending connect packet."); log_debug("app : %s", app); log_debug("flashVer : %s", ver); log_debug("tcURL : %s", tcurl); log_debug("swfURL : %s", swfurl); log_debug("pageURL : %s", pageurl); SimpleBuffer buf; amf::write(buf, "connect"); const size_t cn = nc.callNumber(); /// Call number? amf::write(buf, static_cast<double>(cn)); buf.appendByte(amf::OBJECT_AMF0); if (!app.empty()) amf::writeProperty(buf, "app", app); if (!ver.empty()) amf::writeProperty(buf, "flashVer", ver); if (!swfurl.empty()) amf::writeProperty(buf, "swfUrl", swfurl); if (!tcurl.empty()) amf::writeProperty(buf, "tcUrl", tcurl); amf::writeProperty(buf, "fpad", false); amf::writeProperty(buf, "capabilities", 15.0); amf::writeProperty(buf, "audioCodecs", 3191.0); amf::writeProperty(buf, "videoCodecs", 252.0); amf::writeProperty(buf, "videoFunction", 1.0); if (!pageurl.empty()) amf::writeProperty(buf, "pageUrl", pageurl); buf.appendByte(0); buf.appendByte(0); buf.appendByte(amf::OBJECT_END_AMF0); nc.queueCall(cn, "connect"); r.call(buf); }
void replyBWCheck(rtmp::RTMP& r, FakeNC& /*nc*/, double txn) { // Infofield1? SimpleBuffer buf; amf::write(buf, "_result"); amf::write(buf, txn); buf.appendByte(amf::NULL_AMF0); amf::write(buf, 0.0); r.call(buf); }
void sendCheckBW(rtmp::RTMP& r, FakeNC& nc) { SimpleBuffer buf; const size_t cn = nc.callNumber(); amf::write(buf, "_checkbw"); amf::write(buf, static_cast<double>(cn)); buf.appendByte(amf::NULL_AMF0); nc.queueCall(cn, "_checkbw"); r.call(buf); }
void sendFCSubscribe(rtmp::RTMP& r, FakeNC& nc, const std::string& subscribepath) { const size_t cn = nc.callNumber(); SimpleBuffer buf; amf::write(buf, "FCSubscribe"); // What is this? amf::write(buf, static_cast<double>(cn)); buf.appendByte(amf::NULL_AMF0); amf::write(buf, subscribepath); nc.queueCall(cn, "FCSubscribe"); r.call(buf); }
// Which channel to send on? Always video? //ASnative(2101, 202)(this, "play", null, name, start * 1000, len * 1000, reset); // This call is not queued (it's a play call, and doesn't have a callback). void sendPlayPacket(rtmp::RTMP& r, FakeNC& nc) { const int streamid = nc.streamID(); const double seektime = nc.seekTime() * 1000.0; const double length = nc.length() * 1000.0; log_debug("Sending play packet. Stream id: %s, playpath %s", streamid, nc.playpath()); SimpleBuffer buf; amf::write(buf, "play"); // What is this? The play stream? Call number? amf::write(buf, 0.0); buf.appendByte(amf::NULL_AMF0); log_debug( "seekTime=%.2f, dLength=%d, sending play: %s", seektime, length, nc.playpath()); amf::write(buf, nc.playpath()); // Optional parameters start and len. // // start: -2, -1, 0, positive number // -2: looks for a live stream, then a recorded stream, if not found // any open a live stream // -1: plays a live stream // >=0: plays a recorded streams from 'start' milliseconds amf::write(buf, seektime); // len: -1, 0, positive number // -1: plays live or recorded stream to the end (default) // 0: plays a frame 'start' ms away from the beginning // >0: plays a live or recoded stream for 'len' milliseconds //enc += EncodeNumber(enc, -1.0); // len amf::write(buf, length); r.play(buf, streamid); }
void sendPausePacket(rtmp::RTMP& r, FakeNC& nc, bool flag, double time) { const int streamid = nc.streamID(); SimpleBuffer buf; amf::write(buf, "pause"); // What is this? The play stream? Call number? amf::write(buf, 0.0); buf.appendByte(amf::NULL_AMF0); log_debug( "Pause: flag=%s, time=%d", flag, time); amf::write(buf, flag); // "this.time", i.e. NetStream.time. amf::write(buf, time * 1000.0); r.play(buf, streamid); }