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
9fa888c0
Commit
9fa888c0
authored
Feb 20, 2016
by
Vittorio Giovara
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
intrax8: Keep a reference to the decoder blocks
parent
c2084ffc
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
24 additions
and
15 deletions
+24
-15
intrax8.c
libavcodec/intrax8.c
+16
-15
intrax8.h
libavcodec/intrax8.h
+6
-0
vc1dec.c
libavcodec/vc1dec.c
+1
-0
wmv2dec.c
libavcodec/wmv2dec.c
+1
-0
No files found.
libavcodec/intrax8.c
View file @
9fa888c0
...
...
@@ -480,9 +480,8 @@ static void x8_get_prediction(IntraX8Context *const w)
static
void
x8_ac_compensation
(
IntraX8Context
*
const
w
,
const
int
direction
,
const
int
dc_level
)
{
MpegEncContext
*
const
s
=
w
->
s
;
int
t
;
#define B(x, y)
s
->block[0][w->idsp.idct_permutation[(x) + (y) * 8]]
#define B(x, y)
w
->block[0][w->idsp.idct_permutation[(x) + (y) * 8]]
#define T(x) ((x) * dc_level + 0x8000) >> 16;
switch
(
direction
)
{
case
0
:
...
...
@@ -526,7 +525,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
t
=
T
(
1084
);
// g
B
(
1
,
1
)
+=
t
;
s
->
block_last_index
[
0
]
=
FFMAX
(
s
->
block_last_index
[
0
],
7
*
8
);
w
->
block_last_index
[
0
]
=
FFMAX
(
w
->
block_last_index
[
0
],
7
*
8
);
break
;
case
1
:
B
(
0
,
1
)
-=
T
(
6269
);
...
...
@@ -534,7 +533,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
B
(
0
,
5
)
-=
T
(
172
);
B
(
0
,
7
)
-=
T
(
73
);
s
->
block_last_index
[
0
]
=
FFMAX
(
s
->
block_last_index
[
0
],
7
*
8
);
w
->
block_last_index
[
0
]
=
FFMAX
(
w
->
block_last_index
[
0
],
7
*
8
);
break
;
case
2
:
B
(
1
,
0
)
-=
T
(
6269
);
...
...
@@ -542,7 +541,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
B
(
5
,
0
)
-=
T
(
172
);
B
(
7
,
0
)
-=
T
(
73
);
s
->
block_last_index
[
0
]
=
FFMAX
(
s
->
block_last_index
[
0
],
7
);
w
->
block_last_index
[
0
]
=
FFMAX
(
w
->
block_last_index
[
0
],
7
);
break
;
}
#undef B
...
...
@@ -572,8 +571,6 @@ static const int16_t quant_table[64] = {
static
int
x8_decode_intra_mb
(
IntraX8Context
*
const
w
,
const
int
chroma
)
{
MpegEncContext
*
const
s
=
w
->
s
;
uint8_t
*
scantable
;
int
final
,
run
,
level
;
int
ac_mode
,
dc_mode
,
est_run
,
dc_level
;
...
...
@@ -583,7 +580,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
int
sign
;
assert
(
w
->
orient
<
12
);
w
->
bdsp
.
clear_block
(
s
->
block
[
0
]);
w
->
bdsp
.
clear_block
(
w
->
block
[
0
]);
if
(
chroma
)
dc_mode
=
2
;
...
...
@@ -644,12 +641,12 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
if
(
use_quant_matrix
)
level
=
(
level
*
quant_table
[
pos
])
>>
8
;
s
->
block
[
0
][
scantable
[
pos
]]
=
level
;
w
->
block
[
0
][
scantable
[
pos
]]
=
level
;
}
while
(
!
final
);
s
->
block_last_index
[
0
]
=
pos
;
w
->
block_last_index
[
0
]
=
pos
;
}
else
{
// DC only
s
->
block_last_index
[
0
]
=
0
;
w
->
block_last_index
[
0
]
=
0
;
if
(
w
->
flat_dc
&&
((
unsigned
)
(
dc_level
+
1
))
<
3
)
{
// [-1; 1]
int32_t
divide_quant
=
!
chroma
?
w
->
divide_quant_dc_luma
:
w
->
divide_quant_dc_chroma
;
...
...
@@ -669,9 +666,9 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
zeros_only
=
(
dc_level
==
0
);
}
if
(
!
chroma
)
s
->
block
[
0
][
0
]
=
dc_level
*
w
->
quant
;
w
->
block
[
0
][
0
]
=
dc_level
*
w
->
quant
;
else
s
->
block
[
0
][
0
]
=
dc_level
*
w
->
quant_dc_chroma
;
w
->
block
[
0
][
0
]
=
dc_level
*
w
->
quant_dc_chroma
;
// there is !zero_only check in the original, but dc_level check is enough
if
((
unsigned
int
)
(
dc_level
+
1
)
>=
3
&&
(
w
->
edges
&
3
)
!=
3
)
{
...
...
@@ -681,7 +678,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
direction
=
(
0x6A017C
>>
(
w
->
orient
*
2
))
&
3
;
if
(
direction
!=
3
)
{
// modify block_last[]
x8_ac_compensation
(
w
,
direction
,
s
->
block
[
0
][
0
]);
x8_ac_compensation
(
w
,
direction
,
w
->
block
[
0
][
0
]);
}
}
...
...
@@ -696,7 +693,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
if
(
!
zeros_only
)
w
->
idsp
.
idct_add
(
w
->
dest
[
chroma
],
w
->
frame
->
linesize
[
!!
chroma
],
s
->
block
[
0
]);
w
->
block
[
0
]);
block_placed:
if
(
!
chroma
)
...
...
@@ -735,6 +732,8 @@ static void x8_init_block_index(IntraX8Context *w, AVFrame *frame)
av_cold
int
ff_intrax8_common_init
(
AVCodecContext
*
avctx
,
IntraX8Context
*
w
,
IDCTDSPContext
*
idsp
,
int16_t
(
*
block
)[
64
],
int
block_last_index
[
12
],
int
mb_width
,
int
mb_height
,
MpegEncContext
*
const
s
)
{
...
...
@@ -746,6 +745,8 @@ av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
w
->
idsp
=
*
idsp
;
w
->
mb_width
=
mb_width
;
w
->
mb_height
=
mb_height
;
w
->
block
=
block
;
w
->
block_last_index
=
block_last_index
;
w
->
s
=
s
;
// two rows, 2 blocks per cannon mb
...
...
libavcodec/intrax8.h
View file @
9fa888c0
...
...
@@ -37,6 +37,8 @@ typedef struct IntraX8Context {
uint8_t
*
prediction_table
;
// 2 * (mb_w * 2)
ScanTable
scantable
[
3
];
AVCodecContext
*
avctx
;
int
*
block_last_index
;
///< last nonzero coefficient in block
int16_t
(
*
block
)[
64
];
// set by the caller codec
MpegEncContext
*
s
;
...
...
@@ -77,6 +79,8 @@ typedef struct IntraX8Context {
* @param avctx pointer to AVCodecContext
* @param w pointer to IntraX8Context
* @param idsp pointer to IDCTDSPContext
* @param block pointer to block array
* @param block_last_index pointer to index array
* @param mb_width macroblock width
* @param mb_height macroblock height
* @param s pointer to MpegEncContext of the parent codec
...
...
@@ -84,6 +88,8 @@ typedef struct IntraX8Context {
*/
int
ff_intrax8_common_init
(
AVCodecContext
*
avctx
,
IntraX8Context
*
w
,
IDCTDSPContext
*
idsp
,
int16_t
(
*
block
)[
64
],
int
block_last_index
[
12
],
int
mb_width
,
int
mb_height
,
MpegEncContext
*
const
s
);
...
...
libavcodec/vc1dec.c
View file @
9fa888c0
...
...
@@ -380,6 +380,7 @@ av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
}
ret
=
ff_intrax8_common_init
(
s
->
avctx
,
&
v
->
x8
,
&
s
->
idsp
,
s
->
block
,
s
->
block_last_index
,
s
->
mb_width
,
s
->
mb_height
,
s
);
if
(
ret
<
0
)
...
...
libavcodec/wmv2dec.c
View file @
9fa888c0
...
...
@@ -475,6 +475,7 @@ static av_cold int wmv2_decode_init(AVCodecContext *avctx)
ff_wmv2_common_init
(
w
);
return
ff_intrax8_common_init
(
avctx
,
&
w
->
x8
,
&
w
->
s
.
idsp
,
w
->
s
.
block
,
w
->
s
.
block_last_index
,
w
->
s
.
mb_width
,
w
->
s
.
mb_height
,
&
w
->
s
);
}
...
...
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