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

Felix Paul Kühne fkuehne.videolan at googlemail.com
Fri Apr 10 14:37:26 CEST 2009


Hello Bryan,

thanks for your patches. However, could have a look at this wiki page  
and send future patches this way? http://wiki.videolan.org/Sending_Patches

By doing so, you'll ensure that your patches get in and retain _your_  
copyright. Additionally, it is a lot easier for us to merge these.  
Your current approach is hard to read (compared to normal diffs) and  
takes quite long to merge as it needs to be done manually.

But don't get me wrong. Your contribution is nevertheless welcome :-)

Best regards,

Felix

Am 09.04.2009 um 20:09 schrieb Bryan Moore:

>
> 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 );
> }
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel




More information about the vlc-devel mailing list