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
5d2b15b8
Commit
5d2b15b8
authored
Jul 25, 2007
by
Stefan Gehrer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
have less functions as inline
Originally committed as revision 9792 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
d58d7ade
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
194 additions
and
183 deletions
+194
-183
cavs.c
libavcodec/cavs.c
+177
-0
cavs.h
libavcodec/cavs.h
+6
-172
cavsdec.c
libavcodec/cavsdec.c
+11
-11
No files found.
libavcodec/cavs.c
View file @
5d2b15b8
...
...
@@ -143,6 +143,73 @@ void ff_cavs_filter(AVSContext *h, enum mb_t mb_type) {
*
****************************************************************************/
void
ff_cavs_load_intra_pred_luma
(
AVSContext
*
h
,
uint8_t
*
top
,
uint8_t
**
left
,
int
block
)
{
int
i
;
switch
(
block
)
{
case
0
:
*
left
=
h
->
left_border_y
;
h
->
left_border_y
[
0
]
=
h
->
left_border_y
[
1
];
memset
(
&
h
->
left_border_y
[
17
],
h
->
left_border_y
[
16
],
9
);
memcpy
(
&
top
[
1
],
&
h
->
top_border_y
[
h
->
mbx
*
16
],
16
);
top
[
17
]
=
top
[
16
];
top
[
0
]
=
top
[
1
];
if
((
h
->
flags
&
A_AVAIL
)
&&
(
h
->
flags
&
B_AVAIL
))
h
->
left_border_y
[
0
]
=
top
[
0
]
=
h
->
topleft_border_y
;
break
;
case
1
:
*
left
=
h
->
intern_border_y
;
for
(
i
=
0
;
i
<
8
;
i
++
)
h
->
intern_border_y
[
i
+
1
]
=
*
(
h
->
cy
+
7
+
i
*
h
->
l_stride
);
memset
(
&
h
->
intern_border_y
[
9
],
h
->
intern_border_y
[
8
],
9
);
h
->
intern_border_y
[
0
]
=
h
->
intern_border_y
[
1
];
memcpy
(
&
top
[
1
],
&
h
->
top_border_y
[
h
->
mbx
*
16
+
8
],
8
);
if
(
h
->
flags
&
C_AVAIL
)
memcpy
(
&
top
[
9
],
&
h
->
top_border_y
[(
h
->
mbx
+
1
)
*
16
],
8
);
else
memset
(
&
top
[
9
],
top
[
8
],
9
);
top
[
17
]
=
top
[
16
];
top
[
0
]
=
top
[
1
];
if
(
h
->
flags
&
B_AVAIL
)
h
->
intern_border_y
[
0
]
=
top
[
0
]
=
h
->
top_border_y
[
h
->
mbx
*
16
+
7
];
break
;
case
2
:
*
left
=
&
h
->
left_border_y
[
8
];
memcpy
(
&
top
[
1
],
h
->
cy
+
7
*
h
->
l_stride
,
16
);
top
[
17
]
=
top
[
16
];
top
[
0
]
=
top
[
1
];
if
(
h
->
flags
&
A_AVAIL
)
top
[
0
]
=
h
->
left_border_y
[
8
];
break
;
case
3
:
*
left
=
&
h
->
intern_border_y
[
8
];
for
(
i
=
0
;
i
<
8
;
i
++
)
h
->
intern_border_y
[
i
+
9
]
=
*
(
h
->
cy
+
7
+
(
i
+
8
)
*
h
->
l_stride
);
memset
(
&
h
->
intern_border_y
[
17
],
h
->
intern_border_y
[
16
],
9
);
memcpy
(
&
top
[
0
],
h
->
cy
+
7
+
7
*
h
->
l_stride
,
9
);
memset
(
&
top
[
9
],
top
[
8
],
9
);
break
;
}
}
void
ff_cavs_load_intra_pred_chroma
(
AVSContext
*
h
)
{
/* extend borders by one pixel */
h
->
left_border_u
[
9
]
=
h
->
left_border_u
[
8
];
h
->
left_border_v
[
9
]
=
h
->
left_border_v
[
8
];
h
->
top_border_u
[
h
->
mbx
*
10
+
9
]
=
h
->
top_border_u
[
h
->
mbx
*
10
+
8
];
h
->
top_border_v
[
h
->
mbx
*
10
+
9
]
=
h
->
top_border_v
[
h
->
mbx
*
10
+
8
];
if
(
h
->
mbx
&&
h
->
mby
)
{
h
->
top_border_u
[
h
->
mbx
*
10
]
=
h
->
left_border_u
[
0
]
=
h
->
topleft_border_u
;
h
->
top_border_v
[
h
->
mbx
*
10
]
=
h
->
left_border_v
[
0
]
=
h
->
topleft_border_v
;
}
else
{
h
->
left_border_u
[
0
]
=
h
->
left_border_u
[
1
];
h
->
left_border_v
[
0
]
=
h
->
left_border_v
[
1
];
h
->
top_border_u
[
h
->
mbx
*
10
]
=
h
->
top_border_u
[
h
->
mbx
*
10
+
1
];
h
->
top_border_v
[
h
->
mbx
*
10
]
=
h
->
top_border_v
[
h
->
mbx
*
10
+
1
];
}
}
static
void
intra_pred_vert
(
uint8_t
*
d
,
uint8_t
*
top
,
uint8_t
*
left
,
int
stride
)
{
int
y
;
uint64_t
a
=
unaligned64
(
&
top
[
1
]);
...
...
@@ -230,6 +297,26 @@ static void intra_pred_lp_top(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
#undef LOWPASS
void
ff_cavs_modify_mb_i
(
AVSContext
*
h
,
int
*
pred_mode_uv
)
{
/* save pred modes before they get modified */
h
->
pred_mode_Y
[
3
]
=
h
->
pred_mode_Y
[
5
];
h
->
pred_mode_Y
[
6
]
=
h
->
pred_mode_Y
[
8
];
h
->
top_pred_Y
[
h
->
mbx
*
2
+
0
]
=
h
->
pred_mode_Y
[
7
];
h
->
top_pred_Y
[
h
->
mbx
*
2
+
1
]
=
h
->
pred_mode_Y
[
8
];
/* modify pred modes according to availability of neighbour samples */
if
(
!
(
h
->
flags
&
A_AVAIL
))
{
modify_pred
(
ff_left_modifier_l
,
&
h
->
pred_mode_Y
[
4
]
);
modify_pred
(
ff_left_modifier_l
,
&
h
->
pred_mode_Y
[
7
]
);
modify_pred
(
ff_left_modifier_c
,
pred_mode_uv
);
}
if
(
!
(
h
->
flags
&
B_AVAIL
))
{
modify_pred
(
ff_top_modifier_l
,
&
h
->
pred_mode_Y
[
4
]
);
modify_pred
(
ff_top_modifier_l
,
&
h
->
pred_mode_Y
[
5
]
);
modify_pred
(
ff_top_modifier_c
,
pred_mode_uv
);
}
}
/*****************************************************************************
*
* motion compensation
...
...
@@ -436,6 +523,96 @@ void ff_cavs_mv(AVSContext *h, enum mv_loc_t nP, enum mv_loc_t nC,
set_mvs
(
mvP
,
size
);
}
/*****************************************************************************
*
* macroblock level
*
****************************************************************************/
/**
* initialise predictors for motion vectors and intra prediction
*/
void
ff_cavs_init_mb
(
AVSContext
*
h
)
{
int
i
;
/* copy predictors from top line (MB B and C) into cache */
for
(
i
=
0
;
i
<
3
;
i
++
)
{
h
->
mv
[
MV_FWD_B2
+
i
]
=
h
->
top_mv
[
0
][
h
->
mbx
*
2
+
i
];
h
->
mv
[
MV_BWD_B2
+
i
]
=
h
->
top_mv
[
1
][
h
->
mbx
*
2
+
i
];
}
h
->
pred_mode_Y
[
1
]
=
h
->
top_pred_Y
[
h
->
mbx
*
2
+
0
];
h
->
pred_mode_Y
[
2
]
=
h
->
top_pred_Y
[
h
->
mbx
*
2
+
1
];
/* clear top predictors if MB B is not available */
if
(
!
(
h
->
flags
&
B_AVAIL
))
{
h
->
mv
[
MV_FWD_B2
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_FWD_B3
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_B2
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_B3
]
=
ff_cavs_un_mv
;
h
->
pred_mode_Y
[
1
]
=
h
->
pred_mode_Y
[
2
]
=
NOT_AVAIL
;
h
->
flags
&=
~
(
C_AVAIL
|
D_AVAIL
);
}
else
if
(
h
->
mbx
)
{
h
->
flags
|=
D_AVAIL
;
}
if
(
h
->
mbx
==
h
->
mb_width
-
1
)
//MB C not available
h
->
flags
&=
~
C_AVAIL
;
/* clear top-right predictors if MB C is not available */
if
(
!
(
h
->
flags
&
C_AVAIL
))
{
h
->
mv
[
MV_FWD_C2
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_C2
]
=
ff_cavs_un_mv
;
}
/* clear top-left predictors if MB D is not available */
if
(
!
(
h
->
flags
&
D_AVAIL
))
{
h
->
mv
[
MV_FWD_D3
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_D3
]
=
ff_cavs_un_mv
;
}
/* set pointer for co-located macroblock type */
h
->
col_type
=
&
h
->
col_type_base
[
h
->
mby
*
h
->
mb_width
+
h
->
mbx
];
}
/**
* save predictors for later macroblocks and increase
* macroblock address
* @returns 0 if end of frame is reached, 1 otherwise
*/
int
ff_cavs_next_mb
(
AVSContext
*
h
)
{
int
i
;
h
->
flags
|=
A_AVAIL
;
h
->
cy
+=
16
;
h
->
cu
+=
8
;
h
->
cv
+=
8
;
/* copy mvs as predictors to the left */
for
(
i
=
0
;
i
<=
20
;
i
+=
4
)
h
->
mv
[
i
]
=
h
->
mv
[
i
+
2
];
/* copy bottom mvs from cache to top line */
h
->
top_mv
[
0
][
h
->
mbx
*
2
+
0
]
=
h
->
mv
[
MV_FWD_X2
];
h
->
top_mv
[
0
][
h
->
mbx
*
2
+
1
]
=
h
->
mv
[
MV_FWD_X3
];
h
->
top_mv
[
1
][
h
->
mbx
*
2
+
0
]
=
h
->
mv
[
MV_BWD_X2
];
h
->
top_mv
[
1
][
h
->
mbx
*
2
+
1
]
=
h
->
mv
[
MV_BWD_X3
];
/* next MB address */
h
->
mbx
++
;
if
(
h
->
mbx
==
h
->
mb_width
)
{
//new mb line
h
->
flags
=
B_AVAIL
|
C_AVAIL
;
/* clear left pred_modes */
h
->
pred_mode_Y
[
3
]
=
h
->
pred_mode_Y
[
6
]
=
NOT_AVAIL
;
/* clear left mv predictors */
for
(
i
=
0
;
i
<=
20
;
i
+=
4
)
h
->
mv
[
i
]
=
ff_cavs_un_mv
;
h
->
mbx
=
0
;
h
->
mby
++
;
/* re-calculate sample pointers */
h
->
cy
=
h
->
picture
.
data
[
0
]
+
h
->
mby
*
16
*
h
->
l_stride
;
h
->
cu
=
h
->
picture
.
data
[
1
]
+
h
->
mby
*
8
*
h
->
c_stride
;
h
->
cv
=
h
->
picture
.
data
[
2
]
+
h
->
mby
*
8
*
h
->
c_stride
;
if
(
h
->
mby
==
h
->
mb_height
)
{
//frame end
return
0
;
}
else
{
//check_for_slice(h);
}
}
return
1
;
}
/*****************************************************************************
*
* frame level
...
...
libavcodec/cavs.h
View file @
5d2b15b8
...
...
@@ -240,73 +240,6 @@ extern const vector_t ff_cavs_intra_mv;
extern
const
vector_t
ff_cavs_un_mv
;
extern
const
vector_t
ff_cavs_dir_mv
;
static
inline
void
load_intra_pred_luma
(
AVSContext
*
h
,
uint8_t
*
top
,
uint8_t
**
left
,
int
block
)
{
int
i
;
switch
(
block
)
{
case
0
:
*
left
=
h
->
left_border_y
;
h
->
left_border_y
[
0
]
=
h
->
left_border_y
[
1
];
memset
(
&
h
->
left_border_y
[
17
],
h
->
left_border_y
[
16
],
9
);
memcpy
(
&
top
[
1
],
&
h
->
top_border_y
[
h
->
mbx
*
16
],
16
);
top
[
17
]
=
top
[
16
];
top
[
0
]
=
top
[
1
];
if
((
h
->
flags
&
A_AVAIL
)
&&
(
h
->
flags
&
B_AVAIL
))
h
->
left_border_y
[
0
]
=
top
[
0
]
=
h
->
topleft_border_y
;
break
;
case
1
:
*
left
=
h
->
intern_border_y
;
for
(
i
=
0
;
i
<
8
;
i
++
)
h
->
intern_border_y
[
i
+
1
]
=
*
(
h
->
cy
+
7
+
i
*
h
->
l_stride
);
memset
(
&
h
->
intern_border_y
[
9
],
h
->
intern_border_y
[
8
],
9
);
h
->
intern_border_y
[
0
]
=
h
->
intern_border_y
[
1
];
memcpy
(
&
top
[
1
],
&
h
->
top_border_y
[
h
->
mbx
*
16
+
8
],
8
);
if
(
h
->
flags
&
C_AVAIL
)
memcpy
(
&
top
[
9
],
&
h
->
top_border_y
[(
h
->
mbx
+
1
)
*
16
],
8
);
else
memset
(
&
top
[
9
],
top
[
8
],
9
);
top
[
17
]
=
top
[
16
];
top
[
0
]
=
top
[
1
];
if
(
h
->
flags
&
B_AVAIL
)
h
->
intern_border_y
[
0
]
=
top
[
0
]
=
h
->
top_border_y
[
h
->
mbx
*
16
+
7
];
break
;
case
2
:
*
left
=
&
h
->
left_border_y
[
8
];
memcpy
(
&
top
[
1
],
h
->
cy
+
7
*
h
->
l_stride
,
16
);
top
[
17
]
=
top
[
16
];
top
[
0
]
=
top
[
1
];
if
(
h
->
flags
&
A_AVAIL
)
top
[
0
]
=
h
->
left_border_y
[
8
];
break
;
case
3
:
*
left
=
&
h
->
intern_border_y
[
8
];
for
(
i
=
0
;
i
<
8
;
i
++
)
h
->
intern_border_y
[
i
+
9
]
=
*
(
h
->
cy
+
7
+
(
i
+
8
)
*
h
->
l_stride
);
memset
(
&
h
->
intern_border_y
[
17
],
h
->
intern_border_y
[
16
],
9
);
memcpy
(
&
top
[
0
],
h
->
cy
+
7
+
7
*
h
->
l_stride
,
9
);
memset
(
&
top
[
9
],
top
[
8
],
9
);
break
;
}
}
static
inline
void
load_intra_pred_chroma
(
AVSContext
*
h
)
{
/* extend borders by one pixel */
h
->
left_border_u
[
9
]
=
h
->
left_border_u
[
8
];
h
->
left_border_v
[
9
]
=
h
->
left_border_v
[
8
];
h
->
top_border_u
[
h
->
mbx
*
10
+
9
]
=
h
->
top_border_u
[
h
->
mbx
*
10
+
8
];
h
->
top_border_v
[
h
->
mbx
*
10
+
9
]
=
h
->
top_border_v
[
h
->
mbx
*
10
+
8
];
if
(
h
->
mbx
&&
h
->
mby
)
{
h
->
top_border_u
[
h
->
mbx
*
10
]
=
h
->
left_border_u
[
0
]
=
h
->
topleft_border_u
;
h
->
top_border_v
[
h
->
mbx
*
10
]
=
h
->
left_border_v
[
0
]
=
h
->
topleft_border_v
;
}
else
{
h
->
left_border_u
[
0
]
=
h
->
left_border_u
[
1
];
h
->
left_border_v
[
0
]
=
h
->
left_border_v
[
1
];
h
->
top_border_u
[
h
->
mbx
*
10
]
=
h
->
top_border_u
[
h
->
mbx
*
10
+
1
];
h
->
top_border_v
[
h
->
mbx
*
10
]
=
h
->
top_border_v
[
h
->
mbx
*
10
+
1
];
}
}
static
inline
void
modify_pred
(
const
int_fast8_t
*
mod_table
,
int
*
mode
)
{
*
mode
=
mod_table
[
*
mode
];
if
(
*
mode
<
0
)
{
...
...
@@ -315,26 +248,6 @@ static inline void modify_pred(const int_fast8_t *mod_table, int *mode) {
}
}
static
inline
void
modify_mb_i
(
AVSContext
*
h
,
int
*
pred_mode_uv
)
{
/* save pred modes before they get modified */
h
->
pred_mode_Y
[
3
]
=
h
->
pred_mode_Y
[
5
];
h
->
pred_mode_Y
[
6
]
=
h
->
pred_mode_Y
[
8
];
h
->
top_pred_Y
[
h
->
mbx
*
2
+
0
]
=
h
->
pred_mode_Y
[
7
];
h
->
top_pred_Y
[
h
->
mbx
*
2
+
1
]
=
h
->
pred_mode_Y
[
8
];
/* modify pred modes according to availability of neighbour samples */
if
(
!
(
h
->
flags
&
A_AVAIL
))
{
modify_pred
(
ff_left_modifier_l
,
&
h
->
pred_mode_Y
[
4
]
);
modify_pred
(
ff_left_modifier_l
,
&
h
->
pred_mode_Y
[
7
]
);
modify_pred
(
ff_left_modifier_c
,
pred_mode_uv
);
}
if
(
!
(
h
->
flags
&
B_AVAIL
))
{
modify_pred
(
ff_top_modifier_l
,
&
h
->
pred_mode_Y
[
4
]
);
modify_pred
(
ff_top_modifier_l
,
&
h
->
pred_mode_Y
[
5
]
);
modify_pred
(
ff_top_modifier_c
,
pred_mode_uv
);
}
}
static
inline
void
set_intra_mode_default
(
AVSContext
*
h
)
{
h
->
pred_mode_Y
[
3
]
=
h
->
pred_mode_Y
[
6
]
=
INTRA_L_LP
;
h
->
top_pred_Y
[
h
->
mbx
*
2
+
0
]
=
h
->
top_pred_Y
[
h
->
mbx
*
2
+
1
]
=
INTRA_L_LP
;
...
...
@@ -363,91 +276,6 @@ static inline void set_mv_intra(AVSContext *h) {
*
h
->
col_type
=
I_8X8
;
}
/**
* initialise predictors for motion vectors and intra prediction
*/
static
inline
void
init_mb
(
AVSContext
*
h
)
{
int
i
;
/* copy predictors from top line (MB B and C) into cache */
for
(
i
=
0
;
i
<
3
;
i
++
)
{
h
->
mv
[
MV_FWD_B2
+
i
]
=
h
->
top_mv
[
0
][
h
->
mbx
*
2
+
i
];
h
->
mv
[
MV_BWD_B2
+
i
]
=
h
->
top_mv
[
1
][
h
->
mbx
*
2
+
i
];
}
h
->
pred_mode_Y
[
1
]
=
h
->
top_pred_Y
[
h
->
mbx
*
2
+
0
];
h
->
pred_mode_Y
[
2
]
=
h
->
top_pred_Y
[
h
->
mbx
*
2
+
1
];
/* clear top predictors if MB B is not available */
if
(
!
(
h
->
flags
&
B_AVAIL
))
{
h
->
mv
[
MV_FWD_B2
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_FWD_B3
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_B2
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_B3
]
=
ff_cavs_un_mv
;
h
->
pred_mode_Y
[
1
]
=
h
->
pred_mode_Y
[
2
]
=
NOT_AVAIL
;
h
->
flags
&=
~
(
C_AVAIL
|
D_AVAIL
);
}
else
if
(
h
->
mbx
)
{
h
->
flags
|=
D_AVAIL
;
}
if
(
h
->
mbx
==
h
->
mb_width
-
1
)
//MB C not available
h
->
flags
&=
~
C_AVAIL
;
/* clear top-right predictors if MB C is not available */
if
(
!
(
h
->
flags
&
C_AVAIL
))
{
h
->
mv
[
MV_FWD_C2
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_C2
]
=
ff_cavs_un_mv
;
}
/* clear top-left predictors if MB D is not available */
if
(
!
(
h
->
flags
&
D_AVAIL
))
{
h
->
mv
[
MV_FWD_D3
]
=
ff_cavs_un_mv
;
h
->
mv
[
MV_BWD_D3
]
=
ff_cavs_un_mv
;
}
/* set pointer for co-located macroblock type */
h
->
col_type
=
&
h
->
col_type_base
[
h
->
mby
*
h
->
mb_width
+
h
->
mbx
];
}
/**
* save predictors for later macroblocks and increase
* macroblock address
* @returns 0 if end of frame is reached, 1 otherwise
*/
static
inline
int
next_mb
(
AVSContext
*
h
)
{
int
i
;
h
->
flags
|=
A_AVAIL
;
h
->
cy
+=
16
;
h
->
cu
+=
8
;
h
->
cv
+=
8
;
/* copy mvs as predictors to the left */
for
(
i
=
0
;
i
<=
20
;
i
+=
4
)
h
->
mv
[
i
]
=
h
->
mv
[
i
+
2
];
/* copy bottom mvs from cache to top line */
h
->
top_mv
[
0
][
h
->
mbx
*
2
+
0
]
=
h
->
mv
[
MV_FWD_X2
];
h
->
top_mv
[
0
][
h
->
mbx
*
2
+
1
]
=
h
->
mv
[
MV_FWD_X3
];
h
->
top_mv
[
1
][
h
->
mbx
*
2
+
0
]
=
h
->
mv
[
MV_BWD_X2
];
h
->
top_mv
[
1
][
h
->
mbx
*
2
+
1
]
=
h
->
mv
[
MV_BWD_X3
];
/* next MB address */
h
->
mbx
++
;
if
(
h
->
mbx
==
h
->
mb_width
)
{
//new mb line
h
->
flags
=
B_AVAIL
|
C_AVAIL
;
/* clear left pred_modes */
h
->
pred_mode_Y
[
3
]
=
h
->
pred_mode_Y
[
6
]
=
NOT_AVAIL
;
/* clear left mv predictors */
for
(
i
=
0
;
i
<=
20
;
i
+=
4
)
h
->
mv
[
i
]
=
ff_cavs_un_mv
;
h
->
mbx
=
0
;
h
->
mby
++
;
/* re-calculate sample pointers */
h
->
cy
=
h
->
picture
.
data
[
0
]
+
h
->
mby
*
16
*
h
->
l_stride
;
h
->
cu
=
h
->
picture
.
data
[
1
]
+
h
->
mby
*
8
*
h
->
c_stride
;
h
->
cv
=
h
->
picture
.
data
[
2
]
+
h
->
mby
*
8
*
h
->
c_stride
;
if
(
h
->
mby
==
h
->
mb_height
)
{
//frame end
return
0
;
}
else
{
//check_for_slice(h);
}
}
return
1
;
}
static
inline
int
dequant
(
AVSContext
*
h
,
DCTELEM
*
level_buf
,
uint8_t
*
run_buf
,
DCTELEM
*
dst
,
int
mul
,
int
shift
,
int
coeff_num
)
{
int
round
=
1
<<
(
shift
-
1
);
...
...
@@ -469,9 +297,15 @@ static inline int dequant(AVSContext *h, DCTELEM *level_buf, uint8_t *run_buf,
}
void
ff_cavs_filter
(
AVSContext
*
h
,
enum
mb_t
mb_type
);
void
ff_cavs_load_intra_pred_luma
(
AVSContext
*
h
,
uint8_t
*
top
,
uint8_t
**
left
,
int
block
);
void
ff_cavs_load_intra_pred_chroma
(
AVSContext
*
h
);
void
ff_cavs_modify_mb_i
(
AVSContext
*
h
,
int
*
pred_mode_uv
);
void
ff_cavs_inter
(
AVSContext
*
h
,
enum
mb_t
mb_type
);
void
ff_cavs_mv
(
AVSContext
*
h
,
enum
mv_loc_t
nP
,
enum
mv_loc_t
nC
,
enum
mv_pred_t
mode
,
enum
block_t
size
,
int
ref
);
void
ff_cavs_init_mb
(
AVSContext
*
h
);
int
ff_cavs_next_mb
(
AVSContext
*
h
);
void
ff_cavs_init_pic
(
AVSContext
*
h
);
void
ff_cavs_init_top_lines
(
AVSContext
*
h
);
int
ff_cavs_init
(
AVCodecContext
*
avctx
);
...
...
libavcodec/cavsdec.c
View file @
5d2b15b8
...
...
@@ -193,7 +193,7 @@ static int decode_mb_i(AVSContext *h, int cbp_code) {
uint8_t
*
left
=
NULL
;
uint8_t
*
d
;
init_mb
(
h
);
ff_cavs_
init_mb
(
h
);
/* get intra prediction modes from stream */
for
(
block
=
0
;
block
<
4
;
block
++
)
{
...
...
@@ -216,7 +216,7 @@ static int decode_mb_i(AVSContext *h, int cbp_code) {
av_log
(
h
->
s
.
avctx
,
AV_LOG_ERROR
,
"illegal intra chroma pred mode
\n
"
);
return
-
1
;
}
modify_mb_i
(
h
,
&
pred_mode_uv
);
ff_cavs_
modify_mb_i
(
h
,
&
pred_mode_uv
);
/* get coded block pattern */
if
(
h
->
pic_type
==
FF_I_TYPE
)
...
...
@@ -232,7 +232,7 @@ static int decode_mb_i(AVSContext *h, int cbp_code) {
/* luma intra prediction interleaved with residual decode/transform/add */
for
(
block
=
0
;
block
<
4
;
block
++
)
{
d
=
h
->
cy
+
h
->
luma_scan
[
block
];
load_intra_pred_luma
(
h
,
top
,
&
left
,
block
);
ff_cavs_
load_intra_pred_luma
(
h
,
top
,
&
left
,
block
);
h
->
intra_pred_l
[
h
->
pred_mode_Y
[
ff_cavs_scan3x3
[
block
]]]
(
d
,
top
,
left
,
h
->
l_stride
);
if
(
h
->
cbp
&
(
1
<<
block
))
...
...
@@ -240,7 +240,7 @@ static int decode_mb_i(AVSContext *h, int cbp_code) {
}
/* chroma intra prediction */
load_intra_pred_chroma
(
h
);
ff_cavs_
load_intra_pred_chroma
(
h
);
h
->
intra_pred_c
[
pred_mode_uv
](
h
->
cu
,
&
h
->
top_border_u
[
h
->
mbx
*
10
],
h
->
left_border_u
,
h
->
c_stride
);
h
->
intra_pred_c
[
pred_mode_uv
](
h
->
cv
,
&
h
->
top_border_v
[
h
->
mbx
*
10
],
...
...
@@ -256,7 +256,7 @@ static void decode_mb_p(AVSContext *h, enum mb_t mb_type) {
GetBitContext
*
gb
=
&
h
->
s
.
gb
;
int
ref
[
4
];
init_mb
(
h
);
ff_cavs_
init_mb
(
h
);
switch
(
mb_type
)
{
case
P_SKIP
:
ff_cavs_mv
(
h
,
MV_FWD_X0
,
MV_FWD_C2
,
MV_PRED_PSKIP
,
BLK_16X16
,
0
);
...
...
@@ -301,7 +301,7 @@ static void decode_mb_b(AVSContext *h, enum mb_t mb_type) {
enum
sub_mb_t
sub_type
[
4
];
int
flags
;
init_mb
(
h
);
ff_cavs_
init_mb
(
h
);
/* reset all MVs */
h
->
mv
[
MV_FWD_X0
]
=
ff_cavs_dir_mv
;
...
...
@@ -527,14 +527,14 @@ static int decode_pic(AVSContext *h) {
if
(
h
->
pic_type
==
FF_I_TYPE
)
{
do
{
decode_mb_i
(
h
,
0
);
}
while
(
next_mb
(
h
));
}
while
(
ff_cavs_
next_mb
(
h
));
}
else
if
(
h
->
pic_type
==
FF_P_TYPE
)
{
do
{
if
(
h
->
skip_mode_flag
)
{
skip_count
=
get_ue_golomb
(
&
s
->
gb
);
while
(
skip_count
--
)
{
decode_mb_p
(
h
,
P_SKIP
);
if
(
!
next_mb
(
h
))
if
(
!
ff_cavs_
next_mb
(
h
))
goto
done
;
}
mb_type
=
get_ue_golomb
(
&
s
->
gb
)
+
P_16X16
;
...
...
@@ -544,14 +544,14 @@ static int decode_pic(AVSContext *h) {
decode_mb_i
(
h
,
mb_type
-
P_8X8
-
1
);
}
else
decode_mb_p
(
h
,
mb_type
);
}
while
(
next_mb
(
h
));
}
while
(
ff_cavs_
next_mb
(
h
));
}
else
{
/* FF_B_TYPE */
do
{
if
(
h
->
skip_mode_flag
)
{
skip_count
=
get_ue_golomb
(
&
s
->
gb
);
while
(
skip_count
--
)
{
decode_mb_b
(
h
,
B_SKIP
);
if
(
!
next_mb
(
h
))
if
(
!
ff_cavs_
next_mb
(
h
))
goto
done
;
}
mb_type
=
get_ue_golomb
(
&
s
->
gb
)
+
B_DIRECT
;
...
...
@@ -561,7 +561,7 @@ static int decode_pic(AVSContext *h) {
decode_mb_i
(
h
,
mb_type
-
B_8X8
-
1
);
}
else
decode_mb_b
(
h
,
mb_type
);
}
while
(
next_mb
(
h
));
}
while
(
ff_cavs_
next_mb
(
h
));
}
done:
if
(
h
->
pic_type
!=
FF_B_TYPE
)
{
...
...
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