Mercurial > libavcodec.hg
annotate cavs.c @ 6018:9d1654835629 libavcodec
Ensure that our total reference frame count does not exceed the SPS
max frame count, which is limited to less than the size of the
reference buffers, thereby preventing overflow.
Part of fix for issue 281.
author | heydowns |
---|---|
date | Fri, 14 Dec 2007 06:25:23 +0000 |
parents | c16a59ef6a86 |
children | 48759bfbd073 |
rev | line source |
---|---|
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
1 /* |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
2 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder. |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de> |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
16 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
5215 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
20 */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
21 |
3402 | 22 /** |
23 * @file cavs.c | |
24 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder | |
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de> | |
26 */ | |
27 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
28 #include "avcodec.h" |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
29 #include "bitstream.h" |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
30 #include "golomb.h" |
4944 | 31 #include "cavs.h" |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
32 #include "cavsdata.h" |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
33 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
34 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
35 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
36 * in-loop deblocking filter |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
37 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
38 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
39 |
3458 | 40 static inline int get_bs(vector_t *mvP, vector_t *mvQ, int b) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
41 if((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
42 return 2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
43 if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
44 return 1; |
3458 | 45 if(b){ |
46 mvP += MV_BWD_OFFS; | |
47 mvQ += MV_BWD_OFFS; | |
48 if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) | |
49 return 1; | |
50 }else{ | |
51 if(mvP->ref != mvQ->ref) | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
52 return 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
53 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
54 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
55 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
56 |
3402 | 57 #define SET_PARAMS \ |
4594 | 58 alpha = alpha_tab[av_clip(qp_avg + h->alpha_offset,0,63)]; \ |
59 beta = beta_tab[av_clip(qp_avg + h->beta_offset, 0,63)]; \ | |
60 tc = tc_tab[av_clip(qp_avg + h->alpha_offset,0,63)]; | |
3402 | 61 |
62 /** | |
63 * in-loop deblocking filter for a single macroblock | |
64 * | |
65 * boundary strength (bs) mapping: | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
66 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
67 * --4---5-- |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
68 * 0 2 | |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
69 * | 6 | 7 | |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
70 * 1 3 | |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
71 * --------- |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
72 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
73 */ |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
74 void ff_cavs_filter(AVSContext *h, enum mb_t mb_type) { |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
75 DECLARE_ALIGNED_8(uint8_t, bs[8]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
76 int qp_avg, alpha, beta, tc; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
77 int i; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
78 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
79 /* save un-deblocked lines */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
80 h->topleft_border_y = h->top_border_y[h->mbx*16+15]; |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
81 h->topleft_border_u = h->top_border_u[h->mbx*10+8]; |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
82 h->topleft_border_v = h->top_border_v[h->mbx*10+8]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
83 memcpy(&h->top_border_y[h->mbx*16], h->cy + 15* h->l_stride,16); |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
84 memcpy(&h->top_border_u[h->mbx*10+1], h->cu + 7* h->c_stride,8); |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
85 memcpy(&h->top_border_v[h->mbx*10+1], h->cv + 7* h->c_stride,8); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
86 for(i=0;i<8;i++) { |
3472
0e0cffe06fb3
avoid double copying of left border in luma prediction
stefang
parents:
3471
diff
changeset
|
87 h->left_border_y[i*2+1] = *(h->cy + 15 + (i*2+0)*h->l_stride); |
0e0cffe06fb3
avoid double copying of left border in luma prediction
stefang
parents:
3471
diff
changeset
|
88 h->left_border_y[i*2+2] = *(h->cy + 15 + (i*2+1)*h->l_stride); |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
89 h->left_border_u[i+1] = *(h->cu + 7 + i*h->c_stride); |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
90 h->left_border_v[i+1] = *(h->cv + 7 + i*h->c_stride); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
91 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
92 if(!h->loop_filter_disable) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
93 /* determine bs */ |
3458 | 94 if(mb_type == I_8X8) |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
95 *((uint64_t *)bs) = 0x0202020202020202ULL; |
3458 | 96 else{ |
97 *((uint64_t *)bs) = 0; | |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
98 if(ff_cavs_partition_flags[mb_type] & SPLITV){ |
3458 | 99 bs[2] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1], mb_type > P_8X8); |
100 bs[3] = get_bs(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3], mb_type > P_8X8); | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
101 } |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
102 if(ff_cavs_partition_flags[mb_type] & SPLITH){ |
3458 | 103 bs[6] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2], mb_type > P_8X8); |
104 bs[7] = get_bs(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3], mb_type > P_8X8); | |
105 } | |
106 bs[0] = get_bs(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0], mb_type > P_8X8); | |
107 bs[1] = get_bs(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2], mb_type > P_8X8); | |
108 bs[4] = get_bs(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0], mb_type > P_8X8); | |
109 bs[5] = get_bs(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1], mb_type > P_8X8); | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
110 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
111 if( *((uint64_t *)bs) ) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
112 if(h->flags & A_AVAIL) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
113 qp_avg = (h->qp + h->left_qp + 1) >> 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
114 SET_PARAMS; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
115 h->s.dsp.cavs_filter_lv(h->cy,h->l_stride,alpha,beta,tc,bs[0],bs[1]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
116 h->s.dsp.cavs_filter_cv(h->cu,h->c_stride,alpha,beta,tc,bs[0],bs[1]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
117 h->s.dsp.cavs_filter_cv(h->cv,h->c_stride,alpha,beta,tc,bs[0],bs[1]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
118 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
119 qp_avg = h->qp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
120 SET_PARAMS; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
121 h->s.dsp.cavs_filter_lv(h->cy + 8,h->l_stride,alpha,beta,tc,bs[2],bs[3]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
122 h->s.dsp.cavs_filter_lh(h->cy + 8*h->l_stride,h->l_stride,alpha,beta,tc, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
123 bs[6],bs[7]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
124 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
125 if(h->flags & B_AVAIL) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
126 qp_avg = (h->qp + h->top_qp[h->mbx] + 1) >> 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
127 SET_PARAMS; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
128 h->s.dsp.cavs_filter_lh(h->cy,h->l_stride,alpha,beta,tc,bs[4],bs[5]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
129 h->s.dsp.cavs_filter_ch(h->cu,h->c_stride,alpha,beta,tc,bs[4],bs[5]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
130 h->s.dsp.cavs_filter_ch(h->cv,h->c_stride,alpha,beta,tc,bs[4],bs[5]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
131 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
132 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
133 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
134 h->left_qp = h->qp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
135 h->top_qp[h->mbx] = h->qp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
136 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
137 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
138 #undef SET_PARAMS |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
139 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
140 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
141 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
142 * spatial intra prediction |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
143 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
144 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
145 |
5401 | 146 void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, |
147 uint8_t **left, int block) { | |
148 int i; | |
149 | |
150 switch(block) { | |
151 case 0: | |
152 *left = h->left_border_y; | |
153 h->left_border_y[0] = h->left_border_y[1]; | |
154 memset(&h->left_border_y[17],h->left_border_y[16],9); | |
155 memcpy(&top[1],&h->top_border_y[h->mbx*16],16); | |
156 top[17] = top[16]; | |
157 top[0] = top[1]; | |
158 if((h->flags & A_AVAIL) && (h->flags & B_AVAIL)) | |
159 h->left_border_y[0] = top[0] = h->topleft_border_y; | |
160 break; | |
161 case 1: | |
162 *left = h->intern_border_y; | |
163 for(i=0;i<8;i++) | |
164 h->intern_border_y[i+1] = *(h->cy + 7 + i*h->l_stride); | |
165 memset(&h->intern_border_y[9],h->intern_border_y[8],9); | |
166 h->intern_border_y[0] = h->intern_border_y[1]; | |
167 memcpy(&top[1],&h->top_border_y[h->mbx*16+8],8); | |
168 if(h->flags & C_AVAIL) | |
169 memcpy(&top[9],&h->top_border_y[(h->mbx + 1)*16],8); | |
170 else | |
171 memset(&top[9],top[8],9); | |
172 top[17] = top[16]; | |
173 top[0] = top[1]; | |
174 if(h->flags & B_AVAIL) | |
175 h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx*16+7]; | |
176 break; | |
177 case 2: | |
178 *left = &h->left_border_y[8]; | |
179 memcpy(&top[1],h->cy + 7*h->l_stride,16); | |
180 top[17] = top[16]; | |
181 top[0] = top[1]; | |
182 if(h->flags & A_AVAIL) | |
183 top[0] = h->left_border_y[8]; | |
184 break; | |
185 case 3: | |
186 *left = &h->intern_border_y[8]; | |
187 for(i=0;i<8;i++) | |
188 h->intern_border_y[i+9] = *(h->cy + 7 + (i+8)*h->l_stride); | |
189 memset(&h->intern_border_y[17],h->intern_border_y[16],9); | |
190 memcpy(&top[0],h->cy + 7 + 7*h->l_stride,9); | |
191 memset(&top[9],top[8],9); | |
192 break; | |
193 } | |
194 } | |
195 | |
196 void ff_cavs_load_intra_pred_chroma(AVSContext *h) { | |
197 /* extend borders by one pixel */ | |
198 h->left_border_u[9] = h->left_border_u[8]; | |
199 h->left_border_v[9] = h->left_border_v[8]; | |
200 h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8]; | |
201 h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8]; | |
202 if(h->mbx && h->mby) { | |
203 h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u; | |
204 h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v; | |
205 } else { | |
206 h->left_border_u[0] = h->left_border_u[1]; | |
207 h->left_border_v[0] = h->left_border_v[1]; | |
208 h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1]; | |
209 h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1]; | |
210 } | |
211 } | |
212 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
213 static void intra_pred_vert(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
214 int y; |
5520
c16a59ef6a86
* renaming (ST|LD)(16|32|64) -> AV_(R|W)N(16|32|64)
romansh
parents:
5424
diff
changeset
|
215 uint64_t a = AV_RN64(&top[1]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
216 for(y=0;y<8;y++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
217 *((uint64_t *)(d+y*stride)) = a; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
218 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
219 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
220 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
221 static void intra_pred_horiz(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
222 int y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
223 uint64_t a; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
224 for(y=0;y<8;y++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
225 a = left[y+1] * 0x0101010101010101ULL; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
226 *((uint64_t *)(d+y*stride)) = a; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
227 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
228 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
229 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
230 static void intra_pred_dc_128(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
231 int y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
232 uint64_t a = 0x8080808080808080ULL; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
233 for(y=0;y<8;y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
234 *((uint64_t *)(d+y*stride)) = a; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
235 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
236 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
237 static void intra_pred_plane(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
238 int x,y,ia; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
239 int ih = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
240 int iv = 0; |
4176 | 241 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
242 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
243 for(x=0; x<4; x++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
244 ih += (x+1)*(top[5+x]-top[3-x]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
245 iv += (x+1)*(left[5+x]-left[3-x]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
246 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
247 ia = (top[8]+left[8])<<4; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
248 ih = (17*ih+16)>>5; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
249 iv = (17*iv+16)>>5; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
250 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
251 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
252 d[y*stride+x] = cm[(ia+(x-3)*ih+(y-3)*iv+16)>>5]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
253 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
254 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
255 #define LOWPASS(ARRAY,INDEX) \ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
256 (( ARRAY[(INDEX)-1] + 2*ARRAY[(INDEX)] + ARRAY[(INDEX)+1] + 2) >> 2) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
257 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
258 static void intra_pred_lp(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
259 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
260 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
261 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
262 d[y*stride+x] = (LOWPASS(top,x+1) + LOWPASS(left,y+1)) >> 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
263 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
264 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
265 static void intra_pred_down_left(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
266 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
267 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
268 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
269 d[y*stride+x] = (LOWPASS(top,x+y+2) + LOWPASS(left,x+y+2)) >> 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
270 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
271 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
272 static void intra_pred_down_right(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
273 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
274 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
275 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
276 if(x==y) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
277 d[y*stride+x] = (left[1]+2*top[0]+top[1]+2)>>2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
278 else if(x>y) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
279 d[y*stride+x] = LOWPASS(top,x-y); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
280 else |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
281 d[y*stride+x] = LOWPASS(left,y-x); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
282 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
283 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
284 static void intra_pred_lp_left(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
285 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
286 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
287 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
288 d[y*stride+x] = LOWPASS(left,y+1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
289 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
290 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
291 static void intra_pred_lp_top(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
292 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
293 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
294 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
295 d[y*stride+x] = LOWPASS(top,x+1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
296 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
297 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
298 #undef LOWPASS |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
299 |
5401 | 300 void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv) { |
301 /* save pred modes before they get modified */ | |
302 h->pred_mode_Y[3] = h->pred_mode_Y[5]; | |
303 h->pred_mode_Y[6] = h->pred_mode_Y[8]; | |
304 h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7]; | |
305 h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8]; | |
306 | |
307 /* modify pred modes according to availability of neighbour samples */ | |
308 if(!(h->flags & A_AVAIL)) { | |
309 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[4] ); | |
310 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[7] ); | |
311 modify_pred(ff_left_modifier_c, pred_mode_uv ); | |
312 } | |
313 if(!(h->flags & B_AVAIL)) { | |
314 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[4] ); | |
315 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[5] ); | |
316 modify_pred(ff_top_modifier_c, pred_mode_uv ); | |
317 } | |
318 } | |
319 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
320 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
321 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
322 * motion compensation |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
323 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
324 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
325 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
326 static inline void mc_dir_part(AVSContext *h,Picture *pic,int square, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
327 int chroma_height,int delta,int list,uint8_t *dest_y, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
328 uint8_t *dest_cb,uint8_t *dest_cr,int src_x_offset, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
329 int src_y_offset,qpel_mc_func *qpix_op, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
330 h264_chroma_mc_func chroma_op,vector_t *mv){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
331 MpegEncContext * const s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
332 const int mx= mv->x + src_x_offset*8; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
333 const int my= mv->y + src_y_offset*8; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
334 const int luma_xy= (mx&3) + ((my&3)<<2); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
335 uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*h->l_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
336 uint8_t * src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->c_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
337 uint8_t * src_cr= pic->data[2] + (mx>>3) + (my>>3)*h->c_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
338 int extra_width= 0; //(s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
339 int extra_height= extra_width; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
340 int emu=0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
341 const int full_mx= mx>>2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
342 const int full_my= my>>2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
343 const int pic_width = 16*h->mb_width; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
344 const int pic_height = 16*h->mb_height; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
345 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
346 if(!pic->data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
347 return; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
348 if(mx&7) extra_width -= 3; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
349 if(my&7) extra_height -= 3; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
350 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
351 if( full_mx < 0-extra_width |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
352 || full_my < 0-extra_height |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
353 || full_mx + 16/*FIXME*/ > pic_width + extra_width |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
354 || full_my + 16/*FIXME*/ > pic_height + extra_height){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
355 ff_emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*h->l_stride, h->l_stride, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
356 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, pic_width, pic_height); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
357 src_y= s->edge_emu_buffer + 2 + 2*h->l_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
358 emu=1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
359 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
360 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
361 qpix_op[luma_xy](dest_y, src_y, h->l_stride); //FIXME try variable height perhaps? |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
362 if(!square){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
363 qpix_op[luma_xy](dest_y + delta, src_y + delta, h->l_stride); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
364 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
365 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
366 if(emu){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
367 ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, h->c_stride, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
368 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
369 src_cb= s->edge_emu_buffer; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
370 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
371 chroma_op(dest_cb, src_cb, h->c_stride, chroma_height, mx&7, my&7); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
372 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
373 if(emu){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
374 ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, h->c_stride, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
375 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
376 src_cr= s->edge_emu_buffer; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
377 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
378 chroma_op(dest_cr, src_cr, h->c_stride, chroma_height, mx&7, my&7); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
379 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
380 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
381 static inline void mc_part_std(AVSContext *h,int square,int chroma_height,int delta, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
382 uint8_t *dest_y,uint8_t *dest_cb,uint8_t *dest_cr, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
383 int x_offset, int y_offset,qpel_mc_func *qpix_put, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
384 h264_chroma_mc_func chroma_put,qpel_mc_func *qpix_avg, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
385 h264_chroma_mc_func chroma_avg, vector_t *mv){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
386 qpel_mc_func *qpix_op= qpix_put; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
387 h264_chroma_mc_func chroma_op= chroma_put; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
388 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
389 dest_y += 2*x_offset + 2*y_offset*h->l_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
390 dest_cb += x_offset + y_offset*h->c_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
391 dest_cr += x_offset + y_offset*h->c_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
392 x_offset += 8*h->mbx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
393 y_offset += 8*h->mby; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
394 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
395 if(mv->ref >= 0){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
396 Picture *ref= &h->DPB[mv->ref]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
397 mc_dir_part(h, ref, square, chroma_height, delta, 0, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
398 dest_y, dest_cb, dest_cr, x_offset, y_offset, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
399 qpix_op, chroma_op, mv); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
400 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
401 qpix_op= qpix_avg; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
402 chroma_op= chroma_avg; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
403 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
404 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
405 if((mv+MV_BWD_OFFS)->ref >= 0){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
406 Picture *ref= &h->DPB[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
407 mc_dir_part(h, ref, square, chroma_height, delta, 1, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
408 dest_y, dest_cb, dest_cr, x_offset, y_offset, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
409 qpix_op, chroma_op, mv+MV_BWD_OFFS); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
410 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
411 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
412 |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
413 void ff_cavs_inter(AVSContext *h, enum mb_t mb_type) { |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
414 if(ff_cavs_partition_flags[mb_type] == 0){ // 16x16 |
3424
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
415 mc_part_std(h, 1, 8, 0, h->cy, h->cu, h->cv, 0, 0, |
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
416 h->s.dsp.put_cavs_qpel_pixels_tab[0], |
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
417 h->s.dsp.put_h264_chroma_pixels_tab[0], |
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
418 h->s.dsp.avg_cavs_qpel_pixels_tab[0], |
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
419 h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]); |
3458 | 420 }else{ |
3424
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
421 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 0, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
422 h->s.dsp.put_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
423 h->s.dsp.put_h264_chroma_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
424 h->s.dsp.avg_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
425 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X0]); |
3424
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
426 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 0, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
427 h->s.dsp.put_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
428 h->s.dsp.put_h264_chroma_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
429 h->s.dsp.avg_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
430 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X1]); |
3424
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
431 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 4, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
432 h->s.dsp.put_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
433 h->s.dsp.put_h264_chroma_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
434 h->s.dsp.avg_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
435 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X2]); |
3424
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
436 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 4, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
437 h->s.dsp.put_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
438 h->s.dsp.put_h264_chroma_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
439 h->s.dsp.avg_cavs_qpel_pixels_tab[1], |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
440 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]); |
3424
2bfb700e2084
make use of 16x16 motion comp functions, 16x8 and 8x16 do not seem to be worth it
stefang
parents:
3415
diff
changeset
|
441 } |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
442 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
443 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
444 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
445 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
446 * motion vector prediction |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
447 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
448 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
449 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
450 static inline void scale_mv(AVSContext *h, int *d_x, int *d_y, vector_t *src, int distp) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
451 int den = h->scale_den[src->ref]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
452 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
453 *d_x = (src->x*distp*den + 256 + (src->x>>31)) >> 9; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
454 *d_y = (src->y*distp*den + 256 + (src->y>>31)) >> 9; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
455 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
456 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
457 static inline void mv_pred_median(AVSContext *h, vector_t *mvP, vector_t *mvA, vector_t *mvB, vector_t *mvC) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
458 int ax, ay, bx, by, cx, cy; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
459 int len_ab, len_bc, len_ca, len_mid; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
460 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
461 /* scale candidates according to their temporal span */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
462 scale_mv(h, &ax, &ay, mvA, mvP->dist); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
463 scale_mv(h, &bx, &by, mvB, mvP->dist); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
464 scale_mv(h, &cx, &cy, mvC, mvP->dist); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
465 /* find the geometrical median of the three candidates */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
466 len_ab = abs(ax - bx) + abs(ay - by); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
467 len_bc = abs(bx - cx) + abs(by - cy); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
468 len_ca = abs(cx - ax) + abs(cy - ay); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
469 len_mid = mid_pred(len_ab, len_bc, len_ca); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
470 if(len_mid == len_ab) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
471 mvP->x = cx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
472 mvP->y = cy; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
473 } else if(len_mid == len_bc) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
474 mvP->x = ax; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
475 mvP->y = ay; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
476 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
477 mvP->x = bx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
478 mvP->y = by; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
479 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
480 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
481 |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
482 void ff_cavs_mv(AVSContext *h, enum mv_loc_t nP, enum mv_loc_t nC, |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
483 enum mv_pred_t mode, enum block_t size, int ref) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
484 vector_t *mvP = &h->mv[nP]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
485 vector_t *mvA = &h->mv[nP-1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
486 vector_t *mvB = &h->mv[nP-4]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
487 vector_t *mvC = &h->mv[nC]; |
3468 | 488 const vector_t *mvP2 = NULL; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
489 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
490 mvP->ref = ref; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
491 mvP->dist = h->dist[mvP->ref]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
492 if(mvC->ref == NOT_AVAIL) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
493 mvC = &h->mv[nP-5]; // set to top-left (mvD) |
3468 | 494 if((mode == MV_PRED_PSKIP) && |
495 ((mvA->ref == NOT_AVAIL) || (mvB->ref == NOT_AVAIL) || | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
496 ((mvA->x | mvA->y | mvA->ref) == 0) || |
3468 | 497 ((mvB->x | mvB->y | mvB->ref) == 0) )) { |
5235 | 498 mvP2 = &ff_cavs_un_mv; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
499 /* if there is only one suitable candidate, take it */ |
3468 | 500 } else if((mvA->ref >= 0) && (mvB->ref < 0) && (mvC->ref < 0)) { |
3460 | 501 mvP2= mvA; |
3459 | 502 } else if((mvA->ref < 0) && (mvB->ref >= 0) && (mvC->ref < 0)) { |
3460 | 503 mvP2= mvB; |
3459 | 504 } else if((mvA->ref < 0) && (mvB->ref < 0) && (mvC->ref >= 0)) { |
3460 | 505 mvP2= mvC; |
506 } else if(mode == MV_PRED_LEFT && mvA->ref == ref){ | |
507 mvP2= mvA; | |
508 } else if(mode == MV_PRED_TOP && mvB->ref == ref){ | |
509 mvP2= mvB; | |
510 } else if(mode == MV_PRED_TOPRIGHT && mvC->ref == ref){ | |
511 mvP2= mvC; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
512 } |
3460 | 513 if(mvP2){ |
514 mvP->x = mvP2->x; | |
515 mvP->y = mvP2->y; | |
516 }else | |
517 mv_pred_median(h, mvP, mvA, mvB, mvC); | |
518 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
519 if(mode < MV_PRED_PSKIP) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
520 mvP->x += get_se_golomb(&h->s.gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
521 mvP->y += get_se_golomb(&h->s.gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
522 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
523 set_mvs(mvP,size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
524 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
525 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
526 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
527 * |
5401 | 528 * macroblock level |
529 * | |
530 ****************************************************************************/ | |
531 | |
532 /** | |
533 * initialise predictors for motion vectors and intra prediction | |
534 */ | |
535 void ff_cavs_init_mb(AVSContext *h) { | |
536 int i; | |
537 | |
538 /* copy predictors from top line (MB B and C) into cache */ | |
539 for(i=0;i<3;i++) { | |
540 h->mv[MV_FWD_B2+i] = h->top_mv[0][h->mbx*2+i]; | |
541 h->mv[MV_BWD_B2+i] = h->top_mv[1][h->mbx*2+i]; | |
542 } | |
543 h->pred_mode_Y[1] = h->top_pred_Y[h->mbx*2+0]; | |
544 h->pred_mode_Y[2] = h->top_pred_Y[h->mbx*2+1]; | |
545 /* clear top predictors if MB B is not available */ | |
546 if(!(h->flags & B_AVAIL)) { | |
547 h->mv[MV_FWD_B2] = ff_cavs_un_mv; | |
548 h->mv[MV_FWD_B3] = ff_cavs_un_mv; | |
549 h->mv[MV_BWD_B2] = ff_cavs_un_mv; | |
550 h->mv[MV_BWD_B3] = ff_cavs_un_mv; | |
551 h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL; | |
552 h->flags &= ~(C_AVAIL|D_AVAIL); | |
553 } else if(h->mbx) { | |
554 h->flags |= D_AVAIL; | |
555 } | |
556 if(h->mbx == h->mb_width-1) //MB C not available | |
557 h->flags &= ~C_AVAIL; | |
558 /* clear top-right predictors if MB C is not available */ | |
559 if(!(h->flags & C_AVAIL)) { | |
560 h->mv[MV_FWD_C2] = ff_cavs_un_mv; | |
561 h->mv[MV_BWD_C2] = ff_cavs_un_mv; | |
562 } | |
563 /* clear top-left predictors if MB D is not available */ | |
564 if(!(h->flags & D_AVAIL)) { | |
565 h->mv[MV_FWD_D3] = ff_cavs_un_mv; | |
566 h->mv[MV_BWD_D3] = ff_cavs_un_mv; | |
567 } | |
568 /* set pointer for co-located macroblock type */ | |
569 h->col_type = &h->col_type_base[h->mby*h->mb_width + h->mbx]; | |
570 } | |
571 | |
572 /** | |
573 * save predictors for later macroblocks and increase | |
574 * macroblock address | |
575 * @returns 0 if end of frame is reached, 1 otherwise | |
576 */ | |
577 int ff_cavs_next_mb(AVSContext *h) { | |
578 int i; | |
579 | |
580 h->flags |= A_AVAIL; | |
581 h->cy += 16; | |
582 h->cu += 8; | |
583 h->cv += 8; | |
584 /* copy mvs as predictors to the left */ | |
585 for(i=0;i<=20;i+=4) | |
586 h->mv[i] = h->mv[i+2]; | |
587 /* copy bottom mvs from cache to top line */ | |
588 h->top_mv[0][h->mbx*2+0] = h->mv[MV_FWD_X2]; | |
589 h->top_mv[0][h->mbx*2+1] = h->mv[MV_FWD_X3]; | |
590 h->top_mv[1][h->mbx*2+0] = h->mv[MV_BWD_X2]; | |
591 h->top_mv[1][h->mbx*2+1] = h->mv[MV_BWD_X3]; | |
592 /* next MB address */ | |
593 h->mbx++; | |
594 if(h->mbx == h->mb_width) { //new mb line | |
595 h->flags = B_AVAIL|C_AVAIL; | |
596 /* clear left pred_modes */ | |
597 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL; | |
598 /* clear left mv predictors */ | |
599 for(i=0;i<=20;i+=4) | |
600 h->mv[i] = ff_cavs_un_mv; | |
601 h->mbx = 0; | |
602 h->mby++; | |
603 /* re-calculate sample pointers */ | |
604 h->cy = h->picture.data[0] + h->mby*16*h->l_stride; | |
605 h->cu = h->picture.data[1] + h->mby*8*h->c_stride; | |
606 h->cv = h->picture.data[2] + h->mby*8*h->c_stride; | |
607 if(h->mby == h->mb_height) { //frame end | |
608 return 0; | |
609 } else { | |
610 //check_for_slice(h); | |
611 } | |
612 } | |
613 return 1; | |
614 } | |
615 | |
616 /***************************************************************************** | |
617 * | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
618 * frame level |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
619 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
620 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
621 |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
622 void ff_cavs_init_pic(AVSContext *h) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
623 int i; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
624 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
625 /* clear some predictors */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
626 for(i=0;i<=20;i+=4) |
5235 | 627 h->mv[i] = ff_cavs_un_mv; |
628 h->mv[MV_BWD_X0] = ff_cavs_dir_mv; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
629 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); |
5235 | 630 h->mv[MV_FWD_X0] = ff_cavs_dir_mv; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
631 set_mvs(&h->mv[MV_FWD_X0], BLK_16X16); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
632 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
633 h->cy = h->picture.data[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
634 h->cu = h->picture.data[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
635 h->cv = h->picture.data[2]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
636 h->l_stride = h->picture.linesize[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
637 h->c_stride = h->picture.linesize[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
638 h->luma_scan[2] = 8*h->l_stride; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
639 h->luma_scan[3] = 8*h->l_stride+8; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
640 h->mbx = h->mby = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
641 h->flags = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
642 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
643 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
644 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
645 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
646 * headers and interface |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
647 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
648 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
649 |
3402 | 650 /** |
651 * some predictions require data from the top-neighbouring macroblock. | |
652 * this data has to be stored for one complete row of macroblocks | |
653 * and this storage space is allocated here | |
654 */ | |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
655 void ff_cavs_init_top_lines(AVSContext *h) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
656 /* alloc top line of predictors */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
657 h->top_qp = av_malloc( h->mb_width); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
658 h->top_mv[0] = av_malloc((h->mb_width*2+1)*sizeof(vector_t)); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
659 h->top_mv[1] = av_malloc((h->mb_width*2+1)*sizeof(vector_t)); |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
660 h->top_pred_Y = av_malloc( h->mb_width*2*sizeof(*h->top_pred_Y)); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
661 h->top_border_y = av_malloc((h->mb_width+1)*16); |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
662 h->top_border_u = av_malloc((h->mb_width)*10); |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
663 h->top_border_v = av_malloc((h->mb_width)*10); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
664 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
665 /* alloc space for co-located MVs and types */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
666 h->col_mv = av_malloc( h->mb_width*h->mb_height*4*sizeof(vector_t)); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
667 h->col_type_base = av_malloc(h->mb_width*h->mb_height); |
3524 | 668 h->block = av_mallocz(64*sizeof(DCTELEM)); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
669 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
670 |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
671 int ff_cavs_init(AVCodecContext *avctx) { |
3382 | 672 AVSContext *h = avctx->priv_data; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
673 MpegEncContext * const s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
674 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
675 MPV_decode_defaults(s); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
676 s->avctx = avctx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
677 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
678 avctx->pix_fmt= PIX_FMT_YUV420P; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
679 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
680 h->luma_scan[0] = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
681 h->luma_scan[1] = 8; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
682 h->intra_pred_l[ INTRA_L_VERT] = intra_pred_vert; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
683 h->intra_pred_l[ INTRA_L_HORIZ] = intra_pred_horiz; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
684 h->intra_pred_l[ INTRA_L_LP] = intra_pred_lp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
685 h->intra_pred_l[ INTRA_L_DOWN_LEFT] = intra_pred_down_left; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
686 h->intra_pred_l[INTRA_L_DOWN_RIGHT] = intra_pred_down_right; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
687 h->intra_pred_l[ INTRA_L_LP_LEFT] = intra_pred_lp_left; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
688 h->intra_pred_l[ INTRA_L_LP_TOP] = intra_pred_lp_top; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
689 h->intra_pred_l[ INTRA_L_DC_128] = intra_pred_dc_128; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
690 h->intra_pred_c[ INTRA_C_LP] = intra_pred_lp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
691 h->intra_pred_c[ INTRA_C_HORIZ] = intra_pred_horiz; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
692 h->intra_pred_c[ INTRA_C_VERT] = intra_pred_vert; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
693 h->intra_pred_c[ INTRA_C_PLANE] = intra_pred_plane; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
694 h->intra_pred_c[ INTRA_C_LP_LEFT] = intra_pred_lp_left; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
695 h->intra_pred_c[ INTRA_C_LP_TOP] = intra_pred_lp_top; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
696 h->intra_pred_c[ INTRA_C_DC_128] = intra_pred_dc_128; |
5235 | 697 h->mv[ 7] = ff_cavs_un_mv; |
698 h->mv[19] = ff_cavs_un_mv; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
699 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
700 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
701 |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
702 int ff_cavs_end(AVCodecContext *avctx) { |
3382 | 703 AVSContext *h = avctx->priv_data; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
704 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
705 av_free(h->top_qp); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
706 av_free(h->top_mv[0]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
707 av_free(h->top_mv[1]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
708 av_free(h->top_pred_Y); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
709 av_free(h->top_border_y); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
710 av_free(h->top_border_u); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
711 av_free(h->top_border_v); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
712 av_free(h->col_mv); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
713 av_free(h->col_type_base); |
3524 | 714 av_free(h->block); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
715 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
716 } |