1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/**************************************************************************
27965e2fc16853ae0ed0a9cde77346c25feb19b6eChristian König *
3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton.
4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved.
57965e2fc16853ae0ed0a9cde77346c25feb19b6eChristian König *
6fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Permission is hereby granted, free of charge, to any person obtaining a
7fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * copy of this software and associated documentation files (the
8fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * "Software"), to deal in the Software without restriction, including
9fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * without limitation the rights to use, copy, modify, merge, publish,
10fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * distribute, sub license, and/or sell copies of the Software, and to
11fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * permit persons to whom the Software is furnished to do so, subject to
12fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * the following conditions:
137965e2fc16853ae0ed0a9cde77346c25feb19b6eChristian König *
14fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * The above copyright notice and this permission notice (including the
15fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * next paragraph) shall be included in all copies or substantial portions
16fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * of the Software.
177965e2fc16853ae0ed0a9cde77346c25feb19b6eChristian König *
18fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257965e2fc16853ae0ed0a9cde77346c25feb19b6eChristian König *
26fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton **************************************************************************/
27fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton
28f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#ifndef PIPE_VIDEO_CONTEXT_H
29f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#define PIPE_VIDEO_CONTEXT_H
30f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
31373f118c6c750d717fd0727fc3fc191828714c6fEmil Velikov#include "pipe/p_video_state.h"
32373f118c6c750d717fd0727fc3fc191828714c6fEmil Velikov
33f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#ifdef __cplusplus
34f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonextern "C" {
35f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#endif
36f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
37f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstruct pipe_screen;
38f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstruct pipe_surface;
39f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstruct pipe_macroblock;
40f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstruct pipe_picture_desc;
41f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstruct pipe_fence_handle;
42f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
43f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton/**
44f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König * Gallium video codec for a specific format/profile
45d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König */
46f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian Königstruct pipe_video_codec
47d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König{
48ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   struct pipe_context *context;
49d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
50d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_video_profile profile;
514fca06a902e98fb16dc9ea5f4dd2d88f3883612aLeo Liu   unsigned level;
52fcdf50f74befad8d89eb3f9cdfd88b82d1daa98cChristian König   enum pipe_video_entrypoint entrypoint;
53d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_video_chroma_format chroma_format;
54d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned width;
55d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned height;
5682e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange   unsigned max_references;
5753e20b8b418cc85e13d70f41ce160e17847a5096Christian König   bool expect_chunked_decode;
58e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
59e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   /**
60d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * destroy this video decoder
61f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton    */
62f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   void (*destroy)(struct pipe_video_codec *codec);
63ba0bff85307c9b107cf432da05b39fd4ab242579Christian König
64d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
651d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * start decoding of a new frame
661d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    */
67f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   void (*begin_frame)(struct pipe_video_codec *codec,
688ea416f35de0c664ef47b71841756758f22d7faaChristian König                       struct pipe_video_buffer *target,
698ea416f35de0c664ef47b71841756758f22d7faaChristian König                       struct pipe_picture_desc *picture);
701d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
711d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   /**
72d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König    * decode a macroblock
732e6274fc3b123e7de695038054b5cbd20b11559aChristian König    */
74f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   void (*decode_macroblock)(struct pipe_video_codec *codec,
758ea416f35de0c664ef47b71841756758f22d7faaChristian König                             struct pipe_video_buffer *target,
768ea416f35de0c664ef47b71841756758f22d7faaChristian König                             struct pipe_picture_desc *picture,
77d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König                             const struct pipe_macroblock *macroblocks,
78d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König                             unsigned num_macroblocks);
79b7acf83d523563cde613fe805bd8edaa02f64b53Christian König
803d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König   /**
81d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * decode a bitstream
823d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König    */
83f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   void (*decode_bitstream)(struct pipe_video_codec *codec,
848ea416f35de0c664ef47b71841756758f22d7faaChristian König                            struct pipe_video_buffer *target,
858ea416f35de0c664ef47b71841756758f22d7faaChristian König                            struct pipe_picture_desc *picture,
867ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König                            unsigned num_buffers,
877ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König                            const void * const *buffers,
887ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König                            const unsigned *sizes);
89d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
90d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
91ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König    * encode to a bitstream
92ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König    */
93ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König   void (*encode_bitstream)(struct pipe_video_codec *codec,
94ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König                            struct pipe_video_buffer *source,
95ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König                            struct pipe_resource *destination,
96ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König                            void **feedback);
97ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König
98ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König   /**
991d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * end decoding of the current frame
1001d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    */
101f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   void (*end_frame)(struct pipe_video_codec *codec,
1028ea416f35de0c664ef47b71841756758f22d7faaChristian König                     struct pipe_video_buffer *target,
1038ea416f35de0c664ef47b71841756758f22d7faaChristian König                     struct pipe_picture_desc *picture);
1041d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
1051d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   /**
1061d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * flush any outstanding command buffers to the hardware
1071d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * should be called before a video_buffer is acessed by the state tracker again
1083d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König    */
109f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   void (*flush)(struct pipe_video_codec *codec);
110ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König
111ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König   /**
112ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König    * get encoder feedback
113ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König    */
114ee978aee94d98fec669002eb5ef7ceb1f46683a9Christian König   void (*get_feedback)(struct pipe_video_codec *codec, void *feedback, unsigned *size);
115d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König};
116d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
117d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König/**
118d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König * output for decoding / input for displaying
119d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König */
120d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstruct pipe_video_buffer
121d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König{
1224e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   struct pipe_context *context;
123d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
124d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_format buffer_format;
125d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_video_chroma_format chroma_format;
126d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned width;
127d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned height;
1289af70c90dba9ed9902778883b675062fa0168b48Christian König   bool interlaced;
1291cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce   unsigned bind;
130ba0bff85307c9b107cf432da05b39fd4ab242579Christian König
1313d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König   /**
132d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * destroy this video buffer
1333d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König    */
134d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   void (*destroy)(struct pipe_video_buffer *buffer);
135ba0bff85307c9b107cf432da05b39fd4ab242579Christian König
136d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
13760a27ad122128145d28be37e9c0b0bc86a8e5181Giuseppe Bilotta    * get an individual sampler view for each plane
138d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    */
1393ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_sampler_view **(*get_sampler_view_planes)(struct pipe_video_buffer *buffer);
1403ea7e2713c836f23d59c4034385609e371a94c8dChristian König
1413ea7e2713c836f23d59c4034385609e371a94c8dChristian König   /**
14260a27ad122128145d28be37e9c0b0bc86a8e5181Giuseppe Bilotta    * get an individual sampler view for each component
1433ea7e2713c836f23d59c4034385609e371a94c8dChristian König    */
1443ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_sampler_view **(*get_sampler_view_components)(struct pipe_video_buffer *buffer);
145e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
146d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
14760a27ad122128145d28be37e9c0b0bc86a8e5181Giuseppe Bilotta    * get an individual surfaces for each plane
148d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    */
149d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct pipe_surface **(*get_surfaces)(struct pipe_video_buffer *buffer);
1508c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1518c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   /*
1528c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    * auxiliary associated data
1538c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    */
1548c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   void *associated_data;
1558c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1568c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   /*
157f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König    * codec where the associated data came from
1588c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    */
159f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   struct pipe_video_codec *codec;
1608c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1618c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   /*
1628c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    * destroy the associated data
1638c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    */
1648c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   void (*destroy_associated_data)(void *associated_data);
165e5f78a74f8294ee02015552db664dae1e7da9f47Christian König};
166e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
167f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#ifdef __cplusplus
168f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
169f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#endif
170f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
171f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#endif /* PIPE_VIDEO_CONTEXT_H */
172