Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
8e624c1c
Commit
8e624c1c
authored
Feb 16, 2011
by
Jason Garrett-Glaser
Committed by
Michael Niedermayer
Feb 18, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
VP8: split out declarations to new header
(cherry picked from commit
bcf4568f
)
parent
625e9309
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
248 additions
and
213 deletions
+248
-213
vp8.c
libavcodec/vp8.c
+1
-176
vp8.h
libavcodec/vp8.h
+242
-0
vp8data.h
libavcodec/vp8data.h
+5
-37
No files found.
libavcodec/vp8.c
View file @
8e624c1c
...
@@ -24,189 +24,14 @@
...
@@ -24,189 +24,14 @@
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
#include "avcodec.h"
#include "avcodec.h"
#include "vp
56
.h"
#include "vp
8
.h"
#include "vp8data.h"
#include "vp8data.h"
#include "vp8dsp.h"
#include "h264pred.h"
#include "rectangle.h"
#include "rectangle.h"
#if ARCH_ARM
#if ARCH_ARM
# include "arm/vp8.h"
# include "arm/vp8.h"
#endif
#endif
typedef
struct
{
uint8_t
filter_level
;
uint8_t
inner_limit
;
uint8_t
inner_filter
;
}
VP8FilterStrength
;
typedef
struct
{
uint8_t
skip
;
// todo: make it possible to check for at least (i4x4 or split_mv)
// in one op. are others needed?
uint8_t
mode
;
uint8_t
ref_frame
;
uint8_t
partitioning
;
VP56mv
mv
;
VP56mv
bmv
[
16
];
}
VP8Macroblock
;
typedef
struct
{
AVCodecContext
*
avctx
;
DSPContext
dsp
;
VP8DSPContext
vp8dsp
;
H264PredContext
hpc
;
vp8_mc_func
put_pixels_tab
[
3
][
3
][
3
];
AVFrame
frames
[
4
];
AVFrame
*
framep
[
4
];
uint8_t
*
edge_emu_buffer
;
VP56RangeCoder
c
;
///< header context, includes mb modes and motion vectors
int
profile
;
int
mb_width
;
/* number of horizontal MB */
int
mb_height
;
/* number of vertical MB */
int
linesize
;
int
uvlinesize
;
int
keyframe
;
int
invisible
;
int
update_last
;
///< update VP56_FRAME_PREVIOUS with the current one
int
update_golden
;
///< VP56_FRAME_NONE if not updated, or which frame to copy if so
int
update_altref
;
int
deblock_filter
;
/**
* If this flag is not set, all the probability updates
* are discarded after this frame is decoded.
*/
int
update_probabilities
;
/**
* All coefficients are contained in separate arith coding contexts.
* There can be 1, 2, 4, or 8 of these after the header context.
*/
int
num_coeff_partitions
;
VP56RangeCoder
coeff_partition
[
8
];
VP8Macroblock
*
macroblocks
;
VP8Macroblock
*
macroblocks_base
;
VP8FilterStrength
*
filter_strength
;
uint8_t
*
intra4x4_pred_mode_top
;
uint8_t
intra4x4_pred_mode_left
[
4
];
uint8_t
*
segmentation_map
;
/**
* Cache of the top row needed for intra prediction
* 16 for luma, 8 for each chroma plane
*/
uint8_t
(
*
top_border
)[
16
+
8
+
8
];
/**
* For coeff decode, we need to know whether the above block had non-zero
* coefficients. This means for each macroblock, we need data for 4 luma
* blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
* per macroblock. We keep the last row in top_nnz.
*/
uint8_t
(
*
top_nnz
)[
9
];
DECLARE_ALIGNED
(
8
,
uint8_t
,
left_nnz
)[
9
];
/**
* This is the index plus one of the last non-zero coeff
* for each of the blocks in the current macroblock.
* So, 0 -> no coeffs
* 1 -> dc-only (special transform)
* 2+-> full transform
*/
DECLARE_ALIGNED
(
16
,
uint8_t
,
non_zero_count_cache
)[
6
][
4
];
DECLARE_ALIGNED
(
16
,
DCTELEM
,
block
)[
6
][
4
][
16
];
DECLARE_ALIGNED
(
16
,
DCTELEM
,
block_dc
)[
16
];
uint8_t
intra4x4_pred_mode_mb
[
16
];
int
chroma_pred_mode
;
///< 8x8c pred mode of the current macroblock
int
segment
;
///< segment of the current macroblock
VP56mv
mv_min
;
VP56mv
mv_max
;
int
mbskip_enabled
;
int
sign_bias
[
4
];
///< one state [0, 1] per ref frame type
int
ref_count
[
3
];
/**
* Base parameters for segmentation, i.e. per-macroblock parameters.
* These must be kept unchanged even if segmentation is not used for
* a frame, since the values persist between interframes.
*/
struct
{
int
enabled
;
int
absolute_vals
;
int
update_map
;
int8_t
base_quant
[
4
];
int8_t
filter_level
[
4
];
///< base loop filter level
}
segmentation
;
/**
* Macroblocks can have one of 4 different quants in a frame when
* segmentation is enabled.
* If segmentation is disabled, only the first segment's values are used.
*/
struct
{
// [0] - DC qmul [1] - AC qmul
int16_t
luma_qmul
[
2
];
int16_t
luma_dc_qmul
[
2
];
///< luma dc-only block quant
int16_t
chroma_qmul
[
2
];
}
qmat
[
4
];
struct
{
int
simple
;
int
level
;
int
sharpness
;
}
filter
;
struct
{
int
enabled
;
///< whether each mb can have a different strength based on mode/ref
/**
* filter strength adjustment for the following macroblock modes:
* [0-3] - i16x16 (always zero)
* [4] - i4x4
* [5] - zero mv
* [6] - inter modes except for zero or split mv
* [7] - split mv
* i16x16 modes never have any adjustment
*/
int8_t
mode
[
VP8_MVMODE_SPLIT
+
1
];
/**
* filter strength adjustment for macroblocks that reference:
* [0] - intra / VP56_FRAME_CURRENT
* [1] - VP56_FRAME_PREVIOUS
* [2] - VP56_FRAME_GOLDEN
* [3] - altref / VP56_FRAME_GOLDEN2
*/
int8_t
ref
[
4
];
}
lf_delta
;
/**
* These are all of the updatable probabilities for binary decisions.
* They are only implictly reset on keyframes, making it quite likely
* for an interframe to desync if a prior frame's header was corrupt
* or missing outright!
*/
struct
{
uint8_t
segmentid
[
3
];
uint8_t
mbskip
;
uint8_t
intra
;
uint8_t
last
;
uint8_t
golden
;
uint8_t
pred16x16
[
4
];
uint8_t
pred8x8c
[
3
];
/* Padded to allow overreads */
uint8_t
token
[
4
][
17
][
3
][
NUM_DCT_TOKENS
-
1
];
uint8_t
mvc
[
2
][
19
];
}
prob
[
2
];
}
VP8Context
;
static
void
vp8_decode_flush
(
AVCodecContext
*
avctx
)
static
void
vp8_decode_flush
(
AVCodecContext
*
avctx
)
{
{
VP8Context
*
s
=
avctx
->
priv_data
;
VP8Context
*
s
=
avctx
->
priv_data
;
...
...
libavcodec/vp8.h
0 → 100644
View file @
8e624c1c
/**
* VP8 compatible video decoder
*
* Copyright (C) 2010 David Conrad
* Copyright (C) 2010 Ronald S. Bultje
* Copyright (C) 2010 Jason Garrett-Glaser
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_VP8_H
#define AVCODEC_VP8_H
#include "vp56.h"
#include "vp56data.h"
#include "vp8dsp.h"
#include "h264pred.h"
#define VP8_MAX_QUANT 127
enum
dct_token
{
DCT_0
,
DCT_1
,
DCT_2
,
DCT_3
,
DCT_4
,
DCT_CAT1
,
DCT_CAT2
,
DCT_CAT3
,
DCT_CAT4
,
DCT_CAT5
,
DCT_CAT6
,
DCT_EOB
,
NUM_DCT_TOKENS
};
// used to signal 4x4 intra pred in luma MBs
#define MODE_I4x4 4
enum
inter_mvmode
{
VP8_MVMODE_ZERO
=
MODE_I4x4
+
1
,
VP8_MVMODE_MV
,
VP8_MVMODE_SPLIT
};
enum
inter_splitmvmode
{
VP8_SPLITMVMODE_16x8
=
0
,
///< 2 16x8 blocks (vertical)
VP8_SPLITMVMODE_8x16
,
///< 2 8x16 blocks (horizontal)
VP8_SPLITMVMODE_8x8
,
///< 2x2 blocks of 8x8px each
VP8_SPLITMVMODE_4x4
,
///< 4x4 blocks of 4x4px each
VP8_SPLITMVMODE_NONE
,
///< (only used in prediction) no split MVs
};
typedef
struct
{
uint8_t
filter_level
;
uint8_t
inner_limit
;
uint8_t
inner_filter
;
}
VP8FilterStrength
;
typedef
struct
{
uint8_t
skip
;
// todo: make it possible to check for at least (i4x4 or split_mv)
// in one op. are others needed?
uint8_t
mode
;
uint8_t
ref_frame
;
uint8_t
partitioning
;
VP56mv
mv
;
VP56mv
bmv
[
16
];
}
VP8Macroblock
;
typedef
struct
{
AVCodecContext
*
avctx
;
DSPContext
dsp
;
VP8DSPContext
vp8dsp
;
H264PredContext
hpc
;
vp8_mc_func
put_pixels_tab
[
3
][
3
][
3
];
AVFrame
frames
[
4
];
AVFrame
*
framep
[
4
];
uint8_t
*
edge_emu_buffer
;
VP56RangeCoder
c
;
///< header context, includes mb modes and motion vectors
int
profile
;
int
mb_width
;
/* number of horizontal MB */
int
mb_height
;
/* number of vertical MB */
int
linesize
;
int
uvlinesize
;
int
keyframe
;
int
invisible
;
int
update_last
;
///< update VP56_FRAME_PREVIOUS with the current one
int
update_golden
;
///< VP56_FRAME_NONE if not updated, or which frame to copy if so
int
update_altref
;
int
deblock_filter
;
/**
* If this flag is not set, all the probability updates
* are discarded after this frame is decoded.
*/
int
update_probabilities
;
/**
* All coefficients are contained in separate arith coding contexts.
* There can be 1, 2, 4, or 8 of these after the header context.
*/
int
num_coeff_partitions
;
VP56RangeCoder
coeff_partition
[
8
];
VP8Macroblock
*
macroblocks
;
VP8Macroblock
*
macroblocks_base
;
VP8FilterStrength
*
filter_strength
;
uint8_t
*
intra4x4_pred_mode_top
;
uint8_t
intra4x4_pred_mode_left
[
4
];
uint8_t
*
segmentation_map
;
/**
* Cache of the top row needed for intra prediction
* 16 for luma, 8 for each chroma plane
*/
uint8_t
(
*
top_border
)[
16
+
8
+
8
];
/**
* For coeff decode, we need to know whether the above block had non-zero
* coefficients. This means for each macroblock, we need data for 4 luma
* blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
* per macroblock. We keep the last row in top_nnz.
*/
uint8_t
(
*
top_nnz
)[
9
];
DECLARE_ALIGNED
(
8
,
uint8_t
,
left_nnz
)[
9
];
/**
* This is the index plus one of the last non-zero coeff
* for each of the blocks in the current macroblock.
* So, 0 -> no coeffs
* 1 -> dc-only (special transform)
* 2+-> full transform
*/
DECLARE_ALIGNED
(
16
,
uint8_t
,
non_zero_count_cache
)[
6
][
4
];
DECLARE_ALIGNED
(
16
,
DCTELEM
,
block
)[
6
][
4
][
16
];
DECLARE_ALIGNED
(
16
,
DCTELEM
,
block_dc
)[
16
];
uint8_t
intra4x4_pred_mode_mb
[
16
];
int
chroma_pred_mode
;
///< 8x8c pred mode of the current macroblock
int
segment
;
///< segment of the current macroblock
VP56mv
mv_min
;
VP56mv
mv_max
;
int
mbskip_enabled
;
int
sign_bias
[
4
];
///< one state [0, 1] per ref frame type
int
ref_count
[
3
];
/**
* Base parameters for segmentation, i.e. per-macroblock parameters.
* These must be kept unchanged even if segmentation is not used for
* a frame, since the values persist between interframes.
*/
struct
{
int
enabled
;
int
absolute_vals
;
int
update_map
;
int8_t
base_quant
[
4
];
int8_t
filter_level
[
4
];
///< base loop filter level
}
segmentation
;
/**
* Macroblocks can have one of 4 different quants in a frame when
* segmentation is enabled.
* If segmentation is disabled, only the first segment's values are used.
*/
struct
{
// [0] - DC qmul [1] - AC qmul
int16_t
luma_qmul
[
2
];
int16_t
luma_dc_qmul
[
2
];
///< luma dc-only block quant
int16_t
chroma_qmul
[
2
];
}
qmat
[
4
];
struct
{
int
simple
;
int
level
;
int
sharpness
;
}
filter
;
struct
{
int
enabled
;
///< whether each mb can have a different strength based on mode/ref
/**
* filter strength adjustment for the following macroblock modes:
* [0-3] - i16x16 (always zero)
* [4] - i4x4
* [5] - zero mv
* [6] - inter modes except for zero or split mv
* [7] - split mv
* i16x16 modes never have any adjustment
*/
int8_t
mode
[
VP8_MVMODE_SPLIT
+
1
];
/**
* filter strength adjustment for macroblocks that reference:
* [0] - intra / VP56_FRAME_CURRENT
* [1] - VP56_FRAME_PREVIOUS
* [2] - VP56_FRAME_GOLDEN
* [3] - altref / VP56_FRAME_GOLDEN2
*/
int8_t
ref
[
4
];
}
lf_delta
;
/**
* These are all of the updatable probabilities for binary decisions.
* They are only implictly reset on keyframes, making it quite likely
* for an interframe to desync if a prior frame's header was corrupt
* or missing outright!
*/
struct
{
uint8_t
segmentid
[
3
];
uint8_t
mbskip
;
uint8_t
intra
;
uint8_t
last
;
uint8_t
golden
;
uint8_t
pred16x16
[
4
];
uint8_t
pred8x8c
[
3
];
/* Padded to allow overreads */
uint8_t
token
[
4
][
17
][
3
][
NUM_DCT_TOKENS
-
1
];
uint8_t
mvc
[
2
][
19
];
}
prob
[
2
];
}
VP8Context
;
#endif
libavcodec/vp8data.h
View file @
8e624c1c
...
@@ -21,46 +21,12 @@
...
@@ -21,46 +21,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
*/
// TODO: move these #define and enum to a better header...
#ifndef AVCODEC_VP8DATA_H
#define AVCODEC_VP8DATA_H
#define VP8_MAX_QUANT 127
enum
dct_token
{
DCT_0
,
DCT_1
,
DCT_2
,
DCT_3
,
DCT_4
,
DCT_CAT1
,
DCT_CAT2
,
DCT_CAT3
,
DCT_CAT4
,
DCT_CAT5
,
DCT_CAT6
,
DCT_EOB
,
NUM_DCT_TOKENS
};
#include "vp8.h"
#include "h264pred.h"
#include "h264pred.h"
// used to signal 4x4 intra pred in luma MBs
#define MODE_I4x4 4
enum
inter_mvmode
{
VP8_MVMODE_ZERO
=
MODE_I4x4
+
1
,
VP8_MVMODE_MV
,
VP8_MVMODE_SPLIT
};
enum
inter_splitmvmode
{
VP8_SPLITMVMODE_16x8
=
0
,
///< 2 16x8 blocks (vertical)
VP8_SPLITMVMODE_8x16
,
///< 2 8x16 blocks (horizontal)
VP8_SPLITMVMODE_8x8
,
///< 2x2 blocks of 8x8px each
VP8_SPLITMVMODE_4x4
,
///< 4x4 blocks of 4x4px each
VP8_SPLITMVMODE_NONE
,
///< (only used in prediction) no split MVs
};
static
const
uint8_t
vp8_pred4x4_mode
[]
=
static
const
uint8_t
vp8_pred4x4_mode
[]
=
{
{
[
DC_PRED8x8
]
=
DC_PRED
,
[
DC_PRED8x8
]
=
DC_PRED
,
...
@@ -718,3 +684,5 @@ static const uint8_t vp8_mv_default_prob[2][19] = {
...
@@ -718,3 +684,5 @@ static const uint8_t vp8_mv_default_prob[2][19] = {
204
,
170
,
119
,
235
,
140
,
230
,
228
,
204
,
170
,
119
,
235
,
140
,
230
,
228
,
128
,
130
,
130
,
74
,
148
,
180
,
203
,
236
,
254
,
254
}
128
,
130
,
130
,
74
,
148
,
180
,
203
,
236
,
254
,
254
}
};
};
#endif
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