FFmpeg
Main Page
Related Pages
Modules
Namespaces
Namespace List
Namespace Members
All
Functions
Variables
Data Structures
Data Structures
Data Structure Index
Class Hierarchy
Data Fields
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
~
Functions
_
a
c
d
g
i
o
q
r
s
v
~
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Enumerations
Enumerator
a
d
e
f
i
j
l
m
n
p
r
s
v
Files
File List
Globals
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Functions
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Typedefs
a
b
c
d
e
f
g
h
i
l
m
o
p
q
r
s
t
u
v
w
x
y
Enumerations
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Enumerator
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Macros
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Examples
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Modules
Pages
libavcodec
aliaspixdec.c
Go to the documentation of this file.
1
/*
2
* Alias PIX image decoder
3
* Copyright (C) 2014 Vittorio Giovara <vittorio.giovara@gmail.com>
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/intreadwrite.h
"
23
24
#include "
avcodec.h
"
25
#include "
bytestream.h
"
26
#include "
internal.h
"
27
28
#define ALIAS_HEADER_SIZE 10
29
30
static
int
decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
int
*got_frame,
31
AVPacket
*avpkt)
32
{
33
AVFrame
*
f
=
data
;
34
GetByteContext
gb;
35
int
width
,
height
,
ret
, bits_pixel,
pixel
;
36
uint8_t
*out_buf;
37
uint8_t
count;
38
int
x, y;
39
40
bytestream2_init
(&gb, avpkt->
data
, avpkt->
size
);
41
42
if
(
bytestream2_get_bytes_left
(&gb) <
ALIAS_HEADER_SIZE
) {
43
av_log
(avctx,
AV_LOG_ERROR
,
"Header too small %d.\n"
, avpkt->
size
);
44
return
AVERROR_INVALIDDATA
;
45
}
46
47
width
= bytestream2_get_be16u(&gb);
48
height
= bytestream2_get_be16u(&gb);
49
bytestream2_skipu
(&gb, 4);
// obsolete X, Y offset
50
bits_pixel = bytestream2_get_be16u(&gb);
51
52
if
(bits_pixel == 24)
53
avctx->
pix_fmt
=
AV_PIX_FMT_BGR24
;
54
else
if
(bits_pixel == 8)
55
avctx->
pix_fmt
=
AV_PIX_FMT_GRAY8
;
56
else
{
57
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid pixel format.\n"
);
58
return
AVERROR_INVALIDDATA
;
59
}
60
61
ret
=
ff_set_dimensions
(avctx,
width
,
height
);
62
if
(
ret
< 0)
63
return
ret
;
64
65
if
(
bytestream2_get_bytes_left
(&gb) <
width
*
height
/ 255)
66
return
AVERROR_INVALIDDATA
;
67
68
ret
=
ff_get_buffer
(avctx,
f
, 0);
69
if
(
ret
< 0)
70
return
ret
;
71
72
f
->pict_type =
AV_PICTURE_TYPE_I
;
73
f
->key_frame = 1;
74
75
x = 0;
76
y = 1;
77
out_buf =
f
->data[0];
78
while
(
bytestream2_get_bytes_left
(&gb) > 0) {
79
int
i
;
80
81
/* set buffer at the right position at every new line */
82
if
(x == avctx->
width
) {
83
x = 0;
84
out_buf =
f
->data[0] +
f
->linesize[0] * y++;
85
if
(y > avctx->
height
) {
86
av_log
(avctx,
AV_LOG_ERROR
,
87
"Ended frame decoding with %d bytes left.\n"
,
88
bytestream2_get_bytes_left
(&gb));
89
return
AVERROR_INVALIDDATA
;
90
}
91
}
92
93
/* read packet and copy data */
94
count = bytestream2_get_byteu(&gb);
95
if
(!count || x + count > avctx->
width
) {
96
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid run length %d.\n"
, count);
97
return
AVERROR_INVALIDDATA
;
98
}
99
100
if
(avctx->
pix_fmt
==
AV_PIX_FMT_BGR24
) {
101
pixel
= bytestream2_get_be24(&gb);
102
for
(
i
= 0;
i
< count;
i
++) {
103
AV_WB24
(out_buf,
pixel
);
104
out_buf += 3;
105
}
106
}
else
{
// AV_PIX_FMT_GRAY8
107
pixel
= bytestream2_get_byte(&gb);
108
for
(
i
= 0;
i
< count;
i
++)
109
*out_buf++ =
pixel
;
110
}
111
112
x +=
i
;
113
}
114
115
if
(x !=
width
|| y !=
height
) {
116
av_log
(avctx,
AV_LOG_ERROR
,
"Picture stopped at %d,%d.\n"
, x, y);
117
return
AVERROR_INVALIDDATA
;
118
}
119
120
*got_frame = 1;
121
return
avpkt->
size
;
122
}
123
124
AVCodec
ff_alias_pix_decoder
= {
125
.
name
=
"alias_pix"
,
126
.long_name =
NULL_IF_CONFIG_SMALL
(
"Alias/Wavefront PIX image"
),
127
.type =
AVMEDIA_TYPE_VIDEO
,
128
.id =
AV_CODEC_ID_ALIAS_PIX
,
129
.decode =
decode_frame
,
130
.capabilities =
AV_CODEC_CAP_DR1
,
131
};
AVCodec
AVCodec.
Definition:
codec.h:197
GetByteContext
Definition:
bytestream.h:33
bytestream2_skipu
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition:
bytestream.h:174
AVFrame
This structure describes decoded (raw) audio or video data.
Definition:
frame.h:318
internal.h
AVPacket::data
uint8_t * data
Definition:
packet.h:369
data
const char data[16]
Definition:
mxf.c:142
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition:
pixfmt.h:69
ALIAS_HEADER_SIZE
#define ALIAS_HEADER_SIZE
Definition:
aliaspixdec.c:28
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition:
log.h:194
width
#define width
intreadwrite.h
AV_CODEC_ID_ALIAS_PIX
@ AV_CODEC_ID_ALIAS_PIX
Definition:
codec_id.h:226
decode_frame
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition:
aliaspixdec.c:30
f
#define f(width, name)
Definition:
cbs_vp9.c:255
pixel
uint8_t pixel
Definition:
tiny_ssim.c:42
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition:
avutil.h:274
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition:
pixfmt.h:74
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition:
bytestream.h:158
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition:
decode.c:1900
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition:
codec.h:52
AVPacket::size
int size
Definition:
packet.h:370
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition:
internal.h:117
AV_WB24
#define AV_WB24(p, d)
Definition:
intreadwrite.h:450
height
#define height
i
int i
Definition:
input.c:407
uint8_t
uint8_t
Definition:
audio_convert.c:194
AVCodec::name
const char * name
Name of the codec implementation.
Definition:
codec.h:204
AVCodecContext::height
int height
Definition:
avcodec.h:709
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition:
avcodec.h:746
ff_alias_pix_decoder
AVCodec ff_alias_pix_decoder
Definition:
aliaspixdec.c:124
avcodec.h
ret
ret
Definition:
filter_design.txt:187
AVCodecContext
main external API structure.
Definition:
avcodec.h:536
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition:
avutil.h:201
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition:
utils.c:84
AVPacket
This structure stores compressed data.
Definition:
packet.h:346
AVCodecContext::width
int width
picture width / height.
Definition:
avcodec.h:709
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition:
bytestream.h:137
av_log
#define av_log(a,...)
Definition:
tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition:
error.h:59
Generated on Wed Aug 24 2022 21:33:46 for FFmpeg by
1.8.17