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
795af110
Commit
795af110
authored
Jan 20, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: add ARBC decoder
Thanks Kostya for great help in reversing binary.
parent
d8ebfd1b
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
217 additions
and
1 deletion
+217
-1
Changelog
Changelog
+1
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
arbc.c
libavcodec/arbc.c
+204
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
codec_desc.c
libavcodec/codec_desc.c
+7
-0
version.h
libavcodec/version.h
+1
-1
riff.c
libavformat/riff.c
+1
-0
No files found.
Changelog
View file @
795af110
...
...
@@ -16,6 +16,7 @@ version <next>:
- anlmdn filter
- maskfun filter
- hcom demuxer and decoder
- ARBC decoder
version 4.1:
...
...
libavcodec/Makefile
View file @
795af110
...
...
@@ -198,6 +198,7 @@ OBJS-$(CONFIG_APTX_HD_DECODER) += aptx.o
OBJS-$(CONFIG_APTX_HD_ENCODER)
+=
aptx.o
OBJS-$(CONFIG_APNG_DECODER)
+=
png.o
pngdec.o
pngdsp.o
OBJS-$(CONFIG_APNG_ENCODER)
+=
png.o
pngenc.o
OBJS-$(CONFIG_ARBC_DECODER)
+=
arbc.o
OBJS-$(CONFIG_SSA_DECODER)
+=
assdec.o
ass.o
OBJS-$(CONFIG_SSA_ENCODER)
+=
assenc.o
ass.o
OBJS-$(CONFIG_ASS_DECODER)
+=
assdec.o
ass.o
...
...
libavcodec/allcodecs.c
View file @
795af110
...
...
@@ -41,6 +41,7 @@ extern AVCodec ff_anm_decoder;
extern
AVCodec
ff_ansi_decoder
;
extern
AVCodec
ff_apng_encoder
;
extern
AVCodec
ff_apng_decoder
;
extern
AVCodec
ff_arbc_decoder
;
extern
AVCodec
ff_asv1_encoder
;
extern
AVCodec
ff_asv1_decoder
;
extern
AVCodec
ff_asv2_encoder
;
...
...
libavcodec/arbc.c
0 → 100644
View file @
795af110
/*
* Gryphon's Anim Compressor decoder
* Copyright (c) 2019 Paul B Mahol
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mem.h"
#include "avcodec.h"
#include "bytestream.h"
#include "internal.h"
typedef
struct
ARBCContext
{
GetByteContext
gb
;
AVFrame
*
prev_frame
;
}
ARBCContext
;
static
void
fill_tile4
(
AVCodecContext
*
avctx
,
uint8_t
*
color
,
AVFrame
*
frame
)
{
ARBCContext
*
s
=
avctx
->
priv_data
;
GetByteContext
*
gb
=
&
s
->
gb
;
int
nb_tiles
=
bytestream2_get_le16
(
gb
);
int
h
=
avctx
->
height
-
1
;
for
(
int
i
=
0
;
i
<
nb_tiles
;
i
++
)
{
int
y
=
bytestream2_get_byte
(
gb
);
int
x
=
bytestream2_get_byte
(
gb
);
uint16_t
mask
=
bytestream2_get_le16
(
gb
);
int
start_y
=
y
*
4
,
start_x
=
x
*
4
;
int
end_y
=
start_y
+
4
,
end_x
=
start_x
+
4
;
for
(
int
j
=
start_y
;
j
<
end_y
;
j
++
)
{
for
(
int
k
=
start_x
;
k
<
end_x
;
k
++
)
{
if
(
mask
&
0x8000
)
{
if
(
j
>=
avctx
->
height
||
k
>=
avctx
->
width
)
{
mask
=
mask
<<
1
;
continue
;
}
frame
->
data
[
0
][
frame
->
linesize
[
0
]
*
(
h
-
j
)
+
3
*
k
+
0
]
=
color
[
0
];
frame
->
data
[
0
][
frame
->
linesize
[
0
]
*
(
h
-
j
)
+
3
*
k
+
1
]
=
color
[
1
];
frame
->
data
[
0
][
frame
->
linesize
[
0
]
*
(
h
-
j
)
+
3
*
k
+
2
]
=
color
[
2
];
}
mask
=
mask
<<
1
;
}
}
}
}
static
void
fill_tileX
(
AVCodecContext
*
avctx
,
int
tile_width
,
int
tile_height
,
uint8_t
*
color
,
AVFrame
*
frame
)
{
ARBCContext
*
s
=
avctx
->
priv_data
;
GetByteContext
*
gb
=
&
s
->
gb
;
const
int
step_h
=
tile_height
/
4
;
const
int
step_w
=
tile_width
/
4
;
int
nb_tiles
=
bytestream2_get_le16
(
gb
);
int
h
=
avctx
->
height
-
1
;
for
(
int
i
=
0
;
i
<
nb_tiles
;
i
++
)
{
int
y
=
bytestream2_get_byte
(
gb
);
int
x
=
bytestream2_get_byte
(
gb
);
uint16_t
mask
=
bytestream2_get_le16
(
gb
);
int
start_y
=
y
*
tile_height
,
start_x
=
x
*
tile_width
;
int
end_y
=
start_y
+
tile_height
,
end_x
=
start_x
+
tile_width
;
for
(
int
j
=
start_y
;
j
<
end_y
;
j
+=
step_h
)
{
for
(
int
k
=
start_x
;
k
<
end_x
;
k
+=
step_w
)
{
if
(
mask
&
0x8000U
)
{
for
(
int
m
=
0
;
m
<
step_h
;
m
++
)
{
for
(
int
n
=
0
;
n
<
step_w
;
n
++
)
{
if
(
j
+
m
>=
avctx
->
height
||
k
+
n
>=
avctx
->
width
)
continue
;
frame
->
data
[
0
][
frame
->
linesize
[
0
]
*
(
h
-
(
j
+
m
))
+
3
*
(
k
+
n
)
+
0
]
=
color
[
0
];
frame
->
data
[
0
][
frame
->
linesize
[
0
]
*
(
h
-
(
j
+
m
))
+
3
*
(
k
+
n
)
+
1
]
=
color
[
1
];
frame
->
data
[
0
][
frame
->
linesize
[
0
]
*
(
h
-
(
j
+
m
))
+
3
*
(
k
+
n
)
+
2
]
=
color
[
2
];
}
}
}
mask
=
mask
<<
1
;
}
}
}
}
static
int
decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
ARBCContext
*
s
=
avctx
->
priv_data
;
AVFrame
*
frame
=
data
;
int
ret
,
nb_segments
,
keyframe
=
1
;
if
(
avpkt
->
size
<
10
)
return
AVERROR_INVALIDDATA
;
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
AV_GET_BUFFER_FLAG_REF
))
<
0
)
return
ret
;
if
(
s
->
prev_frame
->
data
[
0
])
{
ret
=
av_frame_copy
(
frame
,
s
->
prev_frame
);
if
(
ret
<
0
)
return
ret
;
}
bytestream2_init
(
&
s
->
gb
,
avpkt
->
data
,
avpkt
->
size
);
bytestream2_skip
(
&
s
->
gb
,
8
);
nb_segments
=
bytestream2_get_le16
(
&
s
->
gb
);
if
(
nb_segments
==
0
)
keyframe
=
0
;
for
(
int
i
=
0
;
i
<
nb_segments
;
i
++
)
{
int
resolution_flag
;
uint8_t
fill
[
3
];
if
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
<=
0
)
return
AVERROR_INVALIDDATA
;
fill
[
0
]
=
bytestream2_get_byte
(
&
s
->
gb
);
bytestream2_skip
(
&
s
->
gb
,
1
);
fill
[
1
]
=
bytestream2_get_byte
(
&
s
->
gb
);
bytestream2_skip
(
&
s
->
gb
,
1
);
fill
[
2
]
=
bytestream2_get_byte
(
&
s
->
gb
);
bytestream2_skip
(
&
s
->
gb
,
1
);
resolution_flag
=
bytestream2_get_byte
(
&
s
->
gb
);
if
(
resolution_flag
&
0x10
)
fill_tileX
(
avctx
,
1024
,
1024
,
fill
,
frame
);
if
(
resolution_flag
&
0x08
)
fill_tileX
(
avctx
,
256
,
256
,
fill
,
frame
);
if
(
resolution_flag
&
0x04
)
fill_tileX
(
avctx
,
64
,
64
,
fill
,
frame
);
if
(
resolution_flag
&
0x02
)
fill_tileX
(
avctx
,
16
,
16
,
fill
,
frame
);
if
(
resolution_flag
&
0x01
)
fill_tile4
(
avctx
,
fill
,
frame
);
}
av_frame_unref
(
s
->
prev_frame
);
if
((
ret
=
av_frame_ref
(
s
->
prev_frame
,
frame
))
<
0
)
return
ret
;
frame
->
pict_type
=
keyframe
?
AV_PICTURE_TYPE_I
:
AV_PICTURE_TYPE_P
;
frame
->
key_frame
=
keyframe
;
*
got_frame
=
1
;
return
avpkt
->
size
;
}
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
)
{
ARBCContext
*
s
=
avctx
->
priv_data
;
avctx
->
pix_fmt
=
AV_PIX_FMT_RGB24
;
s
->
prev_frame
=
av_frame_alloc
();
if
(
!
s
->
prev_frame
)
return
AVERROR
(
ENOMEM
);
return
0
;
}
static
av_cold
int
decode_close
(
AVCodecContext
*
avctx
)
{
ARBCContext
*
s
=
avctx
->
priv_data
;
av_frame_free
(
&
s
->
prev_frame
);
return
0
;
}
AVCodec
ff_arbc_decoder
=
{
.
name
=
"arbc"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Gryphon's Anim Compressor"
),
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_ARBC
,
.
priv_data_size
=
sizeof
(
ARBCContext
),
.
init
=
decode_init
,
.
decode
=
decode_frame
,
.
close
=
decode_close
,
.
capabilities
=
AV_CODEC_CAP_DR1
,
.
caps_internal
=
FF_CODEC_CAP_INIT_CLEANUP
,
};
libavcodec/avcodec.h
View file @
795af110
...
...
@@ -453,6 +453,7 @@ enum AVCodecID {
AV_CODEC_ID_WCMV
,
AV_CODEC_ID_RASC
,
AV_CODEC_ID_HYMT
,
AV_CODEC_ID_ARBC
,
/* 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 @
795af110
...
...
@@ -1698,6 +1698,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"HuffYUV MT"
),
.
props
=
AV_CODEC_PROP_INTRA_ONLY
|
AV_CODEC_PROP_LOSSLESS
,
},
{
.
id
=
AV_CODEC_ID_ARBC
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
name
=
"arbc"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Gryphon's Anim Compressor"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
/* various PCM "codecs" */
{
...
...
libavcodec/version.h
View file @
795af110
...
...
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 4
4
#define LIBAVCODEC_VERSION_MINOR 4
5
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
libavformat/riff.c
View file @
795af110
...
...
@@ -476,6 +476,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
{
AV_CODEC_ID_WCMV
,
MKTAG
(
'W'
,
'C'
,
'M'
,
'V'
)
},
{
AV_CODEC_ID_RASC
,
MKTAG
(
'R'
,
'A'
,
'S'
,
'C'
)
},
{
AV_CODEC_ID_HYMT
,
MKTAG
(
'H'
,
'Y'
,
'M'
,
'T'
)
},
{
AV_CODEC_ID_ARBC
,
MKTAG
(
'A'
,
'R'
,
'B'
,
'C'
)
},
{
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