Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. int ff_fill_line_with_color(uint8_t *line[4], int pixel_step[4], int w,
  34.                             uint8_t dst_color[4],
  35.                             enum AVPixelFormat pix_fmt, uint8_t rgba_color[4],
  36.                             int *is_packed_rgba, uint8_t rgba_map[4]);
  37.  
  38. void ff_draw_rectangle(uint8_t *dst[4], int dst_linesize[4],
  39.                        uint8_t *src[4], int pixelstep[4],
  40.                        int hsub, int vsub, int x, int y, int w, int h);
  41.  
  42. void ff_copy_rectangle(uint8_t *dst[4], int dst_linesize[4],
  43.                        uint8_t *src[4], int src_linesize[4], int pixelstep[4],
  44.                        int hsub, int vsub, int x, int y, int y2, int w, int h);
  45.  
  46. #define MAX_PLANES 4
  47.  
  48. typedef struct FFDrawContext {
  49.     const struct AVPixFmtDescriptor *desc;
  50.     enum AVPixelFormat format;
  51.     unsigned nb_planes;
  52.     int pixelstep[MAX_PLANES]; /*< offset between pixels */
  53.     uint8_t comp_mask[MAX_PLANES]; /*< bitmask of used non-alpha components */
  54.     uint8_t hsub[MAX_PLANES];  /*< horizontal subsampling */
  55.     uint8_t vsub[MAX_PLANES];  /*< vertical subsampling */
  56.     uint8_t hsub_max;
  57.     uint8_t vsub_max;
  58. } FFDrawContext;
  59.  
  60. typedef struct FFDrawColor {
  61.     uint8_t rgba[4];
  62.     union {
  63.         uint32_t u32;
  64.         uint16_t u16;
  65.         uint8_t  u8[4];
  66.     } comp[MAX_PLANES];
  67. } FFDrawColor;
  68.  
  69. /**
  70.  * Init a draw context.
  71.  *
  72.  * Only a limited number of pixel formats are supported, if format is not
  73.  * supported the function will return an error.
  74.  * No flags currently defined.
  75.  * @return  0 for success, < 0 for error
  76.  */
  77. int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags);
  78.  
  79. /**
  80.  * Prepare a color.
  81.  */
  82. void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4]);
  83.  
  84. /**
  85.  * Copy a rectangle from an image to another.
  86.  *
  87.  * The coordinates must be as even as the subsampling requires.
  88.  */
  89. void ff_copy_rectangle2(FFDrawContext *draw,
  90.                         uint8_t *dst[], int dst_linesize[],
  91.                         uint8_t *src[], int src_linesize[],
  92.                         int dst_x, int dst_y, int src_x, int src_y,
  93.                         int w, int h);
  94.  
  95. /**
  96.  * Fill a rectangle with an uniform color.
  97.  *
  98.  * The coordinates must be as even as the subsampling requires.
  99.  * The color needs to be inited with ff_draw_color.
  100.  */
  101. void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color,
  102.                        uint8_t *dst[], int dst_linesize[],
  103.                        int dst_x, int dst_y, int w, int h);
  104.  
  105. /**
  106.  * Blend a rectangle with an uniform color.
  107.  */
  108. void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color,
  109.                         uint8_t *dst[], int dst_linesize[],
  110.                         int dst_w, int dst_h,
  111.                         int x0, int y0, int w, int h);
  112.  
  113. /**
  114.  * Blend an alpha mask with an uniform color.
  115.  *
  116.  * @param draw           draw context
  117.  * @param color          color for the overlay;
  118.  * @param dst            destination image
  119.  * @param dst_linesize   line stride of the destination
  120.  * @param dst_w          width of the destination image
  121.  * @param dst_h          height of the destination image
  122.  * @param mask           mask
  123.  * @param mask_linesize  line stride of the mask
  124.  * @param mask_w         width of the mask
  125.  * @param mask_h         height of the mask
  126.  * @param l2depth        log2 of depth of the mask (0 for 1bpp, 3 for 8bpp)
  127.  * @param endianness     bit order of the mask (0: MSB to the left)
  128.  * @param x0             horizontal position of the overlay
  129.  * @param y0             vertical position of the overlay
  130.  */
  131. void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color,
  132.                    uint8_t *dst[], int dst_linesize[], int dst_w, int dst_h,
  133.                    uint8_t *mask, int mask_linesize, int mask_w, int mask_h,
  134.                    int l2depth, unsigned endianness, int x0, int y0);
  135.  
  136. /**
  137.  * Round a dimension according to subsampling.
  138.  *
  139.  * @param draw       draw context
  140.  * @param sub_dir    0 for horizontal, 1 for vertical
  141.  * @param round_dir  0 nearest, -1 round down, +1 round up
  142.  * @param value      value to round
  143.  * @return  the rounded value
  144.  */
  145. int ff_draw_round_to_sub(FFDrawContext *draw, int sub_dir, int round_dir,
  146.                          int value);
  147.  
  148. /**
  149.  * Return the list of pixel formats supported by the draw functions.
  150.  *
  151.  * The flags are the same as ff_draw_init, i.e., none currently.
  152.  */
  153. AVFilterFormats *ff_draw_supported_pixel_formats(unsigned flags);
  154.  
  155. #endif /* AVFILTER_DRAWUTILS_H */
  156.