]> git.sesse.net Git - vlc/blob - modules/video_filter/filter_picture.h
mediacodec: don't loop in GetOutput
[vlc] / modules / video_filter / filter_picture.h
1 /*****************************************************************************
2  * filter_picture.h: Common picture functions for filters
3  *****************************************************************************
4  * Copyright (C) 2007 VLC authors and VideoLAN
5  * $Id$
6  *
7  * Authors: Antoine Cellerier <dionoea at videolan dot org>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 /* FIXME: do all of these really have square pixels? */
25 #define CASE_PLANAR_YUV_SQUARE              \
26         case VLC_CODEC_I420:   \
27         case VLC_CODEC_J420:   \
28         case VLC_CODEC_YV12:   \
29         case VLC_CODEC_I411:   \
30         case VLC_CODEC_I410:   \
31         case VLC_CODEC_I444:   \
32         case VLC_CODEC_J444:   \
33         case VLC_CODEC_YUVA:
34
35 #define CASE_PLANAR_YUV_NONSQUARE           \
36         case VLC_CODEC_I422:   \
37         case VLC_CODEC_J422:
38
39 #define CASE_PLANAR_YUV                     \
40         CASE_PLANAR_YUV_SQUARE              \
41         CASE_PLANAR_YUV_NONSQUARE           \
42
43 #define CASE_PACKED_YUV_422                 \
44         case VLC_CODEC_UYVY:   \
45         case VLC_CODEC_YUYV:   \
46         case VLC_CODEC_YVYU:
47
48 static inline int GetPackedYuvOffsets( vlc_fourcc_t i_chroma,
49     int *i_y_offset, int *i_u_offset, int *i_v_offset )
50 {
51     switch( i_chroma )
52     {
53         case VLC_CODEC_UYVY:
54             /* UYVY */
55             *i_y_offset = 1;
56             *i_u_offset = 0;
57             *i_v_offset = 2;
58             return VLC_SUCCESS;
59         case VLC_CODEC_VYUY:
60             /* VYUY */
61             *i_y_offset = 1;
62             *i_u_offset = 2;
63             *i_v_offset = 0;
64             return VLC_SUCCESS;
65         case VLC_CODEC_YUYV:
66             /* YUYV */
67             *i_y_offset = 0;
68             *i_u_offset = 1;
69             *i_v_offset = 3;
70             return VLC_SUCCESS;
71         case VLC_CODEC_YVYU:
72             /* YVYU */
73             *i_y_offset = 0;
74             *i_u_offset = 3;
75             *i_v_offset = 1;
76             return VLC_SUCCESS;
77         default:
78             return VLC_EGENERIC;
79     }
80 }
81
82 static inline int GetPackedRgbIndexes( const video_format_t *p_fmt, int *i_r_index,
83                                       int *i_g_index, int *i_b_index )
84 {
85     if( p_fmt->i_chroma != VLC_CODEC_RGB24 && p_fmt->i_chroma != VLC_CODEC_RGB32 )
86         return VLC_EGENERIC;
87
88 #ifdef WORDS_BIGENDIAN
89     const int i_mask_bits = p_fmt->i_chroma == VLC_CODEC_RGB24 ? 24 : 32;
90     *i_r_index = ( i_mask_bits - p_fmt->i_lrshift ) / 8;
91     *i_g_index = ( i_mask_bits - p_fmt->i_lgshift ) / 8;
92     *i_b_index = ( i_mask_bits - p_fmt->i_lbshift ) / 8;
93 #else
94     *i_r_index = p_fmt->i_lrshift / 8;
95     *i_g_index = p_fmt->i_lgshift / 8;
96     *i_b_index = p_fmt->i_lbshift / 8;
97 #endif
98     return VLC_SUCCESS;
99 }
100
101 static inline uint8_t vlc_uint8( int v )
102 {
103     if( v > 255 )
104         return 255;
105     else if( v < 0 )
106         return 0;
107     return v;
108 }
109
110 static inline void yuv_to_rgb( int *r, int *g, int *b,
111                                uint8_t y1, uint8_t u1, uint8_t v1 )
112 {
113     /* macros used for YUV pixel conversions */
114 #   define SCALEBITS 10
115 #   define ONE_HALF  (1 << (SCALEBITS - 1))
116 #   define FIX(x)    ((int) ((x) * (1<<SCALEBITS) + 0.5))
117
118     int y, cb, cr, r_add, g_add, b_add;
119
120     cb = u1 - 128;
121     cr = v1 - 128;
122     r_add = FIX(1.40200*255.0/224.0) * cr + ONE_HALF;
123     g_add = - FIX(0.34414*255.0/224.0) * cb
124             - FIX(0.71414*255.0/224.0) * cr + ONE_HALF;
125     b_add = FIX(1.77200*255.0/224.0) * cb + ONE_HALF;
126     y = (y1 - 16) * FIX(255.0/219.0);
127     *r = vlc_uint8( (y + r_add) >> SCALEBITS );
128     *g = vlc_uint8( (y + g_add) >> SCALEBITS );
129     *b = vlc_uint8( (y + b_add) >> SCALEBITS );
130 #undef FIX
131 #undef ONE_HALF
132 #undef SCALEBITS
133 }
134
135 static inline void rgb_to_yuv( uint8_t *y, uint8_t *u, uint8_t *v,
136                                int r, int g, int b )
137 {
138     *y = ( ( (  66 * r + 129 * g +  25 * b + 128 ) >> 8 ) + 16 );
139     *u =   ( ( -38 * r -  74 * g + 112 * b + 128 ) >> 8 ) + 128 ;
140     *v =   ( ( 112 * r -  94 * g -  18 * b + 128 ) >> 8 ) + 128 ;
141 }
142
143 /*****************************************************************************
144  *
145  *****************************************************************************/
146 static inline picture_t *CopyInfoAndRelease( picture_t *p_outpic, picture_t *p_inpic )
147 {
148     picture_CopyProperties( p_outpic, p_inpic );
149
150     picture_Release( p_inpic );
151
152     return p_outpic;
153 }