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
h
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
h
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 "
codec_internal.h
"
27
#include "
decode.h
"
28
29
#define ALIAS_HEADER_SIZE 10
30
31
static
int
decode_frame
(
AVCodecContext
*avctx,
AVFrame
*
f
,
32
int
*got_frame,
AVPacket
*avpkt)
33
{
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
x = 0;
73
y = 1;
74
out_buf =
f
->data[0];
75
while
(
bytestream2_get_bytes_left
(&gb) > 0) {
76
int
i
;
77
78
/* set buffer at the right position at every new line */
79
if
(x == avctx->
width
) {
80
x = 0;
81
out_buf =
f
->data[0] +
f
->linesize[0] * y++;
82
if
(y > avctx->
height
) {
83
av_log
(avctx,
AV_LOG_ERROR
,
84
"Ended frame decoding with %d bytes left.\n"
,
85
bytestream2_get_bytes_left
(&gb));
86
return
AVERROR_INVALIDDATA
;
87
}
88
}
89
90
/* read packet and copy data */
91
count = bytestream2_get_byteu(&gb);
92
if
(!count || x + count > avctx->
width
) {
93
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid run length %d.\n"
, count);
94
return
AVERROR_INVALIDDATA
;
95
}
96
97
if
(avctx->
pix_fmt
==
AV_PIX_FMT_BGR24
) {
98
pixel
= bytestream2_get_be24(&gb);
99
for
(
i
= 0;
i
< count;
i
++) {
100
AV_WB24
(out_buf,
pixel
);
101
out_buf += 3;
102
}
103
}
else
{
// AV_PIX_FMT_GRAY8
104
pixel
= bytestream2_get_byte(&gb);
105
for
(
i
= 0;
i
< count;
i
++)
106
*out_buf++ =
pixel
;
107
}
108
109
x +=
i
;
110
}
111
112
if
(x !=
width
|| y !=
height
) {
113
av_log
(avctx,
AV_LOG_ERROR
,
"Picture stopped at %d,%d.\n"
, x, y);
114
return
AVERROR_INVALIDDATA
;
115
}
116
117
*got_frame = 1;
118
return
avpkt->
size
;
119
}
120
121
const
FFCodec
ff_alias_pix_decoder
= {
122
.
p
.
name
=
"alias_pix"
,
123
CODEC_LONG_NAME
(
"Alias/Wavefront PIX image"
),
124
.p.type =
AVMEDIA_TYPE_VIDEO
,
125
.p.id =
AV_CODEC_ID_ALIAS_PIX
,
126
.p.capabilities =
AV_CODEC_CAP_DR1
,
127
FF_CODEC_DECODE_CB
(
decode_frame
),
128
};
GetByteContext
Definition:
bytestream.h:33
ff_alias_pix_decoder
const FFCodec ff_alias_pix_decoder
Definition:
aliaspixdec.c:121
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:410
AVPacket::data
uint8_t * data
Definition:
packet.h:539
FFCodec
Definition:
codec_internal.h:127
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition:
pixfmt.h:76
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:91
FFCodec::p
AVCodec p
The public AVCodec.
Definition:
codec_internal.h:131
ALIAS_HEADER_SIZE
#define ALIAS_HEADER_SIZE
Definition:
aliaspixdec.c:29
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition:
log.h:209
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition:
codec_internal.h:341
intreadwrite.h
AV_CODEC_ID_ALIAS_PIX
@ AV_CODEC_ID_ALIAS_PIX
Definition:
codec_id.h:231
decode.h
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition:
codec_internal.h:326
pixel
uint8_t pixel
Definition:
tiny_ssim.c:41
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition:
pixfmt.h:81
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition:
bytestream.h:158
f
f
Definition:
af_crystalizer.c:122
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition:
decode.c:1703
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:540
height
#define height
Definition:
dsp.h:85
codec_internal.h
AV_WB24
#define AV_WB24(p, d)
Definition:
intreadwrite.h:446
i
#define i(width, name, range_min, range_max)
Definition:
cbs_h2645.c:256
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *f, int *got_frame, AVPacket *avpkt)
Definition:
aliaspixdec.c:31
AVCodec::name
const char * name
Name of the codec implementation.
Definition:
codec.h:194
AVCodecContext::height
int height
Definition:
avcodec.h:632
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition:
avcodec.h:671
avcodec.h
ret
ret
Definition:
filter_design.txt:187
AVCodecContext
main external API structure.
Definition:
avcodec.h:451
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition:
avutil.h:201
AVPacket
This structure stores compressed data.
Definition:
packet.h:516
AVCodecContext::width
int width
picture width / height.
Definition:
avcodec.h:632
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:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition:
error.h:61
width
#define width
Definition:
dsp.h:85
Generated on Sat Mar 22 2025 19:21:24 for FFmpeg by
1.8.17