/* -*- 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 KEY "123456789012345678901234567890123456789012345678901234567890" #define SSRC 1234567890 #define CSRC_V 42 #define CSRC_A 43 OutputStreamer::OutputStreamer(QHostAddress addr, quint16 port) : socket(this) { total = 0; lrtp_status_t status; lrtp = lrtp_init(&status, KEY, 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); this->addr = addr; this->port = port; } 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::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) { total += size; socket.writeDatagram(data, (quint64)size, addr, port); } size_t OutputStreamer::getTotal() { size_t t = total; total = 0; return t; }