g3dvl: Rework the decoder interface part 1/5
[mesa.git] / src / gallium / include / pipe / p_video_decoder.h
index f063d8f3a1b9495700bd5bc67f34794212a45044..ae071136baccb664f921393c82538a8dd13c7336 100644 (file)
@@ -59,75 +59,89 @@ struct pipe_video_decoder
    void (*destroy)(struct pipe_video_decoder *decoder);
 
    /**
-    * Creates a buffer as decoding input
+    * Creates a decoder buffer
     */
-   struct pipe_video_decode_buffer *(*create_buffer)(struct pipe_video_decoder *decoder);
+   void *(*create_buffer)(struct pipe_video_decoder *decoder);
 
    /**
-    * flush decoder buffer to video hardware
+    * Destroys a decoder buffer
     */
-   void (*flush_buffer)(struct pipe_video_decode_buffer *decbuf,
-                        unsigned num_ycbcr_blocks[3],
-                        struct pipe_video_buffer *ref_frames[2],
-                        struct pipe_video_buffer *dst);
-};
-
-/**
- * input buffer for a decoder
- */
-struct pipe_video_decode_buffer
-{
-   struct pipe_video_decoder *decoder;
+   void (*destroy_buffer)(struct pipe_video_decoder *decoder, void *buffer);
 
    /**
-    * destroy this decode buffer
+    * set the current decoder buffer
     */
-   void (*destroy)(struct pipe_video_decode_buffer *decbuf);
+   void (*set_decode_buffer)(struct pipe_video_decoder *decoder, void *buffer);
 
    /**
-    * map the input buffer into memory before starting decoding
+    * set the picture parameters for the next frame
+    * only used for bitstream decoding
     */
-   void (*begin_frame)(struct pipe_video_decode_buffer *decbuf);
+   void (*set_picture_parameters)(struct pipe_video_decoder *decoder,
+                                  struct pipe_picture_desc *picture);
 
    /**
     * set the quantification matrixes
     */
-   void (*set_quant_matrix)(struct pipe_video_decode_buffer *decbuf,
+   void (*set_quant_matrix)(struct pipe_video_decoder *decoder,
                             const uint8_t intra_matrix[64],
                             const uint8_t non_intra_matrix[64]);
 
+   /**
+    * set target where video data is decoded to
+    */
+   void (*set_decode_target)(struct pipe_video_decoder *decoder,
+                             struct pipe_video_buffer *target);
+
+   /**
+    * set reference frames for motion compensation
+    */
+   void (*set_reference_frames)(struct pipe_video_decoder *decoder,
+                                struct pipe_video_buffer **ref_frames,
+                                unsigned num_ref_frames);
+
+   /**
+    * start decoding of a new frame
+    */
+   void (*begin_frame)(struct pipe_video_decoder *decoder);
+
    /**
     * get the pointer where to put the ycbcr blocks of a component
     */
-   struct pipe_ycbcr_block *(*get_ycbcr_stream)(struct pipe_video_decode_buffer *, int component);
+   struct pipe_ycbcr_block *(*get_ycbcr_stream)(struct pipe_video_decoder *decoder, int component);
 
    /**
     * get the pointer where to put the ycbcr dct block data of a component
     */
-   short *(*get_ycbcr_buffer)(struct pipe_video_decode_buffer *, int component);
+   short *(*get_ycbcr_buffer)(struct pipe_video_decoder *decoder, int component);
 
    /**
     * get the stride of the mv buffer
     */
-   unsigned (*get_mv_stream_stride)(struct pipe_video_decode_buffer *decbuf);
+   unsigned (*get_mv_stream_stride)(struct pipe_video_decoder *decoder);
 
    /**
     * get the pointer where to put the motion vectors of a ref frame
     */
-   struct pipe_motionvector *(*get_mv_stream)(struct pipe_video_decode_buffer *decbuf, int ref_frame);
+   struct pipe_motionvector *(*get_mv_stream)(struct pipe_video_decoder *decoder, int ref_frame);
 
    /**
     * decode a bitstream
     */
-   void (*decode_bitstream)(struct pipe_video_decode_buffer *decbuf,
+   void (*decode_bitstream)(struct pipe_video_decoder *decoder,
                             unsigned num_bytes, const void *data,
-                            struct pipe_picture_desc *picture,
                             unsigned num_ycbcr_blocks[3]);
 
    /**
-    * unmap decoder buffer before flushing
+    * end decoding of the current frame
+    */
+   void (*end_frame)(struct pipe_video_decoder *decoder, unsigned num_ycbcr_blocks[3]);
+
+   /**
+    * flush any outstanding command buffers to the hardware
+    * should be called before a video_buffer is acessed by the state tracker again
     */
-   void (*end_frame)(struct pipe_video_decode_buffer *decbuf);
+   void (*flush)(struct pipe_video_decoder *decoder);
 };
 
 /**