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:
fred
2011-03-25 20:50:02 +01:00
parent aac0c0c881
commit 4cac1689a0
5 changed files with 74 additions and 23 deletions
+5 -1
View File
@@ -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
View File
@@ -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;
+4
View File
@@ -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);
+5 -1
View File
@@ -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
View File
@@ -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() {