X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvideo.h;h=6c0f972a8a830a7009567b5ea4c2a7192e55b59e;hb=1a6617c9845b3531b4d80d2da26093729d088406;hp=c38f0e923f6426eedf2e333e20a5e41a81b5e397;hpb=1e053ea0edc1f1f77a56317764a11c4e088cce3d;p=vlc diff --git a/include/video.h b/include/video.h index c38f0e923f..6c0f972a8a 100644 --- a/include/video.h +++ b/include/video.h @@ -4,7 +4,7 @@ * includes all common video types and constants. ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN - * $Id: video.h,v 1.41 2002/01/07 02:12:29 sam Exp $ + * $Id: video.h,v 1.52 2002/05/28 18:34:42 stef Exp $ * * Authors: Vincent Seguin * @@ -44,11 +44,6 @@ typedef struct plane_s int i_visible_bytes; /* How many real pixels are there ? */ boolean_t b_hidden; /* Are we allowed to write to the margin ? */ - /* Variables used for RGB planes */ - int i_red_mask; - int i_green_mask; - int i_blue_mask; - } plane_t; /***************************************************************************** @@ -65,6 +60,7 @@ typedef struct picture_s * NEVER be modified. A direct buffer can be handled as the plugin * wishes, it can even swap p_pixels buffers. */ u8 *p_data; + void *p_data_orig; /* pointer before memalign */ plane_t p[ VOUT_MAX_PLANES ]; /* description of the planes */ int i_planes; /* number of allocated planes */ @@ -77,6 +73,7 @@ typedef struct picture_s * the video output thread API, but should never be written directly */ int i_refcount; /* link reference counter */ mtime_t date; /* display date */ + boolean_t b_force; /* Picture dynamic properties - those properties can be changed by the * decoder */ @@ -84,10 +81,8 @@ typedef struct picture_s boolean_t b_repeat_first_field; /* RFF bit */ boolean_t b_top_field_first; /* which field is first */ - /* Macroblock counter - the decoder uses it to verify if it has - * decoded all the macroblocks of the picture */ - int i_deccount; - vlc_mutex_t lock_deccount; + /* The picture heap we are attached to */ + struct picture_heap_s* p_heap; /* Private data - the video output plugin might want to put stuff here to * keep track of the picture */ @@ -101,20 +96,34 @@ typedef struct picture_s *****************************************************************************/ typedef struct picture_heap_s { - int i_pictures; /* current heap size */ + int i_pictures; /* current heap size */ /* Picture static properties - those properties are fixed at initialization * and should NOT be modified */ - int i_width; /* picture width */ - int i_height; /* picture height */ - u32 i_chroma; /* picture chroma */ - int i_aspect; /* aspect ratio */ + int i_width; /* picture width */ + int i_height; /* picture height */ + u32 i_chroma; /* picture chroma */ + int i_aspect; /* aspect ratio */ /* Real pictures */ picture_t* pp_picture[VOUT_MAX_PICTURES]; /* pictures */ + /* Stuff used for truecolor RGB planes */ + int i_rmask, i_rrshift, i_lrshift; + int i_gmask, i_rgshift, i_lgshift; + int i_bmask, i_rbshift, i_lbshift; + + /* Stuff used for palettized RGB planes */ + void (* pf_setpalette) ( struct vout_thread_s *, u16 *, u16 *, u16 * ); + } picture_heap_t; +/* RGB2PIXEL: assemble RGB components to a pixel value, returns a u32 */ +#define RGB2PIXEL( p_vout, i_r, i_g, i_b ) \ + (((((u32)i_r) >> p_vout->output.i_rrshift) << p_vout->output.i_lrshift) | \ + ((((u32)i_g) >> p_vout->output.i_rgshift) << p_vout->output.i_lgshift) | \ + ((((u32)i_b) >> p_vout->output.i_rbshift) << p_vout->output.i_lbshift)) + /***************************************************************************** * Flags used to describe the status of a picture *****************************************************************************/ @@ -134,36 +143,147 @@ typedef struct picture_heap_s #define DESTROYED_PICTURE 6 /* allocated but no more used */ /***************************************************************************** - * Flags used to describe picture format - see http://www.webartz.com/fourcc/ + * Codes used to describe picture format - see http://www.webartz.com/fourcc/ *****************************************************************************/ - -/* Packed RGB formats */ -#define FOURCC_BI_RGB 0x00000000 /* RGB for 8bpp */ -#define FOURCC_RGB 0x32424752 /* alias for BI_RGB */ -#define FOURCC_BI_BITFIELDS 0x00000003 /* RGB, for 16, 24, 32bpp */ -#define FOURCC_RV15 0x35315652 /* RGB 15bpp, 0x1f, 0x7e0, 0xf800 */ -#define FOURCC_RV16 0x36315652 /* RGB 16bpp, 0x1f, 0x3e0, 0x7c00 */ - -/* Planar YUV formats */ -#define FOURCC_I420 0x30323449 /* Planar 4:2:0, Y:U:V */ -#define FOURCC_IYUV 0x56555949 /* alias for I420 */ -#define FOURCC_YV12 0x32315659 /* Planar 4:2:0, Y:V:U */ - -/* Packed YUV formats */ -#define FOURCC_IUYV 0x56595549 /* Packed 4:2:2, U:Y:V:Y, interlaced */ -#define FOURCC_UYVY 0x59565955 /* Packed 4:2:2, U:Y:V:Y */ -#define FOURCC_UYNV 0x564e5955 /* alias for UYVY */ -#define FOURCC_Y422 0x32323459 /* alias for UYVY */ -#define FOURCC_cyuv 0x76757963 /* Packed 4:2:2, U:Y:V:Y, reverted */ -#define FOURCC_YUY2 0x32595559 /* Packed 4:2:2, Y:U:Y:V */ -#define FOURCC_YUNV 0x564e5559 /* alias for YUY2 */ -#define FOURCC_YVYU 0x55585659 /* Packed 4:2:2, Y:V:Y:U */ -#define FOURCC_Y211 0x31313259 /* Packed 2:1:1, Y:U:Y:V */ +#define MAKEFOURCC( a, b, c, d ) \ + ( ((u32)a) | ( ((u32)b) << 8 ) | ( ((u32)c) << 16 ) | ( ((u32)d) << 24 ) ) + +#define MAKETWOCC( a, b ) \ + ( (u16)(a) | ( (u16)(b) << 8 ) ) + +/* AVI stuff */ +#define FOURCC_RIFF MAKEFOURCC('R','I','F','F') +#define FOURCC_LIST MAKEFOURCC('L','I','S','T') +#define FOURCC_JUNK MAKEFOURCC('J','U','N','K') +#define FOURCC_AVI MAKEFOURCC('A','V','I',' ') +#define FOURCC_WAVE MAKEFOURCC('W','A','V','E') + +#define FOURCC_avih MAKEFOURCC('a','v','i','h') +#define FOURCC_hdrl MAKEFOURCC('h','d','r','l') +#define FOURCC_movi MAKEFOURCC('m','o','v','i') +#define FOURCC_idx1 MAKEFOURCC('i','d','x','1') + +#define FOURCC_strl MAKEFOURCC('s','t','r','l') +#define FOURCC_strh MAKEFOURCC('s','t','r','h') +#define FOURCC_strf MAKEFOURCC('s','t','r','f') +#define FOURCC_strd MAKEFOURCC('s','t','r','d') + +#define FOURCC_rec MAKEFOURCC('r','e','c',' ') +#define FOURCC_auds MAKEFOURCC('a','u','d','s') +#define FOURCC_vids MAKEFOURCC('v','i','d','s') + +#define TWOCC_wb MAKETWOCC('w','b') +#define TWOCC_db MAKETWOCC('d','b') +#define TWOCC_dc MAKETWOCC('d','c') +#define TWOCC_pc MAKETWOCC('p','c') + +/* MPEG4 codec */ +#define FOURCC_DIVX MAKEFOURCC('D','I','V','X') +#define FOURCC_divx MAKEFOURCC('d','i','v','x') +#define FOURCC_DIV1 MAKEFOURCC('D','I','V','1') +#define FOURCC_div1 MAKEFOURCC('d','i','v','1') +#define FOURCC_MP4S MAKEFOURCC('M','P','4','S') +#define FOURCC_mp4s MAKEFOURCC('m','p','4','s') +#define FOURCC_M4S2 MAKEFOURCC('M','4','S','2') +#define FOURCC_m4s2 MAKEFOURCC('m','4','s','2') +#define FOURCC_xvid MAKEFOURCC('x','v','i','d') +#define FOURCC_XVID MAKEFOURCC('X','V','I','D') +#define FOURCC_XviD MAKEFOURCC('X','v','i','D') +#define FOURCC_DX50 MAKEFOURCC('D','X','5','0') +#define FOURCC_mp4v MAKEFOURCC('m','p','4','v') +#define FOURCC_4 MAKEFOURCC( 4, 0, 0, 0 ) + +/* MSMPEG4 v2 */ +#define FOURCC_MPG4 MAKEFOURCC('M','P','G','4') +#define FOURCC_mpg4 MAKEFOURCC('m','p','g','4') +#define FOURCC_DIV2 MAKEFOURCC('D','I','V','2') +#define FOURCC_div2 MAKEFOURCC('d','i','v','2') +#define FOURCC_MP42 MAKEFOURCC('M','P','4','2') +#define FOURCC_mp42 MAKEFOURCC('m','p','4','2') + +/* MSMPEG4 v3 */ +/* M$ mpeg4 v3 */ +#define FOURCC_MPG3 MAKEFOURCC('M','P','G','3') +#define FOURCC_mpg3 MAKEFOURCC('m','p','g','3') +#define FOURCC_div3 MAKEFOURCC('d','i','v','3') +#define FOURCC_MP43 MAKEFOURCC('M','P','4','3') +#define FOURCC_mp43 MAKEFOURCC('m','p','4','3') +/* DivX 3.20 */ +#define FOURCC_DIV3 MAKEFOURCC('D','I','V','3') +#define FOURCC_DIV4 MAKEFOURCC('D','I','V','4') +#define FOURCC_div4 MAKEFOURCC('d','i','v','4') +#define FOURCC_DIV5 MAKEFOURCC('D','I','V','5') +#define FOURCC_div5 MAKEFOURCC('d','i','v','5') +#define FOURCC_DIV6 MAKEFOURCC('D','I','V','6') +#define FOURCC_div6 MAKEFOURCC('d','i','v','6') +/* AngelPotion stuff */ +#define FOURCC_AP41 MAKEFOURCC('A','P','4','1') +/* ?? */ +#define FOURCC_3IV1 MAKEFOURCC('3','I','V','1') + + + +/* Packed RGB for 8bpp */ +#define FOURCC_BI_RGB MAKEFOURCC( 0 , 0 , 0 , 0 ) +#define FOURCC_RGB2 MAKEFOURCC('R','G','B','2') + +/* Packed RGB for 16, 24, 32bpp */ +#define FOURCC_BI_BITFIELDS MAKEFOURCC( 0 , 0 , 0 , 3 ) + +/* Packed RGB 15bpp, 0x1f, 0x7e0, 0xf800 */ +#define FOURCC_RV15 MAKEFOURCC('R','V','1','5') + +/* Packed RGB 16bpp, 0x1f, 0x3e0, 0x7c00 */ +#define FOURCC_RV16 MAKEFOURCC('R','V','1','6') + +/* Packed RGB 24bpp, 0xff, 0xff00, 0xff0000 */ +#define FOURCC_RV24 MAKEFOURCC('R','V','2','4') + +/* Packed RGB 32bpp, 0xff, 0xff00, 0xff0000 */ +#define FOURCC_RV32 MAKEFOURCC('R','V','3','2') + +/* Planar YUV 4:2:0, Y:U:V */ +#define FOURCC_I420 MAKEFOURCC('I','4','2','0') +#define FOURCC_IYUV MAKEFOURCC('I','Y','U','V') + +/* Planar YUV 4:2:0, Y:V:U */ +#define FOURCC_YV12 MAKEFOURCC('Y','V','1','2') + +/* Packed YUV 4:2:2, U:Y:V:Y, interlaced */ +#define FOURCC_IUYV MAKEFOURCC('I','U','Y','V') + +/* Packed YUV 4:2:2, U:Y:V:Y */ +#define FOURCC_UYVY MAKEFOURCC('U','Y','V','Y') +#define FOURCC_UYNV MAKEFOURCC('U','Y','N','V') +#define FOURCC_Y422 MAKEFOURCC('Y','4','2','2') + +/* Packed YUV 4:2:2, U:Y:V:Y, reverted */ +#define FOURCC_cyuv MAKEFOURCC('c','y','u','v') + +/* Packed YUV 4:2:2, Y:U:Y:V */ +#define FOURCC_YUY2 MAKEFOURCC('Y','U','Y','2') +#define FOURCC_YUNV MAKEFOURCC('Y','U','N','V') + +/* Packed YUV 4:2:2, Y:V:Y:U */ +#define FOURCC_YVYU MAKEFOURCC('Y','V','Y','U') + +/* Packed YUV 2:1:1, Y:U:Y:V */ +#define FOURCC_Y211 MAKEFOURCC('Y','2','1','1') /* Custom formats which we use but which don't exist in the fourcc database */ -#define FOURCC_YMGA 0x41474d59 /* Planar Y, packed UV, from Matrox */ -#define FOURCC_I422 0x32323449 /* Planar 4:2:2, Y:U:V */ -#define FOURCC_I444 0x34343449 /* Planar 4:4:4, Y:U:V */ + +/* Planar Y, packed UV, from Matrox */ +#define FOURCC_YMGA MAKEFOURCC('Y','M','G','A') + +/* Planar 4:2:2, Y:U:V */ +#define FOURCC_I422 MAKEFOURCC('I','4','2','2') + +/* Planar 4:4:4, Y:U:V */ +#define FOURCC_I444 MAKEFOURCC('I','4','4','4') + +/***************************************************************************** + * Shortcuts to access image components + *****************************************************************************/ /* Plane indices */ #define Y_PLANE 0 @@ -172,122 +292,11 @@ typedef struct picture_heap_s /* Shortcuts */ #define Y_PIXELS p[Y_PLANE].p_pixels +#define Y_PITCH p[Y_PLANE].i_pitch #define U_PIXELS p[U_PLANE].p_pixels +#define U_PITCH p[U_PLANE].i_pitch #define V_PIXELS p[V_PLANE].p_pixels - -static __inline__ int vout_ChromaCmp( u32 i_chroma, u32 i_amorhc ) -{ - /* If they are the same, they are the same ! */ - if( i_chroma == i_amorhc ) - { - return 1; - } - - /* Check for equivalence classes */ - switch( i_chroma ) - { - case FOURCC_I420: - case FOURCC_IYUV: - case FOURCC_YV12: - switch( i_amorhc ) - { - case FOURCC_I420: - case FOURCC_IYUV: - case FOURCC_YV12: - return 1; - - default: - return 0; - } - - case FOURCC_UYVY: - case FOURCC_UYNV: - case FOURCC_Y422: - switch( i_amorhc ) - { - case FOURCC_UYVY: - case FOURCC_UYNV: - case FOURCC_Y422: - return 1; - - default: - return 0; - } - - case FOURCC_YUY2: - case FOURCC_YUNV: - switch( i_amorhc ) - { - case FOURCC_YUY2: - case FOURCC_YUNV: - return 1; - - default: - return 0; - } - - default: - return 0; - } -} - -/***************************************************************************** - * vout_CopyPicture: copy a picture to another one - ***************************************************************************** - * This function takes advantage of the image format, and reduces the - * number of calls to memcpy() to the minimum. Source and destination - * images must have same width, height, and chroma. - *****************************************************************************/ -static __inline__ void vout_CopyPicture( picture_t *p_src, picture_t *p_dest ) -{ - int i; - - for( i = 0; i < p_src->i_planes ; i++ ) - { - if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch ) - { - if( p_src->p[i].b_margin ) - { - /* If p_src->b_margin is set, p_dest->b_margin must be set */ - if( p_dest->p[i].b_hidden ) - { - /* There are margins, but they are hidden : perfect ! */ - FAST_MEMCPY( p_dest->p[i].p_pixels, p_src->p[i].p_pixels, - p_src->p[i].i_pitch * p_src->p[i].i_lines ); - continue; - } - else - { - /* We can't directly copy the margin. Too bad. */ - } - } - else - { - /* Same pitch, no margins : perfect ! */ - FAST_MEMCPY( p_dest->p[i].p_pixels, p_src->p[i].p_pixels, - p_src->p[i].i_pitch * p_src->p[i].i_lines ); - continue; - } - } - else - { - /* Pitch values are different */ - } - - /* We need to proceed line by line */ - { - u8 *p_in = p_src->p[i].p_pixels, *p_out = p_dest->p[i].p_pixels; - int i_line; - - for( i_line = p_src->p[i].i_lines; i_line--; ) - { - FAST_MEMCPY( p_out, p_in, p_src->p[i].i_visible_bytes ); - p_in += p_src->p[i].i_pitch; - p_out += p_dest->p[i].i_pitch; - } - } - } -} +#define V_PITCH p[V_PLANE].i_pitch /***************************************************************************** * subpicture_t: video subtitle @@ -317,9 +326,8 @@ typedef struct subpicture_s int i_y; /* offset from alignment position */ int i_width; /* picture width */ int i_height; /* picture height */ - int i_horizontal_align; /* horizontal alignment */ - int i_vertical_align; /* vertical alignment */ +#if 0 /* Additionnal properties depending of the subpicture type */ union { @@ -333,22 +341,23 @@ typedef struct subpicture_s u32 i_border_color; /* border color */ u32 i_bg_color; /* background color */ } text; - /* DVD subpicture units properties */ - struct - { - int i_offset[2]; /* byte offsets to data */ - } spu; } type; +#endif + + /* The subpicture rendering routine */ + void ( *pf_render ) ( const struct vout_thread_s *, picture_t *, + const struct subpicture_s * ); + + /* Private data - the subtitle plugin might want to put stuff here to + * keep track of the subpicture */ + struct subpicture_sys_s *p_sys; /* subpicture data */ + void *p_sys_orig; /* pointer before memalign */ - /* Subpicture data, format depends of type - data can always be freely - * modified. p_data itself (the pointer) should NEVER be modified. */ - void * p_data; /* subpicture data */ } subpicture_t; /* Subpicture type */ #define EMPTY_SUBPICTURE 0 /* subtitle slot is empty and available */ -#define DVD_SUBPICTURE 100 /* DVD subpicture unit */ -#define TEXT_SUBPICTURE 200 /* single line text */ +#define MEMORY_SUBPICTURE 100 /* subpicture stored in memory */ /* Subpicture status */ #define FREE_SUBPICTURE 0 /* free and not allocated */ @@ -356,19 +365,3 @@ typedef struct subpicture_s #define READY_SUBPICTURE 2 /* ready for display */ #define DESTROYED_SUBPICTURE 3 /* allocated but not used anymore */ -/* Alignment types */ -#define RIGHT_ALIGN 10 /* x is absolute for right */ -#define LEFT_ALIGN 11 /* x is absolute for left */ -#define RIGHT_RALIGN 12 /* x is relative for right from right */ -#define LEFT_RALIGN 13 /* x is relative for left from left */ - -#define CENTER_ALIGN 20 /* x, y are absolute for center */ -#define CENTER_RALIGN 21 /* x,y are relative for center from center */ - -#define BOTTOM_ALIGN 30 /* y is absolute for bottom */ -#define TOP_ALIGN 31 /* y is absolute for top */ -#define BOTTOM_RALIGN 32 /* y is relative for bottom from bottom */ -#define TOP_RALIGN 33 /* y is relative for top from top */ -#define SUBTITLE_RALIGN 34 /* y is relative for center from subtitle */ - -