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
95587859
Commit
95587859
authored
Oct 13, 2013
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpegvideo: Move obmc in a separate function
parent
a90905db
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
88 additions
and
76 deletions
+88
-76
mpegvideo_motion.c
libavcodec/mpegvideo_motion.c
+88
-76
No files found.
libavcodec/mpegvideo_motion.c
View file @
95587859
...
...
@@ -660,6 +660,93 @@ static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir)
s
->
vdsp
.
prefetch
(
pix
[
1
]
+
off
,
pix
[
2
]
-
pix
[
1
],
2
);
}
static
inline
void
apply_obmc
(
MpegEncContext
*
s
,
uint8_t
*
dest_y
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
,
uint8_t
**
ref_picture
,
op_pixels_func
(
*
pix_op
)[
4
])
{
LOCAL_ALIGNED_8
(
int16_t
,
mv_cache
,
[
4
],
[
4
][
2
]);
Picture
*
cur_frame
=
&
s
->
current_picture
;
int
mb_x
=
s
->
mb_x
;
int
mb_y
=
s
->
mb_y
;
const
int
xy
=
mb_x
+
mb_y
*
s
->
mb_stride
;
const
int
mot_stride
=
s
->
b8_stride
;
const
int
mot_xy
=
mb_x
*
2
+
mb_y
*
2
*
mot_stride
;
int
mx
,
my
,
i
;
assert
(
!
s
->
mb_skipped
);
AV_COPY32
(
mv_cache
[
1
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
]);
AV_COPY32
(
mv_cache
[
1
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
1
]);
AV_COPY32
(
mv_cache
[
2
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
]);
AV_COPY32
(
mv_cache
[
2
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
+
1
]);
AV_COPY32
(
mv_cache
[
3
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
]);
AV_COPY32
(
mv_cache
[
3
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
+
1
]);
if
(
mb_y
==
0
||
IS_INTRA
(
cur_frame
->
mb_type
[
xy
-
s
->
mb_stride
]))
{
AV_COPY32
(
mv_cache
[
0
][
1
],
mv_cache
[
1
][
1
]);
AV_COPY32
(
mv_cache
[
0
][
2
],
mv_cache
[
1
][
2
]);
}
else
{
AV_COPY32
(
mv_cache
[
0
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
mot_stride
]);
AV_COPY32
(
mv_cache
[
0
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
mot_stride
+
1
]);
}
if
(
mb_x
==
0
||
IS_INTRA
(
cur_frame
->
mb_type
[
xy
-
1
]))
{
AV_COPY32
(
mv_cache
[
1
][
0
],
mv_cache
[
1
][
1
]);
AV_COPY32
(
mv_cache
[
2
][
0
],
mv_cache
[
2
][
1
]);
}
else
{
AV_COPY32
(
mv_cache
[
1
][
0
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
1
]);
AV_COPY32
(
mv_cache
[
2
][
0
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
1
+
mot_stride
]);
}
if
(
mb_x
+
1
>=
s
->
mb_width
||
IS_INTRA
(
cur_frame
->
mb_type
[
xy
+
1
]))
{
AV_COPY32
(
mv_cache
[
1
][
3
],
mv_cache
[
1
][
2
]);
AV_COPY32
(
mv_cache
[
2
][
3
],
mv_cache
[
2
][
2
]);
}
else
{
AV_COPY32
(
mv_cache
[
1
][
3
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
2
]);
AV_COPY32
(
mv_cache
[
2
][
3
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
2
+
mot_stride
]);
}
mx
=
0
;
my
=
0
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
int
x
=
(
i
&
1
)
+
1
;
const
int
y
=
(
i
>>
1
)
+
1
;
int16_t
mv
[
5
][
2
]
=
{
{
mv_cache
[
y
][
x
][
0
],
mv_cache
[
y
][
x
][
1
]
},
{
mv_cache
[
y
-
1
][
x
][
0
],
mv_cache
[
y
-
1
][
x
][
1
]
},
{
mv_cache
[
y
][
x
-
1
][
0
],
mv_cache
[
y
][
x
-
1
][
1
]
},
{
mv_cache
[
y
][
x
+
1
][
0
],
mv_cache
[
y
][
x
+
1
][
1
]
},
{
mv_cache
[
y
+
1
][
x
][
0
],
mv_cache
[
y
+
1
][
x
][
1
]
}
};
// FIXME cleanup
obmc_motion
(
s
,
dest_y
+
((
i
&
1
)
*
8
)
+
(
i
>>
1
)
*
8
*
s
->
linesize
,
ref_picture
[
0
],
mb_x
*
16
+
(
i
&
1
)
*
8
,
mb_y
*
16
+
(
i
>>
1
)
*
8
,
pix_op
[
1
],
mv
);
mx
+=
mv
[
0
][
0
];
my
+=
mv
[
0
][
1
];
}
if
(
!
CONFIG_GRAY
||
!
(
s
->
flags
&
CODEC_FLAG_GRAY
))
chroma_4mv_motion
(
s
,
dest_cb
,
dest_cr
,
ref_picture
,
pix_op
[
1
],
mx
,
my
);
}
/**
* motion compensation of a single macroblock
* @param s context
...
...
@@ -692,82 +779,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
prefetch_motion
(
s
,
ref_picture
,
dir
);
if
(
!
is_mpeg12
&&
s
->
obmc
&&
s
->
pict_type
!=
AV_PICTURE_TYPE_B
)
{
LOCAL_ALIGNED_8
(
int16_t
,
mv_cache
,
[
4
],
[
4
][
2
]);
Picture
*
cur_frame
=
&
s
->
current_picture
;
const
int
xy
=
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
;
const
int
mot_stride
=
s
->
b8_stride
;
const
int
mot_xy
=
mb_x
*
2
+
mb_y
*
2
*
mot_stride
;
assert
(
!
s
->
mb_skipped
);
AV_COPY32
(
mv_cache
[
1
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
]);
AV_COPY32
(
mv_cache
[
1
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
1
]);
AV_COPY32
(
mv_cache
[
2
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
]);
AV_COPY32
(
mv_cache
[
2
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
+
1
]);
AV_COPY32
(
mv_cache
[
3
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
]);
AV_COPY32
(
mv_cache
[
3
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
mot_stride
+
1
]);
if
(
mb_y
==
0
||
IS_INTRA
(
cur_frame
->
mb_type
[
xy
-
s
->
mb_stride
]))
{
AV_COPY32
(
mv_cache
[
0
][
1
],
mv_cache
[
1
][
1
]);
AV_COPY32
(
mv_cache
[
0
][
2
],
mv_cache
[
1
][
2
]);
}
else
{
AV_COPY32
(
mv_cache
[
0
][
1
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
mot_stride
]);
AV_COPY32
(
mv_cache
[
0
][
2
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
mot_stride
+
1
]);
}
if
(
mb_x
==
0
||
IS_INTRA
(
cur_frame
->
mb_type
[
xy
-
1
]))
{
AV_COPY32
(
mv_cache
[
1
][
0
],
mv_cache
[
1
][
1
]);
AV_COPY32
(
mv_cache
[
2
][
0
],
mv_cache
[
2
][
1
]);
}
else
{
AV_COPY32
(
mv_cache
[
1
][
0
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
1
]);
AV_COPY32
(
mv_cache
[
2
][
0
],
cur_frame
->
motion_val
[
0
][
mot_xy
-
1
+
mot_stride
]);
}
if
(
mb_x
+
1
>=
s
->
mb_width
||
IS_INTRA
(
cur_frame
->
mb_type
[
xy
+
1
]))
{
AV_COPY32
(
mv_cache
[
1
][
3
],
mv_cache
[
1
][
2
]);
AV_COPY32
(
mv_cache
[
2
][
3
],
mv_cache
[
2
][
2
]);
}
else
{
AV_COPY32
(
mv_cache
[
1
][
3
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
2
]);
AV_COPY32
(
mv_cache
[
2
][
3
],
cur_frame
->
motion_val
[
0
][
mot_xy
+
2
+
mot_stride
]);
}
mx
=
0
;
my
=
0
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
int
x
=
(
i
&
1
)
+
1
;
const
int
y
=
(
i
>>
1
)
+
1
;
int16_t
mv
[
5
][
2
]
=
{
{
mv_cache
[
y
][
x
][
0
],
mv_cache
[
y
][
x
][
1
]
},
{
mv_cache
[
y
-
1
][
x
][
0
],
mv_cache
[
y
-
1
][
x
][
1
]
},
{
mv_cache
[
y
][
x
-
1
][
0
],
mv_cache
[
y
][
x
-
1
][
1
]
},
{
mv_cache
[
y
][
x
+
1
][
0
],
mv_cache
[
y
][
x
+
1
][
1
]
},
{
mv_cache
[
y
+
1
][
x
][
0
],
mv_cache
[
y
+
1
][
x
][
1
]
}
};
// FIXME cleanup
obmc_motion
(
s
,
dest_y
+
((
i
&
1
)
*
8
)
+
(
i
>>
1
)
*
8
*
s
->
linesize
,
ref_picture
[
0
],
mb_x
*
16
+
(
i
&
1
)
*
8
,
mb_y
*
16
+
(
i
>>
1
)
*
8
,
pix_op
[
1
],
mv
);
mx
+=
mv
[
0
][
0
];
my
+=
mv
[
0
][
1
];
}
if
(
!
CONFIG_GRAY
||
!
(
s
->
flags
&
CODEC_FLAG_GRAY
))
chroma_4mv_motion
(
s
,
dest_cb
,
dest_cr
,
ref_picture
,
pix_op
[
1
],
mx
,
my
);
apply_obmc
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
ref_picture
,
pix_op
);
return
;
}
...
...
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