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
7fb93eae
Commit
7fb93eae
authored
Sep 11, 2015
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
jpeg2000: Factor out band initialization
parent
1b709f23
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
213 additions
and
193 deletions
+213
-193
jpeg2000.c
libavcodec/jpeg2000.c
+213
-193
No files found.
libavcodec/jpeg2000.c
View file @
7fb93eae
...
...
@@ -195,96 +195,20 @@ void ff_jpeg2000_set_significance(Jpeg2000T1Context *t1, int x, int y,
static
const
uint8_t
lut_gain
[
2
][
4
]
=
{
{
0
,
0
,
0
,
0
},
{
0
,
1
,
1
,
2
}
};
int
ff_jpeg2000_init_component
(
Jpeg2000Component
*
comp
,
static
int
init_band
(
AVCodecContext
*
avctx
,
Jpeg2000ResLevel
*
reslevel
,
Jpeg2000Component
*
comp
,
Jpeg2000CodingStyle
*
codsty
,
Jpeg2000QuantStyle
*
qntsty
,
int
cbps
,
int
dx
,
int
dy
,
AVCodecContext
*
avctx
)
int
bandno
,
int
gbandno
,
int
reslevelno
,
int
cbps
,
int
dx
,
int
dy
)
{
Jpeg2000Band
*
band
=
reslevel
->
band
+
bandno
;
uint8_t
log2_band_prec_width
,
log2_band_prec_height
;
int
reslevelno
,
bandno
,
gbandno
=
0
,
ret
,
i
,
j
;
uint32_t
csize
;
if
(
!
codsty
->
nreslevels2decode
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"nreslevels2decode uninitialized
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
ret
=
ff_jpeg2000_dwt_init
(
&
comp
->
dwt
,
comp
->
coord
,
codsty
->
nreslevels2decode
-
1
,
codsty
->
transform
))
return
ret
;
// component size comp->coord is uint16_t so ir cannot overflow
csize
=
(
comp
->
coord
[
0
][
1
]
-
comp
->
coord
[
0
][
0
])
*
(
comp
->
coord
[
1
][
1
]
-
comp
->
coord
[
1
][
0
]);
if
(
codsty
->
transform
==
FF_DWT97
)
{
comp
->
i_data
=
NULL
;
comp
->
f_data
=
av_malloc_array
(
csize
,
sizeof
(
*
comp
->
f_data
));
if
(
!
comp
->
f_data
)
return
AVERROR
(
ENOMEM
);
}
else
{
comp
->
f_data
=
NULL
;
comp
->
i_data
=
av_malloc_array
(
csize
,
sizeof
(
*
comp
->
i_data
));
if
(
!
comp
->
i_data
)
return
AVERROR
(
ENOMEM
);
}
comp
->
reslevel
=
av_mallocz_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
;
// 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
]
=
ff_jpeg2000_ceildivpow2
(
comp
->
coord_o
[
i
][
j
],
declvl
-
1
);
// update precincts size: 2^n value
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
);
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
->
band
=
av_mallocz_array
(
reslevel
->
nbands
,
sizeof
(
*
reslevel
->
band
));
if
(
!
reslevel
->
band
)
return
AVERROR
(
ENOMEM
);
for
(
bandno
=
0
;
bandno
<
reslevel
->
nbands
;
bandno
++
,
gbandno
++
)
{
Jpeg2000Band
*
band
=
reslevel
->
band
+
bandno
;
int
cblkno
,
precno
;
int
nb_precincts
;
int
i
,
j
;
/* TODO: Implementation of quantization step not finished,
* see ISO/IEC 15444-1:2002 E.1 and A.6.4. */
...
...
@@ -474,6 +398,102 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp,
cblk
->
npasses
=
0
;
}
}
return
0
;
}
int
ff_jpeg2000_init_component
(
Jpeg2000Component
*
comp
,
Jpeg2000CodingStyle
*
codsty
,
Jpeg2000QuantStyle
*
qntsty
,
int
cbps
,
int
dx
,
int
dy
,
AVCodecContext
*
avctx
)
{
int
reslevelno
,
bandno
,
gbandno
=
0
,
ret
,
i
,
j
;
uint32_t
csize
;
if
(
!
codsty
->
nreslevels2decode
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"nreslevels2decode uninitialized
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
ret
=
ff_jpeg2000_dwt_init
(
&
comp
->
dwt
,
comp
->
coord
,
codsty
->
nreslevels2decode
-
1
,
codsty
->
transform
))
return
ret
;
// component size comp->coord is uint16_t so ir cannot overflow
csize
=
(
comp
->
coord
[
0
][
1
]
-
comp
->
coord
[
0
][
0
])
*
(
comp
->
coord
[
1
][
1
]
-
comp
->
coord
[
1
][
0
]);
if
(
codsty
->
transform
==
FF_DWT97
)
{
comp
->
i_data
=
NULL
;
comp
->
f_data
=
av_malloc_array
(
csize
,
sizeof
(
*
comp
->
f_data
));
if
(
!
comp
->
f_data
)
return
AVERROR
(
ENOMEM
);
}
else
{
comp
->
f_data
=
NULL
;
comp
->
i_data
=
av_malloc_array
(
csize
,
sizeof
(
*
comp
->
i_data
));
if
(
!
comp
->
i_data
)
return
AVERROR
(
ENOMEM
);
}
comp
->
reslevel
=
av_mallocz_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
;
// 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
]
=
ff_jpeg2000_ceildivpow2
(
comp
->
coord_o
[
i
][
j
],
declvl
-
1
);
// update precincts size: 2^n value
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
);
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
->
band
=
av_mallocz_array
(
reslevel
->
nbands
,
sizeof
(
*
reslevel
->
band
));
if
(
!
reslevel
->
band
)
return
AVERROR
(
ENOMEM
);
for
(
bandno
=
0
;
bandno
<
reslevel
->
nbands
;
bandno
++
,
gbandno
++
)
{
ret
=
init_band
(
avctx
,
reslevel
,
comp
,
codsty
,
qntsty
,
bandno
,
gbandno
,
reslevelno
,
cbps
,
dx
,
dy
);
if
(
ret
<
0
)
return
ret
;
}
}
return
0
;
...
...
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