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
0f64cd1e
Commit
0f64cd1e
authored
Aug 16, 2012
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mjpegdec: more meaningful return values
parent
20bcce50
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
77 additions
and
66 deletions
+77
-66
mjpegdec.c
libavcodec/mjpegdec.c
+77
-66
No files found.
libavcodec/mjpegdec.c
View file @
0f64cd1e
...
@@ -101,12 +101,13 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
...
@@ -101,12 +101,13 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
build_basic_mjpeg_vlc
(
s
);
build_basic_mjpeg_vlc
(
s
);
if
(
s
->
extern_huff
)
{
if
(
s
->
extern_huff
)
{
int
ret
;
av_log
(
avctx
,
AV_LOG_INFO
,
"mjpeg: using external huffman table
\n
"
);
av_log
(
avctx
,
AV_LOG_INFO
,
"mjpeg: using external huffman table
\n
"
);
init_get_bits
(
&
s
->
gb
,
avctx
->
extradata
,
avctx
->
extradata_size
*
8
);
init_get_bits
(
&
s
->
gb
,
avctx
->
extradata
,
avctx
->
extradata_size
*
8
);
if
(
ff_mjpeg_decode_dht
(
s
))
{
if
(
(
ret
=
ff_mjpeg_decode_dht
(
s
)
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"mjpeg: error using external huffman table
\n
"
);
"mjpeg: error using external huffman table
\n
"
);
return
AVERROR_INVALIDDATA
;
return
ret
;
}
}
}
}
if
(
avctx
->
field_order
==
AV_FIELD_BB
)
{
/* quicktime icefloe 019 */
if
(
avctx
->
field_order
==
AV_FIELD_BB
)
{
/* quicktime icefloe 019 */
...
@@ -159,18 +160,19 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
...
@@ -159,18 +160,19 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
int
len
,
index
,
i
,
class
,
n
,
v
,
code_max
;
int
len
,
index
,
i
,
class
,
n
,
v
,
code_max
;
uint8_t
bits_table
[
17
];
uint8_t
bits_table
[
17
];
uint8_t
val_table
[
256
];
uint8_t
val_table
[
256
];
int
ret
=
0
;
len
=
get_bits
(
&
s
->
gb
,
16
)
-
2
;
len
=
get_bits
(
&
s
->
gb
,
16
)
-
2
;
while
(
len
>
0
)
{
while
(
len
>
0
)
{
if
(
len
<
17
)
if
(
len
<
17
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
class
=
get_bits
(
&
s
->
gb
,
4
);
class
=
get_bits
(
&
s
->
gb
,
4
);
if
(
class
>=
2
)
if
(
class
>=
2
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
index
=
get_bits
(
&
s
->
gb
,
4
);
index
=
get_bits
(
&
s
->
gb
,
4
);
if
(
index
>=
4
)
if
(
index
>=
4
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
n
=
0
;
n
=
0
;
for
(
i
=
1
;
i
<=
16
;
i
++
)
{
for
(
i
=
1
;
i
<=
16
;
i
++
)
{
bits_table
[
i
]
=
get_bits
(
&
s
->
gb
,
8
);
bits_table
[
i
]
=
get_bits
(
&
s
->
gb
,
8
);
...
@@ -178,7 +180,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
...
@@ -178,7 +180,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
}
}
len
-=
17
;
len
-=
17
;
if
(
len
<
n
||
n
>
256
)
if
(
len
<
n
||
n
>
256
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
code_max
=
0
;
code_max
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
...
@@ -193,15 +195,15 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
...
@@ -193,15 +195,15 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
ff_free_vlc
(
&
s
->
vlcs
[
class
][
index
]);
ff_free_vlc
(
&
s
->
vlcs
[
class
][
index
]);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"class=%d index=%d nb_codes=%d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"class=%d index=%d nb_codes=%d
\n
"
,
class
,
index
,
code_max
+
1
);
class
,
index
,
code_max
+
1
);
if
(
build_vlc
(
&
s
->
vlcs
[
class
][
index
],
bits_table
,
val_table
,
if
(
(
ret
=
build_vlc
(
&
s
->
vlcs
[
class
][
index
],
bits_table
,
val_table
,
code_max
+
1
,
0
,
class
>
0
)
<
0
)
code_max
+
1
,
0
,
class
>
0
)
)
<
0
)
return
-
1
;
return
ret
;
if
(
class
>
0
)
{
if
(
class
>
0
)
{
ff_free_vlc
(
&
s
->
vlcs
[
2
][
index
]);
ff_free_vlc
(
&
s
->
vlcs
[
2
][
index
]);
if
(
build_vlc
(
&
s
->
vlcs
[
2
][
index
],
bits_table
,
val_table
,
if
(
(
ret
=
build_vlc
(
&
s
->
vlcs
[
2
][
index
],
bits_table
,
val_table
,
code_max
+
1
,
0
,
0
)
<
0
)
code_max
+
1
,
0
,
0
)
)
<
0
)
return
-
1
;
return
ret
;
}
}
}
}
return
0
;
return
0
;
...
@@ -234,16 +236,17 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -234,16 +236,17 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"sof0: picture: %dx%d
\n
"
,
width
,
height
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"sof0: picture: %dx%d
\n
"
,
width
,
height
);
if
(
av_image_check_size
(
width
,
height
,
0
,
s
->
avctx
))
if
(
av_image_check_size
(
width
,
height
,
0
,
s
->
avctx
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
nb_components
=
get_bits
(
&
s
->
gb
,
8
);
nb_components
=
get_bits
(
&
s
->
gb
,
8
);
if
(
nb_components
<=
0
||
if
(
nb_components
<=
0
||
nb_components
>
MAX_COMPONENTS
)
nb_components
>
MAX_COMPONENTS
)
return
-
1
;
return
-
1
;
if
(
s
->
ls
&&
!
(
s
->
bits
<=
8
||
nb_components
==
1
))
{
if
(
s
->
ls
&&
!
(
s
->
bits
<=
8
||
nb_components
==
1
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log_missing_feature
(
s
->
avctx
,
"only <= 8 bits/component or 16-bit gray accepted for JPEG-LS
\n
"
);
"only <= 8 bits/component or "
return
-
1
;
"16-bit gray accepted for JPEG-LS
\n
"
,
0
);
return
AVERROR_PATCHWELCOME
;
}
}
s
->
nb_components
=
nb_components
;
s
->
nb_components
=
nb_components
;
s
->
h_max
=
1
;
s
->
h_max
=
1
;
...
@@ -260,16 +263,16 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -260,16 +263,16 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
s
->
v_max
=
s
->
v_count
[
i
];
s
->
v_max
=
s
->
v_count
[
i
];
s
->
quant_index
[
i
]
=
get_bits
(
&
s
->
gb
,
8
);
s
->
quant_index
[
i
]
=
get_bits
(
&
s
->
gb
,
8
);
if
(
s
->
quant_index
[
i
]
>=
4
)
if
(
s
->
quant_index
[
i
]
>=
4
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"component %d %d:%d id: %d quant:%d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"component %d %d:%d id: %d quant:%d
\n
"
,
i
,
s
->
h_count
[
i
],
s
->
v_count
[
i
],
i
,
s
->
h_count
[
i
],
s
->
v_count
[
i
],
s
->
component_id
[
i
],
s
->
quant_index
[
i
]);
s
->
component_id
[
i
],
s
->
quant_index
[
i
]);
}
}
if
(
s
->
ls
&&
(
s
->
h_max
>
1
||
s
->
v_max
>
1
))
{
if
(
s
->
ls
&&
(
s
->
h_max
>
1
||
s
->
v_max
>
1
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
_missing_feature
(
s
->
avctx
,
"Subsampling in JPEG-LS is not supported.
\n
"
);
"Subsampling in JPEG-LS is not supported.
\n
"
,
0
);
return
-
1
;
return
AVERROR_PATCHWELCOME
;
}
}
if
(
s
->
v_max
==
1
&&
s
->
h_max
==
1
&&
s
->
lossless
==
1
)
if
(
s
->
v_max
==
1
&&
s
->
h_max
==
1
&&
s
->
lossless
==
1
)
...
@@ -337,7 +340,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -337,7 +340,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
break
;
break
;
default:
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Unhandled pixel format 0x%x
\n
"
,
pix_fmt_id
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Unhandled pixel format 0x%x
\n
"
,
pix_fmt_id
);
return
-
1
;
return
AVERROR_PATCHWELCOME
;
}
}
if
(
s
->
ls
)
{
if
(
s
->
ls
)
{
if
(
s
->
nb_components
>
1
)
if
(
s
->
nb_components
>
1
)
...
@@ -414,7 +417,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int component,
...
@@ -414,7 +417,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int component,
val
=
mjpeg_decode_dc
(
s
,
dc_index
);
val
=
mjpeg_decode_dc
(
s
,
dc_index
);
if
(
val
==
0xffff
)
{
if
(
val
==
0xffff
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error dc
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error dc
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
val
=
val
*
quant_matrix
[
0
]
+
s
->
last_dc
[
component
];
val
=
val
*
quant_matrix
[
0
]
+
s
->
last_dc
[
component
];
s
->
last_dc
[
component
]
=
val
;
s
->
last_dc
[
component
]
=
val
;
...
@@ -442,7 +445,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int component,
...
@@ -442,7 +445,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int component,
if
(
i
>
63
)
{
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error count: %d
\n
"
,
i
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error count: %d
\n
"
,
i
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
block
[
j
]
=
level
*
quant_matrix
[
j
];
block
[
j
]
=
level
*
quant_matrix
[
j
];
...
@@ -462,7 +465,7 @@ static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block,
...
@@ -462,7 +465,7 @@ static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block,
val
=
mjpeg_decode_dc
(
s
,
dc_index
);
val
=
mjpeg_decode_dc
(
s
,
dc_index
);
if
(
val
==
0xffff
)
{
if
(
val
==
0xffff
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error dc
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error dc
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
val
=
(
val
*
quant_matrix
[
0
]
<<
Al
)
+
s
->
last_dc
[
component
];
val
=
(
val
*
quant_matrix
[
0
]
<<
Al
)
+
s
->
last_dc
[
component
];
s
->
last_dc
[
component
]
=
val
;
s
->
last_dc
[
component
]
=
val
;
...
@@ -511,7 +514,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
...
@@ -511,7 +514,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
break
;
break
;
}
}
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error count: %d
\n
"
,
i
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error count: %d
\n
"
,
i
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
block
[
j
]
=
level
*
quant_matrix
[
j
]
<<
Al
;
block
[
j
]
=
level
*
quant_matrix
[
j
]
<<
Al
;
...
@@ -520,7 +523,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
...
@@ -520,7 +523,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
i
+=
15
;
i
+=
15
;
if
(
i
>=
se
)
{
if
(
i
>=
se
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ZRL overflow: %d
\n
"
,
i
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ZRL overflow: %d
\n
"
,
i
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
}
else
{
}
else
{
val
=
(
1
<<
run
);
val
=
(
1
<<
run
);
...
@@ -840,7 +843,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
...
@@ -840,7 +843,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
if
(
get_bits_left
(
&
s
->
gb
)
<
0
)
{
if
(
get_bits_left
(
&
s
->
gb
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"overread %d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"overread %d
\n
"
,
-
get_bits_left
(
&
s
->
gb
));
-
get_bits_left
(
&
s
->
gb
));
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
uint8_t
*
ptr
;
uint8_t
*
ptr
;
...
@@ -870,7 +873,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
...
@@ -870,7 +873,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
s
->
quant_matrixes
[
s
->
quant_index
[
c
]])
<
0
)
{
s
->
quant_matrixes
[
s
->
quant_index
[
c
]])
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
s
->
dsp
.
idct_put
(
ptr
,
linesize
[
c
],
s
->
block
);
s
->
dsp
.
idct_put
(
ptr
,
linesize
[
c
],
s
->
block
);
}
}
...
@@ -886,7 +889,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
...
@@ -886,7 +889,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
Al
)
<
0
)
{
Al
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
}
}
// av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n",
// av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n",
...
@@ -971,7 +974,7 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
...
@@ -971,7 +974,7 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
}
}
...
@@ -993,7 +996,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
...
@@ -993,7 +996,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
const
AVFrame
*
reference
)
const
AVFrame
*
reference
)
{
{
int
len
,
nb_components
,
i
,
h
,
v
,
predictor
,
point_transform
;
int
len
,
nb_components
,
i
,
h
,
v
,
predictor
,
point_transform
;
int
index
,
id
;
int
index
,
id
,
ret
;
const
int
block_size
=
s
->
lossless
?
1
:
8
;
const
int
block_size
=
s
->
lossless
?
1
:
8
;
int
ilv
,
prev_shift
;
int
ilv
,
prev_shift
;
...
@@ -1003,11 +1006,11 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
...
@@ -1003,11 +1006,11 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
if
(
nb_components
==
0
||
nb_components
>
MAX_COMPONENTS
)
{
if
(
nb_components
==
0
||
nb_components
>
MAX_COMPONENTS
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: nb_components (%d) unsupported
\n
"
,
nb_components
);
"decode_sos: nb_components (%d) unsupported
\n
"
,
nb_components
);
return
-
1
;
return
AVERROR_PATCHWELCOME
;
}
}
if
(
len
!=
6
+
2
*
nb_components
)
{
if
(
len
!=
6
+
2
*
nb_components
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: invalid len (%d)
\n
"
,
len
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: invalid len (%d)
\n
"
,
len
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
id
=
get_bits
(
&
s
->
gb
,
8
)
-
1
;
id
=
get_bits
(
&
s
->
gb
,
8
)
-
1
;
...
@@ -1019,7 +1022,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
...
@@ -1019,7 +1022,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
if
(
index
==
s
->
nb_components
)
{
if
(
index
==
s
->
nb_components
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: index(%d) out of components
\n
"
,
index
);
"decode_sos: index(%d) out of components
\n
"
,
index
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
/* Metasoft MJPEG codec has Cb and Cr swapped */
/* Metasoft MJPEG codec has Cb and Cr swapped */
if
(
s
->
avctx
->
codec_tag
==
MKTAG
(
'M'
,
'T'
,
'S'
,
'J'
)
if
(
s
->
avctx
->
codec_tag
==
MKTAG
(
'M'
,
'T'
,
'S'
,
'J'
)
...
@@ -1081,40 +1084,46 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
...
@@ -1081,40 +1084,46 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
// for () {
// for () {
// reset_ls_coding_parameters(s, 0);
// reset_ls_coding_parameters(s, 0);
if
(
ff_jpegls_decode_picture
(
s
,
predictor
,
point_transform
,
ilv
)
<
0
)
if
((
ret
=
ff_jpegls_decode_picture
(
s
,
predictor
,
return
-
1
;
point_transform
,
ilv
))
<
0
)
return
ret
;
}
else
{
}
else
{
if
(
s
->
rgb
)
{
if
(
s
->
rgb
)
{
if
(
ljpeg_decode_rgb_scan
(
s
,
predictor
,
point_transform
)
<
0
)
if
((
ret
=
ljpeg_decode_rgb_scan
(
s
,
predictor
,
return
-
1
;
point_transform
))
<
0
)
return
ret
;
}
else
{
}
else
{
if
(
ljpeg_decode_yuv_scan
(
s
,
predictor
,
point_transform
)
<
0
)
if
((
ret
=
ljpeg_decode_yuv_scan
(
s
,
predictor
,
return
-
1
;
point_transform
))
<
0
)
return
ret
;
}
}
}
}
}
else
{
}
else
{
if
(
s
->
progressive
&&
predictor
)
{
if
(
s
->
progressive
&&
predictor
)
{
if
(
mjpeg_decode_scan_progressive_ac
(
s
,
predictor
,
ilv
,
prev_shift
,
if
((
ret
=
mjpeg_decode_scan_progressive_ac
(
s
,
predictor
,
point_transform
,
ilv
,
prev_shift
,
mb_bitmask
,
reference
)
<
0
)
point_transform
,
return
-
1
;
mb_bitmask
,
reference
))
<
0
)
return
ret
;
}
else
{
}
else
{
if
(
mjpeg_decode_scan
(
s
,
nb_components
,
prev_shift
,
point_transform
,
if
((
ret
=
mjpeg_decode_scan
(
s
,
nb_components
,
mb_bitmask
,
reference
)
<
0
)
prev_shift
,
point_transform
,
return
-
1
;
mb_bitmask
,
reference
))
<
0
)
return
ret
;
}
}
}
}
emms_c
();
emms_c
();
return
0
;
return
0
;
out_of_range:
out_of_range:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: ac/dc index out of range
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: ac/dc index out of range
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
static
int
mjpeg_decode_dri
(
MJpegDecodeContext
*
s
)
static
int
mjpeg_decode_dri
(
MJpegDecodeContext
*
s
)
{
{
if
(
get_bits
(
&
s
->
gb
,
16
)
!=
4
)
if
(
get_bits
(
&
s
->
gb
,
16
)
!=
4
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
s
->
restart_interval
=
get_bits
(
&
s
->
gb
,
16
);
s
->
restart_interval
=
get_bits
(
&
s
->
gb
,
16
);
s
->
restart_count
=
0
;
s
->
restart_count
=
0
;
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"restart interval: %d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"restart interval: %d
\n
"
,
...
@@ -1129,9 +1138,9 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1129,9 +1138,9 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
len
=
get_bits
(
&
s
->
gb
,
16
);
len
=
get_bits
(
&
s
->
gb
,
16
);
if
(
len
<
5
)
if
(
len
<
5
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
8
*
len
>
get_bits_left
(
&
s
->
gb
))
if
(
8
*
len
>
get_bits_left
(
&
s
->
gb
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
id
=
get_bits_long
(
&
s
->
gb
,
32
);
id
=
get_bits_long
(
&
s
->
gb
,
32
);
id
=
av_be2ne32
(
id
);
id
=
av_be2ne32
(
id
);
...
@@ -1427,6 +1436,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
...
@@ -1427,6 +1436,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
const
uint8_t
*
unescaped_buf_ptr
;
const
uint8_t
*
unescaped_buf_ptr
;
int
unescaped_buf_size
;
int
unescaped_buf_size
;
int
start_code
;
int
start_code
;
int
ret
=
0
;
AVFrame
*
picture
=
data
;
AVFrame
*
picture
=
data
;
s
->
got_picture
=
0
;
// picture from previous image can not be reused
s
->
got_picture
=
0
;
// picture from previous image can not be reused
...
@@ -1475,9 +1485,9 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
...
@@ -1475,9 +1485,9 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
ff_mjpeg_decode_dqt
(
s
);
ff_mjpeg_decode_dqt
(
s
);
break
;
break
;
case
DHT
:
case
DHT
:
if
(
ff_mjpeg_decode_dht
(
s
)
<
0
)
{
if
(
(
ret
=
ff_mjpeg_decode_dht
(
s
)
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"huffman table decode error
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"huffman table decode error
\n
"
);
return
-
1
;
return
ret
;
}
}
break
;
break
;
case
SOF0
:
case
SOF0
:
...
@@ -1485,33 +1495,34 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
...
@@ -1485,33 +1495,34 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
s
->
lossless
=
0
;
s
->
lossless
=
0
;
s
->
ls
=
0
;
s
->
ls
=
0
;
s
->
progressive
=
0
;
s
->
progressive
=
0
;
if
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
if
(
(
ret
=
ff_mjpeg_decode_sof
(
s
)
)
<
0
)
return
-
1
;
return
ret
;
break
;
break
;
case
SOF2
:
case
SOF2
:
s
->
lossless
=
0
;
s
->
lossless
=
0
;
s
->
ls
=
0
;
s
->
ls
=
0
;
s
->
progressive
=
1
;
s
->
progressive
=
1
;
if
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
if
(
(
ret
=
ff_mjpeg_decode_sof
(
s
)
)
<
0
)
return
-
1
;
return
ret
;
break
;
break
;
case
SOF3
:
case
SOF3
:
s
->
lossless
=
1
;
s
->
lossless
=
1
;
s
->
ls
=
0
;
s
->
ls
=
0
;
s
->
progressive
=
0
;
s
->
progressive
=
0
;
if
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
if
(
(
ret
=
ff_mjpeg_decode_sof
(
s
)
)
<
0
)
return
-
1
;
return
ret
;
break
;
break
;
case
SOF48
:
case
SOF48
:
s
->
lossless
=
1
;
s
->
lossless
=
1
;
s
->
ls
=
1
;
s
->
ls
=
1
;
s
->
progressive
=
0
;
s
->
progressive
=
0
;
if
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
if
(
(
ret
=
ff_mjpeg_decode_sof
(
s
)
)
<
0
)
return
-
1
;
return
ret
;
break
;
break
;
case
LSE
:
case
LSE
:
if
(
!
CONFIG_JPEGLS_DECODER
||
ff_jpegls_decode_lse
(
s
)
<
0
)
if
(
!
CONFIG_JPEGLS_DECODER
||
return
-
1
;
(
ret
=
ff_jpegls_decode_lse
(
s
))
<
0
)
return
ret
;
break
;
break
;
case
EOI
:
case
EOI
:
s
->
cur_scan
=
0
;
s
->
cur_scan
=
0
;
...
@@ -1553,9 +1564,9 @@ eoi_parser:
...
@@ -1553,9 +1564,9 @@ eoi_parser:
"Can not process SOS before SOF, skipping
\n
"
);
"Can not process SOS before SOF, skipping
\n
"
);
break
;
break
;
}
}
if
(
ff_mjpeg_decode_sos
(
s
,
NULL
,
NULL
)
<
0
&&
if
(
(
ret
=
ff_mjpeg_decode_sos
(
s
,
NULL
,
NULL
)
)
<
0
&&
(
avctx
->
err_recognition
&
AV_EF_EXPLODE
))
(
avctx
->
err_recognition
&
AV_EF_EXPLODE
))
return
AVERROR_INVALIDDATA
;
return
ret
;
/* buggy avid puts EOI every 10-20th frame */
/* buggy avid puts EOI every 10-20th frame */
/* if restart period is over process EOI */
/* if restart period is over process EOI */
if
((
s
->
buggy_avid
&&
!
s
->
interlaced
)
||
s
->
restart_interval
)
if
((
s
->
buggy_avid
&&
!
s
->
interlaced
)
||
s
->
restart_interval
)
...
@@ -1595,7 +1606,7 @@ not_the_end:
...
@@ -1595,7 +1606,7 @@ not_the_end:
goto
eoi_parser
;
goto
eoi_parser
;
}
}
av_log
(
avctx
,
AV_LOG_FATAL
,
"No JPEG data found in image
\n
"
);
av_log
(
avctx
,
AV_LOG_FATAL
,
"No JPEG data found in image
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
the_end:
the_end:
av_log
(
avctx
,
AV_LOG_DEBUG
,
"mjpeg decode frame unused %td bytes
\n
"
,
av_log
(
avctx
,
AV_LOG_DEBUG
,
"mjpeg decode frame unused %td bytes
\n
"
,
buf_end
-
buf_ptr
);
buf_end
-
buf_ptr
);
...
...
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