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
231a6df9
Commit
231a6df9
authored
Aug 14, 2011
by
Baptiste Coudurier
Committed by
Michael Niedermayer
Aug 14, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264dec: h264: 4:2:2 intra decoding
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
9a33078b
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
623 additions
and
135 deletions
+623
-135
h264dsp_init_arm.c
libavcodec/arm/h264dsp_init_arm.c
+5
-4
h264pred_init_arm.c
libavcodec/arm/h264pred_init_arm.c
+1
-1
dsputil.h
libavcodec/dsputil.h
+2
-0
h264.c
libavcodec/h264.c
+67
-25
h264.h
libavcodec/h264.h
+4
-8
h264_cabac.c
libavcodec/h264_cabac.c
+29
-9
h264_cavlc.c
libavcodec/h264_cavlc.c
+105
-11
h264_loopfilter.c
libavcodec/h264_loopfilter.c
+48
-13
h264_mvpred.h
libavcodec/h264_mvpred.h
+6
-1
h264_ps.c
libavcodec/h264_ps.c
+3
-2
h264data.h
libavcodec/h264data.h
+8
-1
h264dsp.c
libavcodec/h264dsp.c
+28
-10
h264dsp.h
libavcodec/h264dsp.h
+4
-4
h264dsp_template.c
libavcodec/h264dsp_template.c
+16
-0
h264idct_template.c
libavcodec/h264idct_template.c
+69
-0
h264pred.c
libavcodec/h264pred.c
+37
-14
h264pred.h
libavcodec/h264pred.h
+3
-3
h264pred_template.c
libavcodec/h264pred_template.c
+138
-0
h264_altivec.c
libavcodec/ppc/h264_altivec.c
+3
-2
rv34.c
libavcodec/rv34.c
+1
-1
vp8.c
libavcodec/vp8.c
+1
-1
h264_intrapred_init.c
libavcodec/x86/h264_intrapred_init.c
+30
-17
h264dsp_mmx.c
libavcodec/x86/h264dsp_mmx.c
+15
-8
No files found.
libavcodec/arm/h264dsp_init_arm.c
View file @
231a6df9
...
...
@@ -92,7 +92,7 @@ void ff_h264_idct8_add4_neon(uint8_t *dst, const int *block_offset,
DCTELEM
*
block
,
int
stride
,
const
uint8_t
nnzc
[
6
*
8
]);
static
void
ff_h264dsp_init_neon
(
H264DSPContext
*
c
,
const
int
bit_depth
)
static
void
ff_h264dsp_init_neon
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
if
(
bit_depth
==
8
)
{
c
->
h264_v_loop_filter_luma
=
ff_h264_v_loop_filter_luma_neon
;
...
...
@@ -122,14 +122,15 @@ static void ff_h264dsp_init_neon(H264DSPContext *c, const int bit_depth)
c
->
h264_idct_dc_add
=
ff_h264_idct_dc_add_neon
;
c
->
h264_idct_add16
=
ff_h264_idct_add16_neon
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_neon
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_neon
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_neon
;
c
->
h264_idct8_add
=
ff_h264_idct8_add_neon
;
c
->
h264_idct8_dc_add
=
ff_h264_idct8_dc_add_neon
;
c
->
h264_idct8_add4
=
ff_h264_idct8_add4_neon
;
}
}
void
ff_h264dsp_init_arm
(
H264DSPContext
*
c
,
const
int
bit_depth
)
void
ff_h264dsp_init_arm
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
if
(
HAVE_NEON
)
ff_h264dsp_init_neon
(
c
,
bit_depth
);
if
(
HAVE_NEON
)
ff_h264dsp_init_neon
(
c
,
bit_depth
,
chroma_format_idc
);
}
libavcodec/arm/h264pred_init_arm.c
View file @
231a6df9
...
...
@@ -42,7 +42,7 @@ void ff_pred8x8_0lt_dc_neon(uint8_t *src, int stride);
void
ff_pred8x8_l00_dc_neon
(
uint8_t
*
src
,
int
stride
);
void
ff_pred8x8_0l0_dc_neon
(
uint8_t
*
src
,
int
stride
);
static
void
ff_h264_pred_init_neon
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
)
static
void
ff_h264_pred_init_neon
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
const
int
high_depth
=
bit_depth
>
8
;
...
...
libavcodec/dsputil.h
View file @
231a6df9
...
...
@@ -63,8 +63,10 @@ void ff_h264_idct_dc_add_ ## depth ## _c(uint8_t *dst, DCTELEM *block, int strid
void ff_h264_idct_add16_ ## depth ## _c(uint8_t *dst, const int *blockoffset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]);\
void ff_h264_idct_add16intra_ ## depth ## _c(uint8_t *dst, const int *blockoffset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]);\
void ff_h264_idct8_add4_ ## depth ## _c(uint8_t *dst, const int *blockoffset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]);\
void ff_h264_idct_add8_422_ ## depth ## _c(uint8_t **dest, const int *blockoffset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]);\
void ff_h264_idct_add8_ ## depth ## _c(uint8_t **dest, const int *blockoffset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]);\
void ff_h264_luma_dc_dequant_idct_ ## depth ## _c(DCTELEM *output, DCTELEM *input, int qmul);\
void ff_h264_chroma422_dc_dequant_idct_ ## depth ## _c(DCTELEM *block, int qmul);\
void ff_h264_chroma_dc_dequant_idct_ ## depth ## _c(DCTELEM *block, int qmul);
H264_IDCT
(
8
)
...
...
libavcodec/h264.c
View file @
231a6df9
This diff is collapsed.
Click to expand it.
libavcodec/h264.h
View file @
231a6df9
...
...
@@ -39,13 +39,6 @@
#define interlaced_dct interlaced_dct_is_a_bad_name
#define mb_intra mb_intra_is_not_initialized_see_mb_type
#define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
#define COEFF_TOKEN_VLC_BITS 8
#define TOTAL_ZEROS_VLC_BITS 9
#define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
#define RUN_VLC_BITS 3
#define RUN7_VLC_BITS 6
#define MAX_SPS_COUNT 32
#define MAX_PPS_COUNT 256
...
...
@@ -92,6 +85,7 @@
#define CABAC h->pps.cabac
#endif
#define CHROMA422 (h->sps.chroma_format_idc == 2)
#define CHROMA444 (h->sps.chroma_format_idc == 3)
#define EXTENDED_SAR 255
...
...
@@ -582,6 +576,8 @@ typedef struct H264Context{
// Timestamp stuff
int
sei_buffering_period_present
;
///< Buffering period SEI flag
int
initial_cpb_removal_delay
[
32
];
///< Initial timestamps for CPBs
int
cur_chroma_format_idc
;
}
H264Context
;
...
...
@@ -809,7 +805,7 @@ static av_always_inline void write_back_non_zero_count(H264Context *h){
AV_COPY32
(
&
nnz
[
32
],
&
nnz_cache
[
4
+
8
*
11
]);
AV_COPY32
(
&
nnz
[
36
],
&
nnz_cache
[
4
+
8
*
12
]);
if
(
CHROMA444
){
if
(
!
h
->
s
.
chroma_y_shift
){
AV_COPY32
(
&
nnz
[
24
],
&
nnz_cache
[
4
+
8
*
8
]);
AV_COPY32
(
&
nnz
[
28
],
&
nnz_cache
[
4
+
8
*
9
]);
AV_COPY32
(
&
nnz
[
40
],
&
nnz_cache
[
4
+
8
*
13
]);
...
...
libavcodec/h264_cabac.c
View file @
231a6df9
...
...
@@ -1587,6 +1587,7 @@ static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCT
9
,
9
,
10
,
10
,
8
,
11
,
12
,
11
,
9
,
9
,
10
,
10
,
8
,
13
,
13
,
9
,
9
,
10
,
10
,
8
,
13
,
13
,
9
,
9
,
10
,
10
,
14
,
14
,
14
,
14
,
14
}
};
static
const
uint8_t
sig_coeff_offset_dc
[
7
]
=
{
0
,
0
,
1
,
1
,
2
,
2
,
2
};
/* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
* 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
* map node ctx => cabac ctx for level=1 */
...
...
@@ -1651,12 +1652,20 @@ static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCT
coeff_count
=
decode_significance_8x8_x86
(
CC
,
significant_coeff_ctx_base
,
index
,
last_coeff_ctx_base
,
sig_off
);
}
else
{
coeff_count
=
decode_significance_x86
(
CC
,
max_coeff
,
significant_coeff_ctx_base
,
index
,
last_coeff_ctx_base
-
significant_coeff_ctx_base
);
if
(
is_dc
&&
max_coeff
==
8
)
{
// dc 422
DECODE_SIGNIFICANCE
(
7
,
sig_coeff_offset_dc
[
last
],
sig_coeff_offset_dc
[
last
]);
}
else
{
coeff_count
=
decode_significance_x86
(
CC
,
max_coeff
,
significant_coeff_ctx_base
,
index
,
last_coeff_ctx_base
-
significant_coeff_ctx_base
);
}
#else
DECODE_SIGNIFICANCE
(
63
,
sig_off
[
last
],
last_coeff_flag_offset_8x8
[
last
]
);
}
else
{
DECODE_SIGNIFICANCE
(
max_coeff
-
1
,
last
,
last
);
if
(
is_dc
&&
max_coeff
==
8
)
{
// dc 422
DECODE_SIGNIFICANCE
(
7
,
sig_coeff_offset_dc
[
last
],
sig_coeff_offset_dc
[
last
]);
}
else
{
DECODE_SIGNIFICANCE
(
max_coeff
-
1
,
last
,
last
);
}
#endif
}
assert
(
coeff_count
>
0
);
...
...
@@ -1692,6 +1701,8 @@ static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCT
} \
} else { \
int coeff_abs = 2; \
if (is_dc && max_coeff == 8) \
node_ctx = FFMIN(node_ctx, 6); \
ctx = coeff_abs_levelgt1_ctx[node_ctx] + abs_level_m1_ctx_base; \
node_ctx = coeff_abs_level_transition[1][node_ctx]; \
\
...
...
@@ -2315,22 +2326,31 @@ decode_intra_mb:
decode_cabac_luma_residual
(
h
,
scan
,
scan8x8
,
pixel_shift
,
mb_type
,
cbp
,
1
);
decode_cabac_luma_residual
(
h
,
scan
,
scan8x8
,
pixel_shift
,
mb_type
,
cbp
,
2
);
}
else
{
const
int
num_c8x8
=
h
->
sps
.
chroma_format_idc
;
if
(
cbp
&
0x30
){
int
c
;
for
(
c
=
0
;
c
<
2
;
c
++
)
{
//av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
decode_cabac_residual_dc
(
h
,
h
->
mb
+
((
256
+
16
*
16
*
c
)
<<
pixel_shift
),
3
,
CHROMA_DC_BLOCK_INDEX
+
c
,
chroma_dc_scan
,
4
);
decode_cabac_residual_dc
(
h
,
h
->
mb
+
((
256
+
16
*
16
*
c
)
<<
pixel_shift
),
3
,
CHROMA_DC_BLOCK_INDEX
+
c
,
CHROMA422
?
chroma422_dc_scan
:
chroma_dc_scan
,
4
*
num_c8x8
);
}
}
if
(
cbp
&
0x20
)
{
int
c
,
i
;
int
c
,
i
,
i8x8
;
for
(
c
=
0
;
c
<
2
;
c
++
)
{
DCTELEM
*
mb
=
h
->
mb
+
(
16
*
(
16
+
16
*
c
)
<<
pixel_shift
);
qmul
=
h
->
dequant4_coeff
[
c
+
1
+
(
IS_INTRA
(
mb_type
)
?
0
:
3
)][
h
->
chroma_qp
[
c
]];
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
int
index
=
16
+
16
*
c
+
i
;
//av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
decode_cabac_residual_nondc
(
h
,
h
->
mb
+
(
16
*
index
<<
pixel_shift
),
4
,
index
,
scan
+
1
,
qmul
,
15
);
for
(
i8x8
=
0
;
i8x8
<
num_c8x8
;
i8x8
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
int
index
=
16
+
16
*
c
+
8
*
i8x8
+
i
;
//av_log(s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16);
decode_cabac_residual_nondc
(
h
,
mb
,
4
,
index
,
scan
+
1
,
qmul
,
15
);
mb
+=
16
<<
pixel_shift
;
}
}
}
}
else
{
...
...
libavcodec/h264_cavlc.c
View file @
231a6df9
...
...
@@ -62,6 +62,30 @@ static const uint8_t chroma_dc_coeff_token_bits[4*5]={
2
,
3
,
2
,
0
,
};
static
const
uint8_t
chroma422_dc_coeff_token_len
[
4
*
9
]
=
{
1
,
0
,
0
,
0
,
7
,
2
,
0
,
0
,
7
,
7
,
3
,
0
,
9
,
7
,
7
,
5
,
9
,
9
,
7
,
6
,
10
,
10
,
9
,
7
,
11
,
11
,
10
,
7
,
12
,
12
,
11
,
10
,
13
,
12
,
12
,
11
,
};
static
const
uint8_t
chroma422_dc_coeff_token_bits
[
4
*
9
]
=
{
1
,
0
,
0
,
0
,
15
,
1
,
0
,
0
,
14
,
13
,
1
,
0
,
7
,
12
,
11
,
1
,
6
,
5
,
10
,
1
,
7
,
6
,
4
,
9
,
7
,
6
,
5
,
8
,
7
,
6
,
5
,
4
,
7
,
5
,
4
,
4
,
};
static
const
uint8_t
coeff_token_len
[
4
][
4
*
17
]
=
{
{
1
,
0
,
0
,
0
,
...
...
@@ -172,6 +196,26 @@ static const uint8_t chroma_dc_total_zeros_bits[3][4]= {
{
1
,
0
,
0
,
0
,},
};
static
const
uint8_t
chroma422_dc_total_zeros_len
[
7
][
8
]
=
{
{
1
,
3
,
3
,
4
,
4
,
4
,
5
,
5
},
{
3
,
2
,
3
,
3
,
3
,
3
,
3
},
{
3
,
3
,
2
,
2
,
3
,
3
},
{
3
,
2
,
2
,
2
,
3
},
{
2
,
2
,
2
,
2
},
{
2
,
2
,
1
},
{
1
,
1
},
};
static
const
uint8_t
chroma422_dc_total_zeros_bits
[
7
][
8
]
=
{
{
1
,
2
,
3
,
2
,
3
,
1
,
1
,
0
},
{
0
,
1
,
1
,
4
,
5
,
6
,
7
},
{
0
,
1
,
1
,
2
,
6
,
7
},
{
6
,
0
,
1
,
2
,
7
},
{
0
,
1
,
2
,
3
},
{
0
,
1
,
1
},
{
0
,
1
},
};
static
const
uint8_t
run_len
[
7
][
16
]
=
{
{
1
,
1
},
{
1
,
2
,
2
},
...
...
@@ -200,6 +244,10 @@ static VLC chroma_dc_coeff_token_vlc;
static
VLC_TYPE
chroma_dc_coeff_token_vlc_table
[
256
][
2
];
static
const
int
chroma_dc_coeff_token_vlc_table_size
=
256
;
static
VLC
chroma422_dc_coeff_token_vlc
;
static
VLC_TYPE
chroma422_dc_coeff_token_vlc_table
[
8192
][
2
];
static
const
int
chroma422_dc_coeff_token_vlc_table_size
=
8192
;
static
VLC
total_zeros_vlc
[
15
];
static
VLC_TYPE
total_zeros_vlc_tables
[
15
][
512
][
2
];
static
const
int
total_zeros_vlc_tables_size
=
512
;
...
...
@@ -208,6 +256,10 @@ static VLC chroma_dc_total_zeros_vlc[3];
static
VLC_TYPE
chroma_dc_total_zeros_vlc_tables
[
3
][
8
][
2
];
static
const
int
chroma_dc_total_zeros_vlc_tables_size
=
8
;
static
VLC
chroma422_dc_total_zeros_vlc
[
7
];
static
VLC_TYPE
chroma422_dc_total_zeros_vlc_tables
[
7
][
32
][
2
];
static
const
int
chroma422_dc_total_zeros_vlc_tables_size
=
32
;
static
VLC
run_vlc
[
6
];
static
VLC_TYPE
run_vlc_tables
[
6
][
8
][
2
];
static
const
int
run_vlc_tables_size
=
8
;
...
...
@@ -219,6 +271,14 @@ static const int run7_vlc_table_size = 96;
#define LEVEL_TAB_BITS 8
static
int8_t
cavlc_level_tab
[
7
][
1
<<
LEVEL_TAB_BITS
][
2
];
#define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
#define CHROMA422_DC_COEFF_TOKEN_VLC_BITS 13
#define COEFF_TOKEN_VLC_BITS 8
#define TOTAL_ZEROS_VLC_BITS 9
#define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
#define CHROMA422_DC_TOTAL_ZEROS_VLC_BITS 5
#define RUN_VLC_BITS 3
#define RUN7_VLC_BITS 6
/**
* gets the predicted number of non-zero coefficients.
...
...
@@ -277,6 +337,13 @@ av_cold void ff_h264_decode_init_vlc(void){
&
chroma_dc_coeff_token_bits
[
0
],
1
,
1
,
INIT_VLC_USE_NEW_STATIC
);
chroma422_dc_coeff_token_vlc
.
table
=
chroma422_dc_coeff_token_vlc_table
;
chroma422_dc_coeff_token_vlc
.
table_allocated
=
chroma422_dc_coeff_token_vlc_table_size
;
init_vlc
(
&
chroma422_dc_coeff_token_vlc
,
CHROMA422_DC_COEFF_TOKEN_VLC_BITS
,
4
*
9
,
&
chroma422_dc_coeff_token_len
[
0
],
1
,
1
,
&
chroma422_dc_coeff_token_bits
[
0
],
1
,
1
,
INIT_VLC_USE_NEW_STATIC
);
offset
=
0
;
for
(
i
=
0
;
i
<
4
;
i
++
){
coeff_token_vlc
[
i
].
table
=
coeff_token_vlc_tables
+
offset
;
...
...
@@ -303,6 +370,17 @@ av_cold void ff_h264_decode_init_vlc(void){
&
chroma_dc_total_zeros_bits
[
i
][
0
],
1
,
1
,
INIT_VLC_USE_NEW_STATIC
);
}
for
(
i
=
0
;
i
<
7
;
i
++
){
chroma422_dc_total_zeros_vlc
[
i
].
table
=
chroma422_dc_total_zeros_vlc_tables
[
i
];
chroma422_dc_total_zeros_vlc
[
i
].
table_allocated
=
chroma422_dc_total_zeros_vlc_tables_size
;
init_vlc
(
&
chroma422_dc_total_zeros_vlc
[
i
],
CHROMA422_DC_TOTAL_ZEROS_VLC_BITS
,
8
,
&
chroma422_dc_total_zeros_len
[
i
][
0
],
1
,
1
,
&
chroma422_dc_total_zeros_bits
[
i
][
0
],
1
,
1
,
INIT_VLC_USE_NEW_STATIC
);
}
for
(
i
=
0
;
i
<
15
;
i
++
){
total_zeros_vlc
[
i
].
table
=
total_zeros_vlc_tables
[
i
];
total_zeros_vlc
[
i
].
table_allocated
=
total_zeros_vlc_tables_size
;
...
...
@@ -372,7 +450,10 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in
//FIXME put trailing_onex into the context
if
(
max_coeff
<=
8
){
coeff_token
=
get_vlc2
(
gb
,
chroma_dc_coeff_token_vlc
.
table
,
CHROMA_DC_COEFF_TOKEN_VLC_BITS
,
1
);
if
(
max_coeff
==
4
)
coeff_token
=
get_vlc2
(
gb
,
chroma_dc_coeff_token_vlc
.
table
,
CHROMA_DC_COEFF_TOKEN_VLC_BITS
,
1
);
else
coeff_token
=
get_vlc2
(
gb
,
chroma422_dc_coeff_token_vlc
.
table
,
CHROMA422_DC_COEFF_TOKEN_VLC_BITS
,
1
);
total_coeff
=
coeff_token
>>
2
;
}
else
{
if
(
n
>=
LUMA_DC_BLOCK_INDEX
){
...
...
@@ -482,11 +563,16 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in
if
(
total_coeff
==
max_coeff
)
zeros_left
=
0
;
else
{
/* FIXME: we don't actually support 4:2:2 yet. */
if
(
max_coeff
<=
8
)
zeros_left
=
get_vlc2
(
gb
,
(
chroma_dc_total_zeros_vlc
-
1
)[
total_coeff
].
table
,
CHROMA_DC_TOTAL_ZEROS_VLC_BITS
,
1
);
else
if
(
max_coeff
<=
8
)
{
if
(
max_coeff
==
4
)
zeros_left
=
get_vlc2
(
gb
,
(
chroma_dc_total_zeros_vlc
-
1
)[
total_coeff
].
table
,
CHROMA_DC_TOTAL_ZEROS_VLC_BITS
,
1
);
else
zeros_left
=
get_vlc2
(
gb
,
(
chroma422_dc_total_zeros_vlc
-
1
)[
total_coeff
].
table
,
CHROMA422_DC_TOTAL_ZEROS_VLC_BITS
,
1
);
}
else
{
zeros_left
=
get_vlc2
(
gb
,
(
total_zeros_vlc
-
1
)[
total_coeff
].
table
,
TOTAL_ZEROS_VLC_BITS
,
1
);
}
}
#define STORE_BLOCK(type) \
...
...
@@ -993,7 +1079,7 @@ decode_intra_mb:
s
->
current_picture
.
f
.
mb_type
[
mb_xy
]
=
mb_type
;
if
(
cbp
||
IS_INTRA16x16
(
mb_type
)){
int
i4x4
,
chroma_idx
;
int
i4x4
,
i8x8
,
chroma_idx
;
int
dquant
;
int
ret
;
GetBitContext
*
gb
=
IS_INTRA
(
mb_type
)
?
h
->
intra_gb_ptr
:
h
->
inter_gb_ptr
;
...
...
@@ -1036,9 +1122,14 @@ decode_intra_mb:
return
-
1
;
}
}
else
{
const
int
num_c8x8
=
h
->
sps
.
chroma_format_idc
;
if
(
cbp
&
0x30
){
for
(
chroma_idx
=
0
;
chroma_idx
<
2
;
chroma_idx
++
)
if
(
decode_residual
(
h
,
gb
,
h
->
mb
+
((
256
+
16
*
16
*
chroma_idx
)
<<
pixel_shift
),
CHROMA_DC_BLOCK_INDEX
+
chroma_idx
,
chroma_dc_scan
,
NULL
,
4
)
<
0
){
if
(
decode_residual
(
h
,
gb
,
h
->
mb
+
((
256
+
16
*
16
*
chroma_idx
)
<<
pixel_shift
),
CHROMA_DC_BLOCK_INDEX
+
chroma_idx
,
CHROMA422
?
chroma422_dc_scan
:
chroma_dc_scan
,
NULL
,
4
*
num_c8x8
)
<
0
)
{
return
-
1
;
}
}
...
...
@@ -1046,10 +1137,13 @@ decode_intra_mb:
if
(
cbp
&
0x20
){
for
(
chroma_idx
=
0
;
chroma_idx
<
2
;
chroma_idx
++
){
const
uint32_t
*
qmul
=
h
->
dequant4_coeff
[
chroma_idx
+
1
+
(
IS_INTRA
(
mb_type
)
?
0
:
3
)][
h
->
chroma_qp
[
chroma_idx
]];
for
(
i4x4
=
0
;
i4x4
<
4
;
i4x4
++
){
const
int
index
=
16
+
16
*
chroma_idx
+
i4x4
;
if
(
decode_residual
(
h
,
gb
,
h
->
mb
+
(
16
*
index
<<
pixel_shift
),
index
,
scan
+
1
,
qmul
,
15
)
<
0
){
return
-
1
;
DCTELEM
*
mb
=
h
->
mb
+
(
16
*
(
16
+
16
*
chroma_idx
)
<<
pixel_shift
);
for
(
i8x8
=
0
;
i8x8
<
num_c8x8
;
i8x8
++
)
{
for
(
i4x4
=
0
;
i4x4
<
4
;
i4x4
++
)
{
const
int
index
=
16
+
16
*
chroma_idx
+
8
*
i8x8
+
i4x4
;
if
(
decode_residual
(
h
,
gb
,
mb
,
index
,
scan
+
1
,
qmul
,
15
)
<
0
)
return
-
1
;
mb
+=
16
<<
pixel_shift
;
}
}
}
...
...
libavcodec/h264_loopfilter.c
View file @
231a6df9
...
...
@@ -212,6 +212,7 @@ static void av_always_inline h264_filter_mb_fast_internal( H264Context *h, int m
MpegEncContext
*
const
s
=
&
h
->
s
;
int
chroma
=
!
(
CONFIG_GRAY
&&
(
s
->
flags
&
CODEC_FLAG_GRAY
));
int
chroma444
=
CHROMA444
;
int
chroma422
=
CHROMA422
;
int
mb_xy
=
h
->
mb_xy
;
int
left_type
=
h
->
left_type
[
LTOP
];
...
...
@@ -289,6 +290,23 @@ static void av_always_inline h264_filter_mb_fast_internal( H264Context *h, int m
filter_mb_edgeh
(
&
img_cb
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
}
}
else
if
(
chroma422
){
if
(
left_type
){
filter_mb_edgecv
(
&
img_cb
[
2
*
0
<<
pixel_shift
],
uvlinesize
,
bS4
,
qpc0
,
a
,
b
,
h
,
1
);
filter_mb_edgecv
(
&
img_cr
[
2
*
0
<<
pixel_shift
],
uvlinesize
,
bS4
,
qpc0
,
a
,
b
,
h
,
1
);
}
filter_mb_edgecv
(
&
img_cb
[
2
*
2
<<
pixel_shift
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgecv
(
&
img_cr
[
2
*
2
<<
pixel_shift
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
if
(
top_type
){
filter_mb_edgech
(
&
img_cb
[
4
*
0
*
uvlinesize
],
uvlinesize
,
bSH
,
qpc1
,
a
,
b
,
h
,
1
);
filter_mb_edgech
(
&
img_cr
[
4
*
0
*
uvlinesize
],
uvlinesize
,
bSH
,
qpc1
,
a
,
b
,
h
,
1
);
}
filter_mb_edgech
(
&
img_cb
[
4
*
1
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
4
*
1
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cb
[
4
*
2
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
4
*
2
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cb
[
4
*
3
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
4
*
3
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
a
,
b
,
h
,
0
);
}
else
{
if
(
left_type
){
filter_mb_edgecv
(
&
img_cb
[
2
*
0
<<
pixel_shift
],
uvlinesize
,
bS4
,
qpc0
,
a
,
b
,
h
,
1
);
...
...
@@ -411,10 +429,12 @@ static int check_mv(H264Context *h, long b_idx, long bn_idx, int mvy_limit){
return
v
;
}
static
av_always_inline
void
filter_mb_dir
(
H264Context
*
h
,
int
mb_x
,
int
mb_y
,
uint8_t
*
img_y
,
uint8_t
*
img_cb
,
uint8_t
*
img_cr
,
unsigned
int
linesize
,
unsigned
int
uvlinesize
,
int
mb_xy
,
int
mb_type
,
int
mvy_limit
,
int
first_vertical_edge_done
,
int
a
,
int
b
,
int
chroma
,
int
chroma444
,
int
dir
)
{
static
av_always_inline
void
filter_mb_dir
(
H264Context
*
h
,
int
mb_x
,
int
mb_y
,
uint8_t
*
img_y
,
uint8_t
*
img_cb
,
uint8_t
*
img_cr
,
unsigned
int
linesize
,
unsigned
int
uvlinesize
,
int
mb_xy
,
int
mb_type
,
int
mvy_limit
,
int
first_vertical_edge_done
,
int
a
,
int
b
,
int
chroma
,
int
dir
)
{
MpegEncContext
*
const
s
=
&
h
->
s
;
int
edge
;
int
chroma_qp_avg
[
2
];
int
chroma444
=
CHROMA444
;
int
chroma422
=
CHROMA422
;
const
int
mbm_xy
=
dir
==
0
?
mb_xy
-
1
:
h
->
top_mb_xy
;
const
int
mbm_type
=
dir
==
0
?
h
->
left_type
[
LTOP
]
:
h
->
top_type
;
...
...
@@ -564,8 +584,9 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
for
(
edge
=
1
;
edge
<
edges
;
edge
++
)
{
DECLARE_ALIGNED
(
8
,
int16_t
,
bS
)[
4
];
int
qp
;
const
int
deblock_edge
=
!
IS_8x8DCT
(
mb_type
&
(
edge
<<
24
));
// (edge&1) && IS_8x8DCT(mb_type)
if
(
IS_8x8DCT
(
mb_type
&
(
edge
<<
24
))
)
// (edge&1) && IS_8x8DCT(mb_type
)
if
(
!
deblock_edge
&&
(
!
chroma422
||
dir
==
0
)
)
continue
;
if
(
IS_INTRA
(
mb_type
))
{
...
...
@@ -627,14 +648,23 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
}
}
}
else
{
filter_mb_edgeh
(
&
img_y
[
4
*
edge
*
linesize
],
linesize
,
bS
,
qp
,
a
,
b
,
h
,
0
);
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgeh
(
&
img_cb
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
a
,
b
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
a
,
b
,
h
,
0
);
}
else
if
(
(
edge
&
1
)
==
0
)
{
filter_mb_edgech
(
&
img_cb
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
a
,
b
,
h
,
0
);
if
(
chroma422
)
{
if
(
deblock_edge
)
filter_mb_edgeh
(
&
img_y
[
4
*
edge
*
linesize
],
linesize
,
bS
,
qp
,
a
,
b
,
h
,
0
);
if
(
chroma
)
{
filter_mb_edgech
(
&
img_cb
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
a
,
b
,
h
,
0
);
}
}
else
{
filter_mb_edgeh
(
&
img_y
[
4
*
edge
*
linesize
],
linesize
,
bS
,
qp
,
a
,
b
,
h
,
0
);
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgeh
(
&
img_cb
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
a
,
b
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
a
,
b
,
h
,
0
);
}
else
if
((
edge
&
1
)
==
0
)
{
filter_mb_edgech
(
&
img_cb
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
a
,
b
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
a
,
b
,
h
,
0
);
}
}
}
}
...
...
@@ -726,6 +756,11 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint
filter_mb_mbaff_edgev
(
h
,
img_cb
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
],
a
,
b
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cr
,
uvlinesize
,
bS
,
1
,
rqp
[
0
],
a
,
b
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cr
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
rqp
[
1
],
a
,
b
,
1
);
}
else
if
(
CHROMA422
)
{
filter_mb_mbaff_edgecv
(
h
,
img_cb
,
uvlinesize
,
bS
,
1
,
bqp
[
0
],
a
,
b
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
],
a
,
b
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
,
uvlinesize
,
bS
,
1
,
rqp
[
0
],
a
,
b
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
rqp
[
1
],
a
,
b
,
1
);
}
else
{
filter_mb_mbaff_edgecv
(
h
,
img_cb
,
uvlinesize
,
bS
,
1
,
bqp
[
0
],
a
,
b
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
+
4
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
],
a
,
b
,
1
);
...
...
@@ -754,9 +789,9 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint
#if CONFIG_SMALL
for
(
dir
=
0
;
dir
<
2
;
dir
++
)
filter_mb_dir
(
h
,
mb_x
,
mb_y
,
img_y
,
img_cb
,
img_cr
,
linesize
,
uvlinesize
,
mb_xy
,
mb_type
,
mvy_limit
,
dir
?
0
:
first_vertical_edge_done
,
a
,
b
,
chroma
,
CHROMA444
,
dir
);
filter_mb_dir
(
h
,
mb_x
,
mb_y
,
img_y
,
img_cb
,
img_cr
,
linesize
,
uvlinesize
,
mb_xy
,
mb_type
,
mvy_limit
,
dir
?
0
:
first_vertical_edge_done
,
a
,
b
,
chroma
,
dir
);
#else
filter_mb_dir
(
h
,
mb_x
,
mb_y
,
img_y
,
img_cb
,
img_cr
,
linesize
,
uvlinesize
,
mb_xy
,
mb_type
,
mvy_limit
,
first_vertical_edge_done
,
a
,
b
,
chroma
,
CHROMA444
,
0
);
filter_mb_dir
(
h
,
mb_x
,
mb_y
,
img_y
,
img_cb
,
img_cr
,
linesize
,
uvlinesize
,
mb_xy
,
mb_type
,
mvy_limit
,
0
,
a
,
b
,
chroma
,
CHROMA444
,
1
);
filter_mb_dir
(
h
,
mb_x
,
mb_y
,
img_y
,
img_cb
,
img_cr
,
linesize
,
uvlinesize
,
mb_xy
,
mb_type
,
mvy_limit
,
first_vertical_edge_done
,
a
,
b
,
chroma
,
0
);
filter_mb_dir
(
h
,
mb_x
,
mb_y
,
img_y
,
img_cb
,
img_cr
,
linesize
,
uvlinesize
,
mb_xy
,
mb_type
,
mvy_limit
,
0
,
a
,
b
,
chroma
,
1
);
#endif
}
libavcodec/h264_mvpred.h
View file @
231a6df9
...
...
@@ -510,7 +510,7 @@ static void fill_decode_caches(H264Context *h, int mb_type){
if
(
top_type
){
nnz
=
h
->
non_zero_count
[
top_xy
];
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
0
],
&
nnz
[
4
*
3
]);
if
(
CHROMA444
){
if
(
!
s
->
chroma_y_shift
){
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
5
],
&
nnz
[
4
*
7
]);
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
10
],
&
nnz
[
4
*
11
]);
}
else
{
...
...
@@ -534,6 +534,11 @@ static void fill_decode_caches(H264Context *h, int mb_type){
nnz_cache
[
3
+
8
*
7
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
+
4
*
4
];
nnz_cache
[
3
+
8
*
11
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
+
8
*
4
];
nnz_cache
[
3
+
8
*
12
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
+
8
*
4
];
}
else
if
(
CHROMA422
)
{
nnz_cache
[
3
+
8
*
6
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
-
2
+
4
*
4
];
nnz_cache
[
3
+
8
*
7
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
-
2
+
4
*
4
];
nnz_cache
[
3
+
8
*
11
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
-
2
+
8
*
4
];
nnz_cache
[
3
+
8
*
12
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
-
2
+
8
*
4
];
}
else
{
nnz_cache
[
3
+
8
*
6
+
8
*
i
]
=
nnz
[
left_block
[
8
+
4
+
2
*
i
]];
nnz_cache
[
3
+
8
*
11
+
8
*
i
]
=
nnz
[
left_block
[
8
+
5
+
2
*
i
]];
...
...
libavcodec/h264_ps.c
View file @
231a6df9
...
...
@@ -396,7 +396,8 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
#endif
sps
->
crop
=
get_bits1
(
&
s
->
gb
);
if
(
sps
->
crop
){
int
crop_limit
=
sps
->
chroma_format_idc
==
3
?
16
:
8
;
int
crop_vertical_limit
=
sps
->
chroma_format_idc
&
2
?
16
:
8
;
int
crop_horizontal_limit
=
sps
->
chroma_format_idc
==
3
?
16
:
8
;
sps
->
crop_left
=
get_ue_golomb
(
&
s
->
gb
);
sps
->
crop_right
=
get_ue_golomb
(
&
s
->
gb
);
sps
->
crop_top
=
get_ue_golomb
(
&
s
->
gb
);
...
...
@@ -404,7 +405,7 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
if
(
sps
->
crop_left
||
sps
->
crop_top
){
av_log
(
h
->
s
.
avctx
,
AV_LOG_ERROR
,
"insane cropping not completely supported, this could look slightly wrong ...
\n
"
);
}
if
(
sps
->
crop_right
>=
crop_
limit
||
sps
->
crop_bottom
>=
crop
_limit
){
if
(
sps
->
crop_right
>=
crop_
horizontal_limit
||
sps
->
crop_bottom
>=
crop_vertical
_limit
){
av_log
(
h
->
s
.
avctx
,
AV_LOG_ERROR
,
"brainfart cropping not supported, this could look slightly wrong ...
\n
"
);
}
}
else
{
...
...
libavcodec/h264data.h
View file @
231a6df9
...
...
@@ -80,7 +80,14 @@ static const uint8_t luma_dc_field_scan[16]={
static
const
uint8_t
chroma_dc_scan
[
4
]
=
{
(
0
+
0
*
2
)
*
16
,
(
1
+
0
*
2
)
*
16
,
(
0
+
1
*
2
)
*
16
,
(
1
+
1
*
2
)
*
16
,
//FIXME
(
0
+
1
*
2
)
*
16
,
(
1
+
1
*
2
)
*
16
,
};
static
const
uint8_t
chroma422_dc_scan
[
8
]
=
{
(
0
+
0
*
2
)
*
16
,
(
0
+
1
*
2
)
*
16
,
(
1
+
0
*
2
)
*
16
,
(
0
+
2
*
2
)
*
16
,
(
0
+
3
*
2
)
*
16
,
(
1
+
1
*
2
)
*
16
,
(
1
+
2
*
2
)
*
16
,
(
1
+
3
*
2
)
*
16
,
};
// zigzag_scan8x8_cavlc[i] = zigzag_scan8x8[(i/4) + 16*(i%4)]
...
...
libavcodec/h264dsp.c
View file @
231a6df9
...
...
@@ -41,7 +41,7 @@
#include "h264dsp_template.c"
#undef BIT_DEPTH
void
ff_h264dsp_init
(
H264DSPContext
*
c
,
const
int
bit_depth
)
void
ff_h264dsp_init
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
#undef FUNC
#define FUNC(a, depth) a ## _ ## depth ## _c
...
...
@@ -53,10 +53,16 @@ void ff_h264dsp_init(H264DSPContext *c, const int bit_depth)
c->h264_idct8_dc_add= FUNC(ff_h264_idct8_dc_add, depth);\
c->h264_idct_add16 = FUNC(ff_h264_idct_add16, depth);\
c->h264_idct8_add4 = FUNC(ff_h264_idct8_add4, depth);\
c->h264_idct_add8 = FUNC(ff_h264_idct_add8, depth);\
if (chroma_format_idc == 1)\
c->h264_idct_add8 = FUNC(ff_h264_idct_add8, depth);\
else\
c->h264_idct_add8 = FUNC(ff_h264_idct_add8_422, depth);\
c->h264_idct_add16intra= FUNC(ff_h264_idct_add16intra, depth);\
c->h264_luma_dc_dequant_idct= FUNC(ff_h264_luma_dc_dequant_idct, depth);\
c->h264_chroma_dc_dequant_idct= FUNC(ff_h264_chroma_dc_dequant_idct, depth);\
if (chroma_format_idc == 1)\
c->h264_chroma_dc_dequant_idct= FUNC(ff_h264_chroma_dc_dequant_idct, depth);\
else\
c->h264_chroma_dc_dequant_idct= FUNC(ff_h264_chroma422_dc_dequant_idct, depth);\
\
c->weight_h264_pixels_tab[0]= FUNC(weight_h264_pixels16x16, depth);\
c->weight_h264_pixels_tab[1]= FUNC(weight_h264_pixels16x8, depth);\
...
...
@@ -86,11 +92,23 @@ void ff_h264dsp_init(H264DSPContext *c, const int bit_depth)
c->h264_h_loop_filter_luma_intra= FUNC(h264_h_loop_filter_luma_intra, depth);\
c->h264_h_loop_filter_luma_mbaff_intra= FUNC(h264_h_loop_filter_luma_mbaff_intra, depth);\
c->h264_v_loop_filter_chroma= FUNC(h264_v_loop_filter_chroma, depth);\
c->h264_h_loop_filter_chroma= FUNC(h264_h_loop_filter_chroma, depth);\
c->h264_h_loop_filter_chroma_mbaff= FUNC(h264_h_loop_filter_chroma_mbaff, depth);\
if (chroma_format_idc == 1)\
c->h264_h_loop_filter_chroma= FUNC(h264_h_loop_filter_chroma, depth);\
else\
c->h264_h_loop_filter_chroma= FUNC(h264_h_loop_filter_chroma422, depth);\
if (chroma_format_idc == 1)\
c->h264_h_loop_filter_chroma_mbaff= FUNC(h264_h_loop_filter_chroma_mbaff, depth);\
else\
c->h264_h_loop_filter_chroma_mbaff= FUNC(h264_h_loop_filter_chroma422_mbaff, depth);\
c->h264_v_loop_filter_chroma_intra= FUNC(h264_v_loop_filter_chroma_intra, depth);\
c->h264_h_loop_filter_chroma_intra= FUNC(h264_h_loop_filter_chroma_intra, depth);\
c->h264_h_loop_filter_chroma_mbaff_intra= FUNC(h264_h_loop_filter_chroma_mbaff_intra, depth);\
if (chroma_format_idc == 1)\
c->h264_h_loop_filter_chroma_intra= FUNC(h264_h_loop_filter_chroma_intra, depth);\
else\
c->h264_h_loop_filter_chroma_intra= FUNC(h264_h_loop_filter_chroma422_intra, depth);\
if (chroma_format_idc == 1)\
c->h264_h_loop_filter_chroma_mbaff_intra= FUNC(h264_h_loop_filter_chroma_mbaff_intra, depth);\
else\
c->h264_h_loop_filter_chroma_mbaff_intra= FUNC(h264_h_loop_filter_chroma422_mbaff_intra, depth);\
c->h264_loop_filter_strength= NULL;
switch
(
bit_depth
)
{
...
...
@@ -105,7 +123,7 @@ void ff_h264dsp_init(H264DSPContext *c, const int bit_depth)
break
;
}
if
(
ARCH_ARM
)
ff_h264dsp_init_arm
(
c
,
bit_depth
);
if
(
HAVE_ALTIVEC
)
ff_h264dsp_init_ppc
(
c
,
bit_depth
);
if
(
HAVE_MMX
)
ff_h264dsp_init_x86
(
c
,
bit_depth
);
if
(
ARCH_ARM
)
ff_h264dsp_init_arm
(
c
,
bit_depth
,
chroma_format_idc
);
if
(
HAVE_ALTIVEC
)
ff_h264dsp_init_ppc
(
c
,
bit_depth
,
chroma_format_idc
);
if
(
HAVE_MMX
)
ff_h264dsp_init_x86
(
c
,
bit_depth
,
chroma_format_idc
);
}
libavcodec/h264dsp.h
View file @
231a6df9
...
...
@@ -74,9 +74,9 @@ typedef struct H264DSPContext{
void
(
*
h264_chroma_dc_dequant_idct
)(
DCTELEM
*
block
,
int
qmul
);
}
H264DSPContext
;
void
ff_h264dsp_init
(
H264DSPContext
*
c
,
const
int
bit_depth
);
void
ff_h264dsp_init_arm
(
H264DSPContext
*
c
,
const
int
bit_depth
);
void
ff_h264dsp_init_ppc
(
H264DSPContext
*
c
,
const
int
bit_depth
);
void
ff_h264dsp_init_x86
(
H264DSPContext
*
c
,
const
int
bit_depth
);
void
ff_h264dsp_init
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
void
ff_h264dsp_init_arm
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
void
ff_h264dsp_init_ppc
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
void
ff_h264dsp_init_x86
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
#endif
/* AVCODEC_H264DSP_H */
libavcodec/h264dsp_template.c
View file @
231a6df9
...
...
@@ -275,6 +275,14 @@ static void FUNCC(h264_h_loop_filter_chroma_mbaff)(uint8_t *pix, int stride, int
{
FUNCC
(
h264_loop_filter_chroma
)(
pix
,
sizeof
(
pixel
),
stride
,
1
,
alpha
,
beta
,
tc0
);
}
static
void
FUNCC
(
h264_h_loop_filter_chroma422
)(
uint8_t
*
pix
,
int
stride
,
int
alpha
,
int
beta
,
int8_t
*
tc0
)
{
FUNCC
(
h264_loop_filter_chroma
)(
pix
,
sizeof
(
pixel
),
stride
,
4
,
alpha
,
beta
,
tc0
);
}
static
void
FUNCC
(
h264_h_loop_filter_chroma422_mbaff
)(
uint8_t
*
pix
,
int
stride
,
int
alpha
,
int
beta
,
int8_t
*
tc0
)
{
FUNCC
(
h264_loop_filter_chroma
)(
pix
,
sizeof
(
pixel
),
stride
,
2
,
alpha
,
beta
,
tc0
);
}
static
av_always_inline
av_flatten
void
FUNCC
(
h264_loop_filter_chroma_intra
)(
uint8_t
*
p_pix
,
int
xstride
,
int
ystride
,
int
inner_iters
,
int
alpha
,
int
beta
)
{
...
...
@@ -312,3 +320,11 @@ static void FUNCC(h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix, int strid
{
FUNCC
(
h264_loop_filter_chroma_intra
)(
pix
,
sizeof
(
pixel
),
stride
,
1
,
alpha
,
beta
);
}
static
void
FUNCC
(
h264_h_loop_filter_chroma422_intra
)(
uint8_t
*
pix
,
int
stride
,
int
alpha
,
int
beta
)
{
FUNCC
(
h264_loop_filter_chroma_intra
)(
pix
,
sizeof
(
pixel
),
stride
,
4
,
alpha
,
beta
);
}
static
void
FUNCC
(
h264_h_loop_filter_chroma422_mbaff_intra
)(
uint8_t
*
pix
,
int
stride
,
int
alpha
,
int
beta
)
{
FUNCC
(
h264_loop_filter_chroma_intra
)(
pix
,
sizeof
(
pixel
),
stride
,
2
,
alpha
,
beta
);
}
libavcodec/h264idct_template.c
View file @
231a6df9
...
...
@@ -224,6 +224,39 @@ void FUNCC(ff_h264_idct_add8)(uint8_t **dest, const int *block_offset, DCTELEM *
}
}
}
void
FUNCC
(
ff_h264_idct_add8_422
)(
uint8_t
**
dest
,
const
int
*
block_offset
,
DCTELEM
*
block
,
int
stride
,
const
uint8_t
nnzc
[
15
*
8
]){
int
i
,
j
;
#if 0
av_log(NULL, AV_LOG_INFO, "idct\n");
int32_t *b = block;
for (int i = 0; i < 256; i++) {
av_log(NULL, AV_LOG_INFO, "%5d ", b[i+256]);
if (!((i+1) % 16))
av_log(NULL, AV_LOG_INFO, "\n");
}
#endif
for
(
j
=
1
;
j
<
3
;
j
++
){
for
(
i
=
j
*
16
;
i
<
j
*
16
+
4
;
i
++
){
if
(
nnzc
[
scan8
[
i
]
])
FUNCC
(
ff_h264_idct_add
)(
dest
[
j
-
1
]
+
block_offset
[
i
],
block
+
i
*
16
*
sizeof
(
pixel
),
stride
);
else
if
(((
dctcoef
*
)
block
)[
i
*
16
])
FUNCC
(
ff_h264_idct_dc_add
)(
dest
[
j
-
1
]
+
block_offset
[
i
],
block
+
i
*
16
*
sizeof
(
pixel
),
stride
);
}
}
for
(
j
=
1
;
j
<
3
;
j
++
){
for
(
i
=
j
*
16
+
4
;
i
<
j
*
16
+
8
;
i
++
){
if
(
nnzc
[
scan8
[
i
+
4
]
])
FUNCC
(
ff_h264_idct_add
)(
dest
[
j
-
1
]
+
block_offset
[
i
+
4
],
block
+
i
*
16
*
sizeof
(
pixel
),
stride
);
else
if
(((
dctcoef
*
)
block
)[
i
*
16
])
FUNCC
(
ff_h264_idct_dc_add
)(
dest
[
j
-
1
]
+
block_offset
[
i
+
4
],
block
+
i
*
16
*
sizeof
(
pixel
),
stride
);
}
}
}
/**
* IDCT transforms the 16 dc values and dequantizes them.
* @param qmul quantization parameter
...
...
@@ -263,6 +296,42 @@ void FUNCC(ff_h264_luma_dc_dequant_idct)(DCTELEM *p_output, DCTELEM *p_input, in
#undef stride
}
void
FUNCC
(
ff_h264_chroma422_dc_dequant_idct
)(
DCTELEM
*
p_block
,
int
qmul
){
const
int
stride
=
16
*
2
;
const
int
xStride
=
16
;
int
i
;
int
temp
[
8
];
static
const
uint8_t
x_offset
[
2
]
=
{
0
,
16
};
dctcoef
*
block
=
(
dctcoef
*
)
p_block
;
for
(
i
=
0
;
i
<
4
;
i
++
){
temp
[
2
*
i
+
0
]
=
block
[
stride
*
i
+
xStride
*
0
]
+
block
[
stride
*
i
+
xStride
*
1
];
temp
[
2
*
i
+
1
]
=
block
[
stride
*
i
+
xStride
*
0
]
-
block
[
stride
*
i
+
xStride
*
1
];
}
for
(
i
=
0
;
i
<
2
;
i
++
){
const
int
offset
=
x_offset
[
i
];
const
int
z0
=
temp
[
2
*
0
+
i
]
+
temp
[
2
*
2
+
i
];
const
int
z1
=
temp
[
2
*
0
+
i
]
-
temp
[
2
*
2
+
i
];
const
int
z2
=
temp
[
2
*
1
+
i
]
-
temp
[
2
*
3
+
i
];
const
int
z3
=
temp
[
2
*
1
+
i
]
+
temp
[
2
*
3
+
i
];
block
[
stride
*
0
+
offset
]
=
((
z0
+
z3
)
*
qmul
+
128
)
>>
8
;
block
[
stride
*
1
+
offset
]
=
((
z1
+
z2
)
*
qmul
+
128
)
>>
8
;
block
[
stride
*
2
+
offset
]
=
((
z1
-
z2
)
*
qmul
+
128
)
>>
8
;
block
[
stride
*
3
+
offset
]
=
((
z0
-
z3
)
*
qmul
+
128
)
>>
8
;
}
#if 0
av_log(NULL, AV_LOG_INFO, "after chroma dc\n");
for (int i = 0; i < 256; i++) {
av_log(NULL, AV_LOG_INFO, "%5d ", block[i]);
if (!((i+1) % 16))
av_log(NULL, AV_LOG_INFO, "\n");
}
#endif
}
void
FUNCC
(
ff_h264_chroma_dc_dequant_idct
)(
DCTELEM
*
p_block
,
int
qmul
){
const
int
stride
=
16
*
2
;
const
int
xStride
=
16
;
...
...
libavcodec/h264pred.c
View file @
231a6df9
...
...
@@ -363,7 +363,7 @@ static void pred8x8_tm_vp8_c(uint8_t *src, int stride){
/**
* Set the intra prediction function pointers.
*/
void
ff_h264_pred_init
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
){
void
ff_h264_pred_init
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
,
const
int
chroma_format_idc
){
// MpegEncContext * const s = &h->s;
#undef FUNC
...
...
@@ -436,20 +436,39 @@ void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth){
h->pred8x8l[TOP_DC_PRED ]= FUNCC(pred8x8l_top_dc , depth);\
h->pred8x8l[DC_128_PRED ]= FUNCC(pred8x8l_128_dc , depth);\
\
h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x8_vertical , depth);\
h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x8_horizontal , depth);\
if (chroma_format_idc == 1) {\
h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x8_vertical , depth);\
h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x8_horizontal , depth);\
} else {\
h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x16_vertical , depth);\
h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x16_horizontal , depth);\
}\
if (codec_id != CODEC_ID_VP8) {\
h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x8_plane , depth);\
if (chroma_format_idc == 1) {\
h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x8_plane , depth);\
} else {\
h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x16_plane , depth);\
}\
} else\
h->pred8x8[PLANE_PRED8x8]= FUNCD(pred8x8_tm_vp8);\
if(codec_id != CODEC_ID_RV40 && codec_id != CODEC_ID_VP8){\
h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x8_dc , depth);\
h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x8_left_dc , depth);\
h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x8_top_dc , depth);\
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l0t, depth);\
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0lt, depth);\
h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l00, depth);\
h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0l0, depth);\
if (chroma_format_idc == 1) {\
h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x8_dc , depth);\
h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x8_left_dc , depth);\
h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x8_top_dc , depth);\
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l0t, depth);\
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0lt, depth);\
h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l00, depth);\
h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0l0, depth);\
} else {\
h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x16_dc , depth);\
h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x16_left_dc , depth);\
h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x16_top_dc , depth);\
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l0t, depth);\
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0lt, depth);\
h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l00, depth);\
h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0l0, depth);\
}\
}else{\
h->pred8x8[DC_PRED8x8 ]= FUNCD(pred8x8_dc_rv40);\
h->pred8x8[LEFT_DC_PRED8x8]= FUNCD(pred8x8_left_dc_rv40);\
...
...
@@ -459,7 +478,11 @@ void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth){
h->pred8x8[DC_129_PRED8x8]= FUNCC(pred8x8_129_dc , depth);\
}\
}\
h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x8_128_dc , depth);\
if (chroma_format_idc == 1) {\
h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x8_128_dc , depth);\
} else {\
h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x16_128_dc , depth);\
}\
\
h->pred16x16[DC_PRED8x8 ]= FUNCC(pred16x16_dc , depth);\
h->pred16x16[VERT_PRED8x8 ]= FUNCC(pred16x16_vertical , depth);\
...
...
@@ -506,6 +529,6 @@ void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth){
break
;
}
if
(
ARCH_ARM
)
ff_h264_pred_init_arm
(
h
,
codec_id
,
bit_depth
);
if
(
HAVE_MMX
)
ff_h264_pred_init_x86
(
h
,
codec_id
,
bit_depth
);
if
(
ARCH_ARM
)
ff_h264_pred_init_arm
(
h
,
codec_id
,
bit_depth
,
chroma_format_idc
);
if
(
HAVE_MMX
)
ff_h264_pred_init_x86
(
h
,
codec_id
,
bit_depth
,
chroma_format_idc
);
}
libavcodec/h264pred.h
View file @
231a6df9
...
...
@@ -101,8 +101,8 @@ typedef struct H264PredContext{
void
(
*
pred16x16_add
[
3
])(
uint8_t
*
pix
/*align 16*/
,
const
int
*
block_offset
,
const
DCTELEM
*
block
/*align 16*/
,
int
stride
);
}
H264PredContext
;
void
ff_h264_pred_init
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
);
void
ff_h264_pred_init_arm
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
);
void
ff_h264_pred_init_x86
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
);
void
ff_h264_pred_init
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
void
ff_h264_pred_init_arm
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
void
ff_h264_pred_init_x86
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
,
const
int
chroma_format_idc
);
#endif
/* AVCODEC_H264PRED_H */
libavcodec/h264pred_template.c
View file @
231a6df9
...
...
@@ -454,6 +454,19 @@ static void FUNCC(pred8x8_vertical)(uint8_t *_src, int _stride){
}
}
static
void
FUNCC
(
pred8x16_vertical
)(
uint8_t
*
_src
,
int
_stride
){
int
i
;
pixel
*
src
=
(
pixel
*
)
_src
;
int
stride
=
_stride
>>
(
sizeof
(
pixel
)
-
1
);
const
pixel4
a
=
AV_RN4PA
(((
pixel4
*
)(
src
-
stride
))
+
0
);
const
pixel4
b
=
AV_RN4PA
(((
pixel4
*
)(
src
-
stride
))
+
1
);
for
(
i
=
0
;
i
<
16
;
i
++
){
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
a
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
b
);
}
}
static
void
FUNCC
(
pred8x8_horizontal
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
pixel
*
src
=
(
pixel
*
)
_src
;
...
...
@@ -466,6 +479,17 @@ static void FUNCC(pred8x8_horizontal)(uint8_t *_src, int stride){
}
}
static
void
FUNCC
(
pred8x16_horizontal
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
pixel
*
src
=
(
pixel
*
)
_src
;
stride
>>=
sizeof
(
pixel
)
-
1
;
for
(
i
=
0
;
i
<
16
;
i
++
){
const
pixel4
a
=
PIXEL_SPLAT_X4
(
src
[
-
1
+
i
*
stride
]);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
a
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
a
);
}
}
#define PRED8x8_X(n, v)\
static void FUNCC(pred8x8_##n##_dc)(uint8_t *_src, int stride){\
int i;\
...
...
@@ -482,6 +506,11 @@ PRED8x8_X(127, (1<<(BIT_DEPTH-1))-1);
PRED8x8_X
(
128
,
(
1
<<
(
BIT_DEPTH
-
1
))
+
0
);
PRED8x8_X
(
129
,
(
1
<<
(
BIT_DEPTH
-
1
))
+
1
);
static
void
FUNCC
(
pred8x16_128_dc
)(
uint8_t
*
_src
,
int
stride
){
FUNCC
(
pred8x8_128_dc
)(
_src
,
stride
);
FUNCC
(
pred8x8_128_dc
)(
_src
+
8
*
stride
,
stride
);
}
static
void
FUNCC
(
pred8x8_left_dc
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
int
dc0
,
dc2
;
...
...
@@ -507,6 +536,11 @@ static void FUNCC(pred8x8_left_dc)(uint8_t *_src, int stride){
}
}
static
void
FUNCC
(
pred8x16_left_dc
)(
uint8_t
*
_src
,
int
stride
){
FUNCC
(
pred8x8_left_dc
)(
_src
,
stride
);
FUNCC
(
pred8x8_left_dc
)(
_src
+
8
*
stride
,
stride
);
}
static
void
FUNCC
(
pred8x8_top_dc
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
int
dc0
,
dc1
;
...
...
@@ -532,6 +566,27 @@ static void FUNCC(pred8x8_top_dc)(uint8_t *_src, int stride){
}
}
static
void
FUNCC
(
pred8x16_top_dc
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
int
dc0
,
dc1
;
pixel4
dc0splat
,
dc1splat
;
pixel
*
src
=
(
pixel
*
)
_src
;
stride
>>=
sizeof
(
pixel
)
-
1
;
dc0
=
dc1
=
0
;
for
(
i
=
0
;
i
<
4
;
i
++
){
dc0
+=
src
[
i
-
stride
];
dc1
+=
src
[
4
+
i
-
stride
];
}
dc0splat
=
PIXEL_SPLAT_X4
((
dc0
+
2
)
>>
2
);
dc1splat
=
PIXEL_SPLAT_X4
((
dc1
+
2
)
>>
2
);
for
(
i
=
0
;
i
<
16
;
i
++
){
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
dc0splat
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
dc1splat
);
}
}
static
void
FUNCC
(
pred8x8_dc
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
int
dc0
,
dc1
,
dc2
;
...
...
@@ -560,6 +615,48 @@ static void FUNCC(pred8x8_dc)(uint8_t *_src, int stride){
}
}
static
void
FUNCC
(
pred8x16_dc
)(
uint8_t
*
_src
,
int
stride
){
int
i
;
int
dc0
,
dc1
,
dc2
,
dc3
,
dc4
;
pixel4
dc0splat
,
dc1splat
,
dc2splat
,
dc3splat
,
dc4splat
,
dc5splat
,
dc6splat
,
dc7splat
;
pixel
*
src
=
(
pixel
*
)
_src
;
stride
>>=
sizeof
(
pixel
)
-
1
;
dc0
=
dc1
=
dc2
=
dc3
=
dc4
=
0
;
for
(
i
=
0
;
i
<
4
;
i
++
){
dc0
+=
src
[
-
1
+
i
*
stride
]
+
src
[
i
-
stride
];
dc1
+=
src
[
4
+
i
-
stride
];
dc2
+=
src
[
-
1
+
(
i
+
4
)
*
stride
];
dc3
+=
src
[
-
1
+
(
i
+
8
)
*
stride
];
dc4
+=
src
[
-
1
+
(
i
+
12
)
*
stride
];
}
dc0splat
=
PIXEL_SPLAT_X4
((
dc0
+
4
)
>>
3
);
dc1splat
=
PIXEL_SPLAT_X4
((
dc1
+
2
)
>>
2
);
dc2splat
=
PIXEL_SPLAT_X4
((
dc2
+
2
)
>>
2
);
dc3splat
=
PIXEL_SPLAT_X4
((
dc1
+
dc2
+
4
)
>>
3
);
dc4splat
=
PIXEL_SPLAT_X4
((
dc3
+
2
)
>>
2
);
dc5splat
=
PIXEL_SPLAT_X4
((
dc1
+
dc3
+
4
)
>>
3
);
dc6splat
=
PIXEL_SPLAT_X4
((
dc4
+
2
)
>>
2
);
dc7splat
=
PIXEL_SPLAT_X4
((
dc1
+
dc4
+
4
)
>>
3
);
for
(
i
=
0
;
i
<
4
;
i
++
){
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
dc0splat
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
dc1splat
);
}
for
(
i
=
4
;
i
<
8
;
i
++
){
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
dc2splat
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
dc3splat
);
}
for
(
i
=
8
;
i
<
12
;
i
++
){
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
dc4splat
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
dc5splat
);
}
for
(
i
=
12
;
i
<
16
;
i
++
){
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
0
,
dc6splat
);
AV_WN4PA
(((
pixel4
*
)(
src
+
i
*
stride
))
+
1
,
dc7splat
);
}
}
//the following 4 function should not be optimized!
static
void
FUNC
(
pred8x8_mad_cow_dc_l0t
)(
uint8_t
*
src
,
int
stride
){
FUNCC
(
pred8x8_top_dc
)(
src
,
stride
);
...
...
@@ -618,6 +715,47 @@ static void FUNCC(pred8x8_plane)(uint8_t *_src, int _stride){
}
}
static
void
FUNCC
(
pred8x16_plane
)(
uint8_t
*
_src
,
int
_stride
){
int
j
,
k
;
int
a
;
INIT_CLIP
pixel
*
src
=
(
pixel
*
)
_src
;
int
stride
=
_stride
>>
(
sizeof
(
pixel
)
-
1
);
const
pixel
*
const
src0
=
src
+
3
-
stride
;
const
pixel
*
src1
=
src
+
8
*
stride
-
1
;
const
pixel
*
src2
=
src1
-
2
*
stride
;
// == src+6*stride-1;
int
H
=
src0
[
1
]
-
src0
[
-
1
];
int
V
=
src1
[
0
]
-
src2
[
0
];
for
(
k
=
2
;
k
<=
4
;
++
k
)
{
src1
+=
stride
;
src2
-=
stride
;
H
+=
k
*
(
src0
[
k
]
-
src0
[
-
k
]);
V
+=
k
*
(
src1
[
0
]
-
src2
[
0
]);
}
for
(;
k
<=
8
;
++
k
)
{
src1
+=
stride
;
src2
-=
stride
;
V
+=
k
*
(
src1
[
0
]
-
src2
[
0
]);
}
H
=
(
17
*
H
+
16
)
>>
5
;
V
=
(
5
*
V
+
32
)
>>
6
;
a
=
16
*
(
src1
[
0
]
+
src2
[
8
]
+
1
)
-
7
*
V
-
3
*
H
;
for
(
j
=
16
;
j
>
0
;
--
j
)
{
int
b
=
a
;
a
+=
V
;
src
[
0
]
=
CLIP
((
b
)
>>
5
);
src
[
1
]
=
CLIP
((
b
+
H
)
>>
5
);
src
[
2
]
=
CLIP
((
b
+
2
*
H
)
>>
5
);
src
[
3
]
=
CLIP
((
b
+
3
*
H
)
>>
5
);
src
[
4
]
=
CLIP
((
b
+
4
*
H
)
>>
5
);
src
[
5
]
=
CLIP
((
b
+
5
*
H
)
>>
5
);
src
[
6
]
=
CLIP
((
b
+
6
*
H
)
>>
5
);
src
[
7
]
=
CLIP
((
b
+
7
*
H
)
>>
5
);
src
+=
stride
;
}
}
#define SRC(x,y) src[(x)+(y)*stride]
#define PL(y) \
const int l##y = (SRC(-1,y-1) + 2*SRC(-1,y) + SRC(-1,y+1) + 2) >> 2;
...
...
libavcodec/ppc/h264_altivec.c
View file @
231a6df9
...
...
@@ -999,12 +999,13 @@ void dsputil_h264_init_ppc(DSPContext* c, AVCodecContext *avctx) {
}
}
void
ff_h264dsp_init_ppc
(
H264DSPContext
*
c
,
const
int
bit_depth
)
void
ff_h264dsp_init_ppc
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
if
(
av_get_cpu_flags
()
&
AV_CPU_FLAG_ALTIVEC
)
{
if
(
bit_depth
==
8
)
{
c
->
h264_idct_add
=
ff_h264_idct_add_altivec
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_altivec
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_altivec
;
c
->
h264_idct_add16
=
ff_h264_idct_add16_altivec
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_altivec
;
c
->
h264_idct_dc_add
=
h264_idct_dc_add_altivec
;
...
...
libavcodec/rv34.c
View file @
231a6df9
...
...
@@ -1412,7 +1412,7 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
if
(
MPV_common_init
(
s
)
<
0
)
return
-
1
;
ff_h264_pred_init
(
&
r
->
h
,
CODEC_ID_RV40
,
8
);
ff_h264_pred_init
(
&
r
->
h
,
CODEC_ID_RV40
,
8
,
1
);
#if CONFIG_RV30_DECODER
if
(
avctx
->
codec_id
==
CODEC_ID_RV30
)
...
...
libavcodec/vp8.c
View file @
231a6df9
...
...
@@ -1721,7 +1721,7 @@ static av_cold int vp8_decode_init(AVCodecContext *avctx)
avctx
->
pix_fmt
=
PIX_FMT_YUV420P
;
dsputil_init
(
&
s
->
dsp
,
avctx
);
ff_h264_pred_init
(
&
s
->
hpc
,
CODEC_ID_VP8
,
8
);
ff_h264_pred_init
(
&
s
->
hpc
,
CODEC_ID_VP8
,
8
,
1
);
ff_vp8dsp_init
(
&
s
->
vp8dsp
);
return
0
;
...
...
libavcodec/x86/h264_intrapred_init.c
View file @
231a6df9
...
...
@@ -167,7 +167,7 @@ void ff_pred4x4_tm_vp8_mmxext (uint8_t *src, const uint8_t *topright, int s
void
ff_pred4x4_tm_vp8_ssse3
(
uint8_t
*
src
,
const
uint8_t
*
topright
,
int
stride
);
void
ff_pred4x4_vertical_vp8_mmxext
(
uint8_t
*
src
,
const
uint8_t
*
topright
,
int
stride
);
void
ff_h264_pred_init_x86
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
)
void
ff_h264_pred_init_x86
(
H264PredContext
*
h
,
int
codec_id
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
int
mm_flags
=
av_get_cpu_flags
();
...
...
@@ -176,14 +176,17 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
if
(
mm_flags
&
AV_CPU_FLAG_MMX
)
{
h
->
pred16x16
[
VERT_PRED8x8
]
=
ff_pred16x16_vertical_mmx
;
h
->
pred16x16
[
HOR_PRED8x8
]
=
ff_pred16x16_horizontal_mmx
;
h
->
pred8x8
[
VERT_PRED8x8
]
=
ff_pred8x8_vertical_mmx
;
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_mmx
;
if
(
chroma_format_idc
==
1
)
{
h
->
pred8x8
[
VERT_PRED8x8
]
=
ff_pred8x8_vertical_mmx
;
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_mmx
;
}
if
(
codec_id
==
CODEC_ID_VP8
)
{
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_tm_vp8_mmx
;
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_tm_vp8_mmx
;
h
->
pred4x4
[
TM_VP8_PRED
]
=
ff_pred4x4_tm_vp8_mmx
;
}
else
{
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_mmx
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_mmx
;
if
(
codec_id
==
CODEC_ID_SVQ3
)
{
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_plane_svq3_mmx
;
}
else
if
(
codec_id
==
CODEC_ID_RV40
)
{
...
...
@@ -197,7 +200,8 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
if
(
mm_flags
&
AV_CPU_FLAG_MMX2
)
{
h
->
pred16x16
[
HOR_PRED8x8
]
=
ff_pred16x16_horizontal_mmxext
;
h
->
pred16x16
[
DC_PRED8x8
]
=
ff_pred16x16_dc_mmxext
;
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_mmxext
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_mmxext
;
h
->
pred8x8l
[
TOP_DC_PRED
]
=
ff_pred8x8l_top_dc_mmxext
;
h
->
pred8x8l
[
DC_PRED
]
=
ff_pred8x8l_dc_mmxext
;
h
->
pred8x8l
[
HOR_PRED
]
=
ff_pred8x8l_horizontal_mmxext
;
...
...
@@ -221,8 +225,10 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h
->
pred4x4
[
HOR_UP_PRED
]
=
ff_pred4x4_horizontal_up_mmxext
;
}
if
(
codec_id
==
CODEC_ID_SVQ3
||
codec_id
==
CODEC_ID_H264
)
{
h
->
pred8x8
[
TOP_DC_PRED8x8
]
=
ff_pred8x8_top_dc_mmxext
;
h
->
pred8x8
[
DC_PRED8x8
]
=
ff_pred8x8_dc_mmxext
;
if
(
chroma_format_idc
==
1
)
{
h
->
pred8x8
[
TOP_DC_PRED8x8
]
=
ff_pred8x8_top_dc_mmxext
;
h
->
pred8x8
[
DC_PRED8x8
]
=
ff_pred8x8_dc_mmxext
;
}
}
if
(
codec_id
==
CODEC_ID_VP8
)
{
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_tm_vp8_mmxext
;
...
...
@@ -231,7 +237,8 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h
->
pred4x4
[
TM_VP8_PRED
]
=
ff_pred4x4_tm_vp8_mmxext
;
h
->
pred4x4
[
VERT_PRED
]
=
ff_pred4x4_vertical_vp8_mmxext
;
}
else
{
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_mmx2
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_mmx2
;
if
(
codec_id
==
CODEC_ID_SVQ3
)
{
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_plane_svq3_mmx2
;
}
else
if
(
codec_id
==
CODEC_ID_RV40
)
{
...
...
@@ -257,7 +264,8 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_tm_vp8_sse2
;
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_tm_vp8_sse2
;
}
else
{
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_sse2
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_sse2
;
if
(
codec_id
==
CODEC_ID_SVQ3
)
{
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_plane_svq3_sse2
;
}
else
if
(
codec_id
==
CODEC_ID_RV40
)
{
...
...
@@ -271,7 +279,8 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
if
(
mm_flags
&
AV_CPU_FLAG_SSSE3
)
{
h
->
pred16x16
[
HOR_PRED8x8
]
=
ff_pred16x16_horizontal_ssse3
;
h
->
pred16x16
[
DC_PRED8x8
]
=
ff_pred16x16_dc_ssse3
;
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_ssse3
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_ssse3
;
h
->
pred8x8l
[
TOP_DC_PRED
]
=
ff_pred8x8l_top_dc_ssse3
;
h
->
pred8x8l
[
DC_PRED
]
=
ff_pred8x8l_dc_ssse3
;
h
->
pred8x8l
[
HOR_PRED
]
=
ff_pred8x8l_horizontal_ssse3
;
...
...
@@ -286,7 +295,8 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_tm_vp8_ssse3
;
h
->
pred4x4
[
TM_VP8_PRED
]
=
ff_pred4x4_tm_vp8_ssse3
;
}
else
{
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_ssse3
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_ssse3
;
if
(
codec_id
==
CODEC_ID_SVQ3
)
{
h
->
pred16x16
[
PLANE_PRED8x8
]
=
ff_pred16x16_plane_svq3_ssse3
;
}
else
if
(
codec_id
==
CODEC_ID_RV40
)
{
...
...
@@ -301,7 +311,8 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h
->
pred4x4
[
DC_PRED
]
=
ff_pred4x4_dc_10_mmxext
;
h
->
pred4x4
[
HOR_UP_PRED
]
=
ff_pred4x4_horizontal_up_10_mmxext
;
h
->
pred8x8
[
DC_PRED8x8
]
=
ff_pred8x8_dc_10_mmxext
;
if
(
chroma_format_idc
==
1
)
h
->
pred8x8
[
DC_PRED8x8
]
=
ff_pred8x8_dc_10_mmxext
;
h
->
pred8x8l
[
DC_128_PRED
]
=
ff_pred8x8l_128_dc_10_mmxext
;
...
...
@@ -319,11 +330,13 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h
->
pred4x4
[
VERT_RIGHT_PRED
]
=
ff_pred4x4_vertical_right_10_sse2
;
h
->
pred4x4
[
HOR_DOWN_PRED
]
=
ff_pred4x4_horizontal_down_10_sse2
;
h
->
pred8x8
[
DC_PRED8x8
]
=
ff_pred8x8_dc_10_sse2
;
h
->
pred8x8
[
TOP_DC_PRED8x8
]
=
ff_pred8x8_top_dc_10_sse2
;
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_10_sse2
;
h
->
pred8x8
[
VERT_PRED8x8
]
=
ff_pred8x8_vertical_10_sse2
;
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_10_sse2
;
if
(
chroma_format_idc
==
1
)
{
h
->
pred8x8
[
DC_PRED8x8
]
=
ff_pred8x8_dc_10_sse2
;
h
->
pred8x8
[
TOP_DC_PRED8x8
]
=
ff_pred8x8_top_dc_10_sse2
;
h
->
pred8x8
[
PLANE_PRED8x8
]
=
ff_pred8x8_plane_10_sse2
;
h
->
pred8x8
[
VERT_PRED8x8
]
=
ff_pred8x8_vertical_10_sse2
;
h
->
pred8x8
[
HOR_PRED8x8
]
=
ff_pred8x8_horizontal_10_sse2
;
}
h
->
pred8x8l
[
VERT_PRED
]
=
ff_pred8x8l_vertical_10_sse2
;
h
->
pred8x8l
[
HOR_PRED
]
=
ff_pred8x8l_horizontal_10_sse2
;
...
...
libavcodec/x86/h264dsp_mmx.c
View file @
231a6df9
...
...
@@ -350,7 +350,7 @@ H264_BIWEIGHT_10_SSE( 4, 8, 10)
H264_BIWEIGHT_10_SSE
(
4
,
4
,
10
)
H264_BIWEIGHT_10_SSE
(
4
,
2
,
10
)
void
ff_h264dsp_init_x86
(
H264DSPContext
*
c
,
const
int
bit_depth
)
void
ff_h264dsp_init_x86
(
H264DSPContext
*
c
,
const
int
bit_depth
,
const
int
chroma_format_idc
)
{
int
mm_flags
=
av_get_cpu_flags
();
...
...
@@ -368,7 +368,8 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
c
->
h264_idct_add16
=
ff_h264_idct_add16_8_mmx
;
c
->
h264_idct8_add4
=
ff_h264_idct8_add4_8_mmx
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_8_mmx
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_8_mmx
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_8_mmx
;
c
->
h264_luma_dc_dequant_idct
=
ff_h264_luma_dc_dequant_idct_mmx
;
...
...
@@ -377,13 +378,16 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
c
->
h264_idct8_dc_add
=
ff_h264_idct8_dc_add_8_mmx2
;
c
->
h264_idct_add16
=
ff_h264_idct_add16_8_mmx2
;
c
->
h264_idct8_add4
=
ff_h264_idct8_add4_8_mmx2
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_8_mmx2
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_8_mmx2
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_8_mmx2
;
c
->
h264_v_loop_filter_chroma
=
ff_deblock_v_chroma_8_mmxext
;
c
->
h264_h_loop_filter_chroma
=
ff_deblock_h_chroma_8_mmxext
;
c
->
h264_v_loop_filter_chroma_intra
=
ff_deblock_v_chroma_intra_8_mmxext
;
c
->
h264_h_loop_filter_chroma_intra
=
ff_deblock_h_chroma_intra_8_mmxext
;
if
(
chroma_format_idc
==
1
)
{
c
->
h264_h_loop_filter_chroma
=
ff_deblock_h_chroma_8_mmxext
;
c
->
h264_h_loop_filter_chroma_intra
=
ff_deblock_h_chroma_intra_8_mmxext
;
}
#if ARCH_X86_32
c
->
h264_v_loop_filter_luma
=
ff_deblock_v_luma_8_mmxext
;
c
->
h264_h_loop_filter_luma
=
ff_deblock_h_luma_8_mmxext
;
...
...
@@ -413,7 +417,8 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
c
->
h264_idct_add16
=
ff_h264_idct_add16_8_sse2
;
c
->
h264_idct8_add4
=
ff_h264_idct8_add4_8_sse2
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_8_sse2
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_8_sse2
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_8_sse2
;
c
->
h264_luma_dc_dequant_idct
=
ff_h264_luma_dc_dequant_idct_sse2
;
...
...
@@ -472,7 +477,8 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
c
->
h264_idct8_dc_add
=
ff_h264_idct8_dc_add_10_sse2
;
c
->
h264_idct_add16
=
ff_h264_idct_add16_10_sse2
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_10_sse2
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_10_sse2
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_10_sse2
;
#if HAVE_ALIGNED_STACK
c
->
h264_idct8_add
=
ff_h264_idct8_add_10_sse2
;
...
...
@@ -532,7 +538,8 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
c
->
h264_idct8_dc_add
=
ff_h264_idct8_dc_add_10_avx
;
c
->
h264_idct_add16
=
ff_h264_idct_add16_10_avx
;
c
->
h264_idct_add8
=
ff_h264_idct_add8_10_avx
;
if
(
chroma_format_idc
==
1
)
c
->
h264_idct_add8
=
ff_h264_idct_add8_10_avx
;
c
->
h264_idct_add16intra
=
ff_h264_idct_add16intra_10_avx
;
#if HAVE_ALIGNED_STACK
c
->
h264_idct8_add
=
ff_h264_idct8_add_10_avx
;
...
...
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