Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
7190bee5
Commit
7190bee5
authored
Jan 05, 2000
by
Christophe Massiot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
J'en ai chi� mais j'ai enfin pondu le AddBlock du video_decoder.
parent
c3a438c7
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
162 additions
and
83 deletions
+162
-83
include/vdec_idct.h
include/vdec_idct.h
+11
-5
include/vpar_blocks.h
include/vpar_blocks.h
+8
-4
include/vpar_headers.h
include/vpar_headers.h
+8
-4
src/video_decoder/video_decoder.c
src/video_decoder/video_decoder.c
+6
-4
src/video_parser/vpar_blocks.c
src/video_parser/vpar_blocks.c
+95
-54
src/video_parser/vpar_headers.c
src/video_parser/vpar_headers.c
+34
-12
No files found.
include/vdec_idct.h
View file @
7190bee5
...
...
@@ -13,16 +13,22 @@
/*****************************************************************************
* Common declarations
*****************************************************************************/
#define elem_t short
#ifndef VDEC_DFT
typedef
short
elem_t
;
#else
typedef
int
elem_t
;
#endif
struct
vdec_thread_s
;
/*****************************************************************************
* Function pointers
*****************************************************************************/
typedef
void
(
*
f_idct_t
)(
elem_t
*
,
int
);
typedef
void
(
*
f_idct_t
)(
struct
vdec_thread_s
*
,
elem_t
*
,
int
);
/*****************************************************************************
* Prototypes
*****************************************************************************/
void
vdec_DummyIDCT
(
elem_t
*
,
int
);
void
vdec_SparseIDCT
(
elem_t
*
,
int
);
void
vdec_IDCT
(
elem_t
*
,
int
);
void
vdec_DummyIDCT
(
struct
vdec_thread_s
*
,
elem_t
*
,
int
);
void
vdec_SparseIDCT
(
struct
vdec_thread_s
*
,
elem_t
*
,
int
);
void
vdec_IDCT
(
struct
vdec_thread_s
*
,
elem_t
*
,
int
);
include/vpar_blocks.h
View file @
7190bee5
...
...
@@ -21,11 +21,13 @@
typedef
struct
macroblock_s
{
picture_t
*
p_picture
;
int
i_mb_x
,
i_mb_y
;
int
i_structure
;
int
i_l_x
,
i_l_y
;
/* position of macroblock (lum) */
int
i_c_x
,
i_c_y
;
/* position of macroblock (chroma) */
int
i_chroma_nb_blocks
;
/* nb of bks for a chr comp */
int
i_l_stride
;
/* number of data_t to ignore
* when changing lines */
int
i_c_stride
;
/* idem, for chroma */
/* IDCT information */
elem_t
ppi_blocks
[
12
][
64
];
/* blocks */
...
...
@@ -47,9 +49,9 @@ typedef struct macroblock_s
int
pi_motion_vectors_forw_bot
[
2
];
/* AddBlock information */
f_addb_t
pf_addb
[
12
];
data_t
*
p_data
[
12
];
/* positions of blocks in picture */
int
i_lum_incr
,
i_chroma_incr
;
f_addb_t
pf_addb
[
12
];
/* pointer to the Add function */
data_t
*
p_data
[
12
];
/* pointer to the position
* in the final picture */
}
macroblock_t
;
/*****************************************************************************
...
...
@@ -60,6 +62,8 @@ typedef struct
int
i_mb_type
,
i_motion_type
,
i_mv_count
,
i_mv_format
;
int
i_coded_block_pattern
;
boolean_t
b_dct_type
;
int
i_l_x
,
i_l_y
,
i_c_x
,
i_c_y
;
}
macroblock_parsing_t
;
/*****************************************************************************
...
...
include/vpar_headers.h
View file @
7190bee5
...
...
@@ -42,12 +42,10 @@ extern int * pi_default_nonintra_quant;
*****************************************************************************/
typedef
struct
sequence_s
{
u32
i_height
,
i_width
,
i_
chroma_width
,
i_
size
;
u32
i_height
,
i_width
,
i_size
;
u32
i_mb_height
,
i_mb_width
,
i_mb_size
;
unsigned
int
i_aspect_ratio
;
double
d_frame_rate
;
unsigned
int
i_chroma_format
;
int
i_chroma_nb_blocks
;
boolean_t
b_mpeg2
;
boolean_t
b_progressive
;
unsigned
int
i_scalable_mode
;
...
...
@@ -57,6 +55,12 @@ typedef struct sequence_s
void
(
*
pf_decode_mv
)(
struct
vpar_thread_s
*
,
int
);
f_chroma_pattern_t
pf_decode_pattern
;
/* Chromatic information */
unsigned
int
i_chroma_format
;
int
i_chroma_nb_blocks
;
u32
i_chroma_width
;
u32
i_chroma_mb_width
,
i_chroma_mb_height
;
/* Parser context */
picture_t
*
p_forward
;
picture_t
*
p_backward
;
...
...
@@ -85,7 +89,7 @@ typedef struct picture_parsing_s
boolean_t
b_alternate_scan
,
b_progressive_frame
;
boolean_t
b_top_field_first
,
b_concealment_mv
;
boolean_t
b_repeat_first_field
;
int
i_l
um_incr
,
i_chroma_incr
;
int
i_l
_stride
,
i_c_stride
;
/* Used for second field management */
int
i_current_structure
;
...
...
src/video_decoder/video_decoder.c
View file @
7190bee5
...
...
@@ -242,13 +242,14 @@ static void DecodeMacroblock( vdec_thread_t *p_vdec, macroblock_t * p_mb )
/*
* Inverse DCT (ISO/IEC 13818-2 section Annex A)
*/
(
p_mb
->
pf_idct
[
i_b
])(
p_mb
->
ppi_blocks
[
i_b
],
p_mb
->
pi_sparse_pos
[
i_b
]
);
(
p_mb
->
pf_idct
[
i_b
])(
p_vdec
,
p_mb
->
ppi_blocks
[
i_b
],
p_mb
->
pi_sparse_pos
[
i_b
]
);
/*
* Adding prediction and coefficient data (ISO/IEC 13818-2 section 7.6.8)
*/
(
p_mb
->
pf_addb
[
i_b
])(
p_mb
->
ppi_blocks
[
i_b
],
p_mb
->
p_data
[
i_b
],
p_mb
->
i_l
um_incr
);
p_mb
->
p_data
[
i_b
],
p_mb
->
i_l
_stride
);
}
/* chrominance */
...
...
@@ -257,13 +258,14 @@ static void DecodeMacroblock( vdec_thread_t *p_vdec, macroblock_t * p_mb )
/*
* Inverse DCT (ISO/IEC 13818-2 section Annex A)
*/
(
p_mb
->
pf_idct
[
i_b
])(
p_mb
->
ppi_blocks
[
i_b
],
p_mb
->
pi_sparse_pos
[
i_b
]
);
(
p_mb
->
pf_idct
[
i_b
])(
p_vdec
,
p_mb
->
ppi_blocks
[
i_b
],
p_mb
->
pi_sparse_pos
[
i_b
]
);
/*
* Adding prediction and coefficient data (ISO/IEC 13818-2 section 7.6.8)
*/
(
p_mb
->
pf_addb
[
i_b
])(
p_mb
->
ppi_blocks
[
i_b
],
p_mb
->
p_data
[
i_b
],
p_mb
->
i_c
hroma_incr
);
p_mb
->
p_data
[
i_b
],
p_mb
->
i_c
_stride
);
}
/*
...
...
src/video_parser/vpar_blocks.c
View file @
7190bee5
...
...
@@ -43,7 +43,7 @@
* Local prototypes
*/
static
__inline__
void
InitMacroblock
(
vpar_thread_t
*
p_vpar
,
macroblock_t
*
p_mb
,
int
i_mb_address
);
macroblock_t
*
p_mb
);
static
__inline__
int
MacroblockAddressIncrement
(
vpar_thread_t
*
p_vpar
);
static
__inline__
void
MacroblockModes
(
vpar_thread_t
*
p_vpar
,
macroblock_t
*
p_mb
);
...
...
@@ -61,10 +61,20 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
int
i_mb_previous
,
int
i_mb_base
)
{
static
f_addb_t
ppf_addb_intra
[
2
]
=
{
vdec_AddBlock
,
vdec_CopyBlock
};
static
f_decode_block_t
pppf_decode_block
[
2
][
2
]
=
{
{
vpar_DecodeMPEG1Non
,
vpar_DecodeMPEG1Intra
},
{
vpar_DecodeMPEG2Non
,
vpar_DecodeMPEG2Intra
}
};
static
int
pi_x
[
12
]
=
{
0
,
8
,
0
,
8
,
0
,
0
,
0
,
0
,
8
,
8
,
8
,
8
};
static
int
pi_y
[
2
][
12
]
=
{
{
0
,
0
,
8
,
8
,
0
,
0
,
8
,
8
,
0
,
0
,
8
,
8
},
{
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
}
};
static
int
pi_chroma_hor
[
4
]
=
{
0
,
1
,
1
,
0
};
static
int
pi_chroma_ver
[
4
]
=
{
0
,
1
,
0
,
0
};
int
i_mb
,
i_b
,
i_mask
,
i_x
,
i_y
,
pi_pos
[
3
],
pi_width
[
3
]
;
int
i_mb
,
i_b
,
i_mask
;
macroblock_t
*
p_mb
;
f_addb_t
pf_addb
;
elem_t
*
p_data1
;
elem_t
*
p_data2
;
*
pi_mb_address
+=
MacroblockAddressIncrement
(
p_vpar
);
...
...
@@ -94,7 +104,7 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
return
;
}
InitMacroblock
(
p_vpar
,
p_mb
,
i_mb
);
InitMacroblock
(
p_vpar
,
p_mb
);
/* No IDCT nor AddBlock. */
for
(
i_b
=
0
;
i_b
<
12
;
i_b
++
)
...
...
@@ -119,7 +129,7 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
return
;
}
InitMacroblock
(
p_vpar
,
p_mb
,
*
pi_mb_address
);
InitMacroblock
(
p_vpar
,
p_mb
);
/* Parse off macroblock_modes structure. */
MacroblockModes
(
p_vpar
,
p_mb
);
...
...
@@ -158,44 +168,59 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
pf_addb
=
ppf_addb_intra
[
p_vpar
->
mb
.
i_mb_type
&
MB_INTRA
];
/* C'est de la merde, il faut recommencer */
i_x
=
p_mb
->
i_mb_x
<<
4
;
i_y
=
p_mb
->
i_mb_y
<<
4
;
pi_pos
[
0
]
=
i_y
*
(
p_vpar
->
sequence
.
i_width
<<
(
!
p_vpar
->
picture
.
b_frame_structure
))
+
(
p_mb
->
i_structure
==
BOTTOM_FIELD
)
*
p_vpar
->
sequence
.
i_width
+
i_x
;
pi_pos
[
1
]
=
pi_pos
[
2
]
=
i_y
*
(
p_vpar
->
sequence
.
i_chroma_width
<<
(
!
p_vpar
->
picture
.
b_frame_structure
))
+
(
p_mb
->
i_structure
==
BOTTOM_FIELD
)
*
p_vpar
->
sequence
.
i_chroma_width
+
(
i_x
>>
(
3
-
p_vpar
->
sequence
.
i_chroma_format
));
pi_width
[
0
]
=
p_vpar
->
sequence
.
i_width
<<
(
!
p_vpar
->
picture
.
b_frame_structure
||
p_vpar
->
mb
.
b_dct_type
);
pi_width
[
1
]
=
pi_width
[
2
]
=
p_vpar
->
sequence
.
i_chroma_width
<<
(
!
p_vpar
->
picture
.
b_frame_structure
||
p_vpar
->
mb
.
b_dct_type
);
/* Effectively decode blocks. */
for
(
i_b
=
0
,
i_mask
=
1
<<
(
3
+
2
*
p_vpar
->
sequence
.
i_chroma_nb_blocks
);
i_b
<
4
+
2
*
p_vpar
->
sequence
.
i_chroma_nb_blocks
;
i_b
++
,
i_mask
>>=
1
)
/*
* Effectively decode blocks.
*/
i_mask
=
1
<<
(
3
+
2
*
p_vpar
->
sequence
.
i_chroma_nb_blocks
);
/* luminance */
p_data1
=
p_mb
->
p_picture
->
p_y
+
p_mb
->
i_l_x
+
p_mb
->
i_l_y
*
(
p_vpar
->
sequence
.
i_width
);
for
(
i_b
=
0
;
i_b
<
4
;
i_b
++
,
i_mask
>>=
1
)
{
if
(
p_vpar
->
mb
.
i_coded_block_pattern
&
i_mask
)
{
static
f_decode_block_t
pppf_decode_block
[
2
][
2
]
=
{
{
vpar_DecodeMPEG1Non
,
vpar_DecodeMPEG1Intra
},
{
vpar_DecodeMPEG2Non
,
vpar_DecodeMPEG2Intra
}
};
static
int
pi_x
[
12
]
=
{
0
,
8
,
0
,
8
,
0
,
0
,
0
,
0
,
8
,
8
,
8
,
8
};
static
int
pi_y
[
12
]
=
{
0
,
0
,
8
,
8
,
0
,
0
,
8
,
8
,
0
,
0
,
8
,
8
};
data_t
pi_data
[
12
]
=
{
p_mb
->
p_picture
->
p_y
,
p_mb
->
p_picture
->
p_y
,
p_mb
->
p_picture
->
p_y
,
p_mb
->
p_picture
->
p_y
,
p_mb
->
p_picture
->
p_u
,
p_mb
->
p_picture
->
p_v
,
p_mb
->
p_picture
->
p_u
,
p_mb
->
p_picture
->
p_v
,
p_mb
->
p_picture
->
p_u
,
p_mb
->
p_picture
->
p_v
,
p_mb
->
p_picture
->
p_u
,
p_mb
->
p_picture
->
p_v
};
bzero
(
p_mb
->
ppi_blocks
[
i_b
],
64
*
sizeof
(
elem_t
)
);
memset
(
p_mb
->
ppi_blocks
[
i_b
],
0
,
64
*
sizeof
(
elem_t
)
);
(
*
pppf_decode_block
[
p_vpar
->
sequence
.
b_mpeg2
]
[
p_vpar
->
mb
.
i_mb_type
&
MB_INTRA
])
(
p_vpar
,
p_mb
,
i_b
);
/* decode_block has already set pf_idct and pi_sparse_pos. */
p_mb
->
pf_addb
[
i_b
]
=
pf_addb
;
/* Calculate block coordinates. */
p_mb
->
p_data
[
i_b
]
=
p_data1
+
pi_y
[
p_vpar
->
mb
.
b_dct_type
][
i_b
]
*
p_vpar
->
sequence
.
i_chroma_width
;
}
else
{
/* Block not coded, so no IDCT, nor AddBlock */
p_mb
->
pf_addb
[
i_b
]
=
vdec_DummyBlock
;
p_mb
->
pf_idct
[
i_b
]
=
vdec_DummyIDCT
;
}
}
/* chrominance U */
p_data1
=
p_mb
->
p_picture
->
p_u
+
p_mb
->
i_c_x
>>
pi_chroma_hor
[
p_vpar
->
sequence
.
i_chroma_format
]
+
(
p_mb
->
i_c_y
>>
pi_chroma_ver
[
p_vpar
->
sequence
.
i_chroma_format
])
*
(
p_vpar
->
sequence
.
i_chroma_width
);
p_data2
=
p_mb
->
p_picture
->
p_v
+
p_mb
->
i_c_x
>>
pi_chroma_hor
[
p_vpar
->
sequence
.
i_chroma_format
]
+
(
p_mb
->
i_c_y
>>
pi_chroma_ver
[
p_vpar
->
sequence
.
i_chroma_format
])
*
(
p_vpar
->
sequence
.
i_chroma_width
);
for
(
i_b
=
4
;
i_b
<
4
+
2
*
p_vpar
->
sequence
.
i_chroma_nb_blocks
;
i_b
++
,
i_mask
>>=
1
)
{
elem_t
*
pp_data
[
2
]
=
{
p_data1
,
p_data2
};
if
(
p_vpar
->
mb
.
i_coded_block_pattern
&
i_mask
)
{
memset
(
p_mb
->
ppi_blocks
[
i_b
],
0
,
64
*
sizeof
(
elem_t
)
);
(
*
pppf_decode_block
[
p_vpar
->
sequence
.
b_mpeg2
]
[
p_vpar
->
mb
.
i_mb_type
&
MB_INTRA
])
(
p_vpar
,
p_mb
,
i_b
);
...
...
@@ -204,10 +229,9 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
p_mb
->
pf_addb
[
i_b
]
=
pf_addb
;
/* Calculate block coordinates. */
p_mb
->
p_data
[
i_b
]
=
pi_data
[
i_b
]
+
pi_pos
[
i_b
>>
2
]
+
pi_y
[
i_b
]
*
pi_width
[
i_b
>>
2
]
+
(
p_vpar
->
mb
.
b_dct_type
&
((
i_b
&
2
)
>>
1
));
/* INACHEV parce que trop pourri ! */
p_mb
->
p_data
[
i_b
]
=
pp_data
[
i_b
&
1
]
+
pi_y
[
p_vpar
->
mb
.
b_dct_type
][
i_b
]
*
p_vpar
->
sequence
.
i_chroma_width
;
}
else
{
...
...
@@ -248,16 +272,30 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
* InitMacroblock : Initialize macroblock values
*****************************************************************************/
static
__inline__
void
InitMacroblock
(
vpar_thread_t
*
p_vpar
,
macroblock_t
*
p_mb
,
int
i_mb_address
)
macroblock_t
*
p_mb
)
{
p_mb
->
p_picture
=
p_vpar
->
picture
.
p_picture
;
p_mb
->
i_structure
=
p_vpar
->
picture
.
i_structure
;
p_mb
->
i_mb_x
=
i_mb_address
%
p_vpar
->
sequence
.
i_mb_width
;
p_mb
->
i_mb_y
=
i_mb_address
/
p_vpar
->
sequence
.
i_mb_width
;
p_mb
->
i_l_x
=
p_vpar
->
mb
.
i_l_x
;
p_mb
->
i_l_y
=
p_vpar
->
mb
.
i_l_y
;
p_mb
->
i_c_x
=
p_vpar
->
mb
.
i_c_x
;
p_mb
->
i_c_y
=
p_vpar
->
mb
.
i_c_y
;
p_mb
->
i_chroma_nb_blocks
=
p_vpar
->
sequence
.
i_chroma_nb_blocks
;
p_mb
->
i_lum_incr
=
p_vpar
->
picture
.
i_lum_incr
;
p_mb
->
i_chroma_incr
=
p_vpar
->
picture
.
i_chroma_incr
;
p_mb
->
i_l_stride
=
p_vpar
->
picture
.
i_l_stride
;
p_mb
->
i_c_stride
=
p_vpar
->
picture
.
i_c_stride
;
/* Update macroblock real position. */
p_vpar
->
mb
.
i_l_x
+=
16
;
p_vpar
->
mb
.
i_l_y
+=
(
p_vpar
->
mb
.
i_l_x
/
p_vpar
->
sequence
.
i_width
)
*
(
2
-
p_vpar
->
picture
.
b_frame_structure
)
*
16
;
p_vpar
->
mb
.
i_l_x
%=
p_vpar
->
sequence
.
i_width
;
p_vpar
->
mb
.
i_c_x
+=
p_vpar
->
sequence
.
i_chroma_mb_width
;
p_vpar
->
mb
.
i_c_y
+=
(
p_vpar
->
mb
.
i_c_x
/
p_vpar
->
sequence
.
i_chroma_width
)
*
(
2
-
p_vpar
->
picture
.
b_frame_structure
)
*
p_vpar
->
sequence
.
i_chroma_mb_height
;
p_vpar
->
mb
.
i_c_x
%=
p_vpar
->
sequence
.
i_chroma_width
;
}
/*****************************************************************************
...
...
@@ -288,7 +326,7 @@ static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
* has to be dropped, take care if you use scalable streams. */
/* DumpBits( &p_vpar->bit_stream, 2 ); */
if
(
!
(
p_vpar
->
mb
.
i_mb_type
&
(
MB_MOTION_FORWARD
|
|
MB_MOTION_BACKWARD
))
if
(
!
(
p_vpar
->
mb
.
i_mb_type
&
(
MB_MOTION_FORWARD
|
MB_MOTION_BACKWARD
))
||
p_vpar
->
picture
.
b_frame_pred_frame_dct
)
{
/* If mb_type has neither MOTION_FORWARD nor MOTION_BACKWARD, this
...
...
@@ -307,15 +345,18 @@ static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
p_vpar
->
mb
.
i_mv_format
=
ppi_mv_format
[
p_vpar
->
picture
.
b_frame_structure
]
[
p_vpar
->
mb
.
i_motion_type
];
p_vpar
->
mb
.
b_dct_type
=
0
;
if
(
(
p_vpar
->
picture
.
i_structure
==
FRAME_STRUCTURE
)
&&
(
!
p_vpar
->
picture
.
b_frame_pred_frame_dct
)
&&
(
p_vpar
->
mb
.
i_mb_type
&
(
MB_PATTERN
|
MB_INTRA
))
)
{
p_vpar
->
mb
.
b_dct_type
=
GetBits
(
&
p_vpar
->
bit_stream
,
1
);
}
else
if
(
p_vpar
->
mb
.
b_dct_type
=
GetBits
(
&
p_vpar
->
bit_stream
,
1
)
)
{
p_vpar
->
mb
.
b_dct_type
=
0
;
p_mb
->
i_l_stride
<<=
1
;
p_mb
->
i_l_stride
+=
8
;
p_mb
->
i_c_stride
<<=
1
;
p_mb
->
i_c_stride
+=
8
;
}
}
}
...
...
src/video_parser/vpar_headers.c
View file @
7190bee5
...
...
@@ -219,7 +219,6 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
if
(
ShowBits
(
&
p_vpar
->
bit_stream
,
32
)
==
EXTENSION_START_CODE
)
{
int
i_dummy
;
static
int
pi_chroma_nb_blocks
[
4
]
=
{
0
,
1
,
2
,
4
};
static
f_chroma_pattern_t
ppf_chroma_pattern
[
4
]
=
{
NULL
,
vpar_CodedPattern420
,
vpar_CodedPattern422
,
vpar_CodedPattern444
};
...
...
@@ -230,10 +229,6 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
DumpBits
(
&
p_vpar
->
bit_stream
,
12
);
p_vpar
->
sequence
.
b_progressive
=
GetBits
(
&
p_vpar
->
bit_stream
,
1
);
p_vpar
->
sequence
.
i_chroma_format
=
GetBits
(
&
p_vpar
->
bit_stream
,
2
);
p_vpar
->
sequence
.
i_chroma_width
=
p_vpar
->
sequence
.
i_width
>>
(
3
-
p_vpar
->
sequence
.
i_chroma_format
);
p_vpar
->
sequence
.
i_chroma_nb_blocks
=
pi_chroma_nb_blocks
[
p_vpar
->
sequence
.
i_chroma_format
];
p_vpar
->
sequence
.
pf_decode_pattern
=
ppf_chroma_pattern
[
p_vpar
->
sequence
.
i_chroma_format
];
p_vpar
->
sequence
.
i_width
|=
GetBits
(
&
p_vpar
->
bit_stream
,
2
)
<<
12
;
...
...
@@ -253,13 +248,12 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
/* It's an MPEG-1 stream. Put adequate parameters. */
p_vpar
->
sequence
.
b_progressive
=
1
;
p_vpar
->
sequence
.
i_chroma_format
=
CHROMA_420
;
p_vpar
->
sequence
.
i_chroma_width
=
p_vpar
->
sequence
.
i_width
>>
2
;
p_vpar
->
sequence
.
i_chroma_nb_blocks
=
2
;
p_vpar
->
sequence
.
pf_decode_pattern
=
vpar_CodedPattern420
;
p_vpar
->
sequence
.
pf_decode_mv
=
vpar_MPEG1MotionVector
;
}
/* Update sizes */
p_vpar
->
sequence
.
i_mb_width
=
(
p_vpar
->
sequence
.
i_width
+
15
)
/
16
;
p_vpar
->
sequence
.
i_mb_height
=
(
p_vpar
->
sequence
.
b_progressive
)
?
(
p_vpar
->
sequence
.
i_height
+
15
)
/
16
:
...
...
@@ -271,6 +265,30 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
p_vpar
->
sequence
.
i_size
=
p_vpar
->
sequence
.
i_width
*
p_vpar
->
sequence
.
i_height
;
/* Update chromatic information */
switch
(
p_vpar
->
sequence
.
i_chroma_format
)
{
case
CHROMA_420
:
p_vpar
->
sequence
.
i_chroma_nb_blocks
=
2
;
p_vpar
->
sequence
.
i_chroma_width
=
p_vpar
->
sequence
.
i_width
>>
2
;
p_vpar
->
i_chroma_mb_width
=
8
;
p_vpar
->
i_chroma_mb_height
=
8
;
break
;
case
CHROMA_422
:
p_vpar
->
sequence
.
i_chroma_nb_blocks
=
4
;
p_vpar
->
sequence
.
i_chroma_width
=
p_vpar
->
sequence
.
i_width
>>
1
;
p_vpar
->
i_chroma_mb_width
=
8
;
p_vpar
->
i_chroma_mb_height
=
16
;
break
;
case
CHROMA_444
:
p_vpar
->
sequence
.
i_chroma_nb_blocks
=
8
;
p_vpar
->
sequence
.
i_chroma_width
=
p_vpar
->
sequence
.
i_width
;
p_vpar
->
i_chroma_mb_width
=
16
;
p_vpar
->
i_chroma_mb_height
=
16
;
}
/* Slice Header functions */
if
(
p_vpar
->
sequence
.
i_height
<=
2800
)
{
...
...
@@ -481,10 +499,10 @@ static void PictureHeader( vpar_thread_t * p_vpar )
P_picture
->
date
=
vpar_SynchroDecode
(
p_vpar
,
p_vpar
->
picture
.
i_coding_type
,
i_structure
);
p_vpar
->
picture
.
i_l
um_incr
=
-
8
+
(
p_vpar
->
sequence
.
i_width
<<
(
i_structure
!=
FRAME_STRUCTURE
)
);
p_vpar
->
picture
.
i_c
hroma_incr
=
-
8
+
(
p_vpar
->
sequence
.
i_width
<<
((
i_structure
!=
FRAME_STRUCTURE
)
+
p_vpar
->
picture
.
i_l
_stride
=
-
8
+
(
p_vpar
->
sequence
.
i_width
<<
(
1
-
p_vpar
->
picture
.
b_frame_structure
)
);
p_vpar
->
picture
.
i_c
_stride
=
-
8
+
(
p_vpar
->
sequence
.
i_width
<<
((
1
-
p_vpar
->
picture
.
b_frame_structure
)
+
(
3
-
p_vpar
->
sequence
.
i_chroma_format
))
);
/* Update the reference pointers. */
...
...
@@ -498,12 +516,16 @@ static void PictureHeader( vpar_thread_t * p_vpar )
if
(
i_structure
==
BOTTOM_FIELD
)
{
i_mb_base
=
p_vpar
->
sequence
.
i_mb_size
>>
1
;
p_vpar
->
mb
.
i_l_y
=
16
;
p_vpar
->
mb
.
i_c_y
=
p_vpar
->
sequence
.
i_chroma_mb_height
;
}
else
{
i_mb_base
=
0
;
p_vpar
->
mb
.
i_l_y
=
p_vpar
->
mb
.
i_c_y
=
0
;
}
i_mb_address
=
0
;
p_vpar
->
mb
.
i_l_x
=
p_vpar
->
mb
.
i_c_x
=
0
;
/* Extension and User data. */
ExtensionAndUserData
(
p_vpar
);
...
...
@@ -924,7 +946,7 @@ static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_ma
=
GetBits
(
&
p_vpar
->
bit_stream
,
8
);
}
#ifdef
FOURIER_IDC
T
#ifdef
VDEC_DF
T
/* Discrete Fourier Transform requires the quantization matrices to
* be normalized before using them. */
vdec_NormQuantMatrix
(
p_matrix
->
pi_matrix
);
...
...
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