mirror of
https://github.com/dyne/FreeJ.git
synced 2026-06-16 12:59:33 +02:00
Now sees the stream rate.
- In VideoEncoder, added bitrate calculation to ::thread_loop(). Added the ::getStreamRate method to ask for the value. - In QEncoder, created a QTimer which ask VideoEncoder the average streaming bitrate in KBps every 2 seconds. Added the Birate field in the display.
This commit is contained in:
@@ -14,4 +14,8 @@ the QJackClient of the time you waited to open the QJackClient .... see if a fix
|
||||
//add the capability to have a config file..... important :)
|
||||
//if resizing the wiewport when the layer is bigger, you need to just touch the layer size to display it correctly
|
||||
//why qfreej doesn't install with the AUR packages
|
||||
//see if possible to manage an audio layer
|
||||
//see if possible to manage an audio layer
|
||||
//be able to change v4l2 resolution from the graphic interface
|
||||
//see why sound delay increases on video during streaming
|
||||
//see why sound stops after a whyle when streaming .... have to deconnect jack ports and connect back
|
||||
//need do adjust stream bitrate value.
|
||||
|
||||
+37
-18
@@ -11,6 +11,8 @@ QEncoder::QEncoder(Qfreej *qfreej) : QWidget()
|
||||
m_Qfreej = qfreej;
|
||||
m_freej = qfreej->getFreej();
|
||||
init();
|
||||
pollerRate = new QTimer (this);
|
||||
connect(pollerRate, SIGNAL(timeout()), this, SLOT(updateStreamRate()));
|
||||
show();
|
||||
}
|
||||
|
||||
@@ -26,6 +28,7 @@ QEncoder::~QEncoder()
|
||||
if (m_Qjack)
|
||||
(m_Qjack->getJack())->isEncoded(false);
|
||||
m_Qfreej->resetEnc();
|
||||
pollerRate->stop();
|
||||
}
|
||||
|
||||
void QEncoder::init()
|
||||
@@ -57,7 +60,7 @@ void QEncoder::init()
|
||||
m_Aquality->setText("15"); //default audio quality
|
||||
m_Aquality->setToolTip("range from 0 to 100 (low qual. to hi)");
|
||||
|
||||
QLabel *aQual = new QLabel("Au quality (Kbps)");
|
||||
QLabel *aQual = new QLabel("Au quality");
|
||||
layoutG->addWidget(aQual, 3, 0);
|
||||
layoutG->addWidget(m_Aquality, 3, 1);
|
||||
|
||||
@@ -65,58 +68,66 @@ void QEncoder::init()
|
||||
m_Abitrate->setText("0"); //default audio bitrate
|
||||
m_Abitrate->setEnabled(false);
|
||||
|
||||
QLabel *aBps = new QLabel("Au bitrate");
|
||||
QLabel *aBps = new QLabel("Au bitrate (Kbps)");
|
||||
layoutG->addWidget(aBps, 4, 0);
|
||||
layoutG->addWidget(m_Abitrate, 4, 1);
|
||||
|
||||
m_Bitrate = new QLineEdit;
|
||||
m_Bitrate->setText("0"); //default audio bitrate
|
||||
m_Bitrate->setEnabled(false);
|
||||
|
||||
QLabel *bps = new QLabel("Stream Bitrate (KBps)");
|
||||
layoutG->addWidget(bps, 5, 0);
|
||||
layoutG->addWidget(m_Bitrate, 5, 1);
|
||||
|
||||
m_dumpButton = new QRadioButton("Dump", this);
|
||||
m_dumpButton->setAutoExclusive(false);
|
||||
layoutG->addWidget(m_dumpButton, 5, 0);
|
||||
layoutG->addWidget(m_dumpButton, 6, 0);
|
||||
|
||||
m_FileName = new QLineEdit;
|
||||
m_FileName->setText("Video/dump.ogg");
|
||||
layoutG->addWidget(m_FileName, 5, 1);
|
||||
layoutG->addWidget(m_FileName, 6, 1);
|
||||
|
||||
QLabel *host = new QLabel("Host");
|
||||
layoutG->addWidget(host, 6, 0);
|
||||
layoutG->addWidget(host, 7, 0);
|
||||
m_Host = new QLineEdit;
|
||||
m_Host->setText("localhost");
|
||||
layoutG->addWidget(m_Host, 6, 1);
|
||||
layoutG->addWidget(m_Host, 7, 1);
|
||||
|
||||
QLabel *port = new QLabel("Port");
|
||||
layoutG->addWidget(port, 7, 0);
|
||||
layoutG->addWidget(port, 8, 0);
|
||||
m_Port = new QLineEdit;
|
||||
m_Port->setValidator(new QIntValidator(1, 999999, m_Port));
|
||||
m_Port->setText("8000");
|
||||
layoutG->addWidget(m_Port, 7, 1);
|
||||
layoutG->addWidget(m_Port, 8, 1);
|
||||
|
||||
QLabel *shoutname = new QLabel("Name");
|
||||
layoutG->addWidget(shoutname, 8, 0);
|
||||
layoutG->addWidget(shoutname, 9, 0);
|
||||
m_ShoutName = new QLineEdit;
|
||||
m_ShoutName->setText("qfreej streaming");
|
||||
layoutG->addWidget(m_ShoutName, 8, 1);
|
||||
layoutG->addWidget(m_ShoutName, 9, 1);
|
||||
|
||||
QLabel *user = new QLabel("User");
|
||||
layoutG->addWidget(user, 9, 0);
|
||||
layoutG->addWidget(user, 10, 0);
|
||||
m_User = new QLineEdit;
|
||||
m_User->setText("source");
|
||||
layoutG->addWidget(m_User, 9, 1);
|
||||
layoutG->addWidget(m_User, 10, 1);
|
||||
|
||||
QLabel *pass = new QLabel("Passwd");
|
||||
layoutG->addWidget(pass, 10, 0);
|
||||
layoutG->addWidget(pass, 11, 0);
|
||||
m_Pass = new QLineEdit;
|
||||
m_Pass->setText("test!");
|
||||
layoutG->addWidget(m_Pass, 10, 1);
|
||||
layoutG->addWidget(m_Pass, 11, 1);
|
||||
|
||||
QLabel *filename = new QLabel("File name");
|
||||
layoutG->addWidget(filename, 11, 0);
|
||||
layoutG->addWidget(filename, 12, 0);
|
||||
m_ShoutFileName = new QLineEdit;
|
||||
m_ShoutFileName->setText("freejcpp.ogv");
|
||||
layoutG->addWidget(m_ShoutFileName, 11, 1);
|
||||
layoutG->addWidget(m_ShoutFileName, 12, 1);
|
||||
|
||||
m_IceButton = new QRadioButton("IceCast", this);
|
||||
m_IceButton->setAutoExclusive(false);
|
||||
layoutG->addWidget(m_IceButton, 12, 0);
|
||||
layoutG->addWidget(m_IceButton, 13, 0);
|
||||
m_IceButton->setChecked(true);
|
||||
|
||||
setLayout(layoutG);
|
||||
@@ -139,7 +150,7 @@ void QEncoder::stream()
|
||||
m_enc->use_audio = true;
|
||||
(m_Qjack->getJack())->isEncoded(false);
|
||||
m_enc->audio_quality = m_Aquality->text().toInt();
|
||||
m_enc->audio_bitrate = m_Abitrate->text().toInt();
|
||||
// m_enc->audio_bitrate = m_Abitrate->text().toInt();
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -188,6 +199,7 @@ void QEncoder::stream()
|
||||
}
|
||||
m_enc->active = true;
|
||||
m_streamButton->setText("Close to STOP");
|
||||
pollerRate->start(2000);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -198,6 +210,13 @@ void QEncoder::stream()
|
||||
}
|
||||
}
|
||||
|
||||
void QEncoder::updateStreamRate()
|
||||
{
|
||||
QString val;
|
||||
val.setNum(m_enc->getStreamRate(), 'g', 3);
|
||||
m_Bitrate->setText(val);
|
||||
}
|
||||
|
||||
OggTheoraEncoder *QEncoder::getEnc ()
|
||||
{
|
||||
return m_enc;
|
||||
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
|
||||
public slots:
|
||||
void stream();
|
||||
void updateStreamRate();
|
||||
|
||||
private:
|
||||
void init();
|
||||
@@ -25,6 +26,7 @@ private:
|
||||
QLineEdit *m_Vbitrate;
|
||||
QLineEdit *m_Aquality;
|
||||
QLineEdit *m_Abitrate;
|
||||
QLineEdit *m_Bitrate;
|
||||
QLineEdit *m_FileName;
|
||||
Qfreej *m_Qfreej;
|
||||
Context *m_freej;
|
||||
@@ -40,6 +42,8 @@ private:
|
||||
QLineEdit *m_Pass;
|
||||
QLineEdit *m_ShoutFileName;
|
||||
QRadioButton *m_IceButton;
|
||||
QTimer *pollerRate;
|
||||
|
||||
|
||||
protected:
|
||||
virtual void closeEvent (QCloseEvent *ev);
|
||||
|
||||
@@ -69,6 +69,7 @@ class VideoEncoder: public Entry, public JSyncThread {
|
||||
VideoEncoder ();
|
||||
virtual ~VideoEncoder ();
|
||||
|
||||
double getStreamRate();
|
||||
|
||||
virtual bool init (ViewPort *scr) = 0; ///< pure virtual function to implement
|
||||
virtual int encode_frame () = 0; ///< pure virtual function to implement
|
||||
@@ -125,7 +126,10 @@ class VideoEncoder: public Entry, public JSyncThread {
|
||||
// char encbuf[1024*128];
|
||||
// char encbuf[1024*2096];
|
||||
char *encbuf;
|
||||
struct timeval actual_time;
|
||||
struct timeval m_ActualTime, m_OldTime;
|
||||
double m_StreamRate;
|
||||
int m_Streamed;
|
||||
double m_ElapsedTime;
|
||||
|
||||
|
||||
};
|
||||
|
||||
+23
-3
@@ -90,7 +90,8 @@ VideoEncoder::VideoEncoder()
|
||||
audio_kbps = 0;
|
||||
video_kbps = 0;
|
||||
bytes_encoded = 0;
|
||||
|
||||
m_ElapsedTime = 0;
|
||||
m_Streamed = 0;
|
||||
enc_y = enc_u = enc_v = NULL;
|
||||
|
||||
fps = new FPS();
|
||||
@@ -116,7 +117,7 @@ VideoEncoder::VideoEncoder()
|
||||
error("shout_set_public: %s", shout_get_error(ice));
|
||||
|
||||
func("init picture_yuv for colorspace conversion (avcodec)");
|
||||
|
||||
gettimeofday(&m_OldTime, NULL);
|
||||
}
|
||||
|
||||
VideoEncoder::~VideoEncoder() {
|
||||
@@ -266,8 +267,27 @@ void VideoEncoder::thread_loop() {
|
||||
}// else
|
||||
//printf("%d %d\n", encnum, (int)shout_queuelen(ice));
|
||||
}
|
||||
gettimeofday(&m_ActualTime, NULL);
|
||||
if (m_ActualTime.tv_sec == m_OldTime.tv_sec)
|
||||
m_ElapsedTime += ((double)(m_ActualTime.tv_usec - m_OldTime.tv_usec))/1000000.0;
|
||||
else
|
||||
m_ElapsedTime += ((double)(m_ActualTime.tv_sec - m_OldTime.tv_sec)) + \
|
||||
(((double)(m_ActualTime.tv_usec - m_OldTime.tv_usec))/1000000.0);
|
||||
m_OldTime.tv_sec = m_ActualTime.tv_sec;
|
||||
m_OldTime.tv_usec = m_ActualTime.tv_usec;
|
||||
m_Streamed += encnum;
|
||||
if (m_ElapsedTime >= 3.0) //calculate stream rate every minimum 3 seconds
|
||||
{
|
||||
m_StreamRate = ((double)m_Streamed / m_ElapsedTime) / 1000.0;
|
||||
m_ElapsedTime = 0;
|
||||
m_Streamed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
double VideoEncoder::getStreamRate()
|
||||
{
|
||||
return (m_StreamRate);
|
||||
}
|
||||
|
||||
void VideoEncoder::thread_teardown() {
|
||||
|
||||
Reference in New Issue
Block a user