FFmpeg
Loading...
Searching...
No Matches
ptx.c
Go to the documentation of this file.
1/*
2 * V.Flash PTX (.ptx) image decoder
3 * Copyright (c) 2007 Ivo van Poorten
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "libavutil/common.h"
24#include "avcodec.h"
25#include "codec_internal.h"
26#include "decode.h"
27
29 int *got_frame, AVPacket *avpkt)
30{
31 const uint8_t *buf = avpkt->data;
32 const uint8_t *buf_end = avpkt->data + avpkt->size;
33 unsigned int offset, w, h, y, stride, bytes_per_pixel;
34 int ret;
35 uint8_t *ptr;
36
37 if (buf_end - buf < 14)
39 offset = AV_RL16(buf);
40 w = AV_RL16(buf+8);
41 h = AV_RL16(buf+10);
42 bytes_per_pixel = AV_RL16(buf+12) >> 3;
43
44 if (bytes_per_pixel != 2) {
45 avpriv_request_sample(avctx, "Image format not RGB15");
47 }
48
50
51 if (buf_end - buf < offset)
53 if (offset != 0x2c)
54 avpriv_request_sample(avctx, "offset != 0x2c");
55
56 buf += offset;
57
58 if (buf_end - buf < w * bytes_per_pixel)
60
61 if ((ret = ff_set_dimensions(avctx, w, h)) < 0)
62 return ret;
63
64 if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
65 return ret;
66
67 p->pict_type = AV_PICTURE_TYPE_I;
68
69 ptr = p->data[0];
70 stride = p->linesize[0];
71
72 for (y = 0; y < h && buf_end - buf >= w * bytes_per_pixel; y++) {
73 memcpy(ptr, buf, w*bytes_per_pixel);
74 ptr += stride;
75 buf += w*bytes_per_pixel;
76 }
77
78 *got_frame = 1;
79
80 if (y < h) {
81 av_log(avctx, AV_LOG_WARNING, "incomplete packet\n");
82 return avpkt->size;
83 }
84
85 return offset + w*h*bytes_per_pixel;
86}
87
89 .p.name = "ptx",
90 CODEC_LONG_NAME("V.Flash PTX image"),
91 .p.type = AVMEDIA_TYPE_VIDEO,
92 .p.id = AV_CODEC_ID_PTX,
93 .p.capabilities = AV_CODEC_CAP_DR1,
95};
const FFCodec ff_ptx_decoder
Definition ptx.c:88
Libavcodec external API header.
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
common internal and external API header
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition decode.c:1777
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Definition utils.c:91
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AV_CODEC_ID_PTX
Definition codec_id.h:154
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
#define AV_RL16(p)
unsigned offset
Definition libaomenc.c:763
uint8_t w
Definition llvidencdsp.c:39
@ AV_PIX_FMT_BGR555LE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:120
static int ptx_decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
Definition ptx.c:28
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
#define stride
#define avpriv_request_sample(...)
#define av_log(a,...)