diff options
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/dcc/codec.cpp | 82 | ||||
| -rw-r--r-- | src/modules/dcc/codec.h | 13 | ||||
| -rw-r--r-- | src/modules/dcc/libkvidcc.cpp | 8 | ||||
| -rw-r--r-- | src/modules/dcc/video.cpp | 11 |
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(); } |
