173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin/*
273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * Copyright 2011-2013 Maarten Lankhorst
373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin *
473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * Permission is hereby granted, free of charge, to any person obtaining a
573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * copy of this software and associated documentation files (the "Software"),
673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * to deal in the Software without restriction, including without limitation
773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * the rights to use, copy, modify, merge, publish, distribute, sublicense,
873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * and/or sell copies of the Software, and to permit persons to whom the
973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * Software is furnished to do so, subject to the following conditions:
1073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin *
1173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * The above copyright notice and this permission notice shall be included in
1273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * all copies or substantial portions of the Software.
1373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin *
1473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
1873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin * OTHER DEALINGS IN THE SOFTWARE.
2173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin */
2273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
2373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin#include "nouveau_vp3_video.h"
2473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
2573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstruct mpeg12_picparm_vp {
2667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t width; // 00 in mb units
2767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t height; // 02 in mb units
2867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
2967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t unk04; // 04 stride for Y?
3067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t unk08; // 08 stride for CbCr?
3167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
3267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t ofs[6]; // 1c..20 ofs
3367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t bucket_size; // 24
3467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t inter_ring_data_size; // 28
3567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t unk2c; // 2c
3667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t alternate_scan; // 2e
3767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t unk30; // 30 not seen set yet
3867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t picture_structure; // 32
3967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t pad2[3];
4067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t unk3a; // 3a set on I frame?
4167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
4267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t f_code[4]; // 3c
4367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t picture_coding_type; // 4c
4467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t intra_dc_precision; // 50
4567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t q_scale_type; // 54
4667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t top_field_first; // 58
4767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t full_pel_forward_vector; // 5c
4867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t full_pel_backward_vector; // 60
4967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t intra_quantizer_matrix[0x40]; // 64
5067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t non_intra_quantizer_matrix[0x40]; // a4
5173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin};
5273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
5373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstruct mpeg4_picparm_vp {
5467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t width; // 00 in normal units
5567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t height; // 04 in normal units
5667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t unk08; // stride 1
5767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t unk0c; // stride 2
5867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t ofs[6]; // 10..24 ofs
5967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t bucket_size; // 28
6067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pad1; // 2c, pad
6167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pad2; // 30
6267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t inter_ring_data_size; // 34
6367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
6467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t trd[2]; // 38, 3c
6567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t trb[2]; // 40, 44
6667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t u48; // XXX codec selection? Should test with different values of VdpDecoderProfile
6767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t f_code_fw; // 4c
6867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t f_code_bw; // 4e
6967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t interlaced; // 50
7067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
7167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t quant_type; // bool, written to 528
7267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t quarter_sample; // bool, written to 548
7367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t short_video_header; // bool, negated written to 528 shifted by 1
7467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t u54; // bool, written to 0x740
7567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t vop_coding_type; // 55
7667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t rounding_control; // 56
7767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t alternate_vertical_scan_flag; // 57 bool
7867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t top_field_first; // bool, written to vuc
7967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
8067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t pad4[3]; // 59, 5a, 5b, contains garbage on blob
8167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
8267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t intra[0x10]; // 5c
8367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t non_intra[0x10]; // 9c
8467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pad5[0x10]; // bc what does this do?
8567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   // udc..uff pad?
8673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin};
8773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
8873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin// Full version, with data pumped from BSP
8973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstruct vc1_picparm_vp {
9067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t bucket_size; // 00
9167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pad; // 04
9267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
9367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t inter_ring_data_size; // 08
9467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t unk0c; // stride 1
9567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t unk10; // stride 2
9667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t ofs[6]; // 14..28 ofs
9767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
9867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t width; // 2c
9967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t height; // 2e
10067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
10167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t profile; // 30 0 = simple, 1 = main, 2 = advanced
10267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t loopfilter; // 31 written into vuc
10367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t fastuvmc; // 32, written into vuc
10467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t dquant; // 33
10567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
10667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t overlap; // 34
10767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t quantizer; // 35
10867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t u36; // 36, bool
10967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t pad2; // 37, to align to 0x38
11073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin};
11173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
11273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstruct h264_picparm_vp { // 700..a00
11367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t width, height;
11467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t stride1, stride2; // 04 08
11567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t ofs[6]; // 0c..24 in-image offset
11667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
11767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t tmp_stride;
11867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t bucket_size; // 28 bucket size
11967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t inter_ring_data_size; // 2c
12067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
12167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned mb_adaptive_frame_field_flag : 1; // 0
12267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned direct_8x8_inference_flag : 1; // 1 0x02: into vuc ofs 56
12367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned weighted_pred_flag : 1; // 2 0x04
12467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned constrained_intra_pred_flag : 1; // 3 0x08: into vuc ofs 68
12567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned is_reference : 1; // 4
12667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned interlace : 1; // 5 field_pic_flag
12767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned bottom_field_flag : 1; // 6
12867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned second_field : 1; // 7 0x80: nfi yet
12967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
13067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   signed log2_max_frame_num_minus4 : 4; // 31 0..3
13167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned chroma_format_idc : 2; // 31 4..5
13267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned pic_order_cnt_type : 2; // 31 6..7
13367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   signed pic_init_qp_minus26 : 6; // 32 0..5
13467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   signed chroma_qp_index_offset : 5; // 32 6..10
13567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   signed second_chroma_qp_index_offset : 5; // 32 11..15
13667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
13767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned weighted_bipred_idc : 2; // 34 0..1
13867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned fifo_dec_index : 7; // 34 2..8
13967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned tmp_idx : 5; // 34 9..13
14067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned frame_number : 16; // 34 14..29
14167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned u34_3030 : 1; // 34 30..30 pp.u34[30:30]
14267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   unsigned u34_3131 : 1; // 34 31..31 pad?
14367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
14467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t field_order_cnt[2]; // 38, 3c
14567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
14667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   struct { // 40
14767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned fifo_idx : 7; // 00 0..6
14867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned tmp_idx : 5; // 00 7..11
14967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned top_is_reference : 1; // 00 12
15067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned bottom_is_reference : 1; // 00 13
15167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned is_long_term : 1; // 00 14
15267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned notseenyet : 1; // 00 15 pad?
15367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned field_pic_flag : 1; // 00 16
15467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned top_field_marking : 4; // 00 17..20
15567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned bottom_field_marking : 4; // 00 21..24
15667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      unsigned pad : 7; // 00 d25..31
15767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
15867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      uint32_t field_order_cnt[2]; // 04,08
15967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin      uint32_t frame_idx; // 0c
16067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   } refs[0x10];
16167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
16267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t m4x4[6][16]; // 140
16367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t m8x8[2][64]; // 1a0
16467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t u220; // 220 number of extra reorder_list to append?
16567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t u224[0x20]; // 224..244 reorder_list append ?
16667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t nfi244[0xb0]; // add some pad to make sure nulls are read
16773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin};
16873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
16973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstatic void
17073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_handle_references(struct nouveau_vp3_decoder *dec, struct nouveau_vp3_video_buffer *refs[16], unsigned seq, struct nouveau_vp3_video_buffer *target)
17173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
17249d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   unsigned i, idx, empty_spot = ~0;
17349d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst
17473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   for (i = 0; i < dec->base.max_references; ++i) {
17573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      if (!refs[i])
17673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin         continue;
17773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
17873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      idx = refs[i]->valid_ref;
17973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      //debug_printf("ref[%i] %p in slot %i\n", i, refs[i], idx);
18073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
18173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      if (dec->refs[idx].vidbuf != refs[i]) {
18273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin         debug_printf("%p is not a real ref\n", refs[i]);
18373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin         // FIXME: Maybe do m2mf copy here if a application really depends on it?
18473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin         continue;
18573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      }
18673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
18773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      assert(dec->refs[idx].vidbuf == refs[i]);
18873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      dec->refs[idx].last_used = seq;
18973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   }
19049d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst
19149d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   if (dec->refs[target->valid_ref].vidbuf == target) {
19249d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst      dec->refs[target->valid_ref].last_used = seq;
19373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      return;
19449d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   }
19573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
19673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   /* Try to find a real empty spot first, there should be one..
19773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin    */
19873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   for (i = 0; i < dec->base.max_references + 1; ++i) {
199a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      if (dec->refs[i].vidbuf == target) {
20073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin         empty_spot = i;
20149d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst         break;
202a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      } else if (!dec->refs[i].last_used) {
203a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         empty_spot = i;
204a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      } else if (empty_spot == ~0U && dec->refs[i].last_used != seq)
205a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         empty_spot = i;
20673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   }
207a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst
20873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(empty_spot < dec->base.max_references+1);
20973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   dec->refs[empty_spot].last_used = seq;
21049d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst//   debug_printf("Kicked %p to add %p to slot %i\n", dec->refs[empty_spot].vidbuf, target, empty_spot);
21173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   dec->refs[empty_spot].vidbuf = target;
21273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   dec->refs[empty_spot].decoded_bottom = dec->refs[empty_spot].decoded_top = 0;
21373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   target->valid_ref = empty_spot;
21473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
21573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
21673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstatic uint32_t
21773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_fill_picparm_mpeg12_vp(struct nouveau_vp3_decoder *dec,
21873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                   struct pipe_mpeg12_picture_desc *desc,
21973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                   struct nouveau_vp3_video_buffer *refs[16],
22073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                   unsigned *is_ref,
22173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                   char *map)
22273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
22373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   struct mpeg12_picparm_vp pic_vp_stub = {}, *pic_vp = &pic_vp_stub;
22473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   uint32_t i, ret = 0x01010, ring; // !async_shutdown << 16 | watchdog << 12 | irq_record << 4 | unk;
22573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(!(dec->base.width & 0xf));
22673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   *is_ref = desc->picture_coding_type <= 2;
22773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
22873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   if (dec->base.profile == PIPE_VIDEO_PROFILE_MPEG1)
22973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      pic_vp->picture_structure = 3;
23073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   else
23173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      pic_vp->picture_structure = desc->picture_structure;
23273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
23373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(desc->picture_structure != 4);
23473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   if (desc->picture_structure == 4) // Untested, but should work
23573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      ret |= 0x100;
23673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->width = mb(dec->base.width);
23773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->height = mb(dec->base.height);
23873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->unk08 = pic_vp->unk04 = (dec->base.width+0xf)&~0xf; // Stride
23973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
24073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_ycbcr_offsets(dec, &pic_vp->ofs[1], &pic_vp->ofs[3], &pic_vp->ofs[4]);
24173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->ofs[5] = pic_vp->ofs[3];
24273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->ofs[0] = pic_vp->ofs[2] = 0;
24373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_inter_sizes(dec, 1, &ring, &pic_vp->bucket_size, &pic_vp->inter_ring_data_size);
24473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
24573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->alternate_scan = desc->alternate_scan;
24673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->pad2[0] = pic_vp->pad2[1] = pic_vp->pad2[2] = 0;
24773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->unk30 = desc->picture_structure < 3 && (desc->picture_structure == 2 - desc->top_field_first);
24873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->unk3a = (desc->picture_coding_type == 1);
24973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   for (i = 0; i < 4; ++i)
25073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      pic_vp->f_code[i] = desc->f_code[i/2][i%2] + 1; // FU
25173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->picture_coding_type = desc->picture_coding_type;
25273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->intra_dc_precision = desc->intra_dc_precision;
25373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->q_scale_type = desc->q_scale_type;
25473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->top_field_first = desc->top_field_first;
25573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->full_pel_forward_vector = desc->full_pel_forward_vector;
25673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->full_pel_backward_vector = desc->full_pel_backward_vector;
25773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   memcpy(pic_vp->intra_quantizer_matrix, desc->intra_matrix, 0x40);
25873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   memcpy(pic_vp->non_intra_quantizer_matrix, desc->non_intra_matrix, 0x40);
25973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   memcpy(map, pic_vp, sizeof(*pic_vp));
26073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   refs[0] = (struct nouveau_vp3_video_buffer *)desc->ref[0];
26173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   refs[!!refs[0]] = (struct nouveau_vp3_video_buffer *)desc->ref[1];
26273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   return ret | (dec->base.profile != PIPE_VIDEO_PROFILE_MPEG1);
26373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
26473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
26573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstatic uint32_t
26673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_fill_picparm_mpeg4_vp(struct nouveau_vp3_decoder *dec,
26773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                  struct pipe_mpeg4_picture_desc *desc,
26873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                  struct nouveau_vp3_video_buffer *refs[16],
26973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                  unsigned *is_ref,
27073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                  char *map)
27173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
27273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   struct mpeg4_picparm_vp pic_vp_stub = {}, *pic_vp = &pic_vp_stub;
27373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   uint32_t ring, ret = 0x01014; // !async_shutdown << 16 | watchdog << 12 | irq_record << 4 | unk;
27473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   *is_ref = desc->vop_coding_type <= 1;
27573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
27673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->width = dec->base.width;
27773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->height = mb(dec->base.height)<<4;
27873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->unk0c = pic_vp->unk08 = mb(dec->base.width)<<4; // Stride
27973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
28073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_ycbcr_offsets(dec, &pic_vp->ofs[1], &pic_vp->ofs[3], &pic_vp->ofs[4]);
28173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->ofs[5] = pic_vp->ofs[3];
28273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->ofs[0] = pic_vp->ofs[2] = 0;
28373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->pad1 = pic_vp->pad2 = 0;
28473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_inter_sizes(dec, 1, &ring, &pic_vp->bucket_size, &pic_vp->inter_ring_data_size);
28573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
28673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->trd[0] = desc->trd[0];
28773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->trd[1] = desc->trd[1];
28873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->trb[0] = desc->trb[0];
28973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->trb[1] = desc->trb[1];
29073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->u48 = 0; // Codec?
29173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->pad1 = pic_vp->pad2 = 0;
29273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->f_code_fw = desc->vop_fcode_forward;
29373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->f_code_bw = desc->vop_fcode_backward;
29473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->interlaced = desc->interlaced;
29573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->quant_type = desc->quant_type;
29673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->quarter_sample = desc->quarter_sample;
29773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->short_video_header = desc->short_video_header;
29873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->u54 = 0;
29973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->vop_coding_type = desc->vop_coding_type;
30073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->rounding_control = desc->rounding_control;
30173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->alternate_vertical_scan_flag = desc->alternate_vertical_scan_flag;
30273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   pic_vp->top_field_first = desc->top_field_first;
30373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
30473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   memcpy(pic_vp->intra, desc->intra_matrix, 0x40);
30573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   memcpy(pic_vp->non_intra, desc->non_intra_matrix, 0x40);
30673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   memcpy(map, pic_vp, sizeof(*pic_vp));
30773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   refs[0] = (struct nouveau_vp3_video_buffer *)desc->ref[0];
30873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   refs[!!refs[0]] = (struct nouveau_vp3_video_buffer *)desc->ref[1];
30973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   return ret;
31073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
31173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
31273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstatic uint32_t
31373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec,
31473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                 const struct pipe_h264_picture_desc *d,
31573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                 struct nouveau_vp3_video_buffer *refs[16],
31673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                 unsigned *is_ref,
31773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                 char *map)
31873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
31973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   struct h264_picparm_vp stub_h = {}, *h = &stub_h;
32073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   unsigned ring, i, j = 0;
32173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(offsetof(struct h264_picparm_vp, u224) == 0x224);
32273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   *is_ref = d->is_reference;
32373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   dec->last_frame_num = d->frame_num;
32473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
32573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->width = mb(dec->base.width);
32673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->height = mb(dec->base.height);
32773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->stride1 = h->stride2 = mb(dec->base.width)*16;
32873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_ycbcr_offsets(dec, &h->ofs[1], &h->ofs[3], &h->ofs[4]);
32973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->ofs[5] = h->ofs[3];
33073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->ofs[0] = h->ofs[2] = 0;
3312cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin   h->tmp_stride = dec->tmp_stride >> 8;
3322cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin   assert(h->tmp_stride);
33349d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   nouveau_vp3_inter_sizes(dec, d->slice_count, &ring, &h->bucket_size, &h->inter_ring_data_size);
33473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
33573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->u220 = 0;
33678525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin   h->mb_adaptive_frame_field_flag = d->pps->sps->mb_adaptive_frame_field_flag;
33778525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin   h->direct_8x8_inference_flag = d->pps->sps->direct_8x8_inference_flag;
338925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->weighted_pred_flag = d->pps->weighted_pred_flag;
33978525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin   h->constrained_intra_pred_flag = d->pps->constrained_intra_pred_flag;
34073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->is_reference = d->is_reference;
34173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->interlace = d->field_pic_flag;
34273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->bottom_field_flag = d->bottom_field_flag;
34349d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   h->second_field = 0; // set in nouveau_vp3_fill_picparm_h264_vp_refs
34449d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst
345925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->log2_max_frame_num_minus4 = d->pps->sps->log2_max_frame_num_minus4;
3462cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin   h->chroma_format_idc = 1;
34773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
348925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->pic_order_cnt_type = d->pps->sps->pic_order_cnt_type;
349925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->pic_init_qp_minus26 = d->pps->pic_init_qp_minus26;
350925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->chroma_qp_index_offset = d->pps->chroma_qp_index_offset;
351925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->second_chroma_qp_index_offset = d->pps->second_chroma_qp_index_offset;
352925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   h->weighted_bipred_idc = d->pps->weighted_bipred_idc;
35373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->tmp_idx = 0; // set in h264_vp_refs below
35473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->fifo_dec_index = 0; // always set to 0 to be fifo compatible with other codecs
35573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->frame_number = d->frame_num;
35673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->u34_3030 = h->u34_3131 = 0;
35773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->field_order_cnt[0] = d->field_order_cnt[0];
35873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->field_order_cnt[1] = d->field_order_cnt[1];
359925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   memcpy(h->m4x4, d->pps->ScalingList4x4, sizeof(h->m4x4));
360925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   memcpy(h->m8x8, d->pps->ScalingList8x8, sizeof(h->m8x8));
36173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->u220 = 0;
36273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   for (i = 0; i < d->num_ref_frames; ++i) {
36373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      if (!d->ref[i])
36473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin         break;
36573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      refs[j] = (struct nouveau_vp3_video_buffer *)d->ref[i];
36673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].fifo_idx = j + 1;
36773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].tmp_idx = refs[j]->valid_ref;
36849d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst      assert(dec->refs[refs[j]->valid_ref].vidbuf == refs[j]);
36973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].field_order_cnt[0] = d->field_order_cnt_list[i][0];
37073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].field_order_cnt[1] = d->field_order_cnt_list[i][1];
37173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].frame_idx = d->frame_num_list[i];
37273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      if (!dec->refs[refs[j]->valid_ref].field_pic_flag) {
37378525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin         h->refs[j].top_is_reference = d->top_is_reference[i];
37478525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin         h->refs[j].bottom_is_reference = d->bottom_is_reference[i];
37573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      }
3762cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin      h->refs[j].is_long_term = d->is_long_term[i];
37773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].notseenyet = 0;
37878525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin      h->refs[j].field_pic_flag = dec->refs[refs[j]->valid_ref].field_pic_flag;
3792cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin      h->refs[j].top_field_marking =
3802cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin         dec->refs[refs[j]->valid_ref].decoded_top && d->top_is_reference[i] ?
3812cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin         1 + d->is_long_term[i] : 0;
3822cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin      h->refs[j].bottom_field_marking =
3832cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin         dec->refs[refs[j]->valid_ref].decoded_bottom && d->bottom_is_reference[i] ?
3842cd2b9705e722d94091ce8ff6ff56a44dd8d5cc6Ilia Mirkin         1 + d->is_long_term[i] : 0;
38573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      h->refs[j].pad = 0;
38673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      j++;
38773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   }
38873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   for (; i < 16; ++i)
38973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      assert(!d->ref[i]);
39073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(d->num_ref_frames <= dec->base.max_references);
39173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
39273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   for (; i < d->num_ref_frames; ++i)
39378525dae8ae4daf785e89ba8a334e4ec3be8a334Ilia Mirkin      h->refs[j].field_pic_flag = d->field_pic_flag;
39473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   *(struct h264_picparm_vp *)map = *h;
39573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
39673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   return 0x1113;
39773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
39873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
39973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstatic void
40073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_fill_picparm_h264_vp_refs(struct nouveau_vp3_decoder *dec,
40173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                      struct pipe_h264_picture_desc *d,
40273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                      struct nouveau_vp3_video_buffer *refs[16],
40373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                      struct nouveau_vp3_video_buffer *target,
40473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                      char *map)
40573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
40673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   struct h264_picparm_vp *h = (struct h264_picparm_vp *)map;
40773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(dec->refs[target->valid_ref].vidbuf == target);
40873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin//    debug_printf("Target: %p\n", target);
40973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
41049d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   if (!dec->refs[target->valid_ref].decoded_top &&
41149d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst       !dec->refs[target->valid_ref].decoded_bottom)
41249d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst      dec->refs[target->valid_ref].decoded_first = d->bottom_field_flag;
41349d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst   else if (dec->refs[target->valid_ref].decoded_first != d->bottom_field_flag)
41449d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst      h->second_field = 1;
41549d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst
41673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   h->tmp_idx = target->valid_ref;
41773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   dec->refs[target->valid_ref].field_pic_flag = d->field_pic_flag;
41873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   if (!d->field_pic_flag || d->bottom_field_flag)
41973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      dec->refs[target->valid_ref].decoded_bottom = 1;
42073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   if (!d->field_pic_flag || !d->bottom_field_flag)
42173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      dec->refs[target->valid_ref].decoded_top = 1;
42273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
42373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
42473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinstatic uint32_t
42573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_fill_picparm_vc1_vp(struct nouveau_vp3_decoder *dec,
42673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                struct pipe_vc1_picture_desc *d,
42773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                struct nouveau_vp3_video_buffer *refs[16],
42873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                unsigned *is_ref,
42973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                                char *map)
43073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
43173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   struct vc1_picparm_vp *vc = (struct vc1_picparm_vp *)map;
43273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   unsigned ring;
43373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   assert(dec->base.profile != PIPE_VIDEO_PROFILE_VC1_SIMPLE);
43473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   *is_ref = d->picture_type <= 1;
43573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
43673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_ycbcr_offsets(dec, &vc->ofs[1], &vc->ofs[3], &vc->ofs[4]);
43773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->ofs[5] = vc->ofs[3];
43873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->ofs[0] = vc->ofs[2] = 0;
43973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->width = dec->base.width;
44073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->height = mb(dec->base.height)<<4;
44173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->unk0c = vc->unk10 = mb(dec->base.width)<<4; // Stride
44273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->pad = vc->pad2 = 0;
44373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   nouveau_vp3_inter_sizes(dec, 1, &ring, &vc->bucket_size, &vc->inter_ring_data_size);
44473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->profile = dec->base.profile - PIPE_VIDEO_PROFILE_VC1_SIMPLE;
44573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->loopfilter = d->loopfilter;
44673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->fastuvmc = d->fastuvmc;
44773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->dquant = d->dquant;
44873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->overlap = d->overlap;
44973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->quantizer = d->quantizer;
45073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   vc->u36 = 0; // ? No idea what this one is..
45173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   refs[0] = (struct nouveau_vp3_video_buffer *)d->ref[0];
45273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   refs[!!refs[0]] = (struct nouveau_vp3_video_buffer *)d->ref[1];
45373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   return 0x12;
45473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
45573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
45673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinvoid nouveau_vp3_vp_caps(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
45773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                         struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
45873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                         unsigned *caps, unsigned *is_ref,
45973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                         struct nouveau_vp3_video_buffer *refs[16])
46073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin{
46173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];
4628e423ab98403135140a093be3c66c88b9a36ad5cChristian König   enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile);
46373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   char *vp = bsp_bo->map + VP_OFFSET;
46473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
46573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   switch (codec){
4668e423ab98403135140a093be3c66c88b9a36ad5cChristian König   case PIPE_VIDEO_FORMAT_MPEG12:
46773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      *caps = nouveau_vp3_fill_picparm_mpeg12_vp(dec, desc.mpeg12, refs, is_ref, vp);
46873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      nouveau_vp3_handle_references(dec, refs, dec->fence_seq, target);
469a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      switch (desc.mpeg12->picture_structure) {
470a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      case PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_TOP:
471a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         dec->refs[target->valid_ref].decoded_top = 1;
472a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         break;
473a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      case PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_BOTTOM:
474a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         dec->refs[target->valid_ref].decoded_bottom = 1;
475a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         break;
476a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      default:
477a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         dec->refs[target->valid_ref].decoded_top = 1;
478a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         dec->refs[target->valid_ref].decoded_bottom = 1;
479a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         break;
480a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      }
48173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      return;
4828e423ab98403135140a093be3c66c88b9a36ad5cChristian König   case PIPE_VIDEO_FORMAT_MPEG4:
48373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      *caps = nouveau_vp3_fill_picparm_mpeg4_vp(dec, desc.mpeg4, refs, is_ref, vp);
48473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      nouveau_vp3_handle_references(dec, refs, dec->fence_seq, target);
485a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      // XXX: Correct?
486a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      if (!desc.mpeg4->interlaced) {
487a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         dec->refs[target->valid_ref].decoded_top = 1;
488a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         dec->refs[target->valid_ref].decoded_bottom = 1;
489a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      } else if (desc.mpeg4->top_field_first) {
490a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         if (!dec->refs[target->valid_ref].decoded_top)
491a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst            dec->refs[target->valid_ref].decoded_top = 1;
492a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         else
493a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst            dec->refs[target->valid_ref].decoded_bottom = 1;
494a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      } else {
495a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         if (!dec->refs[target->valid_ref].decoded_bottom)
496a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst            dec->refs[target->valid_ref].decoded_bottom = 1;
497a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         else
498a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst            dec->refs[target->valid_ref].decoded_top = 1;
499a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      }
50073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      return;
5018e423ab98403135140a093be3c66c88b9a36ad5cChristian König   case PIPE_VIDEO_FORMAT_VC1: {
50273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      *caps = nouveau_vp3_fill_picparm_vc1_vp(dec, desc.vc1, refs, is_ref, vp);
50373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      nouveau_vp3_handle_references(dec, refs, dec->fence_seq, target);
504a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      if (desc.vc1->frame_coding_mode == 3)
505a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst         debug_printf("Field-Interlaced possibly incorrectly handled\n");
506a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      dec->refs[target->valid_ref].decoded_top = 1;
507a41aad843108cec1901c88a76d5ceb4ede2e062bMaarten Lankhorst      dec->refs[target->valid_ref].decoded_bottom = 1;
50873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      return;
50973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   }
5108e423ab98403135140a093be3c66c88b9a36ad5cChristian König   case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
51173f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      *caps = nouveau_vp3_fill_picparm_h264_vp(dec, desc.h264, refs, is_ref, vp);
51273f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      nouveau_vp3_handle_references(dec, refs, dec->fence_seq, target);
51373f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      nouveau_vp3_fill_picparm_h264_vp_refs(dec, desc.h264, refs, target, vp);
51473f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin      return;
51573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   }
51673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   default: assert(0); return;
51773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin   }
51873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin}
519