Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
570fcaf3
Commit
570fcaf3
authored
Sep 14, 2015
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
jpeg2000: Factor out prec init
Makes debugging a little simpler.
parent
95a41311
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
112 additions
and
96 deletions
+112
-96
jpeg2000.c
libavcodec/jpeg2000.c
+112
-96
No files found.
libavcodec/jpeg2000.c
View file @
570fcaf3
...
...
@@ -244,6 +244,111 @@ static void init_band_stepsize(AVCodecContext *avctx,
band
->
i_stepsize
=
band
->
f_stepsize
*
(
1
<<
16
);
}
static
int
init_prec
(
Jpeg2000Band
*
band
,
Jpeg2000ResLevel
*
reslevel
,
Jpeg2000Component
*
comp
,
int
precno
,
int
bandno
,
int
reslevelno
,
int
log2_band_prec_width
,
int
log2_band_prec_height
)
{
Jpeg2000Prec
*
prec
=
band
->
prec
+
precno
;
int
nb_codeblocks
,
cblkno
;
/* TODO: Explain formula for JPEG200 DCINEMA. */
/* TODO: Verify with previous count of codeblocks per band */
/* Compute P_x0 */
prec
->
coord
[
0
][
0
]
=
(
precno
%
reslevel
->
num_precincts_x
)
*
(
1
<<
log2_band_prec_width
);
prec
->
coord
[
0
][
0
]
=
FFMAX
(
prec
->
coord
[
0
][
0
],
band
->
coord
[
0
][
0
]);
/* Compute P_y0 */
prec
->
coord
[
1
][
0
]
=
(
precno
/
reslevel
->
num_precincts_x
)
*
(
1
<<
log2_band_prec_height
);
prec
->
coord
[
1
][
0
]
=
FFMAX
(
prec
->
coord
[
1
][
0
],
band
->
coord
[
1
][
0
]);
/* Compute P_x1 */
prec
->
coord
[
0
][
1
]
=
prec
->
coord
[
0
][
0
]
+
(
1
<<
log2_band_prec_width
);
prec
->
coord
[
0
][
1
]
=
FFMIN
(
prec
->
coord
[
0
][
1
],
band
->
coord
[
0
][
1
]);
/* Compute P_y1 */
prec
->
coord
[
1
][
1
]
=
prec
->
coord
[
1
][
0
]
+
(
1
<<
log2_band_prec_height
);
prec
->
coord
[
1
][
1
]
=
FFMIN
(
prec
->
coord
[
1
][
1
],
band
->
coord
[
1
][
1
]);
prec
->
nb_codeblocks_width
=
ff_jpeg2000_ceildivpow2
(
prec
->
coord
[
0
][
1
]
-
prec
->
coord
[
0
][
0
],
band
->
log2_cblk_width
);
prec
->
nb_codeblocks_height
=
ff_jpeg2000_ceildivpow2
(
prec
->
coord
[
1
][
1
]
-
prec
->
coord
[
1
][
0
],
band
->
log2_cblk_height
);
/* Tag trees initialization */
prec
->
cblkincl
=
ff_jpeg2000_tag_tree_init
(
prec
->
nb_codeblocks_width
,
prec
->
nb_codeblocks_height
);
if
(
!
prec
->
cblkincl
)
return
AVERROR
(
ENOMEM
);
prec
->
zerobits
=
ff_jpeg2000_tag_tree_init
(
prec
->
nb_codeblocks_width
,
prec
->
nb_codeblocks_height
);
if
(
!
prec
->
zerobits
)
return
AVERROR
(
ENOMEM
);
nb_codeblocks
=
prec
->
nb_codeblocks_width
*
prec
->
nb_codeblocks_height
;
prec
->
cblk
=
av_mallocz_array
(
nb_codeblocks
,
sizeof
(
*
prec
->
cblk
));
if
(
!
prec
->
cblk
)
return
AVERROR
(
ENOMEM
);
for
(
cblkno
=
0
;
cblkno
<
nb_codeblocks
;
cblkno
++
)
{
Jpeg2000Cblk
*
cblk
=
prec
->
cblk
+
cblkno
;
uint16_t
Cx0
,
Cy0
;
/* Compute coordinates of codeblocks */
/* Compute Cx0*/
Cx0
=
(
prec
->
coord
[
0
][
0
]
>>
band
->
log2_cblk_width
)
<<
band
->
log2_cblk_width
;
Cx0
=
Cx0
+
((
cblkno
%
prec
->
nb_codeblocks_width
)
<<
band
->
log2_cblk_width
);
cblk
->
coord
[
0
][
0
]
=
FFMAX
(
Cx0
,
prec
->
coord
[
0
][
0
]);
/* Compute Cy0*/
Cy0
=
(
prec
->
coord
[
1
][
0
]
>>
band
->
log2_cblk_height
)
<<
band
->
log2_cblk_height
;
Cy0
=
Cy0
+
((
cblkno
/
prec
->
nb_codeblocks_width
)
<<
band
->
log2_cblk_height
);
cblk
->
coord
[
1
][
0
]
=
FFMAX
(
Cy0
,
prec
->
coord
[
1
][
0
]);
/* Compute Cx1 */
cblk
->
coord
[
0
][
1
]
=
FFMIN
(
Cx0
+
(
1
<<
band
->
log2_cblk_width
),
prec
->
coord
[
0
][
1
]);
/* Compute Cy1 */
cblk
->
coord
[
1
][
1
]
=
FFMIN
(
Cy0
+
(
1
<<
band
->
log2_cblk_height
),
prec
->
coord
[
1
][
1
]);
/* Update code-blocks coordinates according sub-band position */
if
((
bandno
+
!!
reslevelno
)
&
1
)
{
cblk
->
coord
[
0
][
0
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
0
];
cblk
->
coord
[
0
][
1
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
0
];
}
if
((
bandno
+
!!
reslevelno
)
&
2
)
{
cblk
->
coord
[
1
][
0
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
0
];
cblk
->
coord
[
1
][
1
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
0
];
}
cblk
->
zero
=
0
;
cblk
->
lblock
=
3
;
cblk
->
length
=
0
;
cblk
->
lengthinc
=
0
;
cblk
->
npasses
=
0
;
}
return
0
;
}
static
int
init_band
(
AVCodecContext
*
avctx
,
Jpeg2000ResLevel
*
reslevel
,
Jpeg2000Component
*
comp
,
...
...
@@ -255,9 +360,9 @@ static int init_band(AVCodecContext *avctx,
Jpeg2000Band
*
band
=
reslevel
->
band
+
bandno
;
uint8_t
log2_band_prec_width
,
log2_band_prec_height
;
int
declvl
=
codsty
->
nreslevels
-
reslevelno
;
// N_L -r see ISO/IEC 15444-1:2002 B.5
int
cblkno
,
precno
;
int
precno
;
int
nb_precincts
;
int
i
,
j
;
int
i
,
j
,
ret
;
init_band_stepsize
(
avctx
,
band
,
codsty
,
qntsty
,
bandno
,
gbandno
,
reslevelno
,
cbps
);
...
...
@@ -314,100 +419,11 @@ static int init_band(AVCodecContext *avctx,
return
AVERROR
(
ENOMEM
);
for
(
precno
=
0
;
precno
<
nb_precincts
;
precno
++
)
{
Jpeg2000Prec
*
prec
=
band
->
prec
+
precno
;
int
nb_codeblocks
;
/* TODO: Explain formula for JPEG200 DCINEMA. */
/* TODO: Verify with previous count of codeblocks per band */
/* Compute P_x0 */
prec
->
coord
[
0
][
0
]
=
(
precno
%
reslevel
->
num_precincts_x
)
*
(
1
<<
log2_band_prec_width
);
prec
->
coord
[
0
][
0
]
=
FFMAX
(
prec
->
coord
[
0
][
0
],
band
->
coord
[
0
][
0
]);
/* Compute P_y0 */
prec
->
coord
[
1
][
0
]
=
(
precno
/
reslevel
->
num_precincts_x
)
*
(
1
<<
log2_band_prec_height
);
prec
->
coord
[
1
][
0
]
=
FFMAX
(
prec
->
coord
[
1
][
0
],
band
->
coord
[
1
][
0
]);
/* Compute P_x1 */
prec
->
coord
[
0
][
1
]
=
prec
->
coord
[
0
][
0
]
+
(
1
<<
log2_band_prec_width
);
prec
->
coord
[
0
][
1
]
=
FFMIN
(
prec
->
coord
[
0
][
1
],
band
->
coord
[
0
][
1
]);
/* Compute P_y1 */
prec
->
coord
[
1
][
1
]
=
prec
->
coord
[
1
][
0
]
+
(
1
<<
log2_band_prec_height
);
prec
->
coord
[
1
][
1
]
=
FFMIN
(
prec
->
coord
[
1
][
1
],
band
->
coord
[
1
][
1
]);
prec
->
nb_codeblocks_width
=
ff_jpeg2000_ceildivpow2
(
prec
->
coord
[
0
][
1
]
-
prec
->
coord
[
0
][
0
],
band
->
log2_cblk_width
);
prec
->
nb_codeblocks_height
=
ff_jpeg2000_ceildivpow2
(
prec
->
coord
[
1
][
1
]
-
prec
->
coord
[
1
][
0
],
band
->
log2_cblk_height
);
/* Tag trees initialization */
prec
->
cblkincl
=
ff_jpeg2000_tag_tree_init
(
prec
->
nb_codeblocks_width
,
prec
->
nb_codeblocks_height
);
if
(
!
prec
->
cblkincl
)
return
AVERROR
(
ENOMEM
);
prec
->
zerobits
=
ff_jpeg2000_tag_tree_init
(
prec
->
nb_codeblocks_width
,
prec
->
nb_codeblocks_height
);
if
(
!
prec
->
zerobits
)
return
AVERROR
(
ENOMEM
);
nb_codeblocks
=
prec
->
nb_codeblocks_width
*
prec
->
nb_codeblocks_height
;
prec
->
cblk
=
av_mallocz_array
(
nb_codeblocks
,
sizeof
(
*
prec
->
cblk
));
if
(
!
prec
->
cblk
)
return
AVERROR
(
ENOMEM
);
for
(
cblkno
=
0
;
cblkno
<
nb_codeblocks
;
cblkno
++
)
{
Jpeg2000Cblk
*
cblk
=
prec
->
cblk
+
cblkno
;
uint16_t
Cx0
,
Cy0
;
/* Compute coordinates of codeblocks */
/* Compute Cx0*/
Cx0
=
(
prec
->
coord
[
0
][
0
]
>>
band
->
log2_cblk_width
)
<<
band
->
log2_cblk_width
;
Cx0
=
Cx0
+
((
cblkno
%
prec
->
nb_codeblocks_width
)
<<
band
->
log2_cblk_width
);
cblk
->
coord
[
0
][
0
]
=
FFMAX
(
Cx0
,
prec
->
coord
[
0
][
0
]);
/* Compute Cy0*/
Cy0
=
(
prec
->
coord
[
1
][
0
]
>>
band
->
log2_cblk_height
)
<<
band
->
log2_cblk_height
;
Cy0
=
Cy0
+
((
cblkno
/
prec
->
nb_codeblocks_width
)
<<
band
->
log2_cblk_height
);
cblk
->
coord
[
1
][
0
]
=
FFMAX
(
Cy0
,
prec
->
coord
[
1
][
0
]);
/* Compute Cx1 */
cblk
->
coord
[
0
][
1
]
=
FFMIN
(
Cx0
+
(
1
<<
band
->
log2_cblk_width
),
prec
->
coord
[
0
][
1
]);
/* Compute Cy1 */
cblk
->
coord
[
1
][
1
]
=
FFMIN
(
Cy0
+
(
1
<<
band
->
log2_cblk_height
),
prec
->
coord
[
1
][
1
]);
/* Update code-blocks coordinates according sub-band position */
if
((
bandno
+
!!
reslevelno
)
&
1
)
{
cblk
->
coord
[
0
][
0
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
0
];
cblk
->
coord
[
0
][
1
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
0
][
0
];
}
if
((
bandno
+
!!
reslevelno
)
&
2
)
{
cblk
->
coord
[
1
][
0
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
0
];
cblk
->
coord
[
1
][
1
]
+=
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
1
]
-
comp
->
reslevel
[
reslevelno
-
1
].
coord
[
1
][
0
];
}
cblk
->
zero
=
0
;
cblk
->
lblock
=
3
;
cblk
->
length
=
0
;
cblk
->
lengthinc
=
0
;
cblk
->
npasses
=
0
;
}
ret
=
init_prec
(
band
,
reslevel
,
comp
,
precno
,
bandno
,
reslevelno
,
log2_band_prec_width
,
log2_band_prec_height
);
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