X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvout_pictures.c;h=55895f756c99b62e481215e75984058d65ae09b1;hb=32b31e87d90967549e5cc8bef18d5aae7e3b98c6;hp=44ab4c2e6ffe6106fef07f215adc807d57ff5910;hpb=5cc4255aa74f938e38cbdd9dcca4136475a4bc3f;p=vlc diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c index 44ab4c2e6f..55895f756c 100644 --- a/src/video_output/vout_pictures.c +++ b/src/video_output/vout_pictures.c @@ -106,6 +106,35 @@ void vout_DatePicture( vout_thread_t *p_vout, * 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, @@ -607,6 +636,8 @@ void vout_InitFormat( video_frame_format_t *p_format, vlc_fourcc_t i_chroma, break; case FOURCC_GREY: + case FOURCC_Y800: + case FOURCC_Y8: p_format->i_bits_per_pixel = 8; break; @@ -836,6 +867,8 @@ int __vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, break; case FOURCC_GREY: + case FOURCC_Y800: + case FOURCC_Y8: p_pic->p->i_lines = i_height_aligned; p_pic->p->i_visible_lines = i_height; p_pic->p->i_pitch = i_width_aligned; @@ -845,8 +878,9 @@ int __vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, break; default: - msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)", - i_chroma, (char*)&i_chroma ); + if( p_this ) + msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)", + i_chroma, (char*)&i_chroma ); p_pic->i_planes = 0; return VLC_EGENERIC; } @@ -911,6 +945,20 @@ int vout_ChromaCmp( vlc_fourcc_t i_chroma, vlc_fourcc_t i_amorhc ) return 0; } + case FOURCC_GREY: + case FOURCC_Y800: + case FOURCC_Y8: + switch( i_amorhc ) + { + case FOURCC_GREY: + case FOURCC_Y800: + case FOURCC_Y8: + return 1; + + default: + return 0; + } + default: return 0; } @@ -926,38 +974,98 @@ int vout_ChromaCmp( vlc_fourcc_t i_chroma, vlc_fourcc_t i_amorhc ) void __vout_CopyPicture( vlc_object_t *p_this, picture_t *p_dest, picture_t *p_src ) { - VLC_UNUSED( p_this ); + VLC_UNUSED(p_this); + picture_Copy( p_dest, p_src ); +} + +/***************************************************************************** + * + *****************************************************************************/ +static void PictureReleaseCallback( picture_t *p_picture ) +{ + if( --p_picture->i_refcount > 0 ) + return; + picture_Delete( p_picture ); +} +/***************************************************************************** + * + *****************************************************************************/ +picture_t *picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_aspect ) +{ + picture_t *p_picture = malloc( sizeof(*p_picture) ); + + if( !p_picture ) + return NULL; + + memset( p_picture, 0, sizeof(*p_picture) ); + if( __vout_AllocatePicture( NULL, p_picture, + i_chroma, i_width, i_height, i_aspect ) ) + { + free( p_picture ); + return NULL; + } + + p_picture->i_refcount = 1; + p_picture->pf_release = PictureReleaseCallback; + p_picture->i_status = RESERVED_PICTURE; + + return p_picture; +} + +/***************************************************************************** + * + *****************************************************************************/ +void picture_Delete( picture_t *p_picture ) +{ + assert( p_picture && p_picture->i_refcount == 0 ); + + free( p_picture->p_data_orig ); + free( p_picture->p_sys ); + free( p_picture ); +} + +/***************************************************************************** + * + *****************************************************************************/ +void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ) +{ int i; for( i = 0; i < p_src->i_planes ; i++ ) { - if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch ) + 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_dest->p[i].p_pixels, p_src->p[i].p_pixels, - p_src->p[i].i_pitch * p_src->p[i].i_visible_lines ); + vlc_memcpy( p_dst->p[i].p_pixels, p_src->p[i].p_pixels, + p_src->p[i].i_pitch * i_height ); } else { /* We need to proceed line by line */ uint8_t *p_in = p_src->p[i].p_pixels; + uint8_t *p_out = p_dst->p[i].p_pixels; + int i_line; + assert( p_in ); - uint8_t *p_out = p_dest->p[i].p_pixels; assert( p_out ); - int i_line; - 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_dest->p[i].i_pitch; + p_out += p_dst->p[i].i_pitch; } } } - - p_dest->date = p_src->date; - p_dest->b_force = p_src->b_force; - p_dest->i_nb_fields = p_src->i_nb_fields; - p_dest->b_progressive = p_src->b_progressive; - p_dest->b_top_field_first = p_src->b_top_field_first; } + +/***************************************************************************** + * + *****************************************************************************/ + +