[g3dvl] give mv their own vertex buffer back

This commit is contained in:
Christian König
2011-04-17 18:53:22 +02:00
parent 0a2310b375
commit b8a6e0e6fc
10 changed files with 253 additions and 158 deletions
+3
View File
@@ -35,4 +35,7 @@
#define BLOCK_WIDTH 8
#define BLOCK_HEIGHT 8
#define VL_MAX_PLANES 3
#define VL_MAX_REF_FRAMES 2
#endif
+7 -18
View File
@@ -612,17 +612,12 @@ prepare_pipe_4_rendering(struct vl_mc_buffer *buffer)
}
void
vl_mc_render_ref(struct vl_mc_buffer *buffer, struct pipe_sampler_view *ref,
unsigned not_empty_start_instance, unsigned not_empty_num_instances,
unsigned empty_start_instance, unsigned empty_num_instances)
vl_mc_render_ref(struct vl_mc_buffer *buffer, struct pipe_sampler_view *ref)
{
struct vl_mc *renderer;
assert(buffer && ref);
if (not_empty_num_instances == 0 && empty_num_instances == 0)
return;
prepare_pipe_4_rendering(buffer);
renderer = buffer->renderer;
@@ -633,24 +628,19 @@ vl_mc_render_ref(struct vl_mc_buffer *buffer, struct pipe_sampler_view *ref,
renderer->pipe->set_fragment_sampler_views(renderer->pipe, 1, &ref);
renderer->pipe->bind_fragment_sampler_states(renderer->pipe, 1, &renderer->sampler_ref);
if (not_empty_num_instances > 0)
util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4,
not_empty_start_instance, not_empty_num_instances);
if (empty_num_instances > 0)
util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4,
empty_start_instance, empty_num_instances);
util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4, 0,
renderer->buffer_width / MACROBLOCK_WIDTH *
renderer->buffer_height / MACROBLOCK_HEIGHT);
}
void
vl_mc_render_ycbcr(struct vl_mc_buffer *buffer,
unsigned not_empty_start_instance, unsigned not_empty_num_instances)
vl_mc_render_ycbcr(struct vl_mc_buffer *buffer, unsigned num_instances)
{
struct vl_mc *renderer;
assert(buffer);
if (not_empty_num_instances == 0)
if (num_instances == 0)
return;
prepare_pipe_4_rendering(buffer);
@@ -663,6 +653,5 @@ vl_mc_render_ycbcr(struct vl_mc_buffer *buffer,
renderer->pipe->set_fragment_sampler_views(renderer->pipe, 1, &buffer->source);
renderer->pipe->bind_fragment_sampler_states(renderer->pipe, 1, &renderer->sampler_ycbcr);
util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4,
not_empty_start_instance, not_empty_num_instances);
util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4, 0, num_instances);
}
+2 -5
View File
@@ -75,11 +75,8 @@ void vl_mc_cleanup_buffer(struct vl_mc_buffer *buffer);
void vl_mc_set_surface(struct vl_mc_buffer *buffer, struct pipe_surface *surface);
void vl_mc_render_ref(struct vl_mc_buffer *buffer, struct pipe_sampler_view *ref,
unsigned not_empty_start_instance, unsigned not_empty_num_instances,
unsigned empty_start_instance, unsigned empty_num_instances);
void vl_mc_render_ref(struct vl_mc_buffer *buffer, struct pipe_sampler_view *ref);
void vl_mc_render_ycbcr(struct vl_mc_buffer *buffer,
unsigned not_empty_start_instance, unsigned not_empty_num_instances);
void vl_mc_render_ycbcr(struct vl_mc_buffer *buffer, unsigned num_instances);
#endif /* vl_mc_h */
+36 -26
View File
@@ -293,6 +293,7 @@ vl_mpeg12_destroy(struct pipe_video_decoder *decoder)
dec->pipe->delete_vertex_elements_state(dec->pipe, dec->ves_mv[i]);
pipe_resource_reference(&dec->quads.buffer, NULL);
pipe_resource_reference(&dec->pos.buffer, NULL);
FREE(dec);
}
@@ -389,15 +390,9 @@ vl_mpeg12_create_buffer(struct pipe_video_decoder *decoder)
buffer->base.add_macroblocks = vl_mpeg12_buffer_add_macroblocks;
buffer->base.unmap = vl_mpeg12_buffer_unmap;
buffer->vertex_bufs.individual.quad.stride = dec->quads.stride;
buffer->vertex_bufs.individual.quad.buffer_offset = dec->quads.buffer_offset;
pipe_resource_reference(&buffer->vertex_bufs.individual.quad.buffer, dec->quads.buffer);
buffer->vertex_bufs.individual.stream = vl_vb_init(&buffer->vertex_stream, dec->pipe,
dec->base.width / MACROBLOCK_WIDTH *
dec->base.height / MACROBLOCK_HEIGHT);
if (!buffer->vertex_bufs.individual.stream.buffer)
goto error_vertex_stream;
vl_vb_init(&buffer->vertex_stream, dec->pipe,
dec->base.width / MACROBLOCK_WIDTH,
dec->base.height / MACROBLOCK_HEIGHT);
formats[0] = formats[1] = formats[2] =dec->mc_source_format;
buffer->mc_source = vl_video_buffer_init(dec->base.context, dec->pipe,
@@ -461,7 +456,9 @@ vl_mpeg12_decoder_flush_buffer(struct pipe_video_decode_buffer *buffer,
struct pipe_sampler_view **sv[2];
struct pipe_surface **surfaces;
unsigned ne_start, ne_num, e_start, e_num;
struct pipe_vertex_buffer vb[3];
unsigned num_instances;
unsigned i, j;
assert(buf);
@@ -474,9 +471,10 @@ vl_mpeg12_decoder_flush_buffer(struct pipe_video_decode_buffer *buffer,
surfaces = dst->get_surfaces(dst);
vl_vb_restart(&buf->vertex_stream, &ne_start, &ne_num, &e_start, &e_num);
num_instances = vl_vb_restart(&buf->vertex_stream);
dec->pipe->set_vertex_buffers(dec->pipe, 2, buf->vertex_bufs.all);
vb[0] = dec->quads;
vb[1] = dec->pos;
for (i = 0; i < VL_MAX_PLANES; ++i) {
vl_mc_set_surface(&buf->mc[i], surfaces[i]);
@@ -484,18 +482,25 @@ vl_mpeg12_decoder_flush_buffer(struct pipe_video_decode_buffer *buffer,
for (j = 0; j < 2; ++j) {
if (sv[j] == NULL) continue;
vb[2] = vl_vb_get_mv(&buf->vertex_stream, j);;
dec->pipe->set_vertex_buffers(dec->pipe, 3, vb);
dec->pipe->bind_vertex_elements_state(dec->pipe, dec->ves_mv[j]);
vl_mc_render_ref(&buf->mc[i], sv[j][i], ne_start, ne_num, e_start, e_num);
vl_mc_render_ref(&buf->mc[i], sv[j][i]);
}
dec->pipe->bind_vertex_elements_state(dec->pipe, dec->ves_eb[i]);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
vl_idct_flush(i == 0 ? &dec->idct_y : &dec->idct_c, &buf->idct[i], ne_num);
vl_mc_render_ycbcr(&buf->mc[i], ne_start, ne_num);
}
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream);
dec->pipe->set_vertex_buffers(dec->pipe, 2, vb);
for (i = 0; i < VL_MAX_PLANES; ++i) {
dec->pipe->bind_vertex_elements_state(dec->pipe, dec->ves_eb[i]);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
vl_idct_flush(i == 0 ? &dec->idct_y : &dec->idct_c, &buf->idct[i], num_instances);
vl_mc_render_ycbcr(&buf->mc[i], num_instances);
}
dec->pipe->flush(dec->pipe, fence);
}
@@ -503,11 +508,10 @@ static void
vl_mpeg12_decoder_clear_buffer(struct pipe_video_decode_buffer *buffer)
{
struct vl_mpeg12_buffer *buf = (struct vl_mpeg12_buffer *)buffer;
unsigned ne_start, ne_num, e_start, e_num;
assert(buf);
vl_vb_restart(&buf->vertex_stream, &ne_start, &ne_num, &e_start, &e_num);
vl_vb_restart(&buf->vertex_stream);
}
static bool
@@ -691,18 +695,24 @@ vl_create_mpeg12_decoder(struct pipe_video_context *context,
dec->base.flush_buffer = vl_mpeg12_decoder_flush_buffer;
dec->base.clear_buffer = vl_mpeg12_decoder_clear_buffer;
dec->base.width = align(width, MACROBLOCK_WIDTH);
dec->base.height = align(height, MACROBLOCK_HEIGHT);
dec->pipe = pipe;
dec->quads = vl_vb_upload_quads(dec->pipe, 2, 2);
dec->pos = vl_vb_upload_pos(
dec->pipe,
dec->base.width / MACROBLOCK_WIDTH,
dec->base.height / MACROBLOCK_HEIGHT
);
for (i = 0; i < VL_MAX_PLANES; ++i)
dec->ves_eb[i] = vl_vb_get_ves_eb(dec->pipe, i);
for (i = 0; i < 2; ++i)
dec->ves_mv[i] = vl_vb_get_ves_mv(dec->pipe, i);
dec->base.width = align(width, MACROBLOCK_WIDTH);
dec->base.height = align(height, MACROBLOCK_HEIGHT);
/* TODO: Implement 422, 444 */
assert(dec->base.chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420);
dec->empty_block_mask = &const_empty_block_mask_420;
+2 -8
View File
@@ -52,6 +52,8 @@ struct vl_mpeg12_decoder
enum pipe_format mc_source_format;
struct pipe_vertex_buffer quads;
struct pipe_vertex_buffer pos;
void *ves_eb[VL_MAX_PLANES];
void *ves_mv[2];
@@ -71,14 +73,6 @@ struct vl_mpeg12_buffer
struct pipe_video_buffer *idct_intermediate;
struct pipe_video_buffer *mc_source;
union
{
struct pipe_vertex_buffer all[2];
struct {
struct pipe_vertex_buffer quad, stream;
} individual;
} vertex_bufs;
struct vl_idct_buffer idct[VL_MAX_PLANES];
struct vl_mc_buffer mc[VL_MAX_PLANES];
+164 -72
View File
@@ -37,7 +37,11 @@ struct vl_vertex_stream
uint8_t dct_type_field;
uint8_t dummy[2];
uint8_t eb[3][2][2];
struct vertex4s mv[4];
};
struct vl_mv_vertex_stream
{
struct vertex4s mv[2];
};
/* vertices for a quad covering a block */
@@ -96,6 +100,52 @@ vl_vb_upload_quads(struct pipe_context *pipe, unsigned blocks_x, unsigned blocks
return quad;
}
struct pipe_vertex_buffer
vl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height)
{
struct pipe_vertex_buffer pos;
struct pipe_transfer *buf_transfer;
struct vertex2s *v;
unsigned x, y;
assert(pipe);
/* create buffer */
pos.stride = sizeof(struct vertex2s);
pos.buffer_offset = 0;
pos.buffer = pipe_buffer_create
(
pipe->screen,
PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STATIC,
sizeof(struct vertex2s) * width * height
);
if(!pos.buffer)
return pos;
/* and fill it */
v = pipe_buffer_map
(
pipe,
pos.buffer,
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
&buf_transfer
);
for ( y = 0; y < height; ++y) {
for ( x = 0; x < width; ++x, ++v) {
v->x = x;
v->y = y;
}
}
pipe_buffer_unmap(pipe, buf_transfer);
return pos;
}
static struct pipe_vertex_element
vl_vb_get_quad_vertex_element(void)
{
@@ -159,50 +209,83 @@ vl_vb_get_ves_mv(struct pipe_context *pipe, int motionvector)
{
struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS];
assert(pipe);
memset(&vertex_elems, 0, sizeof(vertex_elems));
vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element();
assert(pipe);
/* Position element */
vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R16G16_SSCALED;
vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 1, 1);
/* motion vector TOP element */
vertex_elems[VS_I_MV_TOP].src_offset = offsetof(struct vl_vertex_stream, mv[motionvector * 2]);
vertex_elems[VS_I_MV_TOP].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED;
/* motion vector BOTTOM element */
vertex_elems[VS_I_MV_BOTTOM].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED;
vl_vb_element_helper(&vertex_elems[VS_I_VPOS], NUM_VS_INPUTS - 1, 1);
vl_vb_element_helper(&vertex_elems[VS_I_MV_TOP], 2, 2);
return pipe->create_vertex_elements_state(pipe, NUM_VS_INPUTS, vertex_elems);
}
void
vl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe, unsigned width, unsigned height)
{
unsigned i;
assert(buffer);
buffer->width = width;
buffer->height = height;
buffer->num_instances = 0;
buffer->resource = pipe_buffer_create
(
pipe->screen,
PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM,
sizeof(struct vl_vertex_stream) * width * height
);
for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {
buffer->mv[i].resource = pipe_buffer_create
(
pipe->screen,
PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM,
sizeof(struct vl_mv_vertex_stream) * width * height
);
}
vl_vb_map(buffer, pipe);
}
struct pipe_vertex_buffer
vl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe, unsigned size)
vl_vb_get_ycbcr(struct vl_vertex_buffer *buffer)
{
struct pipe_vertex_buffer buf;
assert(buffer);
buffer->size = size;
buffer->num_not_empty = 0;
buffer->num_empty = 0;
buf.stride = sizeof(struct vl_vertex_stream);
buf.buffer_offset = 0;
buf.buffer = pipe_buffer_create
(
pipe->screen,
PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM,
sizeof(struct vl_vertex_stream) * size
);
buf.buffer = buffer->resource;
pipe_resource_reference(&buffer->resource, buf.buffer);
return buf;
}
vl_vb_map(buffer, pipe);
struct pipe_vertex_buffer
vl_vb_get_mv(struct vl_vertex_buffer *buffer, int motionvector)
{
struct pipe_vertex_buffer buf;
assert(buffer);
buf.stride = sizeof(struct vl_mv_vertex_stream);
buf.buffer_offset = 0;
buf.buffer = buffer->mv[motionvector].resource;
return buf;
}
@@ -210,110 +293,119 @@ vl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe, unsigned
void
vl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe)
{
unsigned i;
assert(buffer && pipe);
buffer->start = pipe_buffer_map
buffer->buffer = pipe_buffer_map
(
pipe,
buffer->resource,
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
&buffer->transfer
);
buffer->end = buffer->start + buffer->resource->width0 / sizeof(struct vl_vertex_stream);
for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {
buffer->mv[i].vertex_stream = pipe_buffer_map
(
pipe,
buffer->mv[i].resource,
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
&buffer->mv[i].transfer
);
}
}
static void
get_motion_vectors(struct pipe_mpeg12_macroblock *mb, struct vertex4s mv[4])
get_motion_vectors(enum pipe_mpeg12_motion_type mo_type, struct pipe_motionvector *src, struct vertex4s dst[2])
{
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[0].z = mv[1].z = 0;
mv[2].x = mv[3].x = mb->mv[1].top.x;
mv[2].y = mv[3].y = mb->mv[1].top.y;
mv[2].z = mv[3].z = 0;
if (mo_type == PIPE_MPEG12_MOTION_TYPE_FRAME) {
dst[0].x = dst[1].x = src->top.x;
dst[0].y = dst[1].y = src->top.y;
dst[0].z = dst[1].z = 0;
} else {
mv[0].x = mb->mv[0].top.x;
mv[0].y = mb->mv[0].top.y;
mv[0].z = mb->mv[0].top.field_select ? 3 : 1;
dst[0].x = src->top.x;
dst[0].y = src->top.y;
dst[0].z = src->top.field_select ? 3 : 1;
mv[1].x = mb->mv[0].bottom.x;
mv[1].y = mb->mv[0].bottom.y;
mv[1].z = mb->mv[0].bottom.field_select ? 3 : 1;
mv[2].x = mb->mv[1].top.x;
mv[2].y = mb->mv[1].top.y;
mv[2].z = mb->mv[1].top.field_select ? 3 : 1;
mv[3].x = mb->mv[1].bottom.x;
mv[3].y = mb->mv[1].bottom.y;
mv[3].z = mb->mv[1].bottom.field_select ? 3 : 1;
dst[1].x = src->bottom.x;
dst[1].y = src->bottom.y;
dst[1].z = src->bottom.field_select ? 3 : 1;
}
mv[0].w = mv[1].w = mb->mv[0].wheight;
mv[2].w = mv[3].w = mb->mv[1].wheight;
dst[0].w = src->top.wheight;
dst[1].w = src->bottom.wheight;
}
void
vl_vb_add_block(struct vl_vertex_buffer *buffer, struct pipe_mpeg12_macroblock *mb,
const unsigned (*empty_block_mask)[3][2][2])
{
struct vl_vertex_stream *stream;
unsigned i, j, k;
unsigned mv_pos;
assert(buffer);
assert(mb);
assert(buffer->num_not_empty + buffer->num_empty < buffer->size);
assert(buffer->num_instances < buffer->width * buffer->height);
if(mb->cbp)
stream = buffer->start + buffer->num_not_empty++;
else
stream = buffer->end - ++buffer->num_empty;
if(mb->cbp) {
struct vl_vertex_stream *stream;
stream = buffer->buffer + buffer->num_instances++;
stream->pos.x = mb->mbx;
stream->pos.y = mb->mby;
stream->pos.x = mb->mbx;
stream->pos.y = mb->mby;
for ( i = 0; i < 3; ++i)
for ( j = 0; j < 2; ++j)
for ( k = 0; k < 2; ++k)
stream->eb[i][j][k] = !(mb->cbp & (*empty_block_mask)[i][j][k]);
for ( i = 0; i < 3; ++i)
for ( j = 0; j < 2; ++j)
for ( k = 0; k < 2; ++k)
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->mb_type_intra = mb->dct_intra;
stream->dct_type_field = mb->dct_type == PIPE_MPEG12_DCT_TYPE_FIELD;
stream->mb_type_intra = mb->dct_intra;
}
get_motion_vectors(mb, stream->mv);
mv_pos = mb->mbx + mb->mby * buffer->width;
get_motion_vectors(mb->mo_type, &mb->mv[0], buffer->mv[0].vertex_stream[mv_pos].mv);
get_motion_vectors(mb->mo_type, &mb->mv[1], buffer->mv[1].vertex_stream[mv_pos].mv);
}
void
vl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe)
{
unsigned i;
assert(buffer && pipe);
pipe_buffer_unmap(pipe, buffer->transfer);
for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {
pipe_buffer_unmap(pipe, buffer->mv[i].transfer);
}
}
void
vl_vb_restart(struct vl_vertex_buffer *buffer,
unsigned *not_empty_start_instance, unsigned *not_empty_num_instances,
unsigned *empty_start_instance, unsigned *empty_num_instances)
unsigned
vl_vb_restart(struct vl_vertex_buffer *buffer)
{
unsigned num_instances;
assert(buffer);
*not_empty_start_instance = 0;
*not_empty_num_instances = buffer->num_not_empty;
*empty_start_instance = buffer->size - buffer->num_empty;
*empty_num_instances = buffer->num_empty;
buffer->num_not_empty = 0;
buffer->num_empty = 0;
num_instances = buffer->num_instances;
buffer->num_instances = 0;
return num_instances;
}
void
vl_vb_cleanup(struct vl_vertex_buffer *buffer)
{
unsigned i;
assert(buffer);
pipe_resource_reference(&buffer->resource, NULL);
for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {
pipe_resource_reference(&buffer->mv[i].resource, NULL);
}
}
+21 -11
View File
@@ -30,6 +30,7 @@
#include <pipe/p_state.h>
#include <pipe/p_video_state.h>
#include "vl_defines.h"
#include "vl_types.h"
/* vertex buffers act as a todo list
@@ -54,25 +55,36 @@ enum VS_INPUT
struct vl_vertex_buffer
{
unsigned size;
unsigned num_not_empty;
unsigned num_empty;
unsigned width, height;
unsigned num_instances;
struct pipe_resource *resource;
struct pipe_transfer *transfer;
struct vl_vertex_stream *start;
struct vl_vertex_stream *end;
struct vl_vertex_stream *buffer;
struct {
struct pipe_resource *resource;
struct pipe_transfer *transfer;
struct vl_mv_vertex_stream *vertex_stream;
} mv[VL_MAX_REF_FRAMES];
};
struct pipe_vertex_buffer vl_vb_upload_quads(struct pipe_context *pipe,
unsigned blocks_x, unsigned blocks_y);
struct pipe_vertex_buffer vl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height);
void *vl_vb_get_ves_eb(struct pipe_context *pipe, int component);
void *vl_vb_get_ves_mv(struct pipe_context *pipe, int motionvector);
struct pipe_vertex_buffer vl_vb_init(struct vl_vertex_buffer *buffer,
struct pipe_context *pipe,
unsigned max_blocks);
void vl_vb_init(struct vl_vertex_buffer *buffer,
struct pipe_context *pipe,
unsigned width, unsigned height);
struct pipe_vertex_buffer vl_vb_get_ycbcr(struct vl_vertex_buffer *buffer);
struct pipe_vertex_buffer vl_vb_get_mv(struct vl_vertex_buffer *buffer, int motionvector);
void vl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
@@ -81,9 +93,7 @@ void vl_vb_add_block(struct vl_vertex_buffer *buffer, struct pipe_mpeg12_macrobl
void vl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
void vl_vb_restart(struct vl_vertex_buffer *buffer,
unsigned *not_empty_start_instance, unsigned *not_empty_num_instances,
unsigned *empty_start_instance, unsigned *empty_num_instances);
unsigned vl_vb_restart(struct vl_vertex_buffer *buffer);
void vl_vb_cleanup(struct vl_vertex_buffer *buffer);
+1 -1
View File
@@ -31,7 +31,7 @@
#include <pipe/p_context.h>
#include <pipe/p_video_context.h>
#define VL_MAX_PLANES 3
#include "vl_defines.h"
/**
* implementation of a planar ycbcr buffer
+7 -7
View File
@@ -69,10 +69,13 @@ struct pipe_macroblock
enum pipe_video_codec codec;
};
struct pipe_mpeg12_motionvector
struct pipe_motionvector
{
signed x, y;
bool field_select;
struct {
signed x, y;
bool field_select;
unsigned wheight:8;
} top, bottom;
};
struct pipe_mpeg12_macroblock
@@ -84,10 +87,7 @@ struct pipe_mpeg12_macroblock
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];
struct pipe_motionvector mv[2];
unsigned cbp;
short *blocks;
};
+10 -10
View File
@@ -114,28 +114,28 @@ MacroBlocksToPipe(struct pipe_screen *screen,
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;
mb->mv[0].top.wheight = mb->mv[0].bottom.wheight = 255;
mb->mv[1].top.wheight = mb->mv[1].bottom.wheight = 0;
break;
case (XVMC_MB_TYPE_MOTION_FORWARD | XVMC_MB_TYPE_MOTION_BACKWARD):
mb->mv[0].wheight = 127;
mb->mv[1].wheight = 127;
mb->mv[0].top.wheight = mb->mv[0].bottom.wheight = 127;
mb->mv[1].top.wheight = mb->mv[1].bottom.wheight = 127;
break;
case XVMC_MB_TYPE_MOTION_BACKWARD:
mb->mv[0].wheight = 0;
mb->mv[1].wheight = 255;
mb->mv[0].top.wheight = mb->mv[0].bottom.wheight = 0;
mb->mv[1].top.wheight = mb->mv[1].bottom.wheight = 255;
break;
default:
/* workaround for xines xxmc video out plugin */
if (!(xvmc_mb->macroblock_type & ~XVMC_MB_TYPE_PATTERN)) {
mb->mv[0].wheight = 255;
mb->mv[1].wheight = 0;
mb->mv[0].top.wheight = mb->mv[0].bottom.wheight = 255;
mb->mv[1].top.wheight = mb->mv[1].bottom.wheight = 0;
} else {
mb->mv[0].wheight = 0;
mb->mv[1].wheight = 0;
mb->mv[0].top.wheight = mb->mv[0].bottom.wheight = 0;
mb->mv[1].top.wheight = mb->mv[1].bottom.wheight = 0;
}
break;
}