You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

184 lines
9.7 KiB

/*******************************************************************************
* video_output.h : video output thread
* (c)1999 VideoLAN
*******************************************************************************
* This module describes the programming interface for video output threads.
* It includes functions allowing to open a new thread, send pictures to a
* thread, and destroy a previously oppenned video output thread.
*******************************************************************************
* Requires:
* <pthread.h>
* "config.h"
* "common.h"
* "mtime.h"
* "video.h"
*******************************************************************************/
/* ?? this over-complicated API and code should be re-designed, with a simple
* video-stream associated to a window (each window designed to be openned in
* a parent one and probably without border), and have an api looking like
* vout_CreateWindow
* vout_DestroyWindow
* vout_AddPicture
* vout_RemovePicture
* vout_ReservePicture
* vout_AddReservedPicture
* vout_Clear
* vout_Refresh
*
* the overlay/transparent, permanent and such stuff should disapear.
*/
/*******************************************************************************
* vout_stream_t: video stream descriptor
*******************************************************************************
* Each video stream has a set of properties, stored in this structure. It is
* part of vout_thread_t and is not supposed to be used anywhere else.
*******************************************************************************/
typedef struct
{
int i_status; /* is stream active ? */
picture_t * p_next_picture; /* next picture to be displayed */
#ifdef STATS
/* Statistics */
count_t c_pictures; /* total number of pictures added */
count_t c_rendered_pictures; /* number of rendered pictures */
#endif
} vout_stream_t;
/* Video stream status */
#define VOUT_INACTIVE_STREAM 0 /* stream is inactive (empty) */
#define VOUT_ACTIVE_STREAM 1 /* stream is active */
#define VOUT_ENDING_STREAM 2 /* stream will be destroyed when empty */
#define VOUT_DESTROYED_STREAM 3 /* stream must be destroyed */
/*******************************************************************************
* vout_thread_t: video output thread descriptor
*******************************************************************************
* Any independant video output device, such as an X11 window, is represented
* by a video output thread, and described using following structure.
*******************************************************************************/
typedef struct vout_thread_s
{
/* Thread properties and locks */
boolean_t b_die; /* `die' flag */
boolean_t b_error; /* `error' flag */
boolean_t b_active; /* `active' flag */
pthread_t thread_id; /* id for pthread functions */
pthread_mutex_t streams_lock; /* streams modification lock */
pthread_mutex_t pictures_lock; /* pictures modification lock */
int * pi_status; /* temporary status flag */
/* Common display properties */
int i_width; /* current output method width */
int i_height; /* current output method height */
int i_screen_depth; /* bits per pixel */
int i_bytes_per_pixel; /* real screen depth */
/* Output method */
struct vout_x11_s * p_x11; /* X11 output method */
/* Video heap */
int i_max_pictures; /* heap maximal size */
int i_pictures; /* current heap size */
picture_t * p_picture; /* pictures */
/* Streams data */
vout_stream_t p_stream[VOUT_MAX_STREAMS]; /* streams data */
#ifdef STATS
/* Statistics */
count_t c_loops; /* number of loops */
count_t c_idle_loops; /* number of idle loops */
count_t c_pictures; /* number of pictures added to heap */
count_t c_rendered_pictures; /* number of pictures rendered */
#endif
/* Rendering functions - these functions are of vout_render_blank_t and
* vout_render_line_t, but are not declared here using these types since
* they require vout_thread_t to be defined */
void (* RenderRGBBlank) ( struct vout_thread_s *p_vout, pixel_t pixel,
int i_x, int i_y, int i_width, int i_height );
void (* RenderPixelBlank) ( struct vout_thread_s *p_vout, pixel_t pixel,
int i_x, int i_y, int i_width, int i_height );
void (* RenderRGBLine) ( struct vout_thread_s *p_vout, picture_t *p_pic,
int i_x, int i_y, int i_pic_x, int i_pic_y,
int i_width, int i_line_width, int i_ratio );
void (* RenderPixelLine) ( struct vout_thread_s *p_vout, picture_t *p_pic,
int i_x, int i_y, int i_pic_x, int i_pic_y,
int i_width, int i_line_width, int i_ratio );
void (* RenderRGBMaskLine) ( struct vout_thread_s *p_vout, picture_t *p_pic,
int i_x, int i_y, int i_pic_x, int i_pic_y,
int i_width, int i_line_width, int i_ratio );
void (* RenderPixelMaskLine) ( struct vout_thread_s *p_vout, picture_t *p_pic,
int i_x, int i_y, int i_pic_x, int i_pic_y,
int i_width, int i_line_width, int i_ratio );
/* ?? add YUV types */
} vout_thread_t;
/*******************************************************************************
* vout_render_blank_t: blank rendering function
* vout_render_line_t: rectangle rendering functions
*******************************************************************************
* All rendering functions should be of these types - for blank pictures
* (pictures with uniform color), blank rendering functions are called once. For
* other pictures, each function is called once for each picture line. Note that
* the part of the picture sent to the rendering functions is in the output
* window, since the clipping is done before.
* p_vout is the calling thread
* pixel is the color or pixel value of the rectange to be drawn
* p_pic is the picture to be rendered
* i_x, i_y is the absolute position in output window
* i_pic_x is the first pixel to be drawn in the picture
* i_pic_y is the line of the picture to be drawn
* i_width is the width of the area to be rendered in the picture (not in the
* output window), except for blank pictures, where it is the absolute size
* of the area to be rendered
* i_height is the height og the area to be rendered
* i_line_width is the number of time the line must be copied
* i_ratio is the horizontal display ratio
*******************************************************************************/
typedef void (vout_render_blank_t)( vout_thread_t *p_vout, pixel_t pixel,
int i_x, int i_y, int i_width, int i_height );
typedef void (vout_render_line_t) ( vout_thread_t *p_vout, picture_t *p_pic,
int i_x, int i_y, int i_pic_x, int i_pic_y,
int i_width, int i_line_width, int i_ratio );
/*******************************************************************************
* Prototypes
*******************************************************************************/
vout_thread_t * vout_CreateThread ( video_cfg_t *p_cfg, int *pi_status );
void vout_DestroyThread ( vout_thread_t *p_vout, int *pi_status );
picture_t * vout_DisplayPicture ( vout_thread_t *p_vout, picture_t *p_pic );
picture_t * vout_DisplayPictureCopy ( vout_thread_t *p_vout, picture_t *p_pic );
picture_t * vout_DisplayPictureReplicate ( vout_thread_t *p_vout, picture_t *p_pic );
picture_t * vout_DisplayReservedPicture ( vout_thread_t *p_vout, picture_t *p_pic );
picture_t * vout_CreateReservedPicture ( vout_thread_t *p_vout, video_cfg_t *p_cfg );
picture_t * vout_ReservePicture ( vout_thread_t *p_vout, picture_t *p_pic );
picture_t * vout_ReservePictureCopy ( vout_thread_t *p_vout, picture_t *p_pic );
picture_t * vout_ReservePictureReplicate ( vout_thread_t *p_vout, picture_t *p_pic );
void vout_RemovePicture ( vout_thread_t *p_vout, picture_t *p_pic );
void vout_RefreshPermanentPicture ( vout_thread_t *p_vout, picture_t *p_pic,
mtime_t displa_date );
void vout_LinkPicture ( vout_thread_t *p_vout, picture_t *p_pic );
void vout_UnlinkPicture ( vout_thread_t *p_vout, picture_t *p_pic );
int vout_CreateStream ( vout_thread_t *p_vout );
void vout_EndStream ( vout_thread_t *p_vout, int i_stream );
void vout_DestroyStream ( vout_thread_t *p_vout, int i_stream );
#ifdef DEBUG
void vout_PrintHeap ( vout_thread_t *p_vout, char *psz_str );
#endif