[Live-devel] MJPEG woes
Andy Bell
andy at j2kvideo.com
Wed Jun 30 11:10:10 PDT 2010
Hi,
I have been trying to use Live555 to stream a JPEG file to OpenRTSP and
other Live555 based clients.
Depending on the source JPEG file I get varying results in quality. When
streaming the JPEG file I am simply finding the SOS marker and copying this
to fTo, the code is below. I am starting to think that I need to be
something else here as at the client side, for example OpenRTSP, isn't the
exact same image.
For example, if I connect to an IP camera, streaming MJPEG, with OpenRTSP I
can get an image saved as a JPEG using:
./openRTSP -m rtsp://....
I then use this same image with the code below and use openRTSP again to
stream the image and I get something far blockier.
Where am I going wrong?
Thanks in advance
Andy
TestJPEGVideoSource* TestJPEGVideoSource::createNew(UsageEnvironment& env,
const char * fileName, unsigned int timePerFrame)
{
FILE * fid = fopen( fileName, "r" );
if ( fid == NULL )
{
env.setResultErrMsg( "Failed to open input device file" );
return NULL;
}
return new TestJPEGVideoSource( env, fid, timePerFrame );
}
TestJPEGVideoSource::TestJPEGVideoSource(UsageEnvironment& env, FILE* fid,
unsigned int timePerFrame)
: JPEGVideoSource(env), fFid(fid), fTimePerFrame(timePerFrame),
fNeedAFrame(False)
{
this->buffer = NULL;
fseek( fid, 0L, SEEK_END );
size_t sz = ftell( fFid );
fseek( fid, 0L, SEEK_SET );
buffer = new unsigned char[ sz ];
fread( buffer, 1, sz, fid );
bool sof0 = false;
bool sos = false;
this->sosIndex = 0;
this->sosSize = 0;
for ( int i = 0; i < (int)(sz - 8); ++i )
{
if ( buffer[i] == 0xFF && buffer[i+1] == 0xC0)
{
fLastHeight = (buffer[i+5]<<5)|(buffer[i+6]>>3);
fLastWidth = (buffer[i+7]<<5)|(buffer[i+8]>>3);
if ( sos && sof0 ) break;
}
else if ( buffer[i] == 0xFF && buffer[i+1] == 0xDA )
{
sosIndex = i + 2;
if ( sos && sof0 ) break;
}
}
if ( this->sosIndex > 0 )
this->sosSize = sz - this->sosIndex;
printf( "Streaming image w=%d h=%d total_size=%d sos_size=%d\n", fLastWidth
* 8, fLastHeight * 8, (int)sz, this->sosSize );
fclose(fFid);
}
TestJPEGVideoSource::~TestJPEGVideoSource()
{
if ( this->buffer ) delete [] buffer;
}
void TestJPEGVideoSource::doGetNextFrame()
{
fFrameSize = this->sosSize;
if ( fFrameSize > fMaxSize )
{
printf( "Truncating frame!!\n" );
fNumTruncatedBytes = fFrameSize - fMaxSize;
fFrameSize = fMaxSize;
}
memcpy( fTo, this->buffer + this->sosIndex, fFrameSize );
if ( fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0 )
{
gettimeofday( &fPresentationTime, NULL );
}
else
{
unsigned uSeconds = fPresentationTime.tv_usec + ( fTimePerFrame * 1000 );
fPresentationTime.tv_sec += uSeconds / 1000000;
fPresentationTime.tv_usec = uSeconds % 1000000;
}
fDurationInMicroseconds = fTimePerFrame * 1000;
nextTask() = envir().taskScheduler().scheduleDelayedTask( 0,
(TaskFunc*)FramedSource::afterGetting, this );
}
u_int8_t TestJPEGVideoSource::type()
{
return 1;
}
u_int8_t TestJPEGVideoSource::qFactor()
{
return 65;
}
u_int8_t TestJPEGVideoSource::width()
{
return fLastWidth;
}
u_int8_t TestJPEGVideoSource::height()
{
return fLastHeight;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20100630/49fa70eb/attachment-0001.html>
More information about the live-devel
mailing list