Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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
Hide 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