mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-02 14:16:16 -04:00
added preview option to show decoded stream in Audio config
This commit is contained in:
parent
2107a1c858
commit
c0614e70ac
8 changed files with 195 additions and 63 deletions
|
@ -12,9 +12,15 @@ VideoDecoder::VideoDecoder()
|
|||
_output_device = NULL ;
|
||||
}
|
||||
|
||||
bool VideoEncoder::addImage(const QImage& img)
|
||||
VideoEncoder::VideoEncoder()
|
||||
:_frame_size(128,128)
|
||||
{
|
||||
encodeData(img) ;
|
||||
}
|
||||
|
||||
bool VideoEncoder::addImage(const QImage& img,uint32_t size_hint,uint32_t& encoded_size)
|
||||
{
|
||||
std::cerr << "reducing to " << _frame_size.width() << " x " << _frame_size.height() << std::endl;
|
||||
encodeData(img.scaled(_frame_size,Qt::IgnoreAspectRatio,Qt::SmoothTransformation),size_hint,encoded_size) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
@ -32,6 +38,7 @@ bool VideoEncoder::nextPacket(RsVOIPDataChunk& chunk)
|
|||
|
||||
void VideoDecoder::receiveEncodedData(const unsigned char *data,uint32_t size)
|
||||
{
|
||||
if(_output_device)
|
||||
_output_device->showFrame(decodeData(data,size)) ;
|
||||
}
|
||||
|
||||
|
@ -50,24 +57,54 @@ QImage JPEGVideoDecoder::decodeData(const unsigned char *encoded_image_data,uint
|
|||
|
||||
void VideoEncoder::setMaximumFrameRate(uint32_t bytes_per_sec)
|
||||
{
|
||||
std::cerr << "Video Encoder: maximum frame rate is set to " << bytes_per_sec << " Bps" << std::endl;
|
||||
std::cerr << "Video Encoder: maximum frame rate is set to " << bytes_per_sec << " Bps" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
void JPEGVideoEncoder::encodeData(const QImage& image)
|
||||
void VideoEncoder::setInternalFrameSize(QSize s)
|
||||
{
|
||||
QByteArray qb ;
|
||||
|
||||
QBuffer buffer(&qb) ;
|
||||
buffer.open(QIODevice::WriteOnly) ;
|
||||
image.save(&buffer,"JPEG") ;
|
||||
|
||||
RsVOIPDataChunk voip_chunk ;
|
||||
voip_chunk.data = malloc(qb.size());
|
||||
memcpy(voip_chunk.data,qb.data(),qb.size()) ;
|
||||
voip_chunk.size = qb.size() ;
|
||||
voip_chunk.type = RsVOIPDataChunk::RS_VOIP_DATA_TYPE_VIDEO ;
|
||||
|
||||
_out_queue.push_back(voip_chunk) ;
|
||||
_frame_size = s ;
|
||||
}
|
||||
|
||||
JPEGVideoEncoder::JPEGVideoEncoder()
|
||||
: _ref_frame_max_distance(10),_ref_frame_count(10)
|
||||
{
|
||||
}
|
||||
|
||||
void JPEGVideoEncoder::encodeData(const QImage& image,uint32_t /* size_hint */,uint32_t& encoded_size)
|
||||
{
|
||||
// check if we make a diff image, or if we use the full frame.
|
||||
|
||||
QImage encoded_frame ;
|
||||
|
||||
if(_ref_frame_count++ < _ref_frame_max_distance && image.size() == _reference_frame.size())
|
||||
{
|
||||
// compute difference with reference frame.
|
||||
encoded_frame = image ;
|
||||
|
||||
for(uint32_t i=0;i<image.byteCount();++i)
|
||||
encoded_frame.bits()[i] = image.bits()[i] - _reference_frame.bits()[i] + 128 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
_ref_frame_count = 0 ;
|
||||
_reference_frame = image ;
|
||||
encoded_frame = image ;
|
||||
}
|
||||
|
||||
QByteArray qb ;
|
||||
|
||||
QBuffer buffer(&qb) ;
|
||||
buffer.open(QIODevice::WriteOnly) ;
|
||||
encoded_frame.save(&buffer,"JPEG") ;
|
||||
|
||||
RsVOIPDataChunk voip_chunk ;
|
||||
voip_chunk.data = malloc(qb.size());
|
||||
memcpy(voip_chunk.data,qb.data(),qb.size()) ;
|
||||
voip_chunk.size = qb.size() ;
|
||||
voip_chunk.type = RsVOIPDataChunk::RS_VOIP_DATA_TYPE_VIDEO ;
|
||||
|
||||
_out_queue.push_back(voip_chunk) ;
|
||||
|
||||
encoded_size = voip_chunk.size ;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue