Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
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 Libav.
6
*
7
* Libav 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
* Libav 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 Libav; 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
"
23
#include "
libavutil/intreadwrite.h
"
24
#include "
libavutil/imgutils.h
"
25
#include "
avcodec.h
"
26
#include "
internal.h
"
27
28
static
int
ptx_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
int
*got_frame,
29
AVPacket
*avpkt) {
30
const
uint8_t
*buf = avpkt->
data
;
31
const
uint8_t
*buf_end = avpkt->
data
+ avpkt->
size
;
32
AVFrame
*
const
p =
data
;
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)
38
return
AVERROR_INVALIDDATA
;
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"
);
46
return
AVERROR_PATCHWELCOME
;
47
}
48
49
avctx->
pix_fmt
=
AV_PIX_FMT_RGB555
;
50
51
if
(buf_end - buf < offset)
52
return
AVERROR_INVALIDDATA
;
53
if
(offset != 0x2c)
54
avpriv_request_sample
(avctx,
"offset != 0x2c"
);
55
56
buf += offset;
57
58
if
((ret =
ff_set_dimensions
(avctx, w, h)) < 0)
59
return
ret;
60
61
if
((ret =
ff_get_buffer
(avctx, p, 0)) < 0) {
62
av_log
(avctx,
AV_LOG_ERROR
,
"get_buffer() failed\n"
);
63
return
ret;
64
}
65
66
p->
pict_type
=
AV_PICTURE_TYPE_I
;
67
68
ptr = p->
data
[0];
69
stride = p->
linesize
[0];
70
71
for
(y = 0; y < h && buf_end - buf >= w * bytes_per_pixel; y++) {
72
#if HAVE_BIGENDIAN
73
unsigned
int
x;
74
for
(x=0; x<w*bytes_per_pixel; x+=bytes_per_pixel)
75
AV_WN16
(ptr+x,
AV_RL16
(buf+x));
76
#else
77
memcpy(ptr, buf, w*bytes_per_pixel);
78
#endif
79
ptr +=
stride
;
80
buf += w*bytes_per_pixel;
81
}
82
83
*got_frame = 1;
84
85
if
(y < h) {
86
av_log
(avctx,
AV_LOG_WARNING
,
"incomplete packet\n"
);
87
return
avpkt->
size
;
88
}
89
90
return
offset + w*h*bytes_per_pixel;
91
}
92
93
AVCodec
ff_ptx_decoder
= {
94
.
name
=
"ptx"
,
95
.long_name =
NULL_IF_CONFIG_SMALL
(
"V.Flash PTX image"
),
96
.type =
AVMEDIA_TYPE_VIDEO
,
97
.id =
AV_CODEC_ID_PTX
,
98
.decode =
ptx_decode_frame
,
99
.capabilities =
CODEC_CAP_DR1
,
100
};
Generated on Tue Mar 1 2016 21:14:44 for Libav by
1.8.4