[vlc-devel] Video quality patches for vlc (based on 0.9.8a)
    Bryan Moore 
    bmoore at airgain.com
       
    Thu Apr  9 20:09:57 CEST 2009
    
    
  
 
See three "FIX" items below
 
ref:
"http://forum.videolan.org/viewtopic.php?f=7&t=57973&p=193157#p193157"
 
Based on information that was extrapolated 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
the problems appear to exist in 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 );
}
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20090409/419b5b9b/attachment.html>
    
    
More information about the vlc-devel
mailing list