Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
FFmpeg
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
libremedia
Tethys
FFmpeg
Commits
0f64cd1e
Commit
0f64cd1e
authored
12 years ago
by
Luca Barbato
Browse files
Options
Downloads
Patches
Plain Diff
mjpegdec: more meaningful return values
parent
20bcce50
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
libavcodec/mjpegdec.c
+77
-66
77 additions, 66 deletions
libavcodec/mjpegdec.c
with
77 additions
and
66 deletions
libavcodec/mjpegdec.c
+
77
−
66
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
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment