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
eda7571e
Commit
eda7571e
authored
Sep 02, 2014
by
Gabriel Dume
Committed by
Diego Biurrun
Sep 02, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wmv2: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
7a1d6ddd
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
382 additions
and
362 deletions
+382
-362
wmv2.c
libavcodec/wmv2.c
+68
-63
wmv2.h
libavcodec/wmv2.h
+4
-4
wmv2dec.c
libavcodec/wmv2dec.c
+235
-224
wmv2enc.c
libavcodec/wmv2enc.c
+75
-71
No files found.
libavcodec/wmv2.c
View file @
eda7571e
...
@@ -26,8 +26,9 @@
...
@@ -26,8 +26,9 @@
#include "wmv2.h"
#include "wmv2.h"
av_cold
void
ff_wmv2_common_init
(
Wmv2Context
*
w
){
av_cold
void
ff_wmv2_common_init
(
Wmv2Context
*
w
)
MpegEncContext
*
const
s
=
&
w
->
s
;
{
MpegEncContext
*
const
s
=
&
w
->
s
;
ff_blockdsp_init
(
&
s
->
bdsp
,
s
->
avctx
);
ff_blockdsp_init
(
&
s
->
bdsp
,
s
->
avctx
);
ff_wmv2dsp_init
(
&
w
->
wdsp
);
ff_wmv2dsp_init
(
&
w
->
wdsp
);
...
@@ -51,84 +52,87 @@ av_cold void ff_wmv2_common_init(Wmv2Context * w){
...
@@ -51,84 +52,87 @@ av_cold void ff_wmv2_common_init(Wmv2Context * w){
s
->
idsp
.
idct
=
NULL
;
s
->
idsp
.
idct
=
NULL
;
}
}
static
void
wmv2_add_block
(
Wmv2Context
*
w
,
int16_t
*
block1
,
uint8_t
*
dst
,
int
stride
,
int
n
){
static
void
wmv2_add_block
(
Wmv2Context
*
w
,
int16_t
*
block1
,
MpegEncContext
*
const
s
=
&
w
->
s
;
uint8_t
*
dst
,
int
stride
,
int
n
)
{
if
(
s
->
block_last_index
[
n
]
>=
0
)
{
MpegEncContext
*
const
s
=
&
w
->
s
;
switch
(
w
->
abt_type_table
[
n
]){
case
0
:
if
(
s
->
block_last_index
[
n
]
>=
0
)
{
w
->
wdsp
.
idct_add
(
dst
,
stride
,
block1
);
switch
(
w
->
abt_type_table
[
n
])
{
break
;
case
0
:
case
1
:
w
->
wdsp
.
idct_add
(
dst
,
stride
,
block1
);
ff_simple_idct84_add
(
dst
,
stride
,
block1
);
break
;
ff_simple_idct84_add
(
dst
+
4
*
stride
,
stride
,
w
->
abt_block2
[
n
]);
case
1
:
s
->
bdsp
.
clear_block
(
w
->
abt_block2
[
n
]);
ff_simple_idct84_add
(
dst
,
stride
,
block1
);
break
;
ff_simple_idct84_add
(
dst
+
4
*
stride
,
stride
,
w
->
abt_block2
[
n
]);
case
2
:
s
->
bdsp
.
clear_block
(
w
->
abt_block2
[
n
]);
ff_simple_idct48_add
(
dst
,
stride
,
block1
);
break
;
ff_simple_idct48_add
(
dst
+
4
,
stride
,
w
->
abt_block2
[
n
]);
case
2
:
s
->
bdsp
.
clear_block
(
w
->
abt_block2
[
n
]);
ff_simple_idct48_add
(
dst
,
stride
,
block1
);
break
;
ff_simple_idct48_add
(
dst
+
4
,
stride
,
w
->
abt_block2
[
n
]);
default
:
s
->
bdsp
.
clear_block
(
w
->
abt_block2
[
n
]);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"internal error in WMV2 abt
\n
"
);
break
;
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"internal error in WMV2 abt
\n
"
);
}
}
}
}
}
}
void
ff_wmv2_add_mb
(
MpegEncContext
*
s
,
int16_t
block1
[
6
][
64
],
uint8_t
*
dest_y
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
){
void
ff_wmv2_add_mb
(
MpegEncContext
*
s
,
int16_t
block1
[
6
][
64
],
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
uint8_t
*
dest_y
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
)
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
wmv2_add_block
(
w
,
block1
[
0
],
dest_y
,
s
->
linesize
,
0
);
wmv2_add_block
(
w
,
block1
[
0
],
dest_y
,
s
->
linesize
,
0
);
wmv2_add_block
(
w
,
block1
[
1
],
dest_y
+
8
,
s
->
linesize
,
1
);
wmv2_add_block
(
w
,
block1
[
1
],
dest_y
+
8
,
s
->
linesize
,
1
);
wmv2_add_block
(
w
,
block1
[
2
],
dest_y
+
8
*
s
->
linesize
,
s
->
linesize
,
2
);
wmv2_add_block
(
w
,
block1
[
2
],
dest_y
+
8
*
s
->
linesize
,
s
->
linesize
,
2
);
wmv2_add_block
(
w
,
block1
[
3
],
dest_y
+
8
+
8
*
s
->
linesize
,
s
->
linesize
,
3
);
wmv2_add_block
(
w
,
block1
[
3
],
dest_y
+
8
+
8
*
s
->
linesize
,
s
->
linesize
,
3
);
if
(
s
->
flags
&
CODEC_FLAG_GRAY
)
return
;
if
(
s
->
flags
&
CODEC_FLAG_GRAY
)
return
;
wmv2_add_block
(
w
,
block1
[
4
],
dest_cb
,
s
->
uvlinesize
,
4
);
wmv2_add_block
(
w
,
block1
[
4
],
dest_cb
,
s
->
uvlinesize
,
4
);
wmv2_add_block
(
w
,
block1
[
5
],
dest_cr
,
s
->
uvlinesize
,
5
);
wmv2_add_block
(
w
,
block1
[
5
],
dest_cr
,
s
->
uvlinesize
,
5
);
}
}
void
ff_mspel_motion
(
MpegEncContext
*
s
,
void
ff_mspel_motion
(
MpegEncContext
*
s
,
uint8_t
*
dest_y
,
uint8_t
*
dest_y
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
,
uint8_t
**
ref_picture
,
op_pixels_func
(
*
pix_op
)[
4
],
uint8_t
**
ref_picture
,
op_pixels_func
(
*
pix_op
)[
4
],
int
motion_x
,
int
motion_y
,
int
h
)
int
motion_x
,
int
motion_y
,
int
h
)
{
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
uint8_t
*
ptr
;
uint8_t
*
ptr
;
int
dxy
,
offset
,
mx
,
my
,
src_x
,
src_y
,
v_edge_pos
;
int
dxy
,
offset
,
mx
,
my
,
src_x
,
src_y
,
v_edge_pos
;
ptrdiff_t
linesize
,
uvlinesize
;
ptrdiff_t
linesize
,
uvlinesize
;
int
emu
=
0
;
int
emu
=
0
;
dxy
=
((
motion_y
&
1
)
<<
1
)
|
(
motion_x
&
1
);
dxy
=
((
motion_y
&
1
)
<<
1
)
|
(
motion_x
&
1
);
dxy
=
2
*
dxy
+
w
->
hshift
;
dxy
=
2
*
dxy
+
w
->
hshift
;
src_x
=
s
->
mb_x
*
16
+
(
motion_x
>>
1
);
src_x
=
s
->
mb_x
*
16
+
(
motion_x
>>
1
);
src_y
=
s
->
mb_y
*
16
+
(
motion_y
>>
1
);
src_y
=
s
->
mb_y
*
16
+
(
motion_y
>>
1
);
/* WARNING: do no forget half pels */
/* WARNING: do no forget half pels */
v_edge_pos
=
s
->
v_edge_pos
;
v_edge_pos
=
s
->
v_edge_pos
;
src_x
=
av_clip
(
src_x
,
-
16
,
s
->
width
);
src_x
=
av_clip
(
src_x
,
-
16
,
s
->
width
);
src_y
=
av_clip
(
src_y
,
-
16
,
s
->
height
);
src_y
=
av_clip
(
src_y
,
-
16
,
s
->
height
);
if
(
src_x
<=
-
16
||
src_x
>=
s
->
width
)
if
(
src_x
<=
-
16
||
src_x
>=
s
->
width
)
dxy
&=
~
3
;
dxy
&=
~
3
;
if
(
src_y
<=
-
16
||
src_y
>=
s
->
height
)
if
(
src_y
<=
-
16
||
src_y
>=
s
->
height
)
dxy
&=
~
4
;
dxy
&=
~
4
;
linesize
=
s
->
linesize
;
linesize
=
s
->
linesize
;
uvlinesize
=
s
->
uvlinesize
;
uvlinesize
=
s
->
uvlinesize
;
ptr
=
ref_picture
[
0
]
+
(
src_y
*
linesize
)
+
src_x
;
ptr
=
ref_picture
[
0
]
+
(
src_y
*
linesize
)
+
src_x
;
if
(
src_x
<
1
||
src_y
<
1
||
src_x
+
17
>=
s
->
h_edge_pos
if
(
src_x
<
1
||
src_y
<
1
||
src_x
+
17
>=
s
->
h_edge_pos
||
||
src_y
+
h
+
1
>=
v_edge_pos
){
src_y
+
h
+
1
>=
v_edge_pos
)
{
s
->
vdsp
.
emulated_edge_mc
(
s
->
edge_emu_buffer
,
s
->
vdsp
.
emulated_edge_mc
(
s
->
edge_emu_buffer
,
ptr
-
1
-
s
->
linesize
,
ptr
-
1
-
s
->
linesize
,
s
->
linesize
,
s
->
linesize
,
19
,
19
,
s
->
linesize
,
s
->
linesize
,
19
,
19
,
src_x
-
1
,
src_y
-
1
,
src_x
-
1
,
src_y
-
1
,
s
->
h_edge_pos
,
s
->
v_edge_pos
);
s
->
h_edge_pos
,
s
->
v_edge_pos
);
ptr
=
s
->
edge_emu_buffer
+
1
+
s
->
linesize
;
ptr
=
s
->
edge_emu_buffer
+
1
+
s
->
linesize
;
emu
=
1
;
emu
=
1
;
}
}
w
->
wdsp
.
put_mspel_pixels_tab
[
dxy
](
dest_y
,
ptr
,
linesize
);
w
->
wdsp
.
put_mspel_pixels_tab
[
dxy
](
dest_y
,
ptr
,
linesize
);
...
@@ -136,7 +140,8 @@ void ff_mspel_motion(MpegEncContext *s,
...
@@ -136,7 +140,8 @@ void ff_mspel_motion(MpegEncContext *s,
w
->
wdsp
.
put_mspel_pixels_tab
[
dxy
](
dest_y
+
8
*
linesize
,
ptr
+
8
*
linesize
,
linesize
);
w
->
wdsp
.
put_mspel_pixels_tab
[
dxy
](
dest_y
+
8
*
linesize
,
ptr
+
8
*
linesize
,
linesize
);
w
->
wdsp
.
put_mspel_pixels_tab
[
dxy
](
dest_y
+
8
+
8
*
linesize
,
ptr
+
8
+
8
*
linesize
,
linesize
);
w
->
wdsp
.
put_mspel_pixels_tab
[
dxy
](
dest_y
+
8
+
8
*
linesize
,
ptr
+
8
+
8
*
linesize
,
linesize
);
if
(
s
->
flags
&
CODEC_FLAG_GRAY
)
return
;
if
(
s
->
flags
&
CODEC_FLAG_GRAY
)
return
;
if
(
s
->
out_format
==
FMT_H263
)
{
if
(
s
->
out_format
==
FMT_H263
)
{
dxy
=
0
;
dxy
=
0
;
...
@@ -147,9 +152,9 @@ void ff_mspel_motion(MpegEncContext *s,
...
@@ -147,9 +152,9 @@ void ff_mspel_motion(MpegEncContext *s,
mx
=
motion_x
>>
2
;
mx
=
motion_x
>>
2
;
my
=
motion_y
>>
2
;
my
=
motion_y
>>
2
;
}
else
{
}
else
{
mx
=
motion_x
/
2
;
mx
=
motion_x
/
2
;
my
=
motion_y
/
2
;
my
=
motion_y
/
2
;
dxy
=
((
my
&
1
)
<<
1
)
|
(
mx
&
1
);
dxy
=
((
my
&
1
)
<<
1
)
|
(
mx
&
1
);
mx
>>=
1
;
mx
>>=
1
;
my
>>=
1
;
my
>>=
1
;
}
}
...
@@ -163,25 +168,25 @@ void ff_mspel_motion(MpegEncContext *s,
...
@@ -163,25 +168,25 @@ void ff_mspel_motion(MpegEncContext *s,
if
(
src_y
==
(
s
->
height
>>
1
))
if
(
src_y
==
(
s
->
height
>>
1
))
dxy
&=
~
2
;
dxy
&=
~
2
;
offset
=
(
src_y
*
uvlinesize
)
+
src_x
;
offset
=
(
src_y
*
uvlinesize
)
+
src_x
;
ptr
=
ref_picture
[
1
]
+
offset
;
ptr
=
ref_picture
[
1
]
+
offset
;
if
(
emu
)
{
if
(
emu
)
{
s
->
vdsp
.
emulated_edge_mc
(
s
->
edge_emu_buffer
,
ptr
,
s
->
vdsp
.
emulated_edge_mc
(
s
->
edge_emu_buffer
,
ptr
,
s
->
uvlinesize
,
s
->
uvlinesize
,
s
->
uvlinesize
,
s
->
uvlinesize
,
9
,
9
,
9
,
9
,
src_x
,
src_y
,
src_x
,
src_y
,
s
->
h_edge_pos
>>
1
,
s
->
v_edge_pos
>>
1
);
s
->
h_edge_pos
>>
1
,
s
->
v_edge_pos
>>
1
);
ptr
=
s
->
edge_emu_buffer
;
ptr
=
s
->
edge_emu_buffer
;
}
}
pix_op
[
1
][
dxy
](
dest_cb
,
ptr
,
uvlinesize
,
h
>>
1
);
pix_op
[
1
][
dxy
](
dest_cb
,
ptr
,
uvlinesize
,
h
>>
1
);
ptr
=
ref_picture
[
2
]
+
offset
;
ptr
=
ref_picture
[
2
]
+
offset
;
if
(
emu
)
{
if
(
emu
)
{
s
->
vdsp
.
emulated_edge_mc
(
s
->
edge_emu_buffer
,
ptr
,
s
->
vdsp
.
emulated_edge_mc
(
s
->
edge_emu_buffer
,
ptr
,
s
->
uvlinesize
,
s
->
uvlinesize
,
s
->
uvlinesize
,
s
->
uvlinesize
,
9
,
9
,
9
,
9
,
src_x
,
src_y
,
src_x
,
src_y
,
s
->
h_edge_pos
>>
1
,
s
->
v_edge_pos
>>
1
);
s
->
h_edge_pos
>>
1
,
s
->
v_edge_pos
>>
1
);
ptr
=
s
->
edge_emu_buffer
;
ptr
=
s
->
edge_emu_buffer
;
}
}
pix_op
[
1
][
dxy
](
dest_cr
,
ptr
,
uvlinesize
,
h
>>
1
);
pix_op
[
1
][
dxy
](
dest_cr
,
ptr
,
uvlinesize
,
h
>>
1
);
}
}
libavcodec/wmv2.h
View file @
eda7571e
...
@@ -22,8 +22,8 @@
...
@@ -22,8 +22,8 @@
#define AVCODEC_WMV2_H
#define AVCODEC_WMV2_H
#include "avcodec.h"
#include "avcodec.h"
#include "mpegvideo.h"
#include "intrax8.h"
#include "intrax8.h"
#include "mpegvideo.h"
#include "wmv2dsp.h"
#include "wmv2dsp.h"
#define SKIP_TYPE_NONE 0
#define SKIP_TYPE_NONE 0
...
@@ -32,7 +32,7 @@
...
@@ -32,7 +32,7 @@
#define SKIP_TYPE_COL 3
#define SKIP_TYPE_COL 3
typedef
struct
Wmv2Context
{
typedef
struct
Wmv2Context
{
MpegEncContext
s
;
MpegEncContext
s
;
IntraX8Context
x8
;
IntraX8Context
x8
;
WMV2DSPContext
wdsp
;
WMV2DSPContext
wdsp
;
...
@@ -52,8 +52,8 @@ typedef struct Wmv2Context{
...
@@ -52,8 +52,8 @@ typedef struct Wmv2Context{
ScanTable
abt_scantable
[
2
];
ScanTable
abt_scantable
[
2
];
DECLARE_ALIGNED
(
16
,
int16_t
,
abt_block2
)[
6
][
64
];
DECLARE_ALIGNED
(
16
,
int16_t
,
abt_block2
)[
6
][
64
];
}
Wmv2Context
;
}
Wmv2Context
;
void
ff_wmv2_common_init
(
Wmv2Context
*
w
);
void
ff_wmv2_common_init
(
Wmv2Context
*
w
);
#endif
/* AVCODEC_WMV2_H */
#endif
/* AVCODEC_WMV2_H */
libavcodec/wmv2dec.c
View file @
eda7571e
...
@@ -19,265 +19,271 @@
...
@@ -19,265 +19,271 @@
*/
*/
#include "avcodec.h"
#include "avcodec.h"
#include "mpegutils.h"
#include "mpegvideo.h"
#include "h263.h"
#include "h263.h"
#include "intrax8.h"
#include "mathops.h"
#include "mathops.h"
#include "mpegutils.h"
#include "mpegvideo.h"
#include "msmpeg4.h"
#include "msmpeg4.h"
#include "msmpeg4data.h"
#include "msmpeg4data.h"
#include "intrax8.h"
#include "wmv2.h"
#include "wmv2.h"
static
void
parse_mb_skip
(
Wmv2Context
*
w
){
static
void
parse_mb_skip
(
Wmv2Context
*
w
)
{
int
mb_x
,
mb_y
;
int
mb_x
,
mb_y
;
MpegEncContext
*
const
s
=
&
w
->
s
;
MpegEncContext
*
const
s
=
&
w
->
s
;
uint32_t
*
const
mb_type
=
s
->
current_picture_ptr
->
mb_type
;
uint32_t
*
const
mb_type
=
s
->
current_picture_ptr
->
mb_type
;
w
->
skip_type
=
get_bits
(
&
s
->
gb
,
2
);
w
->
skip_type
=
get_bits
(
&
s
->
gb
,
2
);
switch
(
w
->
skip_type
)
{
switch
(
w
->
skip_type
)
{
case
SKIP_TYPE_NONE
:
case
SKIP_TYPE_NONE
:
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
){
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
){
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
MB_TYPE_16x16
|
MB_TYPE_L0
;
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
}
MB_TYPE_16x16
|
MB_TYPE_L0
;
}
break
;
break
;
case
SKIP_TYPE_MPEG
:
case
SKIP_TYPE_MPEG
:
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
){
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
){
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
(
get_bits1
(
&
s
->
gb
)
?
MB_TYPE_SKIP
:
0
)
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
}
(
get_bits1
(
&
s
->
gb
)
?
MB_TYPE_SKIP
:
0
)
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
}
break
;
break
;
case
SKIP_TYPE_ROW
:
case
SKIP_TYPE_ROW
:
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
{
if
(
get_bits1
(
&
s
->
gb
))
{
if
(
get_bits1
(
&
s
->
gb
))
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
){
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
MB_TYPE_SKIP
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
}
MB_TYPE_SKIP
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
}
else
{
}
else
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
){
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
(
get_bits1
(
&
s
->
gb
)
?
MB_TYPE_SKIP
:
0
)
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
}
(
get_bits1
(
&
s
->
gb
)
?
MB_TYPE_SKIP
:
0
)
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
}
}
}
}
break
;
break
;
case
SKIP_TYPE_COL
:
case
SKIP_TYPE_COL
:
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
s
->
mb_width
;
mb_x
++
)
{
if
(
get_bits1
(
&
s
->
gb
))
{
if
(
get_bits1
(
&
s
->
gb
))
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
){
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
MB_TYPE_SKIP
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
}
MB_TYPE_SKIP
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
}
else
{
}
else
{
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
){
for
(
mb_y
=
0
;
mb_y
<
s
->
mb_height
;
mb_y
++
)
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
(
get_bits1
(
&
s
->
gb
)
?
MB_TYPE_SKIP
:
0
)
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
mb_type
[
mb_y
*
s
->
mb_stride
+
mb_x
]
=
}
(
get_bits1
(
&
s
->
gb
)
?
MB_TYPE_SKIP
:
0
)
|
MB_TYPE_16x16
|
MB_TYPE_L0
;
}
}
}
}
break
;
break
;
}
}
}
}
static
int
decode_ext_header
(
Wmv2Context
*
w
){
static
int
decode_ext_header
(
Wmv2Context
*
w
)
MpegEncContext
*
const
s
=
&
w
->
s
;
{
MpegEncContext
*
const
s
=
&
w
->
s
;
GetBitContext
gb
;
GetBitContext
gb
;
int
fps
;
int
fps
;
int
code
;
int
code
;
if
(
s
->
avctx
->
extradata_size
<
4
)
return
-
1
;
if
(
s
->
avctx
->
extradata_size
<
4
)
return
-
1
;
init_get_bits
(
&
gb
,
s
->
avctx
->
extradata
,
32
);
init_get_bits
(
&
gb
,
s
->
avctx
->
extradata
,
32
);
fps
=
get_bits
(
&
gb
,
5
);
fps
=
get_bits
(
&
gb
,
5
);
s
->
bit_rate
=
get_bits
(
&
gb
,
11
)
*
1024
;
s
->
bit_rate
=
get_bits
(
&
gb
,
11
)
*
1024
;
w
->
mspel_bit
=
get_bits1
(
&
gb
);
w
->
mspel_bit
=
get_bits1
(
&
gb
);
s
->
loop_filter
=
get_bits1
(
&
gb
);
s
->
loop_filter
=
get_bits1
(
&
gb
);
w
->
abt_flag
=
get_bits1
(
&
gb
);
w
->
abt_flag
=
get_bits1
(
&
gb
);
w
->
j_type_bit
=
get_bits1
(
&
gb
);
w
->
j_type_bit
=
get_bits1
(
&
gb
);
w
->
top_left_mv_flag
=
get_bits1
(
&
gb
);
w
->
top_left_mv_flag
=
get_bits1
(
&
gb
);
w
->
per_mb_rl_bit
=
get_bits1
(
&
gb
);
w
->
per_mb_rl_bit
=
get_bits1
(
&
gb
);
code
=
get_bits
(
&
gb
,
3
);
code
=
get_bits
(
&
gb
,
3
);
if
(
code
==
0
)
return
-
1
;
if
(
code
==
0
)
return
-
1
;
s
->
slice_height
=
s
->
mb_height
/
code
;
s
->
slice_height
=
s
->
mb_height
/
code
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
){
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"fps:%d, br:%d, qpbit:%d, abt_flag:%d, j_type_bit:%d, tl_mv_flag:%d, mbrl_bit:%d, code:%d, loop_filter:%d, slices:%d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
fps
,
s
->
bit_rate
,
w
->
mspel_bit
,
w
->
abt_flag
,
w
->
j_type_bit
,
w
->
top_left_mv_flag
,
w
->
per_mb_rl_bit
,
code
,
s
->
loop_filter
,
"fps:%d, br:%d, qpbit:%d, abt_flag:%d, j_type_bit:%d, "
code
);
"tl_mv_flag:%d, mbrl_bit:%d, code:%d, loop_filter:%d, "
}
"slices:%d
\n
"
,
fps
,
s
->
bit_rate
,
w
->
mspel_bit
,
w
->
abt_flag
,
w
->
j_type_bit
,
w
->
top_left_mv_flag
,
w
->
per_mb_rl_bit
,
code
,
s
->
loop_filter
,
code
);
return
0
;
return
0
;
}
}
int
ff_wmv2_decode_picture_header
(
MpegEncContext
*
s
)
int
ff_wmv2_decode_picture_header
(
MpegEncContext
*
s
)
{
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
int
code
;
int
code
;
if
(
s
->
picture_number
==
0
)
if
(
s
->
picture_number
==
0
)
decode_ext_header
(
w
);
decode_ext_header
(
w
);
s
->
pict_type
=
get_bits1
(
&
s
->
gb
)
+
1
;
s
->
pict_type
=
get_bits1
(
&
s
->
gb
)
+
1
;
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
code
=
get_bits
(
&
s
->
gb
,
7
);
code
=
get_bits
(
&
s
->
gb
,
7
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"I7:%X/
\n
"
,
code
);
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"I7:%X/
\n
"
,
code
);
}
}
s
->
chroma_qscale
=
s
->
qscale
=
get_bits
(
&
s
->
gb
,
5
);
s
->
chroma_qscale
=
s
->
qscale
=
get_bits
(
&
s
->
gb
,
5
);
if
(
s
->
qscale
<=
0
)
if
(
s
->
qscale
<=
0
)
return
-
1
;
return
-
1
;
return
0
;
return
0
;
}
}
int
ff_wmv2_decode_secondary_picture_header
(
MpegEncContext
*
s
)
int
ff_wmv2_decode_secondary_picture_header
(
MpegEncContext
*
s
)
{
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
if
(
w
->
j_type_bit
)
w
->
j_type
=
get_bits1
(
&
s
->
gb
);
if
(
w
->
j_type_bit
)
else
w
->
j_type
=
0
;
//FIXME check
w
->
j_type
=
get_bits1
(
&
s
->
gb
);
else
if
(
!
w
->
j_type
){
w
->
j_type
=
0
;
// FIXME check
if
(
w
->
per_mb_rl_bit
)
s
->
per_mb_rl_table
=
get_bits1
(
&
s
->
gb
);
else
s
->
per_mb_rl_table
=
0
;
if
(
!
w
->
j_type
)
{
if
(
w
->
per_mb_rl_bit
)
if
(
!
s
->
per_mb_rl_table
){
s
->
per_mb_rl_table
=
get_bits1
(
&
s
->
gb
);
else
s
->
per_mb_rl_table
=
0
;
if
(
!
s
->
per_mb_rl_table
)
{
s
->
rl_chroma_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_chroma_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
}
}
s
->
dc_table_index
=
get_bits1
(
&
s
->
gb
);
s
->
dc_table_index
=
get_bits1
(
&
s
->
gb
);
}
}
s
->
inter_intra_pred
=
0
;
s
->
inter_intra_pred
=
0
;
s
->
no_rounding
=
1
;
s
->
no_rounding
=
1
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
){
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
{
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
s
->
qscale
,
"qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d
\n
"
,
s
->
rl_chroma_table_index
,
s
->
qscale
,
s
->
rl_chroma_table_index
,
s
->
rl_table_index
,
s
->
rl_table_index
,
s
->
dc_table_index
,
s
->
per_mb_rl_table
,
w
->
j_type
);
s
->
dc_table_index
,
s
->
per_mb_rl_table
,
w
->
j_type
);
}
}
}
else
{
}
else
{
int
cbp_index
;
int
cbp_index
;
w
->
j_type
=
0
;
w
->
j_type
=
0
;
parse_mb_skip
(
w
);
parse_mb_skip
(
w
);
cbp_index
=
decode012
(
&
s
->
gb
);
cbp_index
=
decode012
(
&
s
->
gb
);
if
(
s
->
qscale
<=
10
)
{
if
(
s
->
qscale
<=
10
)
{
int
map
[
3
]
=
{
0
,
2
,
1
};
int
map
[
3
]
=
{
0
,
2
,
1
};
w
->
cbp_table_index
=
map
[
cbp_index
];
w
->
cbp_table_index
=
map
[
cbp_index
];
}
else
if
(
s
->
qscale
<=
20
)
{
}
else
if
(
s
->
qscale
<=
20
)
{
int
map
[
3
]
=
{
1
,
0
,
2
};
int
map
[
3
]
=
{
1
,
0
,
2
};
w
->
cbp_table_index
=
map
[
cbp_index
];
w
->
cbp_table_index
=
map
[
cbp_index
];
}
else
{
}
else
{
int
map
[
3
]
=
{
2
,
1
,
0
};
int
map
[
3
]
=
{
2
,
1
,
0
};
w
->
cbp_table_index
=
map
[
cbp_index
];
w
->
cbp_table_index
=
map
[
cbp_index
];
}
}
if
(
w
->
mspel_bit
)
s
->
mspel
=
get_bits1
(
&
s
->
gb
);
if
(
w
->
mspel_bit
)
else
s
->
mspel
=
0
;
//FIXME check
s
->
mspel
=
get_bits1
(
&
s
->
gb
);
else
s
->
mspel
=
0
;
// FIXME check
if
(
w
->
abt_flag
){
if
(
w
->
abt_flag
)
{
w
->
per_mb_abt
=
get_bits1
(
&
s
->
gb
)
^
1
;
w
->
per_mb_abt
=
get_bits1
(
&
s
->
gb
)
^
1
;
if
(
!
w
->
per_mb_abt
){
if
(
!
w
->
per_mb_abt
)
w
->
abt_type
=
decode012
(
&
s
->
gb
);
w
->
abt_type
=
decode012
(
&
s
->
gb
);
}
}
}
if
(
w
->
per_mb_rl_bit
)
s
->
per_mb_rl_table
=
get_bits1
(
&
s
->
gb
);
if
(
w
->
per_mb_rl_bit
)
else
s
->
per_mb_rl_table
=
0
;
s
->
per_mb_rl_table
=
get_bits1
(
&
s
->
gb
);
else
s
->
per_mb_rl_table
=
0
;
if
(
!
s
->
per_mb_rl_table
)
{
if
(
!
s
->
per_mb_rl_table
)
{
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
}
}
s
->
dc_table_index
=
get_bits1
(
&
s
->
gb
);
s
->
dc_table_index
=
get_bits1
(
&
s
->
gb
);
s
->
mv_table_index
=
get_bits1
(
&
s
->
gb
);
s
->
mv_table_index
=
get_bits1
(
&
s
->
gb
);
s
->
inter_intra_pred
=
0
;
//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
s
->
inter_intra_pred
=
0
;
// (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE);
s
->
no_rounding
^=
1
;
s
->
no_rounding
^=
1
;
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
){
if
(
s
->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
{
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
"rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d per_mb_abt:%d abt_type:%d cbp:%d ii:%d
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_DEBUG
,
s
->
rl_table_index
,
"rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d "
s
->
rl_chroma_table_index
,
"per_mb_abt:%d abt_type:%d cbp:%d ii:%d
\n
"
,
s
->
dc_table_index
,
s
->
rl_table_index
,
s
->
rl_chroma_table_index
,
s
->
mv_table_index
,
s
->
dc_table_index
,
s
->
mv_table_index
,
s
->
per_mb_rl_table
,
s
->
per_mb_rl_table
,
s
->
qscale
,
s
->
mspel
,
s
->
qscale
,
w
->
per_mb_abt
,
w
->
abt_type
,
w
->
cbp_table_index
,
s
->
mspel
,
s
->
inter_intra_pred
);
w
->
per_mb_abt
,
w
->
abt_type
,
w
->
cbp_table_index
,
s
->
inter_intra_pred
);
}
}
}
}
s
->
esc3_level_length
=
0
;
s
->
esc3_level_length
=
0
;
s
->
esc3_run_length
=
0
;
s
->
esc3_run_length
=
0
;
s
->
picture_number
++
;
// FIXME ?
s
->
picture_number
++
;
//FIXME ?
if
(
w
->
j_type
)
{
if
(
w
->
j_type
)
{
ff_intrax8_decode_picture
(
&
w
->
x8
,
2
*
s
->
qscale
,
(
s
->
qscale
-
1
)
|
1
);
ff_intrax8_decode_picture
(
&
w
->
x8
,
2
*
s
->
qscale
,
(
s
->
qscale
-
1
)
|
1
);
return
1
;
return
1
;
}
}
return
0
;
return
0
;
}
}
static
inline
int
wmv2_decode_motion
(
Wmv2Context
*
w
,
int
*
mx_ptr
,
int
*
my_ptr
){
static
inline
int
wmv2_decode_motion
(
Wmv2Context
*
w
,
int
*
mx_ptr
,
int
*
my_ptr
)
MpegEncContext
*
const
s
=
&
w
->
s
;
{
MpegEncContext
*
const
s
=
&
w
->
s
;
int
ret
;
int
ret
;
ret
=
ff_msmpeg4_decode_motion
(
s
,
mx_ptr
,
my_ptr
);
ret
=
ff_msmpeg4_decode_motion
(
s
,
mx_ptr
,
my_ptr
);
if
(
ret
<
0
)
return
-
1
;
if
(
ret
<
0
)
return
-
1
;
if
((((
*
mx_ptr
)
|
(
*
my_ptr
))
&
1
)
&&
s
->
mspel
)
if
((((
*
mx_ptr
)
|
(
*
my_ptr
))
&
1
)
&&
s
->
mspel
)
w
->
hshift
=
get_bits1
(
&
s
->
gb
);
w
->
hshift
=
get_bits1
(
&
s
->
gb
);
else
else
w
->
hshift
=
0
;
w
->
hshift
=
0
;
return
0
;
return
0
;
}
}
static
int16_t
*
wmv2_pred_motion
(
Wmv2Context
*
w
,
int
*
px
,
int
*
py
){
static
int16_t
*
wmv2_pred_motion
(
Wmv2Context
*
w
,
int
*
px
,
int
*
py
)
MpegEncContext
*
const
s
=
&
w
->
s
;
{
MpegEncContext
*
const
s
=
&
w
->
s
;
int
xy
,
wrap
,
diff
,
type
;
int
xy
,
wrap
,
diff
,
type
;
int16_t
*
A
,
*
B
,
*
C
,
*
mot_val
;
int16_t
*
A
,
*
B
,
*
C
,
*
mot_val
;
wrap
=
s
->
b8_stride
;
wrap
=
s
->
b8_stride
;
xy
=
s
->
block_index
[
0
];
xy
=
s
->
block_index
[
0
];
mot_val
=
s
->
current_picture
.
motion_val
[
0
][
xy
];
mot_val
=
s
->
current_picture
.
motion_val
[
0
][
xy
];
A
=
s
->
current_picture
.
motion_val
[
0
][
xy
-
1
];
A
=
s
->
current_picture
.
motion_val
[
0
][
xy
-
1
];
B
=
s
->
current_picture
.
motion_val
[
0
][
xy
-
wrap
];
B
=
s
->
current_picture
.
motion_val
[
0
][
xy
-
wrap
];
C
=
s
->
current_picture
.
motion_val
[
0
][
xy
+
2
-
wrap
];
C
=
s
->
current_picture
.
motion_val
[
0
][
xy
+
2
-
wrap
];
if
(
s
->
mb_x
&&
!
s
->
first_slice_line
&&
!
s
->
mspel
&&
w
->
top_left_mv_flag
)
if
(
s
->
mb_x
&&
!
s
->
first_slice_line
&&
!
s
->
mspel
&&
w
->
top_left_mv_flag
)
diff
=
FFMAX
(
FFABS
(
A
[
0
]
-
B
[
0
]),
FFABS
(
A
[
1
]
-
B
[
1
]));
diff
=
FFMAX
(
FFABS
(
A
[
0
]
-
B
[
0
]),
FFABS
(
A
[
1
]
-
B
[
1
]));
else
else
diff
=
0
;
diff
=
0
;
if
(
diff
>=
8
)
if
(
diff
>=
8
)
type
=
get_bits1
(
&
s
->
gb
);
type
=
get_bits1
(
&
s
->
gb
);
else
else
type
=
2
;
type
=
2
;
if
(
type
==
0
)
{
if
(
type
==
0
)
{
*
px
=
A
[
0
];
*
px
=
A
[
0
];
*
py
=
A
[
1
];
*
py
=
A
[
1
];
}
else
if
(
type
==
1
)
{
}
else
if
(
type
==
1
)
{
*
px
=
B
[
0
];
*
px
=
B
[
0
];
*
py
=
B
[
1
];
*
py
=
B
[
1
];
}
else
{
}
else
{
/* special case for first (slice) line */
/* special case for first (slice) line */
if
(
s
->
first_slice_line
)
{
if
(
s
->
first_slice_line
)
{
*
px
=
A
[
0
];
*
px
=
A
[
0
];
...
@@ -291,70 +297,72 @@ static int16_t *wmv2_pred_motion(Wmv2Context *w, int *px, int *py){
...
@@ -291,70 +297,72 @@ static int16_t *wmv2_pred_motion(Wmv2Context *w, int *px, int *py){
return
mot_val
;
return
mot_val
;
}
}
static
inline
int
wmv2_decode_inter_block
(
Wmv2Context
*
w
,
int16_t
*
block
,
int
n
,
int
cbp
){
static
inline
int
wmv2_decode_inter_block
(
Wmv2Context
*
w
,
int16_t
*
block
,
MpegEncContext
*
const
s
=
&
w
->
s
;
int
n
,
int
cbp
)
static
const
int
sub_cbp_table
[
3
]
=
{
2
,
3
,
1
};
{
MpegEncContext
*
const
s
=
&
w
->
s
;
static
const
int
sub_cbp_table
[
3
]
=
{
2
,
3
,
1
};
int
sub_cbp
;
int
sub_cbp
;
if
(
!
cbp
)
{
if
(
!
cbp
)
{
s
->
block_last_index
[
n
]
=
-
1
;
s
->
block_last_index
[
n
]
=
-
1
;
return
0
;
return
0
;
}
}
if
(
w
->
per_block_abt
)
if
(
w
->
per_block_abt
)
w
->
abt_type
=
decode012
(
&
s
->
gb
);
w
->
abt_type
=
decode012
(
&
s
->
gb
);
w
->
abt_type_table
[
n
]
=
w
->
abt_type
;
w
->
abt_type_table
[
n
]
=
w
->
abt_type
;
if
(
w
->
abt_type
)
{
if
(
w
->
abt_type
)
{
// const uint8_t *scantable
= w->abt_scantable[w->abt_type-
1].permutated;
// const uint8_t *scantable
= w->abt_scantable[w->abt_type -
1].permutated;
const
uint8_t
*
scantable
=
w
->
abt_scantable
[
w
->
abt_type
-
1
].
scantable
;
const
uint8_t
*
scantable
=
w
->
abt_scantable
[
w
->
abt_type
-
1
].
scantable
;
// const uint8_t *scantable
= w->abt_type-
1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable;
// const uint8_t *scantable
= w->abt_type -
1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable;
sub_cbp
=
sub_cbp_table
[
decode012
(
&
s
->
gb
)
];
sub_cbp
=
sub_cbp_table
[
decode012
(
&
s
->
gb
)
];
if
(
sub_cbp
&
1
){
if
(
sub_cbp
&
1
)
if
(
ff_msmpeg4_decode_block
(
s
,
block
,
n
,
1
,
scantable
)
<
0
)
if
(
ff_msmpeg4_decode_block
(
s
,
block
,
n
,
1
,
scantable
)
<
0
)
return
-
1
;
return
-
1
;
}
if
(
sub_cbp
&
2
){
if
(
sub_cbp
&
2
)
if
(
ff_msmpeg4_decode_block
(
s
,
w
->
abt_block2
[
n
],
n
,
1
,
scantable
)
<
0
)
if
(
ff_msmpeg4_decode_block
(
s
,
w
->
abt_block2
[
n
],
n
,
1
,
scantable
)
<
0
)
return
-
1
;
return
-
1
;
}
s
->
block_last_index
[
n
]
=
63
;
s
->
block_last_index
[
n
]
=
63
;
return
0
;
return
0
;
}
else
{
}
else
{
return
ff_msmpeg4_decode_block
(
s
,
block
,
n
,
1
,
s
->
inter_scantable
.
permutated
);
return
ff_msmpeg4_decode_block
(
s
,
block
,
n
,
1
,
s
->
inter_scantable
.
permutated
);
}
}
}
}
int
ff_wmv2_decode_mb
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
])
int
ff_wmv2_decode_mb
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
])
{
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
int
cbp
,
code
,
i
;
int
cbp
,
code
,
i
;
uint8_t
*
coded_val
;
uint8_t
*
coded_val
;
if
(
w
->
j_type
)
return
0
;
if
(
w
->
j_type
)
return
0
;
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
if
(
IS_SKIP
(
s
->
current_picture
.
mb_type
[
s
->
mb_y
*
s
->
mb_stride
+
s
->
mb_x
]))
{
if
(
IS_SKIP
(
s
->
current_picture
.
mb_type
[
s
->
mb_y
*
s
->
mb_stride
+
s
->
mb_x
]))
{
/* skip mb */
/* skip mb */
s
->
mb_intra
=
0
;
s
->
mb_intra
=
0
;
for
(
i
=
0
;
i
<
6
;
i
++
)
for
(
i
=
0
;
i
<
6
;
i
++
)
s
->
block_last_index
[
i
]
=
-
1
;
s
->
block_last_index
[
i
]
=
-
1
;
s
->
mv_dir
=
MV_DIR_FORWARD
;
s
->
mv_dir
=
MV_DIR_FORWARD
;
s
->
mv_type
=
MV_TYPE_16X16
;
s
->
mv_type
=
MV_TYPE_16X16
;
s
->
mv
[
0
][
0
][
0
]
=
0
;
s
->
mv
[
0
][
0
][
0
]
=
0
;
s
->
mv
[
0
][
0
][
1
]
=
0
;
s
->
mv
[
0
][
0
][
1
]
=
0
;
s
->
mb_skipped
=
1
;
s
->
mb_skipped
=
1
;
w
->
hshift
=
0
;
w
->
hshift
=
0
;
return
0
;
return
0
;
}
}
code
=
get_vlc2
(
&
s
->
gb
,
ff_mb_non_intra_vlc
[
w
->
cbp_table_index
].
table
,
MB_NON_INTRA_VLC_BITS
,
3
);
code
=
get_vlc2
(
&
s
->
gb
,
ff_mb_non_intra_vlc
[
w
->
cbp_table_index
].
table
,
MB_NON_INTRA_VLC_BITS
,
3
);
if
(
code
<
0
)
if
(
code
<
0
)
return
-
1
;
return
-
1
;
s
->
mb_intra
=
(
~
code
&
0x40
)
>>
6
;
s
->
mb_intra
=
(
~
code
&
0x40
)
>>
6
;
...
@@ -363,17 +371,18 @@ int ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64])
...
@@ -363,17 +371,18 @@ int ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64])
}
else
{
}
else
{
s
->
mb_intra
=
1
;
s
->
mb_intra
=
1
;
code
=
get_vlc2
(
&
s
->
gb
,
ff_msmp4_mb_i_vlc
.
table
,
MB_INTRA_VLC_BITS
,
2
);
code
=
get_vlc2
(
&
s
->
gb
,
ff_msmp4_mb_i_vlc
.
table
,
MB_INTRA_VLC_BITS
,
2
);
if
(
code
<
0
){
if
(
code
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"II-cbp illegal at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"II-cbp illegal at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
return
-
1
;
}
}
/* predict coded block pattern */
/* predict coded block pattern */
cbp
=
0
;
cbp
=
0
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
int
val
=
((
code
>>
(
5
-
i
))
&
1
);
int
val
=
((
code
>>
(
5
-
i
))
&
1
);
if
(
i
<
4
)
{
if
(
i
<
4
)
{
int
pred
=
ff_msmpeg4_coded_block_pred
(
s
,
i
,
&
coded_val
);
int
pred
=
ff_msmpeg4_coded_block_pred
(
s
,
i
,
&
coded_val
);
val
=
val
^
pred
;
val
=
val
^
pred
;
*
coded_val
=
val
;
*
coded_val
=
val
;
}
}
cbp
|=
val
<<
(
5
-
i
);
cbp
|=
val
<<
(
5
-
i
);
...
@@ -384,58 +393,61 @@ int ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64])
...
@@ -384,58 +393,61 @@ int ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64])
int
mx
,
my
;
int
mx
,
my
;
wmv2_pred_motion
(
w
,
&
mx
,
&
my
);
wmv2_pred_motion
(
w
,
&
mx
,
&
my
);
if
(
cbp
)
{
if
(
cbp
)
{
s
->
bdsp
.
clear_blocks
(
s
->
block
[
0
]);
s
->
bdsp
.
clear_blocks
(
s
->
block
[
0
]);
if
(
s
->
per_mb_rl_table
)
{
if
(
s
->
per_mb_rl_table
)
{
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
}
}
if
(
w
->
abt_flag
&&
w
->
per_mb_abt
)
{
if
(
w
->
abt_flag
&&
w
->
per_mb_abt
)
{
w
->
per_block_abt
=
get_bits1
(
&
s
->
gb
);
w
->
per_block_abt
=
get_bits1
(
&
s
->
gb
);
if
(
!
w
->
per_block_abt
)
if
(
!
w
->
per_block_abt
)
w
->
abt_type
=
decode012
(
&
s
->
gb
);
w
->
abt_type
=
decode012
(
&
s
->
gb
);
}
else
}
else
w
->
per_block_abt
=
0
;
w
->
per_block_abt
=
0
;
}
}
if
(
wmv2_decode_motion
(
w
,
&
mx
,
&
my
)
<
0
)
if
(
wmv2_decode_motion
(
w
,
&
mx
,
&
my
)
<
0
)
return
-
1
;
return
-
1
;
s
->
mv_dir
=
MV_DIR_FORWARD
;
s
->
mv_dir
=
MV_DIR_FORWARD
;
s
->
mv_type
=
MV_TYPE_16X16
;
s
->
mv_type
=
MV_TYPE_16X16
;
s
->
mv
[
0
][
0
][
0
]
=
mx
;
s
->
mv
[
0
][
0
][
0
]
=
mx
;
s
->
mv
[
0
][
0
][
1
]
=
my
;
s
->
mv
[
0
][
0
][
1
]
=
my
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
wmv2_decode_inter_block
(
w
,
block
[
i
],
i
,
(
cbp
>>
(
5
-
i
))
&
1
)
<
0
)
if
(
wmv2_decode_inter_block
(
w
,
block
[
i
],
i
,
(
cbp
>>
(
5
-
i
))
&
1
)
<
0
)
{
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"
\n
error while decoding inter block: %d x %d (%d)
\n
"
,
s
->
mb_x
,
s
->
mb_y
,
i
);
"
\n
error while decoding inter block: %d x %d (%d)
\n
"
,
s
->
mb_x
,
s
->
mb_y
,
i
);
return
-
1
;
return
-
1
;
}
}
}
}
}
else
{
}
else
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
av_dlog
(
s
->
avctx
,
"%d%d "
,
s
->
inter_intra_pred
,
cbp
);
av_dlog
(
s
->
avctx
,
"%d%d "
,
s
->
inter_intra_pred
,
cbp
);
av_dlog
(
s
->
avctx
,
"I at %d %d %d %06X
\n
"
,
s
->
mb_x
,
s
->
mb_y
,
av_dlog
(
s
->
avctx
,
"I at %d %d %d %06X
\n
"
,
s
->
mb_x
,
s
->
mb_y
,
((
cbp
&
3
)
?
1
:
0
)
+
((
cbp
&
0x3C
)
?
2
:
0
),
((
cbp
&
3
)
?
1
:
0
)
+
((
cbp
&
0x3C
)
?
2
:
0
),
show_bits
(
&
s
->
gb
,
24
));
show_bits
(
&
s
->
gb
,
24
));
s
->
ac_pred
=
get_bits1
(
&
s
->
gb
);
s
->
ac_pred
=
get_bits1
(
&
s
->
gb
);
if
(
s
->
inter_intra_pred
){
if
(
s
->
inter_intra_pred
)
{
s
->
h263_aic_dir
=
get_vlc2
(
&
s
->
gb
,
ff_inter_intra_vlc
.
table
,
INTER_INTRA_VLC_BITS
,
1
);
s
->
h263_aic_dir
=
get_vlc2
(
&
s
->
gb
,
ff_inter_intra_vlc
.
table
,
INTER_INTRA_VLC_BITS
,
1
);
av_dlog
(
s
->
avctx
,
"%d%d %d %d/"
,
av_dlog
(
s
->
avctx
,
"%d%d %d %d/"
,
s
->
ac_pred
,
s
->
h263_aic_dir
,
s
->
mb_x
,
s
->
mb_y
);
s
->
ac_pred
,
s
->
h263_aic_dir
,
s
->
mb_x
,
s
->
mb_y
);
}
}
if
(
s
->
per_mb_rl_table
&&
cbp
)
{
if
(
s
->
per_mb_rl_table
&&
cbp
)
{
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_table_index
=
decode012
(
&
s
->
gb
);
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
}
}
s
->
bdsp
.
clear_blocks
(
s
->
block
[
0
]);
s
->
bdsp
.
clear_blocks
(
s
->
block
[
0
]);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
ff_msmpeg4_decode_block
(
s
,
block
[
i
],
i
,
(
cbp
>>
(
5
-
i
))
&
1
,
NULL
)
<
0
)
if
(
ff_msmpeg4_decode_block
(
s
,
block
[
i
],
i
,
(
cbp
>>
(
5
-
i
))
&
1
,
NULL
)
<
0
)
{
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"
\n
error while decoding intra block: %d x %d (%d)
\n
"
,
s
->
mb_x
,
s
->
mb_y
,
i
);
"
\n
error while decoding intra block: %d x %d (%d)
\n
"
,
s
->
mb_x
,
s
->
mb_y
,
i
);
return
-
1
;
return
-
1
;
}
}
}
}
...
@@ -444,15 +456,16 @@ int ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64])
...
@@ -444,15 +456,16 @@ int ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64])
return
0
;
return
0
;
}
}
static
av_cold
int
wmv2_decode_init
(
AVCodecContext
*
avctx
){
static
av_cold
int
wmv2_decode_init
(
AVCodecContext
*
avctx
)
Wmv2Context
*
const
w
=
avctx
->
priv_data
;
{
Wmv2Context
*
const
w
=
avctx
->
priv_data
;
if
(
ff_msmpeg4_decode_init
(
avctx
)
<
0
)
if
(
ff_msmpeg4_decode_init
(
avctx
)
<
0
)
return
-
1
;
return
-
1
;
ff_wmv2_common_init
(
w
);
ff_wmv2_common_init
(
w
);
ff_intrax8_common_init
(
&
w
->
x8
,
&
w
->
s
);
ff_intrax8_common_init
(
&
w
->
x8
,
&
w
->
s
);
return
0
;
return
0
;
}
}
...
@@ -475,8 +488,6 @@ AVCodec ff_wmv2_decoder = {
...
@@ -475,8 +488,6 @@ AVCodec ff_wmv2_decoder = {
.
close
=
wmv2_decode_end
,
.
close
=
wmv2_decode_end
,
.
decode
=
ff_h263_decode_frame
,
.
decode
=
ff_h263_decode_frame
,
.
capabilities
=
CODEC_CAP_DRAW_HORIZ_BAND
|
CODEC_CAP_DR1
,
.
capabilities
=
CODEC_CAP_DRAW_HORIZ_BAND
|
CODEC_CAP_DR1
,
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
AV_PIX_FMT_NONE
},
};
};
libavcodec/wmv2enc.c
View file @
eda7571e
...
@@ -19,30 +19,31 @@
...
@@ -19,30 +19,31 @@
*/
*/
#include "avcodec.h"
#include "avcodec.h"
#include "h263.h"
#include "mpegvideo.h"
#include "mpegvideo.h"
#include "msmpeg4.h"
#include "msmpeg4.h"
#include "msmpeg4data.h"
#include "msmpeg4data.h"
#include "h263.h"
#include "wmv2.h"
#include "wmv2.h"
static
int
encode_ext_header
(
Wmv2Context
*
w
){
static
int
encode_ext_header
(
Wmv2Context
*
w
)
MpegEncContext
*
const
s
=
&
w
->
s
;
{
MpegEncContext
*
const
s
=
&
w
->
s
;
PutBitContext
pb
;
PutBitContext
pb
;
int
code
;
int
code
;
init_put_bits
(
&
pb
,
s
->
avctx
->
extradata
,
s
->
avctx
->
extradata_size
);
init_put_bits
(
&
pb
,
s
->
avctx
->
extradata
,
s
->
avctx
->
extradata_size
);
put_bits
(
&
pb
,
5
,
s
->
avctx
->
time_base
.
den
/
s
->
avctx
->
time_base
.
num
);
//yes 29.97 -> 29
put_bits
(
&
pb
,
5
,
s
->
avctx
->
time_base
.
den
/
s
->
avctx
->
time_base
.
num
);
//
yes 29.97 -> 29
put_bits
(
&
pb
,
11
,
FFMIN
(
s
->
bit_rate
/
1024
,
2047
));
put_bits
(
&
pb
,
11
,
FFMIN
(
s
->
bit_rate
/
1024
,
2047
));
put_bits
(
&
pb
,
1
,
w
->
mspel_bit
=
1
);
put_bits
(
&
pb
,
1
,
w
->
mspel_bit
=
1
);
put_bits
(
&
pb
,
1
,
s
->
loop_filter
);
put_bits
(
&
pb
,
1
,
s
->
loop_filter
);
put_bits
(
&
pb
,
1
,
w
->
abt_flag
=
1
);
put_bits
(
&
pb
,
1
,
w
->
abt_flag
=
1
);
put_bits
(
&
pb
,
1
,
w
->
j_type_bit
=
1
);
put_bits
(
&
pb
,
1
,
w
->
j_type_bit
=
1
);
put_bits
(
&
pb
,
1
,
w
->
top_left_mv_flag
=
0
);
put_bits
(
&
pb
,
1
,
w
->
top_left_mv_flag
=
0
);
put_bits
(
&
pb
,
1
,
w
->
per_mb_rl_bit
=
1
);
put_bits
(
&
pb
,
1
,
w
->
per_mb_rl_bit
=
1
);
put_bits
(
&
pb
,
3
,
code
=
1
);
put_bits
(
&
pb
,
3
,
code
=
1
);
flush_put_bits
(
&
pb
);
flush_put_bits
(
&
pb
);
...
@@ -51,94 +52,97 @@ static int encode_ext_header(Wmv2Context *w){
...
@@ -51,94 +52,97 @@ static int encode_ext_header(Wmv2Context *w){
return
0
;
return
0
;
}
}
static
av_cold
int
wmv2_encode_init
(
AVCodecContext
*
avctx
){
static
av_cold
int
wmv2_encode_init
(
AVCodecContext
*
avctx
)
Wmv2Context
*
const
w
=
avctx
->
priv_data
;
{
Wmv2Context
*
const
w
=
avctx
->
priv_data
;
if
(
ff_mpv_encode_init
(
avctx
)
<
0
)
if
(
ff_mpv_encode_init
(
avctx
)
<
0
)
return
-
1
;
return
-
1
;
ff_wmv2_common_init
(
w
);
ff_wmv2_common_init
(
w
);
avctx
->
extradata_size
=
4
;
avctx
->
extradata_size
=
4
;
avctx
->
extradata
=
av_mallocz
(
avctx
->
extradata_size
+
10
);
avctx
->
extradata
=
av_mallocz
(
avctx
->
extradata_size
+
10
);
encode_ext_header
(
w
);
encode_ext_header
(
w
);
return
0
;
return
0
;
}
}
int
ff_wmv2_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number
)
int
ff_wmv2_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number
)
{
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
put_bits
(
&
s
->
pb
,
1
,
s
->
pict_type
-
1
);
put_bits
(
&
s
->
pb
,
1
,
s
->
pict_type
-
1
);
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
){
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
put_bits
(
&
s
->
pb
,
7
,
0
);
put_bits
(
&
s
->
pb
,
7
,
0
);
}
put_bits
(
&
s
->
pb
,
5
,
s
->
qscale
);
put_bits
(
&
s
->
pb
,
5
,
s
->
qscale
);
s
->
dc_table_index
=
1
;
s
->
dc_table_index
=
1
;
s
->
mv_table_index
=
1
;
/* only if P frame */
s
->
mv_table_index
=
1
;
/* only if P frame */
s
->
per_mb_rl_table
=
0
;
s
->
per_mb_rl_table
=
0
;
s
->
mspel
=
0
;
s
->
mspel
=
0
;
w
->
per_mb_abt
=
0
;
w
->
per_mb_abt
=
0
;
w
->
abt_type
=
0
;
w
->
abt_type
=
0
;
w
->
j_type
=
0
;
w
->
j_type
=
0
;
assert
(
s
->
flipflop_rounding
);
assert
(
s
->
flipflop_rounding
);
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
assert
(
s
->
no_rounding
==
1
);
assert
(
s
->
no_rounding
==
1
);
if
(
w
->
j_type_bit
)
put_bits
(
&
s
->
pb
,
1
,
w
->
j_type
);
if
(
w
->
j_type_bit
)
put_bits
(
&
s
->
pb
,
1
,
w
->
j_type
);
if
(
w
->
per_mb_rl_bit
)
put_bits
(
&
s
->
pb
,
1
,
s
->
per_mb_rl_table
);
if
(
w
->
per_mb_rl_bit
)
put_bits
(
&
s
->
pb
,
1
,
s
->
per_mb_rl_table
);
if
(
!
s
->
per_mb_rl_table
)
{
if
(
!
s
->
per_mb_rl_table
)
{
ff_msmpeg4_code012
(
&
s
->
pb
,
s
->
rl_chroma_table_index
);
ff_msmpeg4_code012
(
&
s
->
pb
,
s
->
rl_chroma_table_index
);
ff_msmpeg4_code012
(
&
s
->
pb
,
s
->
rl_table_index
);
ff_msmpeg4_code012
(
&
s
->
pb
,
s
->
rl_table_index
);
}
}
put_bits
(
&
s
->
pb
,
1
,
s
->
dc_table_index
);
put_bits
(
&
s
->
pb
,
1
,
s
->
dc_table_index
);
s
->
inter_intra_pred
=
0
;
s
->
inter_intra_pred
=
0
;
}
else
{
}
else
{
int
cbp_index
;
int
cbp_index
;
put_bits
(
&
s
->
pb
,
2
,
SKIP_TYPE_NONE
);
put_bits
(
&
s
->
pb
,
2
,
SKIP_TYPE_NONE
);
ff_msmpeg4_code012
(
&
s
->
pb
,
cbp_index
=
0
);
ff_msmpeg4_code012
(
&
s
->
pb
,
cbp_index
=
0
);
if
(
s
->
qscale
<=
10
)
{
if
(
s
->
qscale
<=
10
)
{
int
map
[
3
]
=
{
0
,
2
,
1
};
int
map
[
3
]
=
{
0
,
2
,
1
};
w
->
cbp_table_index
=
map
[
cbp_index
];
w
->
cbp_table_index
=
map
[
cbp_index
];
}
else
if
(
s
->
qscale
<=
20
)
{
}
else
if
(
s
->
qscale
<=
20
)
{
int
map
[
3
]
=
{
1
,
0
,
2
};
int
map
[
3
]
=
{
1
,
0
,
2
};
w
->
cbp_table_index
=
map
[
cbp_index
];
w
->
cbp_table_index
=
map
[
cbp_index
];
}
else
{
}
else
{
int
map
[
3
]
=
{
2
,
1
,
0
};
int
map
[
3
]
=
{
2
,
1
,
0
};
w
->
cbp_table_index
=
map
[
cbp_index
];
w
->
cbp_table_index
=
map
[
cbp_index
];
}
}
if
(
w
->
mspel_bit
)
put_bits
(
&
s
->
pb
,
1
,
s
->
mspel
);
if
(
w
->
mspel_bit
)
put_bits
(
&
s
->
pb
,
1
,
s
->
mspel
);
if
(
w
->
abt_flag
)
{
if
(
w
->
abt_flag
)
{
put_bits
(
&
s
->
pb
,
1
,
w
->
per_mb_abt
^
1
);
put_bits
(
&
s
->
pb
,
1
,
w
->
per_mb_abt
^
1
);
if
(
!
w
->
per_mb_abt
){
if
(
!
w
->
per_mb_abt
)
ff_msmpeg4_code012
(
&
s
->
pb
,
w
->
abt_type
);
ff_msmpeg4_code012
(
&
s
->
pb
,
w
->
abt_type
);
}
}
}
if
(
w
->
per_mb_rl_bit
)
put_bits
(
&
s
->
pb
,
1
,
s
->
per_mb_rl_table
);
if
(
w
->
per_mb_rl_bit
)
put_bits
(
&
s
->
pb
,
1
,
s
->
per_mb_rl_table
);
if
(
!
s
->
per_mb_rl_table
)
{
if
(
!
s
->
per_mb_rl_table
)
{
ff_msmpeg4_code012
(
&
s
->
pb
,
s
->
rl_table_index
);
ff_msmpeg4_code012
(
&
s
->
pb
,
s
->
rl_table_index
);
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
s
->
rl_chroma_table_index
=
s
->
rl_table_index
;
}
}
put_bits
(
&
s
->
pb
,
1
,
s
->
dc_table_index
);
put_bits
(
&
s
->
pb
,
1
,
s
->
dc_table_index
);
put_bits
(
&
s
->
pb
,
1
,
s
->
mv_table_index
);
put_bits
(
&
s
->
pb
,
1
,
s
->
mv_table_index
);
s
->
inter_intra_pred
=
0
;
//(s->width*s->height < 320*240 && s->bit_rate<=
II_BITRATE);
s
->
inter_intra_pred
=
0
;
// (s->width * s->height < 320 * 240 && s->bit_rate <=
II_BITRATE);
}
}
s
->
esc3_level_length
=
0
;
s
->
esc3_level_length
=
0
;
s
->
esc3_run_length
=
0
;
s
->
esc3_run_length
=
0
;
return
0
;
return
0
;
}
}
...
@@ -146,11 +150,10 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number)
...
@@ -146,11 +150,10 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number)
/* Nearly identical to wmv1 but that is just because we do not use the
/* Nearly identical to wmv1 but that is just because we do not use the
* useless M$ crap features. It is duplicated here in case someone wants
* useless M$ crap features. It is duplicated here in case someone wants
* to add support for these crap features. */
* to add support for these crap features. */
void
ff_wmv2_encode_mb
(
MpegEncContext
*
s
,
void
ff_wmv2_encode_mb
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
],
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
)
int
motion_x
,
int
motion_y
)
{
{
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
Wmv2Context
*
const
w
=
(
Wmv2Context
*
)
s
;
int
cbp
,
coded_cbp
,
i
;
int
cbp
,
coded_cbp
,
i
;
int
pred_x
,
pred_y
;
int
pred_x
,
pred_y
;
uint8_t
*
coded_block
;
uint8_t
*
coded_block
;
...
@@ -160,10 +163,9 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
...
@@ -160,10 +163,9 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
if
(
!
s
->
mb_intra
)
{
if
(
!
s
->
mb_intra
)
{
/* compute cbp */
/* compute cbp */
cbp
=
0
;
cbp
=
0
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
if
(
s
->
block_last_index
[
i
]
>=
0
)
if
(
s
->
block_last_index
[
i
]
>=
0
)
cbp
|=
1
<<
(
5
-
i
);
cbp
|=
1
<<
(
5
-
i
);
}
put_bits
(
&
s
->
pb
,
put_bits
(
&
s
->
pb
,
ff_wmv2_inter_table
[
w
->
cbp_table_index
][
cbp
+
64
][
1
],
ff_wmv2_inter_table
[
w
->
cbp_table_index
][
cbp
+
64
][
1
],
...
@@ -172,42 +174,43 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
...
@@ -172,42 +174,43 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
/* motion vector */
/* motion vector */
ff_h263_pred_motion
(
s
,
0
,
0
,
&
pred_x
,
&
pred_y
);
ff_h263_pred_motion
(
s
,
0
,
0
,
&
pred_x
,
&
pred_y
);
ff_msmpeg4_encode_motion
(
s
,
motion_x
-
pred_x
,
ff_msmpeg4_encode_motion
(
s
,
motion_x
-
pred_x
,
motion_y
-
pred_y
);
motion_y
-
pred_y
);
}
else
{
}
else
{
/* compute cbp */
/* compute cbp */
cbp
=
0
;
cbp
=
0
;
coded_cbp
=
0
;
coded_cbp
=
0
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
int
val
,
pred
;
int
val
,
pred
;
val
=
(
s
->
block_last_index
[
i
]
>=
1
);
val
=
(
s
->
block_last_index
[
i
]
>=
1
);
cbp
|=
val
<<
(
5
-
i
);
cbp
|=
val
<<
(
5
-
i
);
if
(
i
<
4
)
{
if
(
i
<
4
)
{
/* predict value for close blocks only for luma */
/* predict value for close blocks only for luma */
pred
=
ff_msmpeg4_coded_block_pred
(
s
,
i
,
&
coded_block
);
pred
=
ff_msmpeg4_coded_block_pred
(
s
,
i
,
&
coded_block
);
*
coded_block
=
val
;
*
coded_block
=
val
;
val
=
val
^
pred
;
val
=
val
^
pred
;
}
}
coded_cbp
|=
val
<<
(
5
-
i
);
coded_cbp
|=
val
<<
(
5
-
i
);
}
}
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
put_bits
(
&
s
->
pb
,
put_bits
(
&
s
->
pb
,
ff_msmp4_mb_i_table
[
coded_cbp
][
1
],
ff_msmp4_mb_i_table
[
coded_cbp
][
0
]);
ff_msmp4_mb_i_table
[
coded_cbp
][
1
],
}
else
{
ff_msmp4_mb_i_table
[
coded_cbp
][
0
]);
else
put_bits
(
&
s
->
pb
,
put_bits
(
&
s
->
pb
,
ff_wmv2_inter_table
[
w
->
cbp_table_index
][
cbp
][
1
],
ff_wmv2_inter_table
[
w
->
cbp_table_index
][
cbp
][
1
],
ff_wmv2_inter_table
[
w
->
cbp_table_index
][
cbp
][
0
]);
ff_wmv2_inter_table
[
w
->
cbp_table_index
][
cbp
][
0
]);
}
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no AC prediction yet */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no AC prediction yet */
if
(
s
->
inter_intra_pred
){
if
(
s
->
inter_intra_pred
)
{
s
->
h263_aic_dir
=
0
;
s
->
h263_aic_dir
=
0
;
put_bits
(
&
s
->
pb
,
ff_table_inter_intra
[
s
->
h263_aic_dir
][
1
],
ff_table_inter_intra
[
s
->
h263_aic_dir
][
0
]);
put_bits
(
&
s
->
pb
,
ff_table_inter_intra
[
s
->
h263_aic_dir
][
1
],
ff_table_inter_intra
[
s
->
h263_aic_dir
][
0
]);
}
}
}
}
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
ff_msmpeg4_encode_block
(
s
,
block
[
i
],
i
);
ff_msmpeg4_encode_block
(
s
,
block
[
i
],
i
);
}
}
}
AVCodec
ff_wmv2_encoder
=
{
AVCodec
ff_wmv2_encoder
=
{
...
@@ -219,5 +222,6 @@ AVCodec ff_wmv2_encoder = {
...
@@ -219,5 +222,6 @@ AVCodec ff_wmv2_encoder = {
.
init
=
wmv2_encode_init
,
.
init
=
wmv2_encode_init
,
.
encode2
=
ff_mpv_encode_picture
,
.
encode2
=
ff_mpv_encode_picture
,
.
close
=
ff_mpv_encode_end
,
.
close
=
ff_mpv_encode_end
,
.
pix_fmts
=
(
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
};
};
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