1fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin/*
2fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * Copyright 2013 Ilia Mirkin
3fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin *
4fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * Permission is hereby granted, free of charge, to any person obtaining a
5fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * copy of this software and associated documentation files (the "Software"),
6fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * to deal in the Software without restriction, including without limitation
7fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * and/or sell copies of the Software, and to permit persons to whom the
9fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * Software is furnished to do so, subject to the following conditions:
10fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin *
11fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * The above copyright notice and this permission notice shall be included in
12fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * all copies or substantial portions of the Software.
13fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin *
14fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * OTHER DEALINGS IN THE SOFTWARE.
21fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin */
22fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
23fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#ifndef NV84_VIDEO_H_
24fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#define NV84_VIDEO_H_
25fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
26fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#include "vl/vl_decoder.h"
27fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#include "vl/vl_video_buffer.h"
28fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#include "vl/vl_types.h"
29fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
30fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#include "vl/vl_mpeg12_bitstream.h"
31fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
32fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#include "util/u_video.h"
33fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
345eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv50/nv50_context.h"
35fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
36a2061eea0f89b44c816e6c7570b983e8cfda41cdIlia Mirkin/* These are expected to be on their own pushbufs */
37a2061eea0f89b44c816e6c7570b983e8cfda41cdIlia Mirkin#define SUBC_BSP(m) 2, (m)
38a2061eea0f89b44c816e6c7570b983e8cfda41cdIlia Mirkin#define SUBC_VP(m) 2, (m)
39a2061eea0f89b44c816e6c7570b983e8cfda41cdIlia Mirkin
40fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinunion pipe_desc {
41fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_picture_desc *base;
42fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_mpeg12_picture_desc *mpeg12;
43fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_mpeg4_picture_desc *mpeg4;
44fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_vc1_picture_desc *vc1;
45fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_h264_picture_desc *h264;
46fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin};
47fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
48fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinstruct nv84_video_buffer {
49fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_video_buffer base;
50fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_resource *resources[VL_NUM_COMPONENTS];
51fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS];
52fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS];
53fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2];
54fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
55fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *interlaced, *full;
56fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   int mvidx;
57fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   unsigned frame_num, frame_num_max;
58fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin};
59fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
60fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinstruct nv84_decoder {
61f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   struct pipe_video_codec base;
62fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_client *client;
63fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_object *bsp_channel, *vp_channel, *bsp, *vp;
64fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_pushbuf *bsp_pushbuf, *vp_pushbuf;
65fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bufctx *bsp_bufctx, *vp_bufctx;
66fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
67fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *bsp_fw, *bsp_data;
68fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *vp_fw, *vp_data;
69fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *mbring, *vpring;
70fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
71fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /*
72fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin    * states:
73fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin    *  0: init
74fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin    *  1: vpring/mbring cleared, bsp is ready
75fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin    *  2: bsp is done, vp is ready
76fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin    * and then vp it back to 1
77fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin    */
78fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *fence;
79fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
80fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *bitstream;
81fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *vp_params;
82fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
83fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   size_t vp_fw2_offset;
84fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
85fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   unsigned frame_mbs, frame_size;
86fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /* VPRING layout:
87fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin        RESIDUAL
88fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin        CTRL
89fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin        DEBLOCK
90fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin        0x1000
91fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   */
92fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   unsigned vpring_deblock, vpring_residual, vpring_ctrl;
93fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
94fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
95fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct vl_mpg12_bs *mpeg12_bs;
96fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
97fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_bo *mpeg12_bo;
98fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   void *mpeg12_mb_info;
99fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   uint16_t *mpeg12_data;
100fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   const int *zscan;
101fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   uint8_t mpeg12_intra_matrix[64];
102fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   uint8_t mpeg12_non_intra_matrix[64];
103fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin};
104fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
105a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t mb(uint32_t coord)
106fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin{
107fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   return (coord + 0xf)>>4;
108fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin}
109fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
110a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t mb_half(uint32_t coord)
111fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin{
112fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   return (coord + 0x1f)>>5;
113fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin}
114fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
115fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinint
116fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinnv84_decoder_bsp(struct nv84_decoder *dec,
117fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 struct pipe_h264_picture_desc *desc,
118fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 unsigned num_buffers,
119fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 const void *const *data,
120fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 const unsigned *num_bytes,
121fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 struct nv84_video_buffer *dest);
122fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
123fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinvoid
124fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinnv84_decoder_vp_h264(struct nv84_decoder *dec,
125fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                     struct pipe_h264_picture_desc *desc,
126fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                     struct nv84_video_buffer *dest);
127fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
128fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinvoid
129fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinnv84_decoder_vp_mpeg12_mb(struct nv84_decoder *dec,
130fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                          struct pipe_mpeg12_picture_desc *desc,
131fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                          const struct pipe_mpeg12_macroblock *mb);
132fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
133fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinvoid
134fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinnv84_decoder_vp_mpeg12(struct nv84_decoder *dec,
135fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                       struct pipe_mpeg12_picture_desc *desc,
136fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                       struct nv84_video_buffer *dest);
137fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
138fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin#endif
139