Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
53ec1c81
Commit
53ec1c81
authored
May 26, 2013
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
j2k: merge cosmetics and non functional changes from jpeg2000
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
e5c7bafb
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
138 additions
and
94 deletions
+138
-94
j2k.c
libavcodec/j2k.c
+29
-10
j2k.h
libavcodec/j2k.h
+20
-11
j2kdec.c
libavcodec/j2kdec.c
+89
-73
No files found.
libavcodec/j2k.c
View file @
53ec1c81
...
...
@@ -114,7 +114,7 @@ static int getsigctxno(int flag, int bandno)
if
(
v
==
1
)
return
3
;
if
(
d
>=
2
)
return
2
;
if
(
d
==
1
)
return
1
;
}
else
{
}
else
{
if
(
d
>=
3
)
return
8
;
if
(
d
==
2
)
{
if
(
h
+
v
>=
1
)
return
7
;
...
...
@@ -172,7 +172,10 @@ void ff_j2k_set_significant(Jpeg2000T1Context *t1, int x, int y,
t1
->
flags
[
y
-
1
][
x
-
1
]
|=
JPEG2000_T1_SIG_SE
;
}
int
ff_j2k_init_component
(
Jpeg2000Component
*
comp
,
Jpeg2000CodingStyle
*
codsty
,
Jpeg2000QuantStyle
*
qntsty
,
int
cbps
,
int
dx
,
int
dy
)
int
ff_j2k_init_component
(
Jpeg2000Component
*
comp
,
Jpeg2000CodingStyle
*
codsty
,
Jpeg2000QuantStyle
*
qntsty
,
int
cbps
,
int
dx
,
int
dy
)
{
uint8_t
log2_band_prec_width
,
log2_band_prec_height
;
int
reslevelno
,
bandno
,
gbandno
=
0
,
ret
,
i
,
j
,
csize
=
1
;
...
...
@@ -182,16 +185,20 @@ int ff_j2k_init_component(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty,
for
(
i
=
0
;
i
<
2
;
i
++
)
csize
*=
comp
->
coord
[
i
][
1
]
-
comp
->
coord
[
i
][
0
];
comp
->
data
=
av_malloc_array
(
csize
,
sizeof
(
int
));
comp
->
data
=
av_malloc_array
(
csize
,
sizeof
(
*
comp
->
data
));
if
(
!
comp
->
data
)
return
AVERROR
(
ENOMEM
);
comp
->
reslevel
=
av_malloc_array
(
codsty
->
nreslevels
,
sizeof
(
*
comp
->
reslevel
));
if
(
!
comp
->
reslevel
)
return
AVERROR
(
ENOMEM
);
/* LOOP on resolution levels */
for
(
reslevelno
=
0
;
reslevelno
<
codsty
->
nreslevels
;
reslevelno
++
)
{
int
declvl
=
codsty
->
nreslevels
-
reslevelno
;
int
declvl
=
codsty
->
nreslevels
-
reslevelno
;
// N_L -r see ISO/IEC 15444-1:2002 B.5
Jpeg2000ResLevel
*
reslevel
=
comp
->
reslevel
+
reslevelno
;
/* Compute borders for each resolution level.
* Computation of trx_0, trx_1, try_0 and try_1.
* see ISO/IEC 15444-1:2002 eq. B.5 and B-14 */
for
(
i
=
0
;
i
<
2
;
i
++
)
for
(
j
=
0
;
j
<
2
;
j
++
)
reslevel
->
coord
[
i
][
j
]
=
...
...
@@ -200,22 +207,34 @@ int ff_j2k_init_component(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty,
reslevel
->
log2_prec_width
=
codsty
->
log2_prec_widths
[
reslevelno
];
reslevel
->
log2_prec_height
=
codsty
->
log2_prec_heights
[
reslevelno
];
/* Number of bands for each resolution level */
if
(
reslevelno
==
0
)
reslevel
->
nbands
=
1
;
else
reslevel
->
nbands
=
3
;
/* Number of precincts wich span the tile for resolution level reslevelno
* see B.6 in ISO/IEC 15444-1:2002 eq. B-16
* num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -| - (trx_0 / 2 ^ log2_prec_width)
* num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| - (try_0 / 2 ^ log2_prec_width)
* for Dcinema profiles in JPEG 2000
* num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -|
* num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| */
if
(
reslevel
->
coord
[
0
][
1
]
==
reslevel
->
coord
[
0
][
0
])
reslevel
->
num_precincts_x
=
0
;
else
reslevel
->
num_precincts_x
=
ff_jpeg2000_ceildivpow2
(
reslevel
->
coord
[
0
][
1
],
reslevel
->
log2_prec_width
)
-
(
reslevel
->
coord
[
0
][
0
]
>>
reslevel
->
log2_prec_width
);
reslevel
->
num_precincts_x
=
ff_jpeg2000_ceildivpow2
(
reslevel
->
coord
[
0
][
1
],
reslevel
->
log2_prec_width
)
-
(
reslevel
->
coord
[
0
][
0
]
>>
reslevel
->
log2_prec_width
);
if
(
reslevel
->
coord
[
1
][
1
]
==
reslevel
->
coord
[
1
][
0
])
reslevel
->
num_precincts_y
=
0
;
else
reslevel
->
num_precincts_y
=
ff_jpeg2000_ceildivpow2
(
reslevel
->
coord
[
1
][
1
],
reslevel
->
log2_prec_height
)
-
(
reslevel
->
coord
[
1
][
0
]
>>
reslevel
->
log2_prec_height
);
reslevel
->
num_precincts_y
=
ff_jpeg2000_ceildivpow2
(
reslevel
->
coord
[
1
][
1
],
reslevel
->
log2_prec_height
)
-
(
reslevel
->
coord
[
1
][
0
]
>>
reslevel
->
log2_prec_height
);
reslevel
->
band
=
av_malloc_array
(
reslevel
->
nbands
,
sizeof
(
*
reslevel
->
band
));
if
(
!
reslevel
->
band
)
...
...
@@ -252,7 +271,7 @@ int ff_j2k_init_component(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty,
reslevel
->
log2_prec_width
);
band
->
log2_cblk_height
=
FFMIN
(
codsty
->
log2_cblk_height
,
reslevel
->
log2_prec_height
);
}
else
{
}
else
{
/* 3 bands x0_b = 1 y0_b = 0; x0_b = 0 y0_b = 1; x0_b = y0_b = 1 */
/* x0_b and y0_b are computed with ((bandno + 1 >> i) & 1) */
for
(
i
=
0
;
i
<
2
;
i
++
)
...
...
@@ -376,7 +395,7 @@ void ff_j2k_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty)
for
(
reslevelno
=
0
;
reslevelno
<
codsty
->
nreslevels
;
reslevelno
++
)
{
Jpeg2000ResLevel
*
reslevel
=
comp
->
reslevel
+
reslevelno
;
for
(
bandno
=
0
;
bandno
<
reslevel
->
nbands
;
bandno
++
)
{
for
(
bandno
=
0
;
bandno
<
reslevel
->
nbands
;
bandno
++
)
{
Jpeg2000Band
*
band
=
reslevel
->
band
+
bandno
;
for
(
precno
=
0
;
precno
<
reslevel
->
num_precincts_x
*
reslevel
->
num_precincts_y
;
precno
++
)
{
Jpeg2000Prec
*
prec
=
band
->
prec
+
precno
;
...
...
libavcodec/j2k.h
View file @
53ec1c81
...
...
@@ -24,11 +24,14 @@
#define AVCODEC_J2K_H
/**
* JPEG2000 tables
* @file
* @author Kamil Nowosad
* JPEG 2000 structures and defines common
* to encoder and decoder
*/
#include <stdint.h>
#include "avcodec.h"
#include "mqc.h"
#include "j2k_dwt.h"
...
...
@@ -114,7 +117,7 @@ enum Jpeg2000Quantsty { // quantization style
typedef
struct
Jpeg2000T1Context
{
int
data
[
JPEG2000_MAX_CBLKW
][
JPEG2000_MAX_CBLKH
];
int
flags
[
JPEG2000_MAX_CBLKW
+
2
][
JPEG2000_MAX_CBLKH
+
2
];
int
flags
[
JPEG2000_MAX_CBLKW
+
2
][
JPEG2000_MAX_CBLKH
+
2
];
MqcState
mqc
;
}
Jpeg2000T1Context
;
...
...
@@ -139,10 +142,10 @@ typedef struct Jpeg2000CodingStyle {
}
Jpeg2000CodingStyle
;
typedef
struct
Jpeg2000QuantStyle
{
uint8_t
expn
[
32
*
3
];
// quantization exponent
uint8_t
expn
[
32
*
3
];
// quantization exponent
uint16_t
mant
[
32
*
3
];
// quantization mantissa
uint8_t
quantsty
;
// quantization style
uint8_t
nguardbits
;
// number of guard bits
uint8_t
quantsty
;
// quantization style
uint8_t
nguardbits
;
// number of guard bits
}
Jpeg2000QuantStyle
;
typedef
struct
Jpeg2000Pass
{
...
...
@@ -150,7 +153,7 @@ typedef struct Jpeg2000Pass {
int64_t
disto
;
}
Jpeg2000Pass
;
typedef
struct
Jpeg2000Cblk
{
typedef
struct
Jpeg2000Cblk
{
uint8_t
npasses
;
uint8_t
ninclpasses
;
// number coding of passes included in codestream
uint8_t
nonzerobits
;
...
...
@@ -179,7 +182,7 @@ typedef struct Jpeg2000Band {
typedef
struct
Jpeg2000ResLevel
{
uint8_t
nbands
;
uint16_t
coord
[
2
][
2
];
// border coordinates {{x0, x1}, {y0, y1}}
uint16_t
coord
[
2
][
2
];
// border coordinates {{x0, x1}, {y0, y1}}
uint16_t
num_precincts_x
,
num_precincts_y
;
// number of precincts in x/y direction
uint8_t
log2_prec_width
,
log2_prec_height
;
// exponent of precinct size
Jpeg2000Band
*
band
;
...
...
@@ -189,7 +192,7 @@ typedef struct Jpeg2000Component {
Jpeg2000ResLevel
*
reslevel
;
DWTContext
dwt
;
int
*
data
;
uint16_t
coord
[
2
][
2
];
// border coordinates {{x0, x1}, {y0, y1}}
uint16_t
coord
[
2
][
2
];
// border coordinates {{x0, x1}, {y0, y1}}
}
Jpeg2000Component
;
/* misc tools */
...
...
@@ -207,9 +210,14 @@ static inline int ff_jpeg2000_ceildiv(int a, int b)
Jpeg2000TgtNode
*
ff_j2k_tag_tree_init
(
int
w
,
int
h
);
/* TIER-1 routines */
/* Set up lookup tables used in TIER-1. */
void
ff_jpeg2000_init_tier1_luts
(
void
);
void
ff_j2k_set_significant
(
Jpeg2000T1Context
*
t1
,
int
x
,
int
y
,
int
negative
);
/* Update significance of a coefficient at current position (x,y) and
* for neighbors. */
void
ff_j2k_set_significant
(
Jpeg2000T1Context
*
t1
,
int
x
,
int
y
,
int
negative
);
extern
uint8_t
ff_jpeg2000_sigctxno_lut
[
256
][
4
];
...
...
@@ -220,11 +228,12 @@ static inline int ff_jpeg2000_getsigctxno(int flag, int bandno)
return
ff_jpeg2000_sigctxno_lut
[
flag
&
255
][
bandno
];
}
static
const
uint8_t
refctxno_lut
[
2
][
2
]
=
{
{
14
,
15
},
{
16
,
16
}
};
/* Get context label (number in range[14..16]) of a coefficient for magnitude
* refinement pass. */
static
inline
int
ff_jpeg2000_getrefctxno
(
int
flag
)
{
static
const
uint8_t
refctxno_lut
[
2
][
2
]
=
{
{
14
,
15
},
{
16
,
16
}
};
return
refctxno_lut
[(
flag
>>
14
)
&
1
][(
flag
&
255
)
!=
0
];
}
...
...
libavcodec/j2kdec.c
View file @
53ec1c81
...
...
@@ -41,10 +41,10 @@
#define HAD_QCC 0x02
typedef
struct
Jpeg2000Tile
{
Jpeg2000Component
*
comp
;
uint8_t
properties
[
4
];
Jpeg2000CodingStyle
codsty
[
4
];
Jpeg2000QuantStyle
qntsty
[
4
];
Jpeg2000Component
*
comp
;
uint8_t
properties
[
4
];
Jpeg2000CodingStyle
codsty
[
4
];
Jpeg2000QuantStyle
qntsty
[
4
];
}
Jpeg2000Tile
;
typedef
struct
Jpeg2000DecoderContext
{
...
...
@@ -98,8 +98,9 @@ static void j2k_flush(Jpeg2000DecoderContext *s)
s
->
bit_index
=
8
;
}
/** decode the value stored in node */
static
int
tag_tree_decode
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000TgtNode
*
node
,
int
threshold
)
/* decode the value stored in node */
static
int
tag_tree_decode
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000TgtNode
*
node
,
int
threshold
)
{
Jpeg2000TgtNode
*
stack
[
30
];
int
sp
=
-
1
,
curval
=
0
;
...
...
@@ -109,7 +110,7 @@ static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node, int
while
(
node
&&
!
node
->
vis
)
{
stack
[
++
sp
]
=
node
;
node
=
node
->
parent
;
node
=
node
->
parent
;
}
if
(
node
)
...
...
@@ -169,27 +170,27 @@ static int get_siz(Jpeg2000DecoderContext *s)
for
(
i
=
0
;
i
<
s
->
ncomponents
;
i
++
)
{
// Ssiz_i XRsiz_i, YRsiz_i
uint8_t
x
=
bytestream2_get_byteu
(
&
s
->
g
);
s
->
cbps
[
i
]
=
(
x
&
0x7f
)
+
1
;
s
->
cbps
[
i
]
=
(
x
&
0x7f
)
+
1
;
s
->
precision
=
FFMAX
(
s
->
cbps
[
i
],
s
->
precision
);
s
->
sgnd
[
i
]
=
!!
(
x
&
0x80
);
s
->
cdx
[
i
]
=
bytestream2_get_byteu
(
&
s
->
g
);
s
->
cdy
[
i
]
=
bytestream2_get_byteu
(
&
s
->
g
);
}
s
->
numXtiles
=
ff_jpeg2000_ceildiv
(
s
->
width
-
s
->
tile_offset_x
,
s
->
tile_width
);
s
->
numXtiles
=
ff_jpeg2000_ceildiv
(
s
->
width
-
s
->
tile_offset_x
,
s
->
tile_width
);
s
->
numYtiles
=
ff_jpeg2000_ceildiv
(
s
->
height
-
s
->
tile_offset_y
,
s
->
tile_height
);
if
(
s
->
numXtiles
*
(
uint64_t
)
s
->
numYtiles
>
INT_MAX
/
sizeof
(
Jpeg2000Tile
))
return
AVERROR
(
EINVAL
);
s
->
tile
=
av_mallocz
(
s
->
numXtiles
*
s
->
numYtiles
*
sizeof
(
Jpeg2000T
ile
));
s
->
tile
=
av_mallocz
(
s
->
numXtiles
*
s
->
numYtiles
*
sizeof
(
*
s
->
t
ile
));
if
(
!
s
->
tile
)
return
AVERROR
(
ENOMEM
);
for
(
i
=
0
;
i
<
s
->
numXtiles
*
s
->
numYtiles
;
i
++
)
{
Jpeg2000Tile
*
tile
=
s
->
tile
+
i
;
tile
->
comp
=
av_mallocz
(
s
->
ncomponents
*
sizeof
(
Jpeg2000Component
));
tile
->
comp
=
av_mallocz
(
s
->
ncomponents
*
sizeof
(
*
tile
->
comp
));
if
(
!
tile
->
comp
)
return
AVERROR
(
ENOMEM
);
}
...
...
@@ -227,7 +228,7 @@ static int get_siz(Jpeg2000DecoderContext *s)
return
0
;
}
/*
*
get common part for COD and COC segments */
/* get common part for COD and COC segments */
static
int
get_cox
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
c
)
{
uint8_t
byte
;
...
...
@@ -268,8 +269,9 @@ static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
return
0
;
}
/** get coding parameters for a particular tile or whole image*/
static
int
get_cod
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
c
,
uint8_t
*
properties
)
/* get coding parameters for a particular tile or whole image*/
static
int
get_cod
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
c
,
uint8_t
*
properties
)
{
Jpeg2000CodingStyle
tmp
;
int
compno
;
...
...
@@ -286,18 +288,19 @@ static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c, uint8_t *p
}
tmp
.
nlayers
=
bytestream2_get_be16u
(
&
s
->
g
);
tmp
.
mct
=
bytestream2_get_byteu
(
&
s
->
g
);
// multiple component transformation
tmp
.
mct
=
bytestream2_get_byteu
(
&
s
->
g
);
// multiple component transformation
get_cox
(
s
,
&
tmp
);
for
(
compno
=
0
;
compno
<
s
->
ncomponents
;
compno
++
)
{
for
(
compno
=
0
;
compno
<
s
->
ncomponents
;
compno
++
)
if
(
!
(
properties
[
compno
]
&
HAD_COC
))
memcpy
(
c
+
compno
,
&
tmp
,
sizeof
(
Jpeg2000CodingStyle
));
}
memcpy
(
c
+
compno
,
&
tmp
,
sizeof
(
tmp
));
return
0
;
}
/** get coding parameters for a component in the whole image on a particular tile */
static
int
get_coc
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
c
,
uint8_t
*
properties
)
/* Get coding parameters for a component in the whole image or a
* particular tile. */
static
int
get_coc
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
c
,
uint8_t
*
properties
)
{
int
compno
;
...
...
@@ -314,7 +317,7 @@ static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c, uint8_t *p
return
0
;
}
/*
* get common part for QCD and QCC segments
*/
/*
Get common part for QCD and QCC segments.
*/
static
int
get_qcx
(
Jpeg2000DecoderContext
*
s
,
int
n
,
Jpeg2000QuantStyle
*
q
)
{
int
i
,
x
;
...
...
@@ -325,7 +328,7 @@ static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
x
=
bytestream2_get_byteu
(
&
s
->
g
);
// Sqcd
q
->
nguardbits
=
x
>>
5
;
q
->
quantsty
=
x
&
0x1f
;
q
->
quantsty
=
x
&
0x1f
;
if
(
q
->
quantsty
==
JPEG2000_QSTY_NONE
)
{
n
-=
3
;
...
...
@@ -336,20 +339,20 @@ static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
}
else
if
(
q
->
quantsty
==
JPEG2000_QSTY_SI
)
{
if
(
bytestream2_get_bytes_left
(
&
s
->
g
)
<
2
)
return
AVERROR
(
EINVAL
);
x
=
bytestream2_get_be16u
(
&
s
->
g
);
x
=
bytestream2_get_be16u
(
&
s
->
g
);
q
->
expn
[
0
]
=
x
>>
11
;
q
->
mant
[
0
]
=
x
&
0x7ff
;
for
(
i
=
1
;
i
<
32
*
3
;
i
++
)
{
int
curexpn
=
FFMAX
(
0
,
q
->
expn
[
0
]
-
(
i
-
1
)
/
3
);
int
curexpn
=
FFMAX
(
0
,
q
->
expn
[
0
]
-
(
i
-
1
)
/
3
);
q
->
expn
[
i
]
=
curexpn
;
q
->
mant
[
i
]
=
q
->
mant
[
0
];
}
}
else
{
}
else
{
n
=
(
n
-
3
)
>>
1
;
if
(
bytestream2_get_bytes_left
(
&
s
->
g
)
<
2
*
n
||
32
*
3
<
n
)
return
AVERROR
(
EINVAL
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
x
=
bytestream2_get_be16u
(
&
s
->
g
);
x
=
bytestream2_get_be16u
(
&
s
->
g
);
q
->
expn
[
i
]
=
x
>>
11
;
q
->
mant
[
i
]
=
x
&
0x7ff
;
}
...
...
@@ -357,8 +360,9 @@ static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
return
0
;
}
/** get quantization parameters for a particular tile or a whole image */
static
int
get_qcd
(
Jpeg2000DecoderContext
*
s
,
int
n
,
Jpeg2000QuantStyle
*
q
,
uint8_t
*
properties
)
/* Get quantization parameters for a particular tile or a whole image. */
static
int
get_qcd
(
Jpeg2000DecoderContext
*
s
,
int
n
,
Jpeg2000QuantStyle
*
q
,
uint8_t
*
properties
)
{
Jpeg2000QuantStyle
tmp
;
int
compno
;
...
...
@@ -371,17 +375,19 @@ static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q, uint
return
0
;
}
/** get quantization parameters for a component in the whole image on in a particular tile */
static
int
get_qcc
(
Jpeg2000DecoderContext
*
s
,
int
n
,
Jpeg2000QuantStyle
*
q
,
uint8_t
*
properties
)
/* Get quantization parameters for a component in the whole image
* on in a particular tile. */
static
int
get_qcc
(
Jpeg2000DecoderContext
*
s
,
int
n
,
Jpeg2000QuantStyle
*
q
,
uint8_t
*
properties
)
{
int
compno
;
if
(
bytestream2_get_bytes_left
(
&
s
->
g
)
<
1
)
return
AVERROR
(
EINVAL
);
compno
=
bytestream2_get_byteu
(
&
s
->
g
);
compno
=
bytestream2_get_byteu
(
&
s
->
g
);
properties
[
compno
]
|=
HAD_QCC
;
return
get_qcx
(
s
,
n
-
1
,
q
+
compno
);
return
get_qcx
(
s
,
n
-
1
,
q
+
compno
);
}
/** get start of tile segment */
...
...
@@ -412,9 +418,9 @@ static int get_sot(Jpeg2000DecoderContext *s)
static
int
init_tile
(
Jpeg2000DecoderContext
*
s
,
int
tileno
)
{
int
compno
,
tilex
=
tileno
%
s
->
numXtiles
,
tiley
=
tileno
/
s
->
numXtiles
;
int
compno
;
int
tilex
=
tileno
%
s
->
numXtiles
;
int
tiley
=
tileno
/
s
->
numXtiles
;
Jpeg2000Tile
*
tile
=
s
->
tile
+
tileno
;
if
(
!
tile
->
comp
)
...
...
@@ -479,8 +485,8 @@ static int decode_packet(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
Jpeg2000Prec
*
prec
=
band
->
prec
+
precno
;
int
pos
=
0
;
if
(
band
->
coord
[
0
][
0
]
==
band
->
coord
[
0
][
1
]
||
band
->
coord
[
1
][
0
]
==
band
->
coord
[
1
][
1
])
if
(
band
->
coord
[
0
][
0
]
==
band
->
coord
[
0
][
1
]
||
band
->
coord
[
1
][
0
]
==
band
->
coord
[
1
][
1
])
continue
;
for
(
cblkny
=
prec
->
yi0
;
cblkny
<
prec
->
yi1
;
cblkny
++
)
...
...
@@ -590,12 +596,13 @@ static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height, int bpn
ff_j2k_set_significant
(
t1
,
x
,
y
,
t1
->
data
[
y
][
x
]
<
0
);
}
t1
->
flags
[
y
+
1
][
x
+
1
]
|=
JPEG2000_T1_VIS
;
t1
->
flags
[
y
+
1
][
x
+
1
]
|=
JPEG2000_T1_VIS
;
}
}
}
static
void
decode_refpass
(
Jpeg2000T1Context
*
t1
,
int
width
,
int
height
,
int
bpno
)
static
void
decode_refpass
(
Jpeg2000T1Context
*
t1
,
int
width
,
int
height
,
int
bpno
)
{
int
phalf
,
nhalf
;
int
y0
,
x
,
y
;
...
...
@@ -605,14 +612,15 @@ static void decode_refpass(Jpeg2000T1Context *t1, int width, int height, int bpn
for
(
y0
=
0
;
y0
<
height
;
y0
+=
4
)
for
(
x
=
0
;
x
<
width
;
x
++
)
for
(
y
=
y0
;
y
<
height
&&
y
<
y0
+
4
;
y
++
)
{
if
((
t1
->
flags
[
y
+
1
][
x
+
1
]
&
(
JPEG2000_T1_SIG
|
JPEG2000_T1_VIS
))
==
JPEG2000_T1_SIG
)
{
int
ctxno
=
ff_jpeg2000_getrefctxno
(
t1
->
flags
[
y
+
1
][
x
+
1
]);
int
r
=
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
ctxno
)
?
phalf
:
nhalf
;
t1
->
data
[
y
][
x
]
+=
t1
->
data
[
y
][
x
]
<
0
?
-
r
:
r
;
t1
->
flags
[
y
+
1
][
x
+
1
]
|=
JPEG2000_T1_REF
;
for
(
y
=
y0
;
y
<
height
&&
y
<
y0
+
4
;
y
++
)
if
((
t1
->
flags
[
y
+
1
][
x
+
1
]
&
(
JPEG2000_T1_SIG
|
JPEG2000_T1_VIS
))
==
JPEG2000_T1_SIG
)
{
int
ctxno
=
ff_jpeg2000_getrefctxno
(
t1
->
flags
[
y
+
1
][
x
+
1
]);
int
r
=
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
ctxno
)
?
phalf
:
nhalf
;
t1
->
data
[
y
][
x
]
+=
t1
->
data
[
y
][
x
]
<
0
?
-
r
:
r
;
t1
->
flags
[
y
+
1
][
x
+
1
]
|=
JPEG2000_T1_REF
;
}
}
}
static
void
decode_clnpass
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000T1Context
*
t1
,
int
width
,
int
height
,
...
...
@@ -622,19 +630,22 @@ static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1, int
for
(
y0
=
0
;
y0
<
height
;
y0
+=
4
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
if
(
y0
+
3
<
height
&&
!
(
(
t1
->
flags
[
y0
+
1
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))
||
(
t1
->
flags
[
y0
+
2
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))
||
(
t1
->
flags
[
y0
+
3
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))
||
(
t1
->
flags
[
y0
+
4
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))))
{
if
(
y0
+
3
<
height
&&
!
((
t1
->
flags
[
y0
+
1
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))
||
(
t1
->
flags
[
y0
+
2
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))
||
(
t1
->
flags
[
y0
+
3
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))
||
(
t1
->
flags
[
y0
+
4
][
x
+
1
]
&
(
JPEG2000_T1_SIG_NB
|
JPEG2000_T1_VIS
|
JPEG2000_T1_SIG
))))
{
if
(
!
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_RL
))
continue
;
runlen
=
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
runlen
=
(
runlen
<<
1
)
|
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
runlen
=
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
runlen
=
(
runlen
<<
1
)
|
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
dec
=
1
;
}
else
{
}
else
{
runlen
=
0
;
dec
=
0
;
dec
=
0
;
}
for
(
y
=
y0
+
runlen
;
y
<
y0
+
4
&&
y
<
height
;
y
++
)
{
...
...
@@ -648,12 +659,17 @@ static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1, int
}
}
if
(
dec
)
{
int
xorbit
,
ctxno
=
ff_jpeg2000_getsgnctxno
(
t1
->
flags
[
y
+
1
][
x
+
1
],
&
xorbit
);
t1
->
data
[
y
][
x
]
=
(
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
ctxno
)
^
xorbit
)
?
-
mask
:
mask
;
int
xorbit
;
int
ctxno
=
ff_jpeg2000_getsgnctxno
(
t1
->
flags
[
y
+
1
][
x
+
1
],
&
xorbit
);
t1
->
data
[
y
][
x
]
=
(
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
ctxno
)
^
xorbit
)
?
-
mask
:
mask
;
ff_j2k_set_significant
(
t1
,
x
,
y
,
t1
->
data
[
y
][
x
]
<
0
);
}
dec
=
0
;
t1
->
flags
[
y
+
1
][
x
+
1
]
&=
~
JPEG2000_T1_VIS
;
t1
->
flags
[
y
+
1
][
x
+
1
]
&=
~
JPEG2000_T1_VIS
;
}
}
}
...
...
@@ -663,13 +679,14 @@ static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1, int
val
=
(
val
<<
1
)
+
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
val
=
(
val
<<
1
)
+
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
val
=
(
val
<<
1
)
+
ff_mqc_decode
(
&
t1
->
mqc
,
t1
->
mqc
.
cx_states
+
MQC_CX_UNI
);
if
(
val
!=
0xa
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Segmentation symbol value incorrect
\n
"
);
}
if
(
val
!=
0xa
)
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Segmentation symbol value incorrect
\n
"
);
}
}
static
int
decode_cblk
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
codsty
,
Jpeg2000T1Context
*
t1
,
Jpeg2000Cblk
*
cblk
,
static
int
decode_cblk
(
Jpeg2000DecoderContext
*
s
,
Jpeg2000CodingStyle
*
codsty
,
Jpeg2000T1Context
*
t1
,
Jpeg2000Cblk
*
cblk
,
int
width
,
int
height
,
int
bandpos
)
{
int
passno
=
cblk
->
npasses
,
pass_t
=
2
,
bpno
=
cblk
->
nonzerobits
-
1
,
y
,
clnpass_cnt
=
0
;
...
...
@@ -820,7 +837,7 @@ static int decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
for
(;
y
<
tile
->
comp
[
compno
].
coord
[
1
][
1
]
-
s
->
image_offset_y
;
y
+=
s
->
cdy
[
compno
])
{
uint8_t
*
dst
;
x
=
tile
->
comp
[
compno
].
coord
[
0
][
0
]
-
s
->
image_offset_x
;
x
=
tile
->
comp
[
compno
].
coord
[
0
][
0
]
-
s
->
image_offset_x
;
dst
=
line
+
x
*
s
->
ncomponents
+
compno
;
for
(;
x
<
tile
->
comp
[
compno
].
coord
[
0
][
1
]
-
s
->
image_offset_x
;
x
+=
s
->
cdx
[
compno
])
{
...
...
@@ -860,12 +877,12 @@ static int decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
return
0
;
}
static
void
cleanup
(
Jpeg2000DecoderContext
*
s
)
static
void
jpeg2000_dec_
cleanup
(
Jpeg2000DecoderContext
*
s
)
{
int
tileno
,
compno
;
for
(
tileno
=
0
;
tileno
<
s
->
numXtiles
*
s
->
numYtiles
;
tileno
++
)
{
for
(
compno
=
0
;
compno
<
s
->
ncomponents
;
compno
++
)
{
Jpeg2000Component
*
comp
=
s
->
tile
[
tileno
].
comp
+
compno
;
Jpeg2000Component
*
comp
=
s
->
tile
[
tileno
].
comp
+
compno
;
Jpeg2000CodingStyle
*
codsty
=
s
->
tile
[
tileno
].
codsty
+
compno
;
ff_j2k_cleanup
(
comp
,
codsty
);
...
...
@@ -878,8 +895,8 @@ static void cleanup(Jpeg2000DecoderContext *s)
static
int
decode_codestream
(
Jpeg2000DecoderContext
*
s
)
{
Jpeg2000CodingStyle
*
codsty
=
s
->
codsty
;
Jpeg2000QuantStyle
*
qntsty
=
s
->
qntsty
;
uint8_t
*
properties
=
s
->
properties
;
Jpeg2000QuantStyle
*
qntsty
=
s
->
qntsty
;
uint8_t
*
properties
=
s
->
properties
;
for
(;;)
{
int
oldpos
,
marker
,
len
,
ret
=
0
;
...
...
@@ -976,9 +993,8 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s)
return
0
;
}
static
int
decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
static
int
jpeg2000_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
Jpeg2000DecoderContext
*
s
=
avctx
->
priv_data
;
AVFrame
*
picture
=
data
;
...
...
@@ -1021,14 +1037,14 @@ static int decode_frame(AVCodecContext *avctx,
if
(
ret
=
decode_tile
(
s
,
s
->
tile
+
tileno
))
goto
err_out
;
cleanup
(
s
);
jpeg2000_dec_
cleanup
(
s
);
*
got_frame
=
1
;
return
bytestream2_tell
(
&
s
->
g
);
err_out:
cleanup
(
s
);
jpeg2000_dec_
cleanup
(
s
);
return
ret
;
}
...
...
@@ -1054,6 +1070,6 @@ AVCodec ff_j2k_decoder = {
.
capabilities
=
CODEC_CAP_EXPERIMENTAL
|
CODEC_CAP_FRAME_THREADS
,
.
priv_data_size
=
sizeof
(
Jpeg2000DecoderContext
),
.
init_static_data
=
jpeg2000_init_static_data
,
.
decode
=
decode_frame
,
.
decode
=
jpeg2000_
decode_frame
,
.
profiles
=
NULL_IF_CONFIG_SMALL
(
profiles
)
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment