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
2ce151f8
Commit
2ce151f8
authored
Feb 01, 2005
by
anonymous
Committed by
Michael Niedermayer
Feb 01, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Documentation patch by anonymous
Originally committed as revision 3914 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
790409c9
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
432 additions
and
220 deletions
+432
-220
vc9.c
libavcodec/vc9.c
+420
-193
vc9data.h
libavcodec/vc9data.h
+12
-27
No files found.
libavcodec/vc9.c
View file @
2ce151f8
...
@@ -64,54 +64,73 @@ static const uint16_t table_mb_intra[64][2];
...
@@ -64,54 +64,73 @@ static const uint16_t table_mb_intra[64][2];
codes, codes_wrap, codes_size, use_static)
codes, codes_wrap, codes_size, use_static)
#endif
#endif
/** Available Profiles */
//@{
#define PROFILE_SIMPLE 0
#define PROFILE_SIMPLE 0
#define PROFILE_MAIN 1
#define PROFILE_MAIN 1
#define PROFILE_ADVANCED 3
#define PROFILE_ADVANCED 3
//@}
/** Sequence quantizer mode */
//@{
#define QUANT_FRAME_IMPLICIT 0
#define QUANT_FRAME_IMPLICIT 0
#define QUANT_FRAME_EXPLICIT 1
#define QUANT_FRAME_EXPLICIT 1
#define QUANT_NON_UNIFORM 2
#define QUANT_NON_UNIFORM 2
#define QUANT_UNIFORM 3
#define QUANT_UNIFORM 3
//@}
/* Where quant can be changed */
/** Where quant can be changed */
//@{
#define DQPROFILE_FOUR_EDGES 0
#define DQPROFILE_FOUR_EDGES 0
#define DQPROFILE_DOUBLE_EDGES 1
#define DQPROFILE_DOUBLE_EDGES 1
#define DQPROFILE_SINGLE_EDGE 2
#define DQPROFILE_SINGLE_EDGE 2
#define DQPROFILE_ALL_MBS 3
#define DQPROFILE_ALL_MBS 3
//@}
/* Which edge is quantized with ALTPQUANT */
/** @name Where quant can be changed
*/
//@{
#define DQPROFILE_FOUR_EDGES 0
#define DQSINGLE_BEDGE_LEFT 0
#define DQSINGLE_BEDGE_LEFT 0
#define DQSINGLE_BEDGE_TOP 1
#define DQSINGLE_BEDGE_TOP 1
#define DQSINGLE_BEDGE_RIGHT 2
#define DQSINGLE_BEDGE_RIGHT 2
#define DQSINGLE_BEDGE_BOTTOM 3
#define DQSINGLE_BEDGE_BOTTOM 3
//@}
/* Which pair of edges is quantized with ALTPQUANT */
/** Which pair of edges is quantized with ALTPQUANT */
//@{
#define DQDOUBLE_BEDGE_TOPLEFT 0
#define DQDOUBLE_BEDGE_TOPLEFT 0
#define DQDOUBLE_BEDGE_TOPRIGHT 1
#define DQDOUBLE_BEDGE_TOPRIGHT 1
#define DQDOUBLE_BEDGE_BOTTOMRIGHT 2
#define DQDOUBLE_BEDGE_BOTTOMRIGHT 2
#define DQDOUBLE_BEDGE_BOTTOMLEFT 3
#define DQDOUBLE_BEDGE_BOTTOMLEFT 3
//@}
/* MV P modes */
/** MV modes for P frames */
//@{
#define MV_PMODE_1MV_HPEL_BILIN 0
#define MV_PMODE_1MV_HPEL_BILIN 0
#define MV_PMODE_1MV 1
#define MV_PMODE_1MV 1
#define MV_PMODE_1MV_HPEL 2
#define MV_PMODE_1MV_HPEL 2
#define MV_PMODE_MIXED_MV 3
#define MV_PMODE_MIXED_MV 3
#define MV_PMODE_INTENSITY_COMP 4
#define MV_PMODE_INTENSITY_COMP 4
//@}
/** @name MV types for B frames */
//@{
#define BMV_TYPE_BACKWARD 0
#define BMV_TYPE_BACKWARD 0
#define BMV_TYPE_BACKWARD 0
#define BMV_TYPE_FORWARD 1
#define BMV_TYPE_FORWARD 1
#define BMV_TYPE_INTERPOLATED 3
#define BMV_TYPE_INTERPOLATED 3
//@}
/* MV P mode - the 5th element is only used for mode 1 */
/*
*
MV P mode - the 5th element is only used for mode 1 */
static
const
uint8_t
mv_pmode_table
[
2
][
5
]
=
{
static
const
uint8_t
mv_pmode_table
[
2
][
5
]
=
{
{
MV_PMODE_1MV_HPEL_BILIN
,
MV_PMODE_1MV
,
MV_PMODE_1MV_HPEL
,
MV_PMODE_MIXED_MV
,
MV_PMODE_INTENSITY_COMP
},
{
MV_PMODE_1MV_HPEL_BILIN
,
MV_PMODE_1MV
,
MV_PMODE_1MV_HPEL
,
MV_PMODE_MIXED_MV
,
MV_PMODE_INTENSITY_COMP
},
{
MV_PMODE_1MV
,
MV_PMODE_MIXED_MV
,
MV_PMODE_1MV_HPEL
,
MV_PMODE_1MV_HPEL_BILIN
,
MV_PMODE_INTENSITY_COMP
}
{
MV_PMODE_1MV
,
MV_PMODE_MIXED_MV
,
MV_PMODE_1MV_HPEL
,
MV_PMODE_1MV_HPEL_BILIN
,
MV_PMODE_INTENSITY_COMP
}
};
};
/* One more frame type */
/*
*
One more frame type */
#define BI_TYPE 7
#define BI_TYPE 7
/* FIXME Worse than ugly */
static
const
int
fps_nr
[
5
]
=
{
24
,
25
,
30
,
50
,
60
},
static
const
int
fps_nr
[
5
]
=
{
24
,
25
,
30
,
50
,
60
},
fps_dr
[
2
]
=
{
1000
,
1001
};
fps_dr
[
2
]
=
{
1000
,
1001
};
static
const
uint8_t
pquant_table
[
3
][
32
]
=
{
static
const
uint8_t
pquant_table
[
3
][
32
]
=
{
...
@@ -129,21 +148,24 @@ static const uint8_t pquant_table[3][32] = {
...
@@ -129,21 +148,24 @@ static const uint8_t pquant_table[3][32] = {
}
}
};
};
// FIXME move this into the context
/** @name VC-9 VLC tables and defines
* @todo TODO move this into the context
*/
//@{
#define VC9_BFRACTION_VLC_BITS 7
#define VC9_BFRACTION_VLC_BITS 7
static
VLC
vc9_bfraction_vlc
;
static
VLC
vc9_bfraction_vlc
;
#define VC9_IMODE_VLC_BITS 4
#define VC9_IMODE_VLC_BITS 4
static
VLC
vc9_imode_vlc
;
static
VLC
vc9_imode_vlc
;
#define VC9_NORM2_VLC_BITS 3
#define VC9_NORM2_VLC_BITS 3
static
VLC
vc9_norm2_vlc
;
static
VLC
vc9_norm2_vlc
;
#if
TILE_VLC_METHO
D == 1
#if
VLC_NORM6_METH0
D == 1
#define VC9_NORM6_VLC_BITS 9
#define VC9_NORM6_VLC_BITS 9
static
VLC
vc9_norm6_vlc
;
static
VLC
vc9_norm6_vlc
;
#endif
#endif
#if
TILE_VLC_METHO
D == 2
#if
VLC_NORM6_METH0
D == 2
#define VC9_NORM6_FIRST_BITS 8
#define VC9_NORM6_FIRST_BITS 8
#define VC9_NORM6_SECOND_BITS 8
#define VC9_NORM6_SECOND_BITS 8
static
VLC
vc9_norm6_first
,
vc9_norm6_second
;
static
VLC
vc9_norm6_first
_vlc
,
vc9_norm6_second_vlc
;
#endif
#endif
/* Could be optimized, one table only needs 8 bits */
/* Could be optimized, one table only needs 8 bits */
#define VC9_TTMB_VLC_BITS 9 //12
#define VC9_TTMB_VLC_BITS 9 //12
...
@@ -154,104 +176,126 @@ static VLC vc9_mv_diff_vlc[4];
...
@@ -154,104 +176,126 @@ static VLC vc9_mv_diff_vlc[4];
static
VLC
vc9_cbpcy_p_vlc
[
4
];
static
VLC
vc9_cbpcy_p_vlc
[
4
];
#define VC9_4MV_BLOCK_PATTERN_VLC_BITS 6
#define VC9_4MV_BLOCK_PATTERN_VLC_BITS 6
static
VLC
vc9_4mv_block_pattern_vlc
[
4
];
static
VLC
vc9_4mv_block_pattern_vlc
[
4
];
//@}
//We mainly need data and is_raw, so this struct could be avoided
/** Bitplane struct
//to save a level of indirection; feel free to modify
* We mainly need data and is_raw, so this struct could be avoided
* to save a level of indirection; feel free to modify
* @fixme For now, stride=width
* @warning Data are bits, either 1 or 0
*/
typedef
struct
BitPlane
{
typedef
struct
BitPlane
{
uint8_t
*
data
;
uint8_t
*
data
;
///< Data buffer
int
width
,
stride
;
int
width
;
///< Width of the buffer
int
height
;
int
stride
;
///< Stride of the buffer
uint8_t
is_raw
;
int
height
;
///< Plane height
uint8_t
is_raw
;
///< Bit values must be read at MB level
}
BitPlane
;
}
BitPlane
;
/** The VC9 Context */
typedef
struct
VC9Context
{
typedef
struct
VC9Context
{
/* No MpegEnc context, might be good to use it */
MpegEncContext
s
;
MpegEncContext
s
;
/**************************
*/
/** Simple/Main Profile sequence header
*/
/* Sequence Header */
//@{
/***************************/
int
res_sm
;
///< reserved, 2b
/* Simple/Main Profile */
int
res_x8
;
///< reserved
int
res_sm
;
//reserved, 2b
int
multires
;
///< frame-level RESPIC syntax element present
int
res_x8
;
//reserved
int
res_fasttx
;
///< reserved, always 1
int
multires
;
//frame-level RESPIC syntax element present
int
res_transtab
;
///< reserved, always 0
int
res_fasttx
;
//always 1
int
rangered
;
///< RANGEREDFRM (range reduction) syntax element present
int
res_transtab
;
//always 0
///< at frame level
int
rangered
;
//RANGEREDFRM (range reduction) syntax element present
int
res_rtm_flag
;
///< reserved, set to 1
int
res_rtm_flag
;
//reserved, set to 1
int
reserved
;
///< reserved
int
reserved
;
//duh
//@}
#if HAS_ADVANCED_PROFILE
#if HAS_ADVANCED_PROFILE
/* Advanced Profile */
/** Advanced Profile */
int
level
;
//3
//@{
int
chromaformat
;
//2
int
level
;
///< 3bits, for Advanced/Simple Profile, provided by TS layer
int
postprocflag
;
//frame-based processing use
int
chromaformat
;
///< 2bits, 2=4:2:0, only defined
int
broadcast
;
//TFF/RFF present
int
postprocflag
;
///< Per-frame processing suggestion flag present
int
interlace
;
//Progressive/interlaced (RPTFTM syntax element)
int
broadcast
;
///< TFF/RFF present
int
tfcntrflag
;
//TFCNTR present
int
interlace
;
///< Progressive/interlaced (RPTFTM syntax element)
int
panscanflag
;
//NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} presents
int
tfcntrflag
;
///< TFCNTR present
int
extended_dmv
;
int
panscanflag
;
///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
int
color_prim
;
//8
int
extended_dmv
;
///< Additional extended dmv range at P/B frame-level
int
transfer_char
;
//8
int
color_prim
;
///< 8bits, chroma coordinates of the color primaries
int
matrix_coef
;
//8
int
transfer_char
;
///< 8bits, Opto-electronic transfer characteristics
int
hrd_param_flag
;
int
matrix_coef
;
///< 8bits, Color primaries->YCbCr transform matrix
int
hrd_param_flag
;
///< Presence of Hypothetical Reference
///< Decoder parameters
//@}
#endif
#endif
/* All Profiles */
/* TODO: move all int to flags */
/** Sequence header data for all Profiles
int
profile
;
//2
* TODO: choose between ints, uint8_ts and monobit flags
int
frmrtq_postproc
;
//3
*/
int
bitrtq_postproc
;
//5
//@{
int
loopfilter
;
int
profile
;
///< 2bits, Profile
int
fastuvmc
;
//Rounding of qpel vector to hpel ? (not in Simple)
int
frmrtq_postproc
;
///< 3bits,
int
extended_mv
;
//Ext MV in P/B (not in Simple)
int
bitrtq_postproc
;
///< 5bits, quantized framerate-based postprocessing strength
int
dquant
;
//How qscale varies with MBs, 2bits (not in Simple)
int
fastuvmc
;
///< Rounding of qpel vector to hpel ? (not in Simple)
int
vstransform
;
//variable-size transform46
int
extended_mv
;
///< Ext MV in P/B (not in Simple)
int
dquant
;
///< How qscale varies with MBs, 2bits (not in Simple)
int
vstransform
;
///< variable-size [48]x[48] transform type + info
int
overlap
;
//overlapped transforms in use
int
overlap
;
///< overlapped transforms in use
int
quantizer_mode
;
//2, quantizer mode used for sequence, see QUANT_*
int
quantizer_mode
;
///< 2bits, quantizer mode used for sequence, see QUANT_*
int
finterpflag
;
//INTERPFRM present
int
finterpflag
;
///< INTERPFRM present
//@}
/*****************************/
/** Frame decoding info for all profiles */
/* Frame decoding */
//@{
/*****************************/
uint8_t
mv_mode
;
///< MV coding monde
/* All profiles */
uint8_t
mv_mode2
;
///< Secondary MV coding mode (B frames)
uint8_t
mv_mode
,
mv_mode2
;
/* MV coding mode */
uint8_t
pq
,
altpq
;
///< Current/alternate frame quantizer scale
uint8_t
pq
,
altpq
;
/* Quantizers */
/** pquant parameters */
uint8_t
dquantfrm
,
dqprofile
,
dqsbedge
,
dqbilevel
;
/* pquant parameters */
//@{
int
tile
;
/* 3x2 if (width_mb%3) else 2x3 */
uint8_t
dquantfrm
;
int
ac_table_level
;
uint8_t
dqprofile
;
VLC
*
luma_dc_vlc
,
*
chroma_dc_vlc
;
/* transac/dcfrm bits are indexes */
uint8_t
dqsbedge
;
uint8_t
ttmbf
,
ttfrm
;
/* Transform type */
uint8_t
dqbilevel
;
uint8_t
lumscale
,
lumshift
;
/* Luma compensation parameters */
//@}
int16_t
bfraction
;
/* Relative position % anchors=> how to scale MVs */
int
ac_table_level
;
///< Index for AC tables from ACFRM element
uint8_t
halfpq
;
/* Uniform quant over image and qp+.5 */
VLC
*
luma_dc_vlc
;
///< Pointer to current luma DC VLC table
uint8_t
respic
;
VLC
*
chroma_dc_vlc
;
///< Pointer to current luma AC VLC table
int
buffer_fullness
;
/* For HRD ? */
int
ttfrm
;
///< Transform type info present at frame level
/* Ranges:
uint8_t
ttmbf
;
///< Transform type
* 0 -> [-64n 63.f] x [-32, 31.f]
/** Luma compensation parameters */
* 1 -> [-128, 127.f] x [-64, 63.f]
//@{
* 2 -> [-512, 511.f] x [-128, 127.f]
uint8_t
lumscale
;
* 3 -> [-1024, 1023.f] x [-256, 255.f]
uint8_t
lumshift
;
//@}
int16_t
bfraction
;
///< Relative position % anchors=> how to scale MVs
uint8_t
halfpq
;
///< Uniform quant over image and qp+.5
uint8_t
respic
;
///< Frame-level flag for resized images
int
buffer_fullness
;
///< HRD info
/** Ranges:
* -# 0 -> [-64n 63.f] x [-32, 31.f]
* -# 1 -> [-128, 127.f] x [-64, 63.f]
* -# 2 -> [-512, 511.f] x [-128, 127.f]
* -# 3 -> [-1024, 1023.f] x [-256, 255.f]
*/
*/
uint8_t
mvrange
;
uint8_t
mvrange
;
uint8_t
pquantizer
;
uint8_t
pquantizer
;
uint8_t
*
previous_line_cbpcy
;
/* To use for predicted CBPCY */
uint8_t
*
previous_line_cbpcy
;
///< To use for predicted CBPCY
VLC
*
cbpcy_vlc
/* Current CBPCY VLC table */
,
VLC
*
cbpcy_vlc
;
///< Current CBPCY VLC table
*
ttmb_vlc
/* Current MB Transform Type VLC table */
;
VLC
*
ttmb_vlc
;
///< Current MB Transform Type VLC table
BitPlane
mv_type_mb_plane
;
/* bitplane for mv_type == (4MV) */
BitPlane
mv_type_mb_plane
;
///< bitplane for mv_type == (4MV)
BitPlane
skip_mb_plane
,
/* bitplane for skipped MBs */
BitPlane
skip_mb_plane
;
///< bitplane for skipped MBs
direct_mb_plane
;
/* bitplane for "direct" MBs */
BitPlane
direct_mb_plane
;
///< bitplane for "direct" MBs
/* S/M only ? */
/** Frame decoding info for S/M profiles only */
uint8_t
rangeredfrm
;
/* out_sample = CLIP((in_sample-128)*2+128) */
//@{
uint8_t
rangeredfrm
;
///< out_sample = CLIP((in_sample-128)*2+128)
uint8_t
interpfrm
;
uint8_t
interpfrm
;
//@}
#if HAS_ADVANCED_PROFILE
#if HAS_ADVANCED_PROFILE
/* Advanced */
/** Frame decoding info for Advanced profile */
uint8_t
fcm
;
//0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
//@{
uint8_t
fcm
;
///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
uint8_t
numpanscanwin
;
uint8_t
numpanscanwin
;
uint8_t
tfcntr
;
uint8_t
tfcntr
;
uint8_t
rptfrm
,
tff
,
rff
;
uint8_t
rptfrm
,
tff
,
rff
;
...
@@ -264,15 +308,23 @@ typedef struct VC9Context{
...
@@ -264,15 +308,23 @@ typedef struct VC9Context{
int
hrd_num_leaky_buckets
;
int
hrd_num_leaky_buckets
;
uint8_t
bit_rate_exponent
;
uint8_t
bit_rate_exponent
;
uint8_t
buffer_size_exponent
;
uint8_t
buffer_size_exponent
;
BitPlane
ac_pred_plane
;
//
AC prediction flags bitplane
BitPlane
ac_pred_plane
;
///<
AC prediction flags bitplane
BitPlane
over_flags_plane
;
//
Overflags bitplane
BitPlane
over_flags_plane
;
///<
Overflags bitplane
uint8_t
condover
;
uint8_t
condover
;
uint16_t
*
hrd_rate
,
*
hrd_buffer
;
uint16_t
*
hrd_rate
,
*
hrd_buffer
;
VLC
*
luma_ac2_vlc
,
*
chroma_ac2_vlc
;
int
ac2_table_level
;
///< Index for AC2 tables from AC2FRM element
//@}
#endif
#endif
}
VC9Context
;
}
VC9Context
;
/* FIXME Slow and ugly */
/**
* Get unary code of limited length
* @fixme FIXME Slow and ugly
* @param gb GetBitContext
* @param[in] stop The bitstop value (unary code of 1's or 0's)
* @param[in] len Maximum length
* @return Unary length/index
*/
static
int
get_prefix
(
GetBitContext
*
gb
,
int
stop
,
int
len
)
static
int
get_prefix
(
GetBitContext
*
gb
,
int
stop
,
int
len
)
{
{
#if 1
#if 1
...
@@ -306,13 +358,17 @@ static int get_prefix(GetBitContext *gb, int stop, int len)
...
@@ -306,13 +358,17 @@ static int get_prefix(GetBitContext *gb, int stop, int len)
#endif
#endif
}
}
/**
* Init VC-9 specific tables and VC9Context members
* @param v The VC9Context to initialize
* @return Status
*/
static
int
vc9_init_common
(
VC9Context
*
v
)
static
int
vc9_init_common
(
VC9Context
*
v
)
{
{
static
int
done
=
0
;
static
int
done
=
0
;
int
i
;
int
i
;
/* Set the bit planes */
/* Set the bit planes */
/* FIXME memset better ? (16bytes) */
v
->
mv_type_mb_plane
=
(
struct
BitPlane
)
{
NULL
,
0
,
0
,
0
};
v
->
mv_type_mb_plane
=
(
struct
BitPlane
)
{
NULL
,
0
,
0
,
0
};
v
->
direct_mb_plane
=
(
struct
BitPlane
)
{
NULL
,
0
,
0
,
0
};
v
->
direct_mb_plane
=
(
struct
BitPlane
)
{
NULL
,
0
,
0
,
0
};
v
->
skip_mb_plane
=
(
struct
BitPlane
)
{
NULL
,
0
,
0
,
0
};
v
->
skip_mb_plane
=
(
struct
BitPlane
)
{
NULL
,
0
,
0
,
0
};
...
@@ -322,7 +378,7 @@ static int vc9_init_common(VC9Context *v)
...
@@ -322,7 +378,7 @@ static int vc9_init_common(VC9Context *v)
#endif
#endif
/* VLC tables */
/* VLC tables */
#if
TILE_VLC_METHO
D == 1
#if
VLC_NORM6_METH0
D == 1
# if 0 // spec -> actual tables converter
# if 0 // spec -> actual tables converter
for
(
i
=
0
;
i
<
64
;
i
++
){
for
(
i
=
0
;
i
<
64
;
i
++
){
int
code
=
(
vc9_norm6_spec
[
i
][
1
]
<<
vc9_norm6_spec
[
i
][
4
])
+
vc9_norm6_spec
[
i
][
3
];
int
code
=
(
vc9_norm6_spec
[
i
][
1
]
<<
vc9_norm6_spec
[
i
][
4
])
+
vc9_norm6_spec
[
i
][
3
];
...
@@ -345,18 +401,18 @@ static int vc9_init_common(VC9Context *v)
...
@@ -345,18 +401,18 @@ static int vc9_init_common(VC9Context *v)
INIT_VLC
(
&
vc9_norm2_vlc
,
VC9_NORM2_VLC_BITS
,
4
,
INIT_VLC
(
&
vc9_norm2_vlc
,
VC9_NORM2_VLC_BITS
,
4
,
vc9_norm2_bits
,
1
,
1
,
vc9_norm2_bits
,
1
,
1
,
vc9_norm2_codes
,
1
,
1
,
1
);
vc9_norm2_codes
,
1
,
1
,
1
);
#if
TILE_VLC_METHO
D == 1
#if
VLC_NORM6_METH0
D == 1
INIT_VLC
(
&
vc9_norm6_vlc
,
VC9_NORM6_VLC_BITS
,
64
,
INIT_VLC
(
&
vc9_norm6_vlc
,
VC9_NORM6_VLC_BITS
,
64
,
vc9_norm6_bits
,
1
,
1
,
vc9_norm6_bits
,
1
,
1
,
vc9_norm6_codes
,
2
,
2
,
1
);
vc9_norm6_codes
,
2
,
2
,
1
);
#endif
#endif
#if
TILE_VLC_METHO
D == 2
#if
VLC_NORM6_METH0
D == 2
INIT_VLC
(
&
vc9_norm6_first
,
VC9_NORM6_FIRST_BITS
,
6
4
,
INIT_VLC
(
&
vc9_norm6_first
_vlc
,
VC9_NORM6_FIRST_BITS
,
2
4
,
&
vc9_norm6_first
[
0
][
1
],
1
,
1
,
&
vc9_norm6_first
[
0
][
1
],
1
,
1
,
&
vc9_norm6_first
[
0
][
0
],
1
,
1
,
1
);
&
vc9_norm6_first
[
0
][
0
],
1
,
1
,
1
);
INIT_VLC
(
&
vc9_norm6_second
,
VC9_NORM6_SECOND_BITS
,
64
,
INIT_VLC
(
&
vc9_norm6_second
_vlc
,
VC9_NORM6_SECOND_BITS
,
22
,
vc9_norm6_second
[
0
][
1
],
1
,
1
,
&
vc9_norm6_second
[
0
][
1
],
1
,
1
,
vc9_norm6_second
[
0
][
1
],
1
,
1
,
1
);
&
vc9_norm6_second
[
0
][
0
],
1
,
1
,
1
);
#endif
#endif
INIT_VLC
(
&
vc9_imode_vlc
,
VC9_IMODE_VLC_BITS
,
7
,
INIT_VLC
(
&
vc9_imode_vlc
,
VC9_IMODE_VLC_BITS
,
7
,
vc9_imode_bits
,
1
,
1
,
vc9_imode_bits
,
1
,
1
,
...
@@ -389,7 +445,13 @@ static int vc9_init_common(VC9Context *v)
...
@@ -389,7 +445,13 @@ static int vc9_init_common(VC9Context *v)
}
}
#if HAS_ADVANCED_PROFILE
#if HAS_ADVANCED_PROFILE
/* 6.2.1, p32 */
/**
* Decode sequence header's Hypothetic Reference Decoder data
* @see 6.2.1, p32
* @param v The VC9Context to initialize
* @param gb A GetBitContext initialized from AVCodecContext extra_data
* @return Status
*/
static
int
decode_hrd
(
VC9Context
*
v
,
GetBitContext
*
gb
)
static
int
decode_hrd
(
VC9Context
*
v
,
GetBitContext
*
gb
)
{
{
int
i
,
num
;
int
i
,
num
;
...
@@ -438,7 +500,14 @@ static int decode_hrd(VC9Context *v, GetBitContext *gb)
...
@@ -438,7 +500,14 @@ static int decode_hrd(VC9Context *v, GetBitContext *gb)
return
0
;
return
0
;
}
}
/* Table 2, p18 */
/**
* Decode sequence header for Advanced Profile
* @see Table 2, p18
* @see 6.1.7, pp21-27
* @param v The VC9Context to initialize
* @param gb A GetBitContext initialized from AVCodecContext extra_data
* @return Status
*/
static
int
decode_advanced_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
)
static
int
decode_advanced_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
)
{
{
VC9Context
*
v
=
avctx
->
priv_data
;
VC9Context
*
v
=
avctx
->
priv_data
;
...
@@ -585,7 +654,13 @@ static int decode_advanced_sequence_header(AVCodecContext *avctx, GetBitContext
...
@@ -585,7 +654,13 @@ static int decode_advanced_sequence_header(AVCodecContext *avctx, GetBitContext
}
}
#endif
#endif
/* Figure 7-8, p16-17 */
/**
* Decode Simple/Main Profiles sequence header
* @see Figure 7-8, p16-17
* @param avctx Codec context
* @param gb GetBit context initialized from Codec context extra_data
* @return Status
*/
static
int
decode_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
)
static
int
decode_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
)
{
{
VC9Context
*
v
=
avctx
->
priv_data
;
VC9Context
*
v
=
avctx
->
priv_data
;
...
@@ -706,7 +781,7 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -706,7 +781,7 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
"Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i
\n
"
"Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i
\n
"
"DQuant=%i, Quantizer mode=%i, Max B frames=%i
\n
"
,
"DQuant=%i, Quantizer mode=%i, Max B frames=%i
\n
"
,
v
->
profile
,
v
->
frmrtq_postproc
,
v
->
bitrtq_postproc
,
v
->
profile
,
v
->
frmrtq_postproc
,
v
->
bitrtq_postproc
,
v
->
loop
filter
,
v
->
multires
,
v
->
fastuvmc
,
v
->
extended_mv
,
v
->
s
.
loop_
filter
,
v
->
multires
,
v
->
fastuvmc
,
v
->
extended_mv
,
v
->
rangered
,
v
->
vstransform
,
v
->
overlap
,
v
->
s
.
resync_marker
,
v
->
rangered
,
v
->
vstransform
,
v
->
overlap
,
v
->
s
.
resync_marker
,
v
->
dquant
,
v
->
quantizer_mode
,
avctx
->
max_b_frames
v
->
dquant
,
v
->
quantizer_mode
,
avctx
->
max_b_frames
);
);
...
@@ -720,9 +795,11 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
...
@@ -720,9 +795,11 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
#if HAS_ADVANCED_PROFILE
#if HAS_ADVANCED_PROFILE
/*****************************************************************************/
/** Entry point decoding (Advanced Profile)
/* Entry point decoding (Advanced Profile) */
* @param avctx Codec context
/*****************************************************************************/
* @param gb GetBit context initialized from avctx->extra_data
* @return Status
*/
static
int
advanced_entry_point_process
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
)
static
int
advanced_entry_point_process
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
)
{
{
VC9Context
*
v
=
avctx
->
priv_data
;
VC9Context
*
v
=
avctx
->
priv_data
;
...
@@ -762,9 +839,17 @@ static int advanced_entry_point_process(AVCodecContext *avctx, GetBitContext *gb
...
@@ -762,9 +839,17 @@ static int advanced_entry_point_process(AVCodecContext *avctx, GetBitContext *gb
}
}
#endif
#endif
/******************************************************************************/
/***********************************************************************/
/* Bitplane decoding: 8.7, p56 */
/**
/******************************************************************************/
* @defgroup bitplane VC9 Bitplane decoding
* @see 8.7, p56
* @{
*/
/** @addtogroup bitplane
* Imode types
* @{
*/
#define IMODE_RAW 0
#define IMODE_RAW 0
#define IMODE_NORM2 1
#define IMODE_NORM2 1
#define IMODE_DIFF2 2
#define IMODE_DIFF2 2
...
@@ -772,22 +857,41 @@ static int advanced_entry_point_process(AVCodecContext *avctx, GetBitContext *gb
...
@@ -772,22 +857,41 @@ static int advanced_entry_point_process(AVCodecContext *avctx, GetBitContext *gb
#define IMODE_DIFF6 4
#define IMODE_DIFF6 4
#define IMODE_ROWSKIP 5
#define IMODE_ROWSKIP 5
#define IMODE_COLSKIP 6
#define IMODE_COLSKIP 6
/** @} */
//imode defines
/** Allocate the buffer from a bitplane, given its dimensions
* @param bp Bitplane which buffer is to allocate
* @param[in] width Width of the buffer
* @param[in] height Height of the buffer
* @return Status
* @todo TODO: Take into account stride
* @todo TODO: Allow use of external buffers ?
*/
int
alloc_bitplane
(
BitPlane
*
bp
,
int
width
,
int
height
)
int
alloc_bitplane
(
BitPlane
*
bp
,
int
width
,
int
height
)
{
{
if
(
!
bp
||
bp
->
width
<
0
||
bp
->
height
<
0
)
return
-
1
;
if
(
!
bp
||
bp
->
width
<
0
||
bp
->
height
<
0
)
return
-
1
;
bp
->
data
=
(
uint8_t
*
)
av_malloc
(
width
*
height
);
bp
->
data
=
(
uint8_t
*
)
av_malloc
(
width
*
height
);
if
(
!
bp
->
data
)
return
-
1
;
if
(
!
bp
->
data
)
return
-
1
;
bp
->
width
=
bp
->
stride
=
width
;
//FIXME Needed for aligned data ?
bp
->
width
=
bp
->
stride
=
width
;
bp
->
height
=
height
;
bp
->
height
=
height
;
return
0
;
return
0
;
}
}
/** Free the bitplane's buffer
* @param bp Bitplane which buffer is to free
*/
void
free_bitplane
(
BitPlane
*
bp
)
void
free_bitplane
(
BitPlane
*
bp
)
{
{
bp
->
width
=
bp
->
stride
=
bp
->
height
=
0
;
bp
->
width
=
bp
->
stride
=
bp
->
height
=
0
;
if
(
bp
->
data
)
av_freep
(
&
bp
->
data
);
if
(
bp
->
data
)
av_freep
(
&
bp
->
data
);
}
}
/** Decode rows by checking if they are skiped
* @param plane Buffer to store decoded bits
* @param[in] width Width of this buffer
* @param[in] height Height of this buffer
* @param[in] stride of this buffer
*/
static
void
decode_rowskip
(
uint8_t
*
plane
,
int
width
,
int
height
,
int
stride
,
VC9Context
*
v
){
static
void
decode_rowskip
(
uint8_t
*
plane
,
int
width
,
int
height
,
int
stride
,
VC9Context
*
v
){
int
x
,
y
;
int
x
,
y
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -802,7 +906,13 @@ static void decode_rowskip(uint8_t* plane, int width, int height, int stride, VC
...
@@ -802,7 +906,13 @@ static void decode_rowskip(uint8_t* plane, int width, int height, int stride, VC
}
}
}
}
//FIXME optimize
/** Decode columns by checking if they are skiped
* @param plane Buffer to store decoded bits
* @param[in] width Width of this buffer
* @param[in] height Height of this buffer
* @param[in] stride of this buffer
* @fixme FIXME: Optimize
*/
static
void
decode_colskip
(
uint8_t
*
plane
,
int
width
,
int
height
,
int
stride
,
VC9Context
*
v
){
static
void
decode_colskip
(
uint8_t
*
plane
,
int
width
,
int
height
,
int
stride
,
VC9Context
*
v
){
int
x
,
y
;
int
x
,
y
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -818,10 +928,13 @@ static void decode_colskip(uint8_t* plane, int width, int height, int stride, VC
...
@@ -818,10 +928,13 @@ static void decode_colskip(uint8_t* plane, int width, int height, int stride, VC
}
}
}
}
//FIXME optimize
/** Decode a bitplane's bits
//FIXME Use BitPlane struct or return if table is raw (no bits read here but
* @param bp Bitplane where to store the decode bits
// later on)
* @param v VC9 context for bit reading and logging
//Elements must be either 0 or 1
* @return Status
* @fixme FIXME: Optimize
* @todo TODO: Decide if a struct is needed
*/
static
int
bitplane_decoding
(
BitPlane
*
bp
,
VC9Context
*
v
)
static
int
bitplane_decoding
(
BitPlane
*
bp
,
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -857,35 +970,30 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
...
@@ -857,35 +970,30 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
for
(
y
=
bp
->
height
%
tile_h
;
y
<
bp
->
height
;
y
+=
tile_h
){
for
(
y
=
bp
->
height
%
tile_h
;
y
<
bp
->
height
;
y
+=
tile_h
){
for
(
x
=
bp
->
width
%
tile_w
;
x
<
bp
->
width
;
x
+=
tile_w
){
for
(
x
=
bp
->
width
%
tile_w
;
x
<
bp
->
width
;
x
+=
tile_w
){
#if
TILE_VLC_METHOD == 1 //FIXME Too much optimized ?
#if
VLC_NORM6_METH0D == 1
code
=
get_vlc2
(
gb
,
vc9_norm6_vlc
.
table
,
VC9_NORM6_VLC_BITS
,
2
);
code
=
get_vlc2
(
gb
,
vc9_norm6_vlc
.
table
,
VC9_NORM6_VLC_BITS
,
2
);
if
(
code
<
0
){
if
(
code
<
0
){
av_log
(
v
->
s
.
avctx
,
AV_LOG_DEBUG
,
"in
av
lid NORM-6 VLC
\n
"
);
av_log
(
v
->
s
.
avctx
,
AV_LOG_DEBUG
,
"in
va
lid NORM-6 VLC
\n
"
);
return
-
1
;
return
-
1
;
}
}
#endif
#endif
#if
TILE_VLC_METHOD == 2 //TODO Optimize VLC decoding
#if
VLC_NORM6_METH0D == 2 //Failure
code
=
get_vlc2
(
gb
,
vc9_norm6_first
.
table
,
VC9_NORM6_FIRST_BITS
,
2
);
code
=
get_vlc2
(
gb
,
vc9_norm6_first
_vlc
.
table
,
VC9_NORM6_FIRST_BITS
,
2
);
if
(
vc9_norm6_mode
[
code
]
==
1
)
if
(
code
==
22
)
{
{
# if TRACE
code
=
get_bits
(
gb
,
5
);
assert
(
code
>-
1
&&
code
<
20
);
code
=
vc9_norm6_flc_val
[
code
];
# else
code
=
vc9_norm6_flc_val
[
get_bits
(
gb
,
5
)];
code
=
vc9_norm6_flc_val
[
get_bits
(
gb
,
5
)];
# endif
}
}
else
if
(
vc9_norm6_mode
[
code
]
==
2
)
else
if
(
code
==
23
)
{
{
# if TRACE
# if TRACE
code
=
get_vlc2
(
gb
,
vc9_norm6_second
.
table
,
VC9_NORM6_SECOND_BITS
,
2
);
code
=
get_vlc2
(
gb
,
vc9_norm6_second
_vlc
.
table
,
VC9_NORM6_SECOND_BITS
,
2
);
assert
(
code
>-
1
&&
code
<
22
);
assert
(
code
>-
1
&&
code
<
22
);
code
=
vc9_norm6_second_val
[
code
];
code
=
vc9_norm6_second_val
[
code
];
# else
# else
code
=
vc9_norm6_second_val
[
get_vlc2
(
gb
,
vc9_norm6_second
.
table
,
VC9_NORM6_SECOND_BITS
,
2
)];
code
=
vc9_norm6_second_val
[
get_vlc2
(
gb
,
vc9_norm6_second
_vlc
.
table
,
VC9_NORM6_SECOND_BITS
,
2
)];
# endif
# endif
#endif //TILE_VLC_METHOD == 2
}
#endif //VLC_NORM6_METH0D == 2
//FIXME following is a pure guess and probably wrong
//FIXME following is a pure guess and probably wrong
//FIXME A bitplane (0 | !0), so could the shifts be avoided ?
//FIXME A bitplane (0 | !0), so could the shifts be avoided ?
planep
[
x
+
0
*
bp
->
stride
]
=
(
code
>>
0
)
&
1
;
planep
[
x
+
0
*
bp
->
stride
]
=
(
code
>>
0
)
&
1
;
...
@@ -944,10 +1052,12 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
...
@@ -944,10 +1052,12 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
}
}
return
(
imode
<<
1
)
+
invert
;
return
(
imode
<<
1
)
+
invert
;
}
}
/** @} */
//Bitplane group
/*****************************************************************************/
/***********************************************************************/
/* VOP Dquant decoding */
/** VOP Dquant decoding
/*****************************************************************************/
* @param v VC9 Context
*/
static
int
vop_dquant_decoding
(
VC9Context
*
v
)
static
int
vop_dquant_decoding
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -987,12 +1097,19 @@ static int vop_dquant_decoding(VC9Context *v)
...
@@ -987,12 +1097,19 @@ static int vop_dquant_decoding(VC9Context *v)
return
0
;
return
0
;
}
}
/*****************************************************************************/
/***********************************************************************/
/* All Profiles picture header decoding specific functions */
/**
/* Only pro/epilog differs between Simple/Main and Advanced => check caller */
* @defgroup all_frame_hdr All VC9 profiles frame header
/*****************************************************************************/
* @brief Part of the frame header decoding from all profiles
* @warning Only pro/epilog differs between Simple/Main and Advanced => check caller
/* Tables 11+12, p62-65 */
* @{
*/
/** B and BI frame header decoding, primary part
* @see Tables 11+12, p62-65
* @param v VC9 context
* @return Status
* @warning Also handles BI frames
*/
static
int
decode_b_picture_primary_header
(
VC9Context
*
v
)
static
int
decode_b_picture_primary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1062,6 +1179,13 @@ static int decode_b_picture_primary_header(VC9Context *v)
...
@@ -1062,6 +1179,13 @@ static int decode_b_picture_primary_header(VC9Context *v)
return
0
;
return
0
;
}
}
/** B and BI frame header decoding, secondary part
* @see Tables 11+12, p62-65
* @param v VC9 context
* @return Status
* @warning Also handles BI frames
* @warning To call once all MB arrays are allocated
*/
static
int
decode_b_picture_secondary_header
(
VC9Context
*
v
)
static
int
decode_b_picture_secondary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1116,7 +1240,11 @@ static int decode_b_picture_secondary_header(VC9Context *v)
...
@@ -1116,7 +1240,11 @@ static int decode_b_picture_secondary_header(VC9Context *v)
return
0
;
return
0
;
}
}
/* Tables 5+7, p53-54 and 55-57 */
/** I frame header decoding, primary part
* @see Tables 5+7, p53-54 and 55-57
* @param v VC9 context
* @return Status
*/
static
int
decode_i_picture_header
(
VC9Context
*
v
)
static
int
decode_i_picture_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1179,7 +1307,11 @@ static int decode_i_picture_header(VC9Context *v)
...
@@ -1179,7 +1307,11 @@ static int decode_i_picture_header(VC9Context *v)
return
status
;
return
status
;
}
}
/* Table 9, p58-60 */
/** P frame header decoding, primary part
* @see Tables 5+7, p53-54 and 55-57
* @param v VC9 context
* @return Status
*/
static
int
decode_p_picture_primary_header
(
VC9Context
*
v
)
static
int
decode_p_picture_primary_header
(
VC9Context
*
v
)
{
{
/* INTERFRM, FRMCNT, RANGEREDFRM read in caller */
/* INTERFRM, FRMCNT, RANGEREDFRM read in caller */
...
@@ -1218,6 +1350,12 @@ static int decode_p_picture_primary_header(VC9Context *v)
...
@@ -1218,6 +1350,12 @@ static int decode_p_picture_primary_header(VC9Context *v)
return
0
;
return
0
;
}
}
/** P frame header decoding, secondary part
* @see Tables 5+7, p53-54 and 55-57
* @param v VC9 context
* @warning To call once all MB arrays are allocated
* @return Status
*/
static
int
decode_p_picture_secondary_header
(
VC9Context
*
v
)
static
int
decode_p_picture_secondary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1265,8 +1403,23 @@ static int decode_p_picture_secondary_header(VC9Context *v)
...
@@ -1265,8 +1403,23 @@ static int decode_p_picture_secondary_header(VC9Context *v)
/* Epilog (AC/DC syntax) should be done in caller */
/* Epilog (AC/DC syntax) should be done in caller */
return
0
;
return
0
;
}
}
/** @} */
//End of group all_frm_hdr
/***********************************************************************/
/**
* @defgroup std_frame_hdr VC9 Simple/Main Profiles header decoding
* @brief Part of the frame header decoding belonging to Simple/Main Profiles
* @warning Only pro/epilog differs between Simple/Main and Advanced =>
* check caller
* @{
*/
/** Frame header decoding, first part, in Simple and Main profiles
* @see Tables 5+7, p53-54 and 55-57
* @param v VC9 context
* @return Status
*/
static
int
standard_decode_picture_primary_header
(
VC9Context
*
v
)
static
int
standard_decode_picture_primary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1303,6 +1456,11 @@ static int standard_decode_picture_primary_header(VC9Context *v)
...
@@ -1303,6 +1456,11 @@ static int standard_decode_picture_primary_header(VC9Context *v)
return
0
;
return
0
;
}
}
/** Frame header decoding, secondary part
* @param v VC9 context
* @warning To call once all MB arrays are allocated
* @return Status
*/
static
int
standard_decode_picture_secondary_header
(
VC9Context
*
v
)
static
int
standard_decode_picture_secondary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1318,9 +1476,7 @@ static int standard_decode_picture_secondary_header(VC9Context *v)
...
@@ -1318,9 +1476,7 @@ static int standard_decode_picture_secondary_header(VC9Context *v)
v
->
ac_table_level
=
decode012
(
gb
);
v
->
ac_table_level
=
decode012
(
gb
);
if
(
v
->
s
.
pict_type
==
I_TYPE
||
v
->
s
.
pict_type
==
BI_TYPE
)
if
(
v
->
s
.
pict_type
==
I_TYPE
||
v
->
s
.
pict_type
==
BI_TYPE
)
{
{
index
=
decode012
(
gb
);
v
->
ac2_table_level
=
decode012
(
gb
);
v
->
luma_ac2_vlc
=
NULL
+
index
;
//FIXME Add AC2 table
v
->
chroma_ac2_vlc
=
NULL
+
index
;
}
}
/* DC Syntax */
/* DC Syntax */
index
=
decode012
(
gb
);
index
=
decode012
(
gb
);
...
@@ -1329,12 +1485,21 @@ static int standard_decode_picture_secondary_header(VC9Context *v)
...
@@ -1329,12 +1485,21 @@ static int standard_decode_picture_secondary_header(VC9Context *v)
return
0
;
return
0
;
}
}
/** @} */
//End for group std_frame_hdr
#if HAS_ADVANCED_PROFILE
#if HAS_ADVANCED_PROFILE
/******************************************************************************/
/***********************************************************************/
/* Advanced Profile picture header decoding specific functions */
/**
/******************************************************************************/
* @defgroup adv_frame_hdr VC9 Advanced Profile header decoding
* @brief Part of the frame header decoding belonging to Advanced Profiles
* @warning Only pro/epilog differs between Simple/Main and Advanced =>
* check caller
* @{
*/
/** Frame header decoding, primary part
* @param v VC9 context
* @return Status
*/
static
int
advanced_decode_picture_primary_header
(
VC9Context
*
v
)
static
int
advanced_decode_picture_primary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1392,6 +1557,10 @@ static int advanced_decode_picture_primary_header(VC9Context *v)
...
@@ -1392,6 +1557,10 @@ static int advanced_decode_picture_primary_header(VC9Context *v)
return
0
;
return
0
;
}
}
/** Frame header decoding, secondary part
* @param v VC9 context
* @return Status
*/
static
int
advanced_decode_picture_secondary_header
(
VC9Context
*
v
)
static
int
advanced_decode_picture_secondary_header
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1408,9 +1577,7 @@ static int advanced_decode_picture_secondary_header(VC9Context *v)
...
@@ -1408,9 +1577,7 @@ static int advanced_decode_picture_secondary_header(VC9Context *v)
v
->
ac_table_level
=
decode012
(
gb
);
v
->
ac_table_level
=
decode012
(
gb
);
if
(
v
->
s
.
pict_type
==
I_TYPE
||
v
->
s
.
pict_type
==
BI_TYPE
)
if
(
v
->
s
.
pict_type
==
I_TYPE
||
v
->
s
.
pict_type
==
BI_TYPE
)
{
{
index
=
decode012
(
gb
);
//FIXME
v
->
ac2_table_level
=
decode012
(
gb
);
v
->
luma_ac2_vlc
=
NULL
+
index
;
v
->
chroma_ac2_vlc
=
NULL
+
index
;
}
}
/* DC Syntax */
/* DC Syntax */
index
=
decode012
(
gb
);
index
=
decode012
(
gb
);
...
@@ -1420,12 +1587,23 @@ static int advanced_decode_picture_secondary_header(VC9Context *v)
...
@@ -1420,12 +1587,23 @@ static int advanced_decode_picture_secondary_header(VC9Context *v)
return
0
;
return
0
;
}
}
#endif
#endif
/** @} */
//End for adv_frame_hdr
/******************************************************************************/
/***********************************************************************/
/* Block decoding functions */
/**
/******************************************************************************/
* @defgroup block VC9 Block-level functions
/* 7.1.4, p91 and 8.1.1.7, p(1)04 */
* @see 7.1.4, p91 and 8.1.1.7, p(1)04
/* FIXME proper integration (unusable and lots of parameters to send */
* @todo TODO: Integrate to MpegEncContext facilities
* @{
*/
/** Decode a luma intra block
* @warning Will be removed, due to necessary integration
* @see coeff scaling for Adv Profile: 8.1.1.15, p(1)13,
* @param v VC9 context
* @param mquant Macroblock quantizer scale
* @return Status
* @todo TODO: Implement Coeff scaling for Advanced Profile
*/
int
decode_luma_intra_block
(
VC9Context
*
v
,
int
mquant
)
int
decode_luma_intra_block
(
VC9Context
*
v
,
int
mquant
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
...
@@ -1456,12 +1634,22 @@ int decode_luma_intra_block(VC9Context *v, int mquant)
...
@@ -1456,12 +1634,22 @@ int decode_luma_intra_block(VC9Context *v, int mquant)
return
0
;
return
0
;
}
}
/** @} */
//End for group block
/******************************************************************************/
/***********************************************************************/
/* MacroBlock decoding functions */
/**
/******************************************************************************/
* @defgroup std_mb VC9 Macroblock-level functions in Simple/Main Profiles
/* 8.1.1.5, p(1)02-(1)03 */
* @see 7.1.4, p91 and 8.1.1.7, p(1)04
/* We only need to store 3 flags, but math with 4 is easier */
* @todo TODO: Integrate to MpegEncContext facilities
* @{
*/
/**
* @def GET_CBPCY(table, bits)
* @brief Get the Coded Block Pattern for luma and chroma
* @param table VLC table to use (get_vlc2 second parameter)
* @param bits Average bitlength (third parameter to get_vlc2)
* @see 8.1.1.5, p(1)02-(1)03
*/
#define GET_CBPCY(table, bits) \
#define GET_CBPCY(table, bits) \
predicted_cbpcy = get_vlc2(gb, table, bits, 2); \
predicted_cbpcy = get_vlc2(gb, table, bits, 2); \
cbpcy[0] = (p_cbpcy[-1] == p_cbpcy[2]) \
cbpcy[0] = (p_cbpcy[-1] == p_cbpcy[2]) \
...
@@ -1475,13 +1663,16 @@ int decode_luma_intra_block(VC9Context *v, int mquant)
...
@@ -1475,13 +1663,16 @@ int decode_luma_intra_block(VC9Context *v, int mquant)
cbpcy[3] = (cbpcy[1] == cbpcy[0]) ? cbpcy[2] : cbpcy[1]; \
cbpcy[3] = (cbpcy[1] == cbpcy[0]) ? cbpcy[2] : cbpcy[1]; \
cbpcy[3] ^= ((predicted_cbpcy>>2)&0x01);
cbpcy[3] ^= ((predicted_cbpcy>>2)&0x01);
/* 8.1, p100 */
/** Decode all MBs for an I frame in Simple/Main profile
* @see 8.1, p100
* @todo TODO: Process the blocks
* @todo TODO: Use M$ MPEG-4 cbp prediction
*/
static
int
standard_decode_i_mbs
(
VC9Context
*
v
)
static
int
standard_decode_i_mbs
(
VC9Context
*
v
)
{
{
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
GetBitContext
*
gb
=
&
v
->
s
.
gb
;
MpegEncContext
*
s
=
&
v
->
s
;
MpegEncContext
*
s
=
&
v
->
s
;
int
current_mb
=
0
;
/* MB/Block Position info */
int
current_mb
=
0
;
/* MB/Block Position info */
/* FIXME: better to use a pointer than using (x<<4) */
uint8_t
cbpcy
[
4
],
previous_cbpcy
[
4
],
predicted_cbpcy
,
uint8_t
cbpcy
[
4
],
previous_cbpcy
[
4
],
predicted_cbpcy
,
*
p_cbpcy
/* Pointer to skip some math */
;
*
p_cbpcy
/* Pointer to skip some math */
;
...
@@ -1524,6 +1715,10 @@ static int standard_decode_i_mbs(VC9Context *v)
...
@@ -1524,6 +1715,10 @@ static int standard_decode_i_mbs(VC9Context *v)
return
0
;
return
0
;
}
}
/**
* @def GET_MQUANT
* @brief Get macroblock-level quantizer scale
*/
#define GET_MQUANT() \
#define GET_MQUANT() \
if (v->dquantfrm) \
if (v->dquantfrm) \
{ \
{ \
...
@@ -1542,7 +1737,13 @@ static int standard_decode_i_mbs(VC9Context *v)
...
@@ -1542,7 +1737,13 @@ static int standard_decode_i_mbs(VC9Context *v)
} \
} \
}
}
/* MVDATA decoding from 8.3.5.2, p(1)20 */
/**
* @def GET_MVDATA(_dmv_x, _dmv_y)
* @brief Get MV differentials
* @see MVDATA decoding from 8.3.5.2, p(1)20
* @param dmv_x Horizontal differential for decoded MV
* @param dmv_y Vertical differential for decoded MV
*/
#define GET_MVDATA(_dmv_x, _dmv_y) \
#define GET_MVDATA(_dmv_x, _dmv_y) \
index = 1 + get_vlc2(gb, vc9_mv_diff_vlc[s->mv_table_index].table,\
index = 1 + get_vlc2(gb, vc9_mv_diff_vlc[s->mv_table_index].table,\
VC9_MV_DIFF_VLC_BITS, 2); \
VC9_MV_DIFF_VLC_BITS, 2); \
...
@@ -1577,7 +1778,11 @@ static int standard_decode_i_mbs(VC9Context *v)
...
@@ -1577,7 +1778,11 @@ static int standard_decode_i_mbs(VC9Context *v)
_dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
_dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
}
}
/* 8.1, p(1)15 */
/** Decode all MBs for an P frame in Simple/Main profile
* @see 8.1, p(1)15
* @todo TODO: Process the blocks
* @todo TODO: Use M$ MPEG-4 cbp prediction
*/
static
int
decode_p_mbs
(
VC9Context
*
v
)
static
int
decode_p_mbs
(
VC9Context
*
v
)
{
{
MpegEncContext
*
s
=
&
v
->
s
;
MpegEncContext
*
s
=
&
v
->
s
;
...
@@ -1730,6 +1935,10 @@ static int decode_p_mbs(VC9Context *v)
...
@@ -1730,6 +1935,10 @@ static int decode_p_mbs(VC9Context *v)
return
0
;
return
0
;
}
}
/** Decode all MBs for an P frame in Simple/Main profile
* @todo TODO: Process the blocks
* @todo TODO: Use M$ MPEG-4 cbp prediction
*/
static
int
decode_b_mbs
(
VC9Context
*
v
)
static
int
decode_b_mbs
(
VC9Context
*
v
)
{
{
MpegEncContext
*
s
=
&
v
->
s
;
MpegEncContext
*
s
=
&
v
->
s
;
...
@@ -1784,11 +1993,9 @@ static int decode_b_mbs(VC9Context *v)
...
@@ -1784,11 +1993,9 @@ static int decode_b_mbs(VC9Context *v)
}
}
else
else
{
{
/* FIXME getting tired commenting */
GET_MVDATA
(
dmv1_x
,
dmv1_y
);
GET_MVDATA
(
dmv1_x
,
dmv1_y
);
if
(
!
s
->
mb_intra
/* b_mv1 tells not intra */
)
if
(
!
s
->
mb_intra
/* b_mv1 tells not intra */
)
{
{
/* FIXME: actually read it */
b_mv_type
=
decode012
(
gb
);
b_mv_type
=
decode012
(
gb
);
if
(
v
->
bfraction
>
420
/*1/2*/
&&
if
(
v
->
bfraction
>
420
/*1/2*/
&&
b_mv_type
<
3
)
b_mv_type
=
1
-
b_mv_type
;
b_mv_type
<
3
)
b_mv_type
=
1
-
b_mv_type
;
...
@@ -1835,8 +2042,16 @@ static int decode_b_mbs(VC9Context *v)
...
@@ -1835,8 +2042,16 @@ static int decode_b_mbs(VC9Context *v)
}
}
return
0
;
return
0
;
}
}
/** @} */
//End for group std_mb
#if HAS_ADVANCED_PROFILE
#if HAS_ADVANCED_PROFILE
/***********************************************************************/
/**
* @defgroup adv_mb VC9 Macroblock-level functions in Advanced Profile
* @todo TODO: Integrate to MpegEncContext facilities
* @todo TODO: Code P, B and BI
* @{
*/
static
int
advanced_decode_i_mbs
(
VC9Context
*
v
)
static
int
advanced_decode_i_mbs
(
VC9Context
*
v
)
{
{
MpegEncContext
*
s
=
&
v
->
s
;
MpegEncContext
*
s
=
&
v
->
s
;
...
@@ -1861,8 +2076,13 @@ static int advanced_decode_i_mbs(VC9Context *v)
...
@@ -1861,8 +2076,13 @@ static int advanced_decode_i_mbs(VC9Context *v)
}
}
return
0
;
return
0
;
}
}
/** @} */
//End for group adv_mb
#endif
#endif
/** Initialize a VC9/WMV3 decoder
* @todo TODO: Handle VC-9 IDUs (Transport level?)
* @todo TODO: Decypher remaining bits in extra_data
*/
static
int
vc9_decode_init
(
AVCodecContext
*
avctx
)
static
int
vc9_decode_init
(
AVCodecContext
*
avctx
)
{
{
VC9Context
*
v
=
avctx
->
priv_data
;
VC9Context
*
v
=
avctx
->
priv_data
;
...
@@ -1935,6 +2155,10 @@ static int vc9_decode_init(AVCodecContext *avctx)
...
@@ -1935,6 +2155,10 @@ static int vc9_decode_init(AVCodecContext *avctx)
return
0
;
return
0
;
}
}
/** Decode a VC9/WMV3 frame
* @todo TODO: Handle VC-9 IDUs (Transport level?)
* @warning Initial try at using MpegEncContext stuff
*/
static
int
vc9_decode_frame
(
AVCodecContext
*
avctx
,
static
int
vc9_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
data_size
,
void
*
data
,
int
*
data_size
,
uint8_t
*
buf
,
int
buf_size
)
uint8_t
*
buf
,
int
buf_size
)
...
@@ -2153,6 +2377,9 @@ static int vc9_decode_frame(AVCodecContext *avctx,
...
@@ -2153,6 +2377,9 @@ static int vc9_decode_frame(AVCodecContext *avctx,
return
buf_size
;
//Number of bytes consumed
return
buf_size
;
//Number of bytes consumed
}
}
/** Close a VC9/WMV3 decoder
* @warning Initial try at using MpegEncContext stuff
*/
static
int
vc9_decode_end
(
AVCodecContext
*
avctx
)
static
int
vc9_decode_end
(
AVCodecContext
*
avctx
)
{
{
VC9Context
*
v
=
avctx
->
priv_data
;
VC9Context
*
v
=
avctx
->
priv_data
;
...
...
libavcodec/vc9data.h
View file @
2ce151f8
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
#define VC9DATA_H
#define VC9DATA_H
/* Set a method for reading VLC in NORM6 bitplane decoding */
/* Set a method for reading VLC in NORM6 bitplane decoding */
#define
TILE_VLC_METHO
D 1
#define
VLC_NORM6_METH0
D 1
/* bfraction is fractional, we scale to the GCD 3*5*7*8 = 840 */
/* bfraction is fractional, we scale to the GCD 3*5*7*8 = 840 */
const
int16_t
vc9_bfraction_lut
[
23
]
=
{
const
int16_t
vc9_bfraction_lut
[
23
]
=
{
...
@@ -74,7 +74,7 @@ static const uint8_t vc9_norm2_bits[4] = {
...
@@ -74,7 +74,7 @@ static const uint8_t vc9_norm2_bits[4] = {
1
,
3
,
3
,
2
1
,
3
,
3
,
2
};
};
#if
TILE_VLC_METHO
D == 1
#if
VLC_NORM6_METH0
D == 1
static
const
uint16_t
vc9_norm6_codes
[
64
]
=
{
static
const
uint16_t
vc9_norm6_codes
[
64
]
=
{
0x001
,
0x002
,
0x003
,
0x000
,
0x004
,
0x001
,
0x002
,
0x047
,
0x005
,
0x003
,
0x004
,
0x04B
,
0x005
,
0x04D
,
0x04E
,
0x30E
,
0x001
,
0x002
,
0x003
,
0x000
,
0x004
,
0x001
,
0x002
,
0x047
,
0x005
,
0x003
,
0x004
,
0x04B
,
0x005
,
0x04D
,
0x04E
,
0x30E
,
0x006
,
0x006
,
0x007
,
0x053
,
0x008
,
0x055
,
0x056
,
0x30D
,
0x009
,
0x059
,
0x05A
,
0x30C
,
0x05C
,
0x30B
,
0x30A
,
0x037
,
0x006
,
0x006
,
0x007
,
0x053
,
0x008
,
0x055
,
0x056
,
0x30D
,
0x009
,
0x059
,
0x05A
,
0x30C
,
0x05C
,
0x30B
,
0x30A
,
0x037
,
...
@@ -157,34 +157,19 @@ static const uint8_t vc9_norm6_spec[64][5] = {
...
@@ -157,34 +157,19 @@ static const uint8_t vc9_norm6_spec[64][5] = {
};
};
#endif
#endif
#if TILE_VLC_METHOD == 2 //Hyper-stupid way to handle sparse tables
//Mechanical way, handling sparse/incomplete tables
static
const
uint8_t
vc9_norm6_first
[
2
][
64
]
=
{
#if VLC_NORM6_METH0D == 2
//(2,5) is VLC+FLC, (3,5) double VLC
static
const
uint8_t
vc9_norm6_first
[
24
][
2
]
=
{
{
1
,
1
},
{
2
,
4
},
{
3
,
4
},
{
0
,
8
},
{
1
,
1
},
{
2
,
4
},
{
3
,
4
},
{
0
,
8
},
{
4
,
4
},
{
5
,
1
},
{
2
,
8
},
{
2
,
5
},
{
4
,
4
},
{
1
,
8
},
{
2
,
8
},
{
5
,
4
},
{
5
,
4
},
{
3
,
8
},
{
4
,
8
},
{
2
,
5
},
{
3
,
8
},
{
4
,
8
},
{
5
,
8
},
{
6
,
4
},
{
5
,
8
},
{
2
,
5
},
{
2
,
5
},
{
3
,
5
},
{
6
,
8
},
{
7
,
8
},
{
8
,
8
},
{
9
,
8
},
{
6
,
4
},
{
6
,
8
},
{
7
,
8
},
{
2
,
5
},
{
7
,
4
},
{
10
,
8
},
{
11
,
8
},
{
12
,
8
},
{
8
,
8
},
{
2
,
5
},
{
2
,
5
},
{
3
,
5
},
{
13
,
8
},
{
14
,
8
},
{
2
,
5
},
{
3
,
5
}
{
9
,
8
},
{
2
,
5
},
{
2
,
5
},
{
3
,
5
},
{
2
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
7
,
4
},
{
10
,
8
},
{
11
,
8
},
{
2
,
5
},
{
12
,
8
},
{
2
,
5
},
{
2
,
5
},
{
3
,
5
},
{
13
,
8
},
{
2
,
5
},
{
2
,
5
},
{
3
,
5
},
{
2
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
14
,
8
},
{
2
,
5
},
{
2
,
5
},
{
3
,
5
},
{
2
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
2
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
},
{
3
,
5
}
};
};
/* 0=>simple VLC, 1=>VLCFLC, 2=>double VLC */
static
const
uint8_t
vc9_norm6_second
[
22
][
2
]
=
{
static
const
int
vc9_norm6_mode
[
64
]
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
2
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
2
,
0
,
1
,
1
,
2
,
1
,
2
,
2
,
2
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
2
,
0
,
1
,
1
,
2
,
1
,
2
,
2
,
2
,
0
,
1
,
1
,
2
,
1
,
2
,
2
,
2
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
2
};
static
const
uint8_t
vc9_norm6_second
[
22
]
=
{
{
14
,
8
},
{
13
,
8
},
{
12
,
8
},
{
11
,
8
},
{
14
,
8
},
{
13
,
8
},
{
12
,
8
},
{
11
,
8
},
{
10
,
8
},
{
7
,
4
},
{
9
,
8
},
{
8
,
8
},
{
10
,
8
},
{
7
,
4
},
{
9
,
8
},
{
8
,
8
},
{
7
,
8
},
{
6
,
8
},
{
6
,
4
},
{
5
,
8
},
{
7
,
8
},
{
6
,
8
},
{
6
,
4
},
{
5
,
8
},
...
...
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