| 1 | /***************************************************************************** |
| 2 | * vlc_picture.h: picture definitions |
| 3 | ***************************************************************************** |
| 4 | * Copyright (C) 1999 - 2009 VLC authors and VideoLAN |
| 5 | * $Id: 74f156fbbd6e6a4479754c0e79fbd5374a4a1e2e $ |
| 6 | * |
| 7 | * Authors: Vincent Seguin <seguin@via.ecp.fr> |
| 8 | * Samuel Hocevar <sam@via.ecp.fr> |
| 9 | * Olivier Aubert <oaubert 47 videolan d07 org> |
| 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify it |
| 12 | * under the terms of the GNU Lesser General Public License as published by |
| 13 | * the Free Software Foundation; either version 2.1 of the License, or |
| 14 | * (at your option) any later version. |
| 15 | * |
| 16 | * This program is distributed in the hope that it will be useful, |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 19 | * GNU Lesser General Public License for more details. |
| 20 | * |
| 21 | * You should have received a copy of the GNU Lesser General Public License |
| 22 | * along with this program; if not, write to the Free Software Foundation, |
| 23 | * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
| 24 | *****************************************************************************/ |
| 25 | |
| 26 | #ifndef VLC_PICTURE_H |
| 27 | #define VLC_PICTURE_H 1 |
| 28 | |
| 29 | /** |
| 30 | * \file |
| 31 | * This file defines picture structures and functions in vlc |
| 32 | */ |
| 33 | |
| 34 | #include <vlc_es.h> |
| 35 | |
| 36 | /** Description of a planar graphic field */ |
| 37 | typedef struct plane_t |
| 38 | { |
| 39 | uint8_t *p_pixels; /**< Start of the plane's data */ |
| 40 | |
| 41 | /* Variables used for fast memcpy operations */ |
| 42 | int i_lines; /**< Number of lines, including margins */ |
| 43 | int i_pitch; /**< Number of bytes in a line, including margins */ |
| 44 | |
| 45 | /** Size of a macropixel, defaults to 1 */ |
| 46 | int i_pixel_pitch; |
| 47 | |
| 48 | /* Variables used for pictures with margins */ |
| 49 | int i_visible_lines; /**< How many visible lines are there ? */ |
| 50 | int i_visible_pitch; /**< How many visible pixels are there ? */ |
| 51 | |
| 52 | } plane_t; |
| 53 | |
| 54 | /** |
| 55 | * Maximum number of plane for a picture |
| 56 | */ |
| 57 | #define PICTURE_PLANE_MAX (VOUT_MAX_PLANES) |
| 58 | |
| 59 | typedef struct picture_context_t |
| 60 | { |
| 61 | void (*destroy)(struct picture_context_t *); |
| 62 | struct picture_context_t *(*copy)(struct picture_context_t *); |
| 63 | } picture_context_t; |
| 64 | |
| 65 | /** |
| 66 | * Video picture |
| 67 | */ |
| 68 | struct picture_t |
| 69 | { |
| 70 | /** |
| 71 | * The properties of the picture |
| 72 | */ |
| 73 | video_frame_format_t format; |
| 74 | |
| 75 | plane_t p[PICTURE_PLANE_MAX]; /**< description of the planes */ |
| 76 | int i_planes; /**< number of allocated planes */ |
| 77 | |
| 78 | /** \name Picture management properties |
| 79 | * These properties can be modified using the video output thread API, |
| 80 | * but should never be written directly */ |
| 81 | /**@{*/ |
| 82 | mtime_t date; /**< display date */ |
| 83 | bool b_force; |
| 84 | /**@}*/ |
| 85 | |
| 86 | /** \name Picture dynamic properties |
| 87 | * Those properties can be changed by the decoder |
| 88 | * @{ |
| 89 | */ |
| 90 | bool b_progressive; /**< is it a progressive frame ? */ |
| 91 | bool b_top_field_first; /**< which field is first */ |
| 92 | unsigned int i_nb_fields; /**< # of displayed fields */ |
| 93 | picture_context_t *context; /**< video format-specific data pointer */ |
| 94 | /**@}*/ |
| 95 | |
| 96 | /** Private data - the video output plugin might want to put stuff here to |
| 97 | * keep track of the picture */ |
| 98 | picture_sys_t * p_sys; |
| 99 | |
| 100 | /** Next picture in a FIFO a pictures */ |
| 101 | struct picture_t *p_next; |
| 102 | }; |
| 103 | |
| 104 | /** |
| 105 | * This function will create a new picture. |
| 106 | * The picture created will implement a default release management compatible |
| 107 | * with picture_Hold and picture_Release. This default management will release |
| 108 | * p_sys, gc.p_sys fields if non NULL. |
| 109 | */ |
| 110 | VLC_API picture_t * picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ) VLC_USED; |
| 111 | |
| 112 | /** |
| 113 | * This function will create a new picture using the given format. |
| 114 | * |
| 115 | * When possible, it is preferred to use this function over picture_New |
| 116 | * as more information about the format is kept. |
| 117 | */ |
| 118 | VLC_API picture_t * picture_NewFromFormat( const video_format_t *p_fmt ) VLC_USED; |
| 119 | |
| 120 | /** |
| 121 | * Resource for a picture. |
| 122 | */ |
| 123 | typedef struct |
| 124 | { |
| 125 | picture_sys_t *p_sys; |
| 126 | void (*pf_destroy)(picture_t *); |
| 127 | |
| 128 | /* Plane resources |
| 129 | * XXX all fields MUST be set to the right value. |
| 130 | */ |
| 131 | struct |
| 132 | { |
| 133 | uint8_t *p_pixels; /**< Start of the plane's data */ |
| 134 | int i_lines; /**< Number of lines, including margins */ |
| 135 | int i_pitch; /**< Number of bytes in a line, including margins */ |
| 136 | } p[PICTURE_PLANE_MAX]; |
| 137 | |
| 138 | } picture_resource_t; |
| 139 | |
| 140 | /** |
| 141 | * This function will create a new picture using the provided resource. |
| 142 | * |
| 143 | * If the resource is NULL then a plain picture_NewFromFormat is returned. |
| 144 | */ |
| 145 | VLC_API picture_t * picture_NewFromResource( const video_format_t *, const picture_resource_t * ) VLC_USED; |
| 146 | |
| 147 | /** |
| 148 | * This function will increase the picture reference count. |
| 149 | * It will not have any effect on picture obtained from vout |
| 150 | * |
| 151 | * It returns the given picture for convenience. |
| 152 | */ |
| 153 | VLC_API picture_t *picture_Hold( picture_t *p_picture ); |
| 154 | |
| 155 | /** |
| 156 | * This function will release a picture. |
| 157 | * It will not have any effect on picture obtained from vout |
| 158 | */ |
| 159 | VLC_API void picture_Release( picture_t *p_picture ); |
| 160 | |
| 161 | /** |
| 162 | * This function will copy all picture dynamic properties. |
| 163 | */ |
| 164 | VLC_API void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ); |
| 165 | |
| 166 | /** |
| 167 | * This function will reset a picture information (properties and quantizers). |
| 168 | * It is sometimes useful for reusing pictures (like from a pool). |
| 169 | */ |
| 170 | VLC_API void picture_Reset( picture_t * ); |
| 171 | |
| 172 | /** |
| 173 | * This function will copy the picture pixels. |
| 174 | * You can safely copy between pictures that do not have the same size, |
| 175 | * only the compatible(smaller) part will be copied. |
| 176 | */ |
| 177 | VLC_API void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ); |
| 178 | VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ); |
| 179 | |
| 180 | /** |
| 181 | * This function will copy both picture dynamic properties and pixels. |
| 182 | * You have to notice that sometime a simple picture_Hold may do what |
| 183 | * you want without the copy overhead. |
| 184 | * Provided for convenience. |
| 185 | * |
| 186 | * \param p_dst pointer to the destination picture. |
| 187 | * \param p_src pointer to the source picture. |
| 188 | */ |
| 189 | VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src ); |
| 190 | |
| 191 | /** |
| 192 | * Perform a shallow picture copy |
| 193 | * |
| 194 | * This function makes a shallow copy of an existing picture. The same planes |
| 195 | * and resources will be used, and the cloned picture reference count will be |
| 196 | * incremented. |
| 197 | * |
| 198 | * \return A clone picture on success, NULL on error. |
| 199 | */ |
| 200 | VLC_API picture_t *picture_Clone(picture_t *pic); |
| 201 | |
| 202 | /** |
| 203 | * This function will export a picture to an encoded bitstream. |
| 204 | * |
| 205 | * pp_image will contain the encoded bitstream in psz_format format. |
| 206 | * |
| 207 | * p_fmt can be NULL otherwise it will be set with the format used for the |
| 208 | * picture before encoding. |
| 209 | * |
| 210 | * i_override_width/height allow to override the width and/or the height of the |
| 211 | * picture to be encoded: |
| 212 | * - if strictly lower than 0, the original dimension will be used. |
| 213 | * - if equal to 0, it will be deduced from the other dimension which must be |
| 214 | * different to 0. |
| 215 | * - if strictly higher than 0, it will override the dimension. |
| 216 | * If at most one of them is > 0 then the picture aspect ratio will be kept. |
| 217 | */ |
| 218 | VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ); |
| 219 | |
| 220 | /** |
| 221 | * This function will setup all fields of a picture_t without allocating any |
| 222 | * memory. |
| 223 | * XXX The memory must already be initialized. |
| 224 | * It does not need to be released. |
| 225 | * |
| 226 | * It will return VLC_EGENERIC if the core does not understand the requested |
| 227 | * format. |
| 228 | * |
| 229 | * It can be useful to get the properties of planes. |
| 230 | */ |
| 231 | VLC_API int picture_Setup( picture_t *, const video_format_t * ); |
| 232 | |
| 233 | |
| 234 | /***************************************************************************** |
| 235 | * Shortcuts to access image components |
| 236 | *****************************************************************************/ |
| 237 | |
| 238 | /* Plane indices */ |
| 239 | enum |
| 240 | { |
| 241 | Y_PLANE = 0, |
| 242 | U_PLANE = 1, |
| 243 | V_PLANE = 2, |
| 244 | A_PLANE = 3, |
| 245 | }; |
| 246 | |
| 247 | /* Shortcuts */ |
| 248 | #define Y_PIXELS p[Y_PLANE].p_pixels |
| 249 | #define Y_PITCH p[Y_PLANE].i_pitch |
| 250 | #define U_PIXELS p[U_PLANE].p_pixels |
| 251 | #define U_PITCH p[U_PLANE].i_pitch |
| 252 | #define V_PIXELS p[V_PLANE].p_pixels |
| 253 | #define V_PITCH p[V_PLANE].i_pitch |
| 254 | #define A_PIXELS p[A_PLANE].p_pixels |
| 255 | #define A_PITCH p[A_PLANE].i_pitch |
| 256 | |
| 257 | /**@}*/ |
| 258 | |
| 259 | #endif /* VLC_PICTURE_H */ |
| 260 | |