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
16f7c1f2
Commit
16f7c1f2
authored
Apr 12, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: add LSCR decoder
Fixes #4711.
parent
3e102233
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
168 additions
and
1 deletion
+168
-1
Changelog
Changelog
+1
-0
configure
configure
+1
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
codec_desc.c
libavcodec/codec_desc.c
+7
-0
pngdec.c
libavcodec/pngdec.c
+154
-0
version.h
libavcodec/version.h
+1
-1
riff.c
libavformat/riff.c
+1
-0
No files found.
Changelog
View file @
16f7c1f2
...
...
@@ -23,6 +23,7 @@ version <next>:
- agm decoder
- KUX demuxer
- AV1 frame split bitstream filter
- lscr decoder
version 4.1:
...
...
configure
View file @
16f7c1f2
...
...
@@ -2712,6 +2712,7 @@ jpegls_decoder_select="mjpeg_decoder"
jv_decoder_select
=
"blockdsp"
lagarith_decoder_select
=
"llviddsp"
ljpeg_encoder_select
=
"idctdsp jpegtables mpegvideoenc"
lscr_decoder_deps
=
"zlib"
magicyuv_decoder_select
=
"llviddsp"
magicyuv_encoder_select
=
"llvidencdsp"
mdec_decoder_select
=
"blockdsp idctdsp mpegvideo"
...
...
libavcodec/Makefile
View file @
16f7c1f2
...
...
@@ -413,6 +413,7 @@ OBJS-$(CONFIG_KMVC_DECODER) += kmvc.o
OBJS-$(CONFIG_LAGARITH_DECODER)
+=
lagarith.o
lagarithrac.o
OBJS-$(CONFIG_LJPEG_ENCODER)
+=
ljpegenc.o
mjpegenc_common.o
OBJS-$(CONFIG_LOCO_DECODER)
+=
loco.o
OBJS-$(CONFIG_LSCR_DECODER)
+=
png.o
pngdec.o
pngdsp.o
OBJS-$(CONFIG_M101_DECODER)
+=
m101.o
OBJS-$(CONFIG_MACE3_DECODER)
+=
mace.o
OBJS-$(CONFIG_MACE6_DECODER)
+=
mace.o
...
...
libavcodec/allcodecs.c
View file @
16f7c1f2
...
...
@@ -173,6 +173,7 @@ extern AVCodec ff_kmvc_decoder;
extern
AVCodec
ff_lagarith_decoder
;
extern
AVCodec
ff_ljpeg_encoder
;
extern
AVCodec
ff_loco_decoder
;
extern
AVCodec
ff_lscr_decoder
;
extern
AVCodec
ff_m101_decoder
;
extern
AVCodec
ff_magicyuv_encoder
;
extern
AVCodec
ff_magicyuv_decoder
;
...
...
libavcodec/avcodec.h
View file @
16f7c1f2
...
...
@@ -455,6 +455,7 @@ enum AVCodecID {
AV_CODEC_ID_HYMT
,
AV_CODEC_ID_ARBC
,
AV_CODEC_ID_AGM
,
AV_CODEC_ID_LSCR
,
/* various PCM "codecs" */
AV_CODEC_ID_FIRST_AUDIO
=
0x10000
,
///< A dummy id pointing at the start of audio codecs
...
...
libavcodec/codec_desc.c
View file @
16f7c1f2
...
...
@@ -1712,6 +1712,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Amuse Graphics Movie"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
{
.
id
=
AV_CODEC_ID_LSCR
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
name
=
"lscr"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"LEAD Screen Capture"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
/* various PCM "codecs" */
{
...
...
libavcodec/pngdec.c
View file @
16f7c1f2
...
...
@@ -1525,6 +1525,141 @@ end:
}
#endif
#if CONFIG_LSCR_DECODER
static
int
decode_frame_lscr
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
PNGDecContext
*
const
s
=
avctx
->
priv_data
;
GetByteContext
*
gb
=
&
s
->
gb
;
AVFrame
*
frame
=
data
;
int
ret
,
nb_blocks
,
offset
=
0
;
bytestream2_init
(
gb
,
avpkt
->
data
,
avpkt
->
size
);
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
AV_GET_BUFFER_FLAG_REF
))
<
0
)
return
ret
;
nb_blocks
=
bytestream2_get_le16
(
gb
);
if
(
s
->
last_picture
.
f
->
data
[
0
])
{
ret
=
av_frame_copy
(
frame
,
s
->
last_picture
.
f
);
if
(
ret
<
0
)
return
ret
;
}
for
(
int
b
=
0
;
b
<
nb_blocks
;
b
++
)
{
int
x
,
y
,
x2
,
y2
,
w
,
h
,
left
;
uint32_t
csize
,
size
;
s
->
zstream
.
zalloc
=
ff_png_zalloc
;
s
->
zstream
.
zfree
=
ff_png_zfree
;
s
->
zstream
.
opaque
=
NULL
;
if
((
ret
=
inflateInit
(
&
s
->
zstream
))
!=
Z_OK
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"inflateInit returned error %d
\n
"
,
ret
);
ret
=
AVERROR_EXTERNAL
;
goto
end
;
}
bytestream2_seek
(
gb
,
2
+
b
*
12
,
SEEK_SET
);
x
=
bytestream2_get_le16
(
gb
);
y
=
bytestream2_get_le16
(
gb
);
x2
=
bytestream2_get_le16
(
gb
);
y2
=
bytestream2_get_le16
(
gb
);
s
->
width
=
s
->
cur_w
=
w
=
x2
-
x
;
s
->
height
=
s
->
cur_h
=
h
=
y2
-
y
;
if
(
w
<=
0
||
x
<
0
||
x
>=
avctx
->
width
||
w
+
x
>
avctx
->
width
||
h
<=
0
||
y
<
0
||
y
>=
avctx
->
height
||
h
+
y
>
avctx
->
height
)
{
ret
=
AVERROR_INVALIDDATA
;
goto
end
;
}
size
=
bytestream2_get_le32
(
gb
);
frame
->
key_frame
=
(
nb_blocks
==
1
)
&&
(
w
==
avctx
->
width
)
&&
(
h
==
avctx
->
height
)
&&
(
x
==
0
)
&&
(
y
==
0
);
bytestream2_seek
(
gb
,
2
+
nb_blocks
*
12
+
offset
,
SEEK_SET
);
csize
=
bytestream2_get_be32
(
gb
);
if
(
bytestream2_get_le32
(
gb
)
!=
MKTAG
(
'I'
,
'D'
,
'A'
,
'T'
))
{
ret
=
AVERROR_INVALIDDATA
;
goto
end
;
}
offset
+=
size
;
left
=
size
;
s
->
y
=
0
;
s
->
row_size
=
w
*
3
;
av_fast_padded_malloc
(
&
s
->
buffer
,
&
s
->
buffer_size
,
s
->
row_size
+
16
);
if
(
!
s
->
buffer
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
end
;
}
av_fast_padded_malloc
(
&
s
->
last_row
,
&
s
->
last_row_size
,
s
->
row_size
);
if
(
!
s
->
last_row
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
end
;
}
s
->
crow_size
=
w
*
3
+
1
;
s
->
crow_buf
=
s
->
buffer
+
15
;
s
->
zstream
.
avail_out
=
s
->
crow_size
;
s
->
zstream
.
next_out
=
s
->
crow_buf
;
s
->
image_buf
=
frame
->
data
[
0
]
+
(
avctx
->
height
-
y
-
1
)
*
frame
->
linesize
[
0
]
+
x
*
3
;
s
->
image_linesize
=-
frame
->
linesize
[
0
];
s
->
bpp
=
3
;
s
->
pic_state
=
0
;
while
(
left
>
16
)
{
ret
=
png_decode_idat
(
s
,
csize
);
if
(
ret
<
0
)
goto
end
;
left
-=
csize
+
16
;
if
(
left
>
16
)
{
bytestream2_skip
(
gb
,
4
);
csize
=
bytestream2_get_be32
(
gb
);
if
(
bytestream2_get_le32
(
gb
)
!=
MKTAG
(
'I'
,
'D'
,
'A'
,
'T'
))
{
ret
=
AVERROR_INVALIDDATA
;
goto
end
;
}
}
}
inflateEnd
(
&
s
->
zstream
);
}
frame
->
pict_type
=
frame
->
key_frame
?
AV_PICTURE_TYPE_I
:
AV_PICTURE_TYPE_P
;
av_frame_unref
(
s
->
last_picture
.
f
);
if
((
ret
=
av_frame_ref
(
s
->
last_picture
.
f
,
frame
))
<
0
)
return
ret
;
*
got_frame
=
1
;
end
:
inflateEnd
(
&
s
->
zstream
);
if
(
ret
<
0
)
return
ret
;
return
avpkt
->
size
;
}
static
void
decode_flush
(
AVCodecContext
*
avctx
)
{
PNGDecContext
*
s
=
avctx
->
priv_data
;
av_frame_unref
(
s
->
last_picture
.
f
);
}
#endif
#if HAVE_THREADS
static
int
update_thread_context
(
AVCodecContext
*
dst
,
const
AVCodecContext
*
src
)
{
...
...
@@ -1581,6 +1716,9 @@ static av_cold int png_dec_init(AVCodecContext *avctx)
avctx
->
color_range
=
AVCOL_RANGE_JPEG
;
if
(
avctx
->
codec_id
==
AV_CODEC_ID_LSCR
)
avctx
->
pix_fmt
=
AV_PIX_FMT_BGR24
;
s
->
avctx
=
avctx
;
s
->
previous_picture
.
f
=
av_frame_alloc
();
s
->
last_picture
.
f
=
av_frame_alloc
();
...
...
@@ -1653,3 +1791,19 @@ AVCodec ff_png_decoder = {
.
caps_internal
=
FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
|
FF_CODEC_CAP_INIT_THREADSAFE
,
};
#endif
#if CONFIG_LSCR_DECODER
AVCodec
ff_lscr_decoder
=
{
.
name
=
"lscr"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"LEAD Screen Capture"
),
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_LSCR
,
.
priv_data_size
=
sizeof
(
PNGDecContext
),
.
init
=
png_dec_init
,
.
close
=
png_dec_end
,
.
decode
=
decode_frame_lscr
,
.
flush
=
decode_flush
,
.
capabilities
=
AV_CODEC_CAP_DR1
/*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/
,
.
caps_internal
=
FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
|
FF_CODEC_CAP_INIT_THREADSAFE
,
};
#endif
libavcodec/version.h
View file @
16f7c1f2
...
...
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 5
0
#define LIBAVCODEC_VERSION_MINOR 5
1
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
libavformat/riff.c
View file @
16f7c1f2
...
...
@@ -485,6 +485,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
{
AV_CODEC_ID_AGM
,
MKTAG
(
'A'
,
'G'
,
'M'
,
'5'
)
},
{
AV_CODEC_ID_AGM
,
MKTAG
(
'A'
,
'G'
,
'M'
,
'6'
)
},
{
AV_CODEC_ID_AGM
,
MKTAG
(
'A'
,
'G'
,
'M'
,
'7'
)
},
{
AV_CODEC_ID_LSCR
,
MKTAG
(
'L'
,
'S'
,
'C'
,
'R'
)
},
{
AV_CODEC_ID_NONE
,
0
}
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment