1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #ifndef AVFILTER_DRAWUTILS_H 20 #define AVFILTER_DRAWUTILS_H 21 22 /** 23 * @file 24 * misc drawing utilities 25 */ 26 27 #include <stdint.h> 28 #include "avfilter.h" 29 #include "libavutil/pixfmt.h" 30 31 int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt); 32 33 #define MAX_PLANES 4 34 35 typedef struct FFDrawContext { 36 const struct AVPixFmtDescriptor *desc; 37 enum AVPixelFormat format; 38 unsigned nb_planes; 39 int pixelstep[MAX_PLANES]; /*< offset between pixels */ 40 uint8_t comp_mask[MAX_PLANES]; /*< bitmask of used non-alpha components */ 41 uint8_t hsub[MAX_PLANES]; /*< horizontal subsampling */ 42 uint8_t vsub[MAX_PLANES]; /*< vertical subsampling */ 43 uint8_t hsub_max; 44 uint8_t vsub_max; 45 int full_range; 46 unsigned flags; 47 } FFDrawContext; 48 49 typedef struct FFDrawColor { 50 uint8_t rgba[4]; 51 union { 52 uint32_t u32[4]; 53 uint16_t u16[8]; 54 uint8_t u8[16]; 55 } comp[MAX_PLANES]; 56 } FFDrawColor; 57 58 /** 59 * Process alpha pixel component. 60 */ 61 #define FF_DRAW_PROCESS_ALPHA 1 62 63 /** 64 * Init a draw context. 65 * 66 * Only a limited number of pixel formats are supported, if format is not 67 * supported the function will return an error. 68 * flags is combination of FF_DRAW_* flags. 69 * @return 0 for success, < 0 for error 70 */ 71 int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags); 72 73 /** 74 * Prepare a color. 75 */ 76 void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4]); 77 78 /** 79 * Copy a rectangle from an image to another. 80 * 81 * The coordinates must be as even as the subsampling requires. 82 */ 83 void ff_copy_rectangle2(FFDrawContext *draw, 84 uint8_t *dst[], int dst_linesize[], 85 uint8_t *src[], int src_linesize[], 86 int dst_x, int dst_y, int src_x, int src_y, 87 int w, int h); 88 89 /** 90 * Fill a rectangle with an uniform color. 91 * 92 * The coordinates must be as even as the subsampling requires. 93 * The color needs to be inited with ff_draw_color. 94 */ 95 void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color, 96 uint8_t *dst[], int dst_linesize[], 97 int dst_x, int dst_y, int w, int h); 98 99 /** 100 * Blend a rectangle with an uniform color. 101 */ 102 void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color, 103 uint8_t *dst[], int dst_linesize[], 104 int dst_w, int dst_h, 105 int x0, int y0, int w, int h); 106 107 /** 108 * Blend an alpha mask with an uniform color. 109 * 110 * @param draw draw context 111 * @param color color for the overlay; 112 * @param dst destination image 113 * @param dst_linesize line stride of the destination 114 * @param dst_w width of the destination image 115 * @param dst_h height of the destination image 116 * @param mask mask 117 * @param mask_linesize line stride of the mask 118 * @param mask_w width of the mask 119 * @param mask_h height of the mask 120 * @param l2depth log2 of depth of the mask (0 for 1bpp, 3 for 8bpp) 121 * @param endianness bit order of the mask (0: MSB to the left) 122 * @param x0 horizontal position of the overlay 123 * @param y0 vertical position of the overlay 124 */ 125 void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color, 126 uint8_t *dst[], int dst_linesize[], int dst_w, int dst_h, 127 const uint8_t *mask, int mask_linesize, int mask_w, int mask_h, 128 int l2depth, unsigned endianness, int x0, int y0); 129 130 /** 131 * Round a dimension according to subsampling. 132 * 133 * @param draw draw context 134 * @param sub_dir 0 for horizontal, 1 for vertical 135 * @param round_dir 0 nearest, -1 round down, +1 round up 136 * @param value value to round 137 * @return the rounded value 138 */ 139 int ff_draw_round_to_sub(FFDrawContext *draw, int sub_dir, int round_dir, 140 int value); 141 142 /** 143 * Return the list of pixel formats supported by the draw functions. 144 * 145 * The flags are the same as ff_draw_init, i.e., none currently. 146 */ 147 AVFilterFormats *ff_draw_supported_pixel_formats(unsigned flags); 148 149 #endif /* AVFILTER_DRAWUTILS_H */ 150