aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorGravatar Fabio Bas2009-12-06 23:01:41 +0000
committerGravatar Fabio Bas2009-12-06 23:01:41 +0000
commitb3743ed6471d0088d180d884986d7caeb37eddca (patch)
treebf663309c8c0b42e8ba85075e85261647058e933 /src/modules
parentrestored lowercase phonon #includes (fixes phonon compilation without KDE); t... (diff)
downloadKVIrc-b3743ed6471d0088d180d884986d7caeb37eddca.tar.gz
KVIrc-b3743ed6471d0088d180d884986d7caeb37eddca.tar.bz2
KVIrc-b3743ed6471d0088d180d884986d7caeb37eddca.zip
Added an alternative (tricky) codec to compile DCC_VIDEO without OGG_THEORA
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@3670 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/dcc/codec.cpp82
-rw-r--r--src/modules/dcc/codec.h13
-rw-r--r--src/modules/dcc/libkvidcc.cpp8
-rw-r--r--src/modules/dcc/video.cpp11
4 files changed, 107 insertions, 7 deletions
diff --git a/src/modules/dcc/codec.cpp b/src/modules/dcc/codec.cpp
index 23f5b5676..ffcbf330a 100644
--- a/src/modules/dcc/codec.cpp
+++ b/src/modules/dcc/codec.cpp
@@ -24,6 +24,11 @@
#include "codec.h"
+
+#include <QImage>
+#include <QByteArray>
+#include <QBuffer>
+
KviDccVoiceCodec::KviDccVoiceCodec()
{
}
@@ -127,6 +132,83 @@ const char * KviDccVideoCodec::name()
return m_szName.ptr();
}
+KviDccVideoSJpegCodec::KviDccVideoSJpegCodec()
+: KviDccVideoCodec()
+{
+ m_szName = "sjpeg";
+}
+
+KviDccVideoSJpegCodec::~KviDccVideoSJpegCodec()
+{
+}
+
+void KviDccVideoSJpegCodec::encodeVideo(KviDataBuffer * videoSignal,KviDataBuffer * stream)
+{
+
+ if(videoSignal->size() < 1) return;
+
+ QImage img(videoSignal->data(), 320, 240, 1280, QImage::Format_ARGB32);
+ QByteArray ba;
+ QBuffer buffer(&ba);
+ buffer.open(QIODevice::WriteOnly);
+ //0 to obtain small compressed files,
+ //100 for large uncompressed files,
+ //and -1 (the default) to use the default settings.
+ img.save(&buffer, "JPEG", 20);
+ if(ba.size() > 0)
+ {
+ stream->append((const unsigned char*)ba.data(),ba.size());
+ }
+ videoSignal->clear();
+}
+
+void KviDccVideoSJpegCodec::encodeAudio(KviDataBuffer * audioSignal,KviDataBuffer * stream)
+{
+ //no audio support
+ Q_UNUSED(stream);
+ if(audioSignal->size() < 1) return;
+
+ audioSignal->clear();
+ return;
+}
+
+void KviDccVideoSJpegCodec::decode(KviDataBuffer * stream,KviDataBuffer * signal)
+{
+ static unsigned const char jpg_magic_init[4] = { 0xFF, 0xD8, 0xFF, 0xE0}; //SOI + APP0
+ static unsigned const char jpg_magic_end[2] = { 0xFF, 0xD9}; //EOI
+
+ if(stream->size() < 1)return;
+
+ int start = stream->find(jpg_magic_init, 4);
+ int end = stream->find(jpg_magic_end, 2);
+ if(start != -1 && end != -1)
+ {
+ QImage img;
+ //remove junk before jpeg start
+ stream->remove(start);
+ int len = end - start + 1;
+
+ img.loadFromData(stream->data(), stream->size());
+ if(!img.isNull())
+ {
+ signal->clear();
+ signal->append(img.bits(),img.numBytes());
+ }
+ stream->remove(len);
+ }
+}
+
+int KviDccVideoSJpegCodec::encodedFrameSize()
+{
+ return 0;
+}
+
+int KviDccVideoSJpegCodec::decodedFrameSize()
+{
+ return 0;
+}
+
+
#ifndef COMPILE_DISABLE_OGG_THEORA
KviDccVideoTheoraCodec::KviDccVideoTheoraCodec()
: KviDccVideoCodec()
diff --git a/src/modules/dcc/codec.h b/src/modules/dcc/codec.h
index a240f3f35..da3c24d18 100644
--- a/src/modules/dcc/codec.h
+++ b/src/modules/dcc/codec.h
@@ -71,6 +71,19 @@ public:
virtual int decodedFrameSize();
};
+class KviDccVideoSJpegCodec : public KviDccVideoCodec
+{
+public:
+ KviDccVideoSJpegCodec();
+ virtual ~KviDccVideoSJpegCodec();
+public:
+ virtual void encodeVideo(KviDataBuffer * videoSignal, KviDataBuffer * stream);
+ virtual void encodeAudio(KviDataBuffer * audioSignal, KviDataBuffer * stream);
+ virtual void decode(KviDataBuffer * stream,KviDataBuffer * signal);
+ virtual int encodedFrameSize();
+ virtual int decodedFrameSize();
+};
+
#ifndef COMPILE_DISABLE_OGG_THEORA
class KviDccVideoTheoraCodec : public KviDccVideoCodec
{
diff --git a/src/modules/dcc/libkvidcc.cpp b/src/modules/dcc/libkvidcc.cpp
index 4f6f467b0..6d5242f88 100644
--- a/src/modules/dcc/libkvidcc.cpp
+++ b/src/modules/dcc/libkvidcc.cpp
@@ -1202,7 +1202,7 @@ static bool dcc_kvs_cmd_video(KviKvsModuleCommandCall * c)
if(!dcc_kvs_parse_default_parameters(d,c))return false;
- d->szCodec = "jpeg";
+ d->szCodec = "sjpeg";
if(KviKvsVariant * pCodec = c->switches()->find('g',"codec"))
{
@@ -1211,8 +1211,10 @@ static bool dcc_kvs_cmd_video(KviKvsModuleCommandCall * c)
if(!kvi_dcc_video_is_valid_codec(szCodec.toUtf8().data()))
{
- c->warning(__tr2qs_ctx("Invalid codec specified, defaulting to 'jpeg'","dcc"));
- d->szCodec = "jpeg";
+ c->warning(__tr2qs_ctx("Invalid codec specified, defaulting to 'sjpeg'","dcc"));
+ d->szCodec = "sjpeg";
+ } else {
+ d->szCodec = szCodec;
}
}
diff --git a/src/modules/dcc/video.cpp b/src/modules/dcc/video.cpp
index 11d2c6ad5..310deb890 100644
--- a/src/modules/dcc/video.cpp
+++ b/src/modules/dcc/video.cpp
@@ -85,16 +85,19 @@ extern KviDccBroker * g_pDccBroker;
bool kvi_dcc_video_is_valid_codec(const char * codecName)
{
- if(kvi_strEqualCI("jpeg",codecName))return true;
+ if(kvi_strEqualCI("sjpeg",codecName))return true;
+#ifndef COMPILE_DISABLE_OGG_THEORA
if(kvi_strEqualCI("theora",codecName))return true;
+#endif
return false;
}
static KviDccVideoCodec * kvi_dcc_video_get_codec(const char *codecName)
{
- Q_UNUSED(codecName);
-// if(kvi_strEqualCI("jpeg",codecName))return new KviDccVideoJpegCodec();
- return new KviDccVideoTheoraCodec();
+#ifndef COMPILE_DISABLE_OGG_THEORA
+ if(kvi_strEqualCI("theora",codecName))return new KviDccVideoTheoraCodec();
+#endif
+ return new KviDccVideoSJpegCodec();
}