[vlc-devel] Video quality patches for vlc (based on 0.9.8a)

Bryan Moore bmoore at airgain.com
Thu Apr 9 23:38:40 CEST 2009


 

See three "FIX" items below

 

[ Re-submitting because it didn't show up in the digest as I wasn't yet
in vlc-devel. ]

 

ref:
"http://forum.videolan.org/viewtopic.php?f=7&t=57973&p=193157#p193157"

 

Based on information that was explained in detail in the above post, we
are proposing 3 sets of patches to vlc to correct problems that reduce
video playback quality, particularly for streaming H.264 video, and also
video playback via X11 and XVideo (in general).

 

As stated in the subject line, these patches were tested on 0.9.8a and
appear to apply as well to the latest 'git' repository fetch.

 

NOTE:  code changes surrounded by comments, 'Airgain begin' and 'Airgain
end'

 

FIX #1: frame buffer size

 

modules/demux/live555.cpp file, function 'SessionsSetup', assignments to
'tk->' members: use 'i_buffer' in lieu of hard-coded 

65536 for initial buffer size.

 

  // Airgain begin - increase video buffer to 'i_buffer' bytes (see
above)

  // tk->i_buffer = 65536;

  // tk->p_buffer = (uint8_t *)malloc( 65536 );

  tk->i_buffer = i_buffer;

  tk->p_buffer = (uint8_t *)malloc( i_buffer );

  // Airgain end

 

 

FIX #2: correct I-frame timing

 

file include/vlc_block.h, function 'block_ChainExtract'

 

 

static size_t block_ChainExtract( block_t *p_list, void *p_data, size_t
i_max )

{

   size_t i_total = 0;

   uint8_t *p = (uint8_t*)p_data;

   // Airgain begin

   block_t *p_list0 = p_list;

   // Airgain end

 

   while( p_list && i_max )

   {

     size_t i_copy = __MIN( i_max, p_list->i_buffer );

     memcpy( p, p_list->p_buffer, i_copy );

     i_max -= i_copy;

     i_total += i_copy;

     p += i_copy;

     // Airgain begin

     if(!p_list0->i_dts && !p_list0->i_pts)

     {

       p_list0->i_dts = p_list->i_dts;

       p_list0->i_pts = p_list->i_pts;

     }

     // Airgain end

     p_list = p_list->p_next;

   }

   return i_total;

}

 

file modules/packetizer/h264.c, function 'ParseNALBlock', near the end

 

   /* Append the block */

   if( p_frag )

     block_ChainAppend( &p_sys->p_frame, p_frag );

 

   *pb_used_ts = false;

   if( p_sys->i_frame_dts < 0 && p_sys->i_frame_pts < 0 )

   {

     // Airgain begin - if B frame or i_frag_pts is zero, do NOT assign
frame [pd]ts !

     if(i_frag_pts && p_sys->slice.i_frame_type != 8)

     {

     // Airgain end

     p_sys->i_frame_dts = i_frag_dts;

     p_sys->i_frame_pts = i_frag_pts;

     *pb_used_ts = true;

     // Airgain begin

     }

     // Airgain end

   }

   return p_pic;

}

 

file modules/packetizer/h264.c, function 'OutputPicture', also near the
end

 

   else

   {

     p_pic = block_ChainGather( p_sys->p_frame );

   }

   // Airgain begin - do not assign i_[pd]ts from frame [pd]ts unless
mine are <= 0

   if(p_pic->i_dts <= 0 && p_pic->i_pts <= 0)

   {

   // Airgain end

   p_pic->i_dts = p_sys->i_frame_dts;

   p_pic->i_pts = p_sys->i_frame_pts;

   // Airgain begin

   }

   // Airgain end

   p_pic->i_length = 0; /* FIXME */

   p_pic->i_flags |= p_sys->slice.i_frame_type;

 

   p_sys->slice.i_frame_type = 0;

   p_sys->p_frame = NULL;

   p_sys->i_frame_dts = -1;

   p_sys->i_frame_pts = -1;

   p_sys->b_slice = false;

 

   return p_pic;

}

 

 

 

FIX #3:  (X11 only) - using XFlush + usleep to send commands to XServer
and thread-switch _before_ XSync

 

 

file modules/video_output/x11/xcommon.c, function 'DisplayVideo', near
the end

 

 

   }

 

   // Airgain begin - XFlush to send commands, usleep to force context
switch.

   // This is likely to help client/server interaction

   XFlush( p_vout->p_sys->p_display ); // force commands to be sent

   usleep(500); // then switch contexts before waiting

   // Airgain end

 

   /* Make sure the command is sent now - do NOT use XFlush !*/

   XSync( p_vout->p_sys->p_display, False );

 

   vlc_mutex_unlock( &p_vout->p_sys->lock );

}

 

Regards,

Bryan M for Bob F

http://www.Airgain.com <http://www.airgain.com/> 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20090409/8df95f96/attachment.html>


More information about the vlc-devel mailing list