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
cf9ef839
Commit
cf9ef839
authored
Jan 08, 2017
by
James Almer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
huffyuvencdsp: move shared functions to a new lossless_videoencdsp context
Signed-off-by:
James Almer
<
jamrial@gmail.com
>
parent
30c1f272
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
378 additions
and
242 deletions
+378
-242
configure
configure
+5
-4
Makefile
libavcodec/Makefile
+1
-0
huffyuv.h
libavcodec/huffyuv.h
+2
-0
huffyuvenc.c
libavcodec/huffyuvenc.c
+20
-18
huffyuvencdsp.c
libavcodec/huffyuvencdsp.c
+0
-55
huffyuvencdsp.h
libavcodec/huffyuvencdsp.h
+0
-11
lossless_videoencdsp.c
libavcodec/lossless_videoencdsp.c
+84
-0
lossless_videoencdsp.h
libavcodec/lossless_videoencdsp.h
+41
-0
pngenc.c
libavcodec/pngenc.c
+5
-5
utvideo.h
libavcodec/utvideo.h
+2
-2
utvideoenc.c
libavcodec/utvideoenc.c
+2
-3
Makefile
libavcodec/x86/Makefile
+3
-1
huffyuvencdsp.asm
libavcodec/x86/huffyuvencdsp.asm
+2
-122
huffyuvencdsp_init.c
libavcodec/x86/huffyuvencdsp_init.c
+54
-0
lossless_videoencdsp.asm
libavcodec/x86/lossless_videoencdsp.asm
+150
-0
lossless_videoencdsp_init.c
libavcodec/x86/lossless_videoencdsp_init.c
+7
-21
No files found.
configure
View file @
cf9ef839
...
@@ -2115,6 +2115,7 @@ CONFIG_EXTRA="
...
@@ -2115,6 +2115,7 @@ CONFIG_EXTRA="
libx262
libx262
llauddsp
llauddsp
llviddsp
llviddsp
llvidencdsp
lpc
lpc
lzf
lzf
me_cmp
me_cmp
...
@@ -2366,7 +2367,7 @@ amv_decoder_select="sp5x_decoder exif"
...
@@ -2366,7 +2367,7 @@ amv_decoder_select="sp5x_decoder exif"
amv_encoder_select
=
"aandcttables jpegtables mpegvideoenc"
amv_encoder_select
=
"aandcttables jpegtables mpegvideoenc"
ape_decoder_select
=
"bswapdsp llauddsp"
ape_decoder_select
=
"bswapdsp llauddsp"
apng_decoder_select
=
"zlib"
apng_decoder_select
=
"zlib"
apng_encoder_select
=
"
huffyuv
encdsp zlib"
apng_encoder_select
=
"
llvid
encdsp zlib"
asv1_decoder_select
=
"blockdsp bswapdsp idctdsp"
asv1_decoder_select
=
"blockdsp bswapdsp idctdsp"
asv1_encoder_select
=
"bswapdsp fdctdsp pixblockdsp"
asv1_encoder_select
=
"bswapdsp fdctdsp pixblockdsp"
asv2_decoder_select
=
"blockdsp bswapdsp idctdsp"
asv2_decoder_select
=
"blockdsp bswapdsp idctdsp"
...
@@ -2430,7 +2431,7 @@ hap_encoder_deps="libsnappy"
...
@@ -2430,7 +2431,7 @@ hap_encoder_deps="libsnappy"
hap_encoder_select
=
"texturedspenc"
hap_encoder_select
=
"texturedspenc"
hevc_decoder_select
=
"bswapdsp cabac golomb videodsp"
hevc_decoder_select
=
"bswapdsp cabac golomb videodsp"
huffyuv_decoder_select
=
"bswapdsp huffyuvdsp llviddsp"
huffyuv_decoder_select
=
"bswapdsp huffyuvdsp llviddsp"
huffyuv_encoder_select
=
"bswapdsp huffman huffyuvencdsp"
huffyuv_encoder_select
=
"bswapdsp huffman huffyuvencdsp
llvidencdsp
"
iac_decoder_select
=
"imc_decoder"
iac_decoder_select
=
"imc_decoder"
imc_decoder_select
=
"bswapdsp fft mdct sinewin"
imc_decoder_select
=
"bswapdsp fft mdct sinewin"
indeo3_decoder_select
=
"hpeldsp"
indeo3_decoder_select
=
"hpeldsp"
...
@@ -2491,7 +2492,7 @@ on2avc_decoder_select="mdct"
...
@@ -2491,7 +2492,7 @@ on2avc_decoder_select="mdct"
opus_decoder_deps
=
"swresample"
opus_decoder_deps
=
"swresample"
opus_decoder_select
=
"imdct15"
opus_decoder_select
=
"imdct15"
png_decoder_select
=
"zlib"
png_decoder_select
=
"zlib"
png_encoder_select
=
"
huffyuv
encdsp zlib"
png_encoder_select
=
"
llvid
encdsp zlib"
prores_decoder_select
=
"blockdsp idctdsp"
prores_decoder_select
=
"blockdsp idctdsp"
prores_encoder_select
=
"fdctdsp"
prores_encoder_select
=
"fdctdsp"
qcelp_decoder_select
=
"lsp"
qcelp_decoder_select
=
"lsp"
...
@@ -2534,7 +2535,7 @@ tscc_decoder_select="zlib"
...
@@ -2534,7 +2535,7 @@ tscc_decoder_select="zlib"
twinvq_decoder_select
=
"mdct lsp sinewin"
twinvq_decoder_select
=
"mdct lsp sinewin"
txd_decoder_select
=
"texturedsp"
txd_decoder_select
=
"texturedsp"
utvideo_decoder_select
=
"bswapdsp llviddsp"
utvideo_decoder_select
=
"bswapdsp llviddsp"
utvideo_encoder_select
=
"bswapdsp huffman
huffyuv
encdsp"
utvideo_encoder_select
=
"bswapdsp huffman
llvid
encdsp"
vble_decoder_select
=
"llviddsp"
vble_decoder_select
=
"llviddsp"
vc1_decoder_select
=
"blockdsp h263_decoder h264qpel intrax8 mpegvideo vc1dsp"
vc1_decoder_select
=
"blockdsp h263_decoder h264qpel intrax8 mpegvideo vc1dsp"
vc1_qsv_decoder_deps
=
"libmfx"
vc1_qsv_decoder_deps
=
"libmfx"
...
...
libavcodec/Makefile
View file @
cf9ef839
...
@@ -91,6 +91,7 @@ OBJS-$(CONFIG_JPEGTABLES) += jpegtables.o
...
@@ -91,6 +91,7 @@ OBJS-$(CONFIG_JPEGTABLES) += jpegtables.o
OBJS-$(CONFIG_LIBXVID)
+=
libxvid_rc.o
OBJS-$(CONFIG_LIBXVID)
+=
libxvid_rc.o
OBJS-$(CONFIG_LLAUDDSP)
+=
lossless_audiodsp.o
OBJS-$(CONFIG_LLAUDDSP)
+=
lossless_audiodsp.o
OBJS-$(CONFIG_LLVIDDSP)
+=
lossless_videodsp.o
OBJS-$(CONFIG_LLVIDDSP)
+=
lossless_videodsp.o
OBJS-$(CONFIG_LLVIDENCDSP)
+=
lossless_videoencdsp.o
OBJS-$(CONFIG_LPC)
+=
lpc.o
OBJS-$(CONFIG_LPC)
+=
lpc.o
OBJS-$(CONFIG_LSP)
+=
lsp.o
OBJS-$(CONFIG_LSP)
+=
lsp.o
OBJS-$(CONFIG_LZF)
+=
lzf.o
OBJS-$(CONFIG_LZF)
+=
lzf.o
...
...
libavcodec/huffyuv.h
View file @
cf9ef839
...
@@ -38,6 +38,7 @@
...
@@ -38,6 +38,7 @@
#include "huffyuvencdsp.h"
#include "huffyuvencdsp.h"
#include "put_bits.h"
#include "put_bits.h"
#include "lossless_videodsp.h"
#include "lossless_videodsp.h"
#include "lossless_videoencdsp.h"
#define VLC_BITS 12
#define VLC_BITS 12
...
@@ -89,6 +90,7 @@ typedef struct HYuvContext {
...
@@ -89,6 +90,7 @@ typedef struct HYuvContext {
HuffYUVDSPContext
hdsp
;
HuffYUVDSPContext
hdsp
;
HuffYUVEncDSPContext
hencdsp
;
HuffYUVEncDSPContext
hencdsp
;
LLVidDSPContext
llviddsp
;
LLVidDSPContext
llviddsp
;
LLVidEncDSPContext
llvidencdsp
;
int
non_determ
;
// non-deterministic, multi-threaded encoder allowed
int
non_determ
;
// non-deterministic, multi-threaded encoder allowed
}
HYuvContext
;
}
HYuvContext
;
...
...
libavcodec/huffyuvenc.c
View file @
cf9ef839
...
@@ -33,6 +33,7 @@
...
@@ -33,6 +33,7 @@
#include "huffman.h"
#include "huffman.h"
#include "huffyuvencdsp.h"
#include "huffyuvencdsp.h"
#include "internal.h"
#include "internal.h"
#include "lossless_videoencdsp.h"
#include "put_bits.h"
#include "put_bits.h"
#include "libavutil/opt.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixdesc.h"
...
@@ -41,7 +42,7 @@ static inline void diff_bytes(HYuvContext *s, uint8_t *dst,
...
@@ -41,7 +42,7 @@ static inline void diff_bytes(HYuvContext *s, uint8_t *dst,
const
uint8_t
*
src0
,
const
uint8_t
*
src1
,
int
w
)
const
uint8_t
*
src0
,
const
uint8_t
*
src1
,
int
w
)
{
{
if
(
s
->
bps
<=
8
)
{
if
(
s
->
bps
<=
8
)
{
s
->
h
encdsp
.
diff_bytes
(
dst
,
src0
,
src1
,
w
);
s
->
llvid
encdsp
.
diff_bytes
(
dst
,
src0
,
src1
,
w
);
}
else
{
}
else
{
s
->
hencdsp
.
diff_int16
((
uint16_t
*
)
dst
,
(
const
uint16_t
*
)
src0
,
(
const
uint16_t
*
)
src1
,
s
->
n
-
1
,
w
);
s
->
hencdsp
.
diff_int16
((
uint16_t
*
)
dst
,
(
const
uint16_t
*
)
src0
,
(
const
uint16_t
*
)
src1
,
s
->
n
-
1
,
w
);
}
}
...
@@ -65,7 +66,7 @@ static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst,
...
@@ -65,7 +66,7 @@ static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst,
dst
[
i
]
=
temp
-
left
;
dst
[
i
]
=
temp
-
left
;
left
=
temp
;
left
=
temp
;
}
}
s
->
h
encdsp
.
diff_bytes
(
dst
+
32
,
src
+
32
,
src
+
31
,
w
-
32
);
s
->
llvid
encdsp
.
diff_bytes
(
dst
+
32
,
src
+
32
,
src
+
31
,
w
-
32
);
return
src
[
w
-
1
];
return
src
[
w
-
1
];
}
}
}
else
{
}
else
{
...
@@ -117,7 +118,7 @@ static inline void sub_left_prediction_bgr32(HYuvContext *s, uint8_t *dst,
...
@@ -117,7 +118,7 @@ static inline void sub_left_prediction_bgr32(HYuvContext *s, uint8_t *dst,
a
=
at
;
a
=
at
;
}
}
s
->
h
encdsp
.
diff_bytes
(
dst
+
16
,
src
+
16
,
src
+
12
,
w
*
4
-
16
);
s
->
llvid
encdsp
.
diff_bytes
(
dst
+
16
,
src
+
16
,
src
+
12
,
w
*
4
-
16
);
*
red
=
src
[(
w
-
1
)
*
4
+
R
];
*
red
=
src
[(
w
-
1
)
*
4
+
R
];
*
green
=
src
[(
w
-
1
)
*
4
+
G
];
*
green
=
src
[(
w
-
1
)
*
4
+
G
];
...
@@ -146,7 +147,7 @@ static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst,
...
@@ -146,7 +147,7 @@ static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst,
b
=
bt
;
b
=
bt
;
}
}
s
->
h
encdsp
.
diff_bytes
(
dst
+
48
,
src
+
48
,
src
+
48
-
3
,
w
*
3
-
48
);
s
->
llvid
encdsp
.
diff_bytes
(
dst
+
48
,
src
+
48
,
src
+
48
-
3
,
w
*
3
-
48
);
*
red
=
src
[(
w
-
1
)
*
3
+
0
];
*
red
=
src
[(
w
-
1
)
*
3
+
0
];
*
green
=
src
[(
w
-
1
)
*
3
+
1
];
*
green
=
src
[(
w
-
1
)
*
3
+
1
];
...
@@ -156,7 +157,7 @@ static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst,
...
@@ -156,7 +157,7 @@ static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst,
static
void
sub_median_prediction
(
HYuvContext
*
s
,
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
int
w
,
int
*
left
,
int
*
left_top
)
static
void
sub_median_prediction
(
HYuvContext
*
s
,
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
int
w
,
int
*
left
,
int
*
left_top
)
{
{
if
(
s
->
bps
<=
8
)
{
if
(
s
->
bps
<=
8
)
{
s
->
hencdsp
.
sub_hfyu
_median_pred
(
dst
,
src1
,
src2
,
w
,
left
,
left_top
);
s
->
llvidencdsp
.
sub
_median_pred
(
dst
,
src1
,
src2
,
w
,
left
,
left_top
);
}
else
{
}
else
{
s
->
hencdsp
.
sub_hfyu_median_pred_int16
((
uint16_t
*
)
dst
,
(
const
uint16_t
*
)
src1
,
(
const
uint16_t
*
)
src2
,
s
->
n
-
1
,
w
,
left
,
left_top
);
s
->
hencdsp
.
sub_hfyu_median_pred_int16
((
uint16_t
*
)
dst
,
(
const
uint16_t
*
)
src1
,
(
const
uint16_t
*
)
src2
,
s
->
n
-
1
,
w
,
left
,
left_top
);
}
}
...
@@ -218,6 +219,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
...
@@ -218,6 +219,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
ff_huffyuv_common_init
(
avctx
);
ff_huffyuv_common_init
(
avctx
);
ff_huffyuvencdsp_init
(
&
s
->
hencdsp
,
avctx
);
ff_huffyuvencdsp_init
(
&
s
->
hencdsp
,
avctx
);
ff_llvidencdsp_init
(
&
s
->
llvidencdsp
);
avctx
->
extradata
=
av_mallocz
(
3
*
MAX_N
+
4
);
avctx
->
extradata
=
av_mallocz
(
3
*
MAX_N
+
4
);
if
(
s
->
flags
&
AV_CODEC_FLAG_PASS1
)
{
if
(
s
->
flags
&
AV_CODEC_FLAG_PASS1
)
{
...
@@ -823,9 +825,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -823,9 +825,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
lefttopy
=
p
->
data
[
0
][
3
];
lefttopy
=
p
->
data
[
0
][
3
];
lefttopu
=
p
->
data
[
1
][
1
];
lefttopu
=
p
->
data
[
1
][
1
];
lefttopv
=
p
->
data
[
2
][
1
];
lefttopv
=
p
->
data
[
2
][
1
];
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
0
],
p
->
data
[
0
]
+
4
,
p
->
data
[
0
]
+
fake_ystride
+
4
,
width
-
4
,
&
lefty
,
&
lefttopy
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
0
],
p
->
data
[
0
]
+
4
,
p
->
data
[
0
]
+
fake_ystride
+
4
,
width
-
4
,
&
lefty
,
&
lefttopy
);
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
1
],
p
->
data
[
1
]
+
2
,
p
->
data
[
1
]
+
fake_ustride
+
2
,
width2
-
2
,
&
leftu
,
&
lefttopu
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
1
],
p
->
data
[
1
]
+
2
,
p
->
data
[
1
]
+
fake_ustride
+
2
,
width2
-
2
,
&
leftu
,
&
lefttopu
);
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
2
],
p
->
data
[
2
]
+
2
,
p
->
data
[
2
]
+
fake_vstride
+
2
,
width2
-
2
,
&
leftv
,
&
lefttopv
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
2
],
p
->
data
[
2
]
+
2
,
p
->
data
[
2
]
+
fake_vstride
+
2
,
width2
-
2
,
&
leftv
,
&
lefttopv
);
encode_422_bitstream
(
s
,
0
,
width
-
4
);
encode_422_bitstream
(
s
,
0
,
width
-
4
);
y
++
;
cy
++
;
y
++
;
cy
++
;
...
@@ -835,7 +837,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -835,7 +837,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
if
(
s
->
bitstream_bpp
==
12
)
{
if
(
s
->
bitstream_bpp
==
12
)
{
while
(
2
*
cy
>
y
)
{
while
(
2
*
cy
>
y
)
{
ydst
=
p
->
data
[
0
]
+
p
->
linesize
[
0
]
*
y
;
ydst
=
p
->
data
[
0
]
+
p
->
linesize
[
0
]
*
y
;
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
0
],
ydst
-
fake_ystride
,
ydst
,
width
,
&
lefty
,
&
lefttopy
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
0
],
ydst
-
fake_ystride
,
ydst
,
width
,
&
lefty
,
&
lefttopy
);
encode_gray_bitstream
(
s
,
width
);
encode_gray_bitstream
(
s
,
width
);
y
++
;
y
++
;
}
}
...
@@ -845,9 +847,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -845,9 +847,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
udst
=
p
->
data
[
1
]
+
p
->
linesize
[
1
]
*
cy
;
udst
=
p
->
data
[
1
]
+
p
->
linesize
[
1
]
*
cy
;
vdst
=
p
->
data
[
2
]
+
p
->
linesize
[
2
]
*
cy
;
vdst
=
p
->
data
[
2
]
+
p
->
linesize
[
2
]
*
cy
;
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
0
],
ydst
-
fake_ystride
,
ydst
,
width
,
&
lefty
,
&
lefttopy
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
0
],
ydst
-
fake_ystride
,
ydst
,
width
,
&
lefty
,
&
lefttopy
);
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
1
],
udst
-
fake_ustride
,
udst
,
width2
,
&
leftu
,
&
lefttopu
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
1
],
udst
-
fake_ustride
,
udst
,
width2
,
&
leftu
,
&
lefttopu
);
s
->
hencdsp
.
sub_hfyu
_median_pred
(
s
->
temp
[
2
],
vdst
-
fake_vstride
,
vdst
,
width2
,
&
leftv
,
&
lefttopv
);
s
->
llvidencdsp
.
sub
_median_pred
(
s
->
temp
[
2
],
vdst
-
fake_vstride
,
vdst
,
width2
,
&
leftv
,
&
lefttopv
);
encode_422_bitstream
(
s
,
0
,
width
);
encode_422_bitstream
(
s
,
0
,
width
);
}
}
...
@@ -860,7 +862,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -860,7 +862,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
ydst
=
p
->
data
[
0
]
+
p
->
linesize
[
0
]
*
y
;
ydst
=
p
->
data
[
0
]
+
p
->
linesize
[
0
]
*
y
;
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
y
)
{
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
y
)
{
s
->
h
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
ydst
,
ydst
-
fake_ystride
,
width
);
s
->
llvid
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
ydst
,
ydst
-
fake_ystride
,
width
);
lefty
=
sub_left_prediction
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
lefty
);
lefty
=
sub_left_prediction
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
lefty
);
}
else
{
}
else
{
...
@@ -876,9 +878,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -876,9 +878,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
vdst
=
p
->
data
[
2
]
+
p
->
linesize
[
2
]
*
cy
;
vdst
=
p
->
data
[
2
]
+
p
->
linesize
[
2
]
*
cy
;
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
cy
)
{
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
cy
)
{
s
->
h
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
ydst
,
ydst
-
fake_ystride
,
width
);
s
->
llvid
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
ydst
,
ydst
-
fake_ystride
,
width
);
s
->
h
encdsp
.
diff_bytes
(
s
->
temp
[
2
],
udst
,
udst
-
fake_ustride
,
width2
);
s
->
llvid
encdsp
.
diff_bytes
(
s
->
temp
[
2
],
udst
,
udst
-
fake_ustride
,
width2
);
s
->
h
encdsp
.
diff_bytes
(
s
->
temp
[
2
]
+
width2
,
vdst
,
vdst
-
fake_vstride
,
width2
);
s
->
llvid
encdsp
.
diff_bytes
(
s
->
temp
[
2
]
+
width2
,
vdst
,
vdst
-
fake_vstride
,
width2
);
lefty
=
sub_left_prediction
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
lefty
);
lefty
=
sub_left_prediction
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
lefty
);
leftu
=
sub_left_prediction
(
s
,
s
->
temp
[
1
],
s
->
temp
[
2
],
width2
,
leftu
);
leftu
=
sub_left_prediction
(
s
,
s
->
temp
[
1
],
s
->
temp
[
2
],
width2
,
leftu
);
...
@@ -911,7 +913,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -911,7 +913,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
for
(
y
=
1
;
y
<
s
->
height
;
y
++
)
{
for
(
y
=
1
;
y
<
s
->
height
;
y
++
)
{
uint8_t
*
dst
=
data
+
y
*
stride
;
uint8_t
*
dst
=
data
+
y
*
stride
;
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
y
)
{
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
y
)
{
s
->
h
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
dst
,
dst
-
fake_stride
,
width
*
4
);
s
->
llvid
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
dst
,
dst
-
fake_stride
,
width
*
4
);
sub_left_prediction_bgr32
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
sub_left_prediction_bgr32
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
&
leftr
,
&
leftg
,
&
leftb
,
&
lefta
);
&
leftr
,
&
leftg
,
&
leftb
,
&
lefta
);
}
else
{
}
else
{
...
@@ -939,7 +941,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -939,7 +941,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
for
(
y
=
1
;
y
<
s
->
height
;
y
++
)
{
for
(
y
=
1
;
y
<
s
->
height
;
y
++
)
{
uint8_t
*
dst
=
data
+
y
*
stride
;
uint8_t
*
dst
=
data
+
y
*
stride
;
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
y
)
{
if
(
s
->
predictor
==
PLANE
&&
s
->
interlaced
<
y
)
{
s
->
h
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
dst
,
dst
-
fake_stride
,
s
->
llvid
encdsp
.
diff_bytes
(
s
->
temp
[
1
],
dst
,
dst
-
fake_stride
,
width
*
3
);
width
*
3
);
sub_left_prediction_rgb24
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
sub_left_prediction_rgb24
(
s
,
s
->
temp
[
0
],
s
->
temp
[
1
],
width
,
&
leftr
,
&
leftg
,
&
leftb
);
&
leftr
,
&
leftg
,
&
leftb
);
...
...
libavcodec/huffyuvencdsp.c
View file @
cf9ef839
...
@@ -21,38 +21,6 @@
...
@@ -21,38 +21,6 @@
#include "huffyuvencdsp.h"
#include "huffyuvencdsp.h"
#include "mathops.h"
#include "mathops.h"
// 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
#define pb_7f (~0UL / 255 * 0x7f)
#define pb_80 (~0UL / 255 * 0x80)
static
void
diff_bytes_c
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
)
{
long
i
;
#if !HAVE_FAST_UNALIGNED
if
(((
long
)
src1
|
(
long
)
src2
)
&
(
sizeof
(
long
)
-
1
))
{
for
(
i
=
0
;
i
+
7
<
w
;
i
+=
8
)
{
dst
[
i
+
0
]
=
src1
[
i
+
0
]
-
src2
[
i
+
0
];
dst
[
i
+
1
]
=
src1
[
i
+
1
]
-
src2
[
i
+
1
];
dst
[
i
+
2
]
=
src1
[
i
+
2
]
-
src2
[
i
+
2
];
dst
[
i
+
3
]
=
src1
[
i
+
3
]
-
src2
[
i
+
3
];
dst
[
i
+
4
]
=
src1
[
i
+
4
]
-
src2
[
i
+
4
];
dst
[
i
+
5
]
=
src1
[
i
+
5
]
-
src2
[
i
+
5
];
dst
[
i
+
6
]
=
src1
[
i
+
6
]
-
src2
[
i
+
6
];
dst
[
i
+
7
]
=
src1
[
i
+
7
]
-
src2
[
i
+
7
];
}
}
else
#endif
for
(
i
=
0
;
i
<=
w
-
(
int
)
sizeof
(
long
);
i
+=
sizeof
(
long
))
{
long
a
=
*
(
long
*
)
(
src1
+
i
);
long
b
=
*
(
long
*
)
(
src2
+
i
);
*
(
long
*
)
(
dst
+
i
)
=
((
a
|
pb_80
)
-
(
b
&
pb_7f
))
^
((
a
^
b
^
pb_80
)
&
pb_80
);
}
for
(;
i
<
w
;
i
++
)
dst
[
i
+
0
]
=
src1
[
i
+
0
]
-
src2
[
i
+
0
];
}
static
void
diff_int16_c
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
){
static
void
diff_int16_c
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
){
long
i
;
long
i
;
#if !HAVE_FAST_UNALIGNED
#if !HAVE_FAST_UNALIGNED
...
@@ -79,27 +47,6 @@ static void diff_int16_c(uint16_t *dst, const uint16_t *src1, const uint16_t *sr
...
@@ -79,27 +47,6 @@ static void diff_int16_c(uint16_t *dst, const uint16_t *src1, const uint16_t *sr
dst
[
i
]
=
(
src1
[
i
]
-
src2
[
i
])
&
mask
;
dst
[
i
]
=
(
src1
[
i
]
-
src2
[
i
])
&
mask
;
}
}
static
void
sub_hfyu_median_pred_c
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
,
int
*
left
,
int
*
left_top
)
{
int
i
;
uint8_t
l
,
lt
;
l
=
*
left
;
lt
=
*
left_top
;
for
(
i
=
0
;
i
<
w
;
i
++
)
{
const
int
pred
=
mid_pred
(
l
,
src1
[
i
],
(
l
+
src1
[
i
]
-
lt
)
&
0xFF
);
lt
=
src1
[
i
];
l
=
src2
[
i
];
dst
[
i
]
=
l
-
pred
;
}
*
left
=
l
;
*
left_top
=
lt
;
}
static
void
sub_hfyu_median_pred_int16_c
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
,
int
*
left
,
int
*
left_top
){
static
void
sub_hfyu_median_pred_int16_c
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
,
int
*
left
,
int
*
left_top
){
int
i
;
int
i
;
uint16_t
l
,
lt
;
uint16_t
l
,
lt
;
...
@@ -120,9 +67,7 @@ static void sub_hfyu_median_pred_int16_c(uint16_t *dst, const uint16_t *src1, co
...
@@ -120,9 +67,7 @@ static void sub_hfyu_median_pred_int16_c(uint16_t *dst, const uint16_t *src1, co
av_cold
void
ff_huffyuvencdsp_init
(
HuffYUVEncDSPContext
*
c
,
AVCodecContext
*
avctx
)
av_cold
void
ff_huffyuvencdsp_init
(
HuffYUVEncDSPContext
*
c
,
AVCodecContext
*
avctx
)
{
{
c
->
diff_bytes
=
diff_bytes_c
;
c
->
diff_int16
=
diff_int16_c
;
c
->
diff_int16
=
diff_int16_c
;
c
->
sub_hfyu_median_pred
=
sub_hfyu_median_pred_c
;
c
->
sub_hfyu_median_pred_int16
=
sub_hfyu_median_pred_int16_c
;
c
->
sub_hfyu_median_pred_int16
=
sub_hfyu_median_pred_int16_c
;
if
(
ARCH_X86
)
if
(
ARCH_X86
)
...
...
libavcodec/huffyuvencdsp.h
View file @
cf9ef839
...
@@ -24,22 +24,11 @@
...
@@ -24,22 +24,11 @@
#include "avcodec.h"
#include "avcodec.h"
typedef
struct
HuffYUVEncDSPContext
{
typedef
struct
HuffYUVEncDSPContext
{
void
(
*
diff_bytes
)(
uint8_t
*
dst
/* align 16 */
,
const
uint8_t
*
src1
/* align 16 */
,
const
uint8_t
*
src2
/* align 1 */
,
intptr_t
w
);
void
(
*
diff_int16
)(
uint16_t
*
dst
/* align 16 */
,
void
(
*
diff_int16
)(
uint16_t
*
dst
/* align 16 */
,
const
uint16_t
*
src1
/* align 16 */
,
const
uint16_t
*
src1
/* align 16 */
,
const
uint16_t
*
src2
/* align 1 */
,
const
uint16_t
*
src2
/* align 1 */
,
unsigned
mask
,
int
w
);
unsigned
mask
,
int
w
);
/**
* Subtract HuffYUV's variant of median prediction.
* Note, this might read from src1[-1], src2[-1].
*/
void
(
*
sub_hfyu_median_pred
)(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
,
int
*
left
,
int
*
left_top
);
void
(
*
sub_hfyu_median_pred_int16
)(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
void
(
*
sub_hfyu_median_pred_int16
)(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
,
int
*
left
,
int
*
left_top
);
int
w
,
int
*
left
,
int
*
left_top
);
...
...
libavcodec/lossless_videoencdsp.c
0 → 100644
View file @
cf9ef839
/*
* 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 "config.h"
#include "libavutil/attributes.h"
#include "lossless_videoencdsp.h"
#include "mathops.h"
// 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
#define pb_7f (~0UL / 255 * 0x7f)
#define pb_80 (~0UL / 255 * 0x80)
static
void
diff_bytes_c
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
)
{
long
i
;
#if !HAVE_FAST_UNALIGNED
if
(((
long
)
src1
|
(
long
)
src2
)
&
(
sizeof
(
long
)
-
1
))
{
for
(
i
=
0
;
i
+
7
<
w
;
i
+=
8
)
{
dst
[
i
+
0
]
=
src1
[
i
+
0
]
-
src2
[
i
+
0
];
dst
[
i
+
1
]
=
src1
[
i
+
1
]
-
src2
[
i
+
1
];
dst
[
i
+
2
]
=
src1
[
i
+
2
]
-
src2
[
i
+
2
];
dst
[
i
+
3
]
=
src1
[
i
+
3
]
-
src2
[
i
+
3
];
dst
[
i
+
4
]
=
src1
[
i
+
4
]
-
src2
[
i
+
4
];
dst
[
i
+
5
]
=
src1
[
i
+
5
]
-
src2
[
i
+
5
];
dst
[
i
+
6
]
=
src1
[
i
+
6
]
-
src2
[
i
+
6
];
dst
[
i
+
7
]
=
src1
[
i
+
7
]
-
src2
[
i
+
7
];
}
}
else
#endif
for
(
i
=
0
;
i
<=
w
-
(
int
)
sizeof
(
long
);
i
+=
sizeof
(
long
))
{
long
a
=
*
(
long
*
)
(
src1
+
i
);
long
b
=
*
(
long
*
)
(
src2
+
i
);
*
(
long
*
)
(
dst
+
i
)
=
((
a
|
pb_80
)
-
(
b
&
pb_7f
))
^
((
a
^
b
^
pb_80
)
&
pb_80
);
}
for
(;
i
<
w
;
i
++
)
dst
[
i
+
0
]
=
src1
[
i
+
0
]
-
src2
[
i
+
0
];
}
static
void
sub_median_pred_c
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
,
int
*
left
,
int
*
left_top
)
{
int
i
;
uint8_t
l
,
lt
;
l
=
*
left
;
lt
=
*
left_top
;
for
(
i
=
0
;
i
<
w
;
i
++
)
{
const
int
pred
=
mid_pred
(
l
,
src1
[
i
],
(
l
+
src1
[
i
]
-
lt
)
&
0xFF
);
lt
=
src1
[
i
];
l
=
src2
[
i
];
dst
[
i
]
=
l
-
pred
;
}
*
left
=
l
;
*
left_top
=
lt
;
}
av_cold
void
ff_llvidencdsp_init
(
LLVidEncDSPContext
*
c
)
{
c
->
diff_bytes
=
diff_bytes_c
;
c
->
sub_median_pred
=
sub_median_pred_c
;
if
(
ARCH_X86
)
ff_llvidencdsp_init_x86
(
c
);
}
libavcodec/lossless_videoencdsp.h
0 → 100644
View file @
cf9ef839
/*
* 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
*/
#ifndef AVCODEC_LOSSLESS_VIDEOENCDSP_H
#define AVCODEC_LOSSLESS_VIDEOENCDSP_H
#include <stdint.h>
typedef
struct
LLVidEncDSPContext
{
void
(
*
diff_bytes
)(
uint8_t
*
dst
/* align 16 */
,
const
uint8_t
*
src1
/* align 16 */
,
const
uint8_t
*
src2
/* align 1 */
,
intptr_t
w
);
/**
* Subtract HuffYUV's variant of median prediction.
* Note, this might read from src1[-1], src2[-1].
*/
void
(
*
sub_median_pred
)(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
,
int
*
left
,
int
*
left_top
);
}
LLVidEncDSPContext
;
void
ff_llvidencdsp_init
(
LLVidEncDSPContext
*
c
);
void
ff_llvidencdsp_init_x86
(
LLVidEncDSPContext
*
c
);
#endif
/* AVCODEC_LOSSLESS_VIDEOENCDSP_H */
libavcodec/pngenc.c
View file @
cf9ef839
...
@@ -22,7 +22,7 @@
...
@@ -22,7 +22,7 @@
#include "avcodec.h"
#include "avcodec.h"
#include "internal.h"
#include "internal.h"
#include "bytestream.h"
#include "bytestream.h"
#include "
huffyuv
encdsp.h"
#include "
lossless_video
encdsp.h"
#include "png.h"
#include "png.h"
#include "apng.h"
#include "apng.h"
...
@@ -47,7 +47,7 @@ typedef struct APNGFctlChunk {
...
@@ -47,7 +47,7 @@ typedef struct APNGFctlChunk {
typedef
struct
PNGEncContext
{
typedef
struct
PNGEncContext
{
AVClass
*
class
;
AVClass
*
class
;
HuffYUVEncDSPContext
h
dsp
;
LLVidEncDSPContext
llvidenc
dsp
;
uint8_t
*
bytestream
;
uint8_t
*
bytestream
;
uint8_t
*
bytestream_start
;
uint8_t
*
bytestream_start
;
...
@@ -159,7 +159,7 @@ static void sub_left_prediction(PNGEncContext *c, uint8_t *dst, const uint8_t *s
...
@@ -159,7 +159,7 @@ static void sub_left_prediction(PNGEncContext *c, uint8_t *dst, const uint8_t *s
for
(
x
=
0
;
x
<
unaligned_w
;
x
++
)
for
(
x
=
0
;
x
<
unaligned_w
;
x
++
)
*
dst
++
=
*
src1
++
-
*
src2
++
;
*
dst
++
=
*
src1
++
-
*
src2
++
;
size
-=
unaligned_w
;
size
-=
unaligned_w
;
c
->
h
dsp
.
diff_bytes
(
dst
,
src1
,
src2
,
size
);
c
->
llvidenc
dsp
.
diff_bytes
(
dst
,
src1
,
src2
,
size
);
}
}
static
void
png_filter_row
(
PNGEncContext
*
c
,
uint8_t
*
dst
,
int
filter_type
,
static
void
png_filter_row
(
PNGEncContext
*
c
,
uint8_t
*
dst
,
int
filter_type
,
...
@@ -175,7 +175,7 @@ static void png_filter_row(PNGEncContext *c, uint8_t *dst, int filter_type,
...
@@ -175,7 +175,7 @@ static void png_filter_row(PNGEncContext *c, uint8_t *dst, int filter_type,
sub_left_prediction
(
c
,
dst
,
src
,
bpp
,
size
);
sub_left_prediction
(
c
,
dst
,
src
,
bpp
,
size
);
break
;
break
;
case
PNG_FILTER_VALUE_UP
:
case
PNG_FILTER_VALUE_UP
:
c
->
h
dsp
.
diff_bytes
(
dst
,
src
,
top
,
size
);
c
->
llvidenc
dsp
.
diff_bytes
(
dst
,
src
,
top
,
size
);
break
;
break
;
case
PNG_FILTER_VALUE_AVG
:
case
PNG_FILTER_VALUE_AVG
:
for
(
i
=
0
;
i
<
bpp
;
i
++
)
for
(
i
=
0
;
i
<
bpp
;
i
++
)
...
@@ -1015,7 +1015,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
...
@@ -1015,7 +1015,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
FF_ENABLE_DEPRECATION_WARNINGS
FF_ENABLE_DEPRECATION_WARNINGS
#endif
#endif
ff_
huffyuvencdsp_init
(
&
s
->
hdsp
,
avctx
);
ff_
llvidencdsp_init
(
&
s
->
llvidencdsp
);
#if FF_API_PRIVATE_OPT
#if FF_API_PRIVATE_OPT
FF_DISABLE_DEPRECATION_WARNINGS
FF_DISABLE_DEPRECATION_WARNINGS
...
...
libavcodec/utvideo.h
View file @
cf9ef839
...
@@ -30,8 +30,8 @@
...
@@ -30,8 +30,8 @@
#include "libavutil/common.h"
#include "libavutil/common.h"
#include "avcodec.h"
#include "avcodec.h"
#include "bswapdsp.h"
#include "bswapdsp.h"
#include "huffyuvencdsp.h"
#include "lossless_videodsp.h"
#include "lossless_videodsp.h"
#include "lossless_videoencdsp.h"
enum
{
enum
{
PRED_NONE
=
0
,
PRED_NONE
=
0
,
...
@@ -70,8 +70,8 @@ typedef struct UtvideoContext {
...
@@ -70,8 +70,8 @@ typedef struct UtvideoContext {
const
AVClass
*
class
;
const
AVClass
*
class
;
AVCodecContext
*
avctx
;
AVCodecContext
*
avctx
;
BswapDSPContext
bdsp
;
BswapDSPContext
bdsp
;
HuffYUVEncDSPContext
hdsp
;
LLVidDSPContext
llviddsp
;
LLVidDSPContext
llviddsp
;
LLVidEncDSPContext
llvidencdsp
;
uint32_t
frame_info_size
,
flags
,
frame_info
;
uint32_t
frame_info_size
,
flags
,
frame_info
;
int
planes
;
int
planes
;
...
...
libavcodec/utvideoenc.c
View file @
cf9ef839
...
@@ -33,7 +33,6 @@
...
@@ -33,7 +33,6 @@
#include "bswapdsp.h"
#include "bswapdsp.h"
#include "bytestream.h"
#include "bytestream.h"
#include "put_bits.h"
#include "put_bits.h"
#include "huffyuvencdsp.h"
#include "mathops.h"
#include "mathops.h"
#include "utvideo.h"
#include "utvideo.h"
#include "huffman.h"
#include "huffman.h"
...
@@ -120,7 +119,7 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx)
...
@@ -120,7 +119,7 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx)
}
}
ff_bswapdsp_init
(
&
c
->
bdsp
);
ff_bswapdsp_init
(
&
c
->
bdsp
);
ff_
huffyuvencdsp_init
(
&
c
->
hdsp
,
avctx
);
ff_
llvidencdsp_init
(
&
c
->
llvidencdsp
);
#if FF_API_PRIVATE_OPT
#if FF_API_PRIVATE_OPT
FF_DISABLE_DEPRECATION_WARNINGS
FF_DISABLE_DEPRECATION_WARNINGS
...
@@ -324,7 +323,7 @@ static void median_predict(UtvideoContext *c, uint8_t *src, uint8_t *dst, int st
...
@@ -324,7 +323,7 @@ static void median_predict(UtvideoContext *c, uint8_t *src, uint8_t *dst, int st
/* Rest of the coded part uses median prediction */
/* Rest of the coded part uses median prediction */
for
(
j
=
1
;
j
<
height
;
j
++
)
{
for
(
j
=
1
;
j
<
height
;
j
++
)
{
c
->
hdsp
.
sub_hfyu
_median_pred
(
dst
,
src
-
stride
,
src
,
width
,
&
A
,
&
B
);
c
->
llvidencdsp
.
sub
_median_pred
(
dst
,
src
-
stride
,
src
,
width
,
&
A
,
&
B
);
dst
+=
width
;
dst
+=
width
;
src
+=
stride
;
src
+=
stride
;
}
}
...
...
libavcodec/x86/Makefile
View file @
cf9ef839
...
@@ -20,8 +20,9 @@ OBJS-$(CONFIG_H264QPEL) += x86/h264_qpel.o
...
@@ -20,8 +20,9 @@ OBJS-$(CONFIG_H264QPEL) += x86/h264_qpel.o
OBJS-$(CONFIG_HPELDSP)
+=
x86/hpeldsp_init.o
OBJS-$(CONFIG_HPELDSP)
+=
x86/hpeldsp_init.o
OBJS-$(CONFIG_LLAUDDSP)
+=
x86/lossless_audiodsp_init.o
OBJS-$(CONFIG_LLAUDDSP)
+=
x86/lossless_audiodsp_init.o
OBJS-$(CONFIG_LLVIDDSP)
+=
x86/lossless_videodsp_init.o
OBJS-$(CONFIG_LLVIDDSP)
+=
x86/lossless_videodsp_init.o
OBJS-$(CONFIG_LLVIDENCDSP)
+=
x86/lossless_videoencdsp_init.o
OBJS-$(CONFIG_HUFFYUVDSP)
+=
x86/huffyuvdsp_init.o
OBJS-$(CONFIG_HUFFYUVDSP)
+=
x86/huffyuvdsp_init.o
OBJS-$(CONFIG_HUFFYUVENCDSP)
+=
x86/huffyuvencdsp_
mmx
.o
OBJS-$(CONFIG_HUFFYUVENCDSP)
+=
x86/huffyuvencdsp_
init
.o
OBJS-$(CONFIG_IDCTDSP)
+=
x86/idctdsp_init.o
OBJS-$(CONFIG_IDCTDSP)
+=
x86/idctdsp_init.o
OBJS-$(CONFIG_LPC)
+=
x86/lpc.o
OBJS-$(CONFIG_LPC)
+=
x86/lpc.o
OBJS-$(CONFIG_ME_CMP)
+=
x86/me_cmp_init.o
OBJS-$(CONFIG_ME_CMP)
+=
x86/me_cmp_init.o
...
@@ -114,6 +115,7 @@ YASM-OBJS-$(CONFIG_HUFFYUVENCDSP) += x86/huffyuvencdsp.o
...
@@ -114,6 +115,7 @@ YASM-OBJS-$(CONFIG_HUFFYUVENCDSP) += x86/huffyuvencdsp.o
YASM-OBJS-$(CONFIG_IDCTDSP)
+=
x86/idctdsp.o
YASM-OBJS-$(CONFIG_IDCTDSP)
+=
x86/idctdsp.o
YASM-OBJS-$(CONFIG_LLAUDDSP)
+=
x86/lossless_audiodsp.o
YASM-OBJS-$(CONFIG_LLAUDDSP)
+=
x86/lossless_audiodsp.o
YASM-OBJS-$(CONFIG_LLVIDDSP)
+=
x86/lossless_videodsp.o
YASM-OBJS-$(CONFIG_LLVIDDSP)
+=
x86/lossless_videodsp.o
YASM-OBJS-$(CONFIG_LLVIDENCDSP)
+=
x86/lossless_videoencdsp.o
YASM-OBJS-$(CONFIG_ME_CMP)
+=
x86/me_cmp.o
YASM-OBJS-$(CONFIG_ME_CMP)
+=
x86/me_cmp.o
YASM-OBJS-$(CONFIG_MPEGAUDIODSP)
+=
x86/imdct36.o
YASM-OBJS-$(CONFIG_MPEGAUDIODSP)
+=
x86/imdct36.o
YASM-OBJS-$(CONFIG_MPEGVIDEOENC)
+=
x86/mpegvideoencdsp.o
YASM-OBJS-$(CONFIG_MPEGVIDEOENC)
+=
x86/mpegvideoencdsp.o
...
...
libavcodec/x86/huffyuvencdsp.asm
View file @
cf9ef839
...
@@ -27,128 +27,8 @@
...
@@ -27,128 +27,8 @@
section
.
text
section
.
text
; void ff_diff_bytes(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
; void ff_diff_int16(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
; intptr_t w);
; unsigned mask, int w);
%macro
DIFF_BYTES_PROLOGUE
0
%if
ARCH_X86_32
cglobal
diff_bytes
,
3
,
5
,
2
,
dst
,
src1
,
src2
%define
wq
r4q
DECLARE_REG_TMP
3
mov
wq
,
r3mp
%else
cglobal
diff_bytes
,
4
,
5
,
2
,
dst
,
src1
,
src2
,
w
DECLARE_REG_TMP
4
%endif
; ARCH_X86_32
%define
i
t0q
%endmacro
; label to jump to if w < regsize
%macro
DIFF_BYTES_LOOP_PREP
1
mov
i
,
wq
and
i
,
-
2
*
regsize
jz
%1
add
dstq
,
i
add
src1q
,
i
add
src2q
,
i
neg
i
%endmacro
; mov type used for src1q, dstq, first reg, second reg
%macro
DIFF_BYTES_LOOP_CORE
4
%if
mmsize
!
=
16
mov%1
%3
,
[
src1q
+
i
]
mov%1
%4
,
[
src1q
+
i
+
regsize
]
psubb
%3
,
[
src2q
+
i
]
psubb
%4
,
[
src2q
+
i
+
regsize
]
mov%2
[
dstq
+
i
]
,
%3
mov%2
[
regsize
+
dstq
+
i
]
,
%4
%else
; SSE enforces alignment of psubb operand
mov%1
%3
,
[
src1q
+
i
]
movu
%4
,
[
src2q
+
i
]
psubb
%3
,
%4
mov%2
[
dstq
+
i
]
,
%3
mov%1
%3
,
[
src1q
+
i
+
regsize
]
movu
%4
,
[
src2q
+
i
+
regsize
]
psubb
%3
,
%4
mov%2
[
regsize
+
dstq
+
i
]
,
%3
%endif
%endmacro
%macro
DIFF_BYTES_BODY
2
; mov type used for src1q, for dstq
%
define
regsize
mmsize
.
loop_
%1%2
:
DIFF_BYTES_LOOP_CORE
%1
,
%2
,
m0
,
m1
add
i
,
2
*
regsize
jl
.
loop_
%1%2
.
skip_main_
%1%2
:
and
wq
,
2
*
regsize
-
1
jz
.
end_
%1%2
%if
mmsize
>
16
; fall back to narrower xmm
%
define
regsize
mmsize
/
2
DIFF_BYTES_LOOP_PREP
.
setup_loop_gpr_aa
.
loop2_
%1%2
:
DIFF_BYTES_LOOP_CORE
%1
,
%2
,
xm0
,
xm1
add
i
,
2
*
regsize
jl
.
loop2_
%1%2
.
setup_loop_gpr_
%1%2
:
and
wq
,
2
*
regsize
-
1
jz
.
end_
%1%2
%endif
add
dstq
,
wq
add
src1q
,
wq
add
src2q
,
wq
neg
wq
.
loop_gpr_
%1%2
:
mov
t0b
,
[
src1q
+
wq
]
sub
t0b
,
[
src2q
+
wq
]
mov
[
dstq
+
wq
]
,
t0b
inc
wq
jl
.
loop_gpr_
%1%2
.
end_
%1%2
:
REP_RET
%endmacro
%if
ARCH_X86_32
INIT_MMX
mmx
DIFF_BYTES_PROLOGUE
%
define
regsize
mmsize
DIFF_BYTES_LOOP_PREP
.
skip_main_aa
DIFF_BYTES_BODY
a
,
a
%undef
i
%endif
INIT_XMM
sse2
DIFF_BYTES_PROLOGUE
%
define
regsize
mmsize
DIFF_BYTES_LOOP_PREP
.
skip_main_aa
test
dstq
,
regsize
-
1
jnz
.
loop_uu
test
src1q
,
regsize
-
1
jnz
.
loop_ua
DIFF_BYTES_BODY
a
,
a
DIFF_BYTES_BODY
u
,
a
DIFF_BYTES_BODY
u
,
u
%undef
i
%if
HAVE_AVX2_EXTERNAL
INIT_YMM
avx2
DIFF_BYTES_PROLOGUE
%
define
regsize
mmsize
; Directly using unaligned SSE2 version is marginally faster than
; branching based on arguments.
DIFF_BYTES_LOOP_PREP
.
skip_main_uu
test
dstq
,
regsize
-
1
jnz
.
loop_uu
test
src1q
,
regsize
-
1
jnz
.
loop_ua
DIFF_BYTES_BODY
a
,
a
DIFF_BYTES_BODY
u
,
a
DIFF_BYTES_BODY
u
,
u
%undef
i
%endif
%macro
INT16_LOOP
2
; %1 = a/u (aligned/unaligned), %2 = add/sub
%macro
INT16_LOOP
2
; %1 = a/u (aligned/unaligned), %2 = add/sub
movd
m4
,
maskd
movd
m4
,
maskd
SPLATW
m4
,
m4
SPLATW
m4
,
m4
...
...
libavcodec/x86/huffyuvencdsp_init.c
0 → 100644
View file @
cf9ef839
/*
* SIMD-optimized HuffYUV encoding functions
* Copyright (c) 2000, 2001 Fabrice Bellard
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
*
* MMX optimization by Nick Kurshev <nickols_k@mail.ru>
*
* 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 "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/pixdesc.h"
#include "libavutil/x86/cpu.h"
#include "libavcodec/huffyuvencdsp.h"
void
ff_diff_int16_mmx
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
);
void
ff_diff_int16_sse2
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
);
void
ff_sub_hfyu_median_pred_int16_mmxext
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
,
int
*
left
,
int
*
left_top
);
av_cold
void
ff_huffyuvencdsp_init_x86
(
HuffYUVEncDSPContext
*
c
,
AVCodecContext
*
avctx
)
{
av_unused
int
cpu_flags
=
av_get_cpu_flags
();
const
AVPixFmtDescriptor
*
pix_desc
=
av_pix_fmt_desc_get
(
avctx
->
pix_fmt
);
if
(
ARCH_X86_32
&&
EXTERNAL_MMX
(
cpu_flags
))
{
c
->
diff_int16
=
ff_diff_int16_mmx
;
}
if
(
EXTERNAL_MMXEXT
(
cpu_flags
)
&&
pix_desc
&&
pix_desc
->
comp
[
0
].
depth
<
16
)
{
c
->
sub_hfyu_median_pred_int16
=
ff_sub_hfyu_median_pred_int16_mmxext
;
}
if
(
EXTERNAL_SSE2
(
cpu_flags
))
{
c
->
diff_int16
=
ff_diff_int16_sse2
;
}
}
libavcodec/x86/lossless_videoencdsp.asm
0 → 100644
View file @
cf9ef839
;************************************************************************
;* SIMD-optimized lossless video encoding functions
;* Copyright (c) 2000, 2001 Fabrice Bellard
;* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
;*
;* MMX optimization by Nick Kurshev <nickols_k@mail.ru>
;* Conversion to NASM format by Tiancheng "Timothy" Gu <timothygu99@gmail.com>
;*
;* 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
;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
;******************************************************************************
%include
"libavutil/x86/x86util.asm"
section
.
text
; void ff_diff_bytes(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
; intptr_t w);
%macro
DIFF_BYTES_PROLOGUE
0
%if
ARCH_X86_32
cglobal
diff_bytes
,
3
,
5
,
2
,
dst
,
src1
,
src2
%define
wq
r4q
DECLARE_REG_TMP
3
mov
wq
,
r3mp
%else
cglobal
diff_bytes
,
4
,
5
,
2
,
dst
,
src1
,
src2
,
w
DECLARE_REG_TMP
4
%endif
; ARCH_X86_32
%define
i
t0q
%endmacro
; label to jump to if w < regsize
%macro
DIFF_BYTES_LOOP_PREP
1
mov
i
,
wq
and
i
,
-
2
*
regsize
jz
%1
add
dstq
,
i
add
src1q
,
i
add
src2q
,
i
neg
i
%endmacro
; mov type used for src1q, dstq, first reg, second reg
%macro
DIFF_BYTES_LOOP_CORE
4
%if
mmsize
!
=
16
mov%1
%3
,
[
src1q
+
i
]
mov%1
%4
,
[
src1q
+
i
+
regsize
]
psubb
%3
,
[
src2q
+
i
]
psubb
%4
,
[
src2q
+
i
+
regsize
]
mov%2
[
dstq
+
i
]
,
%3
mov%2
[
regsize
+
dstq
+
i
]
,
%4
%else
; SSE enforces alignment of psubb operand
mov%1
%3
,
[
src1q
+
i
]
movu
%4
,
[
src2q
+
i
]
psubb
%3
,
%4
mov%2
[
dstq
+
i
]
,
%3
mov%1
%3
,
[
src1q
+
i
+
regsize
]
movu
%4
,
[
src2q
+
i
+
regsize
]
psubb
%3
,
%4
mov%2
[
regsize
+
dstq
+
i
]
,
%3
%endif
%endmacro
%macro
DIFF_BYTES_BODY
2
; mov type used for src1q, for dstq
%
define
regsize
mmsize
.
loop_
%1%2
:
DIFF_BYTES_LOOP_CORE
%1
,
%2
,
m0
,
m1
add
i
,
2
*
regsize
jl
.
loop_
%1%2
.
skip_main_
%1%2
:
and
wq
,
2
*
regsize
-
1
jz
.
end_
%1%2
%if
mmsize
>
16
; fall back to narrower xmm
%
define
regsize
mmsize
/
2
DIFF_BYTES_LOOP_PREP
.
setup_loop_gpr_aa
.
loop2_
%1%2
:
DIFF_BYTES_LOOP_CORE
%1
,
%2
,
xm0
,
xm1
add
i
,
2
*
regsize
jl
.
loop2_
%1%2
.
setup_loop_gpr_
%1%2
:
and
wq
,
2
*
regsize
-
1
jz
.
end_
%1%2
%endif
add
dstq
,
wq
add
src1q
,
wq
add
src2q
,
wq
neg
wq
.
loop_gpr_
%1%2
:
mov
t0b
,
[
src1q
+
wq
]
sub
t0b
,
[
src2q
+
wq
]
mov
[
dstq
+
wq
]
,
t0b
inc
wq
jl
.
loop_gpr_
%1%2
.
end_
%1%2
:
REP_RET
%endmacro
%if
ARCH_X86_32
INIT_MMX
mmx
DIFF_BYTES_PROLOGUE
%
define
regsize
mmsize
DIFF_BYTES_LOOP_PREP
.
skip_main_aa
DIFF_BYTES_BODY
a
,
a
%undef
i
%endif
INIT_XMM
sse2
DIFF_BYTES_PROLOGUE
%
define
regsize
mmsize
DIFF_BYTES_LOOP_PREP
.
skip_main_aa
test
dstq
,
regsize
-
1
jnz
.
loop_uu
test
src1q
,
regsize
-
1
jnz
.
loop_ua
DIFF_BYTES_BODY
a
,
a
DIFF_BYTES_BODY
u
,
a
DIFF_BYTES_BODY
u
,
u
%undef
i
%if
HAVE_AVX2_EXTERNAL
INIT_YMM
avx2
DIFF_BYTES_PROLOGUE
%
define
regsize
mmsize
; Directly using unaligned SSE2 version is marginally faster than
; branching based on arguments.
DIFF_BYTES_LOOP_PREP
.
skip_main_uu
test
dstq
,
regsize
-
1
jnz
.
loop_uu
test
src1q
,
regsize
-
1
jnz
.
loop_ua
DIFF_BYTES_BODY
a
,
a
DIFF_BYTES_BODY
u
,
a
DIFF_BYTES_BODY
u
,
u
%undef
i
%endif
libavcodec/x86/
huffyuvencdsp_mmx
.c
→
libavcodec/x86/
lossless_videoencdsp_init
.c
View file @
cf9ef839
/*
/*
* SIMD-optimized
HuffYUV
encoding functions
* SIMD-optimized
lossless video
encoding functions
* Copyright (c) 2000, 2001 Fabrice Bellard
* Copyright (c) 2000, 2001 Fabrice Bellard
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
*
*
...
@@ -24,10 +24,9 @@
...
@@ -24,10 +24,9 @@
#include "libavutil/attributes.h"
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/cpu.h"
#include "libavutil/pixdesc.h"
#include "libavutil/x86/asm.h"
#include "libavutil/x86/asm.h"
#include "libavutil/x86/cpu.h"
#include "libavutil/x86/cpu.h"
#include "libavcodec/
huffyuv
encdsp.h"
#include "libavcodec/
lossless_video
encdsp.h"
#include "libavcodec/mathops.h"
#include "libavcodec/mathops.h"
void
ff_diff_bytes_mmx
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
void
ff_diff_bytes_mmx
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
...
@@ -36,18 +35,12 @@ void ff_diff_bytes_sse2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
...
@@ -36,18 +35,12 @@ void ff_diff_bytes_sse2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
intptr_t
w
);
intptr_t
w
);
void
ff_diff_bytes_avx2
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
void
ff_diff_bytes_avx2
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
);
intptr_t
w
);
void
ff_diff_int16_mmx
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
);
void
ff_diff_int16_sse2
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
);
void
ff_sub_hfyu_median_pred_int16_mmxext
(
uint16_t
*
dst
,
const
uint16_t
*
src1
,
const
uint16_t
*
src2
,
unsigned
mask
,
int
w
,
int
*
left
,
int
*
left_top
);
#if HAVE_INLINE_ASM
#if HAVE_INLINE_ASM
static
void
sub_
hfyu_
median_pred_mmxext
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
static
void
sub_median_pred_mmxext
(
uint8_t
*
dst
,
const
uint8_t
*
src1
,
const
uint8_t
*
src2
,
intptr_t
w
,
const
uint8_t
*
src2
,
intptr_t
w
,
int
*
left
,
int
*
left_top
)
int
*
left
,
int
*
left_top
)
{
{
x86_reg
i
=
0
;
x86_reg
i
=
0
;
uint8_t
l
,
lt
;
uint8_t
l
,
lt
;
...
@@ -87,29 +80,22 @@ static void sub_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *src1,
...
@@ -87,29 +80,22 @@ static void sub_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *src1,
#endif
/* HAVE_INLINE_ASM */
#endif
/* HAVE_INLINE_ASM */
av_cold
void
ff_
huffyuvencdsp_init_x86
(
HuffYUVEncDSPContext
*
c
,
AVCodecContext
*
avctx
)
av_cold
void
ff_
llvidencdsp_init_x86
(
LLVidEncDSPContext
*
c
)
{
{
av_unused
int
cpu_flags
=
av_get_cpu_flags
();
av_unused
int
cpu_flags
=
av_get_cpu_flags
();
const
AVPixFmtDescriptor
*
pix_desc
=
av_pix_fmt_desc_get
(
avctx
->
pix_fmt
);
if
(
ARCH_X86_32
&&
EXTERNAL_MMX
(
cpu_flags
))
{
if
(
ARCH_X86_32
&&
EXTERNAL_MMX
(
cpu_flags
))
{
c
->
diff_bytes
=
ff_diff_bytes_mmx
;
c
->
diff_bytes
=
ff_diff_bytes_mmx
;
c
->
diff_int16
=
ff_diff_int16_mmx
;
}
}
#if HAVE_INLINE_ASM
#if HAVE_INLINE_ASM
if
(
INLINE_MMXEXT
(
cpu_flags
))
{
if
(
INLINE_MMXEXT
(
cpu_flags
))
{
c
->
sub_
hfyu_median_pred
=
sub_hfyu
_median_pred_mmxext
;
c
->
sub_
median_pred
=
sub
_median_pred_mmxext
;
}
}
#endif
/* HAVE_INLINE_ASM */
#endif
/* HAVE_INLINE_ASM */
if
(
EXTERNAL_MMXEXT
(
cpu_flags
)
&&
pix_desc
&&
pix_desc
->
comp
[
0
].
depth
<
16
)
{
c
->
sub_hfyu_median_pred_int16
=
ff_sub_hfyu_median_pred_int16_mmxext
;
}
if
(
EXTERNAL_SSE2
(
cpu_flags
))
{
if
(
EXTERNAL_SSE2
(
cpu_flags
))
{
c
->
diff_bytes
=
ff_diff_bytes_sse2
;
c
->
diff_bytes
=
ff_diff_bytes_sse2
;
c
->
diff_int16
=
ff_diff_int16_sse2
;
}
}
if
(
EXTERNAL_AVX2_FAST
(
cpu_flags
))
{
if
(
EXTERNAL_AVX2_FAST
(
cpu_flags
))
{
...
...
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