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
8549cf07
Commit
8549cf07
authored
Jan 08, 2012
by
Daniel Huang
Committed by
Diego Biurrun
Jan 08, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mjpegdec: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
999484c9
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
726 additions
and
683 deletions
+726
-683
mjpegdec.c
libavcodec/mjpegdec.c
+726
-683
No files found.
libavcodec/mjpegdec.c
View file @
8549cf07
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
* MJPEG decoder.
* MJPEG decoder.
*/
*/
//#define DEBUG
//
#define DEBUG
#include <assert.h>
#include <assert.h>
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
...
@@ -42,8 +42,9 @@
...
@@ -42,8 +42,9 @@
#include "jpeglsdec.h"
#include "jpeglsdec.h"
static
int
build_vlc
(
VLC
*
vlc
,
const
uint8_t
*
bits_table
,
const
uint8_t
*
val_table
,
static
int
build_vlc
(
VLC
*
vlc
,
const
uint8_t
*
bits_table
,
int
nb_codes
,
int
use_static
,
int
is_ac
)
const
uint8_t
*
val_table
,
int
nb_codes
,
int
use_static
,
int
is_ac
)
{
{
uint8_t
huff_size
[
256
];
uint8_t
huff_size
[
256
];
uint16_t
huff_code
[
256
];
uint16_t
huff_code
[
256
];
...
@@ -55,15 +56,18 @@ static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_tab
...
@@ -55,15 +56,18 @@ static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_tab
memset
(
huff_size
,
0
,
sizeof
(
huff_size
));
memset
(
huff_size
,
0
,
sizeof
(
huff_size
));
ff_mjpeg_build_huffman_codes
(
huff_size
,
huff_code
,
bits_table
,
val_table
);
ff_mjpeg_build_huffman_codes
(
huff_size
,
huff_code
,
bits_table
,
val_table
);
for
(
i
=
0
;
i
<
256
;
i
++
)
for
(
i
=
0
;
i
<
256
;
i
++
)
huff_sym
[
i
]
=
i
+
16
*
is_ac
;
huff_sym
[
i
]
=
i
+
16
*
is_ac
;
if
(
is_ac
)
huff_sym
[
0
]
=
16
*
256
;
if
(
is_ac
)
huff_sym
[
0
]
=
16
*
256
;
return
init_vlc_sparse
(
vlc
,
9
,
nb_codes
,
huff_size
,
1
,
1
,
huff_code
,
2
,
2
,
huff_sym
,
2
,
2
,
use_static
);
return
init_vlc_sparse
(
vlc
,
9
,
nb_codes
,
huff_size
,
1
,
1
,
huff_code
,
2
,
2
,
huff_sym
,
2
,
2
,
use_static
);
}
}
static
void
build_basic_mjpeg_vlc
(
MJpegDecodeContext
*
s
)
{
static
void
build_basic_mjpeg_vlc
(
MJpegDecodeContext
*
s
)
{
build_vlc
(
&
s
->
vlcs
[
0
][
0
],
ff_mjpeg_bits_dc_luminance
,
build_vlc
(
&
s
->
vlcs
[
0
][
0
],
ff_mjpeg_bits_dc_luminance
,
ff_mjpeg_val_dc
,
12
,
0
,
0
);
ff_mjpeg_val_dc
,
12
,
0
,
0
);
build_vlc
(
&
s
->
vlcs
[
0
][
1
],
ff_mjpeg_bits_dc_chrominance
,
build_vlc
(
&
s
->
vlcs
[
0
][
1
],
ff_mjpeg_bits_dc_chrominance
,
...
@@ -101,12 +105,12 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
...
@@ -101,12 +105,12 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
if
(
avctx
->
flags
&
CODEC_FLAG_EXTERN_HUFF
)
if
(
avctx
->
flags
&
CODEC_FLAG_EXTERN_HUFF
)
s
->
extern_huff
=
1
;
s
->
extern_huff
=
1
;
#endif
#endif
if
(
s
->
extern_huff
)
if
(
s
->
extern_huff
)
{
{
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
(
ff_mjpeg_decode_dht
(
s
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"mjpeg: error using external huffman table
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"mjpeg: error using external huffman table
\n
"
);
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
}
}
...
@@ -130,8 +134,7 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
...
@@ -130,8 +134,7 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
while
(
len
>=
65
)
{
while
(
len
>=
65
)
{
/* only 8 bit precision handled */
/* only 8 bit precision handled */
if
(
get_bits
(
&
s
->
gb
,
4
)
!=
0
)
if
(
get_bits
(
&
s
->
gb
,
4
)
!=
0
)
{
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"dqt: 16bit precision
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"dqt: 16bit precision
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -140,19 +143,18 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
...
@@ -140,19 +143,18 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
return
-
1
;
return
-
1
;
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"index=%d
\n
"
,
index
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"index=%d
\n
"
,
index
);
/* read quant table */
/* read quant table */
for
(
i
=
0
;
i
<
64
;
i
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
s
->
quant_matrixes
[
index
][
j
]
=
get_bits
(
&
s
->
gb
,
8
);
s
->
quant_matrixes
[
index
][
j
]
=
get_bits
(
&
s
->
gb
,
8
);
}
}
//XXX FIXME finetune, and perhaps add dc too
// XXX FIXME finetune, and perhaps add dc too
s
->
qscale
[
index
]
=
FFMAX
(
s
->
qscale
[
index
]
=
FFMAX
(
s
->
quant_matrixes
[
index
][
s
->
scantable
.
permutated
[
1
]],
s
->
quant_matrixes
[
index
][
s
->
scantable
.
permutated
[
1
]],
s
->
quant_matrixes
[
index
][
s
->
scantable
.
permutated
[
8
]])
>>
1
;
s
->
quant_matrixes
[
index
][
s
->
scantable
.
permutated
[
8
]])
>>
1
;
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"qscale[%d]: %d
\n
"
,
index
,
s
->
qscale
[
index
]);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"qscale[%d]: %d
\n
"
,
index
,
s
->
qscale
[
index
]);
len
-=
65
;
len
-=
65
;
}
}
return
0
;
return
0
;
}
}
...
@@ -175,7 +177,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
...
@@ -175,7 +177,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
if
(
index
>=
4
)
if
(
index
>=
4
)
return
-
1
;
return
-
1
;
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
);
n
+=
bits_table
[
i
];
n
+=
bits_table
[
i
];
}
}
...
@@ -184,7 +186,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
...
@@ -184,7 +186,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
return
-
1
;
return
-
1
;
code_max
=
0
;
code_max
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
v
=
get_bits
(
&
s
->
gb
,
8
);
v
=
get_bits
(
&
s
->
gb
,
8
);
if
(
v
>
code_max
)
if
(
v
>
code_max
)
code_max
=
v
;
code_max
=
v
;
...
@@ -196,17 +198,17 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
...
@@ -196,17 +198,17 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
free_vlc
(
&
s
->
vlcs
[
class
][
index
]);
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
,
code_max
+
1
,
0
,
class
>
0
)
<
0
){
if
(
build_vlc
(
&
s
->
vlcs
[
class
][
index
],
bits_table
,
val_table
,
code_max
+
1
,
0
,
class
>
0
)
<
0
)
return
-
1
;
return
-
1
;
}
if
(
class
>
0
)
{
if
(
class
>
0
)
{
free_vlc
(
&
s
->
vlcs
[
2
][
index
]);
free_vlc
(
&
s
->
vlcs
[
2
][
index
]);
if
(
build_vlc
(
&
s
->
vlcs
[
2
][
index
],
bits_table
,
val_table
,
code_max
+
1
,
0
,
0
)
<
0
){
if
(
build_vlc
(
&
s
->
vlcs
[
2
][
index
],
bits_table
,
val_table
,
code_max
+
1
,
0
,
0
)
<
0
)
return
-
1
;
return
-
1
;
}
}
}
}
}
return
0
;
return
0
;
}
}
...
@@ -216,12 +218,14 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -216,12 +218,14 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
/* XXX: verify len field validity */
/* XXX: verify len field validity */
len
=
get_bits
(
&
s
->
gb
,
16
);
len
=
get_bits
(
&
s
->
gb
,
16
);
s
->
bits
=
get_bits
(
&
s
->
gb
,
8
);
s
->
bits
=
get_bits
(
&
s
->
gb
,
8
);
if
(
s
->
pegasus_rct
)
s
->
bits
=
9
;
if
(
s
->
pegasus_rct
)
if
(
s
->
bits
==
9
&&
!
s
->
pegasus_rct
)
s
->
rct
=
1
;
//FIXME ugly
s
->
bits
=
9
;
if
(
s
->
bits
==
9
&&
!
s
->
pegasus_rct
)
s
->
rct
=
1
;
// FIXME ugly
if
(
s
->
bits
!=
8
&&
!
s
->
lossless
){
if
(
s
->
bits
!=
8
&&
!
s
->
lossless
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"only 8 bits/component accepted
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"only 8 bits/component accepted
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -229,26 +233,27 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -229,26 +233,27 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
height
=
get_bits
(
&
s
->
gb
,
16
);
height
=
get_bits
(
&
s
->
gb
,
16
);
width
=
get_bits
(
&
s
->
gb
,
16
);
width
=
get_bits
(
&
s
->
gb
,
16
);
//HACK for odd_height.mov
//
HACK for odd_height.mov
if
(
s
->
interlaced
&&
s
->
width
==
width
&&
s
->
height
==
height
+
1
)
if
(
s
->
interlaced
&&
s
->
width
==
width
&&
s
->
height
==
height
+
1
)
height
=
s
->
height
;
height
=
s
->
height
;
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
-
1
;
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
,
"only <= 8 bits/component or 16-bit gray accepted for JPEG-LS
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"only <= 8 bits/component or 16-bit gray accepted for JPEG-LS
\n
"
);
return
-
1
;
return
-
1
;
}
}
s
->
nb_components
=
nb_components
;
s
->
nb_components
=
nb_components
;
s
->
h_max
=
1
;
s
->
h_max
=
1
;
s
->
v_max
=
1
;
s
->
v_max
=
1
;
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
/* component id */
/* component id */
s
->
component_id
[
i
]
=
get_bits
(
&
s
->
gb
,
8
)
-
1
;
s
->
component_id
[
i
]
=
get_bits
(
&
s
->
gb
,
8
)
-
1
;
s
->
h_count
[
i
]
=
get_bits
(
&
s
->
gb
,
4
);
s
->
h_count
[
i
]
=
get_bits
(
&
s
->
gb
,
4
);
...
@@ -261,16 +266,19 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -261,16 +266,19 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
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
-
1
;
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"component %d %d:%d id: %d quant:%d
\n
"
,
i
,
s
->
h_count
[
i
],
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"component %d %d:%d id: %d quant:%d
\n
"
,
s
->
v_count
[
i
],
s
->
component_id
[
i
],
s
->
quant_index
[
i
]);
i
,
s
->
h_count
[
i
],
s
->
v_count
[
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
,
"Subsampling in JPEG-LS is not supported.
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Subsampling in JPEG-LS is not supported.
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
s
->
v_max
==
1
&&
s
->
h_max
==
1
&&
s
->
lossless
==
1
)
s
->
rgb
=
1
;
if
(
s
->
v_max
==
1
&&
s
->
h_max
==
1
&&
s
->
lossless
==
1
)
s
->
rgb
=
1
;
/* if different size, realloc/alloc picture */
/* if different size, realloc/alloc picture */
/* XXX: also check h_count and v_count */
/* XXX: also check h_count and v_count */
...
@@ -294,12 +302,11 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -294,12 +302,11 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
avcodec_set_dimensions
(
s
->
avctx
,
width
,
height
);
avcodec_set_dimensions
(
s
->
avctx
,
width
,
height
);
s
->
qscale_table
=
av_mallocz
((
s
->
width
+
15
)
/
16
);
s
->
qscale_table
=
av_mallocz
((
s
->
width
+
15
)
/
16
);
s
->
first_picture
=
0
;
s
->
first_picture
=
0
;
}
}
if
(
s
->
interlaced
&&
(
s
->
bottom_field
==
!
s
->
interlace_polarity
))
if
(
s
->
interlaced
&&
(
s
->
bottom_field
==
!
s
->
interlace_polarity
))
return
0
;
return
0
;
/* XXX: not complete test ! */
/* XXX: not complete test ! */
...
@@ -308,19 +315,20 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -308,19 +315,20 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
(
s
->
h_count
[
2
]
<<
12
)
|
(
s
->
v_count
[
2
]
<<
8
)
|
(
s
->
h_count
[
2
]
<<
12
)
|
(
s
->
v_count
[
2
]
<<
8
)
|
(
s
->
h_count
[
3
]
<<
4
)
|
s
->
v_count
[
3
];
(
s
->
h_count
[
3
]
<<
4
)
|
s
->
v_count
[
3
];
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"pix fmt id %x
\n
"
,
pix_fmt_id
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"pix fmt id %x
\n
"
,
pix_fmt_id
);
//NOTE we do not allocate pictures large enough for the possible padding of h/v_count being 4
/* NOTE we do not allocate pictures large enough for the possible
if
(
!
(
pix_fmt_id
&
0xD0D0D0D0
))
* padding of h/v_count being 4 */
pix_fmt_id
-=
(
pix_fmt_id
&
0xF0F0F0F0
)
>>
1
;
if
(
!
(
pix_fmt_id
&
0xD0D0D0D0
))
if
(
!
(
pix_fmt_id
&
0x0D0D0D0D
))
pix_fmt_id
-=
(
pix_fmt_id
&
0xF0F0F0F0
)
>>
1
;
pix_fmt_id
-=
(
pix_fmt_id
&
0x0F0F0F0F
)
>>
1
;
if
(
!
(
pix_fmt_id
&
0x0D0D0D0D
))
pix_fmt_id
-=
(
pix_fmt_id
&
0x0F0F0F0F
)
>>
1
;
switch
(
pix_fmt_id
){
switch
(
pix_fmt_id
)
{
case
0x11111100
:
case
0x11111100
:
if
(
s
->
rgb
){
if
(
s
->
rgb
)
s
->
avctx
->
pix_fmt
=
PIX_FMT_BGRA
;
s
->
avctx
->
pix_fmt
=
PIX_FMT_BGRA
;
}
else
else
s
->
avctx
->
pix_fmt
=
s
->
cs_itu601
?
PIX_FMT_YUV444P
:
PIX_FMT_YUVJ444P
;
s
->
avctx
->
pix_fmt
=
s
->
cs_itu601
?
PIX_FMT_YUV444P
:
PIX_FMT_YUVJ444P
;
assert
(
s
->
nb_components
==
3
);
assert
(
s
->
nb_components
==
3
);
break
;
break
;
case
0x11000000
:
case
0x11000000
:
s
->
avctx
->
pix_fmt
=
PIX_FMT_GRAY8
;
s
->
avctx
->
pix_fmt
=
PIX_FMT_GRAY8
;
...
@@ -338,42 +346,41 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
...
@@ -338,42 +346,41 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
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
-
1
;
}
}
if
(
s
->
ls
)
{
if
(
s
->
ls
)
{
if
(
s
->
nb_components
>
1
)
if
(
s
->
nb_components
>
1
)
s
->
avctx
->
pix_fmt
=
PIX_FMT_RGB24
;
s
->
avctx
->
pix_fmt
=
PIX_FMT_RGB24
;
else
if
(
s
->
bits
<=
8
)
else
if
(
s
->
bits
<=
8
)
s
->
avctx
->
pix_fmt
=
PIX_FMT_GRAY8
;
s
->
avctx
->
pix_fmt
=
PIX_FMT_GRAY8
;
else
else
s
->
avctx
->
pix_fmt
=
PIX_FMT_GRAY16
;
s
->
avctx
->
pix_fmt
=
PIX_FMT_GRAY16
;
}
}
if
(
s
->
picture_ptr
->
data
[
0
])
if
(
s
->
picture_ptr
->
data
[
0
])
s
->
avctx
->
release_buffer
(
s
->
avctx
,
s
->
picture_ptr
);
s
->
avctx
->
release_buffer
(
s
->
avctx
,
s
->
picture_ptr
);
if
(
s
->
avctx
->
get_buffer
(
s
->
avctx
,
s
->
picture_ptr
)
<
0
)
{
if
(
s
->
avctx
->
get_buffer
(
s
->
avctx
,
s
->
picture_ptr
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
-
1
;
return
-
1
;
}
}
s
->
picture_ptr
->
pict_type
=
AV_PICTURE_TYPE_I
;
s
->
picture_ptr
->
pict_type
=
AV_PICTURE_TYPE_I
;
s
->
picture_ptr
->
key_frame
=
1
;
s
->
picture_ptr
->
key_frame
=
1
;
s
->
got_picture
=
1
;
s
->
got_picture
=
1
;
for
(
i
=
0
;
i
<
3
;
i
++
){
for
(
i
=
0
;
i
<
3
;
i
++
)
s
->
linesize
[
i
]
=
s
->
picture_ptr
->
linesize
[
i
]
<<
s
->
interlaced
;
s
->
linesize
[
i
]
=
s
->
picture_ptr
->
linesize
[
i
]
<<
s
->
interlaced
;
}
// printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
// printf("%d %d %d %d %d %d\n",
// s->width, s->height, s->linesize[0], s->linesize[1],
// s->interlaced, s->avctx->height);
if
(
len
!=
(
8
+
(
3
*
nb_components
)))
if
(
len
!=
(
8
+
(
3
*
nb_components
)))
{
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"decode_sof0: error, len(%d) mismatch
\n
"
,
len
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"decode_sof0: error, len(%d) mismatch
\n
"
,
len
);
}
/* totally blank picture as progressive JPEG will only add details to it */
/* totally blank picture as progressive JPEG will only add details to it */
if
(
s
->
progressive
)
{
if
(
s
->
progressive
)
{
int
bw
=
(
width
+
s
->
h_max
*
8
-
1
)
/
(
s
->
h_max
*
8
);
int
bw
=
(
width
+
s
->
h_max
*
8
-
1
)
/
(
s
->
h_max
*
8
);
int
bh
=
(
height
+
s
->
v_max
*
8
-
1
)
/
(
s
->
v_max
*
8
);
int
bh
=
(
height
+
s
->
v_max
*
8
-
1
)
/
(
s
->
v_max
*
8
);
for
(
i
=
0
;
i
<
s
->
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_components
;
i
++
)
{
int
size
=
bw
*
bh
*
s
->
h_count
[
i
]
*
s
->
v_count
[
i
];
int
size
=
bw
*
bh
*
s
->
h_count
[
i
]
*
s
->
v_count
[
i
];
av_freep
(
&
s
->
blocks
[
i
]);
av_freep
(
&
s
->
blocks
[
i
]);
av_freep
(
&
s
->
last_nnz
[
i
]);
av_freep
(
&
s
->
last_nnz
[
i
]);
...
@@ -390,22 +397,22 @@ static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
...
@@ -390,22 +397,22 @@ static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
{
{
int
code
;
int
code
;
code
=
get_vlc2
(
&
s
->
gb
,
s
->
vlcs
[
0
][
dc_index
].
table
,
9
,
2
);
code
=
get_vlc2
(
&
s
->
gb
,
s
->
vlcs
[
0
][
dc_index
].
table
,
9
,
2
);
if
(
code
<
0
)
if
(
code
<
0
)
{
{
av_log
(
s
->
avctx
,
AV_LOG_WARNING
,
av_log
(
s
->
avctx
,
AV_LOG_WARNING
,
"mjpeg_decode_dc: bad vlc: %d:%d (%p)
\n
"
,
0
,
dc_index
,
"mjpeg_decode_dc: bad vlc: %d:%d (%p)
\n
"
,
&
s
->
vlcs
[
0
][
dc_index
]);
0
,
dc_index
,
&
s
->
vlcs
[
0
][
dc_index
]);
return
0xffff
;
return
0xffff
;
}
}
if
(
code
)
if
(
code
)
return
get_xbits
(
&
s
->
gb
,
code
);
return
get_xbits
(
&
s
->
gb
,
code
);
else
else
return
0
;
return
0
;
}
}
/* decode block and dequantize */
/* decode block and dequantize */
static
int
decode_block
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
static
int
decode_block
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
int
component
,
int
component
,
int
dc_index
,
int
ac_index
,
int16_t
*
quant_matrix
)
int
dc_index
,
int
ac_index
,
int16_t
*
quant_matrix
)
{
{
int
code
,
i
,
j
,
level
,
val
;
int
code
,
i
,
j
,
level
,
val
;
...
@@ -427,13 +434,13 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
...
@@ -427,13 +434,13 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
i
+=
((
unsigned
)
code
)
>>
4
;
i
+=
((
unsigned
)
code
)
>>
4
;
code
&=
0xf
;
code
&=
0xf
;
if
(
code
)
{
if
(
code
)
{
if
(
code
>
MIN_CACHE_BITS
-
16
){
if
(
code
>
MIN_CACHE_BITS
-
16
)
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
{
{
int
cache
=
GET_CACHE
(
re
,
&
s
->
gb
);
int
cache
=
GET_CACHE
(
re
,
&
s
->
gb
);
int
sign
=
(
~
cache
)
>>
31
;
int
sign
=
(
~
cache
)
>>
31
;
level
=
(
NEG_USR32
(
sign
^
cache
,
code
)
^
sign
)
-
sign
;
level
=
(
NEG_USR32
(
sign
^
cache
,
code
)
^
sign
)
-
sign
;
}
}
...
@@ -446,14 +453,15 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
...
@@ -446,14 +453,15 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
block
[
j
]
=
level
*
quant_matrix
[
j
];
block
[
j
]
=
level
*
quant_matrix
[
j
];
}
}
}
while
(
i
<
63
);
}
while
(
i
<
63
);
CLOSE_READER
(
re
,
&
s
->
gb
);}
CLOSE_READER
(
re
,
&
s
->
gb
);}
return
0
;
return
0
;
}
}
static
int
decode_dc_progressive
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
int
component
,
static
int
decode_dc_progressive
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
int
dc_index
,
int16_t
*
quant_matrix
,
int
Al
)
int
component
,
int
dc_index
,
int16_t
*
quant_matrix
,
int
Al
)
{
{
int
val
;
int
val
;
s
->
dsp
.
clear_block
(
block
);
s
->
dsp
.
clear_block
(
block
);
...
@@ -469,38 +477,41 @@ static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block, int comp
...
@@ -469,38 +477,41 @@ static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block, int comp
}
}
/* decode block and dequantize - progressive JPEG version */
/* decode block and dequantize - progressive JPEG version */
static
int
decode_block_progressive
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
uint8_t
*
last_nnz
,
static
int
decode_block_progressive
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
int
ac_index
,
int16_t
*
quant_matrix
,
uint8_t
*
last_nnz
,
int
ac_index
,
int16_t
*
quant_matrix
,
int
ss
,
int
se
,
int
Al
,
int
*
EOBRUN
)
int
ss
,
int
se
,
int
Al
,
int
*
EOBRUN
)
{
{
int
code
,
i
,
j
,
level
,
val
,
run
;
int
code
,
i
,
j
,
level
,
val
,
run
;
if
(
*
EOBRUN
)
{
if
(
*
EOBRUN
)
{
(
*
EOBRUN
)
--
;
(
*
EOBRUN
)
--
;
return
0
;
return
0
;
}
}
{
OPEN_READER
(
re
,
&
s
->
gb
);
for
(
i
=
ss
;;
i
++
)
{
{
OPEN_READER
(
re
,
&
s
->
gb
);
for
(
i
=
ss
;
;
i
++
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_VLC
(
code
,
re
,
&
s
->
gb
,
s
->
vlcs
[
2
][
ac_index
].
table
,
9
,
2
);
GET_VLC
(
code
,
re
,
&
s
->
gb
,
s
->
vlcs
[
2
][
ac_index
].
table
,
9
,
2
);
run
=
((
unsigned
)
code
)
>>
4
;
run
=
((
unsigned
)
code
)
>>
4
;
code
&=
0xF
;
code
&=
0xF
;
if
(
code
)
{
if
(
code
)
{
i
+=
run
;
i
+=
run
;
if
(
code
>
MIN_CACHE_BITS
-
16
){
if
(
code
>
MIN_CACHE_BITS
-
16
)
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
{
{
int
cache
=
GET_CACHE
(
re
,
&
s
->
gb
);
int
cache
=
GET_CACHE
(
re
,
&
s
->
gb
);
int
sign
=
(
~
cache
)
>>
31
;
int
sign
=
(
~
cache
)
>>
31
;
level
=
(
NEG_USR32
(
sign
^
cache
,
code
)
^
sign
)
-
sign
;
level
=
(
NEG_USR32
(
sign
^
cache
,
code
)
^
sign
)
-
sign
;
}
}
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
code
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
code
);
if
(
i
>=
se
)
{
if
(
i
>=
se
)
{
if
(
i
==
se
)
{
if
(
i
==
se
)
{
j
=
s
->
scantable
.
permutated
[
se
];
j
=
s
->
scantable
.
permutated
[
se
];
block
[
j
]
=
level
*
quant_matrix
[
j
]
<<
Al
;
block
[
j
]
=
level
*
quant_matrix
[
j
]
<<
Al
;
break
;
break
;
...
@@ -510,16 +521,16 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block, uint8
...
@@ -510,16 +521,16 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block, uint8
}
}
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
block
[
j
]
=
level
*
quant_matrix
[
j
]
<<
Al
;
block
[
j
]
=
level
*
quant_matrix
[
j
]
<<
Al
;
}
else
{
}
else
{
if
(
run
==
0xF
)
{
// ZRL - skip 15 coefficients
if
(
run
==
0xF
)
{
// ZRL - skip 15 coefficients
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
-
1
;
}
}
}
else
{
}
else
{
val
=
(
1
<<
run
);
val
=
(
1
<<
run
);
if
(
run
)
{
if
(
run
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
val
+=
NEG_USR32
(
GET_CACHE
(
re
,
&
s
->
gb
),
run
);
val
+=
NEG_USR32
(
GET_CACHE
(
re
,
&
s
->
gb
),
run
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
run
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
run
);
...
@@ -529,53 +540,58 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block, uint8
...
@@ -529,53 +540,58 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block, uint8
}
}
}
}
}
}
CLOSE_READER
(
re
,
&
s
->
gb
);}
CLOSE_READER
(
re
,
&
s
->
gb
);
if
(
i
>
*
last_nnz
)
}
if
(
i
>
*
last_nnz
)
*
last_nnz
=
i
;
*
last_nnz
=
i
;
return
0
;
return
0
;
}
}
#define REFINE_BIT(j) {\
#define REFINE_BIT(j) { \
UPDATE_CACHE(re, &s->gb);\
UPDATE_CACHE(re, &s->gb); \
sign = block[j]>>15;\
sign = block[j] >> 15; \
block[j] += SHOW_UBITS(re, &s->gb, 1) * ((quant_matrix[j]^sign)-sign) << Al;\
block[j] += SHOW_UBITS(re, &s->gb, 1) * \
LAST_SKIP_BITS(re, &s->gb, 1);\
((quant_matrix[j] ^ sign) - sign) << Al; \
LAST_SKIP_BITS(re, &s->gb, 1); \
}
}
#define ZERO_RUN \
#define ZERO_RUN \
for
(;;i++) {
\
for
(; ; i++) {
\
if
(i > last) {
\
if
(i > last) {
\
i += run;\
i += run;
\
if
(i > se) {
\
if
(i > se) {
\
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 -1;
\
}\
}
\
break;\
break;
\
}\
}
\
j = s->scantable.permutated[i];\
j = s->scantable.permutated[i];
\
if
(block[j])
\
if
(block[j])
\
REFINE_BIT(j)\
REFINE_BIT(j)
\
else if
(run-- == 0)
\
else if
(run-- == 0)
\
break;\
break;
\
}
}
/* decode block and dequantize - progressive JPEG refinement pass */
/* decode block and dequantize - progressive JPEG refinement pass */
static
int
decode_block_refinement
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
uint8_t
*
last_nnz
,
static
int
decode_block_refinement
(
MJpegDecodeContext
*
s
,
DCTELEM
*
block
,
uint8_t
*
last_nnz
,
int
ac_index
,
int16_t
*
quant_matrix
,
int
ac_index
,
int16_t
*
quant_matrix
,
int
ss
,
int
se
,
int
Al
,
int
*
EOBRUN
)
int
ss
,
int
se
,
int
Al
,
int
*
EOBRUN
)
{
{
int
code
,
i
=
ss
,
j
,
sign
,
val
,
run
;
int
code
,
i
=
ss
,
j
,
sign
,
val
,
run
;
int
last
=
FFMIN
(
se
,
*
last_nnz
);
int
last
=
FFMIN
(
se
,
*
last_nnz
);
OPEN_READER
(
re
,
&
s
->
gb
);
OPEN_READER
(
re
,
&
s
->
gb
);
if
(
*
EOBRUN
)
if
(
*
EOBRUN
)
{
(
*
EOBRUN
)
--
;
(
*
EOBRUN
)
--
;
else
{
}
else
{
for
(;;
i
++
)
{
for
(;
;
i
++
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_VLC
(
code
,
re
,
&
s
->
gb
,
s
->
vlcs
[
2
][
ac_index
].
table
,
9
,
2
);
GET_VLC
(
code
,
re
,
&
s
->
gb
,
s
->
vlcs
[
2
][
ac_index
].
table
,
9
,
2
);
if
(
code
&
0xF
)
{
if
(
code
&
0xF
)
{
run
=
((
unsigned
)
code
)
>>
4
;
run
=
((
unsigned
)
code
)
>>
4
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
val
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
);
val
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
);
...
@@ -583,21 +599,21 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
...
@@ -583,21 +599,21 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
ZERO_RUN
;
ZERO_RUN
;
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
val
--
;
val
--
;
block
[
j
]
=
((
quant_matrix
[
j
]
^
val
)
-
val
)
<<
Al
;
block
[
j
]
=
((
quant_matrix
[
j
]
^
val
)
-
val
)
<<
Al
;
if
(
i
==
se
)
{
if
(
i
==
se
)
{
if
(
i
>
*
last_nnz
)
if
(
i
>
*
last_nnz
)
*
last_nnz
=
i
;
*
last_nnz
=
i
;
CLOSE_READER
(
re
,
&
s
->
gb
);
CLOSE_READER
(
re
,
&
s
->
gb
);
return
0
;
return
0
;
}
}
}
else
{
}
else
{
run
=
((
unsigned
)
code
)
>>
4
;
run
=
((
unsigned
)
code
)
>>
4
;
if
(
run
==
0xF
)
{
if
(
run
==
0xF
)
{
ZERO_RUN
;
ZERO_RUN
;
}
else
{
}
else
{
val
=
run
;
val
=
run
;
run
=
(
1
<<
run
);
run
=
(
1
<<
run
);
if
(
val
)
{
if
(
val
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
run
+=
SHOW_UBITS
(
re
,
&
s
->
gb
,
val
);
run
+=
SHOW_UBITS
(
re
,
&
s
->
gb
,
val
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
val
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
val
);
...
@@ -608,13 +624,13 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
...
@@ -608,13 +624,13 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
}
}
}
}
if
(
i
>
*
last_nnz
)
if
(
i
>
*
last_nnz
)
*
last_nnz
=
i
;
*
last_nnz
=
i
;
}
}
for
(;
i
<=
last
;
i
++
)
{
for
(;
i
<=
last
;
i
++
)
{
j
=
s
->
scantable
.
permutated
[
i
];
j
=
s
->
scantable
.
permutated
[
i
];
if
(
block
[
j
])
if
(
block
[
j
])
REFINE_BIT
(
j
)
REFINE_BIT
(
j
)
}
}
CLOSE_READER
(
re
,
&
s
->
gb
);
CLOSE_READER
(
re
,
&
s
->
gb
);
...
@@ -624,43 +640,46 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
...
@@ -624,43 +640,46 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
#undef REFINE_BIT
#undef REFINE_BIT
#undef ZERO_RUN
#undef ZERO_RUN
static
int
ljpeg_decode_rgb_scan
(
MJpegDecodeContext
*
s
,
int
predictor
,
int
point_transform
){
static
int
ljpeg_decode_rgb_scan
(
MJpegDecodeContext
*
s
,
int
predictor
,
int
point_transform
)
{
int
i
,
mb_x
,
mb_y
;
int
i
,
mb_x
,
mb_y
;
uint16_t
(
*
buffer
)[
4
];
uint16_t
(
*
buffer
)[
4
];
int
left
[
3
],
top
[
3
],
topleft
[
3
];
int
left
[
3
],
top
[
3
],
topleft
[
3
];
const
int
linesize
=
s
->
linesize
[
0
];
const
int
linesize
=
s
->
linesize
[
0
];
const
int
mask
=
(
1
<<
s
->
bits
)
-
1
;
const
int
mask
=
(
1
<<
s
->
bits
)
-
1
;
av_fast_malloc
(
&
s
->
ljpeg_buffer
,
&
s
->
ljpeg_buffer_size
,
(
unsigned
)
s
->
mb_width
*
4
*
sizeof
(
s
->
ljpeg_buffer
[
0
][
0
]));
av_fast_malloc
(
&
s
->
ljpeg_buffer
,
&
s
->
ljpeg_buffer_size
,
buffer
=
s
->
ljpeg_buffer
;
(
unsigned
)
s
->
mb_width
*
4
*
sizeof
(
s
->
ljpeg_buffer
[
0
][
0
]));
buffer
=
s
->
ljpeg_buffer
;
for
(
i
=
0
;
i
<
3
;
i
++
){
for
(
i
=
0
;
i
<
3
;
i
++
)
buffer
[
0
][
i
]
=
1
<<
(
s
->
bits
+
point_transform
-
1
);
buffer
[
0
][
i
]
=
1
<<
(
s
->
bits
+
point_transform
-
1
);
}
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
const
int
modified_predictor
=
mb_y
?
predictor
:
1
;
const
int
modified_predictor
=
mb_y
?
predictor
:
1
;
uint8_t
*
ptr
=
s
->
picture_ptr
->
data
[
0
]
+
(
linesize
*
mb_y
);
uint8_t
*
ptr
=
s
->
picture_ptr
->
data
[
0
]
+
(
linesize
*
mb_y
);
if
(
s
->
interlaced
&&
s
->
bottom_field
)
if
(
s
->
interlaced
&&
s
->
bottom_field
)
ptr
+=
linesize
>>
1
;
ptr
+=
linesize
>>
1
;
for
(
i
=
0
;
i
<
3
;
i
++
){
for
(
i
=
0
;
i
<
3
;
i
++
)
top
[
i
]
=
left
[
i
]
=
topleft
[
i
]
=
buffer
[
0
][
i
];
top
[
i
]
=
left
[
i
]
=
topleft
[
i
]
=
buffer
[
0
][
i
];
}
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
if
(
s
->
restart_interval
&&
!
s
->
restart_count
)
if
(
s
->
restart_interval
&&
!
s
->
restart_count
)
s
->
restart_count
=
s
->
restart_interval
;
s
->
restart_count
=
s
->
restart_interval
;
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
pred
;
int
pred
;
topleft
[
i
]
=
top
[
i
];
topleft
[
i
]
=
top
[
i
];
top
[
i
]
=
buffer
[
mb_x
][
i
];
top
[
i
]
=
buffer
[
mb_x
][
i
];
PREDICT
(
pred
,
topleft
[
i
],
top
[
i
],
left
[
i
],
modified_predictor
);
PREDICT
(
pred
,
topleft
[
i
],
top
[
i
],
left
[
i
],
modified_predictor
);
left
[
i
]
=
left
[
i
]
=
buffer
[
mb_x
][
i
]
=
buffer
[
mb_x
][
i
]
=
mask
&
(
pred
+
(
mjpeg_decode_dc
(
s
,
s
->
dc_index
[
i
])
<<
point_transform
));
mask
&
(
pred
+
(
mjpeg_decode_dc
(
s
,
s
->
dc_index
[
i
])
<<
point_transform
));
}
}
if
(
s
->
restart_interval
&&
!--
s
->
restart_count
)
{
if
(
s
->
restart_interval
&&
!--
s
->
restart_count
)
{
...
@@ -669,40 +688,42 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point
...
@@ -669,40 +688,42 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point
}
}
}
}
if
(
s
->
rct
)
{
if
(
s
->
rct
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
ptr
[
4
*
mb_x
+
1
]
=
buffer
[
mb_x
][
0
]
-
((
buffer
[
mb_x
][
1
]
+
buffer
[
mb_x
][
2
]
-
0x200
)
>>
2
);
ptr
[
4
*
mb_x
+
1
]
=
buffer
[
mb_x
][
0
]
-
((
buffer
[
mb_x
][
1
]
+
buffer
[
mb_x
][
2
]
-
0x200
)
>>
2
);
ptr
[
4
*
mb_x
+
0
]
=
buffer
[
mb_x
][
1
]
+
ptr
[
4
*
mb_x
+
1
];
ptr
[
4
*
mb_x
+
0
]
=
buffer
[
mb_x
][
1
]
+
ptr
[
4
*
mb_x
+
1
];
ptr
[
4
*
mb_x
+
2
]
=
buffer
[
mb_x
][
2
]
+
ptr
[
4
*
mb_x
+
1
];
ptr
[
4
*
mb_x
+
2
]
=
buffer
[
mb_x
][
2
]
+
ptr
[
4
*
mb_x
+
1
];
}
}
}
else
if
(
s
->
pegasus_rct
)
{
}
else
if
(
s
->
pegasus_rct
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
ptr
[
4
*
mb_x
+
1
]
=
buffer
[
mb_x
][
0
]
-
((
buffer
[
mb_x
][
1
]
+
buffer
[
mb_x
][
2
])
>>
2
);
ptr
[
4
*
mb_x
+
1
]
=
buffer
[
mb_x
][
0
]
-
((
buffer
[
mb_x
][
1
]
+
buffer
[
mb_x
][
2
])
>>
2
);
ptr
[
4
*
mb_x
+
0
]
=
buffer
[
mb_x
][
1
]
+
ptr
[
4
*
mb_x
+
1
];
ptr
[
4
*
mb_x
+
0
]
=
buffer
[
mb_x
][
1
]
+
ptr
[
4
*
mb_x
+
1
];
ptr
[
4
*
mb_x
+
2
]
=
buffer
[
mb_x
][
2
]
+
ptr
[
4
*
mb_x
+
1
];
ptr
[
4
*
mb_x
+
2
]
=
buffer
[
mb_x
][
2
]
+
ptr
[
4
*
mb_x
+
1
];
}
}
}
else
{
}
else
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
ptr
[
4
*
mb_x
+
0
]
=
buffer
[
mb_x
][
2
];
ptr
[
4
*
mb_x
+
0
]
=
buffer
[
mb_x
][
2
];
ptr
[
4
*
mb_x
+
1
]
=
buffer
[
mb_x
][
1
];
ptr
[
4
*
mb_x
+
1
]
=
buffer
[
mb_x
][
1
];
ptr
[
4
*
mb_x
+
2
]
=
buffer
[
mb_x
][
0
];
ptr
[
4
*
mb_x
+
2
]
=
buffer
[
mb_x
][
0
];
}
}
}
}
}
}
return
0
;
return
0
;
}
}
static
int
ljpeg_decode_yuv_scan
(
MJpegDecodeContext
*
s
,
int
predictor
,
int
point_transform
){
static
int
ljpeg_decode_yuv_scan
(
MJpegDecodeContext
*
s
,
int
predictor
,
int
point_transform
)
{
int
i
,
mb_x
,
mb_y
;
int
i
,
mb_x
,
mb_y
;
const
int
nb_components
=
3
;
const
int
nb_components
=
3
;
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
if
(
s
->
restart_interval
&&
!
s
->
restart_count
)
if
(
s
->
restart_interval
&&
!
s
->
restart_count
)
s
->
restart_count
=
s
->
restart_interval
;
s
->
restart_count
=
s
->
restart_interval
;
if
(
mb_x
==
0
||
mb_y
==
0
||
s
->
interlaced
)
{
if
(
mb_x
==
0
||
mb_y
==
0
||
s
->
interlaced
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
uint8_t
*
ptr
;
uint8_t
*
ptr
;
int
n
,
h
,
v
,
x
,
y
,
c
,
j
,
linesize
;
int
n
,
h
,
v
,
x
,
y
,
c
,
j
,
linesize
;
n
=
s
->
nb_blocks
[
i
];
n
=
s
->
nb_blocks
[
i
];
...
@@ -711,29 +732,30 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point
...
@@ -711,29 +732,30 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point
v
=
s
->
v_scount
[
i
];
v
=
s
->
v_scount
[
i
];
x
=
0
;
x
=
0
;
y
=
0
;
y
=
0
;
linesize
=
s
->
linesize
[
c
];
linesize
=
s
->
linesize
[
c
];
for
(
j
=
0
;
j
<
n
;
j
++
)
{
for
(
j
=
0
;
j
<
n
;
j
++
)
{
int
pred
;
int
pred
;
// FIXME optimize this crap
ptr
=
s
->
picture_ptr
->
data
[
c
]
+
(
linesize
*
(
v
*
mb_y
+
y
))
+
(
h
*
mb_x
+
x
);
//FIXME optimize this crap
ptr
=
s
->
picture_ptr
->
data
[
c
]
+
if
(
y
==
0
&&
mb_y
==
0
){
(
linesize
*
(
v
*
mb_y
+
y
))
+
if
(
x
==
0
&&
mb_x
==
0
){
(
h
*
mb_x
+
x
);
pred
=
128
<<
point_transform
;
if
(
y
==
0
&&
mb_y
==
0
)
{
}
else
{
if
(
x
==
0
&&
mb_x
==
0
)
pred
=
ptr
[
-
1
];
pred
=
128
<<
point_transform
;
}
else
}
else
{
pred
=
ptr
[
-
1
];
if
(
x
==
0
&&
mb_x
==
0
){
}
else
{
pred
=
ptr
[
-
linesize
];
if
(
x
==
0
&&
mb_x
==
0
)
}
else
{
pred
=
ptr
[
-
linesize
];
PREDICT
(
pred
,
ptr
[
-
linesize
-
1
],
ptr
[
-
linesize
],
ptr
[
-
1
],
predictor
);
else
}
PREDICT
(
pred
,
ptr
[
-
linesize
-
1
],
ptr
[
-
linesize
],
ptr
[
-
1
],
predictor
);
}
}
if
(
s
->
interlaced
&&
s
->
bottom_field
)
if
(
s
->
interlaced
&&
s
->
bottom_field
)
ptr
+=
linesize
>>
1
;
ptr
+=
linesize
>>
1
;
*
ptr
=
pred
+
(
mjpeg_decode_dc
(
s
,
s
->
dc_index
[
i
])
<<
point_transform
);
*
ptr
=
pred
+
(
mjpeg_decode_dc
(
s
,
s
->
dc_index
[
i
])
<<
point_transform
);
if
(
++
x
==
h
)
{
if
(
++
x
==
h
)
{
x
=
0
;
x
=
0
;
...
@@ -741,8 +763,8 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point
...
@@ -741,8 +763,8 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point
}
}
}
}
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
uint8_t
*
ptr
;
uint8_t
*
ptr
;
int
n
,
h
,
v
,
x
,
y
,
c
,
j
,
linesize
;
int
n
,
h
,
v
,
x
,
y
,
c
,
j
,
linesize
;
n
=
s
->
nb_blocks
[
i
];
n
=
s
->
nb_blocks
[
i
];
...
@@ -751,14 +773,18 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point
...
@@ -751,14 +773,18 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point
v
=
s
->
v_scount
[
i
];
v
=
s
->
v_scount
[
i
];
x
=
0
;
x
=
0
;
y
=
0
;
y
=
0
;
linesize
=
s
->
linesize
[
c
];
linesize
=
s
->
linesize
[
c
];
for
(
j
=
0
;
j
<
n
;
j
++
)
{
for
(
j
=
0
;
j
<
n
;
j
++
)
{
int
pred
;
int
pred
;
ptr
=
s
->
picture_ptr
->
data
[
c
]
+
(
linesize
*
(
v
*
mb_y
+
y
))
+
(
h
*
mb_x
+
x
);
//FIXME optimize this crap
// FIXME optimize this crap
PREDICT
(
pred
,
ptr
[
-
linesize
-
1
],
ptr
[
-
linesize
],
ptr
[
-
1
],
predictor
);
ptr
=
s
->
picture_ptr
->
data
[
c
]
+
*
ptr
=
pred
+
(
mjpeg_decode_dc
(
s
,
s
->
dc_index
[
i
])
<<
point_transform
);
(
linesize
*
(
v
*
mb_y
+
y
))
+
(
h
*
mb_x
+
x
);
PREDICT
(
pred
,
ptr
[
-
linesize
-
1
],
ptr
[
-
linesize
],
ptr
[
-
1
],
predictor
);
*
ptr
=
pred
+
(
mjpeg_decode_dc
(
s
,
s
->
dc_index
[
i
])
<<
point_transform
);
if
(
++
x
==
h
)
{
if
(
++
x
==
h
)
{
x
=
0
;
x
=
0
;
y
++
;
y
++
;
...
@@ -790,49 +816,54 @@ static av_always_inline void mjpeg_copy_block(uint8_t *dst, const uint8_t *src,
...
@@ -790,49 +816,54 @@ static av_always_inline void mjpeg_copy_block(uint8_t *dst, const uint8_t *src,
}
}
}
}
static
int
mjpeg_decode_scan
(
MJpegDecodeContext
*
s
,
int
nb_components
,
int
Ah
,
int
Al
,
static
int
mjpeg_decode_scan
(
MJpegDecodeContext
*
s
,
int
nb_components
,
int
Ah
,
const
uint8_t
*
mb_bitmask
,
const
AVFrame
*
reference
){
int
Al
,
const
uint8_t
*
mb_bitmask
,
const
AVFrame
*
reference
)
{
int
i
,
mb_x
,
mb_y
;
int
i
,
mb_x
,
mb_y
;
uint8_t
*
data
[
MAX_COMPONENTS
];
uint8_t
*
data
[
MAX_COMPONENTS
];
const
uint8_t
*
reference_data
[
MAX_COMPONENTS
];
const
uint8_t
*
reference_data
[
MAX_COMPONENTS
];
int
linesize
[
MAX_COMPONENTS
];
int
linesize
[
MAX_COMPONENTS
];
GetBitContext
mb_bitmask_gb
;
GetBitContext
mb_bitmask_gb
;
if
(
mb_bitmask
)
{
if
(
mb_bitmask
)
init_get_bits
(
&
mb_bitmask_gb
,
mb_bitmask
,
s
->
mb_width
*
s
->
mb_height
);
init_get_bits
(
&
mb_bitmask_gb
,
mb_bitmask
,
s
->
mb_width
*
s
->
mb_height
);
}
if
(
s
->
flipped
&&
s
->
avctx
->
flags
&
CODEC_FLAG_EMU_EDGE
)
{
if
(
s
->
flipped
&&
s
->
avctx
->
flags
&
CODEC_FLAG_EMU_EDGE
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Can not flip image with CODEC_FLAG_EMU_EDGE set!
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Can not flip image with CODEC_FLAG_EMU_EDGE set!
\n
"
);
s
->
flipped
=
0
;
s
->
flipped
=
0
;
}
}
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
int
c
=
s
->
comp_index
[
i
];
int
c
=
s
->
comp_index
[
i
];
data
[
c
]
=
s
->
picture_ptr
->
data
[
c
];
data
[
c
]
=
s
->
picture_ptr
->
data
[
c
];
reference_data
[
c
]
=
reference
?
reference
->
data
[
c
]
:
NULL
;
reference_data
[
c
]
=
reference
?
reference
->
data
[
c
]
:
NULL
;
linesize
[
c
]
=
s
->
linesize
[
c
];
linesize
[
c
]
=
s
->
linesize
[
c
];
s
->
coefs_finished
[
c
]
|=
1
;
s
->
coefs_finished
[
c
]
|=
1
;
if
(
s
->
flipped
)
{
if
(
s
->
flipped
)
{
//picture should be flipped upside-down for this codec
// picture should be flipped upside-down for this codec
int
offset
=
(
linesize
[
c
]
*
(
s
->
v_scount
[
i
]
*
(
8
*
s
->
mb_height
-
((
s
->
height
/
s
->
v_max
)
&
7
))
-
1
));
int
offset
=
(
linesize
[
c
]
*
(
s
->
v_scount
[
i
]
*
(
8
*
s
->
mb_height
-
((
s
->
height
/
s
->
v_max
)
&
7
))
-
1
));
data
[
c
]
+=
offset
;
data
[
c
]
+=
offset
;
reference_data
[
c
]
+=
offset
;
reference_data
[
c
]
+=
offset
;
linesize
[
c
]
*=
-
1
;
linesize
[
c
]
*=
-
1
;
}
}
}
}
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
const
int
copy_mb
=
mb_bitmask
&&
!
get_bits1
(
&
mb_bitmask_gb
);
const
int
copy_mb
=
mb_bitmask
&&
!
get_bits1
(
&
mb_bitmask_gb
);
if
(
s
->
restart_interval
&&
!
s
->
restart_count
)
if
(
s
->
restart_interval
&&
!
s
->
restart_count
)
s
->
restart_count
=
s
->
restart_interval
;
s
->
restart_count
=
s
->
restart_interval
;
if
(
get_bits_count
(
&
s
->
gb
)
>
s
->
gb
.
size_in_bits
){
if
(
get_bits_count
(
&
s
->
gb
)
>
s
->
gb
.
size_in_bits
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"overread %d
\n
"
,
get_bits_count
(
&
s
->
gb
)
-
s
->
gb
.
size_in_bits
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"overread %d
\n
"
,
get_bits_count
(
&
s
->
gb
)
-
s
->
gb
.
size_in_bits
);
return
-
1
;
return
-
1
;
}
}
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
{
uint8_t
*
ptr
;
uint8_t
*
ptr
;
int
n
,
h
,
v
,
x
,
y
,
c
,
j
;
int
n
,
h
,
v
,
x
,
y
,
c
,
j
;
int
block_offset
;
int
block_offset
;
...
@@ -842,38 +873,48 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, i
...
@@ -842,38 +873,48 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, i
v
=
s
->
v_scount
[
i
];
v
=
s
->
v_scount
[
i
];
x
=
0
;
x
=
0
;
y
=
0
;
y
=
0
;
for
(
j
=
0
;
j
<
n
;
j
++
)
{
for
(
j
=
0
;
j
<
n
;
j
++
)
{
block_offset
=
(((
linesize
[
c
]
*
(
v
*
mb_y
+
y
)
*
8
)
+
block_offset
=
(((
linesize
[
c
]
*
(
v
*
mb_y
+
y
)
*
8
)
+
(
h
*
mb_x
+
x
)
*
8
)
>>
s
->
avctx
->
lowres
);
(
h
*
mb_x
+
x
)
*
8
)
>>
s
->
avctx
->
lowres
);
if
(
s
->
interlaced
&&
s
->
bottom_field
)
if
(
s
->
interlaced
&&
s
->
bottom_field
)
block_offset
+=
linesize
[
c
]
>>
1
;
block_offset
+=
linesize
[
c
]
>>
1
;
ptr
=
data
[
c
]
+
block_offset
;
ptr
=
data
[
c
]
+
block_offset
;
if
(
!
s
->
progressive
)
{
if
(
!
s
->
progressive
)
{
if
(
copy_mb
)
{
if
(
copy_mb
)
mjpeg_copy_block
(
ptr
,
reference_data
[
c
]
+
block_offset
,
linesize
[
c
],
s
->
avctx
->
lowres
);
mjpeg_copy_block
(
ptr
,
reference_data
[
c
]
+
block_offset
,
}
else
{
linesize
[
c
],
s
->
avctx
->
lowres
);
else
{
s
->
dsp
.
clear_block
(
s
->
block
);
s
->
dsp
.
clear_block
(
s
->
block
);
if
(
decode_block
(
s
,
s
->
block
,
i
,
if
(
decode_block
(
s
,
s
->
block
,
i
,
s
->
dc_index
[
i
],
s
->
ac_index
[
i
],
s
->
dc_index
[
i
],
s
->
ac_index
[
i
],
s
->
quant_matrixes
[
s
->
quant_index
[
c
]
])
<
0
)
{
s
->
quant_matrixes
[
s
->
quant_index
[
c
]])
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
return
-
1
;
return
-
1
;
}
}
s
->
dsp
.
idct_put
(
ptr
,
linesize
[
c
],
s
->
block
);
s
->
dsp
.
idct_put
(
ptr
,
linesize
[
c
],
s
->
block
);
}
}
}
else
{
}
else
{
int
block_idx
=
s
->
block_stride
[
c
]
*
(
v
*
mb_y
+
y
)
+
(
h
*
mb_x
+
x
);
int
block_idx
=
s
->
block_stride
[
c
]
*
(
v
*
mb_y
+
y
)
+
(
h
*
mb_x
+
x
);
DCTELEM
*
block
=
s
->
blocks
[
c
][
block_idx
];
DCTELEM
*
block
=
s
->
blocks
[
c
][
block_idx
];
if
(
Ah
)
if
(
Ah
)
block
[
0
]
+=
get_bits1
(
&
s
->
gb
)
*
s
->
quant_matrixes
[
s
->
quant_index
[
c
]
][
0
]
<<
Al
;
block
[
0
]
+=
get_bits1
(
&
s
->
gb
)
*
else
if
(
decode_dc_progressive
(
s
,
block
,
i
,
s
->
dc_index
[
i
],
s
->
quant_matrixes
[
s
->
quant_index
[
c
]
],
Al
)
<
0
)
{
s
->
quant_matrixes
[
s
->
quant_index
[
c
]][
0
]
<<
Al
;
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
else
if
(
decode_dc_progressive
(
s
,
block
,
i
,
s
->
dc_index
[
i
],
s
->
quant_matrixes
[
s
->
quant_index
[
c
]],
Al
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
return
-
1
;
return
-
1
;
}
}
}
}
// av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n", mb_y, mb_x);
// av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n",
//av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d %d %d %d %d \n", mb_x, mb_y, x, y, c, s->bottom_field, (v * mb_y + y) * 8, (h * mb_x + x) * 8);
// mb_y, mb_x);
// av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d %d %d %d %d \n",
// mb_x, mb_y, x, y, c, s->bottom_field,
// (v * mb_y + y) * 8, (h * mb_x + x) * 8);
if
(
++
x
==
h
)
{
if
(
++
x
==
h
)
{
x
=
0
;
x
=
0
;
y
++
;
y
++
;
...
@@ -893,69 +934,72 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, i
...
@@ -893,69 +934,72 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, i
if
((
get_bits
(
&
s
->
gb
,
8
)
&
0xF8
)
==
0xD0
)
{
if
((
get_bits
(
&
s
->
gb
,
8
)
&
0xF8
)
==
0xD0
)
{
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
/* reset dc */
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
/* reset dc */
s
->
last_dc
[
i
]
=
1024
;
s
->
last_dc
[
i
]
=
1024
;
}
else
{
}
else
skip_bits_long
(
&
s
->
gb
,
pos
-
get_bits_count
(
&
s
->
gb
));
skip_bits_long
(
&
s
->
gb
,
pos
-
get_bits_count
(
&
s
->
gb
));
}
}
}
}
}
}
}
}
}
return
0
;
return
0
;
}
}
static
int
mjpeg_decode_scan_progressive_ac
(
MJpegDecodeContext
*
s
,
int
ss
,
int
se
,
int
Ah
,
int
Al
,
static
int
mjpeg_decode_scan_progressive_ac
(
MJpegDecodeContext
*
s
,
int
ss
,
const
uint8_t
*
mb_bitmask
,
const
AVFrame
*
reference
){
int
se
,
int
Ah
,
int
Al
,
const
uint8_t
*
mb_bitmask
,
const
AVFrame
*
reference
)
{
int
mb_x
,
mb_y
;
int
mb_x
,
mb_y
;
int
EOBRUN
=
0
;
int
EOBRUN
=
0
;
int
c
=
s
->
comp_index
[
0
];
int
c
=
s
->
comp_index
[
0
];
uint8_t
*
data
=
s
->
picture_ptr
->
data
[
c
];
uint8_t
*
data
=
s
->
picture_ptr
->
data
[
c
];
const
uint8_t
*
reference_data
=
reference
?
reference
->
data
[
c
]
:
NULL
;
const
uint8_t
*
reference_data
=
reference
?
reference
->
data
[
c
]
:
NULL
;
int
linesize
=
s
->
linesize
[
c
];
int
linesize
=
s
->
linesize
[
c
];
int
last_scan
=
0
;
int
last_scan
=
0
;
int16_t
*
quant_matrix
=
s
->
quant_matrixes
[
s
->
quant_index
[
c
]
];
int16_t
*
quant_matrix
=
s
->
quant_matrixes
[
s
->
quant_index
[
c
]
];
GetBitContext
mb_bitmask_gb
;
GetBitContext
mb_bitmask_gb
;
if
(
mb_bitmask
)
{
if
(
mb_bitmask
)
init_get_bits
(
&
mb_bitmask_gb
,
mb_bitmask
,
s
->
mb_width
*
s
->
mb_height
);
init_get_bits
(
&
mb_bitmask_gb
,
mb_bitmask
,
s
->
mb_width
*
s
->
mb_height
);
}
if
(
!
Al
)
{
if
(
!
Al
)
{
s
->
coefs_finished
[
c
]
|=
(
1LL
<<
(
se
+
1
))
-
(
1LL
<<
ss
);
s
->
coefs_finished
[
c
]
|=
(
1LL
<<
(
se
+
1
))
-
(
1LL
<<
ss
);
last_scan
=
!~
s
->
coefs_finished
[
c
];
last_scan
=
!~
s
->
coefs_finished
[
c
];
}
}
if
(
s
->
interlaced
&&
s
->
bottom_field
)
{
if
(
s
->
interlaced
&&
s
->
bottom_field
)
{
int
offset
=
linesize
>>
1
;
int
offset
=
linesize
>>
1
;
data
+=
offset
;
data
+=
offset
;
reference_data
+=
offset
;
reference_data
+=
offset
;
}
}
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
int
block_offset
=
(
mb_y
*
linesize
*
8
>>
s
->
avctx
->
lowres
);
int
block_offset
=
(
mb_y
*
linesize
*
8
>>
s
->
avctx
->
lowres
);
uint8_t
*
ptr
=
data
+
block_offset
;
uint8_t
*
ptr
=
data
+
block_offset
;
int
block_idx
=
mb_y
*
s
->
block_stride
[
c
];
int
block_idx
=
mb_y
*
s
->
block_stride
[
c
];
DCTELEM
(
*
block
)[
64
]
=
&
s
->
blocks
[
c
][
block_idx
];
DCTELEM
(
*
block
)[
64
]
=
&
s
->
blocks
[
c
][
block_idx
];
uint8_t
*
last_nnz
=
&
s
->
last_nnz
[
c
][
block_idx
];
uint8_t
*
last_nnz
=
&
s
->
last_nnz
[
c
][
block_idx
];
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
,
block
++
,
last_nnz
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
,
block
++
,
last_nnz
++
)
{
const
int
copy_mb
=
mb_bitmask
&&
!
get_bits1
(
&
mb_bitmask_gb
);
const
int
copy_mb
=
mb_bitmask
&&
!
get_bits1
(
&
mb_bitmask_gb
);
if
(
!
copy_mb
)
{
if
(
!
copy_mb
)
{
int
ret
;
int
ret
;
if
(
Ah
)
if
(
Ah
)
ret
=
decode_block_refinement
(
s
,
*
block
,
last_nnz
,
s
->
ac_index
[
0
],
ret
=
decode_block_refinement
(
s
,
*
block
,
last_nnz
,
s
->
ac_index
[
0
],
quant_matrix
,
ss
,
se
,
Al
,
&
EOBRUN
);
quant_matrix
,
ss
,
se
,
Al
,
&
EOBRUN
);
else
else
ret
=
decode_block_progressive
(
s
,
*
block
,
last_nnz
,
s
->
ac_index
[
0
],
ret
=
decode_block_progressive
(
s
,
*
block
,
last_nnz
,
s
->
ac_index
[
0
],
quant_matrix
,
ss
,
se
,
Al
,
&
EOBRUN
);
quant_matrix
,
ss
,
se
,
Al
,
&
EOBRUN
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error y=%d x=%d
\n
"
,
mb_y
,
mb_x
);
return
-
1
;
return
-
1
;
}
}
}
}
if
(
last_scan
)
{
if
(
last_scan
)
{
if
(
copy_mb
)
{
if
(
copy_mb
)
{
mjpeg_copy_block
(
ptr
,
reference_data
+
block_offset
,
linesize
,
s
->
avctx
->
lowres
);
mjpeg_copy_block
(
ptr
,
reference_data
+
block_offset
,
linesize
,
s
->
avctx
->
lowres
);
}
else
{
}
else
{
s
->
dsp
.
idct_put
(
ptr
,
linesize
,
*
block
);
s
->
dsp
.
idct_put
(
ptr
,
linesize
,
*
block
);
ptr
+=
8
>>
s
->
avctx
->
lowres
;
ptr
+=
8
>>
s
->
avctx
->
lowres
;
...
@@ -966,36 +1010,36 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss, int s
...
@@ -966,36 +1010,36 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss, int s
return
0
;
return
0
;
}
}
int
ff_mjpeg_decode_sos
(
MJpegDecodeContext
*
s
,
int
ff_mjpeg_decode_sos
(
MJpegDecodeContext
*
s
,
const
uint8_t
*
mb_bitmask
,
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
;
const
int
block_size
=
s
->
lossless
?
1
:
8
;
const
int
block_size
=
s
->
lossless
?
1
:
8
;
int
ilv
,
prev_shift
;
int
ilv
,
prev_shift
;
/* XXX: verify len field validity */
/* XXX: verify len field validity */
len
=
get_bits
(
&
s
->
gb
,
16
);
len
=
get_bits
(
&
s
->
gb
,
16
);
nb_components
=
get_bits
(
&
s
->
gb
,
8
);
nb_components
=
get_bits
(
&
s
->
gb
,
8
);
if
(
nb_components
==
0
||
nb_components
>
MAX_COMPONENTS
){
if
(
nb_components
==
0
||
nb_components
>
MAX_COMPONENTS
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: nb_components (%d) unsupported
\n
"
,
nb_components
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"decode_sos: nb_components (%d) unsupported
\n
"
,
nb_components
);
return
-
1
;
return
-
1
;
}
}
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
-
1
;
}
}
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
;
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"component: %d
\n
"
,
id
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"component: %d
\n
"
,
id
);
/* find component index */
/* find component index */
for
(
index
=
0
;
index
<
s
->
nb_components
;
index
++
)
for
(
index
=
0
;
index
<
s
->
nb_components
;
index
++
)
if
(
id
==
s
->
component_id
[
index
])
if
(
id
==
s
->
component_id
[
index
])
break
;
break
;
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
-
1
;
}
}
/* Metasoft MJPEG codec has Cb and Cr swapped */
/* Metasoft MJPEG codec has Cb and Cr swapped */
...
@@ -1015,23 +1059,24 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s,
...
@@ -1015,23 +1059,24 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s,
if
(
s
->
dc_index
[
i
]
<
0
||
s
->
ac_index
[
i
]
<
0
||
if
(
s
->
dc_index
[
i
]
<
0
||
s
->
ac_index
[
i
]
<
0
||
s
->
dc_index
[
i
]
>=
4
||
s
->
ac_index
[
i
]
>=
4
)
s
->
dc_index
[
i
]
>=
4
||
s
->
ac_index
[
i
]
>=
4
)
goto
out_of_range
;
goto
out_of_range
;
if
(
!
s
->
vlcs
[
0
][
s
->
dc_index
[
i
]].
table
||
!
s
->
vlcs
[
1
][
s
->
ac_index
[
i
]].
table
)
if
(
!
s
->
vlcs
[
0
][
s
->
dc_index
[
i
]].
table
||
!
s
->
vlcs
[
1
][
s
->
ac_index
[
i
]].
table
)
goto
out_of_range
;
goto
out_of_range
;
}
}
predictor
=
get_bits
(
&
s
->
gb
,
8
);
/* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
predictor
=
get_bits
(
&
s
->
gb
,
8
);
/* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
ilv
=
get_bits
(
&
s
->
gb
,
8
);
/* JPEG Se / JPEG-LS ILV */
ilv
=
get_bits
(
&
s
->
gb
,
8
);
/* JPEG Se / JPEG-LS ILV */
prev_shift
=
get_bits
(
&
s
->
gb
,
4
);
/* Ah */
prev_shift
=
get_bits
(
&
s
->
gb
,
4
);
/* Ah */
point_transform
=
get_bits
(
&
s
->
gb
,
4
);
/* Al */
point_transform
=
get_bits
(
&
s
->
gb
,
4
);
/* Al */
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
for
(
i
=
0
;
i
<
nb_components
;
i
++
)
s
->
last_dc
[
i
]
=
1024
;
s
->
last_dc
[
i
]
=
1024
;
if
(
nb_components
>
1
)
{
if
(
nb_components
>
1
)
{
/* interleaved stream */
/* interleaved stream */
s
->
mb_width
=
(
s
->
width
+
s
->
h_max
*
block_size
-
1
)
/
(
s
->
h_max
*
block_size
);
s
->
mb_width
=
(
s
->
width
+
s
->
h_max
*
block_size
-
1
)
/
(
s
->
h_max
*
block_size
);
s
->
mb_height
=
(
s
->
height
+
s
->
v_max
*
block_size
-
1
)
/
(
s
->
v_max
*
block_size
);
s
->
mb_height
=
(
s
->
height
+
s
->
v_max
*
block_size
-
1
)
/
(
s
->
v_max
*
block_size
);
}
else
if
(
!
s
->
ls
)
{
/* skip this for JPEG-LS */
}
else
if
(
!
s
->
ls
)
{
/* skip this for JPEG-LS */
h
=
s
->
h_max
/
s
->
h_scount
[
0
];
h
=
s
->
h_max
/
s
->
h_scount
[
0
];
v
=
s
->
v_max
/
s
->
v_scount
[
0
];
v
=
s
->
v_max
/
s
->
v_scount
[
0
];
s
->
mb_width
=
(
s
->
width
+
h
*
block_size
-
1
)
/
(
h
*
block_size
);
s
->
mb_width
=
(
s
->
width
+
h
*
block_size
-
1
)
/
(
h
*
block_size
);
...
@@ -1041,8 +1086,9 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s,
...
@@ -1041,8 +1086,9 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s,
s
->
v_scount
[
0
]
=
1
;
s
->
v_scount
[
0
]
=
1
;
}
}
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"%s %s p:%d >>:%d ilv:%d bits:%d %s
\n
"
,
s
->
lossless
?
"lossless"
:
"sequential DCT"
,
s
->
rgb
?
"RGB"
:
""
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"%s %s p:%d >>:%d ilv:%d bits:%d %s
\n
"
,
s
->
lossless
?
"lossless"
:
"sequential DCT"
,
s
->
rgb
?
"RGB"
:
""
,
predictor
,
point_transform
,
ilv
,
s
->
bits
,
predictor
,
point_transform
,
ilv
,
s
->
bits
,
s
->
pegasus_rct
?
"PRCT"
:
(
s
->
rct
?
"RCT"
:
""
));
s
->
pegasus_rct
?
"PRCT"
:
(
s
->
rct
?
"RCT"
:
""
));
...
@@ -1051,29 +1097,30 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s,
...
@@ -1051,29 +1097,30 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s,
for
(
i
=
s
->
mjpb_skiptosod
;
i
>
0
;
i
--
)
for
(
i
=
s
->
mjpb_skiptosod
;
i
>
0
;
i
--
)
skip_bits
(
&
s
->
gb
,
8
);
skip_bits
(
&
s
->
gb
,
8
);
if
(
s
->
lossless
)
{
if
(
s
->
lossless
)
{
if
(
CONFIG_JPEGLS_DECODER
&&
s
->
ls
)
{
if
(
CONFIG_JPEGLS_DECODER
&&
s
->
ls
)
{
// 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
(
ff_jpegls_decode_picture
(
s
,
predictor
,
point_transform
,
ilv
)
<
0
)
return
-
1
;
return
-
1
;
}
else
{
}
else
{
if
(
s
->
rgb
)
{
if
(
s
->
rgb
)
{
if
(
ljpeg_decode_rgb_scan
(
s
,
predictor
,
point_transform
)
<
0
)
if
(
ljpeg_decode_rgb_scan
(
s
,
predictor
,
point_transform
)
<
0
)
return
-
1
;
return
-
1
;
}
else
{
}
else
{
if
(
ljpeg_decode_yuv_scan
(
s
,
predictor
,
point_transform
)
<
0
)
if
(
ljpeg_decode_yuv_scan
(
s
,
predictor
,
point_transform
)
<
0
)
return
-
1
;
return
-
1
;
}
}
}
}
}
else
{
}
else
{
if
(
s
->
progressive
&&
predictor
)
{
if
(
s
->
progressive
&&
predictor
)
{
if
(
mjpeg_decode_scan_progressive_ac
(
s
,
predictor
,
ilv
,
prev_shift
,
point_transform
,
if
(
mjpeg_decode_scan_progressive_ac
(
s
,
predictor
,
ilv
,
prev_shift
,
point_transform
,
mb_bitmask
,
reference
)
<
0
)
mb_bitmask
,
reference
)
<
0
)
return
-
1
;
return
-
1
;
}
else
{
}
else
{
if
(
mjpeg_decode_scan
(
s
,
nb_components
,
prev_shift
,
point_transform
,
if
(
mjpeg_decode_scan
(
s
,
nb_components
,
prev_shift
,
point_transform
,
mb_bitmask
,
reference
)
<
0
)
mb_bitmask
,
reference
)
<
0
)
return
-
1
;
return
-
1
;
}
}
...
@@ -1091,7 +1138,8 @@ static int mjpeg_decode_dri(MJpegDecodeContext *s)
...
@@ -1091,7 +1138,8 @@ static int mjpeg_decode_dri(MJpegDecodeContext *s)
return
-
1
;
return
-
1
;
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
"
,
s
->
restart_interval
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"restart interval: %d
\n
"
,
s
->
restart_interval
);
return
0
;
return
0
;
}
}
...
@@ -1103,22 +1151,20 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1103,22 +1151,20 @@ 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
-
1
;
if
(
8
*
len
+
get_bits_count
(
&
s
->
gb
)
>
s
->
gb
.
size_in_bits
)
if
(
8
*
len
+
get_bits_count
(
&
s
->
gb
)
>
s
->
gb
.
size_in_bits
)
return
-
1
;
return
-
1
;
id
=
get_bits_long
(
&
s
->
gb
,
32
);
id
=
get_bits_long
(
&
s
->
gb
,
32
);
id
=
av_be2ne32
(
id
);
id
=
av_be2ne32
(
id
);
len
-=
6
;
len
-=
6
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_STARTCODE
){
if
(
s
->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"APPx %8X
\n
"
,
id
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"APPx %8X
\n
"
,
id
);
}
/* Buggy AVID, it puts EOI only at every 10th frame. */
/* Buggy AVID, it puts EOI only at every 10th frame. */
/* Also, this fourcc is used by non-avid files too, it holds some
/* Also, this fourcc is used by non-avid files too, it holds some
information, but it's always present in AVID-created files. */
information, but it's always present in AVID-created files. */
if
(
id
==
AV_RL32
(
"AVI1"
))
if
(
id
==
AV_RL32
(
"AVI1"
))
{
{
/* structure:
/* structure:
4bytes AVI1
4bytes AVI1
1bytes polarity
1bytes polarity
...
@@ -1130,8 +1176,10 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1130,8 +1176,10 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
// if (s->first_picture)
// if (s->first_picture)
// printf("mjpeg: workarounding buggy AVID\n");
// printf("mjpeg: workarounding buggy AVID\n");
i
=
get_bits
(
&
s
->
gb
,
8
);
i
=
get_bits
(
&
s
->
gb
,
8
);
if
(
i
==
2
)
s
->
bottom_field
=
1
;
if
(
i
==
2
)
else
if
(
i
==
1
)
s
->
bottom_field
=
0
;
s
->
bottom_field
=
1
;
else
if
(
i
==
1
)
s
->
bottom_field
=
0
;
#if 0
#if 0
skip_bits(&s->gb, 8);
skip_bits(&s->gb, 8);
skip_bits(&s->gb, 32);
skip_bits(&s->gb, 32);
...
@@ -1145,38 +1193,35 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1145,38 +1193,35 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
// len -= 2;
// len -= 2;
if
(
id
==
AV_RL32
(
"JFIF"
))
if
(
id
==
AV_RL32
(
"JFIF"
))
{
{
int
t_w
,
t_h
,
v1
,
v2
;
int
t_w
,
t_h
,
v1
,
v2
;
skip_bits
(
&
s
->
gb
,
8
);
/* the trailing zero-byte */
skip_bits
(
&
s
->
gb
,
8
);
/* the trailing zero-byte */
v1
=
get_bits
(
&
s
->
gb
,
8
);
v1
=
get_bits
(
&
s
->
gb
,
8
);
v2
=
get_bits
(
&
s
->
gb
,
8
);
v2
=
get_bits
(
&
s
->
gb
,
8
);
skip_bits
(
&
s
->
gb
,
8
);
skip_bits
(
&
s
->
gb
,
8
);
s
->
avctx
->
sample_aspect_ratio
.
num
=
get_bits
(
&
s
->
gb
,
16
);
s
->
avctx
->
sample_aspect_ratio
.
num
=
get_bits
(
&
s
->
gb
,
16
);
s
->
avctx
->
sample_aspect_ratio
.
den
=
get_bits
(
&
s
->
gb
,
16
);
s
->
avctx
->
sample_aspect_ratio
.
den
=
get_bits
(
&
s
->
gb
,
16
);
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d
\n
"
,
v1
,
v2
,
v1
,
v2
,
s
->
avctx
->
sample_aspect_ratio
.
num
,
s
->
avctx
->
sample_aspect_ratio
.
num
,
s
->
avctx
->
sample_aspect_ratio
.
den
s
->
avctx
->
sample_aspect_ratio
.
den
);
);
t_w
=
get_bits
(
&
s
->
gb
,
8
);
t_w
=
get_bits
(
&
s
->
gb
,
8
);
t_h
=
get_bits
(
&
s
->
gb
,
8
);
t_h
=
get_bits
(
&
s
->
gb
,
8
);
if
(
t_w
&&
t_h
)
if
(
t_w
&&
t_h
)
{
{
/* skip thumbnail */
/* skip thumbnail */
if
(
len
-
10
-
(
t_w
*
t_h
*
3
)
>
0
)
if
(
len
-
10
-
(
t_w
*
t_h
*
3
)
>
0
)
len
-=
t_w
*
t_h
*
3
;
len
-=
t_w
*
t_h
*
3
;
}
}
len
-=
10
;
len
-=
10
;
goto
out
;
goto
out
;
}
}
if
(
id
==
AV_RL32
(
"Adob"
)
&&
(
get_bits
(
&
s
->
gb
,
8
)
==
'e'
))
if
(
id
==
AV_RL32
(
"Adob"
)
&&
(
get_bits
(
&
s
->
gb
,
8
)
==
'e'
))
{
{
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"mjpeg: Adobe header found
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"mjpeg: Adobe header found
\n
"
);
skip_bits
(
&
s
->
gb
,
16
);
/* version */
skip_bits
(
&
s
->
gb
,
16
);
/* version */
...
@@ -1187,21 +1232,22 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1187,21 +1232,22 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
goto
out
;
goto
out
;
}
}
if
(
id
==
AV_RL32
(
"LJIF"
)){
if
(
id
==
AV_RL32
(
"LJIF"
))
{
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"Pegasus lossless jpeg header found
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"Pegasus lossless jpeg header found
\n
"
);
skip_bits
(
&
s
->
gb
,
16
);
/* version ? */
skip_bits
(
&
s
->
gb
,
16
);
/* version ? */
skip_bits
(
&
s
->
gb
,
16
);
/* unknwon always 0? */
skip_bits
(
&
s
->
gb
,
16
);
/* unknwon always 0? */
skip_bits
(
&
s
->
gb
,
16
);
/* unknwon always 0? */
skip_bits
(
&
s
->
gb
,
16
);
/* unknwon always 0? */
skip_bits
(
&
s
->
gb
,
16
);
/* unknwon always 0? */
skip_bits
(
&
s
->
gb
,
16
);
/* unknwon always 0? */
switch
(
get_bits
(
&
s
->
gb
,
8
))
{
switch
(
get_bits
(
&
s
->
gb
,
8
))
{
case
1
:
case
1
:
s
->
rgb
=
1
;
s
->
rgb
=
1
;
s
->
pegasus_rct
=
0
;
s
->
pegasus_rct
=
0
;
break
;
break
;
case
2
:
case
2
:
s
->
rgb
=
1
;
s
->
rgb
=
1
;
s
->
pegasus_rct
=
1
;
s
->
pegasus_rct
=
1
;
break
;
break
;
default:
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"unknown colorspace
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"unknown colorspace
\n
"
);
...
@@ -1211,13 +1257,12 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1211,13 +1257,12 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
}
}
/* Apple MJPEG-A */
/* Apple MJPEG-A */
if
((
s
->
start_code
==
APP1
)
&&
(
len
>
(
0x28
-
8
)))
if
((
s
->
start_code
==
APP1
)
&&
(
len
>
(
0x28
-
8
)))
{
{
id
=
get_bits_long
(
&
s
->
gb
,
32
);
id
=
get_bits_long
(
&
s
->
gb
,
32
);
id
=
av_be2ne32
(
id
);
id
=
av_be2ne32
(
id
);
len
-=
4
;
len
-=
4
;
if
(
id
==
AV_RL32
(
"mjpg"
))
/* Apple MJPEG-A */
/* Apple MJPEG-A */
{
if
(
id
==
AV_RL32
(
"mjpg"
))
{
#if 0
#if 0
skip_bits(&s->gb, 32); /* field size */
skip_bits(&s->gb, 32); /* field size */
skip_bits(&s->gb, 32); /* pad field size */
skip_bits(&s->gb, 32); /* pad field size */
...
@@ -1236,8 +1281,9 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
...
@@ -1236,8 +1281,9 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
out:
out:
/* slow but needed for extreme adobe jpegs */
/* slow but needed for extreme adobe jpegs */
if
(
len
<
0
)
if
(
len
<
0
)
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"mjpeg: error, decode_app parser read over the end
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
while
(
--
len
>
0
)
"mjpeg: error, decode_app parser read over the end
\n
"
);
while
(
--
len
>
0
)
skip_bits
(
&
s
->
gb
,
8
);
skip_bits
(
&
s
->
gb
,
8
);
return
0
;
return
0
;
...
@@ -1246,34 +1292,31 @@ out:
...
@@ -1246,34 +1292,31 @@ out:
static
int
mjpeg_decode_com
(
MJpegDecodeContext
*
s
)
static
int
mjpeg_decode_com
(
MJpegDecodeContext
*
s
)
{
{
int
len
=
get_bits
(
&
s
->
gb
,
16
);
int
len
=
get_bits
(
&
s
->
gb
,
16
);
if
(
len
>=
2
&&
8
*
len
-
16
+
get_bits_count
(
&
s
->
gb
)
<=
s
->
gb
.
size_in_bits
)
{
if
(
len
>=
2
&&
8
*
len
-
16
+
get_bits_count
(
&
s
->
gb
)
<=
s
->
gb
.
size_in_bits
)
{
char
*
cbuf
=
av_malloc
(
len
-
1
);
char
*
cbuf
=
av_malloc
(
len
-
1
);
if
(
cbuf
)
{
if
(
cbuf
)
{
int
i
;
int
i
;
for
(
i
=
0
;
i
<
len
-
2
;
i
++
)
for
(
i
=
0
;
i
<
len
-
2
;
i
++
)
cbuf
[
i
]
=
get_bits
(
&
s
->
gb
,
8
);
cbuf
[
i
]
=
get_bits
(
&
s
->
gb
,
8
);
if
(
i
>
0
&&
cbuf
[
i
-
1
]
==
'\n'
)
if
(
i
>
0
&&
cbuf
[
i
-
1
]
==
'\n'
)
cbuf
[
i
-
1
]
=
0
;
cbuf
[
i
-
1
]
=
0
;
else
else
cbuf
[
i
]
=
0
;
cbuf
[
i
]
=
0
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"mjpeg comment: '%s'
\n
"
,
cbuf
);
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
"mjpeg comment: '%s'
\n
"
,
cbuf
);
/* buggy avid, it puts EOI only at every 10th frame */
/* buggy avid, it puts EOI only at every 10th frame */
if
(
!
strcmp
(
cbuf
,
"AVID"
))
if
(
!
strcmp
(
cbuf
,
"AVID"
))
{
{
s
->
buggy_avid
=
1
;
s
->
buggy_avid
=
1
;
// if (s->first_picture)
// if (s->first_picture)
// printf("mjpeg: workarounding buggy AVID\n");
// printf("mjpeg: workarounding buggy AVID\n");
}
}
else
if
(
!
strcmp
(
cbuf
,
"CS=ITU601"
))
else
if
(
!
strcmp
(
cbuf
,
"CS=ITU601"
)){
s
->
cs_itu601
=
1
;
s
->
cs_itu601
=
1
;
else
if
((
len
>
20
&&
!
strncmp
(
cbuf
,
"Intel(R) JPEG Library"
,
21
))
||
}
(
len
>
19
&&
!
strncmp
(
cbuf
,
"Metasoft MJPEG Codec"
,
20
)))
else
if
((
len
>
20
&&
!
strncmp
(
cbuf
,
"Intel(R) JPEG Library"
,
21
))
||
(
len
>
19
&&
!
strncmp
(
cbuf
,
"Metasoft MJPEG Codec"
,
20
))){
s
->
flipped
=
1
;
s
->
flipped
=
1
;
}
av_free
(
cbuf
);
av_free
(
cbuf
);
}
}
...
@@ -1290,7 +1333,7 @@ static int find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
...
@@ -1290,7 +1333,7 @@ static int find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
unsigned
int
v
,
v2
;
unsigned
int
v
,
v2
;
int
val
;
int
val
;
#ifdef DEBUG
#ifdef DEBUG
int
skipped
=
0
;
int
skipped
=
0
;
#endif
#endif
buf_ptr
=
*
pbuf_ptr
;
buf_ptr
=
*
pbuf_ptr
;
...
@@ -1314,33 +1357,30 @@ found:
...
@@ -1314,33 +1357,30 @@ found:
int
ff_mjpeg_find_marker
(
MJpegDecodeContext
*
s
,
int
ff_mjpeg_find_marker
(
MJpegDecodeContext
*
s
,
const
uint8_t
**
buf_ptr
,
const
uint8_t
*
buf_end
,
const
uint8_t
**
buf_ptr
,
const
uint8_t
*
buf_end
,
const
uint8_t
**
unescaped_buf_ptr
,
int
*
unescaped_buf_size
)
const
uint8_t
**
unescaped_buf_ptr
,
int
*
unescaped_buf_size
)
{
{
int
start_code
;
int
start_code
;
start_code
=
find_marker
(
buf_ptr
,
buf_end
);
start_code
=
find_marker
(
buf_ptr
,
buf_end
);
if
((
buf_end
-
*
buf_ptr
)
>
s
->
buffer_size
)
if
((
buf_end
-
*
buf_ptr
)
>
s
->
buffer_size
)
{
{
av_free
(
s
->
buffer
);
av_free
(
s
->
buffer
);
s
->
buffer_size
=
buf_end
-
*
buf_ptr
;
s
->
buffer_size
=
buf_end
-
*
buf_ptr
;
s
->
buffer
=
av_malloc
(
s
->
buffer_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
s
->
buffer
=
av_malloc
(
s
->
buffer_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"buffer too small, expanding to %d bytes
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
s
->
buffer_size
);
"buffer too small, expanding to %d bytes
\n
"
,
s
->
buffer_size
);
}
}
/* unescape buffer of SOS, use special treatment for JPEG-LS */
/* unescape buffer of SOS, use special treatment for JPEG-LS */
if
(
start_code
==
SOS
&&
!
s
->
ls
)
if
(
start_code
==
SOS
&&
!
s
->
ls
)
{
{
const
uint8_t
*
src
=
*
buf_ptr
;
const
uint8_t
*
src
=
*
buf_ptr
;
uint8_t
*
dst
=
s
->
buffer
;
uint8_t
*
dst
=
s
->
buffer
;
while
(
src
<
buf_end
)
while
(
src
<
buf_end
)
{
{
uint8_t
x
=
*
(
src
++
);
uint8_t
x
=
*
(
src
++
);
*
(
dst
++
)
=
x
;
*
(
dst
++
)
=
x
;
if
(
s
->
avctx
->
codec_id
!=
CODEC_ID_THP
)
if
(
s
->
avctx
->
codec_id
!=
CODEC_ID_THP
)
{
{
if
(
x
==
0xff
)
{
if
(
x
==
0xff
)
{
while
(
src
<
buf_end
&&
x
==
0xff
)
while
(
src
<
buf_end
&&
x
==
0xff
)
x
=
*
(
src
++
);
x
=
*
(
src
++
);
...
@@ -1357,8 +1397,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
...
@@ -1357,8 +1397,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"escaping removed %td bytes
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"escaping removed %td bytes
\n
"
,
(
buf_end
-
*
buf_ptr
)
-
(
dst
-
s
->
buffer
));
(
buf_end
-
*
buf_ptr
)
-
(
dst
-
s
->
buffer
));
}
}
else
if
(
start_code
==
SOS
&&
s
->
ls
)
{
else
if
(
start_code
==
SOS
&&
s
->
ls
){
const
uint8_t
*
src
=
*
buf_ptr
;
const
uint8_t
*
src
=
*
buf_ptr
;
uint8_t
*
dst
=
s
->
buffer
;
uint8_t
*
dst
=
s
->
buffer
;
int
bit_count
=
0
;
int
bit_count
=
0
;
...
@@ -1368,10 +1407,10 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
...
@@ -1368,10 +1407,10 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
s
->
cur_scan
++
;
s
->
cur_scan
++
;
/* find marker */
/* find marker */
while
(
src
+
t
<
buf_end
)
{
while
(
src
+
t
<
buf_end
)
{
uint8_t
x
=
src
[
t
++
];
uint8_t
x
=
src
[
t
++
];
if
(
x
==
0xff
)
{
if
(
x
==
0xff
)
{
while
((
src
+
t
<
buf_end
)
&&
x
==
0xff
)
while
((
src
+
t
<
buf_end
)
&&
x
==
0xff
)
x
=
src
[
t
++
];
x
=
src
[
t
++
];
if
(
x
&
0x80
)
{
if
(
x
&
0x80
)
{
t
-=
2
;
t
-=
2
;
...
@@ -1380,14 +1419,13 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
...
@@ -1380,14 +1419,13 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
}
}
}
}
bit_count
=
t
*
8
;
bit_count
=
t
*
8
;
init_put_bits
(
&
pb
,
dst
,
t
);
init_put_bits
(
&
pb
,
dst
,
t
);
/* unescape bitstream */
/* unescape bitstream */
while
(
b
<
t
)
{
while
(
b
<
t
)
{
uint8_t
x
=
src
[
b
++
];
uint8_t
x
=
src
[
b
++
];
put_bits
(
&
pb
,
8
,
x
);
put_bits
(
&
pb
,
8
,
x
);
if
(
x
==
0xFF
)
{
if
(
x
==
0xFF
)
{
x
=
src
[
b
++
];
x
=
src
[
b
++
];
put_bits
(
&
pb
,
7
,
x
);
put_bits
(
&
pb
,
7
,
x
);
bit_count
--
;
bit_count
--
;
...
@@ -1397,9 +1435,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
...
@@ -1397,9 +1435,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
*
unescaped_buf_ptr
=
dst
;
*
unescaped_buf_ptr
=
dst
;
*
unescaped_buf_size
=
(
bit_count
+
7
)
>>
3
;
*
unescaped_buf_size
=
(
bit_count
+
7
)
>>
3
;
}
}
else
{
else
{
*
unescaped_buf_ptr
=
*
buf_ptr
;
*
unescaped_buf_ptr
=
*
buf_ptr
;
*
unescaped_buf_size
=
buf_end
-
*
buf_ptr
;
*
unescaped_buf_size
=
buf_end
-
*
buf_ptr
;
}
}
...
@@ -1407,8 +1443,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
...
@@ -1407,8 +1443,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s,
return
start_code
;
return
start_code
;
}
}
int
ff_mjpeg_decode_frame
(
AVCodecContext
*
avctx
,
int
ff_mjpeg_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
data_size
,
void
*
data
,
int
*
data_size
,
AVPacket
*
avpkt
)
AVPacket
*
avpkt
)
{
{
const
uint8_t
*
buf
=
avpkt
->
data
;
const
uint8_t
*
buf
=
avpkt
->
data
;
...
@@ -1426,36 +1461,35 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
...
@@ -1426,36 +1461,35 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
while
(
buf_ptr
<
buf_end
)
{
while
(
buf_ptr
<
buf_end
)
{
/* find start next marker */
/* find start next marker */
start_code
=
ff_mjpeg_find_marker
(
s
,
&
buf_ptr
,
buf_end
,
start_code
=
ff_mjpeg_find_marker
(
s
,
&
buf_ptr
,
buf_end
,
&
unescaped_buf_ptr
,
&
unescaped_buf_size
);
&
unescaped_buf_ptr
,
{
&
unescaped_buf_size
);
/* EOF */
/* EOF */
if
(
start_code
<
0
)
{
if
(
start_code
<
0
)
{
goto
the_end
;
goto
the_end
;
}
else
{
}
else
{
av_log
(
avctx
,
AV_LOG_DEBUG
,
"marker=%x avail_size_in_buf=%td
\n
"
,
start_code
,
buf_end
-
buf_ptr
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"marker=%x avail_size_in_buf=%td
\n
"
,
start_code
,
buf_end
-
buf_ptr
);
init_get_bits
(
&
s
->
gb
,
unescaped_buf_ptr
,
unescaped_buf_size
*
8
);
init_get_bits
(
&
s
->
gb
,
unescaped_buf_ptr
,
unescaped_buf_size
*
8
);
s
->
start_code
=
start_code
;
s
->
start_code
=
start_code
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_STARTCODE
){
if
(
s
->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
av_log
(
avctx
,
AV_LOG_DEBUG
,
"startcode: %X
\n
"
,
start_code
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"startcode: %X
\n
"
,
start_code
);
}
/* process markers */
/* process markers */
if
(
start_code
>=
0xd0
&&
start_code
<=
0xd7
)
{
if
(
start_code
>=
0xd0
&&
start_code
<=
0xd7
)
av_log
(
avctx
,
AV_LOG_DEBUG
,
"restart marker: %d
\n
"
,
start_code
&
0x0f
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"restart marker: %d
\n
"
,
start_code
&
0x0f
);
/* APP fields */
/* APP fields */
}
else
if
(
start_code
>=
APP0
&&
start_code
<=
APP15
)
{
else
if
(
start_code
>=
APP0
&&
start_code
<=
APP15
)
mjpeg_decode_app
(
s
);
mjpeg_decode_app
(
s
);
/* Comment */
/* Comment */
}
else
if
(
start_code
==
COM
){
else
if
(
start_code
==
COM
)
mjpeg_decode_com
(
s
);
mjpeg_decode_com
(
s
);
}
switch
(
start_code
)
{
switch
(
start_code
)
{
case
SOI
:
case
SOI
:
s
->
restart_interval
=
0
;
s
->
restart_interval
=
0
;
s
->
restart_count
=
0
;
s
->
restart_count
=
0
;
/* nothing to do on SOI */
/* nothing to do on SOI */
break
;
break
;
...
@@ -1463,37 +1497,37 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
...
@@ -1463,37 +1497,37 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
ff_mjpeg_decode_dqt
(
s
);
ff_mjpeg_decode_dqt
(
s
);
break
;
break
;
case
DHT
:
case
DHT
:
if
(
ff_mjpeg_decode_dht
(
s
)
<
0
)
{
if
(
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
-
1
;
}
}
break
;
break
;
case
SOF0
:
case
SOF0
:
case
SOF1
:
case
SOF1
:
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
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
return
-
1
;
return
-
1
;
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
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
return
-
1
;
return
-
1
;
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
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
return
-
1
;
return
-
1
;
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
(
ff_mjpeg_decode_sof
(
s
)
<
0
)
return
-
1
;
return
-
1
;
break
;
break
;
...
@@ -1507,7 +1541,8 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
...
@@ -1507,7 +1541,8 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
break
;
break
;
eoi_parser:
eoi_parser:
if
(
!
s
->
got_picture
)
{
if
(
!
s
->
got_picture
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Found EOI before any SOF, ignoring
\n
"
);
av_log
(
avctx
,
AV_LOG_WARNING
,
"Found EOI before any SOF, ignoring
\n
"
);
break
;
break
;
}
}
if
(
s
->
interlaced
)
{
if
(
s
->
interlaced
)
{
...
@@ -1519,20 +1554,25 @@ eoi_parser:
...
@@ -1519,20 +1554,25 @@ eoi_parser:
*
picture
=
*
s
->
picture_ptr
;
*
picture
=
*
s
->
picture_ptr
;
*
data_size
=
sizeof
(
AVFrame
);
*
data_size
=
sizeof
(
AVFrame
);
if
(
!
s
->
lossless
){
if
(
!
s
->
lossless
)
{
picture
->
quality
=
FFMAX3
(
s
->
qscale
[
0
],
s
->
qscale
[
1
],
s
->
qscale
[
2
]);
picture
->
quality
=
FFMAX3
(
s
->
qscale
[
0
],
picture
->
qstride
=
0
;
s
->
qscale
[
1
],
picture
->
qscale_table
=
s
->
qscale_table
;
s
->
qscale
[
2
]);
memset
(
picture
->
qscale_table
,
picture
->
quality
,
(
s
->
width
+
15
)
/
16
);
picture
->
qstride
=
0
;
if
(
avctx
->
debug
&
FF_DEBUG_QP
)
picture
->
qscale_table
=
s
->
qscale_table
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"QP: %d
\n
"
,
picture
->
quality
);
memset
(
picture
->
qscale_table
,
picture
->
quality
,
picture
->
quality
*=
FF_QP2LAMBDA
;
(
s
->
width
+
15
)
/
16
);
if
(
avctx
->
debug
&
FF_DEBUG_QP
)
av_log
(
avctx
,
AV_LOG_DEBUG
,
"QP: %d
\n
"
,
picture
->
quality
);
picture
->
quality
*=
FF_QP2LAMBDA
;
}
}
goto
the_end
;
goto
the_end
;
case
SOS
:
case
SOS
:
if
(
!
s
->
got_picture
)
{
if
(
!
s
->
got_picture
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Can not process SOS before SOF, skipping
\n
"
);
av_log
(
avctx
,
AV_LOG_WARNING
,
"Can not process SOS before SOF, skipping
\n
"
);
break
;
break
;
}
}
if
(
ff_mjpeg_decode_sos
(
s
,
NULL
,
NULL
)
<
0
&&
if
(
ff_mjpeg_decode_sos
(
s
,
NULL
,
NULL
)
<
0
&&
...
@@ -1556,7 +1596,8 @@ eoi_parser:
...
@@ -1556,7 +1596,8 @@ eoi_parser:
case
SOF14
:
case
SOF14
:
case
SOF15
:
case
SOF15
:
case
JPG
:
case
JPG
:
av_log
(
avctx
,
AV_LOG_ERROR
,
"mjpeg: unsupported coding type (%x)
\n
"
,
start_code
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"mjpeg: unsupported coding type (%x)
\n
"
,
start_code
);
break
;
break
;
// default:
// default:
// printf("mjpeg: unsupported marker (%x)\n", start_code);
// printf("mjpeg: unsupported marker (%x)\n", start_code);
...
@@ -1565,10 +1606,10 @@ eoi_parser:
...
@@ -1565,10 +1606,10 @@ eoi_parser:
not_the_end:
not_the_end:
/* eof process start code */
/* eof process start code */
buf_ptr
+=
(
get_bits_count
(
&
s
->
gb
)
+
7
)
/
8
;
buf_ptr
+=
(
get_bits_count
(
&
s
->
gb
)
+
7
)
/
8
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"marker parser used %d bytes (%d bits)
\n
"
,
av_log
(
avctx
,
AV_LOG_DEBUG
,
(
get_bits_count
(
&
s
->
gb
)
+
7
)
/
8
,
get_bits_count
(
&
s
->
gb
));
"marker parser used %d bytes (%d bits)
\n
"
,
}
(
get_bits_count
(
&
s
->
gb
)
+
7
)
/
8
,
get_bits_count
(
&
s
->
gb
));
}
}
}
}
if
(
s
->
got_picture
)
{
if
(
s
->
got_picture
)
{
...
@@ -1578,7 +1619,8 @@ not_the_end:
...
@@ -1578,7 +1619,8 @@ not_the_end:
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
-
1
;
the_end:
the_end:
av_log
(
avctx
,
AV_LOG_DEBUG
,
"mjpeg decode frame unused %td bytes
\n
"
,
buf_end
-
buf_ptr
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"mjpeg decode frame unused %td bytes
\n
"
,
buf_end
-
buf_ptr
);
// return buf_end - buf_ptr;
// return buf_end - buf_ptr;
return
buf_ptr
-
buf
;
return
buf_ptr
-
buf
;
}
}
...
@@ -1594,13 +1636,13 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
...
@@ -1594,13 +1636,13 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
av_free
(
s
->
buffer
);
av_free
(
s
->
buffer
);
av_free
(
s
->
qscale_table
);
av_free
(
s
->
qscale_table
);
av_freep
(
&
s
->
ljpeg_buffer
);
av_freep
(
&
s
->
ljpeg_buffer
);
s
->
ljpeg_buffer_size
=
0
;
s
->
ljpeg_buffer_size
=
0
;
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
for
(
j
=
0
;
j
<
4
;
j
++
)
free_vlc
(
&
s
->
vlcs
[
i
][
j
]);
free_vlc
(
&
s
->
vlcs
[
i
][
j
]);
}
}
for
(
i
=
0
;
i
<
MAX_COMPONENTS
;
i
++
)
{
for
(
i
=
0
;
i
<
MAX_COMPONENTS
;
i
++
)
{
av_freep
(
&
s
->
blocks
[
i
]);
av_freep
(
&
s
->
blocks
[
i
]);
av_freep
(
&
s
->
last_nnz
[
i
]);
av_freep
(
&
s
->
last_nnz
[
i
]);
}
}
...
@@ -1610,7 +1652,8 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
...
@@ -1610,7 +1652,8 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
#define OFFSET(x) offsetof(MJpegDecodeContext, x)
#define OFFSET(x) offsetof(MJpegDecodeContext, x)
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
static
const
AVOption
options
[]
=
{
static
const
AVOption
options
[]
=
{
{
"extern_huff"
,
"Use external huffman table."
,
OFFSET
(
extern_huff
),
AV_OPT_TYPE_INT
,
{
0
},
0
,
1
,
VD
},
{
"extern_huff"
,
"Use external huffman table."
,
OFFSET
(
extern_huff
),
AV_OPT_TYPE_INT
,
{
0
},
0
,
1
,
VD
},
{
NULL
},
{
NULL
},
};
};
...
...
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