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