* It needs locking since several pictures can be created by several producers
* threads.
*/
+int vout_CountPictureAvailable( vout_thread_t *p_vout )
+{
+ int i_free = 0;
+ int i_pic;
+
+ vlc_mutex_lock( &p_vout->picture_lock );
+ for( i_pic = 0; i_pic < I_RENDERPICTURES; i_pic++ )
+ {
+ picture_t *p_pic = PP_RENDERPICTURE[(p_vout->render.i_last_used_pic + i_pic + 1) % I_RENDERPICTURES];
+
+ switch( p_pic->i_status )
+ {
+ case DESTROYED_PICTURE:
+ i_free++;
+ break;
+
+ case FREE_PICTURE:
+ i_free++;
+ break;
+
+ default:
+ break;
+ }
+ }
+ vlc_mutex_unlock( &p_vout->picture_lock );
+
+ return i_free;
+}
+
picture_t *vout_CreatePicture( vout_thread_t *p_vout,
bool b_progressive,
bool b_top_field_first,
for( i = 0; i < p_src->i_planes ; i++ )
{
+ const unsigned i_width = __MIN( p_dst->p[i].i_visible_pitch,
+ p_src->p[i].i_visible_pitch );
+ const unsigned i_height = __MIN( p_dst->p[i].i_visible_lines,
+ p_src->p[i].i_visible_lines );
+
if( p_src->p[i].i_pitch == p_dst->p[i].i_pitch )
{
/* There are margins, but with the same width : perfect ! */
vlc_memcpy( p_dst->p[i].p_pixels, p_src->p[i].p_pixels,
- p_src->p[i].i_pitch * p_src->p[i].i_visible_lines );
+ p_src->p[i].i_pitch * i_height );
}
else
{
assert( p_in );
assert( p_out );
- for( i_line = p_src->p[i].i_visible_lines; i_line--; )
+ for( i_line = i_height; i_line--; )
{
- vlc_memcpy( p_out, p_in, p_src->p[i].i_visible_pitch );
+ vlc_memcpy( p_out, p_in, i_width );
p_in += p_src->p[i].i_pitch;
p_out += p_dst->p[i].i_pitch;
}