[MPlayer-dev-eng] [PATCH] fix frame buffer size in libmpdemux/demux_rtp.cpp

Diego Biurrun diego at biurrun.de
Sat Jan 20 21:49:08 CET 2007


Ross, can you comment on this patch?

On Wed, Jan 17, 2007 at 10:15:30PM +0200, Spectr wrote:
> 
> I work in Elphel, Inc - we make network video cameras with high resolution,
> what send video in RTP MJPEG stream. I try MPlayer RC1 with latest our
> camera, and use official build from latest Ubuntu release, what have live555
> library in his build. All work very good, but limitation of frame size in
> 50KB make broken images in video stream.
> Simple solution - increase this constant in
> libmpdemux/demux_rtp.cpp
> from
> #define MAX_RTP_FRAME_SIZE 50000
> to
> #define MAX_RTP_FRAME_SIZE 5000000
> - but it's not good for all situation, because this frame buffer size not
> small for work with other video streams.
> 
> So, i try solve this problem with this patch, and ask about add this code in
> MPlayer repository - and wait what in next builds of MPlayer this problem be
> solved.
> 
> About path - i add frame size variable, what set by default in 65535 (i use
> all time power of 2 in buffer size, because it's better memory usage for
> system memory allocator); and after this - check next frames - if frame size
> (really, frame size and half of this - for prevent broken frames if image
> size in stream can increase by change complexity of scene, for example) is
> larger than current buffer size - increase buffer size to next near power of
> two. And set upper frame size limit to 4Mb. With this algorithm we have
> first frame of videostream broken - but this is limitation of live555
> library.
> 
> So, this is patch (as output of "diff -Naur" for original and changed
> files):
> 
> --- demux_rtp.cpp.original      2006-10-23 01:32:31.000000000 +0300
> +++ demux_rtp.cpp       2007-01-15 23:30:04.000000000 +0200
> @@ -384,16 +384,26 @@
> 
> ////////// Extra routines that help implement the above interface
> functions:
> 
> -#define MAX_RTP_FRAME_SIZE 50000
> +#define MAX_RTP_FRAME_SIZE 4194304
>     // >= the largest conceivable frame composed from one or more RTP
> packets
> +unsigned long rtp_frame_size = 65536;
> 
> static void afterReading(void* clientData, unsigned frameSize,
> -                        unsigned /*numTruncatedBytes*/,
> +                        unsigned truncSize/*numTruncatedBytes*/,
>                         struct timeval presentationTime,
>                         unsigned /*durationInMicroseconds*/) {
> -  if (frameSize >= MAX_RTP_FRAME_SIZE) {
> -    fprintf(stderr, "Saw an input frame too large (>=%d).  Increase
> MAX_RTP_FRAME_SIZE in \"demux_rtp.cpp\".\n",
> -           MAX_RTP_FRAME_SIZE);
> +  int size = frameSize + truncSize;
> +  size += size / 2;
> +  if (size > rtp_frame_size) {
> +    int i;
> +    int j = size - 1;
> +    for(i = 0; j >>= 1; i++);
> +    rtp_frame_size = 1 << (i + 1);
> +    if(rtp_frame_size > MAX_RTP_FRAME_SIZE) {
> +      fprintf(stderr, "Saw an input frame too large (>=%d).  Increase
> MAX_RTP_FRAME_SIZE in \"demux_rtp.cpp\".\n",
> +            MAX_RTP_FRAME_SIZE);
> +      rtp_frame_size = MAX_RTP_FRAME_SIZE;
> +    }
>   }
>   ReadBufferQueue* bufferQueue = (ReadBufferQueue*)clientData;
>   demuxer_t* demuxer = bufferQueue->ourDemuxer();
> @@ -486,13 +496,13 @@
>   }
> 
>   // Allocate a new packet buffer, and arrange to read into it:
> -  dp = new_demux_packet(MAX_RTP_FRAME_SIZE);
> +  dp = new_demux_packet(rtp_frame_size);
>   bufferQueue->dp = dp;
>   if (dp == NULL) return NULL;
> 
>   // Schedule the read operation:
>   bufferQueue->blockingFlag = 0;
> -  bufferQueue->readSource()->getNextFrame(dp->buffer, MAX_RTP_FRAME_SIZE,
> +  bufferQueue->readSource()->getNextFrame(dp->buffer, rtp_frame_size,
>                                          afterReading, bufferQueue,
>                                          onSourceClosure, bufferQueue);
>   // Block ourselves until data becomes available:



More information about the MPlayer-dev-eng mailing list