X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvout_pictures.c;h=6b233df012d5433e0f1b154ab819b4305963d793;hb=aec5639a63df6867032b76e71fe2add85919f992;hp=f857595173269531a6699e166fc95adbb5fa97fb;hpb=97d37e899f5072da2faeadbea12a864ec4d38ba7;p=vlc diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c index f857595173..6b233df012 100644 --- a/src/video_output/vout_pictures.c +++ b/src/video_output/vout_pictures.c @@ -19,24 +19,25 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* free() */ -#include /* sprintf() */ -#include /* strerror() */ -#include - -#include "vlc_video.h" -#include "video_output.h" -#include "vlc_spu.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include +#include +#include +#include #include "vout_pictures.h" +#include + /** * Display a picture * @@ -106,8 +107,8 @@ void vout_DatePicture( vout_thread_t *p_vout, * threads. */ picture_t *vout_CreatePicture( vout_thread_t *p_vout, - vlc_bool_t b_progressive, - vlc_bool_t b_top_field_first, + bool b_progressive, + bool b_top_field_first, unsigned int i_nb_fields ) { int i_pic; /* picture index */ @@ -219,7 +220,7 @@ void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic ) { vlc_mutex_lock( &p_vout->picture_lock ); -#ifdef DEBUG +#ifndef NDEBUG /* Check if picture status is valid */ if( (p_pic->i_status != RESERVED_PICTURE) && (p_pic->i_status != RESERVED_DATED_PICTURE) && @@ -259,13 +260,6 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) vlc_mutex_lock( &p_vout->picture_lock ); p_pic->i_refcount--; - if( p_pic->i_refcount < 0 ) - { - msg_Err( p_vout, "picture %p refcount is %i", - p_pic, p_pic->i_refcount ); - p_pic->i_refcount = 0; - } - if( ( p_pic->i_refcount == 0 ) && ( p_pic->i_status == DISPLAYED_PICTURE ) ) { @@ -379,10 +373,13 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, p_vout->fmt_out.i_aspect ); p_tmp_pic->i_type = MEMORY_PICTURE; p_tmp_pic->i_status = RESERVED_PICTURE; + /* some modules (such as blend) needs to know the extra information in picture heap */ + p_tmp_pic->p_heap = &p_vout->output; } /* Convert image to the first direct buffer */ - p_vout->chroma.pf_convert( p_vout, p_pic, p_tmp_pic ); + p_vout->p_chroma->p_owner = (filter_owner_sys_t *)p_tmp_pic; + p_vout->p_chroma->pf_video_filter( p_vout->p_chroma, p_pic ); /* Render subpictures on the first direct buffer */ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_tmp_pic, @@ -402,7 +399,8 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, return NULL; /* Convert image to the first direct buffer */ - p_vout->chroma.pf_convert( p_vout, p_pic, &p_vout->p_picture[0] ); + p_vout->p_chroma->p_owner = (filter_owner_sys_t *)&p_vout->p_picture[0]; + p_vout->p_chroma->pf_video_filter( p_vout->p_chroma, p_pic ); /* Render subpictures on the first direct buffer */ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, @@ -573,7 +571,6 @@ void vout_InitFormat( video_frame_format_t *p_format, vlc_fourcc_t i_chroma, case FOURCC_YUY2: case FOURCC_UYVY: case FOURCC_J422: - p_format->i_bits_per_pixel = 16; p_format->i_bits_per_pixel = 16; break; case FOURCC_I411: @@ -595,6 +592,7 @@ void vout_InitFormat( video_frame_format_t *p_format, vlc_fourcc_t i_chroma, break; case FOURCC_RV32: + case FOURCC_RGBA: p_format->i_bits_per_pixel = 32; break; case FOURCC_RV24: @@ -607,6 +605,13 @@ void vout_InitFormat( video_frame_format_t *p_format, vlc_fourcc_t i_chroma, case FOURCC_RGB2: p_format->i_bits_per_pixel = 8; break; + + case FOURCC_GREY: + case FOURCC_Y800: + case FOURCC_Y8: + p_format->i_bits_per_pixel = 8; + break; + default: p_format->i_bits_per_pixel = 0; break; @@ -823,6 +828,7 @@ int __vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, break; case FOURCC_RV32: + case FOURCC_RGBA: p_pic->p->i_lines = i_height_aligned; p_pic->p->i_visible_lines = i_height; p_pic->p->i_pitch = i_width_aligned * 4; @@ -831,6 +837,17 @@ int __vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, p_pic->i_planes = 1; 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; + p_pic->p->i_visible_pitch = i_width; + p_pic->p->i_pixel_pitch = 1; + p_pic->i_planes = 1; + break; + default: msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)", i_chroma, (char*)&i_chroma ); @@ -898,6 +915,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; } @@ -913,6 +944,7 @@ 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 ); int i; for( i = 0; i < p_src->i_planes ; i++ ) @@ -920,21 +952,21 @@ void __vout_CopyPicture( vlc_object_t *p_this, if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch ) { /* There are margins, but with the same width : perfect ! */ - p_this->p_vlc->pf_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_dest->p[i].p_pixels, p_src->p[i].p_pixels, + p_src->p[i].i_pitch * p_src->p[i].i_visible_lines ); } else { /* We need to proceed line by line */ uint8_t *p_in = p_src->p[i].p_pixels; + 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--; ) { - p_this->p_vlc->pf_memcpy( p_out, p_in, - p_src->p[i].i_visible_pitch ); + vlc_memcpy( p_out, p_in, p_src->p[i].i_visible_pitch ); p_in += p_src->p[i].i_pitch; p_out += p_dest->p[i].i_pitch; }