summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <[email protected]>2011-04-09 20:38:20 +0200
committerChristian König <[email protected]>2011-04-09 20:38:20 +0200
commit7a5390b06fea99f85ab47d40d8dc40e40e0f2ab8 (patch)
tree1a24db455c40676461e8c6aac2cf492f9077c104
parent44477ac489a34402d9d3314857fd2358a5e58e48 (diff)
[g3dvl] make mv weights a public interface
-rw-r--r--src/gallium/auxiliary/vl/vl_vertex_buffers.c75
-rw-r--r--src/gallium/include/pipe/p_video_state.h13
-rw-r--r--src/gallium/state_trackers/xorg/xvmc/surface.c72
3 files changed, 61 insertions, 99 deletions
diff --git a/src/gallium/auxiliary/vl/vl_vertex_buffers.c b/src/gallium/auxiliary/vl/vl_vertex_buffers.c
index f3e728c65a6..c834042e8ae 100644
--- a/src/gallium/auxiliary/vl/vl_vertex_buffers.c
+++ b/src/gallium/auxiliary/vl/vl_vertex_buffers.c
@@ -211,46 +211,30 @@ vl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe)
static void
get_motion_vectors(struct pipe_mpeg12_macroblock *mb, struct vertex2s mv[4])
{
- if (mb->mb_type == PIPE_MPEG12_MACROBLOCK_TYPE_BI ||
- mb->mb_type == PIPE_MPEG12_MACROBLOCK_TYPE_FWD) {
+ if (mb->mo_type == PIPE_MPEG12_MOTION_TYPE_FRAME) {
+ mv[0].x = mv[1].x = mb->mv[0].top.x;
+ mv[0].y = mv[1].y = mb->mv[0].top.y;
+ mv[2].x = mv[3].x = mb->mv[1].top.x;
+ mv[2].y = mv[3].y = mb->mv[1].top.y;
- if (mb->mo_type == PIPE_MPEG12_MOTION_TYPE_FRAME) {
- mv[0].x = mv[1].x = mb->mv[0].top.x;
- mv[0].y = mv[1].y = mb->mv[0].top.y;
-
- } else {
- mv[0].x = mb->mv[0].top.x;
- mv[0].y = mb->mv[0].top.y - (mb->mv[0].top.y % 4);
-
- mv[1].x = mb->mv[0].bottom.x;
- mv[1].y = mb->mv[0].bottom.y - (mb->mv[0].bottom.y % 4);
-
- if (mb->mv[0].top.field_select) mv[0].y += 2;
- if (!mb->mv[0].bottom.field_select) mv[1].y -= 2;
- }
} else {
- mv[0].x = mv[0].y = mv[1].x = mv[1].y = 0x8000;
- }
+ mv[0].x = mb->mv[0].top.x;
+ mv[0].y = mb->mv[0].top.y - (mb->mv[0].top.y % 4);
- if (mb->mb_type == PIPE_MPEG12_MACROBLOCK_TYPE_BI ||
- mb->mb_type == PIPE_MPEG12_MACROBLOCK_TYPE_BKWD) {
+ mv[1].x = mb->mv[0].bottom.x;
+ mv[1].y = mb->mv[0].bottom.y - (mb->mv[0].bottom.y % 4);
- if (mb->mo_type == PIPE_MPEG12_MOTION_TYPE_FRAME) {
- mv[2].x = mv[3].x = mb->mv[1].top.x;
- mv[2].y = mv[3].y = mb->mv[1].top.y;
+ if (mb->mv[0].top.field_select) mv[0].y += 2;
+ if (!mb->mv[0].bottom.field_select) mv[1].y -= 2;
- } else {
- mv[2].x = mb->mv[1].top.x;
- mv[2].y = mb->mv[1].top.y - (mb->mv[1].top.y % 4);
+ mv[2].x = mb->mv[1].top.x;
+ mv[2].y = mb->mv[1].top.y - (mb->mv[1].top.y % 4);
- mv[3].x = mb->mv[1].bottom.x;
- mv[3].y = mb->mv[1].bottom.y - (mb->mv[1].bottom.y % 4);
+ mv[3].x = mb->mv[1].bottom.x;
+ mv[3].y = mb->mv[1].bottom.y - (mb->mv[1].bottom.y % 4);
- if (mb->mv[1].top.field_select) mv[2].y += 2;
- if (!mb->mv[1].bottom.field_select) mv[3].y -= 2;
- }
- } else {
- mv[2].x = mv[2].y = mv[3].x = mv[3].y = 0x8000;
+ if (mb->mv[1].top.field_select) mv[2].y += 2;
+ if (!mb->mv[1].bottom.field_select) mv[3].y -= 2;
}
}
@@ -279,29 +263,10 @@ vl_vb_add_block(struct vl_vertex_buffer *buffer, struct pipe_mpeg12_macroblock *
stream->eb[i][j][k] = !(mb->cbp & (*empty_block_mask)[i][j][k]);
stream->dct_type_field = mb->dct_type == PIPE_MPEG12_DCT_TYPE_FIELD;
- //stream->mo_type_frame = mb->mo_type == PIPE_MPEG12_MOTION_TYPE_FRAME;
- stream->mb_type_intra = mb->mb_type != PIPE_MPEG12_MACROBLOCK_TYPE_INTRA;
- switch (mb->mb_type) {
- case PIPE_MPEG12_MACROBLOCK_TYPE_FWD:
- stream->mv_wheights[0] = 255;
- stream->mv_wheights[1] = 0;
- break;
-
- case PIPE_MPEG12_MACROBLOCK_TYPE_BI:
- stream->mv_wheights[0] = 127;
- stream->mv_wheights[1] = 127;
- break;
-
- case PIPE_MPEG12_MACROBLOCK_TYPE_BKWD:
- stream->mv_wheights[0] = 0;
- stream->mv_wheights[1] = 255;
- break;
-
- default:
- stream->mv_wheights[0] = 0;
- stream->mv_wheights[1] = 0;
- }
+ stream->mb_type_intra = !mb->dct_intra;
+ stream->mv_wheights[0] = mb->mv[0].wheight;
+ stream->mv_wheights[1] = mb->mv[1].wheight;
get_motion_vectors(mb, stream->mv);
}
diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h
index c620472283d..72a27938847 100644
--- a/src/gallium/include/pipe/p_video_state.h
+++ b/src/gallium/include/pipe/p_video_state.h
@@ -50,16 +50,6 @@ enum pipe_mpeg12_picture_type
PIPE_MPEG12_PICTURE_TYPE_FRAME
};
-enum pipe_mpeg12_macroblock_type
-{
- PIPE_MPEG12_MACROBLOCK_TYPE_INTRA,
- PIPE_MPEG12_MACROBLOCK_TYPE_FWD,
- PIPE_MPEG12_MACROBLOCK_TYPE_BKWD,
- PIPE_MPEG12_MACROBLOCK_TYPE_BI,
-
- PIPE_MPEG12_MACROBLOCK_NUM_TYPES
-};
-
enum pipe_mpeg12_motion_type
{
PIPE_MPEG12_MOTION_TYPE_FIELD,
@@ -91,10 +81,11 @@ struct pipe_mpeg12_macroblock
unsigned mbx;
unsigned mby;
- enum pipe_mpeg12_macroblock_type mb_type;
enum pipe_mpeg12_motion_type mo_type;
+ bool dct_intra;
enum pipe_mpeg12_dct_type dct_type;
struct {
+ unsigned wheight:8;
struct pipe_mpeg12_motionvector top, bottom;
} mv[2];
unsigned cbp;
diff --git a/src/gallium/state_trackers/xorg/xvmc/surface.c b/src/gallium/state_trackers/xorg/xvmc/surface.c
index ba55d9ddb22..9585fffffc6 100644
--- a/src/gallium/state_trackers/xorg/xvmc/surface.c
+++ b/src/gallium/state_trackers/xorg/xvmc/surface.c
@@ -37,24 +37,6 @@
#include <util/u_math.h>
#include "xvmc_private.h"
-static enum pipe_mpeg12_macroblock_type TypeToPipe(int xvmc_mb_type)
-{
- if (xvmc_mb_type & XVMC_MB_TYPE_INTRA)
- return PIPE_MPEG12_MACROBLOCK_TYPE_INTRA;
- if ((xvmc_mb_type & (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD)) == XVMC_MB_TYPE_MOTION_FORWARD)
- return PIPE_MPEG12_MACROBLOCK_TYPE_FWD;
- if ((xvmc_mb_type & (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD)) == XVMC_MB_TYPE_MOTION_BACKWARD)
- return PIPE_MPEG12_MACROBLOCK_TYPE_BKWD;
- if ((xvmc_mb_type & (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD)) == (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD))
- return PIPE_MPEG12_MACROBLOCK_TYPE_BI;
-
- assert(0);
-
- XVMC_MSG(XVMC_ERR, "[XvMC] Unrecognized mb type 0x%08X.\n", xvmc_mb_type);
-
- return -1;
-}
-
static enum pipe_mpeg12_picture_type PictureToPipe(int xvmc_pic)
{
switch (xvmc_pic) {
@@ -73,21 +55,21 @@ static enum pipe_mpeg12_picture_type PictureToPipe(int xvmc_pic)
return -1;
}
-static enum pipe_mpeg12_motion_type MotionToPipe(int xvmc_motion_type, unsigned int xvmc_picture_structure)
+static enum pipe_mpeg12_motion_type MotionToPipe(int xvmc_motion_type, unsigned xvmc_picture_structure)
{
switch (xvmc_motion_type) {
- case XVMC_PREDICTION_FRAME:
- if (xvmc_picture_structure == XVMC_FRAME_PICTURE)
- return PIPE_MPEG12_MOTION_TYPE_FRAME;
- else
- return PIPE_MPEG12_MOTION_TYPE_16x8;
- break;
- case XVMC_PREDICTION_FIELD:
- return PIPE_MPEG12_MOTION_TYPE_FIELD;
- case XVMC_PREDICTION_DUAL_PRIME:
- return PIPE_MPEG12_MOTION_TYPE_DUALPRIME;
- default:
- assert(0);
+ case XVMC_PREDICTION_FRAME:
+ if (xvmc_picture_structure == XVMC_FRAME_PICTURE)
+ return PIPE_MPEG12_MOTION_TYPE_FRAME;
+ else
+ return PIPE_MPEG12_MOTION_TYPE_16x8;
+ break;
+
+ case XVMC_PREDICTION_FIELD:
+ return PIPE_MPEG12_MOTION_TYPE_FIELD;
+
+ case XVMC_PREDICTION_DUAL_PRIME:
+ return PIPE_MPEG12_MOTION_TYPE_DUALPRIME;
}
XVMC_MSG(XVMC_ERR, "[XvMC] Unrecognized motion type 0x%08X (with picture structure 0x%08X).\n", xvmc_motion_type, xvmc_picture_structure);
@@ -118,15 +100,39 @@ MacroBlocksToPipe(struct pipe_screen *screen,
mb->base.codec = PIPE_VIDEO_CODEC_MPEG12;
mb->mbx = xvmc_mb->x;
mb->mby = xvmc_mb->y;
- mb->mb_type = TypeToPipe(xvmc_mb->macroblock_type);
- if (mb->mb_type != PIPE_MPEG12_MACROBLOCK_TYPE_INTRA)
+
+ if (!xvmc_mb->macroblock_type & XVMC_MB_TYPE_INTRA)
mb->mo_type = MotionToPipe(xvmc_mb->motion_type, xvmc_picture_structure);
/* Get rid of Valgrind 'undefined' warnings */
else
mb->mo_type = -1;
+
+ mb->dct_intra = xvmc_mb->macroblock_type & XVMC_MB_TYPE_INTRA;
mb->dct_type = xvmc_mb->dct_type == XVMC_DCT_TYPE_FIELD ?
PIPE_MPEG12_DCT_TYPE_FIELD : PIPE_MPEG12_DCT_TYPE_FRAME;
+ switch (xvmc_mb->macroblock_type & (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD)) {
+ case XVMC_MB_TYPE_MOTION_FORWARD:
+ mb->mv[0].wheight = 255;
+ mb->mv[1].wheight = 0;
+ break;
+
+ case (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD):
+ mb->mv[0].wheight = 127;
+ mb->mv[1].wheight = 127;
+ break;
+
+ case XVMC_MB_TYPE_MOTION_BACKWARD:
+ mb->mv[0].wheight = 0;
+ mb->mv[1].wheight = 255;
+ break;
+
+ default:
+ mb->mv[0].wheight = 0;
+ mb->mv[1].wheight = 0;
+ break;
+ }
+
for (j = 0; j < 2; ++j) {
mb->mv[j].top.x = xvmc_mb->PMV[0][j][0];
mb->mv[j].top.y = xvmc_mb->PMV[0][j][1];