* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <X11/Xlibint.h>
-#include "pipe/p_video_decoder.h"
+#include "pipe/p_video_codec.h"
#include "pipe/p_video_state.h"
#include "pipe/p_state.h"
#include "util/u_inlines.h"
#include "util/u_memory.h"
#include "util/u_math.h"
-
-#include "vl_winsys.h"
+#include "vl/vl_winsys.h"
#include "xvmc_private.h"
assert(num_macroblocks);
for (; num_macroblocks > 0; --num_macroblocks) {
- mb->base.codec = PIPE_VIDEO_CODEC_MPEG12;
+ mb->base.codec = PIPE_VIDEO_FORMAT_MPEG12;
mb->x = xvmc_mb->x;
mb->y = xvmc_mb->y;
mb->macroblock_type = xvmc_mb->macroblock_type;
tmpl.buffer_format = pipe->screen->get_video_param
(
pipe->screen,
- PIPE_VIDEO_PROFILE_MPEG2_MAIN,
+ context_priv->decoder->profile,
+ context_priv->decoder->entrypoint,
PIPE_VIDEO_CAP_PREFERED_FORMAT
);
tmpl.chroma_format = context_priv->decoder->chroma_format;
tmpl.interlaced = pipe->screen->get_video_param
(
pipe->screen,
- PIPE_VIDEO_PROFILE_MPEG2_MAIN,
+ context_priv->decoder->profile,
+ context_priv->decoder->entrypoint,
PIPE_VIDEO_CAP_PREFERS_INTERLACED
);
surface_priv->video_buffer = pipe->create_video_buffer(pipe, &tmpl);
+ if (!surface_priv->video_buffer) {
+ FREE(surface_priv);
+ return BadAlloc;
+ }
surface_priv->context = context;
surface->surface_id = XAllocID(dpy);
)
{
struct pipe_mpeg12_macroblock mb[num_macroblocks];
- struct pipe_video_decoder *decoder;
+ struct pipe_video_codec *decoder;
struct pipe_mpeg12_picture_desc desc;
XvMCContextPrivate *context_priv;
struct pipe_context *pipe;
struct vl_compositor *compositor;
+ struct vl_compositor_state *cstate;
XvMCSurfacePrivate *surface_priv;
XvMCContextPrivate *context_priv;
XvMCSubpicturePrivate *subpicture_priv;
XvMCContext *context;
- struct pipe_video_rect src_rect = {srcx, srcy, srcw, srch};
- struct pipe_video_rect dst_rect = {destx, desty, destw, desth};
+ struct u_rect src_rect = {srcx, srcx + srcw, srcy, srcy + srch};
+ struct u_rect dst_rect = {destx, destx + destw, desty, desty + desth};
+
+ struct pipe_resource *tex;
+ struct pipe_surface surf_templ, *surf;
+ struct u_rect *dirty_area;
XVMC_MSG(XVMC_TRACE, "[XvMC] Displaying surface %p.\n", surface);
subpicture_priv = surface_priv->subpicture ? surface_priv->subpicture->privData : NULL;
pipe = context_priv->pipe;
compositor = &context_priv->compositor;
+ cstate = &context_priv->cstate;
- if (!context_priv->drawable_surface ||
- context_priv->dst_rect.x != dst_rect.x || context_priv->dst_rect.y != dst_rect.y ||
- context_priv->dst_rect.w != dst_rect.w || context_priv->dst_rect.h != dst_rect.h) {
+ tex = vl_screen_texture_from_drawable(context_priv->vscreen, drawable);
+ dirty_area = vl_screen_get_dirty_area(context_priv->vscreen);
- struct pipe_surface surf_templ;
- struct pipe_resource *tex = vl_screen_texture_from_drawable(
- context_priv->vscreen, drawable);
-
- pipe_surface_reference(&context_priv->drawable_surface, NULL);
-
- memset(&surf_templ, 0, sizeof(surf_templ));
- surf_templ.format = tex->format;
- surf_templ.usage = PIPE_BIND_RENDER_TARGET;
- context_priv->drawable_surface = pipe->create_surface(pipe, tex, &surf_templ);
- vl_compositor_reset_dirty_area(&context_priv->dirty_area);
- context_priv->dst_rect = dst_rect;
- }
+ memset(&surf_templ, 0, sizeof(surf_templ));
+ surf_templ.format = tex->format;
+ surf = pipe->create_surface(pipe, tex, &surf_templ);
- if (!context_priv->drawable_surface)
+ if (!surf)
return BadDrawable;
/*
context_priv->decoder->flush(context_priv->decoder);
- vl_compositor_clear_layers(compositor);
- vl_compositor_set_buffer_layer(compositor, 0, surface_priv->video_buffer,
+ vl_compositor_clear_layers(cstate);
+ vl_compositor_set_buffer_layer(cstate, compositor, 0, surface_priv->video_buffer,
&src_rect, NULL, VL_COMPOSITOR_WEAVE);
if (subpicture_priv) {
assert(subpicture_priv->surface == surface);
if (subpicture_priv->palette)
- vl_compositor_set_palette_layer(compositor, 1, subpicture_priv->sampler, subpicture_priv->palette,
+ vl_compositor_set_palette_layer(cstate, compositor, 1, subpicture_priv->sampler, subpicture_priv->palette,
&subpicture_priv->src_rect, &subpicture_priv->dst_rect, true);
else
- vl_compositor_set_rgba_layer(compositor, 1, subpicture_priv->sampler,
- &subpicture_priv->src_rect, &subpicture_priv->dst_rect);
+ vl_compositor_set_rgba_layer(cstate, compositor, 1, subpicture_priv->sampler,
+ &subpicture_priv->src_rect, &subpicture_priv->dst_rect, NULL);
surface_priv->subpicture = NULL;
subpicture_priv->surface = NULL;
// Workaround for r600g, there seems to be a bug in the fence refcounting code
pipe->screen->fence_reference(pipe->screen, &surface_priv->fence, NULL);
- vl_compositor_render(compositor, context_priv->drawable_surface, &dst_rect, NULL, &context_priv->dirty_area);
+ vl_compositor_set_layer_dst_area(cstate, 0, &dst_rect);
+ vl_compositor_set_layer_dst_area(cstate, 1, &dst_rect);
+ vl_compositor_render(cstate, compositor, surf, dirty_area, true);
- pipe->flush(pipe, &surface_priv->fence);
+ pipe->flush(pipe, &surface_priv->fence, 0);
XVMC_MSG(XVMC_TRACE, "[XvMC] Submitted surface %p for display. Pushing to front buffer.\n", surface);
pipe->screen->flush_frontbuffer
(
- pipe->screen, context_priv->drawable_surface->texture, 0, 0,
- vl_screen_get_private(context_priv->vscreen)
+ pipe->screen, tex, 0, 0,
+ vl_screen_get_private(context_priv->vscreen), NULL
);
if(dump_window == -1) {