Commit d2b5c3ac authored by Gildas Bazin's avatar Gildas Bazin

* include/vlc_video.h, src/video_output/vout_pictures.c: export vout_CopyPicture().

parent e9abcc11
...@@ -216,8 +216,6 @@ VLC_EXPORT( int, vout_ChromaCmp, ( uint32_t, uint32_t ) ); ...@@ -216,8 +216,6 @@ VLC_EXPORT( int, vout_ChromaCmp, ( uint32_t, uint32_t ) );
VLC_EXPORT( picture_t *, vout_CreatePicture, ( vout_thread_t *, vlc_bool_t, vlc_bool_t, unsigned int ) ); VLC_EXPORT( picture_t *, vout_CreatePicture, ( vout_thread_t *, vlc_bool_t, vlc_bool_t, unsigned int ) );
VLC_EXPORT( void, vout_InitFormat, ( video_frame_format_t *, uint32_t, int, int, int ) ); VLC_EXPORT( void, vout_InitFormat, ( video_frame_format_t *, uint32_t, int, int, int ) );
VLC_EXPORT( void, vout_InitPicture, ( vlc_object_t *, picture_t *, uint32_t, int, int, int ) );
VLC_EXPORT( void, vout_AllocatePicture,( vlc_object_t *, picture_t *, uint32_t, int, int, int ) );
VLC_EXPORT( void, vout_DestroyPicture, ( vout_thread_t *, picture_t * ) ); VLC_EXPORT( void, vout_DestroyPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void, vout_DisplayPicture, ( vout_thread_t *, picture_t * ) ); VLC_EXPORT( void, vout_DisplayPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void, vout_DatePicture, ( vout_thread_t *, picture_t *, mtime_t ) ); VLC_EXPORT( void, vout_DatePicture, ( vout_thread_t *, picture_t *, mtime_t ) );
......
...@@ -299,7 +299,48 @@ struct subpicture_t ...@@ -299,7 +299,48 @@ struct subpicture_t
* \param i_aspect_x the decoded x-axis portion of i_aspect. This is set. * \param i_aspect_x the decoded x-axis portion of i_aspect. This is set.
* \param i_aspect_y the decoded y-axis portion of i_aspect This is set. * \param i_aspect_y the decoded y-axis portion of i_aspect This is set.
*/ */
VLC_EXPORT( void, vout_AspectRatio, ( unsigned int i_aspect, unsigned int *i_aspect_x, unsigned int *i_aspect_y ) ); VLC_EXPORT( void, vout_AspectRatio, ( unsigned int i_aspect, unsigned int *i_aspect_x, unsigned int *i_aspect_y ) );
/**
* vout_CopyPicture
*
* Copy the source picture onto the destination picture.
* \param p_this a vlc object
* \param p_dst pointer to the destination picture.
* \param p_src pointer to the source picture.
*/
#define vout_CopyPicture(a,b,c) __vout_CopyPicture(VLC_OBJECT(a),b,c)
VLC_EXPORT( void, __vout_CopyPicture, ( vlc_object_t *p_this, picture_t *p_dst, picture_t *p_src ) );
/**
* vout_InitPicture
*
* Initialise different fields of a picture_t (but does not allocate memory).
* \param p_this a vlc object
* \param p_pic pointer to the picture structure.
* \param i_chroma the wanted chroma for the picture.
* \param i_width the wanted width for the picture.
* \param i_height the wanted height for the picture.
* \param i_aspect the wanted aspect ratio for the picture.
*/
#define vout_InitPicture(a,b,c,d,e,f) \
__vout_InitPicture(VLC_OBJECT(a),b,c,d,e,f)
VLC_EXPORT( int, __vout_InitPicture, ( vlc_object_t *p_this, picture_t *p_pic, uint32_t i_chroma, int i_width, int i_height, int i_aspect ) );
/**
* vout_AllocatePicture
*
* Initialise different fields of a picture_t and allocates the picture buffer.
* \param p_this a vlc object
* \param p_pic pointer to the picture structure.
* \param i_chroma the wanted chroma for the picture.
* \param i_width the wanted width for the picture.
* \param i_height the wanted height for the picture.
* \param i_aspect the wanted aspect ratio for the picture.
*/
#define vout_AllocatePicture(a,b,c,d,e,f) \
__vout_AllocatePicture(VLC_OBJECT(a),b,c,d,e,f)
VLC_EXPORT( int, __vout_AllocatePicture,( vlc_object_t *p_this, picture_t *p_pic, uint32_t i_chroma, int i_width, int i_height, int i_aspect ) );
/**@}*/ /**@}*/
......
...@@ -36,11 +36,6 @@ ...@@ -36,11 +36,6 @@
#include "vout_pictures.h" #include "vout_pictures.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static void CopyPicture( vout_thread_t *, picture_t *, picture_t * );
/** /**
* Display a picture * Display a picture
* *
...@@ -310,7 +305,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -310,7 +305,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
/* We have subtitles. First copy the picture to /* We have subtitles. First copy the picture to
* the spare direct buffer, then render the * the spare direct buffer, then render the
* subtitles. */ * subtitles. */
CopyPicture( p_vout, p_pic, PP_OUTPUTPICTURE[0] ); vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
vout_RenderSubPictures( p_vout, PP_OUTPUTPICTURE[0], vout_RenderSubPictures( p_vout, PP_OUTPUTPICTURE[0],
p_pic , p_subpic ); p_pic , p_subpic );
...@@ -349,7 +344,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -349,7 +344,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
return NULL; return NULL;
} }
CopyPicture( p_vout, p_pic, PP_OUTPUTPICTURE[0] ); vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
vout_RenderSubPictures( p_vout, PP_OUTPUTPICTURE[0], p_pic, p_subpic ); vout_RenderSubPictures( p_vout, PP_OUTPUTPICTURE[0], p_pic, p_subpic );
if( PP_OUTPUTPICTURE[0]->pf_unlock ) if( PP_OUTPUTPICTURE[0]->pf_unlock )
...@@ -390,7 +385,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -390,7 +385,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) ) if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) )
return NULL; return NULL;
CopyPicture( p_vout, p_tmp_pic, &p_vout->p_picture[0] ); vout_CopyPicture( p_vout, &p_vout->p_picture[0], p_tmp_pic );
} }
else else
{ {
...@@ -494,9 +489,9 @@ void vout_PlacePicture( vout_thread_t *p_vout, ...@@ -494,9 +489,9 @@ void vout_PlacePicture( vout_thread_t *p_vout,
* used exactly like a video buffer. The video output thread then manages * used exactly like a video buffer. The video output thread then manages
* how it gets displayed. * how it gets displayed.
*/ */
void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic, int __vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic,
vlc_fourcc_t i_chroma, vlc_fourcc_t i_chroma,
int i_width, int i_height, int i_aspect ) int i_width, int i_height, int i_aspect )
{ {
int i_bytes, i_index, i_width_aligned, i_height_aligned; int i_bytes, i_index, i_width_aligned, i_height_aligned;
...@@ -504,8 +499,12 @@ void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic, ...@@ -504,8 +499,12 @@ void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic,
i_width_aligned = (i_width + 15) >> 4 << 4; i_width_aligned = (i_width + 15) >> 4 << 4;
i_height_aligned = (i_height + 15) >> 4 << 4; i_height_aligned = (i_height + 15) >> 4 << 4;
vout_InitPicture( p_this, p_pic, i_chroma, if( vout_InitPicture( p_this, p_pic, i_chroma,
i_width, i_height, i_aspect ); i_width, i_height, i_aspect ) != VLC_SUCCESS )
{
p_pic->i_planes = 0;
return VLC_EGENERIC;
}
/* Calculate how big the new image should be */ /* Calculate how big the new image should be */
i_bytes = p_pic->format.i_bits_per_pixel * i_bytes = p_pic->format.i_bits_per_pixel *
...@@ -516,7 +515,7 @@ void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic, ...@@ -516,7 +515,7 @@ void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic,
if( p_pic->p_data == NULL ) if( p_pic->p_data == NULL )
{ {
p_pic->i_planes = 0; p_pic->i_planes = 0;
return; return VLC_EGENERIC;
} }
/* Fill the p_pixels field for each plane */ /* Fill the p_pixels field for each plane */
...@@ -527,6 +526,8 @@ void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic, ...@@ -527,6 +526,8 @@ void vout_AllocatePicture( vlc_object_t *p_this, picture_t *p_pic,
p_pic->p[i_index].p_pixels = p_pic->p[i_index-1].p_pixels + p_pic->p[i_index].p_pixels = p_pic->p[i_index-1].p_pixels +
p_pic->p[i_index-1].i_lines * p_pic->p[i_index-1].i_pitch; p_pic->p[i_index-1].i_lines * p_pic->p[i_index-1].i_pitch;
} }
return VLC_SUCCESS;
} }
/** /**
...@@ -619,9 +620,9 @@ void vout_InitFormat( video_frame_format_t *p_format, vlc_fourcc_t i_chroma, ...@@ -619,9 +620,9 @@ void vout_InitFormat( video_frame_format_t *p_format, vlc_fourcc_t i_chroma,
* \param i_height The height of the picture * \param i_height The height of the picture
* \param i_aspect The aspect ratio of the picture * \param i_aspect The aspect ratio of the picture
*/ */
void vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, int __vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic,
vlc_fourcc_t i_chroma, vlc_fourcc_t i_chroma,
int i_width, int i_height, int i_aspect ) int i_width, int i_height, int i_aspect )
{ {
int i_index, i_width_aligned, i_height_aligned; int i_index, i_width_aligned, i_height_aligned;
...@@ -826,8 +827,10 @@ void vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, ...@@ -826,8 +827,10 @@ void vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic,
msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)", msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)",
i_chroma, (char*)&i_chroma ); i_chroma, (char*)&i_chroma );
p_pic->i_planes = 0; p_pic->i_planes = 0;
return; return VLC_EGENERIC;
} }
return VLC_SUCCESS;
} }
/** /**
...@@ -892,17 +895,15 @@ int vout_ChromaCmp( vlc_fourcc_t i_chroma, vlc_fourcc_t i_amorhc ) ...@@ -892,17 +895,15 @@ int vout_ChromaCmp( vlc_fourcc_t i_chroma, vlc_fourcc_t i_amorhc )
} }
} }
/* Following functions are local */
/***************************************************************************** /*****************************************************************************
* CopyPicture: copy a picture to another one * vout_CopyPicture: copy a picture to another one
***************************************************************************** *****************************************************************************
* This function takes advantage of the image format, and reduces the * This function takes advantage of the image format, and reduces the
* number of calls to memcpy() to the minimum. Source and destination * number of calls to memcpy() to the minimum. Source and destination
* images must have same width (hence i_visible_pitch), height, and chroma. * images must have same width (hence i_visible_pitch), height, and chroma.
*****************************************************************************/ *****************************************************************************/
static void CopyPicture( vout_thread_t * p_vout, void __vout_CopyPicture( vlc_object_t *p_this,
picture_t *p_src, picture_t *p_dest ) picture_t *p_dest, picture_t *p_src )
{ {
int i; int i;
...@@ -911,7 +912,7 @@ static void CopyPicture( vout_thread_t * p_vout, ...@@ -911,7 +912,7 @@ static void CopyPicture( vout_thread_t * p_vout,
if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch ) if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch )
{ {
/* There are margins, but with the same width : perfect ! */ /* There are margins, but with the same width : perfect ! */
p_vout->p_vlc->pf_memcpy( p_this->p_vlc->pf_memcpy(
p_dest->p[i].p_pixels, p_src->p[i].p_pixels, 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 ); p_src->p[i].i_pitch * p_src->p[i].i_visible_lines );
} }
...@@ -924,12 +925,13 @@ static void CopyPicture( vout_thread_t * p_vout, ...@@ -924,12 +925,13 @@ static void CopyPicture( vout_thread_t * p_vout,
for( i_line = p_src->p[i].i_visible_lines; i_line--; ) for( i_line = p_src->p[i].i_visible_lines; i_line--; )
{ {
p_vout->p_vlc->pf_memcpy( p_out, p_in, p_this->p_vlc->pf_memcpy( p_out, p_in,
p_src->p[i].i_visible_pitch ); p_src->p[i].i_visible_pitch );
p_in += p_src->p[i].i_pitch; p_in += p_src->p[i].i_pitch;
p_out += p_dest->p[i].i_pitch; p_out += p_dest->p[i].i_pitch;
} }
} }
} }
p_dest->date = p_src->date; p_dest->date = p_src->date;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment