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
d2264740
Commit
d2264740
authored
Mar 31, 2014
by
Vittorio Giovara
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
VP3: K&R formatting cosmetics
parent
66d04c06
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
462 additions
and
428 deletions
+462
-428
vp3.c
libavcodec/vp3.c
+373
-341
vp3_parser.c
libavcodec/vp3_parser.c
+7
-5
vp3data.h
libavcodec/vp3data.h
+14
-14
vp3dsp.c
libavcodec/vp3dsp.c
+68
-68
No files found.
libavcodec/vp3.c
View file @
d2264740
...
@@ -34,20 +34,21 @@
...
@@ -34,20 +34,21 @@
#include <string.h>
#include <string.h>
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
#include "avcodec.h"
#include "avcodec.h"
#include "internal.h"
#include "get_bits.h"
#include "get_bits.h"
#include "hpeldsp.h"
#include "hpeldsp.h"
#include "internal.h"
#include "mathops.h"
#include "mathops.h"
#include "thread.h"
#include "videodsp.h"
#include "videodsp.h"
#include "vp3data.h"
#include "vp3data.h"
#include "vp3dsp.h"
#include "vp3dsp.h"
#include "xiph.h"
#include "xiph.h"
#include "thread.h"
#define FRAGMENT_PIXELS 8
#define FRAGMENT_PIXELS 8
//FIXME split things out into their own arrays
//
FIXME split things out into their own arrays
typedef
struct
Vp3Fragment
{
typedef
struct
Vp3Fragment
{
int16_t
dc
;
int16_t
dc
;
uint8_t
coding_method
;
uint8_t
coding_method
;
...
@@ -77,8 +78,7 @@ typedef struct Vp3Fragment {
...
@@ -77,8 +78,7 @@ typedef struct Vp3Fragment {
#define MODE_COPY 8
#define MODE_COPY 8
/* There are 6 preset schemes, plus a free-form scheme */
/* There are 6 preset schemes, plus a free-form scheme */
static
const
int
ModeAlphabet
[
6
][
CODING_MODE_COUNT
]
=
static
const
int
ModeAlphabet
[
6
][
CODING_MODE_COUNT
]
=
{
{
/* scheme 1: Last motion vector dominates */
/* scheme 1: Last motion vector dominates */
{
MODE_INTER_LAST_MV
,
MODE_INTER_PRIOR_LAST
,
{
MODE_INTER_LAST_MV
,
MODE_INTER_PRIOR_LAST
,
MODE_INTER_PLUS_MV
,
MODE_INTER_NO_MV
,
MODE_INTER_PLUS_MV
,
MODE_INTER_NO_MV
,
...
@@ -114,14 +114,13 @@ static const int ModeAlphabet[6][CODING_MODE_COUNT] =
...
@@ -114,14 +114,13 @@ static const int ModeAlphabet[6][CODING_MODE_COUNT] =
MODE_INTER_LAST_MV
,
MODE_INTER_PRIOR_LAST
,
MODE_INTER_LAST_MV
,
MODE_INTER_PRIOR_LAST
,
MODE_INTER_PLUS_MV
,
MODE_INTRA
,
MODE_INTER_PLUS_MV
,
MODE_INTRA
,
MODE_GOLDEN_MV
,
MODE_INTER_FOURMV
},
MODE_GOLDEN_MV
,
MODE_INTER_FOURMV
},
};
};
static
const
uint8_t
hilbert_offset
[
16
][
2
]
=
{
static
const
uint8_t
hilbert_offset
[
16
][
2
]
=
{
{
0
,
0
},
{
1
,
0
},
{
1
,
1
},
{
0
,
1
},
{
0
,
0
},
{
1
,
0
},
{
1
,
1
},
{
0
,
1
},
{
0
,
2
},
{
0
,
3
},
{
1
,
3
},
{
1
,
2
},
{
0
,
2
},
{
0
,
3
},
{
1
,
3
},
{
1
,
2
},
{
2
,
2
},
{
2
,
3
},
{
3
,
3
},
{
3
,
2
},
{
2
,
2
},
{
2
,
3
},
{
3
,
3
},
{
3
,
2
},
{
3
,
1
},
{
2
,
1
},
{
2
,
0
},
{
3
,
0
}
{
3
,
1
},
{
2
,
1
},
{
2
,
0
},
{
3
,
0
}
};
};
#define MIN_DEQUANT_VAL 2
#define MIN_DEQUANT_VAL 2
...
@@ -180,7 +179,7 @@ typedef struct Vp3DecodeContext {
...
@@ -180,7 +179,7 @@ typedef struct Vp3DecodeContext {
uint32_t
coded_ac_scale_factor
[
64
];
uint32_t
coded_ac_scale_factor
[
64
];
uint8_t
base_matrix
[
384
][
64
];
uint8_t
base_matrix
[
384
][
64
];
uint8_t
qr_count
[
2
][
3
];
uint8_t
qr_count
[
2
][
3
];
uint8_t
qr_size
[
2
][
3
][
64
];
uint8_t
qr_size
[
2
][
3
][
64
];
uint16_t
qr_base
[
2
][
3
][
64
];
uint16_t
qr_base
[
2
][
3
][
64
];
/**
/**
...
@@ -207,7 +206,8 @@ typedef struct Vp3DecodeContext {
...
@@ -207,7 +206,8 @@ typedef struct Vp3DecodeContext {
#define TOKEN_COEFF(coeff) (((coeff) << 2) + 2)
#define TOKEN_COEFF(coeff) (((coeff) << 2) + 2)
/**
/**
* number of blocks that contain DCT coefficients at the given level or higher
* number of blocks that contain DCT coefficients at
* the given level or higher
*/
*/
int
num_coded_frags
[
3
][
64
];
int
num_coded_frags
[
3
][
64
];
int
total_num_coded_frags
;
int
total_num_coded_frags
;
...
@@ -251,7 +251,7 @@ typedef struct Vp3DecodeContext {
...
@@ -251,7 +251,7 @@ typedef struct Vp3DecodeContext {
uint32_t
huffman_table
[
80
][
32
][
2
];
uint32_t
huffman_table
[
80
][
32
][
2
];
uint8_t
filter_limit_values
[
64
];
uint8_t
filter_limit_values
[
64
];
DECLARE_ALIGNED
(
8
,
int
,
bounding_values_array
)[
256
+
2
];
DECLARE_ALIGNED
(
8
,
int
,
bounding_values_array
)[
256
+
2
];
}
Vp3DecodeContext
;
}
Vp3DecodeContext
;
/************************************************************************
/************************************************************************
...
@@ -307,7 +307,6 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
...
@@ -307,7 +307,6 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
ff_free_vlc
(
&
s
->
mode_code_vlc
);
ff_free_vlc
(
&
s
->
mode_code_vlc
);
ff_free_vlc
(
&
s
->
motion_vector_vlc
);
ff_free_vlc
(
&
s
->
motion_vector_vlc
);
return
0
;
return
0
;
}
}
...
@@ -324,19 +323,22 @@ static int init_block_mapping(Vp3DecodeContext *s)
...
@@ -324,19 +323,22 @@ static int init_block_mapping(Vp3DecodeContext *s)
int
x
,
y
,
i
,
j
=
0
;
int
x
,
y
,
i
,
j
=
0
;
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
int
sb_width
=
plane
?
s
->
c_superblock_width
:
s
->
y_superblock_width
;
int
sb_width
=
plane
?
s
->
c_superblock_width
int
sb_height
=
plane
?
s
->
c_superblock_height
:
s
->
y_superblock_height
;
:
s
->
y_superblock_width
;
int
sb_height
=
plane
?
s
->
c_superblock_height
:
s
->
y_superblock_height
;
int
frag_width
=
s
->
fragment_width
[
!!
plane
];
int
frag_width
=
s
->
fragment_width
[
!!
plane
];
int
frag_height
=
s
->
fragment_height
[
!!
plane
];
int
frag_height
=
s
->
fragment_height
[
!!
plane
];
for
(
sb_y
=
0
;
sb_y
<
sb_height
;
sb_y
++
)
for
(
sb_y
=
0
;
sb_y
<
sb_height
;
sb_y
++
)
for
(
sb_x
=
0
;
sb_x
<
sb_width
;
sb_x
++
)
for
(
sb_x
=
0
;
sb_x
<
sb_width
;
sb_x
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
x
=
4
*
sb_x
+
hilbert_offset
[
i
][
0
];
x
=
4
*
sb_x
+
hilbert_offset
[
i
][
0
];
y
=
4
*
sb_y
+
hilbert_offset
[
i
][
1
];
y
=
4
*
sb_y
+
hilbert_offset
[
i
][
1
];
if
(
x
<
frag_width
&&
y
<
frag_height
)
if
(
x
<
frag_width
&&
y
<
frag_height
)
s
->
superblock_fragments
[
j
++
]
=
s
->
fragment_start
[
plane
]
+
y
*
frag_width
+
x
;
s
->
superblock_fragments
[
j
++
]
=
s
->
fragment_start
[
plane
]
+
y
*
frag_width
+
x
;
else
else
s
->
superblock_fragments
[
j
++
]
=
-
1
;
s
->
superblock_fragments
[
j
++
]
=
-
1
;
}
}
...
@@ -355,30 +357,31 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi)
...
@@ -355,30 +357,31 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi)
int
dc_scale_factor
=
s
->
coded_dc_scale_factor
[
s
->
qps
[
qpi
]];
int
dc_scale_factor
=
s
->
coded_dc_scale_factor
[
s
->
qps
[
qpi
]];
int
i
,
plane
,
inter
,
qri
,
bmi
,
bmj
,
qistart
;
int
i
,
plane
,
inter
,
qri
,
bmi
,
bmj
,
qistart
;
for
(
inter
=
0
;
inter
<
2
;
inter
++
)
{
for
(
inter
=
0
;
inter
<
2
;
inter
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
int
sum
=
0
;
int
sum
=
0
;
for
(
qri
=
0
;
qri
<
s
->
qr_count
[
inter
][
plane
];
qri
++
)
{
for
(
qri
=
0
;
qri
<
s
->
qr_count
[
inter
][
plane
];
qri
++
)
{
sum
+=
s
->
qr_size
[
inter
][
plane
][
qri
];
sum
+=
s
->
qr_size
[
inter
][
plane
][
qri
];
if
(
s
->
qps
[
qpi
]
<=
sum
)
if
(
s
->
qps
[
qpi
]
<=
sum
)
break
;
break
;
}
}
qistart
=
sum
-
s
->
qr_size
[
inter
][
plane
][
qri
];
qistart
=
sum
-
s
->
qr_size
[
inter
][
plane
][
qri
];
bmi
=
s
->
qr_base
[
inter
][
plane
][
qri
];
bmi
=
s
->
qr_base
[
inter
][
plane
][
qri
];
bmj
=
s
->
qr_base
[
inter
][
plane
][
qri
+
1
];
bmj
=
s
->
qr_base
[
inter
][
plane
][
qri
+
1
];
for
(
i
=
0
;
i
<
64
;
i
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
int
coeff
=
(
2
*
(
sum
-
s
->
qps
[
qpi
])
*
s
->
base_matrix
[
bmi
][
i
]
int
coeff
=
(
2
*
(
sum
-
s
->
qps
[
qpi
])
*
s
->
base_matrix
[
bmi
][
i
]
-
-
2
*
(
qistart
-
s
->
qps
[
qpi
])
*
s
->
base_matrix
[
bmj
][
i
]
2
*
(
qistart
-
s
->
qps
[
qpi
])
*
s
->
base_matrix
[
bmj
][
i
]
+
+
s
->
qr_size
[
inter
][
plane
][
qri
])
s
->
qr_size
[
inter
][
plane
][
qri
])
/
/
(
2
*
s
->
qr_size
[
inter
][
plane
][
qri
]);
(
2
*
s
->
qr_size
[
inter
][
plane
][
qri
]);
int
qmin
=
8
<<
(
inter
+
!
i
);
int
qmin
=
8
<<
(
inter
+
!
i
);
int
qscale
=
i
?
ac_scale_factor
:
dc_scale_factor
;
int
qscale
=
i
?
ac_scale_factor
:
dc_scale_factor
;
s
->
qmat
[
qpi
][
inter
][
plane
][
s
->
idct_permutation
[
i
]]
=
s
->
qmat
[
qpi
][
inter
][
plane
][
s
->
idct_permutation
[
i
]]
=
av_clip
((
qscale
*
coeff
)
/
100
*
4
,
qmin
,
4096
);
av_clip
((
qscale
*
coeff
)
/
100
*
4
,
qmin
,
4096
);
}
}
// all DC coefficients use the same quant so as not to interfere with DC prediction
/* all DC coefficients use the same quant so as not to interfere
* with DC prediction */
s
->
qmat
[
qpi
][
inter
][
plane
][
0
]
=
s
->
qmat
[
0
][
inter
][
plane
][
0
];
s
->
qmat
[
qpi
][
inter
][
plane
][
0
]
=
s
->
qmat
[
0
][
inter
][
plane
][
0
];
}
}
}
}
...
@@ -392,7 +395,7 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi)
...
@@ -392,7 +395,7 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi)
*/
*/
static
void
init_loop_filter
(
Vp3DecodeContext
*
s
)
static
void
init_loop_filter
(
Vp3DecodeContext
*
s
)
{
{
int
*
bounding_values
=
s
->
bounding_values_array
+
127
;
int
*
bounding_values
=
s
->
bounding_values_array
+
127
;
int
filter_limit
;
int
filter_limit
;
int
x
;
int
x
;
int
value
;
int
value
;
...
@@ -421,7 +424,9 @@ static void init_loop_filter(Vp3DecodeContext *s)
...
@@ -421,7 +424,9 @@ static void init_loop_filter(Vp3DecodeContext *s)
*/
*/
static
int
unpack_superblocks
(
Vp3DecodeContext
*
s
,
GetBitContext
*
gb
)
static
int
unpack_superblocks
(
Vp3DecodeContext
*
s
,
GetBitContext
*
gb
)
{
{
int
superblock_starts
[
3
]
=
{
0
,
s
->
u_superblock_start
,
s
->
v_superblock_start
};
int
superblock_starts
[
3
]
=
{
0
,
s
->
u_superblock_start
,
s
->
v_superblock_start
};
int
bit
=
0
;
int
bit
=
0
;
int
current_superblock
=
0
;
int
current_superblock
=
0
;
int
current_run
=
0
;
int
current_run
=
0
;
...
@@ -433,9 +438,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -433,9 +438,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
if
(
s
->
keyframe
)
{
if
(
s
->
keyframe
)
{
memset
(
s
->
superblock_coding
,
SB_FULLY_CODED
,
s
->
superblock_count
);
memset
(
s
->
superblock_coding
,
SB_FULLY_CODED
,
s
->
superblock_count
);
}
else
{
}
else
{
/* unpack the list of partially-coded superblocks */
/* unpack the list of partially-coded superblocks */
bit
=
get_bits1
(
gb
)
^
1
;
bit
=
get_bits1
(
gb
)
^
1
;
current_run
=
0
;
current_run
=
0
;
...
@@ -446,13 +449,14 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -446,13 +449,14 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
else
else
bit
^=
1
;
bit
^=
1
;
current_run
=
get_vlc2
(
gb
,
current_run
=
get_vlc2
(
gb
,
s
->
superblock_run_length_vlc
.
table
,
s
->
superblock_run_length_vlc
.
table
,
6
,
2
)
+
1
;
6
,
2
)
+
1
;
if
(
current_run
==
34
)
if
(
current_run
==
34
)
current_run
+=
get_bits
(
gb
,
12
);
current_run
+=
get_bits
(
gb
,
12
);
if
(
current_superblock
+
current_run
>
s
->
superblock_count
)
{
if
(
current_superblock
+
current_run
>
s
->
superblock_count
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid partially coded superblock run length
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid partially coded superblock run length
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -472,28 +476,28 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -472,28 +476,28 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
bit
=
get_bits1
(
gb
)
^
1
;
bit
=
get_bits1
(
gb
)
^
1
;
current_run
=
0
;
current_run
=
0
;
while
(
superblocks_decoded
<
s
->
superblock_count
-
num_partial_superblocks
while
(
superblocks_decoded
<
s
->
superblock_count
-
num_partial_superblocks
&&
&&
get_bits_left
(
gb
)
>
0
)
{
get_bits_left
(
gb
)
>
0
)
{
if
(
s
->
theora
&&
current_run
==
MAXIMUM_LONG_BIT_RUN
)
if
(
s
->
theora
&&
current_run
==
MAXIMUM_LONG_BIT_RUN
)
bit
=
get_bits1
(
gb
);
bit
=
get_bits1
(
gb
);
else
else
bit
^=
1
;
bit
^=
1
;
current_run
=
get_vlc2
(
gb
,
current_run
=
get_vlc2
(
gb
,
s
->
superblock_run_length_vlc
.
table
,
s
->
superblock_run_length_vlc
.
table
,
6
,
2
)
+
1
;
6
,
2
)
+
1
;
if
(
current_run
==
34
)
if
(
current_run
==
34
)
current_run
+=
get_bits
(
gb
,
12
);
current_run
+=
get_bits
(
gb
,
12
);
for
(
j
=
0
;
j
<
current_run
;
current_superblock
++
)
{
for
(
j
=
0
;
j
<
current_run
;
current_superblock
++
)
{
if
(
current_superblock
>=
s
->
superblock_count
)
{
if
(
current_superblock
>=
s
->
superblock_count
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid fully coded superblock run length
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid fully coded superblock run length
\n
"
);
return
-
1
;
return
-
1
;
}
}
/* skip any superblocks already marked as partially coded */
/* skip any superblocks already marked as partially coded */
if
(
s
->
superblock_coding
[
current_superblock
]
==
SB_NOT_CODED
)
{
if
(
s
->
superblock_coding
[
current_superblock
]
==
SB_NOT_CODED
)
{
s
->
superblock_coding
[
current_superblock
]
=
2
*
bit
;
s
->
superblock_coding
[
current_superblock
]
=
2
*
bit
;
j
++
;
j
++
;
}
}
}
}
...
@@ -504,7 +508,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -504,7 +508,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
/* if there were partial blocks, initialize bitstream for
/* if there were partial blocks, initialize bitstream for
* unpacking fragment codings */
* unpacking fragment codings */
if
(
num_partial_superblocks
)
{
if
(
num_partial_superblocks
)
{
current_run
=
0
;
current_run
=
0
;
bit
=
get_bits1
(
gb
);
bit
=
get_bits1
(
gb
);
/* toggle the bit because as soon as the first run length is
/* toggle the bit because as soon as the first run length is
...
@@ -520,27 +523,24 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -520,27 +523,24 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
int
sb_start
=
superblock_starts
[
plane
];
int
sb_start
=
superblock_starts
[
plane
];
int
sb_end
=
sb_start
+
(
plane
?
s
->
c_superblock_count
:
s
->
y_superblock_count
);
int
sb_end
=
sb_start
+
(
plane
?
s
->
c_superblock_count
:
s
->
y_superblock_count
);
int
num_coded_frags
=
0
;
int
num_coded_frags
=
0
;
for
(
i
=
sb_start
;
i
<
sb_end
&&
get_bits_left
(
gb
)
>
0
;
i
++
)
{
for
(
i
=
sb_start
;
i
<
sb_end
&&
get_bits_left
(
gb
)
>
0
;
i
++
)
{
/* iterate through all 16 fragments in a superblock */
/* iterate through all 16 fragments in a superblock */
for
(
j
=
0
;
j
<
16
;
j
++
)
{
for
(
j
=
0
;
j
<
16
;
j
++
)
{
/* if the fragment is in bounds, check its coding status */
/* if the fragment is in bounds, check its coding status */
current_fragment
=
s
->
superblock_fragments
[
i
*
16
+
j
];
current_fragment
=
s
->
superblock_fragments
[
i
*
16
+
j
];
if
(
current_fragment
!=
-
1
)
{
if
(
current_fragment
!=
-
1
)
{
int
coded
=
s
->
superblock_coding
[
i
];
int
coded
=
s
->
superblock_coding
[
i
];
if
(
s
->
superblock_coding
[
i
]
==
SB_PARTIALLY_CODED
)
{
if
(
s
->
superblock_coding
[
i
]
==
SB_PARTIALLY_CODED
)
{
/* fragment may or may not be coded; this is the case
/* fragment may or may not be coded; this is the case
* that cares about the fragment coding runs */
* that cares about the fragment coding runs */
if
(
current_run
--
==
0
)
{
if
(
current_run
--
==
0
)
{
bit
^=
1
;
bit
^=
1
;
current_run
=
get_vlc2
(
gb
,
current_run
=
get_vlc2
(
gb
,
s
->
fragment_run_length_vlc
.
table
,
5
,
2
);
s
->
fragment_run_length_vlc
.
table
,
5
,
2
);
}
}
coded
=
bit
;
coded
=
bit
;
}
}
...
@@ -564,7 +564,8 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -564,7 +564,8 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
for
(
i
=
0
;
i
<
64
;
i
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
s
->
num_coded_frags
[
plane
][
i
]
=
num_coded_frags
;
s
->
num_coded_frags
[
plane
][
i
]
=
num_coded_frags
;
if
(
plane
<
2
)
if
(
plane
<
2
)
s
->
coded_fragment_list
[
plane
+
1
]
=
s
->
coded_fragment_list
[
plane
]
+
num_coded_frags
;
s
->
coded_fragment_list
[
plane
+
1
]
=
s
->
coded_fragment_list
[
plane
]
+
num_coded_frags
;
}
}
return
0
;
return
0
;
}
}
...
@@ -587,9 +588,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -587,9 +588,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
if
(
s
->
keyframe
)
{
if
(
s
->
keyframe
)
{
for
(
i
=
0
;
i
<
s
->
fragment_count
;
i
++
)
for
(
i
=
0
;
i
<
s
->
fragment_count
;
i
++
)
s
->
all_fragments
[
i
].
coding_method
=
MODE_INTRA
;
s
->
all_fragments
[
i
].
coding_method
=
MODE_INTRA
;
}
else
{
}
else
{
/* fetch the mode coding scheme for this frame */
/* fetch the mode coding scheme for this frame */
scheme
=
get_bits
(
gb
,
3
);
scheme
=
get_bits
(
gb
,
3
);
...
@@ -601,7 +600,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -601,7 +600,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
custom_mode_alphabet
[
get_bits
(
gb
,
3
)]
=
i
;
custom_mode_alphabet
[
get_bits
(
gb
,
3
)]
=
i
;
alphabet
=
custom_mode_alphabet
;
alphabet
=
custom_mode_alphabet
;
}
else
}
else
alphabet
=
ModeAlphabet
[
scheme
-
1
];
alphabet
=
ModeAlphabet
[
scheme
-
1
];
/* iterate through all of the macroblocks that contain 1 or more
/* iterate through all of the macroblocks that contain 1 or more
* coded fragments */
* coded fragments */
...
@@ -611,19 +610,22 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -611,19 +610,22 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
return
-
1
;
return
-
1
;
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
int
mb_x
=
2
*
sb_x
+
(
j
>>
1
);
int
mb_x
=
2
*
sb_x
+
(
j
>>
1
);
int
mb_y
=
2
*
sb_y
+
(((
j
>>
1
)
+
j
)
&
1
);
int
mb_y
=
2
*
sb_y
+
(((
j
>>
1
)
+
j
)
&
1
);
current_macroblock
=
mb_y
*
s
->
macroblock_width
+
mb_x
;
current_macroblock
=
mb_y
*
s
->
macroblock_width
+
mb_x
;
if
(
mb_x
>=
s
->
macroblock_width
||
mb_y
>=
s
->
macroblock_height
)
if
(
mb_x
>=
s
->
macroblock_width
||
mb_y
>=
s
->
macroblock_height
)
continue
;
continue
;
#define BLOCK_X (2*mb_x + (k&1))
#define BLOCK_X (2 * mb_x + (k & 1))
#define BLOCK_Y (2*mb_y + (k>>1))
#define BLOCK_Y (2 * mb_y + (k >> 1))
/* coding modes are only stored if the macroblock has at least one
/* coding modes are only stored if the macroblock has
* luma block coded, otherwise it must be INTER_NO_MV */
* at least one luma block coded, otherwise it must be
* INTER_NO_MV */
for
(
k
=
0
;
k
<
4
;
k
++
)
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
current_fragment
=
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
current_fragment
=
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
if
(
s
->
all_fragments
[
current_fragment
].
coding_method
!=
MODE_COPY
)
if
(
s
->
all_fragments
[
current_fragment
].
coding_method
!=
MODE_COPY
)
break
;
break
;
}
}
...
@@ -636,34 +638,36 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -636,34 +638,36 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
if
(
scheme
==
7
)
if
(
scheme
==
7
)
coding_mode
=
get_bits
(
gb
,
3
);
coding_mode
=
get_bits
(
gb
,
3
);
else
else
coding_mode
=
alphabet
coding_mode
=
alphabet
[
get_vlc2
(
gb
,
s
->
mode_code_vlc
.
table
,
3
,
3
)];
[
get_vlc2
(
gb
,
s
->
mode_code_vlc
.
table
,
3
,
3
)];
s
->
macroblock_coding
[
current_macroblock
]
=
coding_mode
;
s
->
macroblock_coding
[
current_macroblock
]
=
coding_mode
;
for
(
k
=
0
;
k
<
4
;
k
++
)
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
frag
=
s
->
all_fragments
+
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
frag
=
s
->
all_fragments
+
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
if
(
frag
->
coding_method
!=
MODE_COPY
)
if
(
frag
->
coding_method
!=
MODE_COPY
)
frag
->
coding_method
=
coding_mode
;
frag
->
coding_method
=
coding_mode
;
}
}
#define SET_CHROMA_MODES \
#define SET_CHROMA_MODES \
if (frag[s->fragment_start[1]].coding_method != MODE_COPY) \
if (frag[s->fragment_start[1]].coding_method != MODE_COPY) \
frag[s->fragment_start[1]].coding_method = coding_mode;\
frag[s->fragment_start[1]].coding_method = coding_mode;
\
if (frag[s->fragment_start[2]].coding_method != MODE_COPY) \
if (frag[s->fragment_start[2]].coding_method != MODE_COPY) \
frag[s->fragment_start[2]].coding_method = coding_mode;
frag[s->fragment_start[2]].coding_method = coding_mode;
if
(
s
->
chroma_y_shift
)
{
if
(
s
->
chroma_y_shift
)
{
frag
=
s
->
all_fragments
+
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
frag
=
s
->
all_fragments
+
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
SET_CHROMA_MODES
SET_CHROMA_MODES
}
else
if
(
s
->
chroma_x_shift
)
{
}
else
if
(
s
->
chroma_x_shift
)
{
frag
=
s
->
all_fragments
+
2
*
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
frag
=
s
->
all_fragments
+
2
*
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
for
(
k
=
0
;
k
<
2
;
k
++
)
{
for
(
k
=
0
;
k
<
2
;
k
++
)
{
SET_CHROMA_MODES
SET_CHROMA_MODES
frag
+=
s
->
fragment_width
[
1
];
frag
+=
s
->
fragment_width
[
1
];
}
}
}
else
{
}
else
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
frag
=
s
->
all_fragments
+
BLOCK_Y
*
s
->
fragment_width
[
1
]
+
BLOCK_X
;
frag
=
s
->
all_fragments
+
BLOCK_Y
*
s
->
fragment_width
[
1
]
+
BLOCK_X
;
SET_CHROMA_MODES
SET_CHROMA_MODES
}
}
}
}
...
@@ -707,16 +711,16 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -707,16 +711,16 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
return
-
1
;
return
-
1
;
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
int
mb_x
=
2
*
sb_x
+
(
j
>>
1
);
int
mb_x
=
2
*
sb_x
+
(
j
>>
1
);
int
mb_y
=
2
*
sb_y
+
(((
j
>>
1
)
+
j
)
&
1
);
int
mb_y
=
2
*
sb_y
+
(((
j
>>
1
)
+
j
)
&
1
);
current_macroblock
=
mb_y
*
s
->
macroblock_width
+
mb_x
;
current_macroblock
=
mb_y
*
s
->
macroblock_width
+
mb_x
;
if
(
mb_x
>=
s
->
macroblock_width
||
mb_y
>=
s
->
macroblock_height
||
if
(
mb_x
>=
s
->
macroblock_width
||
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_COPY
))
mb_y
>=
s
->
macroblock_height
||
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_COPY
)
continue
;
continue
;
switch
(
s
->
macroblock_coding
[
current_macroblock
])
{
switch
(
s
->
macroblock_coding
[
current_macroblock
])
{
case
MODE_INTER_PLUS_MV
:
case
MODE_INTER_PLUS_MV
:
case
MODE_GOLDEN_MV
:
case
MODE_GOLDEN_MV
:
/* all 6 fragments use the same motion vector */
/* all 6 fragments use the same motion vector */
...
@@ -729,8 +733,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -729,8 +733,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
}
}
/* vector maintenance, only on MODE_INTER_PLUS_MV */
/* vector maintenance, only on MODE_INTER_PLUS_MV */
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_PLUS_MV
)
{
MODE_INTER_PLUS_MV
)
{
prior_last_motion_x
=
last_motion_x
;
prior_last_motion_x
=
last_motion_x
;
prior_last_motion_y
=
last_motion_y
;
prior_last_motion_y
=
last_motion_y
;
last_motion_x
=
motion_x
[
0
];
last_motion_x
=
motion_x
[
0
];
...
@@ -746,7 +749,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -746,7 +749,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
/* fetch 4 vectors from the bitstream, one for each
/* fetch 4 vectors from the bitstream, one for each
* Y fragment, then average for the C fragment vectors */
* Y fragment, then average for the C fragment vectors */
for
(
k
=
0
;
k
<
4
;
k
++
)
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
current_fragment
=
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
current_fragment
=
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
if
(
s
->
all_fragments
[
current_fragment
].
coding_method
!=
MODE_COPY
)
{
if
(
s
->
all_fragments
[
current_fragment
].
coding_method
!=
MODE_COPY
)
{
if
(
coding_mode
==
0
)
{
if
(
coding_mode
==
0
)
{
motion_x
[
k
]
=
motion_vector_table
[
get_vlc2
(
gb
,
s
->
motion_vector_vlc
.
table
,
6
,
2
)];
motion_x
[
k
]
=
motion_vector_table
[
get_vlc2
(
gb
,
s
->
motion_vector_vlc
.
table
,
6
,
2
)];
...
@@ -798,7 +801,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -798,7 +801,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
/* assign the motion vectors to the correct fragments */
/* assign the motion vectors to the correct fragments */
for
(
k
=
0
;
k
<
4
;
k
++
)
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
current_fragment
=
current_fragment
=
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
BLOCK_Y
*
s
->
fragment_width
[
0
]
+
BLOCK_X
;
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_FOURMV
)
{
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_FOURMV
)
{
s
->
motion_val
[
0
][
current_fragment
][
0
]
=
motion_x
[
k
];
s
->
motion_val
[
0
][
current_fragment
][
0
]
=
motion_x
[
k
];
s
->
motion_val
[
0
][
current_fragment
][
1
]
=
motion_y
[
k
];
s
->
motion_val
[
0
][
current_fragment
][
1
]
=
motion_y
[
k
];
...
@@ -810,12 +813,14 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -810,12 +813,14 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
if
(
s
->
chroma_y_shift
)
{
if
(
s
->
chroma_y_shift
)
{
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_FOURMV
)
{
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_FOURMV
)
{
motion_x
[
0
]
=
RSHIFT
(
motion_x
[
0
]
+
motion_x
[
1
]
+
motion_x
[
2
]
+
motion_x
[
3
],
2
);
motion_x
[
0
]
=
RSHIFT
(
motion_x
[
0
]
+
motion_x
[
1
]
+
motion_y
[
0
]
=
RSHIFT
(
motion_y
[
0
]
+
motion_y
[
1
]
+
motion_y
[
2
]
+
motion_y
[
3
],
2
);
motion_x
[
2
]
+
motion_x
[
3
],
2
);
}
motion_y
[
0
]
=
RSHIFT
(
motion_y
[
0
]
+
motion_y
[
1
]
+
motion_x
[
0
]
=
(
motion_x
[
0
]
>>
1
)
|
(
motion_x
[
0
]
&
1
);
motion_y
[
2
]
+
motion_y
[
3
],
2
);
motion_y
[
0
]
=
(
motion_y
[
0
]
>>
1
)
|
(
motion_y
[
0
]
&
1
);
}
frag
=
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
motion_x
[
0
]
=
(
motion_x
[
0
]
>>
1
)
|
(
motion_x
[
0
]
&
1
);
motion_y
[
0
]
=
(
motion_y
[
0
]
>>
1
)
|
(
motion_y
[
0
]
&
1
);
frag
=
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
s
->
motion_val
[
1
][
frag
][
0
]
=
motion_x
[
0
];
s
->
motion_val
[
1
][
frag
][
0
]
=
motion_x
[
0
];
s
->
motion_val
[
1
][
frag
][
1
]
=
motion_y
[
0
];
s
->
motion_val
[
1
][
frag
][
1
]
=
motion_y
[
0
];
}
else
if
(
s
->
chroma_x_shift
)
{
}
else
if
(
s
->
chroma_x_shift
)
{
...
@@ -828,10 +833,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -828,10 +833,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
motion_x
[
1
]
=
motion_x
[
0
];
motion_x
[
1
]
=
motion_x
[
0
];
motion_y
[
1
]
=
motion_y
[
0
];
motion_y
[
1
]
=
motion_y
[
0
];
}
}
motion_x
[
0
]
=
(
motion_x
[
0
]
>>
1
)
|
(
motion_x
[
0
]
&
1
);
motion_x
[
0
]
=
(
motion_x
[
0
]
>>
1
)
|
(
motion_x
[
0
]
&
1
);
motion_x
[
1
]
=
(
motion_x
[
1
]
>>
1
)
|
(
motion_x
[
1
]
&
1
);
motion_x
[
1
]
=
(
motion_x
[
1
]
>>
1
)
|
(
motion_x
[
1
]
&
1
);
frag
=
2
*
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
frag
=
2
*
mb_y
*
s
->
fragment_width
[
1
]
+
mb_x
;
for
(
k
=
0
;
k
<
2
;
k
++
)
{
for
(
k
=
0
;
k
<
2
;
k
++
)
{
s
->
motion_val
[
1
][
frag
][
0
]
=
motion_x
[
k
];
s
->
motion_val
[
1
][
frag
][
0
]
=
motion_x
[
k
];
s
->
motion_val
[
1
][
frag
][
1
]
=
motion_y
[
k
];
s
->
motion_val
[
1
][
frag
][
1
]
=
motion_y
[
k
];
...
@@ -839,7 +844,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -839,7 +844,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
}
}
}
else
{
}
else
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
for
(
k
=
0
;
k
<
4
;
k
++
)
{
frag
=
BLOCK_Y
*
s
->
fragment_width
[
1
]
+
BLOCK_X
;
frag
=
BLOCK_Y
*
s
->
fragment_width
[
1
]
+
BLOCK_X
;
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_FOURMV
)
{
if
(
s
->
macroblock_coding
[
current_macroblock
]
==
MODE_INTER_FOURMV
)
{
s
->
motion_val
[
1
][
frag
][
0
]
=
motion_x
[
k
];
s
->
motion_val
[
1
][
frag
][
0
]
=
motion_x
[
k
];
s
->
motion_val
[
1
][
frag
][
1
]
=
motion_y
[
k
];
s
->
motion_val
[
1
][
frag
][
1
]
=
motion_y
[
k
];
...
@@ -861,7 +866,7 @@ static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -861,7 +866,7 @@ static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb)
int
qpi
,
i
,
j
,
bit
,
run_length
,
blocks_decoded
,
num_blocks_at_qpi
;
int
qpi
,
i
,
j
,
bit
,
run_length
,
blocks_decoded
,
num_blocks_at_qpi
;
int
num_blocks
=
s
->
total_num_coded_frags
;
int
num_blocks
=
s
->
total_num_coded_frags
;
for
(
qpi
=
0
;
qpi
<
s
->
nqps
-
1
&&
num_blocks
>
0
;
qpi
++
)
{
for
(
qpi
=
0
;
qpi
<
s
->
nqps
-
1
&&
num_blocks
>
0
;
qpi
++
)
{
i
=
blocks_decoded
=
num_blocks_at_qpi
=
0
;
i
=
blocks_decoded
=
num_blocks_at_qpi
=
0
;
bit
=
get_bits1
(
gb
)
^
1
;
bit
=
get_bits1
(
gb
)
^
1
;
...
@@ -928,16 +933,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
...
@@ -928,16 +933,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
/* local references to structure members to avoid repeated deferences */
/* local references to structure members to avoid repeated deferences */
int
*
coded_fragment_list
=
s
->
coded_fragment_list
[
plane
];
int
*
coded_fragment_list
=
s
->
coded_fragment_list
[
plane
];
Vp3Fragment
*
all_fragments
=
s
->
all_fragments
;
Vp3Fragment
*
all_fragments
=
s
->
all_fragments
;
VLC_TYPE
(
*
vlc_table
)[
2
]
=
table
->
table
;
VLC_TYPE
(
*
vlc_table
)[
2
]
=
table
->
table
;
if
(
num_coeffs
<
0
)
if
(
num_coeffs
<
0
)
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid number of coefficents at level %d
\n
"
,
coeff_index
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid number of coefficents at level %d
\n
"
,
coeff_index
);
if
(
eob_run
>
num_coeffs
)
{
if
(
eob_run
>
num_coeffs
)
{
coeff_i
=
blocks_ended
=
num_coeffs
;
coeff_i
=
blocks_ended
=
num_coeffs
;
eob_run
-=
num_coeffs
;
eob_run
-=
num_coeffs
;
}
else
{
}
else
{
coeff_i
=
blocks_ended
=
eob_run
;
coeff_i
=
blocks_ended
=
eob_run
;
eob_run
=
0
;
eob_run
=
0
;
}
}
...
@@ -991,19 +999,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
...
@@ -991,19 +999,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
}
}
if
(
coeff_index
+
zero_run
>
64
)
{
if
(
coeff_index
+
zero_run
>
64
)
{
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"Invalid zero run of %d with"
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
" %d coeffs left
\n
"
,
zero_run
,
64
-
coeff_index
);
"Invalid zero run of %d with %d coeffs left
\n
"
,
zero_run
,
64
-
coeff_index
);
zero_run
=
64
-
coeff_index
;
zero_run
=
64
-
coeff_index
;
}
}
// zero runs code multiple coefficients,
// zero runs code multiple coefficients,
// so don't try to decode coeffs for those higher levels
// so don't try to decode coeffs for those higher levels
for
(
i
=
coeff_index
+
1
;
i
<=
coeff_index
+
zero_run
;
i
++
)
for
(
i
=
coeff_index
+
1
;
i
<=
coeff_index
+
zero_run
;
i
++
)
s
->
num_coded_frags
[
plane
][
i
]
--
;
s
->
num_coded_frags
[
plane
][
i
]
--
;
coeff_i
++
;
coeff_i
++
;
}
else
{
}
else
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid token %d
\n
"
,
token
);
"Invalid token %d
\n
"
,
token
);
return
-
1
;
return
-
1
;
}
}
}
}
...
@@ -1014,14 +1022,14 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
...
@@ -1014,14 +1022,14 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
// decrement the number of blocks that have higher coeffecients for each
// decrement the number of blocks that have higher coeffecients for each
// EOB run at this level
// EOB run at this level
if
(
blocks_ended
)
if
(
blocks_ended
)
for
(
i
=
coeff_index
+
1
;
i
<
64
;
i
++
)
for
(
i
=
coeff_index
+
1
;
i
<
64
;
i
++
)
s
->
num_coded_frags
[
plane
][
i
]
-=
blocks_ended
;
s
->
num_coded_frags
[
plane
][
i
]
-=
blocks_ended
;
// setup the next buffer
// setup the next buffer
if
(
plane
<
2
)
if
(
plane
<
2
)
s
->
dct_tokens
[
plane
+
1
][
coeff_index
]
=
dct_tokens
+
j
;
s
->
dct_tokens
[
plane
+
1
][
coeff_index
]
=
dct_tokens
+
j
;
else
if
(
coeff_index
<
63
)
else
if
(
coeff_index
<
63
)
s
->
dct_tokens
[
0
][
coeff_index
+
1
]
=
dct_tokens
+
j
;
s
->
dct_tokens
[
0
][
coeff_index
+
1
]
=
dct_tokens
+
j
;
return
eob_run
;
return
eob_run
;
}
}
...
@@ -1071,8 +1079,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
...
@@ -1071,8 +1079,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
return
residual_eob_run
;
return
residual_eob_run
;
/* reverse prediction of the C-plane DC coefficients */
/* reverse prediction of the C-plane DC coefficients */
if
(
!
(
s
->
avctx
->
flags
&
CODEC_FLAG_GRAY
))
if
(
!
(
s
->
avctx
->
flags
&
CODEC_FLAG_GRAY
))
{
{
reverse_dc_prediction
(
s
,
s
->
fragment_start
[
1
],
reverse_dc_prediction
(
s
,
s
->
fragment_start
[
1
],
s
->
fragment_width
[
1
],
s
->
fragment_height
[
1
]);
s
->
fragment_width
[
1
],
s
->
fragment_height
[
1
]);
reverse_dc_prediction
(
s
,
s
->
fragment_start
[
2
],
reverse_dc_prediction
(
s
,
s
->
fragment_start
[
2
],
...
@@ -1135,7 +1142,6 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
...
@@ -1135,7 +1142,6 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
int
fragment_width
,
int
fragment_width
,
int
fragment_height
)
int
fragment_height
)
{
{
#define PUL 8
#define PUL 8
#define PU 4
#define PU 4
#define PUR 2
#define PUR 2
...
@@ -1160,22 +1166,22 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
...
@@ -1160,22 +1166,22 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
* 3: left multiplier
* 3: left multiplier
*/
*/
static
const
int
predictor_transform
[
16
][
4
]
=
{
static
const
int
predictor_transform
[
16
][
4
]
=
{
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
128
},
// PL
{
0
,
0
,
0
,
128
},
// PL
{
0
,
0
,
128
,
0
},
// PUR
{
0
,
0
,
128
,
0
},
// PUR
{
0
,
0
,
53
,
75
},
// PUR|PL
{
0
,
0
,
53
,
75
},
// PUR|PL
{
0
,
128
,
0
,
0
},
// PU
{
0
,
128
,
0
,
0
},
// PU
{
0
,
64
,
0
,
64
},
// PU
|PL
{
0
,
64
,
0
,
64
},
// PU
|PL
{
0
,
128
,
0
,
0
},
// PU
|PUR
{
0
,
128
,
0
,
0
},
// PU
|PUR
{
0
,
0
,
53
,
75
},
// PU
|PUR|PL
{
0
,
0
,
53
,
75
},
// PU
|PUR|PL
{
128
,
0
,
0
,
0
},
// PUL
{
128
,
0
,
0
,
0
},
// PUL
{
0
,
0
,
0
,
128
},
// PUL|PL
{
0
,
0
,
0
,
128
},
// PUL|PL
{
64
,
0
,
64
,
0
},
// PUL|PUR
{
64
,
0
,
64
,
0
},
// PUL|PUR
{
0
,
0
,
53
,
75
},
// PUL|PUR|PL
{
0
,
0
,
53
,
75
},
// PUL|PUR|PL
{
0
,
128
,
0
,
0
},
// PUL|PU
{
0
,
128
,
0
,
0
},
// PUL|PU
{
-
104
,
116
,
0
,
116
},
// PUL|PU
|PL
{
-
104
,
116
,
0
,
116
},
// PUL|PU
|PL
{
24
,
80
,
24
,
0
},
// PUL|PU
|PUR
{
24
,
80
,
24
,
0
},
// PUL|PU
|PUR
{
-
104
,
116
,
0
,
116
}
// PUL|PU
|PUR|PL
{
-
104
,
116
,
0
,
116
}
// PUL|PU
|PUR|PL
};
};
/* This table shows which types of blocks can use other blocks for
/* This table shows which types of blocks can use other blocks for
...
@@ -1202,54 +1208,55 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
...
@@ -1202,54 +1208,55 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
int
transform
=
0
;
int
transform
=
0
;
vul
=
vu
=
vur
=
vl
=
0
;
vul
=
last_dc
[
0
]
=
last_dc
[
1
]
=
last_dc
[
2
]
=
0
;
vu
=
vur
=
vl
=
0
;
last_dc
[
0
]
=
last_dc
[
1
]
=
last_dc
[
2
]
=
0
;
/* for each fragment row... */
/* for each fragment row... */
for
(
y
=
0
;
y
<
fragment_height
;
y
++
)
{
for
(
y
=
0
;
y
<
fragment_height
;
y
++
)
{
/* for each fragment in a row... */
/* for each fragment in a row... */
for
(
x
=
0
;
x
<
fragment_width
;
x
++
,
i
++
)
{
for
(
x
=
0
;
x
<
fragment_width
;
x
++
,
i
++
)
{
/* reverse prediction if this block was coded */
/* reverse prediction if this block was coded */
if
(
s
->
all_fragments
[
i
].
coding_method
!=
MODE_COPY
)
{
if
(
s
->
all_fragments
[
i
].
coding_method
!=
MODE_COPY
)
{
current_frame_type
=
current_frame_type
=
compatible_frame
[
s
->
all_fragments
[
i
].
coding_method
];
compatible_frame
[
s
->
all_fragments
[
i
].
coding_method
];
transform
=
0
;
transform
=
0
;
if
(
x
)
{
if
(
x
)
{
l
=
i
-
1
;
l
=
i
-
1
;
vl
=
DC_COEFF
(
l
);
vl
=
DC_COEFF
(
l
);
if
(
COMPATIBLE_FRAME
(
l
))
if
(
COMPATIBLE_FRAME
(
l
))
transform
|=
PL
;
transform
|=
PL
;
}
}
if
(
y
)
{
if
(
y
)
{
u
=
i
-
fragment_width
;
u
=
i
-
fragment_width
;
vu
=
DC_COEFF
(
u
);
vu
=
DC_COEFF
(
u
);
if
(
COMPATIBLE_FRAME
(
u
))
if
(
COMPATIBLE_FRAME
(
u
))
transform
|=
PU
;
transform
|=
PU
;
if
(
x
)
{
if
(
x
)
{
ul
=
i
-
fragment_width
-
1
;
ul
=
i
-
fragment_width
-
1
;
vul
=
DC_COEFF
(
ul
);
vul
=
DC_COEFF
(
ul
);
if
(
COMPATIBLE_FRAME
(
ul
))
if
(
COMPATIBLE_FRAME
(
ul
))
transform
|=
PUL
;
transform
|=
PUL
;
}
}
if
(
x
+
1
<
fragment_width
)
{
if
(
x
+
1
<
fragment_width
)
{
ur
=
i
-
fragment_width
+
1
;
ur
=
i
-
fragment_width
+
1
;
vur
=
DC_COEFF
(
ur
);
vur
=
DC_COEFF
(
ur
);
if
(
COMPATIBLE_FRAME
(
ur
))
if
(
COMPATIBLE_FRAME
(
ur
))
transform
|=
PUR
;
transform
|=
PUR
;
}
}
}
}
if
(
transform
==
0
)
{
if
(
transform
==
0
)
{
/* if there were no fragments to predict from, use last
/* if there were no fragments to predict from, use last
* DC saved */
* DC saved */
predicted_dc
=
last_dc
[
current_frame_type
];
predicted_dc
=
last_dc
[
current_frame_type
];
}
else
{
}
else
{
/* apply the appropriate predictor transform */
/* apply the appropriate predictor transform */
predicted_dc
=
predicted_dc
=
(
predictor_transform
[
transform
][
0
]
*
vul
)
+
(
predictor_transform
[
transform
][
0
]
*
vul
)
+
...
@@ -1280,39 +1287,39 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
...
@@ -1280,39 +1287,39 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
}
}
}
}
static
void
apply_loop_filter
(
Vp3DecodeContext
*
s
,
int
plane
,
int
ystart
,
int
yend
)
static
void
apply_loop_filter
(
Vp3DecodeContext
*
s
,
int
plane
,
int
ystart
,
int
yend
)
{
{
int
x
,
y
;
int
x
,
y
;
int
*
bounding_values
=
s
->
bounding_values_array
+
127
;
int
*
bounding_values
=
s
->
bounding_values_array
+
127
;
int
width
=
s
->
fragment_width
[
!!
plane
];
int
width
=
s
->
fragment_width
[
!!
plane
];
int
height
=
s
->
fragment_height
[
!!
plane
];
int
height
=
s
->
fragment_height
[
!!
plane
];
int
fragment
=
s
->
fragment_start
[
plane
]
+
ystart
*
width
;
int
fragment
=
s
->
fragment_start
[
plane
]
+
ystart
*
width
;
ptrdiff_t
stride
=
s
->
current_frame
.
f
->
linesize
[
plane
];
ptrdiff_t
stride
=
s
->
current_frame
.
f
->
linesize
[
plane
];
uint8_t
*
plane_data
=
s
->
current_frame
.
f
->
data
[
plane
];
uint8_t
*
plane_data
=
s
->
current_frame
.
f
->
data
[
plane
];
if
(
!
s
->
flipped_image
)
stride
=
-
stride
;
if
(
!
s
->
flipped_image
)
plane_data
+=
s
->
data_offset
[
plane
]
+
8
*
ystart
*
stride
;
stride
=
-
stride
;
plane_data
+=
s
->
data_offset
[
plane
]
+
8
*
ystart
*
stride
;
for
(
y
=
ystart
;
y
<
yend
;
y
++
)
{
for
(
y
=
ystart
;
y
<
yend
;
y
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
/* This code basically just deblocks on the edges of coded blocks.
/* This code basically just deblocks on the edges of coded blocks.
* However, it has to be much more complicated because of the
* However, it has to be much more complicated because of the
* braindamaged deblock ordering used in VP3/Theora. Order matters
* braindamaged deblock ordering used in VP3/Theora. Order matters
* because some pixels get filtered twice. */
* because some pixels get filtered twice. */
if
(
s
->
all_fragments
[
fragment
].
coding_method
!=
MODE_COPY
)
if
(
s
->
all_fragments
[
fragment
].
coding_method
!=
MODE_COPY
)
{
{
/* do not perform left edge filter for left columns frags */
/* do not perform left edge filter for left columns frags */
if
(
x
>
0
)
{
if
(
x
>
0
)
{
s
->
vp3dsp
.
h_loop_filter
(
s
->
vp3dsp
.
h_loop_filter
(
plane_data
+
8
*
x
,
plane_data
+
8
*
x
,
stride
,
bounding_values
);
stride
,
bounding_values
);
}
}
/* do not perform top edge filter for top row fragments */
/* do not perform top edge filter for top row fragments */
if
(
y
>
0
)
{
if
(
y
>
0
)
{
s
->
vp3dsp
.
v_loop_filter
(
s
->
vp3dsp
.
v_loop_filter
(
plane_data
+
8
*
x
,
plane_data
+
8
*
x
,
stride
,
bounding_values
);
stride
,
bounding_values
);
}
}
...
@@ -1322,7 +1329,7 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
...
@@ -1322,7 +1329,7 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
if
((
x
<
width
-
1
)
&&
if
((
x
<
width
-
1
)
&&
(
s
->
all_fragments
[
fragment
+
1
].
coding_method
==
MODE_COPY
))
{
(
s
->
all_fragments
[
fragment
+
1
].
coding_method
==
MODE_COPY
))
{
s
->
vp3dsp
.
h_loop_filter
(
s
->
vp3dsp
.
h_loop_filter
(
plane_data
+
8
*
x
+
8
,
plane_data
+
8
*
x
+
8
,
stride
,
bounding_values
);
stride
,
bounding_values
);
}
}
...
@@ -1332,14 +1339,14 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
...
@@ -1332,14 +1339,14 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
if
((
y
<
height
-
1
)
&&
if
((
y
<
height
-
1
)
&&
(
s
->
all_fragments
[
fragment
+
width
].
coding_method
==
MODE_COPY
))
{
(
s
->
all_fragments
[
fragment
+
width
].
coding_method
==
MODE_COPY
))
{
s
->
vp3dsp
.
v_loop_filter
(
s
->
vp3dsp
.
v_loop_filter
(
plane_data
+
8
*
x
+
8
*
stride
,
plane_data
+
8
*
x
+
8
*
stride
,
stride
,
bounding_values
);
stride
,
bounding_values
);
}
}
}
}
fragment
++
;
fragment
++
;
}
}
plane_data
+=
8
*
stride
;
plane_data
+=
8
*
stride
;
}
}
}
}
...
@@ -1358,7 +1365,7 @@ static inline int vp3_dequant(Vp3DecodeContext *s, Vp3Fragment *frag,
...
@@ -1358,7 +1365,7 @@ static inline int vp3_dequant(Vp3DecodeContext *s, Vp3Fragment *frag,
int
token
=
*
s
->
dct_tokens
[
plane
][
i
];
int
token
=
*
s
->
dct_tokens
[
plane
][
i
];
switch
(
token
&
3
)
{
switch
(
token
&
3
)
{
case
0
:
// EOB
case
0
:
// EOB
if
(
--
token
<
4
)
// 0-3 are token types
,
so the EOB run must now be 0
if
(
--
token
<
4
)
// 0-3 are token types so the EOB run must now be 0
s
->
dct_tokens
[
plane
][
i
]
++
;
s
->
dct_tokens
[
plane
][
i
]
++
;
else
else
*
s
->
dct_tokens
[
plane
][
i
]
=
token
&
~
3
;
*
s
->
dct_tokens
[
plane
][
i
]
=
token
&
~
3
;
...
@@ -1397,30 +1404,32 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
...
@@ -1397,30 +1404,32 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
int
h
,
cy
,
i
;
int
h
,
cy
,
i
;
int
offset
[
AV_NUM_DATA_POINTERS
];
int
offset
[
AV_NUM_DATA_POINTERS
];
if
(
HAVE_THREADS
&&
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)
{
if
(
HAVE_THREADS
&&
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)
{
int
y_flipped
=
s
->
flipped_image
?
s
->
avctx
->
height
-
y
:
y
;
int
y_flipped
=
s
->
flipped_image
?
s
->
avctx
->
height
-
y
:
y
;
// At the end of the frame, report INT_MAX instead of the height of the frame.
/* At the end of the frame, report INT_MAX instead of the height of
// This makes the other threads' ff_thread_await_progress() calls cheaper, because
* the frame. This makes the other threads' ff_thread_await_progress()
// they don't have to clip their values.
* calls cheaper, because they don't have to clip their values. */
ff_thread_report_progress
(
&
s
->
current_frame
,
y_flipped
==
s
->
avctx
->
height
?
INT_MAX
:
y_flipped
-
1
,
0
);
ff_thread_report_progress
(
&
s
->
current_frame
,
y_flipped
==
s
->
avctx
->
height
?
INT_MAX
:
y_flipped
-
1
,
0
);
}
}
if
(
s
->
avctx
->
draw_horiz_band
==
NULL
)
if
(
s
->
avctx
->
draw_horiz_band
==
NULL
)
return
;
return
;
h
=
y
-
s
->
last_slice_end
;
h
=
y
-
s
->
last_slice_end
;
s
->
last_slice_end
=
y
;
s
->
last_slice_end
=
y
;
y
-=
h
;
y
-=
h
;
if
(
!
s
->
flipped_image
)
{
if
(
!
s
->
flipped_image
)
y
=
s
->
avctx
->
height
-
y
-
h
;
y
=
s
->
avctx
->
height
-
y
-
h
;
}
cy
=
y
>>
s
->
chroma_y_shift
;
cy
=
y
>>
s
->
chroma_y_shift
;
offset
[
0
]
=
s
->
current_frame
.
f
->
linesize
[
0
]
*
y
;
offset
[
0
]
=
s
->
current_frame
.
f
->
linesize
[
0
]
*
y
;
offset
[
1
]
=
s
->
current_frame
.
f
->
linesize
[
1
]
*
cy
;
offset
[
1
]
=
s
->
current_frame
.
f
->
linesize
[
1
]
*
cy
;
offset
[
2
]
=
s
->
current_frame
.
f
->
linesize
[
2
]
*
cy
;
offset
[
2
]
=
s
->
current_frame
.
f
->
linesize
[
2
]
*
cy
;
for
(
i
=
3
;
i
<
AV_NUM_DATA_POINTERS
;
i
++
)
for
(
i
=
3
;
i
<
AV_NUM_DATA_POINTERS
;
i
++
)
offset
[
i
]
=
0
;
offset
[
i
]
=
0
;
...
@@ -1432,11 +1441,12 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
...
@@ -1432,11 +1441,12 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
* Wait for the reference frame of the current fragment.
* Wait for the reference frame of the current fragment.
* The progress value is in luma pixel rows.
* The progress value is in luma pixel rows.
*/
*/
static
void
await_reference_row
(
Vp3DecodeContext
*
s
,
Vp3Fragment
*
fragment
,
int
motion_y
,
int
y
)
static
void
await_reference_row
(
Vp3DecodeContext
*
s
,
Vp3Fragment
*
fragment
,
int
motion_y
,
int
y
)
{
{
ThreadFrame
*
ref_frame
;
ThreadFrame
*
ref_frame
;
int
ref_row
;
int
ref_row
;
int
border
=
motion_y
&
1
;
int
border
=
motion_y
&
1
;
if
(
fragment
->
coding_method
==
MODE_USING_GOLDEN
||
if
(
fragment
->
coding_method
==
MODE_USING_GOLDEN
||
fragment
->
coding_method
==
MODE_GOLDEN_MV
)
fragment
->
coding_method
==
MODE_GOLDEN_MV
)
...
@@ -1444,7 +1454,7 @@ static void await_reference_row(Vp3DecodeContext *s, Vp3Fragment *fragment, int
...
@@ -1444,7 +1454,7 @@ static void await_reference_row(Vp3DecodeContext *s, Vp3Fragment *fragment, int
else
else
ref_frame
=
&
s
->
last_frame
;
ref_frame
=
&
s
->
last_frame
;
ref_row
=
y
+
(
motion_y
>>
1
);
ref_row
=
y
+
(
motion_y
>>
1
);
ref_row
=
FFMAX
(
FFABS
(
ref_row
),
ref_row
+
8
+
border
);
ref_row
=
FFMAX
(
FFABS
(
ref_row
),
ref_row
+
8
+
border
);
ff_thread_await_progress
(
ref_frame
,
ref_row
,
0
);
ff_thread_await_progress
(
ref_frame
,
ref_row
,
0
);
...
@@ -1467,38 +1477,43 @@ static void render_slice(Vp3DecodeContext *s, int slice)
...
@@ -1467,38 +1477,43 @@ static void render_slice(Vp3DecodeContext *s, int slice)
return
;
return
;
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
uint8_t
*
output_plane
=
s
->
current_frame
.
f
->
data
[
plane
]
+
s
->
data_offset
[
plane
];
uint8_t
*
output_plane
=
s
->
current_frame
.
f
->
data
[
plane
]
+
uint8_t
*
last_plane
=
s
->
last_frame
.
f
->
data
[
plane
]
+
s
->
data_offset
[
plane
];
s
->
data_offset
[
plane
];
uint8_t
*
golden_plane
=
s
->
golden_frame
.
f
->
data
[
plane
]
+
s
->
data_offset
[
plane
];
uint8_t
*
last_plane
=
s
->
last_frame
.
f
->
data
[
plane
]
+
s
->
data_offset
[
plane
];
uint8_t
*
golden_plane
=
s
->
golden_frame
.
f
->
data
[
plane
]
+
s
->
data_offset
[
plane
];
ptrdiff_t
stride
=
s
->
current_frame
.
f
->
linesize
[
plane
];
ptrdiff_t
stride
=
s
->
current_frame
.
f
->
linesize
[
plane
];
int
plane_width
=
s
->
width
>>
(
plane
&&
s
->
chroma_x_shift
);
int
plane_width
=
s
->
width
>>
(
plane
&&
s
->
chroma_x_shift
);
int
plane_height
=
s
->
height
>>
(
plane
&&
s
->
chroma_y_shift
);
int
plane_height
=
s
->
height
>>
(
plane
&&
s
->
chroma_y_shift
);
int8_t
(
*
motion_val
)[
2
]
=
s
->
motion_val
[
!!
plane
];
int8_t
(
*
motion_val
)[
2
]
=
s
->
motion_val
[
!!
plane
];
int
sb_x
,
sb_y
=
slice
<<
(
!
plane
&&
s
->
chroma_y_shift
);
int
sb_x
,
sb_y
=
slice
<<
(
!
plane
&&
s
->
chroma_y_shift
);
int
slice_height
=
sb_y
+
1
+
(
!
plane
&&
s
->
chroma_y_shift
);
int
slice_height
=
sb_y
+
1
+
(
!
plane
&&
s
->
chroma_y_shift
);
int
slice_width
=
plane
?
s
->
c_superblock_width
:
s
->
y_superblock_width
;
int
slice_width
=
plane
?
s
->
c_superblock_width
:
s
->
y_superblock_width
;
int
fragment_width
=
s
->
fragment_width
[
!!
plane
];
int
fragment_width
=
s
->
fragment_width
[
!!
plane
];
int
fragment_height
=
s
->
fragment_height
[
!!
plane
];
int
fragment_height
=
s
->
fragment_height
[
!!
plane
];
int
fragment_start
=
s
->
fragment_start
[
plane
];
int
fragment_start
=
s
->
fragment_start
[
plane
];
int
do_await
=
!
plane
&&
HAVE_THREADS
&&
(
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
);
if
(
!
s
->
flipped_image
)
stride
=
-
stride
;
int
do_await
=
!
plane
&&
HAVE_THREADS
&&
(
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
);
if
(
!
s
->
flipped_image
)
stride
=
-
stride
;
if
(
CONFIG_GRAY
&&
plane
&&
(
s
->
avctx
->
flags
&
CODEC_FLAG_GRAY
))
if
(
CONFIG_GRAY
&&
plane
&&
(
s
->
avctx
->
flags
&
CODEC_FLAG_GRAY
))
continue
;
continue
;
/* for each superblock row in the slice (both of them)... */
/* for each superblock row in the slice (both of them)... */
for
(;
sb_y
<
slice_height
;
sb_y
++
)
{
for
(;
sb_y
<
slice_height
;
sb_y
++
)
{
/* for each superblock in a row... */
/* for each superblock in a row... */
for
(
sb_x
=
0
;
sb_x
<
slice_width
;
sb_x
++
)
{
for
(
sb_x
=
0
;
sb_x
<
slice_width
;
sb_x
++
)
{
/* for each block in a superblock... */
/* for each block in a superblock... */
for
(
j
=
0
;
j
<
16
;
j
++
)
{
for
(
j
=
0
;
j
<
16
;
j
++
)
{
x
=
4
*
sb_x
+
hilbert_offset
[
j
][
0
];
x
=
4
*
sb_x
+
hilbert_offset
[
j
][
0
];
y
=
4
*
sb_y
+
hilbert_offset
[
j
][
1
];
y
=
4
*
sb_y
+
hilbert_offset
[
j
][
1
];
fragment
=
y
*
fragment_width
+
x
;
fragment
=
y
*
fragment_width
+
x
;
i
=
fragment_start
+
fragment
;
i
=
fragment_start
+
fragment
;
...
@@ -1506,18 +1521,21 @@ static void render_slice(Vp3DecodeContext *s, int slice)
...
@@ -1506,18 +1521,21 @@ static void render_slice(Vp3DecodeContext *s, int slice)
if
(
x
>=
fragment_width
||
y
>=
fragment_height
)
if
(
x
>=
fragment_width
||
y
>=
fragment_height
)
continue
;
continue
;
first_pixel
=
8
*
y
*
stride
+
8
*
x
;
first_pixel
=
8
*
y
*
stride
+
8
*
x
;
if
(
do_await
&&
s
->
all_fragments
[
i
].
coding_method
!=
MODE_INTRA
)
if
(
do_await
&&
await_reference_row
(
s
,
&
s
->
all_fragments
[
i
],
motion_val
[
fragment
][
1
],
(
16
*
y
)
>>
s
->
chroma_y_shift
);
s
->
all_fragments
[
i
].
coding_method
!=
MODE_INTRA
)
await_reference_row
(
s
,
&
s
->
all_fragments
[
i
],
motion_val
[
fragment
][
1
],
(
16
*
y
)
>>
s
->
chroma_y_shift
);
/* transform if this block was coded */
/* transform if this block was coded */
if
(
s
->
all_fragments
[
i
].
coding_method
!=
MODE_COPY
)
{
if
(
s
->
all_fragments
[
i
].
coding_method
!=
MODE_COPY
)
{
if
((
s
->
all_fragments
[
i
].
coding_method
==
MODE_USING_GOLDEN
)
||
if
((
s
->
all_fragments
[
i
].
coding_method
==
MODE_USING_GOLDEN
)
||
(
s
->
all_fragments
[
i
].
coding_method
==
MODE_GOLDEN_MV
))
(
s
->
all_fragments
[
i
].
coding_method
==
MODE_GOLDEN_MV
))
motion_source
=
golden_plane
;
motion_source
=
golden_plane
;
else
else
motion_source
=
last_plane
;
motion_source
=
last_plane
;
motion_source
+=
first_pixel
;
motion_source
+=
first_pixel
;
motion_halfpel_index
=
0
;
motion_halfpel_index
=
0
;
...
@@ -1530,8 +1548,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
...
@@ -1530,8 +1548,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
motion_x
=
motion_val
[
fragment
][
0
];
motion_x
=
motion_val
[
fragment
][
0
];
motion_y
=
motion_val
[
fragment
][
1
];
motion_y
=
motion_val
[
fragment
][
1
];
src_x
=
(
motion_x
>>
1
)
+
8
*
x
;
src_x
=
(
motion_x
>>
1
)
+
8
*
x
;
src_y
=
(
motion_y
>>
1
)
+
8
*
y
;
src_y
=
(
motion_y
>>
1
)
+
8
*
y
;
motion_halfpel_index
=
motion_x
&
0x01
;
motion_halfpel_index
=
motion_x
&
0x01
;
motion_source
+=
(
motion_x
>>
1
);
motion_source
+=
(
motion_x
>>
1
);
...
@@ -1539,35 +1557,38 @@ static void render_slice(Vp3DecodeContext *s, int slice)
...
@@ -1539,35 +1557,38 @@ static void render_slice(Vp3DecodeContext *s, int slice)
motion_halfpel_index
|=
(
motion_y
&
0x01
)
<<
1
;
motion_halfpel_index
|=
(
motion_y
&
0x01
)
<<
1
;
motion_source
+=
((
motion_y
>>
1
)
*
stride
);
motion_source
+=
((
motion_y
>>
1
)
*
stride
);
if
(
src_x
<
0
||
src_y
<
0
||
src_x
+
9
>=
plane_width
||
src_y
+
9
>=
plane_height
){
if
(
src_x
<
0
||
src_y
<
0
||
uint8_t
*
temp
=
s
->
edge_emu_buffer
;
src_x
+
9
>=
plane_width
||
if
(
stride
<
0
)
temp
-=
8
*
stride
;
src_y
+
9
>=
plane_height
)
{
uint8_t
*
temp
=
s
->
edge_emu_buffer
;
if
(
stride
<
0
)
temp
-=
8
*
stride
;
s
->
vdsp
.
emulated_edge_mc
(
temp
,
motion_source
,
s
->
vdsp
.
emulated_edge_mc
(
temp
,
motion_source
,
stride
,
stride
,
stride
,
stride
,
9
,
9
,
src_x
,
src_y
,
9
,
9
,
src_x
,
src_y
,
plane_width
,
plane_width
,
plane_height
);
plane_height
);
motion_source
=
temp
;
motion_source
=
temp
;
}
}
}
}
/* first, take care of copying a block from either the
/* first, take care of copying a block from either the
* previous or the golden frame */
* previous or the golden frame */
if
(
s
->
all_fragments
[
i
].
coding_method
!=
MODE_INTRA
)
{
if
(
s
->
all_fragments
[
i
].
coding_method
!=
MODE_INTRA
)
{
/* Note, it is possible to implement all MC cases with
/* Note, it is possible to implement all MC cases
put_no_rnd_pixels_l2 which would look more like th
e
* with put_no_rnd_pixels_l2 which would look mor
e
VP3 source but this would be slower as
* like the
VP3 source but this would be slower as
put_no_rnd_pixels_tab is better optimzed */
*
put_no_rnd_pixels_tab is better optimzed */
if
(
motion_halfpel_index
!=
3
)
{
if
(
motion_halfpel_index
!=
3
)
{
s
->
hdsp
.
put_no_rnd_pixels_tab
[
1
][
motion_halfpel_index
](
s
->
hdsp
.
put_no_rnd_pixels_tab
[
1
][
motion_halfpel_index
](
output_plane
+
first_pixel
,
output_plane
+
first_pixel
,
motion_source
,
stride
,
8
);
motion_source
,
stride
,
8
);
}
else
{
}
else
{
int
d
=
(
motion_x
^
motion_y
)
>>
31
;
// d is 0 if motion_x and _y have the same sign, else -1
/* d is 0 if motion_x and _y have the same sign,
s
->
vp3dsp
.
put_no_rnd_pixels_l2
(
* else -1 */
output_plane
+
first_pixel
,
int
d
=
(
motion_x
^
motion_y
)
>>
31
;
s
->
vp3dsp
.
put_no_rnd_pixels_l2
(
output_plane
+
first_pixel
,
motion_source
-
d
,
motion_source
-
d
,
motion_source
+
stride
+
1
+
d
,
motion_source
+
stride
+
1
+
d
,
stride
,
8
);
stride
,
8
);
...
@@ -1578,41 +1599,41 @@ static void render_slice(Vp3DecodeContext *s, int slice)
...
@@ -1578,41 +1599,41 @@ static void render_slice(Vp3DecodeContext *s, int slice)
if
(
s
->
all_fragments
[
i
].
coding_method
==
MODE_INTRA
)
{
if
(
s
->
all_fragments
[
i
].
coding_method
==
MODE_INTRA
)
{
int
index
;
int
index
;
index
=
vp3_dequant
(
s
,
s
->
all_fragments
+
i
,
plane
,
0
,
block
);
index
=
vp3_dequant
(
s
,
s
->
all_fragments
+
i
,
plane
,
0
,
block
);
if
(
index
>
63
)
if
(
index
>
63
)
continue
;
continue
;
s
->
vp3dsp
.
idct_put
(
s
->
vp3dsp
.
idct_put
(
output_plane
+
first_pixel
,
output_plane
+
first_pixel
,
stride
,
stride
,
block
);
block
);
}
else
{
}
else
{
int
index
=
vp3_dequant
(
s
,
s
->
all_fragments
+
i
,
plane
,
1
,
block
);
int
index
=
vp3_dequant
(
s
,
s
->
all_fragments
+
i
,
plane
,
1
,
block
);
if
(
index
>
63
)
if
(
index
>
63
)
continue
;
continue
;
if
(
index
>
0
)
{
if
(
index
>
0
)
{
s
->
vp3dsp
.
idct_add
(
s
->
vp3dsp
.
idct_add
(
output_plane
+
first_pixel
,
output_plane
+
first_pixel
,
stride
,
stride
,
block
);
block
);
}
else
{
}
else
{
s
->
vp3dsp
.
idct_dc_add
(
output_plane
+
first_pixel
,
stride
,
block
);
s
->
vp3dsp
.
idct_dc_add
(
output_plane
+
first_pixel
,
stride
,
block
);
}
}
}
}
}
else
{
}
else
{
/* copy directly from the previous frame */
/* copy directly from the previous frame */
s
->
hdsp
.
put_pixels_tab
[
1
][
0
](
s
->
hdsp
.
put_pixels_tab
[
1
][
0
](
output_plane
+
first_pixel
,
output_plane
+
first_pixel
,
last_plane
+
first_pixel
,
last_plane
+
first_pixel
,
stride
,
8
);
stride
,
8
);
}
}
}
}
}
}
// Filter up to the last row in the superblock row
// Filter up to the last row in the superblock row
if
(
!
s
->
skip_loop_filter
)
if
(
!
s
->
skip_loop_filter
)
apply_loop_filter
(
s
,
plane
,
4
*
sb_y
-
!!
sb_y
,
FFMIN
(
4
*
sb_y
+
3
,
fragment_height
-
1
));
apply_loop_filter
(
s
,
plane
,
4
*
sb_y
-
!!
sb_y
,
FFMIN
(
4
*
sb_y
+
3
,
fragment_height
-
1
));
}
}
}
}
...
@@ -1624,7 +1645,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
...
@@ -1624,7 +1645,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
* dispatch (slice - 1);
* dispatch (slice - 1);
*/
*/
vp3_draw_horiz_band
(
s
,
FFMIN
((
32
<<
s
->
chroma_y_shift
)
*
(
slice
+
1
)
-
16
,
s
->
height
-
16
));
vp3_draw_horiz_band
(
s
,
FFMIN
((
32
<<
s
->
chroma_y_shift
)
*
(
slice
+
1
)
-
16
,
s
->
height
-
16
));
}
}
/// Allocate tables for per-frame data in Vp3DecodeContext
/// Allocate tables for per-frame data in Vp3DecodeContext
...
@@ -1638,8 +1660,11 @@ static av_cold int allocate_tables(AVCodecContext *avctx)
...
@@ -1638,8 +1660,11 @@ static av_cold int allocate_tables(AVCodecContext *avctx)
s
->
superblock_coding
=
av_malloc
(
s
->
superblock_count
);
s
->
superblock_coding
=
av_malloc
(
s
->
superblock_count
);
s
->
all_fragments
=
av_malloc
(
s
->
fragment_count
*
sizeof
(
Vp3Fragment
));
s
->
all_fragments
=
av_malloc
(
s
->
fragment_count
*
sizeof
(
Vp3Fragment
));
s
->
coded_fragment_list
[
0
]
=
av_malloc
(
s
->
fragment_count
*
sizeof
(
int
));
s
->
coded_fragment_list
[
0
]
=
av_malloc
(
s
->
fragment_count
*
sizeof
(
int
));
s
->
dct_tokens_base
=
av_malloc
(
64
*
s
->
fragment_count
*
sizeof
(
*
s
->
dct_tokens_base
));
s
->
dct_tokens_base
=
av_malloc
(
64
*
s
->
fragment_count
*
sizeof
(
*
s
->
dct_tokens_base
));
s
->
motion_val
[
0
]
=
av_malloc
(
y_fragment_count
*
sizeof
(
*
s
->
motion_val
[
0
]));
s
->
motion_val
[
0
]
=
av_malloc
(
y_fragment_count
*
sizeof
(
*
s
->
motion_val
[
0
]));
s
->
motion_val
[
1
]
=
av_malloc
(
c_fragment_count
*
sizeof
(
*
s
->
motion_val
[
1
]));
s
->
motion_val
[
1
]
=
av_malloc
(
c_fragment_count
*
sizeof
(
*
s
->
motion_val
[
1
]));
...
@@ -1647,8 +1672,9 @@ static av_cold int allocate_tables(AVCodecContext *avctx)
...
@@ -1647,8 +1672,9 @@ static av_cold int allocate_tables(AVCodecContext *avctx)
s
->
superblock_fragments
=
av_malloc
(
s
->
superblock_count
*
16
*
sizeof
(
int
));
s
->
superblock_fragments
=
av_malloc
(
s
->
superblock_count
*
16
*
sizeof
(
int
));
s
->
macroblock_coding
=
av_malloc
(
s
->
macroblock_count
+
1
);
s
->
macroblock_coding
=
av_malloc
(
s
->
macroblock_count
+
1
);
if
(
!
s
->
superblock_coding
||
!
s
->
all_fragments
||
!
s
->
dct_tokens_base
||
if
(
!
s
->
superblock_coding
||
!
s
->
all_fragments
||
!
s
->
coded_fragment_list
[
0
]
||
!
s
->
superblock_fragments
||
!
s
->
macroblock_coding
||
!
s
->
dct_tokens_base
||
!
s
->
coded_fragment_list
[
0
]
||
!
s
->
superblock_fragments
||
!
s
->
macroblock_coding
||
!
s
->
motion_val
[
0
]
||
!
s
->
motion_val
[
1
])
{
!
s
->
motion_val
[
0
]
||
!
s
->
motion_val
[
1
])
{
vp3_decode_end
(
avctx
);
vp3_decode_end
(
avctx
);
return
-
1
;
return
-
1
;
...
@@ -1689,7 +1715,7 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
...
@@ -1689,7 +1715,7 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
avctx
->
internal
->
allocate_progress
=
1
;
avctx
->
internal
->
allocate_progress
=
1
;
if
(
avctx
->
codec_tag
==
MKTAG
(
'V'
,
'P'
,
'3'
,
'0'
))
if
(
avctx
->
codec_tag
==
MKTAG
(
'V'
,
'P'
,
'3'
,
'0'
))
s
->
version
=
0
;
s
->
version
=
0
;
else
else
s
->
version
=
1
;
s
->
version
=
1
;
...
@@ -1746,12 +1772,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
...
@@ -1746,12 +1772,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
/* fragment count covers all 8x8 blocks for all 3 planes */
/* fragment count covers all 8x8 blocks for all 3 planes */
y_fragment_count
=
s
->
fragment_width
[
0
]
*
s
->
fragment_height
[
0
];
y_fragment_count
=
s
->
fragment_width
[
0
]
*
s
->
fragment_height
[
0
];
c_fragment_count
=
s
->
fragment_width
[
1
]
*
s
->
fragment_height
[
1
];
c_fragment_count
=
s
->
fragment_width
[
1
]
*
s
->
fragment_height
[
1
];
s
->
fragment_count
=
y_fragment_count
+
2
*
c_fragment_count
;
s
->
fragment_count
=
y_fragment_count
+
2
*
c_fragment_count
;
s
->
fragment_start
[
1
]
=
y_fragment_count
;
s
->
fragment_start
[
1
]
=
y_fragment_count
;
s
->
fragment_start
[
2
]
=
y_fragment_count
+
c_fragment_count
;
s
->
fragment_start
[
2
]
=
y_fragment_count
+
c_fragment_count
;
if
(
!
s
->
theora_tables
)
if
(
!
s
->
theora_tables
)
{
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
s
->
coded_dc_scale_factor
[
i
]
=
vp31_dc_scale_factor
[
i
];
s
->
coded_dc_scale_factor
[
i
]
=
vp31_dc_scale_factor
[
i
];
s
->
coded_ac_scale_factor
[
i
]
=
vp31_ac_scale_factor
[
i
];
s
->
coded_ac_scale_factor
[
i
]
=
vp31_ac_scale_factor
[
i
];
...
@@ -1761,18 +1786,17 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
...
@@ -1761,18 +1786,17 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
s
->
filter_limit_values
[
i
]
=
vp31_filter_limit_values
[
i
];
s
->
filter_limit_values
[
i
]
=
vp31_filter_limit_values
[
i
];
}
}
for
(
inter
=
0
;
inter
<
2
;
inter
++
)
{
for
(
inter
=
0
;
inter
<
2
;
inter
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
s
->
qr_count
[
inter
][
plane
]
=
1
;
s
->
qr_count
[
inter
][
plane
]
=
1
;
s
->
qr_size
[
inter
][
plane
][
0
]
=
63
;
s
->
qr_size
[
inter
][
plane
][
0
]
=
63
;
s
->
qr_base
[
inter
][
plane
][
0
]
=
s
->
qr_base
[
inter
][
plane
][
0
]
=
s
->
qr_base
[
inter
][
plane
][
1
]
=
2
*
inter
+
(
!!
plane
)
*
!
inter
;
s
->
qr_base
[
inter
][
plane
][
1
]
=
2
*
inter
+
(
!!
plane
)
*
!
inter
;
}
}
}
}
/* init VLC tables */
/* init VLC tables */
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
/* DC histograms */
/* DC histograms */
init_vlc
(
&
s
->
dc_vlc
[
i
],
11
,
32
,
init_vlc
(
&
s
->
dc_vlc
[
i
],
11
,
32
,
&
dc_bias
[
i
][
0
][
1
],
4
,
2
,
&
dc_bias
[
i
][
0
][
1
],
4
,
2
,
...
@@ -1799,7 +1823,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
...
@@ -1799,7 +1823,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
&
ac_bias_3
[
i
][
0
][
0
],
4
,
2
,
0
);
&
ac_bias_3
[
i
][
0
][
0
],
4
,
2
,
0
);
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
/* DC histograms */
/* DC histograms */
if
(
init_vlc
(
&
s
->
dc_vlc
[
i
],
11
,
32
,
if
(
init_vlc
(
&
s
->
dc_vlc
[
i
],
11
,
32
,
...
@@ -1809,26 +1832,26 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
...
@@ -1809,26 +1832,26 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
/* group 1 AC histograms */
/* group 1 AC histograms */
if
(
init_vlc
(
&
s
->
ac_vlc_1
[
i
],
11
,
32
,
if
(
init_vlc
(
&
s
->
ac_vlc_1
[
i
],
11
,
32
,
&
s
->
huffman_table
[
i
+
16
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
][
0
][
0
],
8
,
4
,
0
)
<
0
)
&
s
->
huffman_table
[
i
+
16
][
0
][
0
],
8
,
4
,
0
)
<
0
)
goto
vlc_fail
;
goto
vlc_fail
;
/* group 2 AC histograms */
/* group 2 AC histograms */
if
(
init_vlc
(
&
s
->
ac_vlc_2
[
i
],
11
,
32
,
if
(
init_vlc
(
&
s
->
ac_vlc_2
[
i
],
11
,
32
,
&
s
->
huffman_table
[
i
+
16
*
2
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
*
2
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
*
2
][
0
][
0
],
8
,
4
,
0
)
<
0
)
&
s
->
huffman_table
[
i
+
16
*
2
][
0
][
0
],
8
,
4
,
0
)
<
0
)
goto
vlc_fail
;
goto
vlc_fail
;
/* group 3 AC histograms */
/* group 3 AC histograms */
if
(
init_vlc
(
&
s
->
ac_vlc_3
[
i
],
11
,
32
,
if
(
init_vlc
(
&
s
->
ac_vlc_3
[
i
],
11
,
32
,
&
s
->
huffman_table
[
i
+
16
*
3
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
*
3
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
*
3
][
0
][
0
],
8
,
4
,
0
)
<
0
)
&
s
->
huffman_table
[
i
+
16
*
3
][
0
][
0
],
8
,
4
,
0
)
<
0
)
goto
vlc_fail
;
goto
vlc_fail
;
/* group 4 AC histograms */
/* group 4 AC histograms */
if
(
init_vlc
(
&
s
->
ac_vlc_4
[
i
],
11
,
32
,
if
(
init_vlc
(
&
s
->
ac_vlc_4
[
i
],
11
,
32
,
&
s
->
huffman_table
[
i
+
16
*
4
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
*
4
][
0
][
1
],
8
,
4
,
&
s
->
huffman_table
[
i
+
16
*
4
][
0
][
0
],
8
,
4
,
0
)
<
0
)
&
s
->
huffman_table
[
i
+
16
*
4
][
0
][
0
],
8
,
4
,
0
)
<
0
)
goto
vlc_fail
;
goto
vlc_fail
;
}
}
}
}
...
@@ -1862,7 +1885,6 @@ static int update_frames(AVCodecContext *avctx)
...
@@ -1862,7 +1885,6 @@ static int update_frames(AVCodecContext *avctx)
Vp3DecodeContext
*
s
=
avctx
->
priv_data
;
Vp3DecodeContext
*
s
=
avctx
->
priv_data
;
int
ret
=
0
;
int
ret
=
0
;
/* shuffle frames (last = current) */
/* shuffle frames (last = current) */
ff_thread_release_buffer
(
avctx
,
&
s
->
last_frame
);
ff_thread_release_buffer
(
avctx
,
&
s
->
last_frame
);
ret
=
ff_thread_ref_frame
(
&
s
->
last_frame
,
&
s
->
current_frame
);
ret
=
ff_thread_ref_frame
(
&
s
->
last_frame
,
&
s
->
current_frame
);
...
@@ -1902,11 +1924,12 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
...
@@ -1902,11 +1924,12 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
Vp3DecodeContext
*
s
=
dst
->
priv_data
,
*
s1
=
src
->
priv_data
;
Vp3DecodeContext
*
s
=
dst
->
priv_data
,
*
s1
=
src
->
priv_data
;
int
qps_changed
=
0
,
i
,
err
;
int
qps_changed
=
0
,
i
,
err
;
#define copy_fields(to, from, start_field, end_field) memcpy(&to->start_field, &from->start_field, (char*)&to->end_field - (char*)&to->start_field)
#define copy_fields(to, from, start_field, end_field) \
memcpy(&to->start_field, &from->start_field, \
(char *) &to->end_field - (char *) &to->start_field)
if
(
!
s1
->
current_frame
.
f
->
data
[
0
]
if
(
!
s1
->
current_frame
.
f
->
data
[
0
]
||
||
s
->
width
!=
s1
->
width
s
->
width
!=
s1
->
width
||
s
->
height
!=
s1
->
height
)
{
||
s
->
height
!=
s1
->
height
)
{
if
(
s
!=
s1
)
if
(
s
!=
s1
)
ref_frames
(
s
,
s1
);
ref_frames
(
s
,
s1
);
return
-
1
;
return
-
1
;
...
@@ -1922,8 +1945,10 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
...
@@ -1922,8 +1945,10 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
return
err
;
return
err
;
y_fragment_count
=
s
->
fragment_width
[
0
]
*
s
->
fragment_height
[
0
];
y_fragment_count
=
s
->
fragment_width
[
0
]
*
s
->
fragment_height
[
0
];
c_fragment_count
=
s
->
fragment_width
[
1
]
*
s
->
fragment_height
[
1
];
c_fragment_count
=
s
->
fragment_width
[
1
]
*
s
->
fragment_height
[
1
];
memcpy
(
s
->
motion_val
[
0
],
s1
->
motion_val
[
0
],
y_fragment_count
*
sizeof
(
*
s
->
motion_val
[
0
]));
memcpy
(
s
->
motion_val
[
0
],
s1
->
motion_val
[
0
],
memcpy
(
s
->
motion_val
[
1
],
s1
->
motion_val
[
1
],
c_fragment_count
*
sizeof
(
*
s
->
motion_val
[
1
]));
y_fragment_count
*
sizeof
(
*
s
->
motion_val
[
0
]));
memcpy
(
s
->
motion_val
[
1
],
s1
->
motion_val
[
1
],
c_fragment_count
*
sizeof
(
*
s
->
motion_val
[
1
]));
}
}
// copy previous frame data
// copy previous frame data
...
@@ -1941,7 +1966,8 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
...
@@ -1941,7 +1966,8 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
}
}
if
(
s
->
qps
[
0
]
!=
s1
->
qps
[
0
])
if
(
s
->
qps
[
0
]
!=
s1
->
qps
[
0
])
memcpy
(
&
s
->
bounding_values_array
,
&
s1
->
bounding_values_array
,
sizeof
(
s
->
bounding_values_array
));
memcpy
(
&
s
->
bounding_values_array
,
&
s1
->
bounding_values_array
,
sizeof
(
s
->
bounding_values_array
));
if
(
qps_changed
)
if
(
qps_changed
)
copy_fields
(
s
,
s1
,
qps
,
superblock_count
);
copy_fields
(
s
,
s1
,
qps
,
superblock_count
);
...
@@ -1963,9 +1989,9 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -1963,9 +1989,9 @@ static int vp3_decode_frame(AVCodecContext *avctx,
init_get_bits
(
&
gb
,
buf
,
buf_size
*
8
);
init_get_bits
(
&
gb
,
buf
,
buf_size
*
8
);
if
(
s
->
theora
&&
get_bits1
(
&
gb
))
if
(
s
->
theora
&&
get_bits1
(
&
gb
))
{
{
av_log
(
avctx
,
AV_LOG_ERROR
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"Header packet passed to frame decoder, skipping
\n
"
);
"Header packet passed to frame decoder, skipping
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -1975,19 +2001,20 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -1975,19 +2001,20 @@ static int vp3_decode_frame(AVCodecContext *avctx,
for
(
i
=
0
;
i
<
3
;
i
++
)
for
(
i
=
0
;
i
<
3
;
i
++
)
s
->
last_qps
[
i
]
=
s
->
qps
[
i
];
s
->
last_qps
[
i
]
=
s
->
qps
[
i
];
s
->
nqps
=
0
;
s
->
nqps
=
0
;
do
{
do
{
s
->
qps
[
s
->
nqps
++
]
=
get_bits
(
&
gb
,
6
);
s
->
qps
[
s
->
nqps
++
]
=
get_bits
(
&
gb
,
6
);
}
while
(
s
->
theora
>=
0x030200
&&
s
->
nqps
<
3
&&
get_bits1
(
&
gb
));
}
while
(
s
->
theora
>=
0x030200
&&
s
->
nqps
<
3
&&
get_bits1
(
&
gb
));
for
(
i
=
s
->
nqps
;
i
<
3
;
i
++
)
for
(
i
=
s
->
nqps
;
i
<
3
;
i
++
)
s
->
qps
[
i
]
=
-
1
;
s
->
qps
[
i
]
=
-
1
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
" VP3 %sframe #%d: Q index = %d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_INFO
,
" VP3 %sframe #%d: Q index = %d
\n
"
,
s
->
keyframe
?
"key"
:
""
,
avctx
->
frame_number
+
1
,
s
->
qps
[
0
]);
s
->
keyframe
?
"key"
:
""
,
avctx
->
frame_number
+
1
,
s
->
qps
[
0
]);
s
->
skip_loop_filter
=
!
s
->
filter_limit_values
[
s
->
qps
[
0
]]
||
s
->
skip_loop_filter
=
!
s
->
filter_limit_values
[
s
->
qps
[
0
]]
||
avctx
->
skip_loop_filter
>=
(
s
->
keyframe
?
AVDISCARD_ALL
:
AVDISCARD_NONKEY
);
avctx
->
skip_loop_filter
>=
(
s
->
keyframe
?
AVDISCARD_ALL
:
AVDISCARD_NONKEY
);
if
(
s
->
qps
[
0
]
!=
s
->
last_qps
[
0
])
if
(
s
->
qps
[
0
]
!=
s
->
last_qps
[
0
])
init_loop_filter
(
s
);
init_loop_filter
(
s
);
...
@@ -2001,44 +2028,47 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -2001,44 +2028,47 @@ static int vp3_decode_frame(AVCodecContext *avctx,
if
(
avctx
->
skip_frame
>=
AVDISCARD_NONKEY
&&
!
s
->
keyframe
)
if
(
avctx
->
skip_frame
>=
AVDISCARD_NONKEY
&&
!
s
->
keyframe
)
return
buf_size
;
return
buf_size
;
s
->
current_frame
.
f
->
pict_type
=
s
->
keyframe
?
AV_PICTURE_TYPE_I
:
AV_PICTURE_TYPE_P
;
s
->
current_frame
.
f
->
pict_type
=
s
->
keyframe
?
AV_PICTURE_TYPE_I
:
AV_PICTURE_TYPE_P
;
if
(
ff_thread_get_buffer
(
avctx
,
&
s
->
current_frame
,
AV_GET_BUFFER_FLAG_REF
)
<
0
)
{
if
(
ff_thread_get_buffer
(
avctx
,
&
s
->
current_frame
,
AV_GET_BUFFER_FLAG_REF
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
goto
error
;
goto
error
;
}
}
if
(
!
s
->
edge_emu_buffer
)
if
(
!
s
->
edge_emu_buffer
)
s
->
edge_emu_buffer
=
av_malloc
(
9
*
FFABS
(
s
->
current_frame
.
f
->
linesize
[
0
]));
s
->
edge_emu_buffer
=
av_malloc
(
9
*
FFABS
(
s
->
current_frame
.
f
->
linesize
[
0
]));
if
(
s
->
keyframe
)
{
if
(
s
->
keyframe
)
{
if
(
!
s
->
theora
)
if
(
!
s
->
theora
)
{
{
skip_bits
(
&
gb
,
4
);
/* width code */
skip_bits
(
&
gb
,
4
);
/* width code */
skip_bits
(
&
gb
,
4
);
/* height code */
skip_bits
(
&
gb
,
4
);
/* height code */
if
(
s
->
version
)
if
(
s
->
version
)
{
{
s
->
version
=
get_bits
(
&
gb
,
5
);
s
->
version
=
get_bits
(
&
gb
,
5
);
if
(
avctx
->
frame_number
==
0
)
if
(
avctx
->
frame_number
==
0
)
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"VP version: %d
\n
"
,
s
->
version
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"VP version: %d
\n
"
,
s
->
version
);
}
}
}
}
if
(
s
->
version
||
s
->
theora
)
if
(
s
->
version
||
s
->
theora
)
{
{
if
(
get_bits1
(
&
gb
))
if
(
get_bits1
(
&
gb
))
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Warning, unsupported keyframe coding type?!
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Warning, unsupported keyframe coding type?!
\n
"
);
skip_bits
(
&
gb
,
2
);
/* reserved? */
skip_bits
(
&
gb
,
2
);
/* reserved? */
}
}
}
else
{
}
else
{
if
(
!
s
->
golden_frame
.
f
->
data
[
0
])
{
if
(
!
s
->
golden_frame
.
f
->
data
[
0
])
{
av_log
(
s
->
avctx
,
AV_LOG_WARNING
,
"vp3: first frame not a keyframe
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_WARNING
,
"vp3: first frame not a keyframe
\n
"
);
s
->
golden_frame
.
f
->
pict_type
=
AV_PICTURE_TYPE_I
;
s
->
golden_frame
.
f
->
pict_type
=
AV_PICTURE_TYPE_I
;
if
(
ff_thread_get_buffer
(
avctx
,
&
s
->
golden_frame
,
AV_GET_BUFFER_FLAG_REF
)
<
0
)
{
if
(
ff_thread_get_buffer
(
avctx
,
&
s
->
golden_frame
,
AV_GET_BUFFER_FLAG_REF
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
goto
error
;
goto
error
;
}
}
ff_thread_release_buffer
(
avctx
,
&
s
->
last_frame
);
ff_thread_release_buffer
(
avctx
,
&
s
->
last_frame
);
if
((
ret
=
ff_thread_ref_frame
(
&
s
->
last_frame
,
&
s
->
golden_frame
))
<
0
)
if
((
ret
=
ff_thread_ref_frame
(
&
s
->
last_frame
,
&
s
->
golden_frame
))
<
0
)
goto
error
;
goto
error
;
ff_thread_report_progress
(
&
s
->
last_frame
,
INT_MAX
,
0
);
ff_thread_report_progress
(
&
s
->
last_frame
,
INT_MAX
,
0
);
}
}
...
@@ -2047,23 +2077,23 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -2047,23 +2077,23 @@ static int vp3_decode_frame(AVCodecContext *avctx,
memset
(
s
->
all_fragments
,
0
,
s
->
fragment_count
*
sizeof
(
Vp3Fragment
));
memset
(
s
->
all_fragments
,
0
,
s
->
fragment_count
*
sizeof
(
Vp3Fragment
));
ff_thread_finish_setup
(
avctx
);
ff_thread_finish_setup
(
avctx
);
if
(
unpack_superblocks
(
s
,
&
gb
)){
if
(
unpack_superblocks
(
s
,
&
gb
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_superblocks
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_superblocks
\n
"
);
goto
error
;
goto
error
;
}
}
if
(
unpack_modes
(
s
,
&
gb
)){
if
(
unpack_modes
(
s
,
&
gb
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_modes
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_modes
\n
"
);
goto
error
;
goto
error
;
}
}
if
(
unpack_vectors
(
s
,
&
gb
)){
if
(
unpack_vectors
(
s
,
&
gb
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_vectors
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_vectors
\n
"
);
goto
error
;
goto
error
;
}
}
if
(
unpack_block_qpis
(
s
,
&
gb
)){
if
(
unpack_block_qpis
(
s
,
&
gb
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_block_qpis
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_block_qpis
\n
"
);
goto
error
;
goto
error
;
}
}
if
(
unpack_dct_coeffs
(
s
,
&
gb
)){
if
(
unpack_dct_coeffs
(
s
,
&
gb
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_dct_coeffs
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"error in unpack_dct_coeffs
\n
"
);
goto
error
;
goto
error
;
}
}
...
@@ -2073,7 +2103,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -2073,7 +2103,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
if
(
s
->
flipped_image
)
if
(
s
->
flipped_image
)
s
->
data_offset
[
i
]
=
0
;
s
->
data_offset
[
i
]
=
0
;
else
else
s
->
data_offset
[
i
]
=
(
height
-
1
)
*
s
->
current_frame
.
f
->
linesize
[
i
];
s
->
data_offset
[
i
]
=
(
height
-
1
)
*
s
->
current_frame
.
f
->
linesize
[
i
];
}
}
s
->
last_slice_end
=
0
;
s
->
last_slice_end
=
0
;
...
@@ -2082,8 +2112,8 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -2082,8 +2112,8 @@ static int vp3_decode_frame(AVCodecContext *avctx,
// filter the last row
// filter the last row
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
row
=
(
s
->
height
>>
(
3
+
(
i
&&
s
->
chroma_y_shift
)))
-
1
;
int
row
=
(
s
->
height
>>
(
3
+
(
i
&&
s
->
chroma_y_shift
)))
-
1
;
apply_loop_filter
(
s
,
i
,
row
,
row
+
1
);
apply_loop_filter
(
s
,
i
,
row
,
row
+
1
);
}
}
vp3_draw_horiz_band
(
s
,
s
->
avctx
->
height
);
vp3_draw_horiz_band
(
s
,
s
->
avctx
->
height
);
...
@@ -2091,7 +2121,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -2091,7 +2121,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
return
ret
;
return
ret
;
*
got_frame
=
1
;
*
got_frame
=
1
;
if
(
!
HAVE_THREADS
||
!
(
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
))
{
if
(
!
HAVE_THREADS
||
!
(
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
))
{
ret
=
update_frames
(
avctx
);
ret
=
update_frames
(
avctx
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
...
@@ -2102,7 +2132,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
...
@@ -2102,7 +2132,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
error:
error:
ff_thread_report_progress
(
&
s
->
current_frame
,
INT_MAX
,
0
);
ff_thread_report_progress
(
&
s
->
current_frame
,
INT_MAX
,
0
);
if
(
!
HAVE_THREADS
||
!
(
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
))
if
(
!
HAVE_THREADS
||
!
(
s
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
))
av_frame_unref
(
s
->
current_frame
.
f
);
av_frame_unref
(
s
->
current_frame
.
f
);
return
-
1
;
return
-
1
;
...
@@ -2124,9 +2154,8 @@ static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2124,9 +2154,8 @@ static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
s
->
huffman_table
[
s
->
hti
][
token
][
0
]
=
s
->
hbits
;
s
->
huffman_table
[
s
->
hti
][
token
][
0
]
=
s
->
hbits
;
s
->
huffman_table
[
s
->
hti
][
token
][
1
]
=
s
->
huff_code_size
;
s
->
huffman_table
[
s
->
hti
][
token
][
1
]
=
s
->
huff_code_size
;
s
->
entries
++
;
s
->
entries
++
;
}
}
else
{
else
{
if
(
s
->
huff_code_size
>=
32
)
{
/* overflow */
if
(
s
->
huff_code_size
>=
32
)
{
/* overflow */
av_log
(
avctx
,
AV_LOG_ERROR
,
"huffman tree overflow
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"huffman tree overflow
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -2176,16 +2205,18 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2176,16 +2205,18 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
s
->
theora
=
get_bits_long
(
gb
,
24
);
s
->
theora
=
get_bits_long
(
gb
,
24
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Theora bitstream version %X
\n
"
,
s
->
theora
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Theora bitstream version %X
\n
"
,
s
->
theora
);
/* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */
/* 3.2.0 aka alpha3 has the same frame orientation as original vp3
/* but previous versions have the image flipped relative to vp3 */
* but previous versions have the image flipped relative to vp3 */
if
(
s
->
theora
<
0x030200
)
if
(
s
->
theora
<
0x030200
)
{
{
s
->
flipped_image
=
1
;
s
->
flipped_image
=
1
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Old (<alpha3) Theora bitstream, flipped image
\n
"
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Old (<alpha3) Theora bitstream, flipped image
\n
"
);
}
}
visible_width
=
s
->
width
=
get_bits
(
gb
,
16
)
<<
4
;
visible_width
=
visible_height
=
s
->
height
=
get_bits
(
gb
,
16
)
<<
4
;
s
->
width
=
get_bits
(
gb
,
16
)
<<
4
;
visible_height
=
s
->
height
=
get_bits
(
gb
,
16
)
<<
4
;
if
(
s
->
theora
>=
0x030200
)
{
if
(
s
->
theora
>=
0x030200
)
{
visible_width
=
get_bits_long
(
gb
,
24
);
visible_width
=
get_bits_long
(
gb
,
24
);
...
@@ -2203,7 +2234,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2203,7 +2234,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
av_reduce
(
&
avctx
->
time_base
.
num
,
&
avctx
->
time_base
.
den
,
av_reduce
(
&
avctx
->
time_base
.
num
,
&
avctx
->
time_base
.
den
,
fps
.
den
,
fps
.
num
,
1
<<
30
);
fps
.
den
,
fps
.
num
,
1
<<
30
);
}
}
aspect
.
num
=
get_bits_long
(
gb
,
24
);
aspect
.
num
=
get_bits_long
(
gb
,
24
);
...
@@ -2211,7 +2242,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2211,7 +2242,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
if
(
aspect
.
num
&&
aspect
.
den
)
{
if
(
aspect
.
num
&&
aspect
.
den
)
{
av_reduce
(
&
avctx
->
sample_aspect_ratio
.
num
,
av_reduce
(
&
avctx
->
sample_aspect_ratio
.
num
,
&
avctx
->
sample_aspect_ratio
.
den
,
&
avctx
->
sample_aspect_ratio
.
den
,
aspect
.
num
,
aspect
.
den
,
1
<<
30
);
aspect
.
num
,
aspect
.
den
,
1
<<
30
);
}
}
if
(
s
->
theora
<
0x030200
)
if
(
s
->
theora
<
0x030200
)
...
@@ -2221,8 +2252,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2221,8 +2252,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
skip_bits
(
gb
,
6
);
/* quality hint */
skip_bits
(
gb
,
6
);
/* quality hint */
if
(
s
->
theora
>=
0x030200
)
if
(
s
->
theora
>=
0x030200
)
{
{
skip_bits
(
gb
,
5
);
/* keyframe frequency force */
skip_bits
(
gb
,
5
);
/* keyframe frequency force */
avctx
->
pix_fmt
=
theora_pix_fmts
[
get_bits
(
gb
,
2
)];
avctx
->
pix_fmt
=
theora_pix_fmts
[
get_bits
(
gb
,
2
)];
skip_bits
(
gb
,
3
);
/* reserved */
skip_bits
(
gb
,
3
);
/* reserved */
...
@@ -2230,20 +2260,20 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2230,20 +2260,20 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
// align_get_bits(gb);
// align_get_bits(gb);
if
(
visible_width
<=
s
->
width
&&
visible_width
>
s
->
width
-
16
if
(
visible_width
<=
s
->
width
&&
visible_width
>
s
->
width
-
16
&&
&&
visible_height
<=
s
->
height
&&
visible_height
>
s
->
height
-
16
visible_height
<=
s
->
height
&&
visible_height
>
s
->
height
-
16
&&
&&
!
offset_x
&&
(
offset_y
==
s
->
height
-
visible_height
))
!
offset_x
&&
(
offset_y
==
s
->
height
-
visible_height
))
ret
=
ff_set_dimensions
(
avctx
,
visible_width
,
visible_height
);
ret
=
ff_set_dimensions
(
avctx
,
visible_width
,
visible_height
);
else
else
ret
=
ff_set_dimensions
(
avctx
,
s
->
width
,
s
->
height
);
ret
=
ff_set_dimensions
(
avctx
,
s
->
width
,
s
->
height
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
if
(
colorspace
==
1
)
{
if
(
colorspace
==
1
)
avctx
->
color_primaries
=
AVCOL_PRI_BT470M
;
avctx
->
color_primaries
=
AVCOL_PRI_BT470M
;
}
else
if
(
colorspace
==
2
)
{
else
if
(
colorspace
==
2
)
avctx
->
color_primaries
=
AVCOL_PRI_BT470BG
;
avctx
->
color_primaries
=
AVCOL_PRI_BT470BG
;
}
if
(
colorspace
==
1
||
colorspace
==
2
)
{
if
(
colorspace
==
1
||
colorspace
==
2
)
{
avctx
->
colorspace
=
AVCOL_SPC_BT470BG
;
avctx
->
colorspace
=
AVCOL_SPC_BT470BG
;
avctx
->
color_trc
=
AVCOL_TRC_BT709
;
avctx
->
color_trc
=
AVCOL_TRC_BT709
;
...
@@ -2286,48 +2316,50 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2286,48 +2316,50 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
else
else
matrices
=
3
;
matrices
=
3
;
if
(
matrices
>
384
)
{
if
(
matrices
>
384
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid number of base matrixes
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid number of base matrixes
\n
"
);
return
-
1
;
return
-
1
;
}
}
for
(
n
=
0
;
n
<
matrices
;
n
++
){
for
(
n
=
0
;
n
<
matrices
;
n
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
s
->
base_matrix
[
n
][
i
]
=
get_bits
(
gb
,
8
);
s
->
base_matrix
[
n
][
i
]
=
get_bits
(
gb
,
8
);
}
for
(
inter
=
0
;
inter
<=
1
;
inter
++
)
{
for
(
inter
=
0
;
inter
<=
1
;
inter
++
)
{
for
(
plane
=
0
;
plane
<=
2
;
plane
++
)
{
for
(
plane
=
0
;
plane
<=
2
;
plane
++
)
{
int
newqr
=
1
;
int
newqr
=
1
;
if
(
inter
||
plane
>
0
)
if
(
inter
||
plane
>
0
)
newqr
=
get_bits1
(
gb
);
newqr
=
get_bits1
(
gb
);
if
(
!
newqr
)
{
if
(
!
newqr
)
{
int
qtj
,
plj
;
int
qtj
,
plj
;
if
(
inter
&&
get_bits1
(
gb
))
{
if
(
inter
&&
get_bits1
(
gb
))
{
qtj
=
0
;
qtj
=
0
;
plj
=
plane
;
plj
=
plane
;
}
else
{
qtj
=
(
3
*
inter
+
plane
-
1
)
/
3
;
plj
=
(
plane
+
2
)
%
3
;
}
s
->
qr_count
[
inter
][
plane
]
=
s
->
qr_count
[
qtj
][
plj
];
memcpy
(
s
->
qr_size
[
inter
][
plane
],
s
->
qr_size
[
qtj
][
plj
],
sizeof
(
s
->
qr_size
[
0
][
0
]));
memcpy
(
s
->
qr_base
[
inter
][
plane
],
s
->
qr_base
[
qtj
][
plj
],
sizeof
(
s
->
qr_base
[
0
][
0
]));
}
else
{
}
else
{
int
qri
=
0
;
qtj
=
(
3
*
inter
+
plane
-
1
)
/
3
;
plj
=
(
plane
+
2
)
%
3
;
}
s
->
qr_count
[
inter
][
plane
]
=
s
->
qr_count
[
qtj
][
plj
];
memcpy
(
s
->
qr_size
[
inter
][
plane
],
s
->
qr_size
[
qtj
][
plj
],
sizeof
(
s
->
qr_size
[
0
][
0
]));
memcpy
(
s
->
qr_base
[
inter
][
plane
],
s
->
qr_base
[
qtj
][
plj
],
sizeof
(
s
->
qr_base
[
0
][
0
]));
}
else
{
int
qri
=
0
;
int
qi
=
0
;
int
qi
=
0
;
for
(;;){
for
(;;)
{
i
=
get_bits
(
gb
,
av_log2
(
matrices
-
1
)
+
1
);
i
=
get_bits
(
gb
,
av_log2
(
matrices
-
1
)
+
1
);
if
(
i
>=
matrices
){
if
(
i
>=
matrices
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid base matrix index
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid base matrix index
\n
"
);
return
-
1
;
return
-
1
;
}
}
s
->
qr_base
[
inter
][
plane
][
qri
]
=
i
;
s
->
qr_base
[
inter
][
plane
][
qri
]
=
i
;
if
(
qi
>=
63
)
if
(
qi
>=
63
)
break
;
break
;
i
=
get_bits
(
gb
,
av_log2
(
63
-
qi
)
+
1
)
+
1
;
i
=
get_bits
(
gb
,
av_log2
(
63
-
qi
)
+
1
)
+
1
;
s
->
qr_size
[
inter
][
plane
][
qri
++
]
=
i
;
s
->
qr_size
[
inter
][
plane
][
qri
++
]
=
i
;
qi
+=
i
;
qi
+=
i
;
}
}
...
@@ -2335,7 +2367,7 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2335,7 +2367,7 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid qi %d > 63
\n
"
,
qi
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid qi %d > 63
\n
"
,
qi
);
return
-
1
;
return
-
1
;
}
}
s
->
qr_count
[
inter
][
plane
]
=
qri
;
s
->
qr_count
[
inter
][
plane
]
=
qri
;
}
}
}
}
}
}
...
@@ -2346,10 +2378,10 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -2346,10 +2378,10 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
s
->
huff_code_size
=
1
;
s
->
huff_code_size
=
1
;
if
(
!
get_bits1
(
gb
))
{
if
(
!
get_bits1
(
gb
))
{
s
->
hbits
=
0
;
s
->
hbits
=
0
;
if
(
read_huffman_tree
(
avctx
,
gb
))
if
(
read_huffman_tree
(
avctx
,
gb
))
return
-
1
;
return
-
1
;
s
->
hbits
=
1
;
s
->
hbits
=
1
;
if
(
read_huffman_tree
(
avctx
,
gb
))
if
(
read_huffman_tree
(
avctx
,
gb
))
return
-
1
;
return
-
1
;
}
}
}
}
...
@@ -2370,8 +2402,7 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
...
@@ -2370,8 +2402,7 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
s
->
theora
=
1
;
s
->
theora
=
1
;
if
(
!
avctx
->
extradata_size
)
if
(
!
avctx
->
extradata_size
)
{
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Missing extradata!
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Missing extradata!
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -2382,24 +2413,22 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
...
@@ -2382,24 +2413,22 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
return
-
1
;
return
-
1
;
}
}
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
if
(
header_len
[
i
]
<=
0
)
if
(
header_len
[
i
]
<=
0
)
continue
;
continue
;
init_get_bits
(
&
gb
,
header_start
[
i
],
header_len
[
i
]
*
8
);
init_get_bits
(
&
gb
,
header_start
[
i
],
header_len
[
i
]
*
8
);
ptype
=
get_bits
(
&
gb
,
8
);
ptype
=
get_bits
(
&
gb
,
8
);
if
(
!
(
ptype
&
0x80
))
if
(
!
(
ptype
&
0x80
))
{
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid extradata!
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid extradata!
\n
"
);
// return -1;
// return -1;
}
}
// FIXME: Check for this as well.
// FIXME: Check for this as well.
skip_bits_long
(
&
gb
,
6
*
8
);
/* "theora" */
skip_bits_long
(
&
gb
,
6
*
8
);
/* "theora" */
switch
(
ptype
)
switch
(
ptype
)
{
{
case
0x80
:
case
0x80
:
theora_decode_header
(
avctx
,
&
gb
);
theora_decode_header
(
avctx
,
&
gb
);
break
;
break
;
...
@@ -2412,11 +2441,14 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
...
@@ -2412,11 +2441,14 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
return
-
1
;
return
-
1
;
break
;
break
;
default:
default:
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unknown Theora config packet: %d
\n
"
,
ptype
&~
0x80
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unknown Theora config packet: %d
\n
"
,
ptype
&
~
0x80
);
break
;
break
;
}
}
if
(
ptype
!=
0x81
&&
8
*
header_len
[
i
]
!=
get_bits_count
(
&
gb
))
if
(
ptype
!=
0x81
&&
8
*
header_len
[
i
]
!=
get_bits_count
(
&
gb
))
av_log
(
avctx
,
AV_LOG_WARNING
,
"%d bits left in packet %X
\n
"
,
8
*
header_len
[
i
]
-
get_bits_count
(
&
gb
),
ptype
);
av_log
(
avctx
,
AV_LOG_WARNING
,
"%d bits left in packet %X
\n
"
,
8
*
header_len
[
i
]
-
get_bits_count
(
&
gb
),
ptype
);
if
(
s
->
theora
<
0x030200
)
if
(
s
->
theora
<
0x030200
)
break
;
break
;
}
}
...
...
libavcodec/vp3_parser.c
View file @
d2264740
...
@@ -25,10 +25,10 @@ static int parse(AVCodecParserContext *s,
...
@@ -25,10 +25,10 @@ static int parse(AVCodecParserContext *s,
const
uint8_t
**
poutbuf
,
int
*
poutbuf_size
,
const
uint8_t
**
poutbuf
,
int
*
poutbuf_size
,
const
uint8_t
*
buf
,
int
buf_size
)
const
uint8_t
*
buf
,
int
buf_size
)
{
{
if
(
avctx
->
codec_id
==
AV_CODEC_ID_THEORA
)
if
(
avctx
->
codec_id
==
AV_CODEC_ID_THEORA
)
s
->
pict_type
=
(
buf
[
0
]
&
0x40
)
?
AV_PICTURE_TYPE_P
:
AV_PICTURE_TYPE_I
;
s
->
pict_type
=
(
buf
[
0
]
&
0x40
)
?
AV_PICTURE_TYPE_P
:
AV_PICTURE_TYPE_I
;
else
else
s
->
pict_type
=
(
buf
[
0
]
&
0x80
)
?
AV_PICTURE_TYPE_P
:
AV_PICTURE_TYPE_I
;
s
->
pict_type
=
(
buf
[
0
]
&
0x80
)
?
AV_PICTURE_TYPE_P
:
AV_PICTURE_TYPE_I
;
*
poutbuf
=
buf
;
*
poutbuf
=
buf
;
*
poutbuf_size
=
buf_size
;
*
poutbuf_size
=
buf_size
;
...
@@ -36,7 +36,9 @@ static int parse(AVCodecParserContext *s,
...
@@ -36,7 +36,9 @@ static int parse(AVCodecParserContext *s,
}
}
AVCodecParser
ff_vp3_parser
=
{
AVCodecParser
ff_vp3_parser
=
{
.
codec_ids
=
{
AV_CODEC_ID_THEORA
,
AV_CODEC_ID_VP3
,
AV_CODEC_ID_VP6
,
.
codec_ids
=
{
AV_CODEC_ID_VP6F
,
AV_CODEC_ID_VP6A
},
AV_CODEC_ID_THEORA
,
AV_CODEC_ID_VP3
,
AV_CODEC_ID_VP6
,
AV_CODEC_ID_VP6F
,
AV_CODEC_ID_VP6A
},
.
parser_parse
=
parse
,
.
parser_parse
=
parse
,
};
};
libavcodec/vp3data.h
View file @
d2264740
...
@@ -26,8 +26,8 @@
...
@@ -26,8 +26,8 @@
/* these coefficients dequantize intraframe Y plane coefficients
/* these coefficients dequantize intraframe Y plane coefficients
* (note: same as JPEG) */
* (note: same as JPEG) */
static
const
int16_t
vp31_intra_y_dequant
[
64
]
=
static
const
int16_t
vp31_intra_y_dequant
[
64
]
=
{
{
16
,
11
,
10
,
16
,
24
,
40
,
51
,
61
,
16
,
11
,
10
,
16
,
24
,
40
,
51
,
61
,
12
,
12
,
14
,
19
,
26
,
58
,
60
,
55
,
12
,
12
,
14
,
19
,
26
,
58
,
60
,
55
,
14
,
13
,
16
,
24
,
40
,
57
,
69
,
56
,
14
,
13
,
16
,
24
,
40
,
57
,
69
,
56
,
14
,
17
,
22
,
29
,
51
,
87
,
80
,
62
,
14
,
17
,
22
,
29
,
51
,
87
,
80
,
62
,
...
@@ -39,8 +39,8 @@ static const int16_t vp31_intra_y_dequant[64] =
...
@@ -39,8 +39,8 @@ static const int16_t vp31_intra_y_dequant[64] =
/* these coefficients dequantize intraframe C plane coefficients
/* these coefficients dequantize intraframe C plane coefficients
* (note: same as JPEG) */
* (note: same as JPEG) */
static
const
int16_t
vp31_intra_c_dequant
[
64
]
=
static
const
int16_t
vp31_intra_c_dequant
[
64
]
=
{
{
17
,
18
,
24
,
47
,
99
,
99
,
99
,
99
,
17
,
18
,
24
,
47
,
99
,
99
,
99
,
99
,
18
,
21
,
26
,
66
,
99
,
99
,
99
,
99
,
18
,
21
,
26
,
66
,
99
,
99
,
99
,
99
,
24
,
26
,
56
,
99
,
99
,
99
,
99
,
99
,
24
,
26
,
56
,
99
,
99
,
99
,
99
,
99
,
47
,
66
,
99
,
99
,
99
,
99
,
99
,
99
,
47
,
66
,
99
,
99
,
99
,
99
,
99
,
99
,
...
@@ -51,8 +51,8 @@ static const int16_t vp31_intra_c_dequant[64] =
...
@@ -51,8 +51,8 @@ static const int16_t vp31_intra_c_dequant[64] =
};
};
/* these coefficients dequantize interframe coefficients (all planes) */
/* these coefficients dequantize interframe coefficients (all planes) */
static
const
int16_t
vp31_inter_dequant
[
64
]
=
static
const
int16_t
vp31_inter_dequant
[
64
]
=
{
{
16
,
16
,
16
,
20
,
24
,
28
,
32
,
40
,
16
,
16
,
16
,
20
,
24
,
28
,
32
,
40
,
16
,
16
,
20
,
24
,
28
,
32
,
40
,
48
,
16
,
16
,
20
,
24
,
28
,
32
,
40
,
48
,
16
,
20
,
24
,
28
,
32
,
40
,
48
,
64
,
16
,
20
,
24
,
28
,
32
,
40
,
48
,
64
,
20
,
24
,
28
,
32
,
40
,
48
,
64
,
64
,
20
,
24
,
28
,
32
,
40
,
48
,
64
,
64
,
...
@@ -62,8 +62,8 @@ static const int16_t vp31_inter_dequant[64] =
...
@@ -62,8 +62,8 @@ static const int16_t vp31_inter_dequant[64] =
40
,
48
,
64
,
64
,
64
,
96
,
128
,
128
40
,
48
,
64
,
64
,
64
,
96
,
128
,
128
};
};
static
const
int16_t
vp31_dc_scale_factor
[
64
]
=
static
const
int16_t
vp31_dc_scale_factor
[
64
]
=
{
{
220
,
200
,
190
,
180
,
170
,
170
,
160
,
160
,
220
,
200
,
190
,
180
,
170
,
170
,
160
,
160
,
150
,
150
,
140
,
140
,
130
,
130
,
120
,
120
,
150
,
150
,
140
,
140
,
130
,
130
,
120
,
120
,
110
,
110
,
100
,
100
,
90
,
90
,
90
,
80
,
110
,
110
,
100
,
100
,
90
,
90
,
90
,
80
,
80
,
80
,
70
,
70
,
70
,
60
,
60
,
60
,
80
,
80
,
70
,
70
,
70
,
60
,
60
,
60
,
...
@@ -73,8 +73,8 @@ static const int16_t vp31_dc_scale_factor[64] =
...
@@ -73,8 +73,8 @@ static const int16_t vp31_dc_scale_factor[64] =
20
,
10
,
10
,
10
,
10
,
10
,
10
,
10
20
,
10
,
10
,
10
,
10
,
10
,
10
,
10
};
};
static
const
uint32_t
vp31_ac_scale_factor
[
64
]
=
static
const
uint32_t
vp31_ac_scale_factor
[
64
]
=
{
{
500
,
450
,
400
,
370
,
340
,
310
,
285
,
265
,
500
,
450
,
400
,
370
,
340
,
310
,
285
,
265
,
245
,
225
,
210
,
195
,
185
,
180
,
170
,
160
,
245
,
225
,
210
,
195
,
185
,
180
,
170
,
160
,
150
,
145
,
135
,
130
,
125
,
115
,
110
,
107
,
150
,
145
,
135
,
130
,
125
,
115
,
110
,
107
,
100
,
96
,
93
,
89
,
85
,
82
,
75
,
74
,
100
,
96
,
93
,
89
,
85
,
82
,
75
,
74
,
...
@@ -84,8 +84,8 @@ static const uint32_t vp31_ac_scale_factor[64] =
...
@@ -84,8 +84,8 @@ static const uint32_t vp31_ac_scale_factor[64] =
21
,
19
,
18
,
17
,
15
,
13
,
12
,
10
21
,
19
,
18
,
17
,
15
,
13
,
12
,
10
};
};
static
const
uint8_t
vp31_filter_limit_values
[
64
]
=
static
const
uint8_t
vp31_filter_limit_values
[
64
]
=
{
{
30
,
25
,
20
,
20
,
15
,
15
,
14
,
14
,
30
,
25
,
20
,
20
,
15
,
15
,
14
,
14
,
13
,
13
,
12
,
12
,
11
,
11
,
10
,
10
,
13
,
13
,
12
,
12
,
11
,
11
,
10
,
10
,
9
,
9
,
8
,
8
,
7
,
7
,
7
,
7
,
9
,
9
,
8
,
8
,
7
,
7
,
7
,
7
,
6
,
6
,
6
,
6
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
5
,
5
,
5
,
5
,
...
@@ -113,7 +113,7 @@ static const uint16_t superblock_run_length_vlc_table[34][2] = {
...
@@ -113,7 +113,7 @@ static const uint16_t superblock_run_length_vlc_table[34][2] = {
{
0x3EC
,
10
},
{
0x3ED
,
10
},
{
0x3EE
,
10
},
{
0x3EF
,
10
},
{
0x3EC
,
10
},
{
0x3ED
,
10
},
{
0x3EE
,
10
},
{
0x3EF
,
10
},
{
0x3F
,
6
}
/* this last VLC is a special case for reading 12 more
{
0x3F
,
6
}
/* this last VLC is a special case for reading 12 more
bits from stream and adding the value 34 */
*
bits from stream and adding the value 34 */
};
};
static
const
uint16_t
fragment_run_length_vlc_table
[
30
][
2
]
=
{
static
const
uint16_t
fragment_run_length_vlc_table
[
30
][
2
]
=
{
...
@@ -224,7 +224,7 @@ static const int coeff_get_bits[32] = {
...
@@ -224,7 +224,7 @@ static const int coeff_get_bits[32] = {
0
,
0
,
0
,
0
,
0
,
0
,
0
,
/* 0..6 are never used */
0
,
0
,
0
,
0
,
0
,
0
,
0
,
/* 0..6 are never used */
0
,
0
,
0
,
0
,
0
,
0
,
/* 7..12 use constant coeffs */
0
,
0
,
0
,
0
,
0
,
0
,
/* 7..12 use constant coeffs */
1
,
1
,
1
,
1
,
/* 13..16 are constants but still need sign bit */
1
,
1
,
1
,
1
,
/* 13..16 are constants but still need sign bit */
2
,
3
,
4
,
5
,
6
,
10
,
/* 17..22, for reading large coeffs */
2
,
3
,
4
,
5
,
6
,
10
,
/* 17..22, for reading large coeffs */
1
,
1
,
1
,
1
,
1
,
1
,
1
,
/* 23..29 are constants but still need sign bit */
1
,
1
,
1
,
1
,
1
,
1
,
1
,
/* 23..29 are constants but still need sign bit */
2
,
2
/* 30..31 */
2
,
2
/* 30..31 */
};
};
...
...
libavcodec/vp3dsp.c
View file @
d2264740
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include "libavutil/attributes.h"
#include "libavutil/attributes.h"
#include "libavutil/common.h"
#include "libavutil/common.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "avcodec.h"
#include "dsputil.h"
#include "dsputil.h"
#include "rnd_avg.h"
#include "rnd_avg.h"
...
@@ -41,9 +42,10 @@
...
@@ -41,9 +42,10 @@
#define xC6S2 25080
#define xC6S2 25080
#define xC7S1 12785
#define xC7S1 12785
#define M(a,
b) (((a) * (b))>>
16)
#define M(a,
b) (((a) * (b)) >>
16)
static
av_always_inline
void
idct
(
uint8_t
*
dst
,
int
stride
,
int16_t
*
input
,
int
type
)
static
av_always_inline
void
idct
(
uint8_t
*
dst
,
int
stride
,
int16_t
*
input
,
int
type
)
{
{
int16_t
*
ip
=
input
;
int16_t
*
ip
=
input
;
...
@@ -55,8 +57,8 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
...
@@ -55,8 +57,8 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
/* Inverse DCT on the rows now */
/* Inverse DCT on the rows now */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
/* Check for non-zero values */
/* Check for non-zero values */
if
(
ip
[
0
*
8
]
|
ip
[
1
*
8
]
|
ip
[
2
*
8
]
|
ip
[
3
*
8
]
|
if
(
ip
[
0
*
8
]
|
ip
[
1
*
8
]
|
ip
[
2
*
8
]
|
ip
[
3
*
8
]
|
ip
[
4
*
8
]
|
ip
[
5
*
8
]
|
ip
[
6
*
8
]
|
ip
[
7
*
8
]
)
{
ip
[
4
*
8
]
|
ip
[
5
*
8
]
|
ip
[
6
*
8
]
|
ip
[
7
*
8
]
)
{
A
=
M
(
xC1S7
,
ip
[
1
*
8
])
+
M
(
xC7S1
,
ip
[
7
*
8
]);
A
=
M
(
xC1S7
,
ip
[
1
*
8
])
+
M
(
xC7S1
,
ip
[
7
*
8
]);
B
=
M
(
xC7S1
,
ip
[
1
*
8
])
-
M
(
xC1S7
,
ip
[
7
*
8
]);
B
=
M
(
xC7S1
,
ip
[
1
*
8
])
-
M
(
xC1S7
,
ip
[
7
*
8
]);
C
=
M
(
xC3S5
,
ip
[
3
*
8
])
+
M
(
xC5S3
,
ip
[
5
*
8
]);
C
=
M
(
xC3S5
,
ip
[
3
*
8
])
+
M
(
xC5S3
,
ip
[
5
*
8
]);
...
@@ -84,14 +86,14 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
...
@@ -84,14 +86,14 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
Hd
=
Bd
+
H
;
Hd
=
Bd
+
H
;
/* Final sequence of operations over-write original inputs. */
/* Final sequence of operations over-write original inputs. */
ip
[
0
*
8
]
=
Gd
+
Cd
;
ip
[
0
*
8
]
=
Gd
+
Cd
;
ip
[
7
*
8
]
=
Gd
-
Cd
;
ip
[
7
*
8
]
=
Gd
-
Cd
;
ip
[
1
*
8
]
=
Add
+
Hd
;
ip
[
1
*
8
]
=
Add
+
Hd
;
ip
[
2
*
8
]
=
Add
-
Hd
;
ip
[
2
*
8
]
=
Add
-
Hd
;
ip
[
3
*
8
]
=
Ed
+
Dd
;
ip
[
3
*
8
]
=
Ed
+
Dd
;
ip
[
4
*
8
]
=
Ed
-
Dd
;
ip
[
4
*
8
]
=
Ed
-
Dd
;
ip
[
5
*
8
]
=
Fd
+
Bdd
;
ip
[
5
*
8
]
=
Fd
+
Bdd
;
ip
[
6
*
8
]
=
Fd
-
Bdd
;
ip
[
6
*
8
]
=
Fd
-
Bdd
;
...
@@ -102,11 +104,10 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
...
@@ -102,11 +104,10 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
ip
=
input
;
ip
=
input
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
/* Check for non-zero values (bitwise or faster than ||) */
/* Check for non-zero values (bitwise or faster than ||) */
if
(
ip
[
1
]
|
ip
[
2
]
|
ip
[
3
]
|
if
(
ip
[
1
]
|
ip
[
2
]
|
ip
[
3
]
|
ip
[
4
]
|
ip
[
5
]
|
ip
[
6
]
|
ip
[
7
]
)
{
ip
[
4
]
|
ip
[
5
]
|
ip
[
6
]
|
ip
[
7
])
{
A
=
M
(
xC1S7
,
ip
[
1
])
+
M
(
xC7S1
,
ip
[
7
]);
A
=
M
(
xC1S7
,
ip
[
1
])
+
M
(
xC7S1
,
ip
[
7
]);
B
=
M
(
xC7S1
,
ip
[
1
])
-
M
(
xC1S7
,
ip
[
7
]);
B
=
M
(
xC7S1
,
ip
[
1
])
-
M
(
xC1S7
,
ip
[
7
]);
C
=
M
(
xC3S5
,
ip
[
3
])
+
M
(
xC5S3
,
ip
[
5
]);
C
=
M
(
xC3S5
,
ip
[
3
])
+
M
(
xC5S3
,
ip
[
5
]);
...
@@ -121,9 +122,9 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
...
@@ -121,9 +122,9 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
E
=
M
(
xC4S4
,
(
ip
[
0
]
+
ip
[
4
]))
+
8
;
E
=
M
(
xC4S4
,
(
ip
[
0
]
+
ip
[
4
]))
+
8
;
F
=
M
(
xC4S4
,
(
ip
[
0
]
-
ip
[
4
]))
+
8
;
F
=
M
(
xC4S4
,
(
ip
[
0
]
-
ip
[
4
]))
+
8
;
if
(
type
==
1
){
//
HACK
if
(
type
==
1
)
{
//
HACK
E
+=
16
*
128
;
E
+=
16
*
128
;
F
+=
16
*
128
;
F
+=
16
*
128
;
}
}
G
=
M
(
xC2S6
,
ip
[
2
])
+
M
(
xC6S2
,
ip
[
6
]);
G
=
M
(
xC2S6
,
ip
[
2
])
+
M
(
xC6S2
,
ip
[
6
]);
...
@@ -140,52 +141,51 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
...
@@ -140,52 +141,51 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
/* Final sequence of operations over-write original inputs. */
/* Final sequence of operations over-write original inputs. */
if
(
type
==
1
)
{
if
(
type
==
1
)
{
dst
[
0
*
stride
]
=
av_clip_uint8
((
Gd
+
Cd
)
>>
4
);
dst
[
0
*
stride
]
=
av_clip_uint8
((
Gd
+
Cd
)
>>
4
);
dst
[
7
*
stride
]
=
av_clip_uint8
((
Gd
-
Cd
)
>>
4
);
dst
[
7
*
stride
]
=
av_clip_uint8
((
Gd
-
Cd
)
>>
4
);
dst
[
1
*
stride
]
=
av_clip_uint8
((
Add
+
Hd
)
>>
4
);
dst
[
1
*
stride
]
=
av_clip_uint8
((
Add
+
Hd
)
>>
4
);
dst
[
2
*
stride
]
=
av_clip_uint8
((
Add
-
Hd
)
>>
4
);
dst
[
2
*
stride
]
=
av_clip_uint8
((
Add
-
Hd
)
>>
4
);
dst
[
3
*
stride
]
=
av_clip_uint8
((
Ed
+
Dd
)
>>
4
);
dst
[
3
*
stride
]
=
av_clip_uint8
((
Ed
+
Dd
)
>>
4
);
dst
[
4
*
stride
]
=
av_clip_uint8
((
Ed
-
Dd
)
>>
4
);
dst
[
4
*
stride
]
=
av_clip_uint8
((
Ed
-
Dd
)
>>
4
);
dst
[
5
*
stride
]
=
av_clip_uint8
((
Fd
+
Bdd
)
>>
4
);
dst
[
5
*
stride
]
=
av_clip_uint8
((
Fd
+
Bdd
)
>>
4
);
dst
[
6
*
stride
]
=
av_clip_uint8
((
Fd
-
Bdd
)
>>
4
);
dst
[
6
*
stride
]
=
av_clip_uint8
((
Fd
-
Bdd
)
>>
4
);
}
else
{
}
else
{
dst
[
0
*
stride
]
=
av_clip_uint8
(
dst
[
0
*
stride
]
+
((
Gd
+
Cd
)
>>
4
));
dst
[
0
*
stride
]
=
av_clip_uint8
(
dst
[
0
*
stride
]
+
((
Gd
+
Cd
)
>>
4
));
dst
[
7
*
stride
]
=
av_clip_uint8
(
dst
[
7
*
stride
]
+
((
Gd
-
Cd
)
>>
4
));
dst
[
7
*
stride
]
=
av_clip_uint8
(
dst
[
7
*
stride
]
+
((
Gd
-
Cd
)
>>
4
));
dst
[
1
*
stride
]
=
av_clip_uint8
(
dst
[
1
*
stride
]
+
((
Add
+
Hd
)
>>
4
));
dst
[
1
*
stride
]
=
av_clip_uint8
(
dst
[
1
*
stride
]
+
((
Add
+
Hd
)
>>
4
));
dst
[
2
*
stride
]
=
av_clip_uint8
(
dst
[
2
*
stride
]
+
((
Add
-
Hd
)
>>
4
));
dst
[
2
*
stride
]
=
av_clip_uint8
(
dst
[
2
*
stride
]
+
((
Add
-
Hd
)
>>
4
));
dst
[
3
*
stride
]
=
av_clip_uint8
(
dst
[
3
*
stride
]
+
((
Ed
+
Dd
)
>>
4
));
dst
[
3
*
stride
]
=
av_clip_uint8
(
dst
[
3
*
stride
]
+
((
Ed
+
Dd
)
>>
4
));
dst
[
4
*
stride
]
=
av_clip_uint8
(
dst
[
4
*
stride
]
+
((
Ed
-
Dd
)
>>
4
));
dst
[
4
*
stride
]
=
av_clip_uint8
(
dst
[
4
*
stride
]
+
((
Ed
-
Dd
)
>>
4
));
dst
[
5
*
stride
]
=
av_clip_uint8
(
dst
[
5
*
stride
]
+
((
Fd
+
Bdd
)
>>
4
));
dst
[
5
*
stride
]
=
av_clip_uint8
(
dst
[
5
*
stride
]
+
((
Fd
+
Bdd
)
>>
4
));
dst
[
6
*
stride
]
=
av_clip_uint8
(
dst
[
6
*
stride
]
+
((
Fd
-
Bdd
)
>>
4
));
dst
[
6
*
stride
]
=
av_clip_uint8
(
dst
[
6
*
stride
]
+
((
Fd
-
Bdd
)
>>
4
));
}
}
}
else
{
}
else
{
if
(
type
==
1
)
{
if
(
type
==
1
)
{
dst
[
0
*
stride
]
=
dst
[
0
*
stride
]
=
dst
[
1
*
stride
]
=
dst
[
1
*
stride
]
=
dst
[
2
*
stride
]
=
dst
[
2
*
stride
]
=
dst
[
3
*
stride
]
=
dst
[
3
*
stride
]
=
dst
[
4
*
stride
]
=
dst
[
4
*
stride
]
=
dst
[
5
*
stride
]
=
dst
[
5
*
stride
]
=
dst
[
6
*
stride
]
=
dst
[
6
*
stride
]
=
dst
[
7
*
stride
]
=
av_clip_uint8
(
128
+
((
xC4S4
*
ip
[
0
]
+
(
IdctAdjustBeforeShift
<<
16
))
>>
20
));
dst
[
7
*
stride
]
=
av_clip_uint8
(
128
+
((
xC4S4
*
ip
[
0
]
+
(
IdctAdjustBeforeShift
<<
16
))
>>
20
));
}
else
{
}
else
{
if
(
ip
[
0
])
{
if
(
ip
[
0
])
{
int
v
=
((
xC4S4
*
ip
[
0
]
+
(
IdctAdjustBeforeShift
<<
16
))
>>
20
)
;
int
v
=
(
xC4S4
*
ip
[
0
]
+
(
IdctAdjustBeforeShift
<<
16
))
>>
20
;
dst
[
0
*
stride
]
=
av_clip_uint8
(
dst
[
0
*
stride
]
+
v
);
dst
[
0
*
stride
]
=
av_clip_uint8
(
dst
[
0
*
stride
]
+
v
);
dst
[
1
*
stride
]
=
av_clip_uint8
(
dst
[
1
*
stride
]
+
v
);
dst
[
1
*
stride
]
=
av_clip_uint8
(
dst
[
1
*
stride
]
+
v
);
dst
[
2
*
stride
]
=
av_clip_uint8
(
dst
[
2
*
stride
]
+
v
);
dst
[
2
*
stride
]
=
av_clip_uint8
(
dst
[
2
*
stride
]
+
v
);
dst
[
3
*
stride
]
=
av_clip_uint8
(
dst
[
3
*
stride
]
+
v
);
dst
[
3
*
stride
]
=
av_clip_uint8
(
dst
[
3
*
stride
]
+
v
);
dst
[
4
*
stride
]
=
av_clip_uint8
(
dst
[
4
*
stride
]
+
v
);
dst
[
4
*
stride
]
=
av_clip_uint8
(
dst
[
4
*
stride
]
+
v
);
dst
[
5
*
stride
]
=
av_clip_uint8
(
dst
[
5
*
stride
]
+
v
);
dst
[
5
*
stride
]
=
av_clip_uint8
(
dst
[
5
*
stride
]
+
v
);
dst
[
6
*
stride
]
=
av_clip_uint8
(
dst
[
6
*
stride
]
+
v
);
dst
[
6
*
stride
]
=
av_clip_uint8
(
dst
[
6
*
stride
]
+
v
);
dst
[
7
*
stride
]
=
av_clip_uint8
(
dst
[
7
*
stride
]
+
v
);
dst
[
7
*
stride
]
=
av_clip_uint8
(
dst
[
7
*
stride
]
+
v
);
}
}
}
}
}
}
...
@@ -195,26 +195,26 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
...
@@ -195,26 +195,26 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
}
}
}
}
static
void
vp3_idct_put_c
(
uint8_t
*
dest
/*align 8
*/
,
int
line_size
,
static
void
vp3_idct_put_c
(
uint8_t
*
dest
/* align 8
*/
,
int
line_size
,
int16_t
*
block
/*align 16
*/
)
int16_t
*
block
/* align 16
*/
)
{
{
idct
(
dest
,
line_size
,
block
,
1
);
idct
(
dest
,
line_size
,
block
,
1
);
memset
(
block
,
0
,
sizeof
(
*
block
)
*
64
);
memset
(
block
,
0
,
sizeof
(
*
block
)
*
64
);
}
}
static
void
vp3_idct_add_c
(
uint8_t
*
dest
/*align 8
*/
,
int
line_size
,
static
void
vp3_idct_add_c
(
uint8_t
*
dest
/* align 8
*/
,
int
line_size
,
int16_t
*
block
/*align 16
*/
)
int16_t
*
block
/* align 16
*/
)
{
{
idct
(
dest
,
line_size
,
block
,
2
);
idct
(
dest
,
line_size
,
block
,
2
);
memset
(
block
,
0
,
sizeof
(
*
block
)
*
64
);
memset
(
block
,
0
,
sizeof
(
*
block
)
*
64
);
}
}
static
void
vp3_idct_dc_add_c
(
uint8_t
*
dest
/*align 8
*/
,
int
line_size
,
static
void
vp3_idct_dc_add_c
(
uint8_t
*
dest
/* align 8
*/
,
int
line_size
,
int16_t
*
block
/*align 16
*/
)
int16_t
*
block
/* align 16
*/
)
{
{
int
i
,
dc
=
(
block
[
0
]
+
15
)
>>
5
;
int
i
,
dc
=
(
block
[
0
]
+
15
)
>>
5
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
dest
[
0
]
=
av_clip_uint8
(
dest
[
0
]
+
dc
);
dest
[
0
]
=
av_clip_uint8
(
dest
[
0
]
+
dc
);
dest
[
1
]
=
av_clip_uint8
(
dest
[
1
]
+
dc
);
dest
[
1
]
=
av_clip_uint8
(
dest
[
1
]
+
dc
);
dest
[
2
]
=
av_clip_uint8
(
dest
[
2
]
+
dc
);
dest
[
2
]
=
av_clip_uint8
(
dest
[
2
]
+
dc
);
...
@@ -233,13 +233,13 @@ static void vp3_v_loop_filter_c(uint8_t *first_pixel, int stride,
...
@@ -233,13 +233,13 @@ static void vp3_v_loop_filter_c(uint8_t *first_pixel, int stride,
{
{
unsigned
char
*
end
;
unsigned
char
*
end
;
int
filter_value
;
int
filter_value
;
const
int
nstride
=
-
stride
;
const
int
nstride
=
-
stride
;
for
(
end
=
first_pixel
+
8
;
first_pixel
<
end
;
first_pixel
++
)
{
for
(
end
=
first_pixel
+
8
;
first_pixel
<
end
;
first_pixel
++
)
{
filter_value
=
filter_value
=
(
first_pixel
[
2
*
nstride
]
-
first_pixel
[
stride
])
+
(
first_pixel
[
2
*
nstride
]
-
first_pixel
[
stride
])
(
first_pixel
[
0
]
-
first_pixel
[
nstride
])
*
3
;
+
3
*
(
first_pixel
[
0
]
-
first_pixel
[
nstride
]);
filter_value
=
bounding_values
[(
filter_value
+
4
)
>>
3
];
filter_value
=
bounding_values
[(
filter_value
+
4
)
>>
3
];
first_pixel
[
nstride
]
=
av_clip_uint8
(
first_pixel
[
nstride
]
+
filter_value
);
first_pixel
[
nstride
]
=
av_clip_uint8
(
first_pixel
[
nstride
]
+
filter_value
);
first_pixel
[
0
]
=
av_clip_uint8
(
first_pixel
[
0
]
-
filter_value
);
first_pixel
[
0
]
=
av_clip_uint8
(
first_pixel
[
0
]
-
filter_value
);
}
}
...
@@ -251,11 +251,11 @@ static void vp3_h_loop_filter_c(uint8_t *first_pixel, int stride,
...
@@ -251,11 +251,11 @@ static void vp3_h_loop_filter_c(uint8_t *first_pixel, int stride,
unsigned
char
*
end
;
unsigned
char
*
end
;
int
filter_value
;
int
filter_value
;
for
(
end
=
first_pixel
+
8
*
stride
;
first_pixel
!=
end
;
first_pixel
+=
stride
)
{
for
(
end
=
first_pixel
+
8
*
stride
;
first_pixel
!=
end
;
first_pixel
+=
stride
)
{
filter_value
=
filter_value
=
(
first_pixel
[
-
2
]
-
first_pixel
[
1
])
+
(
first_pixel
[
-
2
]
-
first_pixel
[
1
])
(
first_pixel
[
0
]
-
first_pixel
[
-
1
])
*
3
;
+
3
*
(
first_pixel
[
0
]
-
first_pixel
[
-
1
]);
filter_value
=
bounding_values
[(
filter_value
+
4
)
>>
3
];
filter_value
=
bounding_values
[(
filter_value
+
4
)
>>
3
];
first_pixel
[
-
1
]
=
av_clip_uint8
(
first_pixel
[
-
1
]
+
filter_value
);
first_pixel
[
-
1
]
=
av_clip_uint8
(
first_pixel
[
-
1
]
+
filter_value
);
first_pixel
[
0
]
=
av_clip_uint8
(
first_pixel
[
0
]
-
filter_value
);
first_pixel
[
0
]
=
av_clip_uint8
(
first_pixel
[
0
]
-
filter_value
);
}
}
...
...
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