#ifndef vl_mpeg12_decoder_h
#define vl_mpeg12_decoder_h
-#include <pipe/p_video_context.h>
+#include "pipe/p_video_decoder.h"
+#include "vl_mpeg12_bitstream.h"
+#include "vl_zscan.h"
#include "vl_idct.h"
-#include "vl_mpeg12_mc_renderer.h"
+#include "vl_mc.h"
#include "vl_vertex_buffers.h"
#include "vl_video_buffer.h"
struct vl_mpeg12_decoder
{
struct pipe_video_decoder base;
- struct pipe_context *pipe;
- const unsigned (*empty_block_mask)[3][2][2];
- unsigned nr_of_idct_render_targets;
+ unsigned chroma_width, chroma_height;
- enum pipe_format idct_source_format;
- enum pipe_format idct_intermediate_format;
- enum pipe_format mc_source_format;
+ unsigned blocks_per_line;
+ unsigned num_blocks;
+ unsigned width_in_macroblocks;
+
+ enum pipe_format zscan_source_format;
struct pipe_vertex_buffer quads;
- void *ves_eb[VL_MAX_PLANES];
- void *ves_mv[2];
+ struct pipe_vertex_buffer pos;
+
+ void *ves_ycbcr;
+ void *ves_mv;
+
+ void *sampler_ycbcr;
+
+ struct pipe_sampler_view *zscan_linear;
+ struct pipe_sampler_view *zscan_normal;
+ struct pipe_sampler_view *zscan_alternate;
+
+ struct pipe_video_buffer *idct_source;
+ struct pipe_video_buffer *mc_source;
+ struct vl_zscan zscan_y, zscan_c;
struct vl_idct idct_y, idct_c;
- struct vl_mpeg12_mc_renderer mc;
+ struct vl_mc mc_y, mc_c;
void *dsa;
- void *blend;
+
+ struct vl_mpeg12_buffer *current_buffer;
+ struct pipe_mpeg12_picture_desc picture_desc;
+ uint8_t intra_matrix[64];
+ uint8_t non_intra_matrix[64];
+ struct pipe_sampler_view *ref_frames[VL_MAX_REF_FRAMES][VL_MAX_PLANES];
+ struct pipe_surface *target_surfaces[VL_MAX_PLANES];
};
struct vl_mpeg12_buffer
{
- struct pipe_video_decode_buffer base;
-
struct vl_vertex_buffer vertex_stream;
- struct pipe_video_buffer *idct_source;
- struct pipe_video_buffer *idct_intermediate;
- struct pipe_video_buffer *mc_source;
+ unsigned block_num;
+ unsigned num_ycbcr_blocks[3];
- union
- {
- struct pipe_vertex_buffer all[2];
- struct {
- struct pipe_vertex_buffer quad, stream;
- } individual;
- } vertex_bufs;
+ struct pipe_sampler_view *zscan_source;
+ struct vl_mpg12_bs bs;
+ struct vl_zscan_buffer zscan[VL_MAX_PLANES];
struct vl_idct_buffer idct[VL_MAX_PLANES];
- struct vl_mpeg12_mc_buffer mc[VL_MAX_PLANES];
+ struct vl_mc_buffer mc[VL_MAX_PLANES];
+
+ struct pipe_transfer *tex_transfer;
+ short *texels;
- struct pipe_transfer *tex_transfer[VL_MAX_PLANES];
- short *texels[VL_MAX_PLANES];
+ struct vl_ycbcr_block *ycbcr_stream[VL_MAX_PLANES];
+ struct vl_motionvector *mv_stream[VL_MAX_REF_FRAMES];
};
-/* drivers can call this function in their pipe_video_context constructors and pass it
- an accelerated pipe_context along with suitable buffering modes, etc */
+/**
+ * creates a shader based mpeg12 decoder
+ */
struct pipe_video_decoder *
-vl_create_mpeg12_decoder(struct pipe_video_context *context,
- struct pipe_context *pipe,
+vl_create_mpeg12_decoder(struct pipe_context *pipe,
enum pipe_video_profile profile,
enum pipe_video_entrypoint entrypoint,
enum pipe_video_chroma_format chroma_format,
- unsigned width, unsigned height);
+ unsigned width, unsigned height, unsigned max_references);
#endif /* vl_mpeg12_decoder_h */