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.
21fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS 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
31f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#ifdef __cplusplus
32f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonextern "C" {
33f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#endif
34f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
3551ecb33c6b218af8e7c401a701b51f52331a1782Kai Wasserbäch#include "pipe/p_video_state.h"
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/**
44ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König * Gallium video decoder for a specific codec/profile
45d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König */
46d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstruct pipe_video_decoder
47d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König{
48ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   struct pipe_context *context;
49d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
50d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_video_profile profile;
51fcdf50f74befad8d89eb3f9cdfd88b82d1daa98cChristian König   enum pipe_video_entrypoint entrypoint;
52d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_video_chroma_format chroma_format;
53d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned width;
54d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned height;
5582e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange   unsigned max_references;
56e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
57e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   /**
58d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * destroy this video decoder
59f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton    */
60d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   void (*destroy)(struct pipe_video_decoder *decoder);
61ba0bff85307c9b107cf432da05b39fd4ab242579Christian König
62d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
631d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * start decoding of a new frame
641d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    */
658ea416f35de0c664ef47b71841756758f22d7faaChristian König   void (*begin_frame)(struct pipe_video_decoder *decoder,
668ea416f35de0c664ef47b71841756758f22d7faaChristian König                       struct pipe_video_buffer *target,
678ea416f35de0c664ef47b71841756758f22d7faaChristian König                       struct pipe_picture_desc *picture);
681d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
691d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   /**
70d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König    * decode a macroblock
712e6274fc3b123e7de695038054b5cbd20b11559aChristian König    */
72d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König   void (*decode_macroblock)(struct pipe_video_decoder *decoder,
738ea416f35de0c664ef47b71841756758f22d7faaChristian König                             struct pipe_video_buffer *target,
748ea416f35de0c664ef47b71841756758f22d7faaChristian König                             struct pipe_picture_desc *picture,
75d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König                             const struct pipe_macroblock *macroblocks,
76d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König                             unsigned num_macroblocks);
77b7acf83d523563cde613fe805bd8edaa02f64b53Christian König
783d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König   /**
79d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * decode a bitstream
803d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König    */
811d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   void (*decode_bitstream)(struct pipe_video_decoder *decoder,
828ea416f35de0c664ef47b71841756758f22d7faaChristian König                            struct pipe_video_buffer *target,
838ea416f35de0c664ef47b71841756758f22d7faaChristian König                            struct pipe_picture_desc *picture,
847ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König                            unsigned num_buffers,
857ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König                            const void * const *buffers,
867ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König                            const unsigned *sizes);
87d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
88d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
891d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * end decoding of the current frame
901d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    */
918ea416f35de0c664ef47b71841756758f22d7faaChristian König   void (*end_frame)(struct pipe_video_decoder *decoder,
928ea416f35de0c664ef47b71841756758f22d7faaChristian König                     struct pipe_video_buffer *target,
938ea416f35de0c664ef47b71841756758f22d7faaChristian König                     struct pipe_picture_desc *picture);
941d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
951d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   /**
961d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * flush any outstanding command buffers to the hardware
971d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König    * should be called before a video_buffer is acessed by the state tracker again
983d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König    */
991d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   void (*flush)(struct pipe_video_decoder *decoder);
100d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König};
101d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
102d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König/**
103d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König * output for decoding / input for displaying
104d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König */
105d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstruct pipe_video_buffer
106d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König{
1074e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   struct pipe_context *context;
108d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
109d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_format buffer_format;
110d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   enum pipe_video_chroma_format chroma_format;
111d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned width;
112d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned height;
1139af70c90dba9ed9902778883b675062fa0168b48Christian König   bool interlaced;
114ba0bff85307c9b107cf432da05b39fd4ab242579Christian König
1153d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König   /**
116d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * destroy this video buffer
1173d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König    */
118d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   void (*destroy)(struct pipe_video_buffer *buffer);
119ba0bff85307c9b107cf432da05b39fd4ab242579Christian König
120d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
121d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * get a individual sampler view for each plane
122d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    */
1233ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_sampler_view **(*get_sampler_view_planes)(struct pipe_video_buffer *buffer);
1243ea7e2713c836f23d59c4034385609e371a94c8dChristian König
1253ea7e2713c836f23d59c4034385609e371a94c8dChristian König   /**
1263ea7e2713c836f23d59c4034385609e371a94c8dChristian König    * get a individual sampler view for each component
1273ea7e2713c836f23d59c4034385609e371a94c8dChristian König    */
1283ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_sampler_view **(*get_sampler_view_components)(struct pipe_video_buffer *buffer);
129e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
130d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   /**
131d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    * get a individual surfaces for each plane
132d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König    */
133d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct pipe_surface **(*get_surfaces)(struct pipe_video_buffer *buffer);
1348c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1358c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   /*
1368c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    * auxiliary associated data
1378c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    */
1388c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   void *associated_data;
1398c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1408c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   /*
1418c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    * decoder where the associated data came from
1428c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    */
1438c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   struct pipe_video_decoder *decoder;
1448c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1458c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   /*
1468c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    * destroy the associated data
1478c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König    */
1488c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   void (*destroy_associated_data)(void *associated_data);
149e5f78a74f8294ee02015552db664dae1e7da9f47Christian König};
150e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
151f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#ifdef __cplusplus
152f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
153f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#endif
154f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
155f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#endif /* PIPE_VIDEO_CONTEXT_H */
156