imgutils.h 3.88 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVCORE_IMGUTILS_H
#define AVCORE_IMGUTILS_H

/**
 * @file
 * misc image utilities
 */

27
#include "libavutil/pixdesc.h"
28 29
#include "avcore.h"

30 31
/**
 * Compute the max pixel step for each plane of an image with a
32
 * format described by pixdesc.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 *
 * The pixel step is the distance in bytes between the first byte of
 * the group of bytes which describe a pixel component and the first
 * byte of the successive group in the same plane for the same
 * component.
 *
 * @param max_pixstep an array which is filled with the max pixel step
 * for each plane. Since a plane may contain different pixel
 * components, the computed max_pixstep[plane] is relative to the
 * component in the plane with the max pixel step.
 * @param max_pixstep_comp an array which is filled with the component
 * for each plane which has the max pixel step. May be NULL.
 */
static inline void av_fill_image_max_pixstep(int max_pixstep[4], int max_pixstep_comp[4],
                                             const AVPixFmtDescriptor *pixdesc)
{
    int i;
    memset(max_pixstep, 0, 4*sizeof(max_pixstep[0]));
    if (max_pixstep_comp)
        memset(max_pixstep_comp, 0, 4*sizeof(max_pixstep_comp[0]));

    for (i = 0; i < 4; i++) {
        const AVComponentDescriptor *comp = &(pixdesc->comp[i]);
        if ((comp->step_minus1+1) > max_pixstep[comp->plane]) {
            max_pixstep[comp->plane] = comp->step_minus1+1;
            if (max_pixstep_comp)
                max_pixstep_comp[comp->plane] = i;
        }
    }
}

64 65 66 67 68 69 70 71
/**
 * Compute the size of an image line with format pix_fmt and width
 * width for the plane plane.
 *
 * @return the computed size in bytes
 */
int av_get_image_linesize(enum PixelFormat pix_fmt, int width, int plane);

72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
/**
 * Fill plane linesizes for an image with pixel format pix_fmt and
 * width width.
 *
 * @param linesizes array to be filled with the linesize for each plane
 * @return >= 0 in case of success, a negative error code otherwise
 */
int av_fill_image_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int width);

/**
 * Fill plane data pointers for an image with pixel format pix_fmt and
 * height height.
 *
 * @param data pointers array to be filled with the pointer for each image plane
 * @param ptr the pointer to a buffer which will contain the image
 * @param linesizes[4] the array containing the linesize for each
 * plane, should be filled by av_fill_image_linesizes()
 * @return the size in bytes required for the image buffer, a negative
 * error code in case of failure
 */
int av_fill_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height,
                           uint8_t *ptr, const int linesizes[4]);

95 96 97 98 99 100 101 102 103 104 105 106
/**
 * Check if the given dimension of an image is valid, meaning that all
 * bytes of the image can be addressed with a signed int.
 *
 * @param w the width of the picture
 * @param h the height of the picture
 * @param log_offset the offset to sum to the log level for logging with log_ctx
 * @param log_ctx the parent logging context, it may be NULL
 * @return >= 0 if valid, a negative error code otherwise
 */
int av_check_image_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);

107
#endif /* AVCORE_IMGUTILS_H */