320 lines
7.0 KiB
C++
320 lines
7.0 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
#include "video_buffer.h"
|
|
|
|
using namespace webrtc;
|
|
|
|
TestVideoBuffer::TestVideoBuffer():
|
|
_buffer(0),
|
|
_bufferSize(0),
|
|
_bufferLength(0),
|
|
_startOffset(0),
|
|
_timeStamp(0),
|
|
_width(0),
|
|
_height(0)
|
|
{
|
|
//
|
|
}
|
|
|
|
|
|
TestVideoBuffer::~TestVideoBuffer()
|
|
{
|
|
_timeStamp = 0;
|
|
_startOffset = 0;
|
|
_bufferLength = 0;
|
|
_bufferSize = 0;
|
|
|
|
if(_buffer)
|
|
{
|
|
delete [] _buffer;
|
|
_buffer = 0;
|
|
}
|
|
}
|
|
|
|
TestVideoBuffer::TestVideoBuffer(const TestVideoBuffer& rhs)
|
|
:
|
|
_buffer(0),
|
|
_bufferSize(rhs._bufferSize),
|
|
_bufferLength(rhs._bufferLength),
|
|
_startOffset(rhs._startOffset),
|
|
_timeStamp(rhs._timeStamp),
|
|
_width(rhs._width),
|
|
_height(rhs._height)
|
|
{
|
|
// make sure that our buffer is big enough
|
|
_buffer = new unsigned char[_bufferSize];
|
|
|
|
// only copy required length
|
|
memcpy(_buffer + _startOffset, rhs._buffer, _bufferLength); // GetBuffer() includes _startOffset
|
|
}
|
|
|
|
void TestVideoBuffer::SetTimeStamp(unsigned int timeStamp)
|
|
{
|
|
_timeStamp = timeStamp;
|
|
}
|
|
|
|
unsigned int
|
|
TestVideoBuffer::GetWidth() const
|
|
{
|
|
return _width;
|
|
}
|
|
|
|
unsigned int
|
|
TestVideoBuffer::GetHeight() const
|
|
{
|
|
return _height;
|
|
}
|
|
|
|
void
|
|
TestVideoBuffer::SetWidth(unsigned int width)
|
|
{
|
|
_width = width;
|
|
}
|
|
|
|
void
|
|
TestVideoBuffer::SetHeight(unsigned int height)
|
|
{
|
|
_height = height;
|
|
}
|
|
|
|
|
|
void TestVideoBuffer::Free()
|
|
{
|
|
_timeStamp = 0;
|
|
_startOffset = 0;
|
|
_bufferLength = 0;
|
|
_bufferSize = 0;
|
|
_height = 0;
|
|
_width = 0;
|
|
|
|
if(_buffer)
|
|
{
|
|
delete [] _buffer;
|
|
_buffer = 0;
|
|
}
|
|
}
|
|
|
|
void TestVideoBuffer::VerifyAndAllocate(unsigned int minimumSize)
|
|
{
|
|
if(minimumSize > _bufferSize)
|
|
{
|
|
// make sure that our buffer is big enough
|
|
unsigned char * newBufferBuffer = new unsigned char[minimumSize];
|
|
if(_buffer)
|
|
{
|
|
// copy the old data
|
|
memcpy(newBufferBuffer, _buffer, _bufferSize);
|
|
delete [] _buffer;
|
|
}
|
|
_buffer = newBufferBuffer;
|
|
_bufferSize = minimumSize;
|
|
}
|
|
}
|
|
|
|
int TestVideoBuffer::SetOffset(unsigned int length)
|
|
{
|
|
if (length > _bufferSize ||
|
|
length > _bufferLength)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
unsigned int oldOffset = _startOffset;
|
|
|
|
if(oldOffset > length)
|
|
{
|
|
unsigned int newLength = _bufferLength + (oldOffset-length);// increase by the diff
|
|
assert(newLength <= _bufferSize);
|
|
_bufferLength = newLength;
|
|
}
|
|
if(oldOffset < length)
|
|
{
|
|
if(_bufferLength > (length-oldOffset))
|
|
{
|
|
_bufferLength -= (length-oldOffset); // decrease by the diff
|
|
}
|
|
}
|
|
_startOffset = length; // update
|
|
|
|
return 0;
|
|
}
|
|
|
|
void TestVideoBuffer::UpdateLength(unsigned int newLength)
|
|
{
|
|
assert(newLength +_startOffset <= _bufferSize);
|
|
_bufferLength = newLength;
|
|
}
|
|
|
|
void TestVideoBuffer::CopyBuffer(unsigned int length, const unsigned char* buffer)
|
|
{
|
|
assert(length+_startOffset <= _bufferSize);
|
|
memcpy(_buffer+_startOffset, buffer, length);
|
|
_bufferLength = length;
|
|
}
|
|
|
|
void TestVideoBuffer::CopyBuffer(TestVideoBuffer& fromVideoBuffer)
|
|
{
|
|
assert(fromVideoBuffer.GetLength() + fromVideoBuffer.GetStartOffset() <= _bufferSize);
|
|
assert(fromVideoBuffer.GetSize() <= _bufferSize);
|
|
|
|
_bufferLength = fromVideoBuffer.GetLength();
|
|
_startOffset = fromVideoBuffer.GetStartOffset();
|
|
_timeStamp = fromVideoBuffer.GetTimeStamp();
|
|
_height = fromVideoBuffer.GetHeight();
|
|
_width = fromVideoBuffer.GetWidth();
|
|
|
|
// only copy required length
|
|
memcpy(_buffer+_startOffset, fromVideoBuffer.GetBuffer(), fromVideoBuffer.GetLength()); // GetBuffer() includes _startOffset
|
|
|
|
}
|
|
|
|
void TestVideoBuffer::CopyPointer(const TestVideoBuffer& fromVideoBuffer)
|
|
{
|
|
_bufferSize = fromVideoBuffer.GetSize();
|
|
_bufferLength = fromVideoBuffer.GetLength();
|
|
_startOffset = fromVideoBuffer.GetStartOffset();
|
|
_timeStamp = fromVideoBuffer.GetTimeStamp();
|
|
_height = fromVideoBuffer.GetHeight();
|
|
_width = fromVideoBuffer.GetWidth();
|
|
|
|
_buffer = fromVideoBuffer.GetBuffer();
|
|
}
|
|
|
|
void TestVideoBuffer::ClearPointer()
|
|
{
|
|
_buffer = NULL;
|
|
}
|
|
|
|
void TestVideoBuffer::SwapBuffers(TestVideoBuffer& videoBuffer)
|
|
{
|
|
unsigned char* tempBuffer = _buffer;
|
|
unsigned int tempSize = _bufferSize;
|
|
unsigned int tempLength =_bufferLength;
|
|
unsigned int tempOffset = _startOffset;
|
|
unsigned int tempTime = _timeStamp;
|
|
unsigned int tempHeight = _height;
|
|
unsigned int tempWidth = _width;
|
|
|
|
_buffer = videoBuffer.GetBuffer();
|
|
_bufferSize = videoBuffer.GetSize();
|
|
_bufferLength = videoBuffer.GetLength();
|
|
_startOffset = videoBuffer.GetStartOffset();
|
|
_timeStamp = videoBuffer.GetTimeStamp();
|
|
_height = videoBuffer.GetHeight();
|
|
_width = videoBuffer.GetWidth();
|
|
|
|
|
|
videoBuffer.Set(tempBuffer, tempSize, tempLength, tempOffset, tempTime);
|
|
videoBuffer.SetHeight(tempHeight);
|
|
videoBuffer.SetWidth(tempWidth);
|
|
}
|
|
|
|
void TestVideoBuffer::Set(unsigned char* tempBuffer,unsigned int tempSize,unsigned int tempLength, unsigned int tempOffset,unsigned int timeStamp)
|
|
{
|
|
_buffer = tempBuffer;
|
|
_bufferSize = tempSize;
|
|
_bufferLength = tempLength;
|
|
_startOffset = tempOffset;
|
|
_timeStamp = timeStamp;
|
|
}
|
|
|
|
unsigned char* TestVideoBuffer::GetBuffer() const
|
|
{
|
|
return _buffer+_startOffset;
|
|
}
|
|
|
|
unsigned int TestVideoBuffer::GetStartOffset() const
|
|
{
|
|
return _startOffset;
|
|
}
|
|
|
|
unsigned int TestVideoBuffer::GetSize() const
|
|
{
|
|
return _bufferSize;
|
|
}
|
|
|
|
unsigned int TestVideoBuffer::GetLength() const
|
|
{
|
|
return _bufferLength;
|
|
}
|
|
|
|
unsigned int TestVideoBuffer::GetTimeStamp() const
|
|
{
|
|
return _timeStamp;
|
|
}
|
|
|
|
/**
|
|
* TestVideoEncodedBuffer
|
|
*
|
|
*/
|
|
|
|
TestVideoEncodedBuffer::TestVideoEncodedBuffer() :
|
|
_captureWidth(0),
|
|
_captureHeight(0),
|
|
_frameRate(-1)
|
|
{
|
|
_frameType = kDeltaFrame;
|
|
}
|
|
|
|
TestVideoEncodedBuffer::~TestVideoEncodedBuffer()
|
|
{
|
|
}
|
|
|
|
void TestVideoEncodedBuffer::SetCaptureWidth(unsigned short width)
|
|
{
|
|
_captureWidth = width;
|
|
}
|
|
|
|
void TestVideoEncodedBuffer::SetCaptureHeight(unsigned short height)
|
|
{
|
|
_captureHeight = height;
|
|
}
|
|
|
|
unsigned short TestVideoEncodedBuffer::GetCaptureWidth()
|
|
{
|
|
return _captureWidth;
|
|
}
|
|
|
|
unsigned short TestVideoEncodedBuffer::GetCaptureHeight()
|
|
{
|
|
return _captureHeight;
|
|
}
|
|
|
|
VideoFrameType TestVideoEncodedBuffer::GetFrameType()
|
|
{
|
|
return _frameType;
|
|
}
|
|
|
|
void TestVideoEncodedBuffer::SetFrameType(VideoFrameType frametype)
|
|
{
|
|
_frameType = frametype;
|
|
}
|
|
|
|
void TestVideoEncodedBuffer::Reset()
|
|
{
|
|
_captureWidth = 0;
|
|
_captureHeight = 0;
|
|
_frameRate = -1;
|
|
_frameType = kDeltaFrame;
|
|
}
|
|
|
|
void TestVideoEncodedBuffer::SetFrameRate(float frameRate)
|
|
{
|
|
_frameRate = frameRate;
|
|
}
|
|
|
|
float TestVideoEncodedBuffer::GetFrameRate()
|
|
{
|
|
return _frameRate;
|
|
}
|