Mercurial > libavcodec.hg
annotate cavs.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 7dd2a45249a9 |
children | 1241c824de46 |
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 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11556
diff
changeset
|
23 * @file |
3402 | 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" |
9428 | 29 #include "get_bits.h" |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
30 #include "golomb.h" |
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8606
diff
changeset
|
31 #include "mathops.h" |
4944 | 32 #include "cavs.h" |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
33 #include "cavsdata.h" |
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 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
37 * in-loop deblocking filter |
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 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
40 |
8605 | 41 static inline int get_bs(cavs_vector *mvP, cavs_vector *mvQ, int b) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
42 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
|
43 return 2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
44 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
|
45 return 1; |
3458 | 46 if(b){ |
47 mvP += MV_BWD_OFFS; | |
48 mvQ += MV_BWD_OFFS; | |
49 if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) | |
50 return 1; | |
51 }else{ | |
52 if(mvP->ref != mvQ->ref) | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
53 return 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
54 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
55 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
56 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
57 |
3402 | 58 #define SET_PARAMS \ |
4594 | 59 alpha = alpha_tab[av_clip(qp_avg + h->alpha_offset,0,63)]; \ |
60 beta = beta_tab[av_clip(qp_avg + h->beta_offset, 0,63)]; \ | |
61 tc = tc_tab[av_clip(qp_avg + h->alpha_offset,0,63)]; | |
3402 | 62 |
63 /** | |
64 * in-loop deblocking filter for a single macroblock | |
65 * | |
66 * boundary strength (bs) mapping: | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
67 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
68 * --4---5-- |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
69 * 0 2 | |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
70 * | 6 | 7 | |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
71 * 1 3 | |
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 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
74 */ |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
75 void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type) { |
11178
fda40558e98a
avoid using DECLARE_ALIGNED on stack variable as suggested by Reimar
stefang
parents:
10961
diff
changeset
|
76 uint8_t bs[8]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
77 int qp_avg, alpha, beta, tc; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
78 int i; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
79 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
80 /* save un-deblocked lines */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 for(i=0;i<8;i++) { |
3472
0e0cffe06fb3
avoid double copying of left border in luma prediction
stefang
parents:
3471
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 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
|
92 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
93 if(!h->loop_filter_disable) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
94 /* determine bs */ |
3458 | 95 if(mb_type == I_8X8) |
11178
fda40558e98a
avoid using DECLARE_ALIGNED on stack variable as suggested by Reimar
stefang
parents:
10961
diff
changeset
|
96 memset(bs,2,8); |
3458 | 97 else{ |
11178
fda40558e98a
avoid using DECLARE_ALIGNED on stack variable as suggested by Reimar
stefang
parents:
10961
diff
changeset
|
98 memset(bs,0,8); |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
99 if(ff_cavs_partition_flags[mb_type] & SPLITV){ |
3458 | 100 bs[2] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1], mb_type > P_8X8); |
101 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
|
102 } |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
103 if(ff_cavs_partition_flags[mb_type] & SPLITH){ |
3458 | 104 bs[6] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2], mb_type > P_8X8); |
105 bs[7] = get_bs(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3], mb_type > P_8X8); | |
106 } | |
107 bs[0] = get_bs(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0], mb_type > P_8X8); | |
108 bs[1] = get_bs(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2], mb_type > P_8X8); | |
109 bs[4] = get_bs(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0], mb_type > P_8X8); | |
110 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
|
111 } |
11178
fda40558e98a
avoid using DECLARE_ALIGNED on stack variable as suggested by Reimar
stefang
parents:
10961
diff
changeset
|
112 if(AV_RN64(bs)) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
113 if(h->flags & A_AVAIL) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
114 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
|
115 SET_PARAMS; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
116 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
|
117 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
|
118 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
|
119 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
120 qp_avg = h->qp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
121 SET_PARAMS; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
122 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
|
123 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
|
124 bs[6],bs[7]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
125 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
126 if(h->flags & B_AVAIL) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
127 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
|
128 SET_PARAMS; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
129 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
|
130 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
|
131 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
|
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 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
135 h->left_qp = h->qp; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
136 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
|
137 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
138 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
139 #undef SET_PARAMS |
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 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
143 * spatial intra prediction |
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 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
146 |
5401 | 147 void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, |
148 uint8_t **left, int block) { | |
149 int i; | |
150 | |
151 switch(block) { | |
152 case 0: | |
153 *left = h->left_border_y; | |
154 h->left_border_y[0] = h->left_border_y[1]; | |
155 memset(&h->left_border_y[17],h->left_border_y[16],9); | |
156 memcpy(&top[1],&h->top_border_y[h->mbx*16],16); | |
157 top[17] = top[16]; | |
158 top[0] = top[1]; | |
159 if((h->flags & A_AVAIL) && (h->flags & B_AVAIL)) | |
160 h->left_border_y[0] = top[0] = h->topleft_border_y; | |
161 break; | |
162 case 1: | |
163 *left = h->intern_border_y; | |
164 for(i=0;i<8;i++) | |
165 h->intern_border_y[i+1] = *(h->cy + 7 + i*h->l_stride); | |
166 memset(&h->intern_border_y[9],h->intern_border_y[8],9); | |
167 h->intern_border_y[0] = h->intern_border_y[1]; | |
168 memcpy(&top[1],&h->top_border_y[h->mbx*16+8],8); | |
169 if(h->flags & C_AVAIL) | |
170 memcpy(&top[9],&h->top_border_y[(h->mbx + 1)*16],8); | |
171 else | |
172 memset(&top[9],top[8],9); | |
173 top[17] = top[16]; | |
174 top[0] = top[1]; | |
175 if(h->flags & B_AVAIL) | |
176 h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx*16+7]; | |
177 break; | |
178 case 2: | |
179 *left = &h->left_border_y[8]; | |
180 memcpy(&top[1],h->cy + 7*h->l_stride,16); | |
181 top[17] = top[16]; | |
182 top[0] = top[1]; | |
183 if(h->flags & A_AVAIL) | |
184 top[0] = h->left_border_y[8]; | |
185 break; | |
186 case 3: | |
187 *left = &h->intern_border_y[8]; | |
188 for(i=0;i<8;i++) | |
189 h->intern_border_y[i+9] = *(h->cy + 7 + (i+8)*h->l_stride); | |
190 memset(&h->intern_border_y[17],h->intern_border_y[16],9); | |
191 memcpy(&top[0],h->cy + 7 + 7*h->l_stride,9); | |
192 memset(&top[9],top[8],9); | |
193 break; | |
194 } | |
195 } | |
196 | |
197 void ff_cavs_load_intra_pred_chroma(AVSContext *h) { | |
198 /* extend borders by one pixel */ | |
199 h->left_border_u[9] = h->left_border_u[8]; | |
200 h->left_border_v[9] = h->left_border_v[8]; | |
201 h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8]; | |
202 h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8]; | |
203 if(h->mbx && h->mby) { | |
204 h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u; | |
205 h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v; | |
206 } else { | |
207 h->left_border_u[0] = h->left_border_u[1]; | |
208 h->left_border_v[0] = h->left_border_v[1]; | |
209 h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1]; | |
210 h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1]; | |
211 } | |
212 } | |
213 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
214 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
|
215 int y; |
5520
c16a59ef6a86
* renaming (ST|LD)(16|32|64) -> AV_(R|W)N(16|32|64)
romansh
parents:
5424
diff
changeset
|
216 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
|
217 for(y=0;y<8;y++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
218 *((uint64_t *)(d+y*stride)) = a; |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
222 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
|
223 int y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
224 uint64_t a; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
225 for(y=0;y<8;y++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
226 a = left[y+1] * 0x0101010101010101ULL; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
227 *((uint64_t *)(d+y*stride)) = a; |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
231 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
|
232 int y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
233 uint64_t a = 0x8080808080808080ULL; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
234 for(y=0;y<8;y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
235 *((uint64_t *)(d+y*stride)) = a; |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
238 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
|
239 int x,y,ia; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
240 int ih = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
241 int iv = 0; |
4176 | 242 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
|
243 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
244 for(x=0; x<4; x++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
245 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
|
246 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
|
247 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
248 ia = (top[8]+left[8])<<4; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
249 ih = (17*ih+16)>>5; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
250 iv = (17*iv+16)>>5; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
251 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
252 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
253 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
|
254 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
255 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
256 #define LOWPASS(ARRAY,INDEX) \ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
257 (( 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
|
258 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
259 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
|
260 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
261 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
262 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
263 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
|
264 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
265 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
266 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
|
267 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
268 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
269 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
270 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
|
271 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
272 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
273 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
|
274 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
275 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
276 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
277 if(x==y) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
278 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
|
279 else if(x>y) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
280 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
|
281 else |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
282 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
|
283 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
284 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
285 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
|
286 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
287 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
288 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
289 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
|
290 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
291 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
292 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
|
293 int x,y; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
294 for(y=0; y<8; y++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
295 for(x=0; x<8; x++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
296 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
|
297 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
298 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
299 #undef LOWPASS |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
300 |
5401 | 301 void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv) { |
302 /* save pred modes before they get modified */ | |
303 h->pred_mode_Y[3] = h->pred_mode_Y[5]; | |
304 h->pred_mode_Y[6] = h->pred_mode_Y[8]; | |
305 h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7]; | |
306 h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8]; | |
307 | |
308 /* modify pred modes according to availability of neighbour samples */ | |
309 if(!(h->flags & A_AVAIL)) { | |
310 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[4] ); | |
311 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[7] ); | |
312 modify_pred(ff_left_modifier_c, pred_mode_uv ); | |
313 } | |
314 if(!(h->flags & B_AVAIL)) { | |
315 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[4] ); | |
316 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[5] ); | |
317 modify_pred(ff_top_modifier_c, pred_mode_uv ); | |
318 } | |
319 } | |
320 | |
3380
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 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
323 * motion compensation |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
327 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
|
328 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
|
329 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
|
330 int src_y_offset,qpel_mc_func *qpix_op, |
8605 | 331 h264_chroma_mc_func chroma_op,cavs_vector *mv){ |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
332 MpegEncContext * const s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 int extra_height= extra_width; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
341 int emu=0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
342 const int full_mx= mx>>2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
343 const int full_my= my>>2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
344 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
|
345 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
|
346 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
347 if(!pic->data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
348 return; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
349 if(mx&7) extra_width -= 3; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
350 if(my&7) extra_height -= 3; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
351 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
352 if( full_mx < 0-extra_width |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
353 || full_my < 0-extra_height |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
354 || 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
|
355 || 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
|
356 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
|
357 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
|
358 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
|
359 emu=1; |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
362 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
|
363 if(!square){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
364 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
|
365 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
366 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
367 if(emu){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
368 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
|
369 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
|
370 src_cb= s->edge_emu_buffer; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
371 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
372 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
|
373 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
374 if(emu){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
375 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
|
376 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
|
377 src_cr= s->edge_emu_buffer; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
378 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
379 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
|
380 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
381 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
382 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
|
383 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
|
384 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
|
385 h264_chroma_mc_func chroma_put,qpel_mc_func *qpix_avg, |
8605 | 386 h264_chroma_mc_func chroma_avg, cavs_vector *mv){ |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
387 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
|
388 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
|
389 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
390 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
|
391 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
|
392 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
|
393 x_offset += 8*h->mbx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
394 y_offset += 8*h->mby; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
395 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
396 if(mv->ref >= 0){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
397 Picture *ref= &h->DPB[mv->ref]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
398 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
|
399 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
|
400 qpix_op, chroma_op, mv); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
401 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
402 qpix_op= qpix_avg; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
403 chroma_op= chroma_avg; |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
406 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
|
407 Picture *ref= &h->DPB[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
408 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
|
409 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
|
410 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
|
411 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
412 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
413 |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
414 void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type) { |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]); |
3458 | 421 }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
|
422 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
|
423 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
|
424 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
|
425 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
|
426 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
|
427 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
|
428 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
|
429 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
|
430 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
|
431 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
|
432 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 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
|
440 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
|
441 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
|
442 } |
3380
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 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
447 * motion vector prediction |
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 |
8605 | 451 static inline void scale_mv(AVSContext *h, int *d_x, int *d_y, cavs_vector *src, int distp) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
452 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
|
453 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
454 *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
|
455 *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
|
456 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
457 |
8605 | 458 static inline void mv_pred_median(AVSContext *h, cavs_vector *mvP, |
459 cavs_vector *mvA, cavs_vector *mvB, cavs_vector *mvC) { | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
460 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
|
461 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
|
462 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
463 /* 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
|
464 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
|
465 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
|
466 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
|
467 /* 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
|
468 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
|
469 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
|
470 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
|
471 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
|
472 if(len_mid == len_ab) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
473 mvP->x = cx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
474 mvP->y = cy; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
475 } else if(len_mid == len_bc) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
476 mvP->x = ax; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
477 mvP->y = ay; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
478 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
479 mvP->x = bx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
480 mvP->y = by; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
481 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
482 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
483 |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
484 void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC, |
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
485 enum cavs_mv_pred mode, enum cavs_block size, int ref) { |
8605 | 486 cavs_vector *mvP = &h->mv[nP]; |
487 cavs_vector *mvA = &h->mv[nP-1]; | |
488 cavs_vector *mvB = &h->mv[nP-4]; | |
489 cavs_vector *mvC = &h->mv[nC]; | |
490 const cavs_vector *mvP2 = NULL; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
491 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
492 mvP->ref = ref; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
493 mvP->dist = h->dist[mvP->ref]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
494 if(mvC->ref == NOT_AVAIL) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
495 mvC = &h->mv[nP-5]; // set to top-left (mvD) |
3468 | 496 if((mode == MV_PRED_PSKIP) && |
497 ((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
|
498 ((mvA->x | mvA->y | mvA->ref) == 0) || |
3468 | 499 ((mvB->x | mvB->y | mvB->ref) == 0) )) { |
5235 | 500 mvP2 = &ff_cavs_un_mv; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
501 /* if there is only one suitable candidate, take it */ |
3468 | 502 } else if((mvA->ref >= 0) && (mvB->ref < 0) && (mvC->ref < 0)) { |
3460 | 503 mvP2= mvA; |
3459 | 504 } else if((mvA->ref < 0) && (mvB->ref >= 0) && (mvC->ref < 0)) { |
3460 | 505 mvP2= mvB; |
3459 | 506 } else if((mvA->ref < 0) && (mvB->ref < 0) && (mvC->ref >= 0)) { |
3460 | 507 mvP2= mvC; |
508 } else if(mode == MV_PRED_LEFT && mvA->ref == ref){ | |
509 mvP2= mvA; | |
510 } else if(mode == MV_PRED_TOP && mvB->ref == ref){ | |
511 mvP2= mvB; | |
512 } else if(mode == MV_PRED_TOPRIGHT && mvC->ref == ref){ | |
513 mvP2= mvC; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
514 } |
3460 | 515 if(mvP2){ |
516 mvP->x = mvP2->x; | |
517 mvP->y = mvP2->y; | |
518 }else | |
519 mv_pred_median(h, mvP, mvA, mvB, mvC); | |
520 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
521 if(mode < MV_PRED_PSKIP) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
522 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
|
523 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
|
524 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
525 set_mvs(mvP,size); |
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 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
528 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
529 * |
5401 | 530 * macroblock level |
531 * | |
532 ****************************************************************************/ | |
533 | |
534 /** | |
535 * initialise predictors for motion vectors and intra prediction | |
536 */ | |
537 void ff_cavs_init_mb(AVSContext *h) { | |
538 int i; | |
539 | |
540 /* copy predictors from top line (MB B and C) into cache */ | |
541 for(i=0;i<3;i++) { | |
542 h->mv[MV_FWD_B2+i] = h->top_mv[0][h->mbx*2+i]; | |
543 h->mv[MV_BWD_B2+i] = h->top_mv[1][h->mbx*2+i]; | |
544 } | |
545 h->pred_mode_Y[1] = h->top_pred_Y[h->mbx*2+0]; | |
546 h->pred_mode_Y[2] = h->top_pred_Y[h->mbx*2+1]; | |
547 /* clear top predictors if MB B is not available */ | |
548 if(!(h->flags & B_AVAIL)) { | |
549 h->mv[MV_FWD_B2] = ff_cavs_un_mv; | |
550 h->mv[MV_FWD_B3] = ff_cavs_un_mv; | |
551 h->mv[MV_BWD_B2] = ff_cavs_un_mv; | |
552 h->mv[MV_BWD_B3] = ff_cavs_un_mv; | |
553 h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL; | |
554 h->flags &= ~(C_AVAIL|D_AVAIL); | |
555 } else if(h->mbx) { | |
556 h->flags |= D_AVAIL; | |
557 } | |
558 if(h->mbx == h->mb_width-1) //MB C not available | |
559 h->flags &= ~C_AVAIL; | |
560 /* clear top-right predictors if MB C is not available */ | |
561 if(!(h->flags & C_AVAIL)) { | |
562 h->mv[MV_FWD_C2] = ff_cavs_un_mv; | |
563 h->mv[MV_BWD_C2] = ff_cavs_un_mv; | |
564 } | |
565 /* clear top-left predictors if MB D is not available */ | |
566 if(!(h->flags & D_AVAIL)) { | |
567 h->mv[MV_FWD_D3] = ff_cavs_un_mv; | |
568 h->mv[MV_BWD_D3] = ff_cavs_un_mv; | |
569 } | |
570 } | |
571 | |
572 /** | |
573 * save predictors for later macroblocks and increase | |
574 * macroblock address | |
11556 | 575 * @return 0 if end of frame is reached, 1 otherwise |
5401 | 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 */ | |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
593 h->mbidx++; |
5401 | 594 h->mbx++; |
595 if(h->mbx == h->mb_width) { //new mb line | |
596 h->flags = B_AVAIL|C_AVAIL; | |
597 /* clear left pred_modes */ | |
598 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL; | |
599 /* clear left mv predictors */ | |
600 for(i=0;i<=20;i+=4) | |
601 h->mv[i] = ff_cavs_un_mv; | |
602 h->mbx = 0; | |
603 h->mby++; | |
604 /* re-calculate sample pointers */ | |
605 h->cy = h->picture.data[0] + h->mby*16*h->l_stride; | |
606 h->cu = h->picture.data[1] + h->mby*8*h->c_stride; | |
607 h->cv = h->picture.data[2] + h->mby*8*h->c_stride; | |
608 if(h->mby == h->mb_height) { //frame end | |
609 return 0; | |
610 } | |
611 } | |
612 return 1; | |
613 } | |
614 | |
615 /***************************************************************************** | |
616 * | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
617 * frame level |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
618 * |
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 |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
621 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
|
622 int i; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
623 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
624 /* clear some predictors */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
625 for(i=0;i<=20;i+=4) |
5235 | 626 h->mv[i] = ff_cavs_un_mv; |
627 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
|
628 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); |
5235 | 629 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
|
630 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
|
631 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
|
632 h->cy = h->picture.data[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
633 h->cu = h->picture.data[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
634 h->cv = h->picture.data[2]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
635 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
|
636 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
|
637 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
|
638 h->luma_scan[3] = 8*h->l_stride+8; |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
639 h->mbx = h->mby = h->mbidx = 0; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
640 h->flags = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
641 } |
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 * headers and interface |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
646 * |
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 |
3402 | 649 /** |
650 * some predictions require data from the top-neighbouring macroblock. | |
651 * this data has to be stored for one complete row of macroblocks | |
652 * and this storage space is allocated here | |
653 */ | |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
654 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
|
655 /* alloc top line of predictors */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
656 h->top_qp = av_malloc( h->mb_width); |
8605 | 657 h->top_mv[0] = av_malloc((h->mb_width*2+1)*sizeof(cavs_vector)); |
658 h->top_mv[1] = av_malloc((h->mb_width*2+1)*sizeof(cavs_vector)); | |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 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
|
663 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
664 /* alloc space for co-located MVs and types */ |
8605 | 665 h->col_mv = av_malloc( h->mb_width*h->mb_height*4*sizeof(cavs_vector)); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
666 h->col_type_base = av_malloc(h->mb_width*h->mb_height); |
3524 | 667 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
|
668 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
669 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5520
diff
changeset
|
670 av_cold int ff_cavs_init(AVCodecContext *avctx) { |
3382 | 671 AVSContext *h = avctx->priv_data; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
672 MpegEncContext * const s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
673 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
674 MPV_decode_defaults(s); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
675 s->avctx = avctx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
676 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
677 avctx->pix_fmt= PIX_FMT_YUV420P; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
678 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
679 h->luma_scan[0] = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
680 h->luma_scan[1] = 8; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
681 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
|
682 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
|
683 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
|
684 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
|
685 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
|
686 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
|
687 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
|
688 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
|
689 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
|
690 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
|
691 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
|
692 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
|
693 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
|
694 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
|
695 h->intra_pred_c[ INTRA_C_DC_128] = intra_pred_dc_128; |
5235 | 696 h->mv[ 7] = ff_cavs_un_mv; |
697 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
|
698 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
699 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
700 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5520
diff
changeset
|
701 av_cold int ff_cavs_end(AVCodecContext *avctx) { |
3382 | 702 AVSContext *h = avctx->priv_data; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
703 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
704 av_free(h->top_qp); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
705 av_free(h->top_mv[0]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
706 av_free(h->top_mv[1]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
707 av_free(h->top_pred_Y); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
708 av_free(h->top_border_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_u); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
710 av_free(h->top_border_v); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
711 av_free(h->col_mv); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
712 av_free(h->col_type_base); |
3524 | 713 av_free(h->block); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
714 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
715 } |