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