/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * streamer.cc * * Fri Sep 19 21:05:08 CEST 2014 * Copyright 2014 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of SimpleRTP. * * SimpleRTP is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * SimpleRTP is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with SimpleRTP; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "outputstreamer.h" #define CSRC_V 42 #define CSRC_A 43 OutputStreamer::OutputStreamer(QString key, unsigned int ssrc) : socket(this) { total = 0; lrtp_status_t status; char ckey[61]; strcpy(ckey, key.toStdString().c_str()); lrtp = lrtp_init(&status, ckey, ssrc); if(status != LRTP_OK) printf("O:lrtp_init err: %d\n", status); int res; res = lrtp_create_profile(lrtp, PROFILE_JPEG, CSRC_V, OPTION_END); if(res != 0) printf("O:lrtp_create_profile (v) err: %d\n", res); res = lrtp_create_profile(lrtp, PROFILE_OPUS, CSRC_A, OPTION_END); if(res != 0) printf("O:lrtp_create_profile (a) err: %d\n", res); } OutputStreamer::~OutputStreamer() { lrtp_status_t status; status = lrtp_destroy_profile(lrtp, CSRC_V); if(status != LRTP_OK) printf("O:lrtp_destroy_profile (v) err: %d\n", status); status = lrtp_destroy_profile(lrtp, CSRC_A); if(status != LRTP_OK) printf("O:lrtp_destroy_profile (a) err: %d\n", status); status = lrtp_close(lrtp); if(status != LRTP_OK) printf("O:lrtp_close err: %d\n", status); } void OutputStreamer::addPeer(QHostAddress addr, quint16 port) { Peer peer; peer.addr = addr; peer.port = port; peers.push_back(peer); } void OutputStreamer::newImage(Frame frame) { int ret = 0; ret = lrtp_enqueue_frame(lrtp, CSRC_V, frame.data, frame.size, frame.ts, LRTP_COPY); if(ret != 0) printf("O:lrtp_enqueue_frame (v) err: %d\n", ret); char packet[16*1024]; while( (ret = lrtp_pack(lrtp, packet, sizeof(packet))) > 0) { //printf("v"); fflush(stdout); sendPackage(packet, ret); } //CPPUNIT_ASSERT_EQUAL(ret, 0); free(frame.data); // delete frame; //free(frame); } void OutputStreamer::newAudio(framelist_t frames) { framelist_t::iterator fi = frames.begin(); while(fi != frames.end()) { Frame *frame = *fi; int ret = 0; ret = lrtp_enqueue_frame(lrtp, CSRC_A, frame->data, frame->size, frame->ts, LRTP_COPY); if(ret != 0) printf("O:lrtp_enqueue_frame (a) err: %d\n", ret); char packet[16*1024]; while( (ret = lrtp_pack(lrtp, packet, sizeof(packet))) > 0) { //printf("a"); fflush(stdout); sendPackage(packet, ret); } //CPPUNIT_ASSERT_EQUAL(ret, 0); free(frame->data); delete frame; //free(frame); fi++; } } void OutputStreamer::sendPackage(const char *data, size_t size) { QList::iterator i = peers.begin(); while(i != peers.end()) { Peer &peer = *i; socket.writeDatagram(data, (quint64)size, peer.addr, peer.port); total += size; i++; } } size_t OutputStreamer::getTotal() { size_t t = total; total = 0; return t; }