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
53167ecf
Commit
53167ecf
authored
Jan 23, 2014
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/huffyuv: support AV_PIX_FMT_YUV(A)4XYP16 and GRAY16
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
214a3b8b
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
117 additions
and
34 deletions
+117
-34
huffyuv.h
libavcodec/huffyuv.h
+6
-4
huffyuvdec.c
libavcodec/huffyuvdec.c
+46
-6
huffyuvenc.c
libavcodec/huffyuvenc.c
+65
-24
No files found.
libavcodec/huffyuv.h
View file @
53167ecf
...
@@ -39,8 +39,9 @@
...
@@ -39,8 +39,9 @@
#define VLC_BITS 11
#define VLC_BITS 11
#define MAX_BITS 1
4
#define MAX_BITS 1
6
#define MAX_N (1<<MAX_BITS)
#define MAX_N (1<<MAX_BITS)
#define MAX_VLC_N 16384
#if HAVE_BIGENDIAN
#if HAVE_BIGENDIAN
#define B 3
#define B 3
...
@@ -73,6 +74,7 @@ typedef struct HYuvContext {
...
@@ -73,6 +74,7 @@ typedef struct HYuvContext {
int
bgr32
;
//use bgr32 instead of bgr24
int
bgr32
;
//use bgr32 instead of bgr24
int
bps
;
int
bps
;
int
n
;
// 1<<bps
int
n
;
// 1<<bps
int
vlc_n
;
// number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
int
alpha
;
int
alpha
;
int
chroma
;
int
chroma
;
int
yuv
;
int
yuv
;
...
@@ -85,9 +87,9 @@ typedef struct HYuvContext {
...
@@ -85,9 +87,9 @@ typedef struct HYuvContext {
int
last_slice_end
;
int
last_slice_end
;
uint8_t
*
temp
[
3
];
uint8_t
*
temp
[
3
];
uint16_t
*
temp16
[
3
];
///< identical to temp but 16bit type
uint16_t
*
temp16
[
3
];
///< identical to temp but 16bit type
uint64_t
stats
[
4
][
MAX_N
];
uint64_t
stats
[
4
][
MAX_
VLC_
N
];
uint8_t
len
[
4
][
MAX_N
];
uint8_t
len
[
4
][
MAX_
VLC_
N
];
uint32_t
bits
[
4
][
MAX_N
];
uint32_t
bits
[
4
][
MAX_
VLC_
N
];
uint32_t
pix_bgr_map
[
1
<<
VLC_BITS
];
uint32_t
pix_bgr_map
[
1
<<
VLC_BITS
];
VLC
vlc
[
8
];
//Y,U,V,A,YY,YU,YV,AA
VLC
vlc
[
8
];
//Y,U,V,A,YY,YU,YV,AA
uint8_t
*
bitstream_buffer
;
uint8_t
*
bitstream_buffer
;
...
...
libavcodec/huffyuvdec.c
View file @
53167ecf
...
@@ -120,12 +120,12 @@ static int generate_joint_tables(HYuvContext *s)
...
@@ -120,12 +120,12 @@ static int generate_joint_tables(HYuvContext *s)
int
p
,
i
,
y
,
u
;
int
p
,
i
,
y
,
u
;
for
(
p
=
0
;
p
<
4
;
p
++
)
{
for
(
p
=
0
;
p
<
4
;
p
++
)
{
int
p0
=
s
->
version
>
2
?
p
:
0
;
int
p0
=
s
->
version
>
2
?
p
:
0
;
for
(
i
=
y
=
0
;
y
<
s
->
n
;
y
++
)
{
for
(
i
=
y
=
0
;
y
<
s
->
vlc_
n
;
y
++
)
{
int
len0
=
s
->
len
[
p0
][
y
];
int
len0
=
s
->
len
[
p0
][
y
];
int
limit
=
VLC_BITS
-
len0
;
int
limit
=
VLC_BITS
-
len0
;
if
(
limit
<=
0
||
!
len0
)
if
(
limit
<=
0
||
!
len0
)
continue
;
continue
;
for
(
u
=
0
;
u
<
s
->
n
;
u
++
)
{
for
(
u
=
0
;
u
<
s
->
vlc_
n
;
u
++
)
{
int
len1
=
s
->
len
[
p
][
u
];
int
len1
=
s
->
len
[
p
][
u
];
if
(
len1
>
limit
||
!
len1
)
if
(
len1
>
limit
||
!
len1
)
continue
;
continue
;
...
@@ -201,13 +201,13 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length)
...
@@ -201,13 +201,13 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length)
count
=
1
+
s
->
alpha
+
2
*
s
->
chroma
;
count
=
1
+
s
->
alpha
+
2
*
s
->
chroma
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
if
(
read_len_table
(
s
->
len
[
i
],
&
gb
,
s
->
n
)
<
0
)
if
(
read_len_table
(
s
->
len
[
i
],
&
gb
,
s
->
vlc_
n
)
<
0
)
return
-
1
;
return
-
1
;
if
(
ff_huffyuv_generate_bits_table
(
s
->
bits
[
i
],
s
->
len
[
i
],
s
->
n
)
<
0
)
{
if
(
ff_huffyuv_generate_bits_table
(
s
->
bits
[
i
],
s
->
len
[
i
],
s
->
vlc_
n
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
ff_free_vlc
(
&
s
->
vlc
[
i
]);
ff_free_vlc
(
&
s
->
vlc
[
i
]);
if
((
ret
=
init_vlc
(
&
s
->
vlc
[
i
],
VLC_BITS
,
s
->
n
,
s
->
len
[
i
],
1
,
1
,
if
((
ret
=
init_vlc
(
&
s
->
vlc
[
i
],
VLC_BITS
,
s
->
vlc_
n
,
s
->
len
[
i
],
1
,
1
,
s
->
bits
[
i
],
4
,
4
,
0
))
<
0
)
s
->
bits
[
i
],
4
,
4
,
0
))
<
0
)
return
ret
;
return
ret
;
}
}
...
@@ -280,6 +280,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -280,6 +280,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
s
->
bps
=
8
;
s
->
bps
=
8
;
s
->
n
=
1
<<
s
->
bps
;
s
->
n
=
1
<<
s
->
bps
;
s
->
vlc_n
=
FFMIN
(
s
->
n
,
MAX_VLC_N
);
s
->
chroma
=
1
;
s
->
chroma
=
1
;
if
(
s
->
version
>=
2
)
{
if
(
s
->
version
>=
2
)
{
int
method
,
interlace
;
int
method
,
interlace
;
...
@@ -297,6 +298,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -297,6 +298,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
}
else
{
}
else
{
s
->
bps
=
(
avctx
->
extradata
[
1
]
>>
4
)
+
1
;
s
->
bps
=
(
avctx
->
extradata
[
1
]
>>
4
)
+
1
;
s
->
n
=
1
<<
s
->
bps
;
s
->
n
=
1
<<
s
->
bps
;
s
->
vlc_n
=
FFMIN
(
s
->
n
,
MAX_VLC_N
);
s
->
chroma_h_shift
=
avctx
->
extradata
[
1
]
&
3
;
s
->
chroma_h_shift
=
avctx
->
extradata
[
1
]
&
3
;
s
->
chroma_v_shift
=
(
avctx
->
extradata
[
1
]
>>
2
)
&
3
;
s
->
chroma_v_shift
=
(
avctx
->
extradata
[
1
]
>>
2
)
&
3
;
s
->
yuv
=
!!
(((
uint8_t
*
)
avctx
->
extradata
)[
2
]
&
1
);
s
->
yuv
=
!!
(((
uint8_t
*
)
avctx
->
extradata
)[
2
]
&
1
);
...
@@ -374,6 +376,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -374,6 +376,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x070
:
case
0x070
:
avctx
->
pix_fmt
=
AV_PIX_FMT_GRAY8
;
avctx
->
pix_fmt
=
AV_PIX_FMT_GRAY8
;
break
;
break
;
case
0x0F0
:
avctx
->
pix_fmt
=
AV_PIX_FMT_GRAY16
;
break
;
case
0x170
:
case
0x170
:
avctx
->
pix_fmt
=
AV_PIX_FMT_GRAY8A
;
avctx
->
pix_fmt
=
AV_PIX_FMT_GRAY8A
;
break
;
break
;
...
@@ -398,6 +403,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -398,6 +403,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x6D0
:
case
0x6D0
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV444P14
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV444P14
;
break
;
break
;
case
0x6F0
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV444P16
;
break
;
case
0x671
:
case
0x671
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV422P
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV422P
;
break
;
break
;
...
@@ -413,6 +421,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -413,6 +421,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x6D1
:
case
0x6D1
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV422P14
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV422P14
;
break
;
break
;
case
0x6F1
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV422P16
;
break
;
case
0x672
:
case
0x672
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV411P
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV411P
;
break
;
break
;
...
@@ -434,6 +445,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -434,6 +445,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x6D5
:
case
0x6D5
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV420P14
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV420P14
;
break
;
break
;
case
0x6F5
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV420P16
;
break
;
case
0x67A
:
case
0x67A
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV410P
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV410P
;
break
;
break
;
...
@@ -446,6 +460,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -446,6 +460,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x790
:
case
0x790
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA444P10
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA444P10
;
break
;
break
;
case
0x7F0
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA444P16
;
break
;
case
0x771
:
case
0x771
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA422P
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA422P
;
break
;
break
;
...
@@ -455,6 +472,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -455,6 +472,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x791
:
case
0x791
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA422P10
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA422P10
;
break
;
break
;
case
0x7F1
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA422P16
;
break
;
case
0x775
:
case
0x775
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA420P
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA420P
;
break
;
break
;
...
@@ -464,6 +484,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
...
@@ -464,6 +484,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
case
0x795
:
case
0x795
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA420P10
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA420P10
;
break
;
break
;
case
0x7F5
:
avctx
->
pix_fmt
=
AV_PIX_FMT_YUVA420P16
;
break
;
default:
default:
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
...
@@ -557,10 +580,17 @@ static void decode_422_bitstream(HYuvContext *s, int count)
...
@@ -557,10 +580,17 @@ static void decode_422_bitstream(HYuvContext *s, int count)
dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
}\
}\
}
}
#define READ_2PIX_PLANE1
6
(dst0, dst1, plane){\
#define READ_2PIX_PLANE1
4
(dst0, dst1, plane){\
dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
}
}
#define READ_2PIX_PLANE16(dst0, dst1, plane){\
dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
dst0 += get_bits(&s->gb, 2);\
dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
dst1 += get_bits(&s->gb, 2);\
}
static
void
decode_plane_bitstream
(
HYuvContext
*
s
,
int
count
,
int
plane
)
static
void
decode_plane_bitstream
(
HYuvContext
*
s
,
int
count
,
int
plane
)
{
{
int
i
;
int
i
;
...
@@ -577,6 +607,16 @@ static void decode_plane_bitstream(HYuvContext *s, int count, int plane)
...
@@ -577,6 +607,16 @@ static void decode_plane_bitstream(HYuvContext *s, int count, int plane)
READ_2PIX_PLANE
(
s
->
temp
[
0
][
2
*
i
],
s
->
temp
[
0
][
2
*
i
+
1
],
plane
);
READ_2PIX_PLANE
(
s
->
temp
[
0
][
2
*
i
],
s
->
temp
[
0
][
2
*
i
+
1
],
plane
);
}
}
}
}
}
else
if
(
s
->
bps
<=
14
)
{
if
(
count
>=
(
get_bits_left
(
&
s
->
gb
))
/
(
31
*
2
))
{
for
(
i
=
0
;
i
<
count
&&
get_bits_left
(
&
s
->
gb
)
>
0
;
i
++
)
{
READ_2PIX_PLANE14
(
s
->
temp16
[
0
][
2
*
i
],
s
->
temp16
[
0
][
2
*
i
+
1
],
plane
);
}
}
else
{
for
(
i
=
0
;
i
<
count
;
i
++
){
READ_2PIX_PLANE14
(
s
->
temp16
[
0
][
2
*
i
],
s
->
temp16
[
0
][
2
*
i
+
1
],
plane
);
}
}
}
else
{
}
else
{
if
(
count
>=
(
get_bits_left
(
&
s
->
gb
))
/
(
31
*
2
))
{
if
(
count
>=
(
get_bits_left
(
&
s
->
gb
))
/
(
31
*
2
))
{
for
(
i
=
0
;
i
<
count
&&
get_bits_left
(
&
s
->
gb
)
>
0
;
i
++
)
{
for
(
i
=
0
;
i
<
count
&&
get_bits_left
(
&
s
->
gb
)
>
0
;
i
++
)
{
...
...
libavcodec/huffyuvenc.c
View file @
53167ecf
...
@@ -164,7 +164,7 @@ static int store_table(HYuvContext *s, const uint8_t *len, uint8_t *buf)
...
@@ -164,7 +164,7 @@ static int store_table(HYuvContext *s, const uint8_t *len, uint8_t *buf)
{
{
int
i
;
int
i
;
int
index
=
0
;
int
index
=
0
;
int
n
=
s
->
n
;
int
n
=
s
->
vlc_
n
;
for
(
i
=
0
;
i
<
n
;)
{
for
(
i
=
0
;
i
<
n
;)
{
int
val
=
len
[
i
];
int
val
=
len
[
i
];
...
@@ -195,10 +195,10 @@ static int store_huffman_tables(HYuvContext *s, uint8_t *buf)
...
@@ -195,10 +195,10 @@ static int store_huffman_tables(HYuvContext *s, uint8_t *buf)
count
=
1
+
s
->
alpha
+
2
*
s
->
chroma
;
count
=
1
+
s
->
alpha
+
2
*
s
->
chroma
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
if
((
ret
=
ff_huff_gen_len_table
(
s
->
len
[
i
],
s
->
stats
[
i
],
s
->
n
))
<
0
)
if
((
ret
=
ff_huff_gen_len_table
(
s
->
len
[
i
],
s
->
stats
[
i
],
s
->
vlc_
n
))
<
0
)
return
ret
;
return
ret
;
if
(
ff_huffyuv_generate_bits_table
(
s
->
bits
[
i
],
s
->
len
[
i
],
s
->
n
)
<
0
)
{
if
(
ff_huffyuv_generate_bits_table
(
s
->
bits
[
i
],
s
->
len
[
i
],
s
->
vlc_
n
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -254,6 +254,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -254,6 +254,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
case
AV_PIX_FMT_YUV440P
:
case
AV_PIX_FMT_YUV440P
:
case
AV_PIX_FMT_GBRP
:
case
AV_PIX_FMT_GBRP
:
case
AV_PIX_FMT_GRAY8
:
case
AV_PIX_FMT_GRAY8
:
case
AV_PIX_FMT_GRAY16
:
case
AV_PIX_FMT_YUVA444P
:
case
AV_PIX_FMT_YUVA444P
:
case
AV_PIX_FMT_YUVA420P
:
case
AV_PIX_FMT_YUVA420P
:
case
AV_PIX_FMT_YUVA422P
:
case
AV_PIX_FMT_YUVA422P
:
...
@@ -263,20 +264,26 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -263,20 +264,26 @@ static av_cold int encode_init(AVCodecContext *avctx)
case
AV_PIX_FMT_YUV420P10
:
case
AV_PIX_FMT_YUV420P10
:
case
AV_PIX_FMT_YUV420P12
:
case
AV_PIX_FMT_YUV420P12
:
case
AV_PIX_FMT_YUV420P14
:
case
AV_PIX_FMT_YUV420P14
:
case
AV_PIX_FMT_YUV420P16
:
case
AV_PIX_FMT_YUV422P9
:
case
AV_PIX_FMT_YUV422P9
:
case
AV_PIX_FMT_YUV422P10
:
case
AV_PIX_FMT_YUV422P10
:
case
AV_PIX_FMT_YUV422P12
:
case
AV_PIX_FMT_YUV422P12
:
case
AV_PIX_FMT_YUV422P14
:
case
AV_PIX_FMT_YUV422P14
:
case
AV_PIX_FMT_YUV422P16
:
case
AV_PIX_FMT_YUV444P9
:
case
AV_PIX_FMT_YUV444P9
:
case
AV_PIX_FMT_YUV444P10
:
case
AV_PIX_FMT_YUV444P10
:
case
AV_PIX_FMT_YUV444P12
:
case
AV_PIX_FMT_YUV444P12
:
case
AV_PIX_FMT_YUV444P14
:
case
AV_PIX_FMT_YUV444P14
:
case
AV_PIX_FMT_YUV444P16
:
case
AV_PIX_FMT_YUVA420P9
:
case
AV_PIX_FMT_YUVA420P9
:
case
AV_PIX_FMT_YUVA420P10
:
case
AV_PIX_FMT_YUVA420P10
:
case
AV_PIX_FMT_YUVA420P16
:
case
AV_PIX_FMT_YUVA422P9
:
case
AV_PIX_FMT_YUVA422P9
:
case
AV_PIX_FMT_YUVA422P10
:
case
AV_PIX_FMT_YUVA422P10
:
case
AV_PIX_FMT_YUVA422P16
:
case
AV_PIX_FMT_YUVA444P9
:
case
AV_PIX_FMT_YUVA444P9
:
case
AV_PIX_FMT_YUVA444P10
:
case
AV_PIX_FMT_YUVA444P10
:
case
AV_PIX_FMT_YUVA444P16
:
s
->
version
=
3
;
s
->
version
=
3
;
break
;
break
;
case
AV_PIX_FMT_RGB32
:
case
AV_PIX_FMT_RGB32
:
...
@@ -290,6 +297,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -290,6 +297,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
return
AVERROR
(
EINVAL
);
return
AVERROR
(
EINVAL
);
}
}
s
->
n
=
1
<<
s
->
bps
;
s
->
n
=
1
<<
s
->
bps
;
s
->
vlc_n
=
FFMIN
(
s
->
n
,
MAX_VLC_N
);
avctx
->
bits_per_coded_sample
=
s
->
bitstream_bpp
;
avctx
->
bits_per_coded_sample
=
s
->
bitstream_bpp
;
s
->
decorrelate
=
s
->
bitstream_bpp
>=
24
&&
!
s
->
yuv
&&
avctx
->
pix_fmt
!=
AV_PIX_FMT_GBRP
;
s
->
decorrelate
=
s
->
bitstream_bpp
>=
24
&&
!
s
->
yuv
&&
avctx
->
pix_fmt
!=
AV_PIX_FMT_GBRP
;
...
@@ -362,14 +370,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -362,14 +370,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
char
*
p
=
avctx
->
stats_in
;
char
*
p
=
avctx
->
stats_in
;
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
s
->
stats
[
i
][
j
]
=
1
;
s
->
stats
[
i
][
j
]
=
1
;
for
(;;)
{
for
(;;)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
char
*
next
;
char
*
next
;
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
{
s
->
stats
[
i
][
j
]
+=
strtol
(
p
,
&
next
,
0
);
s
->
stats
[
i
][
j
]
+=
strtol
(
p
,
&
next
,
0
);
if
(
next
==
p
)
return
-
1
;
if
(
next
==
p
)
return
-
1
;
p
=
next
;
p
=
next
;
...
@@ -379,8 +387,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -379,8 +387,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
{
int
d
=
FFMIN
(
j
,
s
->
n
-
j
);
int
d
=
FFMIN
(
j
,
s
->
vlc_
n
-
j
);
s
->
stats
[
i
][
j
]
=
100000000
/
(
d
+
1
);
s
->
stats
[
i
][
j
]
=
100000000
/
(
d
+
1
);
}
}
...
@@ -394,14 +402,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -394,14 +402,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
if
(
s
->
context
)
{
if
(
s
->
context
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
int
pels
=
s
->
width
*
s
->
height
/
(
i
?
40
:
10
);
int
pels
=
s
->
width
*
s
->
height
/
(
i
?
40
:
10
);
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
{
int
d
=
FFMIN
(
j
,
s
->
n
-
j
);
int
d
=
FFMIN
(
j
,
s
->
vlc_
n
-
j
);
s
->
stats
[
i
][
j
]
=
pels
/
(
d
+
1
);
s
->
stats
[
i
][
j
]
=
pels
/
(
d
+
1
);
}
}
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
s
->
stats
[
i
][
j
]
=
0
;
s
->
stats
[
i
][
j
]
=
0
;
}
}
...
@@ -481,15 +489,26 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
...
@@ -481,15 +489,26 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
#define LOAD2\
#define LOAD2\
int y0 = s->temp[0][2 * i];\
int y0 = s->temp[0][2 * i];\
int y1 = s->temp[0][2 * i + 1];
int y1 = s->temp[0][2 * i + 1];
#define LOAD2_1
6
\
#define LOAD2_1
4
\
int y0 = s->temp16[0][2 * i] & mask;\
int y0 = s->temp16[0][2 * i] & mask;\
int y1 = s->temp16[0][2 * i + 1] & mask;
int y1 = s->temp16[0][2 * i + 1] & mask;
#define LOAD2_16\
int y0 = s->temp16[0][2 * i];\
int y1 = s->temp16[0][2 * i + 1];
#define STAT2\
#define STAT2\
s->stats[plane][y0]++;\
s->stats[plane][y0]++;\
s->stats[plane][y1]++;
s->stats[plane][y1]++;
#define STAT2_16\
s->stats[plane][y0>>2]++;\
s->stats[plane][y1>>2]++;
#define WRITE2\
#define WRITE2\
put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);\
put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);\
put_bits(&s->pb, s->len[plane][y1], s->bits[plane][y1]);
put_bits(&s->pb, s->len[plane][y1], s->bits[plane][y1]);
#define WRITE2_16\
put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
put_bits(&s->pb, 2, y0&3);\
put_bits(&s->pb, s->len[plane][y1>>2], s->bits[plane][y1>>2]);\
put_bits(&s->pb, 2, y1&3);
count
/=
2
;
count
/=
2
;
...
@@ -515,11 +534,11 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
...
@@ -515,11 +534,11 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
WRITE2
;
WRITE2
;
}
}
}
}
}
else
{
}
else
if
(
s
->
bps
<=
14
)
{
int
mask
=
s
->
n
-
1
;
int
mask
=
s
->
n
-
1
;
if
(
s
->
flags
&
CODEC_FLAG_PASS1
)
{
if
(
s
->
flags
&
CODEC_FLAG_PASS1
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
LOAD2_1
6
;
LOAD2_1
4
;
STAT2
;
STAT2
;
}
}
}
}
...
@@ -528,16 +547,38 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
...
@@ -528,16 +547,38 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
if
(
s
->
context
)
{
if
(
s
->
context
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
LOAD2_1
6
;
LOAD2_1
4
;
STAT2
;
STAT2
;
WRITE2
;
WRITE2
;
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
LOAD2_1
6
;
LOAD2_1
4
;
WRITE2
;
WRITE2
;
}
}
}
}
}
else
{
if
(
s
->
flags
&
CODEC_FLAG_PASS1
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
LOAD2_16
;
STAT2_16
;
}
}
if
(
s
->
avctx
->
flags2
&
CODEC_FLAG2_NO_OUTPUT
)
return
0
;
if
(
s
->
context
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
LOAD2_16
;
STAT2_16
;
WRITE2_16
;
}
}
else
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
LOAD2_16
;
WRITE2_16
;
}
}
}
}
#undef LOAD2
#undef LOAD2
#undef STAT2
#undef STAT2
...
@@ -663,7 +704,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -663,7 +704,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
return
size
;
return
size
;
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
s
->
stats
[
i
][
j
]
>>=
1
;
s
->
stats
[
i
][
j
]
>>=
1
;
}
}
...
@@ -899,7 +940,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -899,7 +940,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
char
*
p
=
avctx
->
stats_out
;
char
*
p
=
avctx
->
stats_out
;
char
*
end
=
p
+
1024
*
30
;
char
*
end
=
p
+
1024
*
30
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
j
=
0
;
j
<
s
->
n
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
vlc_
n
;
j
++
)
{
snprintf
(
p
,
end
-
p
,
"%"
PRIu64
" "
,
s
->
stats
[
i
][
j
]);
snprintf
(
p
,
end
-
p
,
"%"
PRIu64
" "
,
s
->
stats
[
i
][
j
]);
p
+=
strlen
(
p
);
p
+=
strlen
(
p
);
s
->
stats
[
i
][
j
]
=
0
;
s
->
stats
[
i
][
j
]
=
0
;
...
@@ -968,16 +1009,16 @@ AVCodec ff_ffvhuff_encoder = {
...
@@ -968,16 +1009,16 @@ AVCodec ff_ffvhuff_encoder = {
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV440P
,
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV440P
,
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_GRAY16
,
AV_PIX_FMT_YUVA420P
,
AV_PIX_FMT_YUVA422P
,
AV_PIX_FMT_YUVA444P
,
AV_PIX_FMT_YUVA420P
,
AV_PIX_FMT_YUVA422P
,
AV_PIX_FMT_YUVA444P
,
AV_PIX_FMT_GBRAP
,
AV_PIX_FMT_GBRAP
,
AV_PIX_FMT_GRAY8A
,
AV_PIX_FMT_GRAY8A
,
AV_PIX_FMT_YUV420P9
,
AV_PIX_FMT_YUV420P10
,
AV_PIX_FMT_YUV420P12
,
AV_PIX_FMT_YUV420P14
,
AV_PIX_FMT_YUV420P9
,
AV_PIX_FMT_YUV420P10
,
AV_PIX_FMT_YUV420P12
,
AV_PIX_FMT_YUV420P14
,
AV_PIX_FMT_YUV420P16
,
AV_PIX_FMT_YUV422P9
,
AV_PIX_FMT_YUV422P10
,
AV_PIX_FMT_YUV422P12
,
AV_PIX_FMT_YUV422P14
,
AV_PIX_FMT_YUV422P9
,
AV_PIX_FMT_YUV422P10
,
AV_PIX_FMT_YUV422P12
,
AV_PIX_FMT_YUV422P14
,
AV_PIX_FMT_YUV422P16
,
AV_PIX_FMT_YUV444P9
,
AV_PIX_FMT_YUV444P10
,
AV_PIX_FMT_YUV444P12
,
AV_PIX_FMT_YUV444P14
,
AV_PIX_FMT_YUV444P9
,
AV_PIX_FMT_YUV444P10
,
AV_PIX_FMT_YUV444P12
,
AV_PIX_FMT_YUV444P14
,
AV_PIX_FMT_YUV444P16
,
AV_PIX_FMT_YUVA420P9
,
AV_PIX_FMT_YUVA420P10
,
AV_PIX_FMT_YUVA420P9
,
AV_PIX_FMT_YUVA420P10
,
AV_PIX_FMT_YUVA420P16
,
AV_PIX_FMT_YUVA422P9
,
AV_PIX_FMT_YUVA422P10
,
AV_PIX_FMT_YUVA422P9
,
AV_PIX_FMT_YUVA422P10
,
AV_PIX_FMT_YUVA422P16
,
AV_PIX_FMT_YUVA444P9
,
AV_PIX_FMT_YUVA444P10
,
AV_PIX_FMT_YUVA444P9
,
AV_PIX_FMT_YUVA444P10
,
AV_PIX_FMT_YUVA444P16
,
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_RGB32
,
AV_PIX_FMT_NONE
AV_PIX_FMT_RGB32
,
AV_PIX_FMT_NONE
},
},
...
...
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