X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fpcx.c;h=7eb1daaa7aa978fb83c7f2cb19c35552fddd0c52;hb=ff17fc6353c6513316b1132f27ac2a7a8d81b9ec;hp=23a808d633dbc4c56d39df2a16fe88780b5d4dfe;hpb=7a00bbad2100367481240e62876b941b5c4befdc;p=ffmpeg diff --git a/libavcodec/pcx.c b/libavcodec/pcx.c index 23a808d633d..7eb1daaa7aa 100644 --- a/libavcodec/pcx.c +++ b/libavcodec/pcx.c @@ -5,26 +5,27 @@ * This decoder does not support CGA palettes. I am unable to find samples * and Netpbm cannot generate them. * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav 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, + * Libav 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 + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/imgutils.h" #include "avcodec.h" #include "bytestream.h" -#include "bitstream.h" +#include "get_bits.h" typedef struct PCXContext { AVFrame picture; @@ -43,19 +44,24 @@ static av_cold int pcx_init(AVCodecContext *avctx) { * @return advanced src pointer */ static const uint8_t *pcx_rle_decode(const uint8_t *src, uint8_t *dst, - unsigned int bytes_per_scanline) { + unsigned int bytes_per_scanline, int compressed) { unsigned int i = 0; unsigned char run, value; - while (i= 0xc0) { - run = value & 0x3f; + if (compressed) { + while (i= 0xc0) { + run = value & 0x3f; + value = *src++; + } + while (ipriv_data; AVFrame *picture = data; AVFrame * const p = &s->picture; - int xmin, ymin, xmax, ymax; + int compressed, xmin, ymin, xmax, ymax; unsigned int w, h, bits_per_pixel, bytes_per_line, nplanes, stride, y, x, bytes_per_scanline; uint8_t *ptr; uint8_t const *bufstart = buf; + uint8_t *scanline; + int ret = -1; - if (buf[0] != 0x0a || buf[1] > 5 || buf[1] == 1 || buf[2] != 1) { + if (buf[0] != 0x0a || buf[1] > 5) { av_log(avctx, AV_LOG_ERROR, "this is not PCX encoded data\n"); return -1; } + compressed = buf[2]; xmin = AV_RL16(buf+ 4); ymin = AV_RL16(buf+ 6); xmax = AV_RL16(buf+ 8); @@ -133,7 +143,7 @@ static int pcx_decode_frame(AVCodecContext *avctx, void *data, int *data_size, if (p->data[0]) avctx->release_buffer(avctx, p); - if (avcodec_check_dimensions(avctx, w, h)) + if (av_image_check_size(w, h, 0, avctx)) return -1; if (w != avctx->width || h != avctx->height) avcodec_set_dimensions(avctx, w, h); @@ -142,16 +152,18 @@ static int pcx_decode_frame(AVCodecContext *avctx, void *data, int *data_size, return -1; } - p->pict_type = FF_I_TYPE; + p->pict_type = AV_PICTURE_TYPE_I; ptr = p->data[0]; stride = p->linesize[0]; - if (nplanes == 3 && bits_per_pixel == 8) { - uint8_t scanline[bytes_per_scanline]; + scanline = av_malloc(bytes_per_scanline); + if (!scanline) + return AVERROR(ENOMEM); + if (nplanes == 3 && bits_per_pixel == 8) { for (y=0; y> (x&7), v = 0; @@ -223,7 +232,10 @@ static int pcx_decode_frame(AVCodecContext *avctx, void *data, int *data_size, *picture = s->picture; *data_size = sizeof(AVFrame); - return buf - bufstart; + ret = buf - bufstart; +end: + av_free(scanline); + return ret; } static av_cold int pcx_end(AVCodecContext *avctx) { @@ -235,16 +247,14 @@ static av_cold int pcx_end(AVCodecContext *avctx) { return 0; } -AVCodec pcx_decoder = { - "pcx", - CODEC_TYPE_VIDEO, - CODEC_ID_PCX, - sizeof(PCXContext), - pcx_init, - NULL, - pcx_end, - pcx_decode_frame, - 0, - NULL, +AVCodec ff_pcx_decoder = { + .name = "pcx", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_PCX, + .priv_data_size = sizeof(PCXContext), + .init = pcx_init, + .close = pcx_end, + .decode = pcx_decode_frame, + .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("PC Paintbrush PCX image"), };