Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
b7a928b2
Commit
b7a928b2
authored
May 03, 2012
by
Michael Bradshaw
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libopenjpegdec: respect JP2 color space, fix ticket 1179
Signed-off-by:
Michael Bradshaw
<
mbradshaw@sorensonmedia.com
>
parent
af58a77f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
75 additions
and
62 deletions
+75
-62
libopenjpegdec.c
libavcodec/libopenjpegdec.c
+75
-62
No files found.
libavcodec/libopenjpegdec.c
View file @
b7a928b2
...
...
@@ -35,73 +35,83 @@
#define JP2_SIG_TYPE 0x6A502020
#define JP2_SIG_VALUE 0x0D0A870A
#define RGB_PIXEL_FORMATS PIX_FMT_RGB24,PIX_FMT_RGBA,PIX_FMT_RGB48,PIX_FMT_RGBA64
#define GRAY_PIXEL_FORMATS PIX_FMT_GRAY8,PIX_FMT_GRAY8A,PIX_FMT_GRAY16
#define YUV_PIXEL_FORMATS PIX_FMT_YUV420P,PIX_FMT_YUV422P,PIX_FMT_YUVA420P, \
PIX_FMT_YUV440P,PIX_FMT_YUV444P, \
PIX_FMT_YUV420P9,PIX_FMT_YUV422P9,PIX_FMT_YUV444P9, \
PIX_FMT_YUV420P10,PIX_FMT_YUV422P10,PIX_FMT_YUV444P10, \
PIX_FMT_YUV420P16,PIX_FMT_YUV422P16,PIX_FMT_YUV444P16
static
const
enum
PixelFormat
libopenjpeg_rgb_pix_fmts
[]
=
{
RGB_PIXEL_FORMATS
};
static
const
enum
PixelFormat
libopenjpeg_gray_pix_fmts
[]
=
{
GRAY_PIXEL_FORMATS
};
static
const
enum
PixelFormat
libopenjpeg_yuv_pix_fmts
[]
=
{
YUV_PIXEL_FORMATS
};
static
const
enum
PixelFormat
libopenjpeg_all_pix_fmts
[]
=
{
RGB_PIXEL_FORMATS
,
GRAY_PIXEL_FORMATS
,
YUV_PIXEL_FORMATS
};
typedef
struct
{
opj_dparameters_t
dec_params
;
AVFrame
image
;
}
LibOpenJPEGContext
;
static
enum
PixelFormat
check_image_attributes
(
AVCodecContext
*
avctx
,
opj_image_t
*
image
)
{
opj_image_comp_t
c0
=
image
->
comps
[
0
];
opj_image_comp_t
c1
=
image
->
comps
[
1
];
opj_image_comp_t
c2
=
image
->
comps
[
2
];
int
compRatio
=
0
;
compRatio
|=
c0
.
dx
<<
15
|
c0
.
dy
<<
12
;
compRatio
|=
c1
.
dx
<<
9
|
c1
.
dy
<<
6
;
compRatio
|=
c2
.
dx
<<
3
|
c2
.
dy
;
if
(
image
->
numcomps
==
4
)
{
if
(
c0
.
prec
==
8
)
{
if
(
compRatio
==
0112222
&&
image
->
comps
[
3
].
dx
==
1
&&
image
->
comps
[
3
].
dy
==
1
)
{
return
PIX_FMT_YUVA420P
;
}
else
{
return
PIX_FMT_RGBA
;
}
}
else
{
return
PIX_FMT_RGBA64
;
}
}
static
inline
int
libopenjpeg_matches_pix_fmt
(
const
opj_image_t
*
image
,
enum
PixelFormat
pix_fmt
){
AVPixFmtDescriptor
descriptor
=
av_pix_fmt_descriptors
[
pix_fmt
];
int
match
=
1
;
switch
(
compRatio
)
{
case
0111111
:
goto
libopenjpeg_yuv444_rgb
;
case
0111212
:
return
PIX_FMT_YUV440P
;
case
0112121
:
goto
libopenjpeg_yuv422
;
case
0112222
:
goto
libopenjpeg_yuv420
;
default:
goto
libopenjpeg_rgb
;
if
(
descriptor
.
nb_components
!=
image
->
numcomps
)
{
return
0
;
}
libopenjpeg_yuv420:
switch
(
c0
.
prec
)
{
case
8
:
return
PIX_FMT_YUV420P
;
case
9
:
return
PIX_FMT_YUV420P9
;
case
10
:
return
PIX_FMT_YUV420P10
;
case
16
:
return
PIX_FMT_YUV420P16
;
switch
(
descriptor
.
nb_components
)
{
case
4
:
match
=
match
&&
descriptor
.
comp
[
3
].
depth_minus1
+
1
==
image
->
comps
[
3
].
prec
&&
1
<<
descriptor
.
log2_chroma_w
==
image
->
comps
[
3
].
dx
&&
1
<<
descriptor
.
log2_chroma_h
==
image
->
comps
[
3
].
dy
;
case
3
:
match
=
match
&&
descriptor
.
comp
[
2
].
depth_minus1
+
1
==
image
->
comps
[
2
].
prec
&&
1
<<
descriptor
.
log2_chroma_w
==
image
->
comps
[
2
].
dx
&&
1
<<
descriptor
.
log2_chroma_h
==
image
->
comps
[
2
].
dy
;
case
2
:
match
=
match
&&
descriptor
.
comp
[
1
].
depth_minus1
+
1
==
image
->
comps
[
1
].
prec
&&
1
<<
descriptor
.
log2_chroma_w
==
image
->
comps
[
1
].
dx
&&
1
<<
descriptor
.
log2_chroma_h
==
image
->
comps
[
1
].
dy
;
case
1
:
match
=
match
&&
descriptor
.
comp
[
0
].
depth_minus1
+
1
==
image
->
comps
[
0
].
prec
&&
1
==
image
->
comps
[
0
].
dx
&&
1
==
image
->
comps
[
0
].
dy
;
default
:
break
;
}
libopenjpeg_yuv422:
switch
(
c0
.
prec
)
{
case
8
:
return
PIX_FMT_YUV422P
;
case
9
:
return
PIX_FMT_YUV422P9
;
case
10
:
return
PIX_FMT_YUV422P10
;
c
ase
16
:
return
PIX_FMT_YUV422P16
;
}
return
match
;
}
static
inline
enum
PixelFormat
libopenjpeg_guess_pix_fmt
(
const
opj_image_t
*
image
)
{
int
index
;
c
onst
enum
PixelFormat
*
possible_fmts
=
NULL
;
int
possible_fmts_nb
=
0
;
libopenjpeg_yuv444_rgb:
switch
(
c0
.
prec
)
{
case
8
:
return
PIX_FMT_RGB24
;
case
9
:
return
PIX_FMT_YUV444P9
;
case
10
:
return
PIX_FMT_YUV444P10
;
case
16
:
return
PIX_FMT_YUV444P16
;
switch
(
image
->
color_space
)
{
case
CLRSPC_SRGB
:
possible_fmts
=
libopenjpeg_rgb_pix_fmts
;
possible_fmts_nb
=
sizeof
(
libopenjpeg_rgb_pix_fmts
)
/
sizeof
(
enum
PixelFormat
);
break
;
case
CLRSPC_GRAY
:
possible_fmts
=
libopenjpeg_gray_pix_fmts
;
possible_fmts_nb
=
sizeof
(
libopenjpeg_gray_pix_fmts
)
/
sizeof
(
enum
PixelFormat
);
break
;
case
CLRSPC_SYCC
:
possible_fmts
=
libopenjpeg_yuv_pix_fmts
;
possible_fmts_nb
=
sizeof
(
libopenjpeg_yuv_pix_fmts
)
/
sizeof
(
enum
PixelFormat
);
break
;
default
:
possible_fmts
=
libopenjpeg_all_pix_fmts
;
possible_fmts_nb
=
sizeof
(
libopenjpeg_all_pix_fmts
)
/
sizeof
(
enum
PixelFormat
);
break
;
}
libopenjpeg_rgb:
switch
(
c0
.
prec
)
{
case
8
:
return
PIX_FMT_RGB24
;
default:
return
PIX_FMT_RGB48
;
for
(
index
=
0
;
index
<
possible_fmts_nb
;
++
index
)
{
if
(
libopenjpeg_matches_pix_fmt
(
image
,
possible_fmts
[
index
])
)
{
return
possible_fmts
[
index
]
;
}
}
return
PIX_FMT_
RGB24
;
return
PIX_FMT_
NONE
;
}
static
inline
int
libopenjpeg_ispacked
(
enum
PixelFormat
pix_fmt
)
{
...
...
@@ -265,16 +275,19 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx,
}
avcodec_set_dimensions
(
avctx
,
width
,
height
);
switch
(
image
->
numcomps
)
{
case
1
:
avctx
->
pix_fmt
=
(
image
->
comps
[
0
].
prec
==
8
)
?
PIX_FMT_GRAY8
:
PIX_FMT_GRAY16
;
break
;
case
2
:
avctx
->
pix_fmt
=
PIX_FMT_GRAY8A
;
break
;
case
3
:
case
4
:
avctx
->
pix_fmt
=
check_image_attributes
(
avctx
,
image
);
break
;
default:
av_log
(
avctx
,
AV_LOG_ERROR
,
"%d components unsupported.
\n
"
,
image
->
numcomps
);
goto
done
;
if
(
avctx
->
pix_fmt
!=
PIX_FMT_NONE
)
{
if
(
!
libopenjpeg_matches_pix_fmt
(
image
,
avctx
->
pix_fmt
))
{
avctx
->
pix_fmt
=
PIX_FMT_NONE
;
}
}
if
(
avctx
->
pix_fmt
==
PIX_FMT_NONE
)
{
avctx
->
pix_fmt
=
libopenjpeg_guess_pix_fmt
(
image
);
}
if
(
avctx
->
pix_fmt
==
PIX_FMT_NONE
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unable to determine pixel format
\n
"
);
goto
done
;
}
if
(
picture
->
data
[
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