4eff7cf4 |
/*
* PNG image format |
406792e7 |
* Copyright (c) 2003 Fabrice Bellard |
4eff7cf4 |
* |
b78e7197 |
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or |
4eff7cf4 |
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either |
b78e7197 |
* version 2.1 of the License, or (at your option) any later version. |
4eff7cf4 |
* |
b78e7197 |
* FFmpeg is distributed in the hope that it will be useful, |
4eff7cf4 |
* 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 |
b78e7197 |
* License along with FFmpeg; if not, write to the Free Software |
5509bffa |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
4eff7cf4 |
*/
#include "avcodec.h" |
b958a7f1 |
#include "png.h" |
4eff7cf4 |
/* Mask to determine which y pixels are valid in a pass */ |
b958a7f1 |
const uint8_t ff_png_pass_ymask[NB_PASSES] = { |
4eff7cf4 |
0x80, 0x80, 0x08, 0x88, 0x22, 0xaa, 0x55,
};
/* minimum x value */ |
ff0d737d |
static const uint8_t ff_png_pass_xmin[NB_PASSES] = { |
4eff7cf4 |
0, 4, 0, 2, 0, 1, 0
};
/* x shift to get row width */ |
ff0d737d |
static const uint8_t ff_png_pass_xshift[NB_PASSES] = { |
4eff7cf4 |
3, 3, 2, 2, 1, 1, 0
};
|
b958a7f1 |
void *ff_png_zalloc(void *opaque, unsigned int items, unsigned int size) |
4eff7cf4 |
{ |
486f0b0c |
return av_mallocz_array(items, size); |
4eff7cf4 |
}
|
b958a7f1 |
void ff_png_zfree(void *opaque, void *ptr) |
4eff7cf4 |
{
av_free(ptr);
}
|
b958a7f1 |
int ff_png_get_nb_channels(int color_type) |
4eff7cf4 |
{
int channels;
channels = 1;
if ((color_type & (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)) ==
PNG_COLOR_MASK_COLOR)
channels = 3;
if (color_type & PNG_COLOR_MASK_ALPHA)
channels++;
return channels;
}
/* compute the row size of an interleaved pass */ |
b958a7f1 |
int ff_png_pass_row_size(int pass, int bits_per_pixel, int width) |
4eff7cf4 |
{
int shift, xmin, pass_width;
|
b958a7f1 |
xmin = ff_png_pass_xmin[pass]; |
4eff7cf4 |
if (width <= xmin)
return 0; |
b958a7f1 |
shift = ff_png_pass_xshift[pass]; |
4eff7cf4 |
pass_width = (width - xmin + (1 << shift) - 1) >> shift;
return (pass_width * bits_per_pixel + 7) >> 3;
} |