Mercurial > libavcodec.hg
annotate h264.c @ 6017:e1404acccac3 libavcodec
Actually return with an error condition if we're being asked to deal with too
many reference frames. Also check max num ref frames against our internal
ref buffer sizes.
Part of fix for roundup issue 281
author | heydowns |
---|---|
date | Fri, 14 Dec 2007 05:48:27 +0000 |
parents | 5455f4e43948 |
children | 9d1654835629 |
rev | line source |
---|---|
1168 | 1 /* |
2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder | |
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1168 | 8 * modify it under the terms of the GNU Lesser General Public |
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:
3927
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1168 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1168 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
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:
3927
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3029
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1168 | 20 */ |
2967 | 21 |
1168 | 22 /** |
23 * @file h264.c | |
24 * H.264 / AVC / MPEG4 part10 codec. | |
25 * @author Michael Niedermayer <michaelni@gmx.at> | |
26 */ | |
27 | |
28 #include "dsputil.h" | |
29 #include "avcodec.h" | |
30 #include "mpegvideo.h" | |
4975 | 31 #include "h264.h" |
1168 | 32 #include "h264data.h" |
4975 | 33 #include "h264_parser.h" |
1168 | 34 #include "golomb.h" |
35 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
36 #include "cabac.h" |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
37 |
3284
a224d9752912
don't force asserts in release builds. 2% faster h264.
lorenm
parents:
3219
diff
changeset
|
38 //#undef NDEBUG |
1168 | 39 #include <assert.h> |
40 | |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
41 /** |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
42 * Value of Picture.reference when Picture is not a reference picture, but |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
43 * is held for delayed output. |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
44 */ |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
45 #define DELAYED_PIC_REF 4 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
46 |
1168 | 47 static VLC coeff_token_vlc[4]; |
48 static VLC chroma_dc_coeff_token_vlc; | |
49 | |
50 static VLC total_zeros_vlc[15]; | |
51 static VLC chroma_dc_total_zeros_vlc[3]; | |
52 | |
53 static VLC run_vlc[6]; | |
54 static VLC run7_vlc; | |
55 | |
1234 | 56 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp); |
57 static void svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc); | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
58 static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
59 static void filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize); |
1234 | 60 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4277
diff
changeset
|
61 static av_always_inline uint32_t pack16to32(int a, int b){ |
1269 | 62 #ifdef WORDS_BIGENDIAN |
63 return (b&0xFFFF) + (a<<16); | |
64 #else | |
65 return (a&0xFFFF) + (b<<16); | |
66 #endif | |
67 } | |
68 | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
69 const uint8_t ff_rem6[52]={ |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
70 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
71 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
72 |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
73 const uint8_t ff_div6[52]={ |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
74 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
75 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
76 |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
77 |
1168 | 78 /** |
79 * fill a rectangle. | |
2392 | 80 * @param h height of the rectangle, should be a constant |
81 * @param w width of the rectangle, should be a constant | |
1168 | 82 * @param size the size of val (1 or 4), should be a constant |
83 */ | |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4277
diff
changeset
|
84 static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride, uint32_t val, int size){ |
1187 | 85 uint8_t *p= (uint8_t*)vp; |
1168 | 86 assert(size==1 || size==4); |
3315 | 87 assert(w<=4); |
2967 | 88 |
1168 | 89 w *= size; |
90 stride *= size; | |
2967 | 91 |
2962 | 92 assert((((long)vp)&(FFMIN(w, STRIDE_ALIGN)-1)) == 0); |
2669 | 93 assert((stride&(w-1))==0); |
3315 | 94 if(w==2){ |
95 const uint16_t v= size==4 ? val : val*0x0101; | |
96 *(uint16_t*)(p + 0*stride)= v; | |
97 if(h==1) return; | |
98 *(uint16_t*)(p + 1*stride)= v; | |
99 if(h==2) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
100 *(uint16_t*)(p + 2*stride)= v; |
3315 | 101 *(uint16_t*)(p + 3*stride)= v; |
102 }else if(w==4){ | |
103 const uint32_t v= size==4 ? val : val*0x01010101; | |
104 *(uint32_t*)(p + 0*stride)= v; | |
105 if(h==1) return; | |
106 *(uint32_t*)(p + 1*stride)= v; | |
107 if(h==2) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
108 *(uint32_t*)(p + 2*stride)= v; |
3315 | 109 *(uint32_t*)(p + 3*stride)= v; |
110 }else if(w==8){ | |
111 //gcc can't optimize 64bit math on x86_32 | |
112 #if defined(ARCH_X86_64) || (defined(MP_WORDSIZE) && MP_WORDSIZE >= 64) | |
113 const uint64_t v= val*0x0100000001ULL; | |
114 *(uint64_t*)(p + 0*stride)= v; | |
115 if(h==1) return; | |
116 *(uint64_t*)(p + 1*stride)= v; | |
117 if(h==2) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
118 *(uint64_t*)(p + 2*stride)= v; |
3315 | 119 *(uint64_t*)(p + 3*stride)= v; |
120 }else if(w==16){ | |
121 const uint64_t v= val*0x0100000001ULL; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
122 *(uint64_t*)(p + 0+0*stride)= v; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
123 *(uint64_t*)(p + 8+0*stride)= v; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
124 *(uint64_t*)(p + 0+1*stride)= v; |
3315 | 125 *(uint64_t*)(p + 8+1*stride)= v; |
126 if(h==2) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
127 *(uint64_t*)(p + 0+2*stride)= v; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
128 *(uint64_t*)(p + 8+2*stride)= v; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
129 *(uint64_t*)(p + 0+3*stride)= v; |
3315 | 130 *(uint64_t*)(p + 8+3*stride)= v; |
131 #else | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
132 *(uint32_t*)(p + 0+0*stride)= val; |
3315 | 133 *(uint32_t*)(p + 4+0*stride)= val; |
134 if(h==1) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
135 *(uint32_t*)(p + 0+1*stride)= val; |
3315 | 136 *(uint32_t*)(p + 4+1*stride)= val; |
137 if(h==2) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
138 *(uint32_t*)(p + 0+2*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
139 *(uint32_t*)(p + 4+2*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
140 *(uint32_t*)(p + 0+3*stride)= val; |
3315 | 141 *(uint32_t*)(p + 4+3*stride)= val; |
142 }else if(w==16){ | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
143 *(uint32_t*)(p + 0+0*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
144 *(uint32_t*)(p + 4+0*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
145 *(uint32_t*)(p + 8+0*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
146 *(uint32_t*)(p +12+0*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
147 *(uint32_t*)(p + 0+1*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
148 *(uint32_t*)(p + 4+1*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
149 *(uint32_t*)(p + 8+1*stride)= val; |
3315 | 150 *(uint32_t*)(p +12+1*stride)= val; |
151 if(h==2) return; | |
5545
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
152 *(uint32_t*)(p + 0+2*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
153 *(uint32_t*)(p + 4+2*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
154 *(uint32_t*)(p + 8+2*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
155 *(uint32_t*)(p +12+2*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
156 *(uint32_t*)(p + 0+3*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
157 *(uint32_t*)(p + 4+3*stride)= val; |
397cb90b66d0
Statements like a = b = c = d = e; store from right-to-left, so if
gpoirier
parents:
5528
diff
changeset
|
158 *(uint32_t*)(p + 8+3*stride)= val; |
3315 | 159 *(uint32_t*)(p +12+3*stride)= val; |
160 #endif | |
1168 | 161 }else |
162 assert(0); | |
3315 | 163 assert(h==4); |
1168 | 164 } |
165 | |
3028 | 166 static void fill_caches(H264Context *h, int mb_type, int for_deblock){ |
1168 | 167 MpegEncContext * const s = &h->s; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
168 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1168 | 169 int topleft_xy, top_xy, topright_xy, left_xy[2]; |
170 int topleft_type, top_type, topright_type, left_type[2]; | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
171 int left_block[8]; |
1168 | 172 int i; |
173 | |
6014
33b0514769b2
Fix non_zero_count_cache for deblocking in field pictures.
heydowns
parents:
5987
diff
changeset
|
174 top_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); |
33b0514769b2
Fix non_zero_count_cache for deblocking in field pictures.
heydowns
parents:
5987
diff
changeset
|
175 |
3482 | 176 //FIXME deblocking could skip the intra and nnz parts. |
6014
33b0514769b2
Fix non_zero_count_cache for deblocking in field pictures.
heydowns
parents:
5987
diff
changeset
|
177 if(for_deblock && (h->slice_num == 1 || h->slice_table[mb_xy] == h->slice_table[top_xy]) && !FRAME_MBAFF) |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
178 return; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
179 |
2967 | 180 //wow what a mess, why didn't they simplify the interlacing&intra stuff, i can't imagine that these complex rules are worth it |
181 | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
182 topleft_xy = top_xy - 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
183 topright_xy= top_xy + 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
184 left_xy[1] = left_xy[0] = mb_xy-1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
185 left_block[0]= 0; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
186 left_block[1]= 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
187 left_block[2]= 2; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
188 left_block[3]= 3; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
189 left_block[4]= 7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
190 left_block[5]= 10; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
191 left_block[6]= 8; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
192 left_block[7]= 11; |
3316 | 193 if(FRAME_MBAFF){ |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
194 const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
195 const int top_pair_xy = pair_xy - s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
196 const int topleft_pair_xy = top_pair_xy - 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
197 const int topright_pair_xy = top_pair_xy + 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
198 const int topleft_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topleft_pair_xy]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
199 const int top_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
200 const int topright_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topright_pair_xy]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
201 const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
202 const int curr_mb_frame_flag = !IS_INTERLACED(mb_type); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
203 const int bottom = (s->mb_y & 1); |
4600 | 204 tprintf(s->avctx, "fill_caches: curr_mb_frame_flag:%d, left_mb_frame_flag:%d, topleft_mb_frame_flag:%d, top_mb_frame_flag:%d, topright_mb_frame_flag:%d\n", curr_mb_frame_flag, left_mb_frame_flag, topleft_mb_frame_flag, top_mb_frame_flag, topright_mb_frame_flag); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
205 if (bottom |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
206 ? !curr_mb_frame_flag // bottom macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
207 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
208 ) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
209 top_xy -= s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
210 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
211 if (bottom |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
212 ? !curr_mb_frame_flag // bottom macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
213 : (!curr_mb_frame_flag && !topleft_mb_frame_flag) // top macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
214 ) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
215 topleft_xy -= s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
216 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
217 if (bottom |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
218 ? !curr_mb_frame_flag // bottom macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
219 : (!curr_mb_frame_flag && !topright_mb_frame_flag) // top macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
220 ) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
221 topright_xy -= s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
222 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
223 if (left_mb_frame_flag != curr_mb_frame_flag) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
224 left_xy[1] = left_xy[0] = pair_xy - 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
225 if (curr_mb_frame_flag) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
226 if (bottom) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
227 left_block[0]= 2; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
228 left_block[1]= 2; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
229 left_block[2]= 3; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
230 left_block[3]= 3; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
231 left_block[4]= 8; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
232 left_block[5]= 11; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
233 left_block[6]= 8; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
234 left_block[7]= 11; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
235 } else { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
236 left_block[0]= 0; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
237 left_block[1]= 0; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
238 left_block[2]= 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
239 left_block[3]= 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
240 left_block[4]= 7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
241 left_block[5]= 10; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
242 left_block[6]= 7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
243 left_block[7]= 10; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
244 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
245 } else { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
246 left_xy[1] += s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
247 //left_block[0]= 0; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
248 left_block[1]= 2; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
249 left_block[2]= 0; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
250 left_block[3]= 2; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
251 //left_block[4]= 7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
252 left_block[5]= 10; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
253 left_block[6]= 7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
254 left_block[7]= 10; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
255 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
256 } |
1168 | 257 } |
258 | |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
259 h->top_mb_xy = top_xy; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
260 h->left_mb_xy[0] = left_xy[0]; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
261 h->left_mb_xy[1] = left_xy[1]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
262 if(for_deblock){ |
3482 | 263 topleft_type = 0; |
264 topright_type = 0; | |
2449 | 265 top_type = h->slice_table[top_xy ] < 255 ? s->current_picture.mb_type[top_xy] : 0; |
266 left_type[0] = h->slice_table[left_xy[0] ] < 255 ? s->current_picture.mb_type[left_xy[0]] : 0; | |
267 left_type[1] = h->slice_table[left_xy[1] ] < 255 ? s->current_picture.mb_type[left_xy[1]] : 0; | |
3316 | 268 |
269 if(FRAME_MBAFF && !IS_INTRA(mb_type)){ | |
270 int list; | |
271 int v = *(uint16_t*)&h->non_zero_count[mb_xy][14]; | |
272 for(i=0; i<16; i++) | |
273 h->non_zero_count_cache[scan8[i]] = (v>>i)&1; | |
4533 | 274 for(list=0; list<h->list_count; list++){ |
3316 | 275 if(USES_LIST(mb_type,list)){ |
276 uint32_t *src = (uint32_t*)s->current_picture.motion_val[list][h->mb2b_xy[mb_xy]]; | |
277 uint32_t *dst = (uint32_t*)h->mv_cache[list][scan8[0]]; | |
3776 | 278 int8_t *ref = &s->current_picture.ref_index[list][h->mb2b8_xy[mb_xy]]; |
3316 | 279 for(i=0; i<4; i++, dst+=8, src+=h->b_stride){ |
280 dst[0] = src[0]; | |
281 dst[1] = src[1]; | |
282 dst[2] = src[2]; | |
283 dst[3] = src[3]; | |
284 } | |
285 *(uint32_t*)&h->ref_cache[list][scan8[ 0]] = | |
286 *(uint32_t*)&h->ref_cache[list][scan8[ 2]] = pack16to32(ref[0],ref[1])*0x0101; | |
287 ref += h->b8_stride; | |
288 *(uint32_t*)&h->ref_cache[list][scan8[ 8]] = | |
289 *(uint32_t*)&h->ref_cache[list][scan8[10]] = pack16to32(ref[0],ref[1])*0x0101; | |
290 }else{ | |
291 fill_rectangle(&h-> mv_cache[list][scan8[ 0]], 4, 4, 8, 0, 4); | |
292 fill_rectangle(&h->ref_cache[list][scan8[ 0]], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); | |
293 } | |
294 } | |
295 } | |
2449 | 296 }else{ |
297 topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0; | |
298 top_type = h->slice_table[top_xy ] == h->slice_num ? s->current_picture.mb_type[top_xy] : 0; | |
299 topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0; | |
300 left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0; | |
301 left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0; | |
302 } | |
1168 | 303 |
304 if(IS_INTRA(mb_type)){ | |
2967 | 305 h->topleft_samples_available= |
306 h->top_samples_available= | |
1168 | 307 h->left_samples_available= 0xFFFF; |
308 h->topright_samples_available= 0xEEEA; | |
309 | |
310 if(!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred)){ | |
311 h->topleft_samples_available= 0xB3FF; | |
312 h->top_samples_available= 0x33FF; | |
313 h->topright_samples_available= 0x26EA; | |
314 } | |
315 for(i=0; i<2; i++){ | |
316 if(!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred)){ | |
317 h->topleft_samples_available&= 0xDF5F; | |
318 h->left_samples_available&= 0x5F5F; | |
319 } | |
320 } | |
2967 | 321 |
1168 | 322 if(!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred)) |
323 h->topleft_samples_available&= 0x7FFF; | |
2967 | 324 |
1168 | 325 if(!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred)) |
326 h->topright_samples_available&= 0xFBFF; | |
2967 | 327 |
1168 | 328 if(IS_INTRA4x4(mb_type)){ |
329 if(IS_INTRA4x4(top_type)){ | |
330 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4]; | |
331 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5]; | |
332 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6]; | |
333 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3]; | |
334 }else{ | |
335 int pred; | |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
336 if(!top_type || (IS_INTER(top_type) && h->pps.constrained_intra_pred)) |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
337 pred= -1; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
338 else{ |
1168 | 339 pred= 2; |
340 } | |
341 h->intra4x4_pred_mode_cache[4+8*0]= | |
342 h->intra4x4_pred_mode_cache[5+8*0]= | |
343 h->intra4x4_pred_mode_cache[6+8*0]= | |
344 h->intra4x4_pred_mode_cache[7+8*0]= pred; | |
345 } | |
346 for(i=0; i<2; i++){ | |
347 if(IS_INTRA4x4(left_type[i])){ | |
348 h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]]; | |
349 h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]]; | |
350 }else{ | |
351 int pred; | |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
352 if(!left_type[i] || (IS_INTER(left_type[i]) && h->pps.constrained_intra_pred)) |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
353 pred= -1; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
354 else{ |
1168 | 355 pred= 2; |
356 } | |
357 h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= | |
358 h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred; | |
359 } | |
360 } | |
361 } | |
362 } | |
2967 | 363 |
364 | |
1168 | 365 /* |
2967 | 366 0 . T T. T T T T |
367 1 L . .L . . . . | |
368 2 L . .L . . . . | |
369 3 . T TL . . . . | |
370 4 L . .L . . . . | |
371 5 L . .. . . . . | |
1168 | 372 */ |
373 //FIXME constraint_intra_pred & partitioning & nnz (lets hope this is just a typo in the spec) | |
374 if(top_type){ | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
375 h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][4]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
376 h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][5]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
377 h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][6]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
378 h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3]; |
2967 | 379 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
380 h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][9]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
381 h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8]; |
2967 | 382 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
383 h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][12]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
384 h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11]; |
2967 | 385 |
1168 | 386 }else{ |
2967 | 387 h->non_zero_count_cache[4+8*0]= |
1168 | 388 h->non_zero_count_cache[5+8*0]= |
389 h->non_zero_count_cache[6+8*0]= | |
390 h->non_zero_count_cache[7+8*0]= | |
2967 | 391 |
1168 | 392 h->non_zero_count_cache[1+8*0]= |
393 h->non_zero_count_cache[2+8*0]= | |
2967 | 394 |
1168 | 395 h->non_zero_count_cache[1+8*3]= |
2314 | 396 h->non_zero_count_cache[2+8*3]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64; |
2967 | 397 |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
398 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
399 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
400 for (i=0; i<2; i++) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
401 if(left_type[i]){ |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
402 h->non_zero_count_cache[3+8*1 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[0+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
403 h->non_zero_count_cache[3+8*2 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[1+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
404 h->non_zero_count_cache[0+8*1 + 8*i]= h->non_zero_count[left_xy[i]][left_block[4+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
405 h->non_zero_count_cache[0+8*4 + 8*i]= h->non_zero_count[left_xy[i]][left_block[5+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
406 }else{ |
2967 | 407 h->non_zero_count_cache[3+8*1 + 2*8*i]= |
408 h->non_zero_count_cache[3+8*2 + 2*8*i]= | |
409 h->non_zero_count_cache[0+8*1 + 8*i]= | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
410 h->non_zero_count_cache[0+8*4 + 8*i]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64; |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
411 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
412 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
413 |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
414 if( h->pps.cabac ) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
415 // top_cbp |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
416 if(top_type) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
417 h->top_cbp = h->cbp_table[top_xy]; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
418 } else if(IS_INTRA(mb_type)) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
419 h->top_cbp = 0x1C0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
420 } else { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
421 h->top_cbp = 0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
422 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
423 // left_cbp |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
424 if (left_type[0]) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
425 h->left_cbp = h->cbp_table[left_xy[0]] & 0x1f0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
426 } else if(IS_INTRA(mb_type)) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
427 h->left_cbp = 0x1C0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
428 } else { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
429 h->left_cbp = 0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
430 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
431 if (left_type[0]) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
432 h->left_cbp |= ((h->cbp_table[left_xy[0]]>>((left_block[0]&(~1))+1))&0x1) << 1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
433 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
434 if (left_type[1]) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
435 h->left_cbp |= ((h->cbp_table[left_xy[1]]>>((left_block[2]&(~1))+1))&0x1) << 3; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
436 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
437 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
438 |
1168 | 439 #if 1 |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
440 if(IS_INTER(mb_type) || IS_DIRECT(mb_type)){ |
1168 | 441 int list; |
4533 | 442 for(list=0; list<h->list_count; list++){ |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
443 if(!USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !h->deblocking_filter){ |
1168 | 444 /*if(!h->mv_cache_clean[list]){ |
445 memset(h->mv_cache [list], 0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all? | |
446 memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t)); | |
447 h->mv_cache_clean[list]= 1; | |
448 }*/ | |
2396 | 449 continue; |
1168 | 450 } |
451 h->mv_cache_clean[list]= 0; | |
2967 | 452 |
3212 | 453 if(USES_LIST(top_type, list)){ |
1168 | 454 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride; |
455 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride; | |
456 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0]; | |
457 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1]; | |
458 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2]; | |
459 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3]; | |
460 h->ref_cache[list][scan8[0] + 0 - 1*8]= | |
461 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0]; | |
462 h->ref_cache[list][scan8[0] + 2 - 1*8]= | |
463 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1]; | |
464 }else{ | |
2967 | 465 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]= |
466 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]= | |
467 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]= | |
1168 | 468 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0; |
469 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101; | |
470 } | |
471 | |
4546 | 472 for(i=0; i<2; i++){ |
473 int cache_idx = scan8[0] - 1 + i*2*8; | |
474 if(USES_LIST(left_type[i], list)){ | |
475 const int b_xy= h->mb2b_xy[left_xy[i]] + 3; | |
476 const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1; | |
477 *(uint32_t*)h->mv_cache[list][cache_idx ]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0+i*2]]; | |
478 *(uint32_t*)h->mv_cache[list][cache_idx+8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1+i*2]]; | |
479 h->ref_cache[list][cache_idx ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)]; | |
480 h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)]; | |
481 }else{ | |
482 *(uint32_t*)h->mv_cache [list][cache_idx ]= | |
483 *(uint32_t*)h->mv_cache [list][cache_idx+8]= 0; | |
484 h->ref_cache[list][cache_idx ]= | |
485 h->ref_cache[list][cache_idx+8]= left_type[i] ? LIST_NOT_USED : PART_NOT_AVAILABLE; | |
486 } | |
1168 | 487 } |
488 | |
3519 | 489 if((for_deblock || (IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred)) && !FRAME_MBAFF) |
2449 | 490 continue; |
491 | |
3212 | 492 if(USES_LIST(topleft_type, list)){ |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
493 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
494 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + h->b8_stride; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
495 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
496 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
497 }else{ |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
498 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
499 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
500 } |
2967 | 501 |
3212 | 502 if(USES_LIST(topright_type, list)){ |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
503 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
504 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
505 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
506 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
507 }else{ |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
508 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
509 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
510 } |
2967 | 511 |
3519 | 512 if((IS_SKIP(mb_type) || IS_DIRECT(mb_type)) && !FRAME_MBAFF) |
3482 | 513 continue; |
2967 | 514 |
515 h->ref_cache[list][scan8[5 ]+1] = | |
516 h->ref_cache[list][scan8[7 ]+1] = | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
517 h->ref_cache[list][scan8[13]+1] = //FIXME remove past 3 (init somewhere else) |
2967 | 518 h->ref_cache[list][scan8[4 ]] = |
1168 | 519 h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE; |
520 *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]= | |
521 *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]= | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
522 *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else) |
1168 | 523 *(uint32_t*)h->mv_cache [list][scan8[4 ]]= |
524 *(uint32_t*)h->mv_cache [list][scan8[12]]= 0; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
525 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
526 if( h->pps.cabac ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
527 /* XXX beurk, Load mvd */ |
3212 | 528 if(USES_LIST(top_type, list)){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
529 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
530 *(uint32_t*)h->mvd_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
531 *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
532 *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
533 *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
534 }else{ |
2967 | 535 *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]= |
536 *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]= | |
537 *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]= | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
538 *(uint32_t*)h->mvd_cache [list][scan8[0] + 3 - 1*8]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
539 } |
3212 | 540 if(USES_LIST(left_type[0], list)){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
541 const int b_xy= h->mb2b_xy[left_xy[0]] + 3; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
542 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 0*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[0]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
543 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[1]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
544 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
545 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
546 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 1*8]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
547 } |
3212 | 548 if(USES_LIST(left_type[1], list)){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
549 const int b_xy= h->mb2b_xy[left_xy[1]] + 3; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
550 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 2*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[2]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
551 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 3*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[3]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
552 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
553 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
554 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
555 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
556 *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
557 *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]= |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
558 *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else) |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
559 *(uint32_t*)h->mvd_cache [list][scan8[4 ]]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
560 *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0; |
2396 | 561 |
562 if(h->slice_type == B_TYPE){ | |
563 fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, 0, 1); | |
564 | |
565 if(IS_DIRECT(top_type)){ | |
566 *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101; | |
567 }else if(IS_8X8(top_type)){ | |
568 int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride; | |
569 h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy]; | |
570 h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1]; | |
571 }else{ | |
572 *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0; | |
573 } | |
2967 | 574 |
3316 | 575 if(IS_DIRECT(left_type[0])) |
576 h->direct_cache[scan8[0] - 1 + 0*8]= 1; | |
577 else if(IS_8X8(left_type[0])) | |
578 h->direct_cache[scan8[0] - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)]; | |
579 else | |
580 h->direct_cache[scan8[0] - 1 + 0*8]= 0; | |
581 | |
582 if(IS_DIRECT(left_type[1])) | |
2396 | 583 h->direct_cache[scan8[0] - 1 + 2*8]= 1; |
3316 | 584 else if(IS_8X8(left_type[1])) |
585 h->direct_cache[scan8[0] - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)]; | |
586 else | |
2396 | 587 h->direct_cache[scan8[0] - 1 + 2*8]= 0; |
3316 | 588 } |
589 } | |
590 | |
591 if(FRAME_MBAFF){ | |
592 #define MAP_MVS\ | |
593 MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\ | |
594 MAP_F2F(scan8[0] + 0 - 1*8, top_type)\ | |
595 MAP_F2F(scan8[0] + 1 - 1*8, top_type)\ | |
596 MAP_F2F(scan8[0] + 2 - 1*8, top_type)\ | |
597 MAP_F2F(scan8[0] + 3 - 1*8, top_type)\ | |
598 MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\ | |
599 MAP_F2F(scan8[0] - 1 + 0*8, left_type[0])\ | |
600 MAP_F2F(scan8[0] - 1 + 1*8, left_type[0])\ | |
601 MAP_F2F(scan8[0] - 1 + 2*8, left_type[1])\ | |
602 MAP_F2F(scan8[0] - 1 + 3*8, left_type[1]) | |
603 if(MB_FIELD){ | |
604 #define MAP_F2F(idx, mb_type)\ | |
605 if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\ | |
606 h->ref_cache[list][idx] <<= 1;\ | |
607 h->mv_cache[list][idx][1] /= 2;\ | |
608 h->mvd_cache[list][idx][1] /= 2;\ | |
2396 | 609 } |
3316 | 610 MAP_MVS |
611 #undef MAP_F2F | |
612 }else{ | |
613 #define MAP_F2F(idx, mb_type)\ | |
614 if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\ | |
615 h->ref_cache[list][idx] >>= 1;\ | |
616 h->mv_cache[list][idx][1] <<= 1;\ | |
617 h->mvd_cache[list][idx][1] <<= 1;\ | |
618 } | |
619 MAP_MVS | |
620 #undef MAP_F2F | |
2396 | 621 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
622 } |
1168 | 623 } |
624 } | |
625 #endif | |
2755 | 626 |
627 h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]); | |
1168 | 628 } |
629 | |
630 static inline void write_back_intra_pred_mode(H264Context *h){ | |
631 MpegEncContext * const s = &h->s; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
632 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1168 | 633 |
634 h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1]; | |
635 h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2]; | |
636 h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3]; | |
637 h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4]; | |
638 h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4]; | |
639 h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4]; | |
640 h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4]; | |
641 } | |
642 | |
643 /** | |
644 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |
645 */ | |
646 static inline int check_intra4x4_pred_mode(H264Context *h){ | |
647 MpegEncContext * const s = &h->s; | |
648 static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0}; | |
649 static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED}; | |
650 int i; | |
2967 | 651 |
1168 | 652 if(!(h->top_samples_available&0x8000)){ |
653 for(i=0; i<4; i++){ | |
654 int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ]; | |
655 if(status<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
656 av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y); |
1168 | 657 return -1; |
658 } else if(status){ | |
659 h->intra4x4_pred_mode_cache[scan8[0] + i]= status; | |
660 } | |
661 } | |
662 } | |
2967 | 663 |
1168 | 664 if(!(h->left_samples_available&0x8000)){ |
665 for(i=0; i<4; i++){ | |
666 int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ]; | |
667 if(status<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
668 av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y); |
1168 | 669 return -1; |
670 } else if(status){ | |
671 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status; | |
672 } | |
673 } | |
674 } | |
675 | |
676 return 0; | |
677 } //FIXME cleanup like next | |
678 | |
679 /** | |
680 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |
681 */ | |
682 static inline int check_intra_pred_mode(H264Context *h, int mode){ | |
683 MpegEncContext * const s = &h->s; | |
684 static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1}; | |
685 static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8}; | |
2967 | 686 |
4529 | 687 if(mode > 6U) { |
2392 | 688 av_log(h->s.avctx, AV_LOG_ERROR, "out of range intra chroma pred mode at %d %d\n", s->mb_x, s->mb_y); |
2163 | 689 return -1; |
2392 | 690 } |
2967 | 691 |
1168 | 692 if(!(h->top_samples_available&0x8000)){ |
693 mode= top[ mode ]; | |
694 if(mode<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
695 av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra mode at %d %d\n", s->mb_x, s->mb_y); |
1168 | 696 return -1; |
697 } | |
698 } | |
2967 | 699 |
1168 | 700 if(!(h->left_samples_available&0x8000)){ |
701 mode= left[ mode ]; | |
702 if(mode<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
703 av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra mode at %d %d\n", s->mb_x, s->mb_y); |
1168 | 704 return -1; |
2967 | 705 } |
1168 | 706 } |
707 | |
708 return mode; | |
709 } | |
710 | |
711 /** | |
712 * gets the predicted intra4x4 prediction mode. | |
713 */ | |
714 static inline int pred_intra_mode(H264Context *h, int n){ | |
715 const int index8= scan8[n]; | |
716 const int left= h->intra4x4_pred_mode_cache[index8 - 1]; | |
717 const int top = h->intra4x4_pred_mode_cache[index8 - 8]; | |
718 const int min= FFMIN(left, top); | |
719 | |
4600 | 720 tprintf(h->s.avctx, "mode:%d %d min:%d\n", left ,top, min); |
1168 | 721 |
722 if(min<0) return DC_PRED; | |
723 else return min; | |
724 } | |
725 | |
726 static inline void write_back_non_zero_count(H264Context *h){ | |
727 MpegEncContext * const s = &h->s; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
728 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
729 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
730 h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[7+8*1]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
731 h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[7+8*2]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
732 h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[7+8*3]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
733 h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
734 h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[4+8*4]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
735 h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[5+8*4]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
736 h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[6+8*4]; |
2967 | 737 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
738 h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[1+8*2]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
739 h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
740 h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[2+8*1]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
741 |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
742 h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[1+8*5]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
743 h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
744 h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[2+8*4]; |
3316 | 745 |
746 if(FRAME_MBAFF){ | |
747 // store all luma nnzs, for deblocking | |
748 int v = 0, i; | |
749 for(i=0; i<16; i++) | |
750 v += (!!h->non_zero_count_cache[scan8[i]]) << i; | |
751 *(uint16_t*)&h->non_zero_count[mb_xy][14] = v; | |
752 } | |
1168 | 753 } |
754 | |
755 /** | |
756 * gets the predicted number of non zero coefficients. | |
757 * @param n block index | |
758 */ | |
759 static inline int pred_non_zero_count(H264Context *h, int n){ | |
760 const int index8= scan8[n]; | |
761 const int left= h->non_zero_count_cache[index8 - 1]; | |
762 const int top = h->non_zero_count_cache[index8 - 8]; | |
763 int i= left + top; | |
2967 | 764 |
1168 | 765 if(i<64) i= (i+1)>>1; |
766 | |
4600 | 767 tprintf(h->s.avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31); |
1168 | 768 |
769 return i&31; | |
770 } | |
771 | |
1169 | 772 static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){ |
773 const int topright_ref= h->ref_cache[list][ i - 8 + part_width ]; | |
4600 | 774 MpegEncContext *s = &h->s; |
1169 | 775 |
3316 | 776 /* there is no consistent mapping of mvs to neighboring locations that will |
777 * make mbaff happy, so we can't move all this logic to fill_caches */ | |
778 if(FRAME_MBAFF){ | |
3776 | 779 const uint32_t *mb_types = s->current_picture_ptr->mb_type; |
3316 | 780 const int16_t *mv; |
781 *(uint32_t*)h->mv_cache[list][scan8[0]-2] = 0; | |
782 *C = h->mv_cache[list][scan8[0]-2]; | |
783 | |
784 if(!MB_FIELD | |
785 && (s->mb_y&1) && i < scan8[0]+8 && topright_ref != PART_NOT_AVAILABLE){ | |
786 int topright_xy = s->mb_x + (s->mb_y-1)*s->mb_stride + (i == scan8[0]+3); | |
787 if(IS_INTERLACED(mb_types[topright_xy])){ | |
788 #define SET_DIAG_MV(MV_OP, REF_OP, X4, Y4)\ | |
789 const int x4 = X4, y4 = Y4;\ | |
790 const int mb_type = mb_types[(x4>>2)+(y4>>2)*s->mb_stride];\ | |
791 if(!USES_LIST(mb_type,list) && !IS_8X8(mb_type))\ | |
792 return LIST_NOT_USED;\ | |
793 mv = s->current_picture_ptr->motion_val[list][x4 + y4*h->b_stride];\ | |
794 h->mv_cache[list][scan8[0]-2][0] = mv[0];\ | |
795 h->mv_cache[list][scan8[0]-2][1] = mv[1] MV_OP;\ | |
796 return s->current_picture_ptr->ref_index[list][(x4>>1) + (y4>>1)*h->b8_stride] REF_OP; | |
797 | |
798 SET_DIAG_MV(*2, >>1, s->mb_x*4+(i&7)-4+part_width, s->mb_y*4-1); | |
799 } | |
800 } | |
801 if(topright_ref == PART_NOT_AVAILABLE | |
802 && ((s->mb_y&1) || i >= scan8[0]+8) && (i&7)==4 | |
803 && h->ref_cache[list][scan8[0]-1] != PART_NOT_AVAILABLE){ | |
804 if(!MB_FIELD | |
805 && IS_INTERLACED(mb_types[h->left_mb_xy[0]])){ | |
806 SET_DIAG_MV(*2, >>1, s->mb_x*4-1, (s->mb_y|1)*4+(s->mb_y&1)*2+(i>>4)-1); | |
807 } | |
808 if(MB_FIELD | |
809 && !IS_INTERLACED(mb_types[h->left_mb_xy[0]]) | |
810 && i >= scan8[0]+8){ | |
811 // leftshift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's ok. | |
812 SET_DIAG_MV(>>1, <<1, s->mb_x*4-1, (s->mb_y&~1)*4 - 1 + ((i-scan8[0])>>3)*2); | |
813 } | |
814 } | |
815 #undef SET_DIAG_MV | |
816 } | |
817 | |
1169 | 818 if(topright_ref != PART_NOT_AVAILABLE){ |
819 *C= h->mv_cache[list][ i - 8 + part_width ]; | |
820 return topright_ref; | |
821 }else{ | |
4600 | 822 tprintf(s->avctx, "topright MV not available\n"); |
1170 | 823 |
1169 | 824 *C= h->mv_cache[list][ i - 8 - 1 ]; |
825 return h->ref_cache[list][ i - 8 - 1 ]; | |
826 } | |
827 } | |
828 | |
1168 | 829 /** |
830 * gets the predicted MV. | |
831 * @param n the block index | |
832 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4) | |
833 * @param mx the x component of the predicted motion vector | |
834 * @param my the y component of the predicted motion vector | |
835 */ | |
836 static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){ | |
837 const int index8= scan8[n]; | |
838 const int top_ref= h->ref_cache[list][ index8 - 8 ]; | |
839 const int left_ref= h->ref_cache[list][ index8 - 1 ]; | |
840 const int16_t * const A= h->mv_cache[list][ index8 - 1 ]; | |
841 const int16_t * const B= h->mv_cache[list][ index8 - 8 ]; | |
1169 | 842 const int16_t * C; |
843 int diagonal_ref, match_count; | |
844 | |
1168 | 845 assert(part_width==1 || part_width==2 || part_width==4); |
1169 | 846 |
1168 | 847 /* mv_cache |
2967 | 848 B . . A T T T T |
1168 | 849 U . . L . . , . |
850 U . . L . . . . | |
851 U . . L . . , . | |
852 . . . L . . . . | |
853 */ | |
1169 | 854 |
855 diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width); | |
856 match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref); | |
4600 | 857 tprintf(h->s.avctx, "pred_motion match_count=%d\n", match_count); |
1169 | 858 if(match_count > 1){ //most common |
859 *mx= mid_pred(A[0], B[0], C[0]); | |
860 *my= mid_pred(A[1], B[1], C[1]); | |
861 }else if(match_count==1){ | |
862 if(left_ref==ref){ | |
863 *mx= A[0]; | |
2967 | 864 *my= A[1]; |
1169 | 865 }else if(top_ref==ref){ |
866 *mx= B[0]; | |
2967 | 867 *my= B[1]; |
1169 | 868 }else{ |
869 *mx= C[0]; | |
2967 | 870 *my= C[1]; |
1169 | 871 } |
872 }else{ | |
873 if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){ | |
874 *mx= A[0]; | |
2967 | 875 *my= A[1]; |
1168 | 876 }else{ |
877 *mx= mid_pred(A[0], B[0], C[0]); | |
878 *my= mid_pred(A[1], B[1], C[1]); | |
879 } | |
1169 | 880 } |
2967 | 881 |
4600 | 882 tprintf(h->s.avctx, "pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref, A[0], A[1], ref, *mx, *my, h->s.mb_x, h->s.mb_y, n, list); |
1168 | 883 } |
884 | |
885 /** | |
886 * gets the directionally predicted 16x8 MV. | |
887 * @param n the block index | |
888 * @param mx the x component of the predicted motion vector | |
889 * @param my the y component of the predicted motion vector | |
890 */ | |
891 static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){ | |
892 if(n==0){ | |
893 const int top_ref= h->ref_cache[list][ scan8[0] - 8 ]; | |
894 const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ]; | |
895 | |
4600 | 896 tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list); |
2967 | 897 |
1168 | 898 if(top_ref == ref){ |
899 *mx= B[0]; | |
900 *my= B[1]; | |
901 return; | |
902 } | |
903 }else{ | |
904 const int left_ref= h->ref_cache[list][ scan8[8] - 1 ]; | |
905 const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ]; | |
2967 | 906 |
4600 | 907 tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); |
1168 | 908 |
909 if(left_ref == ref){ | |
910 *mx= A[0]; | |
911 *my= A[1]; | |
912 return; | |
913 } | |
914 } | |
915 | |
916 //RARE | |
917 pred_motion(h, n, 4, list, ref, mx, my); | |
918 } | |
919 | |
920 /** | |
921 * gets the directionally predicted 8x16 MV. | |
922 * @param n the block index | |
923 * @param mx the x component of the predicted motion vector | |
924 * @param my the y component of the predicted motion vector | |
925 */ | |
926 static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){ | |
927 if(n==0){ | |
928 const int left_ref= h->ref_cache[list][ scan8[0] - 1 ]; | |
929 const int16_t * const A= h->mv_cache[list][ scan8[0] - 1 ]; | |
2967 | 930 |
4600 | 931 tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); |
1168 | 932 |
933 if(left_ref == ref){ | |
934 *mx= A[0]; | |
935 *my= A[1]; | |
936 return; | |
937 } | |
938 }else{ | |
1169 | 939 const int16_t * C; |
940 int diagonal_ref; | |
941 | |
942 diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2); | |
2967 | 943 |
4600 | 944 tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list); |
1168 | 945 |
2967 | 946 if(diagonal_ref == ref){ |
1168 | 947 *mx= C[0]; |
948 *my= C[1]; | |
949 return; | |
950 } | |
951 } | |
952 | |
953 //RARE | |
954 pred_motion(h, n, 2, list, ref, mx, my); | |
955 } | |
956 | |
957 static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){ | |
958 const int top_ref = h->ref_cache[0][ scan8[0] - 8 ]; | |
959 const int left_ref= h->ref_cache[0][ scan8[0] - 1 ]; | |
960 | |
4600 | 961 tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", top_ref, left_ref, h->s.mb_x, h->s.mb_y); |
1168 | 962 |
963 if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE | |
964 || (top_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ] == 0) | |
965 || (left_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ] == 0)){ | |
2967 | 966 |
1168 | 967 *mx = *my = 0; |
968 return; | |
969 } | |
2967 | 970 |
1168 | 971 pred_motion(h, 0, 4, 0, 0, mx, my); |
972 | |
973 return; | |
974 } | |
975 | |
2396 | 976 static inline void direct_dist_scale_factor(H264Context * const h){ |
977 const int poc = h->s.current_picture_ptr->poc; | |
978 const int poc1 = h->ref_list[1][0].poc; | |
979 int i; | |
980 for(i=0; i<h->ref_count[0]; i++){ | |
981 int poc0 = h->ref_list[0][i].poc; | |
4594 | 982 int td = av_clip(poc1 - poc0, -128, 127); |
2396 | 983 if(td == 0 /* FIXME || pic0 is a long-term ref */){ |
984 h->dist_scale_factor[i] = 256; | |
985 }else{ | |
4594 | 986 int tb = av_clip(poc - poc0, -128, 127); |
4001 | 987 int tx = (16384 + (FFABS(td) >> 1)) / td; |
4594 | 988 h->dist_scale_factor[i] = av_clip((tb*tx + 32) >> 6, -1024, 1023); |
2396 | 989 } |
990 } | |
3316 | 991 if(FRAME_MBAFF){ |
992 for(i=0; i<h->ref_count[0]; i++){ | |
993 h->dist_scale_factor_field[2*i] = | |
994 h->dist_scale_factor_field[2*i+1] = h->dist_scale_factor[i]; | |
995 } | |
996 } | |
2396 | 997 } |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
998 static inline void direct_ref_list_init(H264Context * const h){ |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
999 MpegEncContext * const s = &h->s; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1000 Picture * const ref1 = &h->ref_list[1][0]; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1001 Picture * const cur = s->current_picture_ptr; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1002 int list, i, j; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1003 if(cur->pict_type == I_TYPE) |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1004 cur->ref_count[0] = 0; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1005 if(cur->pict_type != B_TYPE) |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1006 cur->ref_count[1] = 0; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1007 for(list=0; list<2; list++){ |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1008 cur->ref_count[list] = h->ref_count[list]; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1009 for(j=0; j<h->ref_count[list]; j++) |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1010 cur->ref_poc[list][j] = h->ref_list[list][j].poc; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1011 } |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1012 if(cur->pict_type != B_TYPE || h->direct_spatial_mv_pred) |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1013 return; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1014 for(list=0; list<2; list++){ |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1015 for(i=0; i<ref1->ref_count[list]; i++){ |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1016 const int poc = ref1->ref_poc[list][i]; |
3125 | 1017 h->map_col_to_list0[list][i] = 0; /* bogus; fills in for missing frames */ |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1018 for(j=0; j<h->ref_count[list]; j++) |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1019 if(h->ref_list[list][j].poc == poc){ |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1020 h->map_col_to_list0[list][i] = j; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1021 break; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1022 } |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1023 } |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1024 } |
3316 | 1025 if(FRAME_MBAFF){ |
1026 for(list=0; list<2; list++){ | |
1027 for(i=0; i<ref1->ref_count[list]; i++){ | |
1028 j = h->map_col_to_list0[list][i]; | |
1029 h->map_col_to_list0_field[list][2*i] = 2*j; | |
1030 h->map_col_to_list0_field[list][2*i+1] = 2*j+1; | |
1031 } | |
1032 } | |
1033 } | |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1034 } |
2396 | 1035 |
1036 static inline void pred_direct_motion(H264Context * const h, int *mb_type){ | |
1037 MpegEncContext * const s = &h->s; | |
1038 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; | |
1039 const int b8_xy = 2*s->mb_x + 2*s->mb_y*h->b8_stride; | |
1040 const int b4_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; | |
1041 const int mb_type_col = h->ref_list[1][0].mb_type[mb_xy]; | |
1042 const int16_t (*l1mv0)[2] = (const int16_t (*)[2]) &h->ref_list[1][0].motion_val[0][b4_xy]; | |
2808
932ec96933f5
fixing colocated mv if colocated block is L1 predicted
michael
parents:
2803
diff
changeset
|
1043 const int16_t (*l1mv1)[2] = (const int16_t (*)[2]) &h->ref_list[1][0].motion_val[1][b4_xy]; |
2396 | 1044 const int8_t *l1ref0 = &h->ref_list[1][0].ref_index[0][b8_xy]; |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1045 const int8_t *l1ref1 = &h->ref_list[1][0].ref_index[1][b8_xy]; |
2396 | 1046 const int is_b8x8 = IS_8X8(*mb_type); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
1047 unsigned int sub_mb_type; |
2396 | 1048 int i8, i4; |
1049 | |
3316 | 1050 #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM) |
2396 | 1051 if(IS_8X8(mb_type_col) && !h->sps.direct_8x8_inference_flag){ |
1052 /* FIXME save sub mb types from previous frames (or derive from MVs) | |
1053 * so we know exactly what block size to use */ | |
1054 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */ | |
2536 | 1055 *mb_type = MB_TYPE_8x8|MB_TYPE_L0L1; |
3316 | 1056 }else if(!is_b8x8 && (mb_type_col & MB_TYPE_16x16_OR_INTRA)){ |
2396 | 1057 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ |
1058 *mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */ | |
1059 }else{ | |
1060 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
2536 | 1061 *mb_type = MB_TYPE_8x8|MB_TYPE_L0L1; |
2396 | 1062 } |
1063 if(!is_b8x8) | |
1064 *mb_type |= MB_TYPE_DIRECT2; | |
3316 | 1065 if(MB_FIELD) |
1066 *mb_type |= MB_TYPE_INTERLACED; | |
2396 | 1067 |
4600 | 1068 tprintf(s->avctx, "mb_type = %08x, sub_mb_type = %08x, is_b8x8 = %d, mb_type_col = %08x\n", *mb_type, sub_mb_type, is_b8x8, mb_type_col); |
2967 | 1069 |
2396 | 1070 if(h->direct_spatial_mv_pred){ |
1071 int ref[2]; | |
1072 int mv[2][2]; | |
1073 int list; | |
1074 | |
3316 | 1075 /* FIXME interlacing + spatial direct uses wrong colocated block positions */ |
1076 | |
2396 | 1077 /* ref = min(neighbors) */ |
1078 for(list=0; list<2; list++){ | |
1079 int refa = h->ref_cache[list][scan8[0] - 1]; | |
1080 int refb = h->ref_cache[list][scan8[0] - 8]; | |
1081 int refc = h->ref_cache[list][scan8[0] - 8 + 4]; | |
1082 if(refc == -2) | |
1083 refc = h->ref_cache[list][scan8[0] - 8 - 1]; | |
1084 ref[list] = refa; | |
1085 if(ref[list] < 0 || (refb < ref[list] && refb >= 0)) | |
1086 ref[list] = refb; | |
1087 if(ref[list] < 0 || (refc < ref[list] && refc >= 0)) | |
1088 ref[list] = refc; | |
1089 if(ref[list] < 0) | |
1090 ref[list] = -1; | |
1091 } | |
1092 | |
1093 if(ref[0] < 0 && ref[1] < 0){ | |
1094 ref[0] = ref[1] = 0; | |
1095 mv[0][0] = mv[0][1] = | |
1096 mv[1][0] = mv[1][1] = 0; | |
1097 }else{ | |
1098 for(list=0; list<2; list++){ | |
1099 if(ref[list] >= 0) | |
1100 pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]); | |
1101 else | |
1102 mv[list][0] = mv[list][1] = 0; | |
1103 } | |
1104 } | |
1105 | |
1106 if(ref[1] < 0){ | |
1107 *mb_type &= ~MB_TYPE_P0L1; | |
1108 sub_mb_type &= ~MB_TYPE_P0L1; | |
1109 }else if(ref[0] < 0){ | |
1110 *mb_type &= ~MB_TYPE_P0L0; | |
1111 sub_mb_type &= ~MB_TYPE_P0L0; | |
1112 } | |
1113 | |
1114 if(IS_16X16(*mb_type)){ | |
4540 | 1115 int a=0, b=0; |
1116 | |
3001
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1117 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1); |
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1118 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1); |
2967 | 1119 if(!IS_INTRA(mb_type_col) |
4001 | 1120 && ( (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1) |
1121 || (l1ref0[0] < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1 | |
2834 | 1122 && (h->x264_build>33 || !h->x264_build)))){ |
2396 | 1123 if(ref[0] > 0) |
4540 | 1124 a= pack16to32(mv[0][0],mv[0][1]); |
2396 | 1125 if(ref[1] > 0) |
4540 | 1126 b= pack16to32(mv[1][0],mv[1][1]); |
2396 | 1127 }else{ |
4540 | 1128 a= pack16to32(mv[0][0],mv[0][1]); |
1129 b= pack16to32(mv[1][0],mv[1][1]); | |
1130 } | |
1131 fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4); | |
1132 fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4); | |
2396 | 1133 }else{ |
1134 for(i8=0; i8<4; i8++){ | |
1135 const int x8 = i8&1; | |
1136 const int y8 = i8>>1; | |
2967 | 1137 |
2396 | 1138 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) |
1139 continue; | |
1140 h->sub_mb_type[i8] = sub_mb_type; | |
2967 | 1141 |
2396 | 1142 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4); |
1143 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mv[1][0],mv[1][1]), 4); | |
3001
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1144 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); |
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1145 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); |
2967 | 1146 |
2396 | 1147 /* col_zero_flag */ |
2967 | 1148 if(!IS_INTRA(mb_type_col) && ( l1ref0[x8 + y8*h->b8_stride] == 0 |
1149 || (l1ref0[x8 + y8*h->b8_stride] < 0 && l1ref1[x8 + y8*h->b8_stride] == 0 | |
2834 | 1150 && (h->x264_build>33 || !h->x264_build)))){ |
2808
932ec96933f5
fixing colocated mv if colocated block is L1 predicted
michael
parents:
2803
diff
changeset
|
1151 const int16_t (*l1mv)[2]= l1ref0[x8 + y8*h->b8_stride] == 0 ? l1mv0 : l1mv1; |
3002 | 1152 if(IS_SUB_8X8(sub_mb_type)){ |
1153 const int16_t *mv_col = l1mv[x8*3 + y8*3*h->b_stride]; | |
4001 | 1154 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ |
3002 | 1155 if(ref[0] == 0) |
1156 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1157 if(ref[1] == 0) | |
1158 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1159 } | |
1160 }else | |
2396 | 1161 for(i4=0; i4<4; i4++){ |
2808
932ec96933f5
fixing colocated mv if colocated block is L1 predicted
michael
parents:
2803
diff
changeset
|
1162 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*h->b_stride]; |
4001 | 1163 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ |
2396 | 1164 if(ref[0] == 0) |
1165 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0; | |
1166 if(ref[1] == 0) | |
1167 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0; | |
1168 } | |
1169 } | |
1170 } | |
1171 } | |
1172 } | |
1173 }else{ /* direct temporal mv pred */ | |
3316 | 1174 const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]}; |
1175 const int *dist_scale_factor = h->dist_scale_factor; | |
1176 | |
1177 if(FRAME_MBAFF){ | |
1178 if(IS_INTERLACED(*mb_type)){ | |
1179 map_col_to_list0[0] = h->map_col_to_list0_field[0]; | |
1180 map_col_to_list0[1] = h->map_col_to_list0_field[1]; | |
1181 dist_scale_factor = h->dist_scale_factor_field; | |
1182 } | |
1183 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col)){ | |
1184 /* FIXME assumes direct_8x8_inference == 1 */ | |
1185 const int pair_xy = s->mb_x + (s->mb_y&~1)*s->mb_stride; | |
1186 int mb_types_col[2]; | |
1187 int y_shift; | |
1188 | |
1189 *mb_type = MB_TYPE_8x8|MB_TYPE_L0L1 | |
1190 | (is_b8x8 ? 0 : MB_TYPE_DIRECT2) | |
1191 | (*mb_type & MB_TYPE_INTERLACED); | |
1192 sub_mb_type = MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2|MB_TYPE_16x16; | |
1193 | |
1194 if(IS_INTERLACED(*mb_type)){ | |
1195 /* frame to field scaling */ | |
1196 mb_types_col[0] = h->ref_list[1][0].mb_type[pair_xy]; | |
1197 mb_types_col[1] = h->ref_list[1][0].mb_type[pair_xy+s->mb_stride]; | |
1198 if(s->mb_y&1){ | |
1199 l1ref0 -= 2*h->b8_stride; | |
1200 l1ref1 -= 2*h->b8_stride; | |
1201 l1mv0 -= 4*h->b_stride; | |
1202 l1mv1 -= 4*h->b_stride; | |
1203 } | |
1204 y_shift = 0; | |
1205 | |
1206 if( (mb_types_col[0] & MB_TYPE_16x16_OR_INTRA) | |
1207 && (mb_types_col[1] & MB_TYPE_16x16_OR_INTRA) | |
1208 && !is_b8x8) | |
1209 *mb_type |= MB_TYPE_16x8; | |
1210 else | |
1211 *mb_type |= MB_TYPE_8x8; | |
1212 }else{ | |
1213 /* field to frame scaling */ | |
1214 /* col_mb_y = (mb_y&~1) + (topAbsDiffPOC < bottomAbsDiffPOC ? 0 : 1) | |
1215 * but in MBAFF, top and bottom POC are equal */ | |
1216 int dy = (s->mb_y&1) ? 1 : 2; | |
1217 mb_types_col[0] = | |
1218 mb_types_col[1] = h->ref_list[1][0].mb_type[pair_xy+s->mb_stride]; | |
1219 l1ref0 += dy*h->b8_stride; | |
1220 l1ref1 += dy*h->b8_stride; | |
1221 l1mv0 += 2*dy*h->b_stride; | |
1222 l1mv1 += 2*dy*h->b_stride; | |
1223 y_shift = 2; | |
1224 | |
1225 if((mb_types_col[0] & (MB_TYPE_16x16_OR_INTRA|MB_TYPE_16x8)) | |
1226 && !is_b8x8) | |
1227 *mb_type |= MB_TYPE_16x16; | |
1228 else | |
1229 *mb_type |= MB_TYPE_8x8; | |
1230 } | |
1231 | |
1232 for(i8=0; i8<4; i8++){ | |
1233 const int x8 = i8&1; | |
1234 const int y8 = i8>>1; | |
1235 int ref0, scale; | |
1236 const int16_t (*l1mv)[2]= l1mv0; | |
1237 | |
1238 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
1239 continue; | |
1240 h->sub_mb_type[i8] = sub_mb_type; | |
1241 | |
1242 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1243 if(IS_INTRA(mb_types_col[y8])){ | |
1244 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1245 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1246 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1247 continue; | |
1248 } | |
1249 | |
1250 ref0 = l1ref0[x8 + (y8*2>>y_shift)*h->b8_stride]; | |
1251 if(ref0 >= 0) | |
1252 ref0 = map_col_to_list0[0][ref0*2>>y_shift]; | |
1253 else{ | |
1254 ref0 = map_col_to_list0[1][l1ref1[x8 + (y8*2>>y_shift)*h->b8_stride]*2>>y_shift]; | |
1255 l1mv= l1mv1; | |
1256 } | |
1257 scale = dist_scale_factor[ref0]; | |
1258 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); | |
1259 | |
1260 { | |
1261 const int16_t *mv_col = l1mv[x8*3 + (y8*6>>y_shift)*h->b_stride]; | |
1262 int my_col = (mv_col[1]<<y_shift)/2; | |
1263 int mx = (scale * mv_col[0] + 128) >> 8; | |
1264 int my = (scale * my_col + 128) >> 8; | |
1265 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); | |
1266 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4); | |
1267 } | |
1268 } | |
1269 return; | |
1270 } | |
1271 } | |
1272 | |
1273 /* one-to-one mv scaling */ | |
1274 | |
2396 | 1275 if(IS_16X16(*mb_type)){ |
4541 | 1276 int ref, mv0, mv1; |
1277 | |
2396 | 1278 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1); |
1279 if(IS_INTRA(mb_type_col)){ | |
4541 | 1280 ref=mv0=mv1=0; |
2396 | 1281 }else{ |
3316 | 1282 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0]] |
1283 : map_col_to_list0[1][l1ref1[0]]; | |
1284 const int scale = dist_scale_factor[ref0]; | |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1285 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0]; |
2396 | 1286 int mv_l0[2]; |
3316 | 1287 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; |
1288 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
4541 | 1289 ref= ref0; |
1290 mv0= pack16to32(mv_l0[0],mv_l0[1]); | |
1291 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
1292 } | |
1293 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1); | |
1294 fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4); | |
1295 fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4); | |
2396 | 1296 }else{ |
1297 for(i8=0; i8<4; i8++){ | |
1298 const int x8 = i8&1; | |
1299 const int y8 = i8>>1; | |
3316 | 1300 int ref0, scale; |
2834 | 1301 const int16_t (*l1mv)[2]= l1mv0; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1302 |
2396 | 1303 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) |
1304 continue; | |
1305 h->sub_mb_type[i8] = sub_mb_type; | |
3316 | 1306 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); |
2396 | 1307 if(IS_INTRA(mb_type_col)){ |
1308 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1309 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1310 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1311 continue; | |
1312 } | |
2967 | 1313 |
2396 | 1314 ref0 = l1ref0[x8 + y8*h->b8_stride]; |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1315 if(ref0 >= 0) |
3316 | 1316 ref0 = map_col_to_list0[0][ref0]; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1317 else{ |
3316 | 1318 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*h->b8_stride]]; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1319 l1mv= l1mv1; |
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1320 } |
3316 | 1321 scale = dist_scale_factor[ref0]; |
2967 | 1322 |
2396 | 1323 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); |
3002 | 1324 if(IS_SUB_8X8(sub_mb_type)){ |
1325 const int16_t *mv_col = l1mv[x8*3 + y8*3*h->b_stride]; | |
3316 | 1326 int mx = (scale * mv_col[0] + 128) >> 8; |
1327 int my = (scale * mv_col[1] + 128) >> 8; | |
3002 | 1328 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); |
1329 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4); | |
1330 }else | |
2396 | 1331 for(i4=0; i4<4; i4++){ |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1332 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*h->b_stride]; |
2396 | 1333 int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]]; |
3316 | 1334 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; |
1335 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
2396 | 1336 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = |
1337 pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
1338 } | |
1339 } | |
1340 } | |
1341 } | |
1342 } | |
1343 | |
1168 | 1344 static inline void write_back_motion(H264Context *h, int mb_type){ |
1345 MpegEncContext * const s = &h->s; | |
1346 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; | |
1347 const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride; | |
1348 int list; | |
1349 | |
3219
cf233efbcece
10l in 1.199 (write_back_motion with B-pyramid + spatial)
lorenm
parents:
3215
diff
changeset
|
1350 if(!USES_LIST(mb_type, 0)) |
cf233efbcece
10l in 1.199 (write_back_motion with B-pyramid + spatial)
lorenm
parents:
3215
diff
changeset
|
1351 fill_rectangle(&s->current_picture.ref_index[0][b8_xy], 2, 2, h->b8_stride, (uint8_t)LIST_NOT_USED, 1); |
cf233efbcece
10l in 1.199 (write_back_motion with B-pyramid + spatial)
lorenm
parents:
3215
diff
changeset
|
1352 |
4533 | 1353 for(list=0; list<h->list_count; list++){ |
1168 | 1354 int y; |
3212 | 1355 if(!USES_LIST(mb_type, list)) |
2396 | 1356 continue; |
2967 | 1357 |
1168 | 1358 for(y=0; y<4; y++){ |
1359 *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+0 + 8*y]; | |
1360 *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+2 + 8*y]; | |
1361 } | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1362 if( h->pps.cabac ) { |
3927 | 1363 if(IS_SKIP(mb_type)) |
1364 fill_rectangle(h->mvd_table[list][b_xy], 4, 4, h->b_stride, 0, 4); | |
1365 else | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1366 for(y=0; y<4; y++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1367 *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1368 *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1369 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1370 } |
3212 | 1371 |
1372 { | |
3776 | 1373 int8_t *ref_index = &s->current_picture.ref_index[list][b8_xy]; |
3212 | 1374 ref_index[0+0*h->b8_stride]= h->ref_cache[list][scan8[0]]; |
1375 ref_index[1+0*h->b8_stride]= h->ref_cache[list][scan8[4]]; | |
1376 ref_index[0+1*h->b8_stride]= h->ref_cache[list][scan8[8]]; | |
1377 ref_index[1+1*h->b8_stride]= h->ref_cache[list][scan8[12]]; | |
1168 | 1378 } |
1379 } | |
2967 | 1380 |
2396 | 1381 if(h->slice_type == B_TYPE && h->pps.cabac){ |
1382 if(IS_8X8(mb_type)){ | |
3212 | 1383 uint8_t *direct_table = &h->direct_table[b8_xy]; |
1384 direct_table[1+0*h->b8_stride] = IS_DIRECT(h->sub_mb_type[1]) ? 1 : 0; | |
1385 direct_table[0+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[2]) ? 1 : 0; | |
1386 direct_table[1+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[3]) ? 1 : 0; | |
2396 | 1387 } |
1388 } | |
1168 | 1389 } |
1390 | |
1391 /** | |
1392 * Decodes a network abstraction layer unit. | |
1393 * @param consumed is the number of bytes used as input | |
1394 * @param length is the length of the array | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
1395 * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp tailing? |
2967 | 1396 * @returns decoded bytes, might be src+1 if no escapes |
1168 | 1397 */ |
1398 static uint8_t *decode_nal(H264Context *h, uint8_t *src, int *dst_length, int *consumed, int length){ | |
1399 int i, si, di; | |
1400 uint8_t *dst; | |
5174 | 1401 int bufidx; |
1168 | 1402 |
2979 | 1403 // src[0]&0x80; //forbidden bit |
1168 | 1404 h->nal_ref_idc= src[0]>>5; |
1405 h->nal_unit_type= src[0]&0x1F; | |
1406 | |
1407 src++; length--; | |
2967 | 1408 #if 0 |
1168 | 1409 for(i=0; i<length; i++) |
1410 printf("%2X ", src[i]); | |
1411 #endif | |
1412 for(i=0; i+1<length; i+=2){ | |
1413 if(src[i]) continue; | |
1414 if(i>0 && src[i-1]==0) i--; | |
1415 if(i+2<length && src[i+1]==0 && src[i+2]<=3){ | |
1416 if(src[i+2]!=3){ | |
1417 /* startcode, so we must be past the end */ | |
1418 length=i; | |
1419 } | |
1420 break; | |
1421 } | |
1422 } | |
1423 | |
1424 if(i>=length-1){ //no escaped 0 | |
1425 *dst_length= length; | |
1426 *consumed= length+1; //+1 for the header | |
2967 | 1427 return src; |
1168 | 1428 } |
1429 | |
5174 | 1430 bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data |
1431 h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length); | |
1432 dst= h->rbsp_buffer[bufidx]; | |
1168 | 1433 |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1434 if (dst == NULL){ |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1435 return NULL; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1436 } |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1437 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
1438 //printf("decoding esc\n"); |
1168 | 1439 si=di=0; |
2967 | 1440 while(si<length){ |
1168 | 1441 //remove escapes (very rare 1:2^22) |
1442 if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){ | |
1443 if(src[si+2]==3){ //escape | |
1444 dst[di++]= 0; | |
1445 dst[di++]= 0; | |
1446 si+=3; | |
1957
54411768fa38
h264 nal decoding fix by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1956
diff
changeset
|
1447 continue; |
1168 | 1448 }else //next start code |
1449 break; | |
1450 } | |
1451 | |
1452 dst[di++]= src[si++]; | |
1453 } | |
1454 | |
1455 *dst_length= di; | |
1456 *consumed= si + 1;//+1 for the header | |
5129 | 1457 //FIXME store exact number of bits in the getbitcontext (it is needed for decoding) |
1168 | 1458 return dst; |
1459 } | |
1460 | |
1461 /** | |
1462 * identifies the exact end of the bitstream | |
1463 * @return the length of the trailing, or 0 if damaged | |
1464 */ | |
4600 | 1465 static int decode_rbsp_trailing(H264Context *h, uint8_t *src){ |
1168 | 1466 int v= *src; |
1467 int r; | |
1468 | |
4600 | 1469 tprintf(h->s.avctx, "rbsp trailing %X\n", v); |
1168 | 1470 |
1471 for(r=1; r<9; r++){ | |
1472 if(v&1) return r; | |
1473 v>>=1; | |
1474 } | |
1475 return 0; | |
1476 } | |
1477 | |
1478 /** | |
1479 * idct tranforms the 16 dc values and dequantize them. | |
1480 * @param qp quantization parameter | |
1481 */ | |
2919 | 1482 static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){ |
1168 | 1483 #define stride 16 |
1484 int i; | |
1485 int temp[16]; //FIXME check if this is a good idea | |
1486 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
1487 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
1488 | |
1489 //memset(block, 64, 2*256); | |
1490 //return; | |
1491 for(i=0; i<4; i++){ | |
1492 const int offset= y_offset[i]; | |
1493 const int z0= block[offset+stride*0] + block[offset+stride*4]; | |
1494 const int z1= block[offset+stride*0] - block[offset+stride*4]; | |
1495 const int z2= block[offset+stride*1] - block[offset+stride*5]; | |
1496 const int z3= block[offset+stride*1] + block[offset+stride*5]; | |
1497 | |
1498 temp[4*i+0]= z0+z3; | |
1499 temp[4*i+1]= z1+z2; | |
1500 temp[4*i+2]= z1-z2; | |
1501 temp[4*i+3]= z0-z3; | |
1502 } | |
1503 | |
1504 for(i=0; i<4; i++){ | |
1505 const int offset= x_offset[i]; | |
1506 const int z0= temp[4*0+i] + temp[4*2+i]; | |
1507 const int z1= temp[4*0+i] - temp[4*2+i]; | |
1508 const int z2= temp[4*1+i] - temp[4*3+i]; | |
1509 const int z3= temp[4*1+i] + temp[4*3+i]; | |
1510 | |
2919 | 1511 block[stride*0 +offset]= ((((z0 + z3)*qmul + 128 ) >> 8)); //FIXME think about merging this into decode_resdual |
1512 block[stride*2 +offset]= ((((z1 + z2)*qmul + 128 ) >> 8)); | |
1513 block[stride*8 +offset]= ((((z1 - z2)*qmul + 128 ) >> 8)); | |
1514 block[stride*10+offset]= ((((z0 - z3)*qmul + 128 ) >> 8)); | |
1168 | 1515 } |
1516 } | |
1517 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1518 #if 0 |
1168 | 1519 /** |
1520 * dct tranforms the 16 dc values. | |
1521 * @param qp quantization parameter ??? FIXME | |
1522 */ | |
1523 static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){ | |
1524 // const int qmul= dequant_coeff[qp][0]; | |
1525 int i; | |
1526 int temp[16]; //FIXME check if this is a good idea | |
1527 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
1528 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
1529 | |
1530 for(i=0; i<4; i++){ | |
1531 const int offset= y_offset[i]; | |
1532 const int z0= block[offset+stride*0] + block[offset+stride*4]; | |
1533 const int z1= block[offset+stride*0] - block[offset+stride*4]; | |
1534 const int z2= block[offset+stride*1] - block[offset+stride*5]; | |
1535 const int z3= block[offset+stride*1] + block[offset+stride*5]; | |
1536 | |
1537 temp[4*i+0]= z0+z3; | |
1538 temp[4*i+1]= z1+z2; | |
1539 temp[4*i+2]= z1-z2; | |
1540 temp[4*i+3]= z0-z3; | |
1541 } | |
1542 | |
1543 for(i=0; i<4; i++){ | |
1544 const int offset= x_offset[i]; | |
1545 const int z0= temp[4*0+i] + temp[4*2+i]; | |
1546 const int z1= temp[4*0+i] - temp[4*2+i]; | |
1547 const int z2= temp[4*1+i] - temp[4*3+i]; | |
1548 const int z3= temp[4*1+i] + temp[4*3+i]; | |
1549 | |
1550 block[stride*0 +offset]= (z0 + z3)>>1; | |
1551 block[stride*2 +offset]= (z1 + z2)>>1; | |
1552 block[stride*8 +offset]= (z1 - z2)>>1; | |
1553 block[stride*10+offset]= (z0 - z3)>>1; | |
1554 } | |
1555 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1556 #endif |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1557 |
1168 | 1558 #undef xStride |
1559 #undef stride | |
1560 | |
2919 | 1561 static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){ |
1168 | 1562 const int stride= 16*2; |
1563 const int xStride= 16; | |
1564 int a,b,c,d,e; | |
1565 | |
1566 a= block[stride*0 + xStride*0]; | |
1567 b= block[stride*0 + xStride*1]; | |
1568 c= block[stride*1 + xStride*0]; | |
1569 d= block[stride*1 + xStride*1]; | |
1570 | |
1571 e= a-b; | |
1572 a= a+b; | |
1573 b= c-d; | |
1574 c= c+d; | |
1575 | |
2919 | 1576 block[stride*0 + xStride*0]= ((a+c)*qmul) >> 7; |
1577 block[stride*0 + xStride*1]= ((e+b)*qmul) >> 7; | |
1578 block[stride*1 + xStride*0]= ((a-c)*qmul) >> 7; | |
1579 block[stride*1 + xStride*1]= ((e-b)*qmul) >> 7; | |
1168 | 1580 } |
1581 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1582 #if 0 |
1168 | 1583 static void chroma_dc_dct_c(DCTELEM *block){ |
1584 const int stride= 16*2; | |
1585 const int xStride= 16; | |
1586 int a,b,c,d,e; | |
1587 | |
1588 a= block[stride*0 + xStride*0]; | |
1589 b= block[stride*0 + xStride*1]; | |
1590 c= block[stride*1 + xStride*0]; | |
1591 d= block[stride*1 + xStride*1]; | |
1592 | |
1593 e= a-b; | |
1594 a= a+b; | |
1595 b= c-d; | |
1596 c= c+d; | |
1597 | |
1598 block[stride*0 + xStride*0]= (a+c); | |
1599 block[stride*0 + xStride*1]= (e+b); | |
1600 block[stride*1 + xStride*0]= (a-c); | |
1601 block[stride*1 + xStride*1]= (e-b); | |
1602 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1603 #endif |
1168 | 1604 |
1605 /** | |
1606 * gets the chroma qp. | |
1607 */ | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
1608 static inline int get_chroma_qp(H264Context *h, int t, int qscale){ |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
1609 return h->pps.chroma_qp_table[t][qscale & 0xff]; |
1168 | 1610 } |
1611 | |
5127 | 1612 //FIXME need to check that this does not overflow signed 32 bit for low qp, i am not sure, it's very close |
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4546
diff
changeset
|
1613 //FIXME check that gcc inlines this (and optimizes intra & separate_dc stuff away) |
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4546
diff
changeset
|
1614 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int separate_dc){ |
1168 | 1615 int i; |
1616 const int * const quant_table= quant_coeff[qscale]; | |
1617 const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6; | |
1618 const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1; | |
1619 const unsigned int threshold2= (threshold1<<1); | |
1620 int last_non_zero; | |
1621 | |
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4546
diff
changeset
|
1622 if(separate_dc){ |
1168 | 1623 if(qscale<=18){ |
1624 //avoid overflows | |
1625 const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6; | |
1626 const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1; | |
1627 const unsigned int dc_threshold2= (dc_threshold1<<1); | |
1628 | |
1629 int level= block[0]*quant_coeff[qscale+18][0]; | |
1630 if(((unsigned)(level+dc_threshold1))>dc_threshold2){ | |
1631 if(level>0){ | |
1632 level= (dc_bias + level)>>(QUANT_SHIFT-2); | |
1633 block[0]= level; | |
1634 }else{ | |
1635 level= (dc_bias - level)>>(QUANT_SHIFT-2); | |
1636 block[0]= -level; | |
1637 } | |
1638 // last_non_zero = i; | |
1639 }else{ | |
1640 block[0]=0; | |
1641 } | |
1642 }else{ | |
1643 const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6; | |
1644 const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1; | |
1645 const unsigned int dc_threshold2= (dc_threshold1<<1); | |
1646 | |
1647 int level= block[0]*quant_table[0]; | |
1648 if(((unsigned)(level+dc_threshold1))>dc_threshold2){ | |
1649 if(level>0){ | |
1650 level= (dc_bias + level)>>(QUANT_SHIFT+1); | |
1651 block[0]= level; | |
1652 }else{ | |
1653 level= (dc_bias - level)>>(QUANT_SHIFT+1); | |
1654 block[0]= -level; | |
1655 } | |
1656 // last_non_zero = i; | |
1657 }else{ | |
1658 block[0]=0; | |
1659 } | |
1660 } | |
1661 last_non_zero= 0; | |
1662 i=1; | |
1663 }else{ | |
1664 last_non_zero= -1; | |
1665 i=0; | |
1666 } | |
1667 | |
1668 for(; i<16; i++){ | |
1669 const int j= scantable[i]; | |
1670 int level= block[j]*quant_table[j]; | |
1671 | |
1672 // if( bias+level >= (1<<(QMAT_SHIFT - 3)) | |
1673 // || bias-level >= (1<<(QMAT_SHIFT - 3))){ | |
1674 if(((unsigned)(level+threshold1))>threshold2){ | |
1675 if(level>0){ | |
1676 level= (bias + level)>>QUANT_SHIFT; | |
1677 block[j]= level; | |
1678 }else{ | |
1679 level= (bias - level)>>QUANT_SHIFT; | |
1680 block[j]= -level; | |
1681 } | |
1682 last_non_zero = i; | |
1683 }else{ | |
1684 block[j]=0; | |
1685 } | |
1686 } | |
1687 | |
1688 return last_non_zero; | |
1689 } | |
1690 | |
1691 static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list, | |
1692 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
1693 int src_x_offset, int src_y_offset, | |
1694 qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){ | |
1695 MpegEncContext * const s = &h->s; | |
1696 const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8; | |
3316 | 1697 int my= h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8; |
1168 | 1698 const int luma_xy= (mx&3) + ((my&3)<<2); |
3316 | 1699 uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*h->mb_linesize; |
1700 uint8_t * src_cb, * src_cr; | |
1701 int extra_width= h->emu_edge_width; | |
1702 int extra_height= h->emu_edge_height; | |
1168 | 1703 int emu=0; |
1704 const int full_mx= mx>>2; | |
1705 const int full_my= my>>2; | |
2861
3b920e274b26
fix emulated edge motion compensation when resolution%16!=0
lorenm
parents:
2846
diff
changeset
|
1706 const int pic_width = 16*s->mb_width; |
5815 | 1707 const int pic_height = 16*s->mb_height >> MB_FIELD; |
2967 | 1708 |
4390 | 1709 if(!pic->data[0]) //FIXME this is unacceptable, some senseable error concealment must be done for missing reference frames |
3125 | 1710 return; |
2967 | 1711 |
1168 | 1712 if(mx&7) extra_width -= 3; |
1713 if(my&7) extra_height -= 3; | |
2967 | 1714 |
1715 if( full_mx < 0-extra_width | |
1716 || full_my < 0-extra_height | |
1717 || full_mx + 16/*FIXME*/ > pic_width + extra_width | |
2861
3b920e274b26
fix emulated edge motion compensation when resolution%16!=0
lorenm
parents:
2846
diff
changeset
|
1718 || full_my + 16/*FIXME*/ > pic_height + extra_height){ |
3316 | 1719 ff_emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*h->mb_linesize, h->mb_linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, pic_width, pic_height); |
1720 src_y= s->edge_emu_buffer + 2 + 2*h->mb_linesize; | |
1168 | 1721 emu=1; |
1722 } | |
2967 | 1723 |
3316 | 1724 qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); //FIXME try variable height perhaps? |
1168 | 1725 if(!square){ |
3316 | 1726 qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize); |
1168 | 1727 } |
2967 | 1728 |
5434 | 1729 if(ENABLE_GRAY && s->flags&CODEC_FLAG_GRAY) return; |
2967 | 1730 |
5815 | 1731 if(MB_FIELD){ |
3316 | 1732 // chroma offset when predicting from a field of opposite parity |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
1733 my += 2 * ((s->mb_y & 1) - (pic->reference - 1)); |
3316 | 1734 emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1); |
1735 } | |
1736 src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize; | |
1737 src_cr= pic->data[2] + (mx>>3) + (my>>3)*h->mb_uvlinesize; | |
1168 | 1738 |
1739 if(emu){ | |
3316 | 1740 ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, h->mb_uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1); |
1741 src_cb= s->edge_emu_buffer; | |
1742 } | |
1743 chroma_op(dest_cb, src_cb, h->mb_uvlinesize, chroma_height, mx&7, my&7); | |
1744 | |
1745 if(emu){ | |
1746 ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, h->mb_uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1); | |
1168 | 1747 src_cr= s->edge_emu_buffer; |
1748 } | |
3316 | 1749 chroma_op(dest_cr, src_cr, h->mb_uvlinesize, chroma_height, mx&7, my&7); |
1168 | 1750 } |
1751 | |
2415 | 1752 static inline void mc_part_std(H264Context *h, int n, int square, int chroma_height, int delta, |
1168 | 1753 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
1754 int x_offset, int y_offset, | |
1755 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
1756 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | |
1757 int list0, int list1){ | |
1758 MpegEncContext * const s = &h->s; | |
1759 qpel_mc_func *qpix_op= qpix_put; | |
1760 h264_chroma_mc_func chroma_op= chroma_put; | |
2967 | 1761 |
3316 | 1762 dest_y += 2*x_offset + 2*y_offset*h-> mb_linesize; |
1763 dest_cb += x_offset + y_offset*h->mb_uvlinesize; | |
1764 dest_cr += x_offset + y_offset*h->mb_uvlinesize; | |
1168 | 1765 x_offset += 8*s->mb_x; |
5815 | 1766 y_offset += 8*(s->mb_y >> MB_FIELD); |
2967 | 1767 |
1168 | 1768 if(list0){ |
1169 | 1769 Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ]; |
1168 | 1770 mc_dir_part(h, ref, n, square, chroma_height, delta, 0, |
1771 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1772 qpix_op, chroma_op); | |
1773 | |
1774 qpix_op= qpix_avg; | |
1775 chroma_op= chroma_avg; | |
1776 } | |
1777 | |
1778 if(list1){ | |
1169 | 1779 Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ]; |
1168 | 1780 mc_dir_part(h, ref, n, square, chroma_height, delta, 1, |
1781 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1782 qpix_op, chroma_op); | |
1783 } | |
1784 } | |
1785 | |
2415 | 1786 static inline void mc_part_weighted(H264Context *h, int n, int square, int chroma_height, int delta, |
1787 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
1788 int x_offset, int y_offset, | |
1789 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
1790 h264_weight_func luma_weight_op, h264_weight_func chroma_weight_op, | |
1791 h264_biweight_func luma_weight_avg, h264_biweight_func chroma_weight_avg, | |
1792 int list0, int list1){ | |
1793 MpegEncContext * const s = &h->s; | |
1794 | |
3316 | 1795 dest_y += 2*x_offset + 2*y_offset*h-> mb_linesize; |
1796 dest_cb += x_offset + y_offset*h->mb_uvlinesize; | |
1797 dest_cr += x_offset + y_offset*h->mb_uvlinesize; | |
2415 | 1798 x_offset += 8*s->mb_x; |
5815 | 1799 y_offset += 8*(s->mb_y >> MB_FIELD); |
2967 | 1800 |
2415 | 1801 if(list0 && list1){ |
1802 /* don't optimize for luma-only case, since B-frames usually | |
1803 * use implicit weights => chroma too. */ | |
1804 uint8_t *tmp_cb = s->obmc_scratchpad; | |
3316 | 1805 uint8_t *tmp_cr = s->obmc_scratchpad + 8; |
1806 uint8_t *tmp_y = s->obmc_scratchpad + 8*h->mb_uvlinesize; | |
2415 | 1807 int refn0 = h->ref_cache[0][ scan8[n] ]; |
1808 int refn1 = h->ref_cache[1][ scan8[n] ]; | |
1809 | |
1810 mc_dir_part(h, &h->ref_list[0][refn0], n, square, chroma_height, delta, 0, | |
1811 dest_y, dest_cb, dest_cr, | |
1812 x_offset, y_offset, qpix_put, chroma_put); | |
1813 mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1, | |
1814 tmp_y, tmp_cb, tmp_cr, | |
1815 x_offset, y_offset, qpix_put, chroma_put); | |
1816 | |
1817 if(h->use_weight == 2){ | |
1818 int weight0 = h->implicit_weight[refn0][refn1]; | |
1819 int weight1 = 64 - weight0; | |
3316 | 1820 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, weight1, 0); |
1821 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0); | |
1822 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0); | |
2415 | 1823 }else{ |
3316 | 1824 luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_denom, |
2967 | 1825 h->luma_weight[0][refn0], h->luma_weight[1][refn1], |
3029 | 1826 h->luma_offset[0][refn0] + h->luma_offset[1][refn1]); |
3316 | 1827 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2967 | 1828 h->chroma_weight[0][refn0][0], h->chroma_weight[1][refn1][0], |
3029 | 1829 h->chroma_offset[0][refn0][0] + h->chroma_offset[1][refn1][0]); |
3316 | 1830 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2967 | 1831 h->chroma_weight[0][refn0][1], h->chroma_weight[1][refn1][1], |
3029 | 1832 h->chroma_offset[0][refn0][1] + h->chroma_offset[1][refn1][1]); |
2415 | 1833 } |
1834 }else{ | |
1835 int list = list1 ? 1 : 0; | |
1836 int refn = h->ref_cache[list][ scan8[n] ]; | |
1837 Picture *ref= &h->ref_list[list][refn]; | |
1838 mc_dir_part(h, ref, n, square, chroma_height, delta, list, | |
1839 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1840 qpix_put, chroma_put); | |
1841 | |
3316 | 1842 luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom, |
2415 | 1843 h->luma_weight[list][refn], h->luma_offset[list][refn]); |
1844 if(h->use_weight_chroma){ | |
3316 | 1845 chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2415 | 1846 h->chroma_weight[list][refn][0], h->chroma_offset[list][refn][0]); |
3316 | 1847 chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2415 | 1848 h->chroma_weight[list][refn][1], h->chroma_offset[list][refn][1]); |
1849 } | |
1850 } | |
1851 } | |
1852 | |
1853 static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta, | |
1854 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
1855 int x_offset, int y_offset, | |
1856 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
1857 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | |
2967 | 1858 h264_weight_func *weight_op, h264_biweight_func *weight_avg, |
2415 | 1859 int list0, int list1){ |
1860 if((h->use_weight==2 && list0 && list1 | |
1861 && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ] != 32)) | |
1862 || h->use_weight==1) | |
1863 mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | |
1864 x_offset, y_offset, qpix_put, chroma_put, | |
1865 weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1); | |
1866 else | |
1867 mc_part_std(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | |
1868 x_offset, y_offset, qpix_put, chroma_put, qpix_avg, chroma_avg, list0, list1); | |
1869 } | |
1870 | |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1871 static inline void prefetch_motion(H264Context *h, int list){ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1872 /* fetch pixels for estimated mv 4 macroblocks ahead |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1873 * optimized for 64byte cache lines */ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1874 MpegEncContext * const s = &h->s; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1875 const int refn = h->ref_cache[list][scan8[0]]; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1876 if(refn >= 0){ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1877 const int mx= (h->mv_cache[list][scan8[0]][0]>>2) + 16*s->mb_x + 8; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1878 const int my= (h->mv_cache[list][scan8[0]][1]>>2) + 16*s->mb_y; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1879 uint8_t **src= h->ref_list[list][refn].data; |
3316 | 1880 int off= mx + (my + (s->mb_x&3)*4)*h->mb_linesize + 64; |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1881 s->dsp.prefetch(src[0]+off, s->linesize, 4); |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1882 off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1883 s->dsp.prefetch(src[1]+off, src[2]-src[1], 2); |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1884 } |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1885 } |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1886 |
1168 | 1887 static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
1888 qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put), | |
2415 | 1889 qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg), |
1890 h264_weight_func *weight_op, h264_biweight_func *weight_avg){ | |
1168 | 1891 MpegEncContext * const s = &h->s; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
1892 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1168 | 1893 const int mb_type= s->current_picture.mb_type[mb_xy]; |
2967 | 1894 |
1168 | 1895 assert(IS_INTER(mb_type)); |
2967 | 1896 |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1897 prefetch_motion(h, 0); |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1898 |
1168 | 1899 if(IS_16X16(mb_type)){ |
1900 mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0, | |
1901 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0], | |
2415 | 1902 &weight_op[0], &weight_avg[0], |
1168 | 1903 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
1904 }else if(IS_16X8(mb_type)){ | |
1905 mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0, | |
1906 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0], | |
2415 | 1907 &weight_op[1], &weight_avg[1], |
1168 | 1908 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
1909 mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4, | |
1910 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0], | |
2415 | 1911 &weight_op[1], &weight_avg[1], |
1168 | 1912 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1)); |
1913 }else if(IS_8X16(mb_type)){ | |
3316 | 1914 mc_part(h, 0, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 0, 0, |
1168 | 1915 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], |
2415 | 1916 &weight_op[2], &weight_avg[2], |
1168 | 1917 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
3316 | 1918 mc_part(h, 4, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 4, 0, |
1168 | 1919 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], |
2415 | 1920 &weight_op[2], &weight_avg[2], |
1168 | 1921 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1)); |
1922 }else{ | |
1923 int i; | |
2967 | 1924 |
1168 | 1925 assert(IS_8X8(mb_type)); |
1926 | |
1927 for(i=0; i<4; i++){ | |
1928 const int sub_mb_type= h->sub_mb_type[i]; | |
1929 const int n= 4*i; | |
1930 int x_offset= (i&1)<<2; | |
1931 int y_offset= (i&2)<<1; | |
1932 | |
1933 if(IS_SUB_8X8(sub_mb_type)){ | |
1934 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1935 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], | |
2415 | 1936 &weight_op[3], &weight_avg[3], |
1168 | 1937 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1938 }else if(IS_SUB_8X4(sub_mb_type)){ | |
1939 mc_part(h, n , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1940 qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1], | |
2415 | 1941 &weight_op[4], &weight_avg[4], |
1168 | 1942 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1943 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2, | |
1944 qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1], | |
2415 | 1945 &weight_op[4], &weight_avg[4], |
1168 | 1946 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1947 }else if(IS_SUB_4X8(sub_mb_type)){ | |
3316 | 1948 mc_part(h, n , 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset, |
1168 | 1949 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], |
2415 | 1950 &weight_op[5], &weight_avg[5], |
1168 | 1951 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
3316 | 1952 mc_part(h, n+1, 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset, |
1168 | 1953 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], |
2415 | 1954 &weight_op[5], &weight_avg[5], |
1168 | 1955 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1956 }else{ | |
1957 int j; | |
1958 assert(IS_SUB_4X4(sub_mb_type)); | |
1959 for(j=0; j<4; j++){ | |
1960 int sub_x_offset= x_offset + 2*(j&1); | |
1961 int sub_y_offset= y_offset + (j&2); | |
1962 mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset, | |
1963 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], | |
2415 | 1964 &weight_op[6], &weight_avg[6], |
1168 | 1965 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1966 } | |
1967 } | |
1968 } | |
1969 } | |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1970 |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1971 prefetch_motion(h, 1); |
1168 | 1972 } |
1973 | |
4783
011fb289e3b0
changes some function declarations from () to (void) as per ansi c.
gpoirier
parents:
4745
diff
changeset
|
1974 static void decode_init_vlc(void){ |
1168 | 1975 static int done = 0; |
1976 | |
1977 if (!done) { | |
1978 int i; | |
1979 done = 1; | |
1980 | |
2967 | 1981 init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5, |
1168 | 1982 &chroma_dc_coeff_token_len [0], 1, 1, |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2365
diff
changeset
|
1983 &chroma_dc_coeff_token_bits[0], 1, 1, 1); |
1168 | 1984 |
1985 for(i=0; i<4; i++){ | |
2967 | 1986 init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17, |
1168 | 1987 &coeff_token_len [i][0], 1, 1, |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2365
diff
changeset
|
1988 &coeff_token_bits[i][0], 1, 1, 1); |
1168 | 1989 } |
1990 | |
1991 for(i=0; i<3; i++){ | |
1992 init_vlc(&chroma_dc_total_zeros_vlc[i], CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4, | |
1993 &chroma_dc_total_zeros_len [i][0], 1, 1, | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2365
diff
changeset
|
1994 &chroma_dc_total_zeros_bits[i][0], 1, 1, 1); |
1168 | 1995 } |
1996 for(i=0; i<15; i++){ | |
2967 | 1997 init_vlc(&total_zeros_vlc[i], TOTAL_ZEROS_VLC_BITS, 16, |
1168 | 1998 &total_zeros_len [i][0], 1, 1, |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2365
diff
changeset
|
1999 &total_zeros_bits[i][0], 1, 1, 1); |
1168 | 2000 } |
2001 | |
2002 for(i=0; i<6; i++){ | |
2967 | 2003 init_vlc(&run_vlc[i], RUN_VLC_BITS, 7, |
1168 | 2004 &run_len [i][0], 1, 1, |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2365
diff
changeset
|
2005 &run_bits[i][0], 1, 1, 1); |
1168 | 2006 } |
2967 | 2007 init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, |
1168 | 2008 &run_len [6][0], 1, 1, |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2365
diff
changeset
|
2009 &run_bits[6][0], 1, 1, 1); |
1168 | 2010 } |
2011 } | |
2012 | |
2013 static void free_tables(H264Context *h){ | |
5079 | 2014 int i; |
5642 | 2015 H264Context *hx; |
1168 | 2016 av_freep(&h->intra4x4_pred_mode); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2017 av_freep(&h->chroma_pred_mode_table); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2018 av_freep(&h->cbp_table); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
2019 av_freep(&h->mvd_table[0]); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
2020 av_freep(&h->mvd_table[1]); |
2396 | 2021 av_freep(&h->direct_table); |
1168 | 2022 av_freep(&h->non_zero_count); |
2023 av_freep(&h->slice_table_base); | |
2024 h->slice_table= NULL; | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2025 |
1168 | 2026 av_freep(&h->mb2b_xy); |
2027 av_freep(&h->mb2b8_xy); | |
2415 | 2028 |
5079 | 2029 for(i = 0; i < MAX_SPS_COUNT; i++) |
2030 av_freep(h->sps_buffers + i); | |
2031 | |
2032 for(i = 0; i < MAX_PPS_COUNT; i++) | |
2033 av_freep(h->pps_buffers + i); | |
5642 | 2034 |
2035 for(i = 0; i < h->s.avctx->thread_count; i++) { | |
2036 hx = h->thread_context[i]; | |
2037 if(!hx) continue; | |
2038 av_freep(&hx->top_borders[1]); | |
2039 av_freep(&hx->top_borders[0]); | |
2040 av_freep(&hx->s.obmc_scratchpad); | |
2041 av_freep(&hx->s.allocated_edge_emu_buffer); | |
2042 } | |
1168 | 2043 } |
2044 | |
2919 | 2045 static void init_dequant8_coeff_table(H264Context *h){ |
2046 int i,q,x; | |
3174 | 2047 const int transpose = (h->s.dsp.h264_idct8_add != ff_h264_idct8_add_c); //FIXME ugly |
2919 | 2048 h->dequant8_coeff[0] = h->dequant8_buffer[0]; |
2049 h->dequant8_coeff[1] = h->dequant8_buffer[1]; | |
2050 | |
2051 for(i=0; i<2; i++ ){ | |
2052 if(i && !memcmp(h->pps.scaling_matrix8[0], h->pps.scaling_matrix8[1], 64*sizeof(uint8_t))){ | |
2053 h->dequant8_coeff[1] = h->dequant8_buffer[0]; | |
2054 break; | |
2055 } | |
2056 | |
2057 for(q=0; q<52; q++){ | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2058 int shift = ff_div6[q]; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2059 int idx = ff_rem6[q]; |
2919 | 2060 for(x=0; x<64; x++) |
3174 | 2061 h->dequant8_coeff[i][q][transpose ? (x>>3)|((x&7)<<3) : x] = |
2062 ((uint32_t)dequant8_coeff_init[idx][ dequant8_coeff_init_scan[((x>>1)&12) | (x&3)] ] * | |
2063 h->pps.scaling_matrix8[i][x]) << shift; | |
2919 | 2064 } |
2065 } | |
2066 } | |
2067 | |
2068 static void init_dequant4_coeff_table(H264Context *h){ | |
2069 int i,j,q,x; | |
3005 | 2070 const int transpose = (h->s.dsp.h264_idct_add != ff_h264_idct_add_c); //FIXME ugly |
2919 | 2071 for(i=0; i<6; i++ ){ |
2072 h->dequant4_coeff[i] = h->dequant4_buffer[i]; | |
2073 for(j=0; j<i; j++){ | |
2074 if(!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i], 16*sizeof(uint8_t))){ | |
2075 h->dequant4_coeff[i] = h->dequant4_buffer[j]; | |
2076 break; | |
2077 } | |
2078 } | |
2079 if(j<i) | |
2080 continue; | |
2081 | |
2082 for(q=0; q<52; q++){ | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2083 int shift = ff_div6[q] + 2; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2084 int idx = ff_rem6[q]; |
2919 | 2085 for(x=0; x<16; x++) |
3005 | 2086 h->dequant4_coeff[i][q][transpose ? (x>>2)|((x<<2)&0xF) : x] = |
2087 ((uint32_t)dequant4_coeff_init[idx][(x&1) + ((x>>2)&1)] * | |
2919 | 2088 h->pps.scaling_matrix4[i][x]) << shift; |
2089 } | |
2090 } | |
2091 } | |
2092 | |
2093 static void init_dequant_tables(H264Context *h){ | |
2094 int i,x; | |
2095 init_dequant4_coeff_table(h); | |
2096 if(h->pps.transform_8x8_mode) | |
2097 init_dequant8_coeff_table(h); | |
2098 if(h->sps.transform_bypass){ | |
2099 for(i=0; i<6; i++) | |
2100 for(x=0; x<16; x++) | |
2101 h->dequant4_coeff[i][0][x] = 1<<6; | |
2102 if(h->pps.transform_8x8_mode) | |
2103 for(i=0; i<2; i++) | |
2104 for(x=0; x<64; x++) | |
2105 h->dequant8_coeff[i][0][x] = 1<<6; | |
2106 } | |
2107 } | |
2108 | |
2109 | |
1168 | 2110 /** |
2111 * allocates tables. | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2112 * needs width/height |
1168 | 2113 */ |
2114 static int alloc_tables(H264Context *h){ | |
2115 MpegEncContext * const s = &h->s; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
2116 const int big_mb_num= s->mb_stride * (s->mb_height+1); |
2919 | 2117 int x,y; |
1168 | 2118 |
2119 CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8 * sizeof(uint8_t)) | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2120 |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2121 CHECKED_ALLOCZ(h->non_zero_count , big_mb_num * 16 * sizeof(uint8_t)) |
3316 | 2122 CHECKED_ALLOCZ(h->slice_table_base , (big_mb_num+s->mb_stride) * sizeof(uint8_t)) |
2336 | 2123 CHECKED_ALLOCZ(h->cbp_table, big_mb_num * sizeof(uint16_t)) |
1168 | 2124 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2125 if( h->pps.cabac ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2126 CHECKED_ALLOCZ(h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t)) |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
2127 CHECKED_ALLOCZ(h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t)); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
2128 CHECKED_ALLOCZ(h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t)); |
2396 | 2129 CHECKED_ALLOCZ(h->direct_table, 32*big_mb_num * sizeof(uint8_t)); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2130 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2131 |
3316 | 2132 memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride) * sizeof(uint8_t)); |
2133 h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; | |
1168 | 2134 |
2641
c337f851d0f9
fix storage of motion vectors for frames with more than 4096 macroblocks.
lorenm
parents:
2640
diff
changeset
|
2135 CHECKED_ALLOCZ(h->mb2b_xy , big_mb_num * sizeof(uint32_t)); |
c337f851d0f9
fix storage of motion vectors for frames with more than 4096 macroblocks.
lorenm
parents:
2640
diff
changeset
|
2136 CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint32_t)); |
1168 | 2137 for(y=0; y<s->mb_height; y++){ |
2138 for(x=0; x<s->mb_width; x++){ | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
2139 const int mb_xy= x + y*s->mb_stride; |
1168 | 2140 const int b_xy = 4*x + 4*y*h->b_stride; |
2141 const int b8_xy= 2*x + 2*y*h->b8_stride; | |
2967 | 2142 |
1168 | 2143 h->mb2b_xy [mb_xy]= b_xy; |
2144 h->mb2b8_xy[mb_xy]= b8_xy; | |
2145 } | |
2146 } | |
2415 | 2147 |
2417 | 2148 s->obmc_scratchpad = NULL; |
2149 | |
2920 | 2150 if(!h->dequant4_coeff[0]) |
2151 init_dequant_tables(h); | |
2152 | |
1168 | 2153 return 0; |
2154 fail: | |
2155 free_tables(h); | |
2156 return -1; | |
2157 } | |
2158 | |
5642 | 2159 /** |
2160 * Mimic alloc_tables(), but for every context thread. | |
2161 */ | |
2162 static void clone_tables(H264Context *dst, H264Context *src){ | |
2163 dst->intra4x4_pred_mode = src->intra4x4_pred_mode; | |
2164 dst->non_zero_count = src->non_zero_count; | |
2165 dst->slice_table = src->slice_table; | |
2166 dst->cbp_table = src->cbp_table; | |
2167 dst->mb2b_xy = src->mb2b_xy; | |
2168 dst->mb2b8_xy = src->mb2b8_xy; | |
2169 dst->chroma_pred_mode_table = src->chroma_pred_mode_table; | |
2170 dst->mvd_table[0] = src->mvd_table[0]; | |
2171 dst->mvd_table[1] = src->mvd_table[1]; | |
2172 dst->direct_table = src->direct_table; | |
2173 | |
2174 dst->s.obmc_scratchpad = NULL; | |
2175 ff_h264_pred_init(&dst->hpc, src->s.codec_id); | |
2176 } | |
2177 | |
2178 /** | |
2179 * Init context | |
2180 * Allocate buffers which are not shared amongst multiple threads. | |
2181 */ | |
2182 static int context_init(H264Context *h){ | |
2183 MpegEncContext * const s = &h->s; | |
2184 | |
2185 CHECKED_ALLOCZ(h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t)) | |
2186 CHECKED_ALLOCZ(h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t)) | |
2187 | |
2188 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) | |
2189 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, | |
2190 (s->width+64)*2*21*2); //(width + edge + align)*interlaced*MBsize*tolerance | |
2191 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21; | |
2192 return 0; | |
2193 fail: | |
2194 return -1; // free_tables will clean up for us | |
2195 } | |
2196 | |
1168 | 2197 static void common_init(H264Context *h){ |
2198 MpegEncContext * const s = &h->s; | |
2199 | |
2200 s->width = s->avctx->width; | |
2201 s->height = s->avctx->height; | |
2202 s->codec_id= s->avctx->codec->id; | |
2967 | 2203 |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2204 ff_h264_pred_init(&h->hpc, s->codec_id); |
1168 | 2205 |
2919 | 2206 h->dequant_coeff_pps= -1; |
1698 | 2207 s->unrestricted_mv=1; |
1168 | 2208 s->decode=1; //FIXME |
2920 | 2209 |
2210 memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t)); | |
2211 memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t)); | |
1168 | 2212 } |
2213 | |
2214 static int decode_init(AVCodecContext *avctx){ | |
2215 H264Context *h= avctx->priv_data; | |
2216 MpegEncContext * const s = &h->s; | |
2217 | |
1892 | 2218 MPV_decode_defaults(s); |
2967 | 2219 |
1168 | 2220 s->avctx = avctx; |
2221 common_init(h); | |
2222 | |
2223 s->out_format = FMT_H264; | |
2224 s->workaround_bugs= avctx->workaround_bugs; | |
2225 | |
2226 // set defaults | |
2227 // s->decode_mb= ff_h263_decode_mb; | |
5338
5c1695f0f3e4
fix visual painting of MVs from h264: they are painted twice too long
gpoirier
parents:
5262
diff
changeset
|
2228 s->quarter_sample = 1; |
1168 | 2229 s->low_delay= 1; |
2230 avctx->pix_fmt= PIX_FMT_YUV420P; | |
2231 | |
4164
171e768324cd
Remove the H264Context parameter from decode_init_vlc() as it is not being used.
takis
parents:
4118
diff
changeset
|
2232 decode_init_vlc(); |
2967 | 2233 |
2547
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2234 if(avctx->extradata_size > 0 && avctx->extradata && |
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2235 *(char *)avctx->extradata == 1){ |
2227 | 2236 h->is_avc = 1; |
2237 h->got_avcC = 0; | |
2547
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2238 } else { |
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2239 h->is_avc = 0; |
2227 | 2240 } |
2241 | |
5642 | 2242 h->thread_context[0] = h; |
1168 | 2243 return 0; |
2244 } | |
2245 | |
2935 | 2246 static int frame_start(H264Context *h){ |
1168 | 2247 MpegEncContext * const s = &h->s; |
2248 int i; | |
2249 | |
2935 | 2250 if(MPV_frame_start(s, s->avctx) < 0) |
2251 return -1; | |
1168 | 2252 ff_er_frame_start(s); |
5773
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2253 /* |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2254 * MPV_frame_start uses pict_type to derive key_frame. |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2255 * This is incorrect for H.264; IDR markings must be used. |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2256 * Zero here; IDR markings per slice in frame or fields are OR'd in later. |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2257 * See decode_nal_units(). |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2258 */ |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2259 s->current_picture_ptr->key_frame= 0; |
1168 | 2260 |
2261 assert(s->linesize && s->uvlinesize); | |
2262 | |
2263 for(i=0; i<16; i++){ | |
2264 h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3); | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2265 h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3); |
1168 | 2266 } |
2267 for(i=0; i<4; i++){ | |
2268 h->block_offset[16+i]= | |
2269 h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3); | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2270 h->block_offset[24+16+i]= |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2271 h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3); |
1168 | 2272 } |
2273 | |
2416
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
2274 /* can't be in alloc_tables because linesize isn't known there. |
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
2275 * FIXME: redo bipred weight to not require extra buffer? */ |
5642 | 2276 for(i = 0; i < s->avctx->thread_count; i++) |
2277 if(!h->thread_context[i]->s.obmc_scratchpad) | |
2278 h->thread_context[i]->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize); | |
3316 | 2279 |
2280 /* some macroblocks will be accessed before they're available */ | |
5642 | 2281 if(FRAME_MBAFF || s->avctx->thread_count > 1) |
3316 | 2282 memset(h->slice_table, -1, (s->mb_height*s->mb_stride-1) * sizeof(uint8_t)); |
2416
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
2283 |
1168 | 2284 // s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1; |
2935 | 2285 return 0; |
1168 | 2286 } |
2287 | |
5106 | 2288 static inline void backup_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int simple){ |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2289 MpegEncContext * const s = &h->s; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2290 int i; |
2967 | 2291 |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2292 src_y -= linesize; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2293 src_cb -= uvlinesize; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2294 src_cr -= uvlinesize; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2295 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2296 // There are two lines saved, the line above the the top macroblock of a pair, |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2297 // and the line above the bottom macroblock |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2298 h->left_border[0]= h->top_borders[0][s->mb_x][15]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2299 for(i=1; i<17; i++){ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2300 h->left_border[i]= src_y[15+i* linesize]; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2301 } |
2967 | 2302 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2303 *(uint64_t*)(h->top_borders[0][s->mb_x]+0)= *(uint64_t*)(src_y + 16*linesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2304 *(uint64_t*)(h->top_borders[0][s->mb_x]+8)= *(uint64_t*)(src_y +8+16*linesize); |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2305 |
5434 | 2306 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2307 h->left_border[17 ]= h->top_borders[0][s->mb_x][16+7]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2308 h->left_border[17+9]= h->top_borders[0][s->mb_x][24+7]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2309 for(i=1; i<9; i++){ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2310 h->left_border[i+17 ]= src_cb[7+i*uvlinesize]; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2311 h->left_border[i+17+9]= src_cr[7+i*uvlinesize]; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2312 } |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2313 *(uint64_t*)(h->top_borders[0][s->mb_x]+16)= *(uint64_t*)(src_cb+8*uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2314 *(uint64_t*)(h->top_borders[0][s->mb_x]+24)= *(uint64_t*)(src_cr+8*uvlinesize); |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2315 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2316 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2317 |
5106 | 2318 static inline void xchg_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int xchg, int simple){ |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2319 MpegEncContext * const s = &h->s; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2320 int temp8, i; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2321 uint64_t temp64; |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2322 int deblock_left; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2323 int deblock_top; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2324 int mb_xy; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2325 |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2326 if(h->deblocking_filter == 2) { |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2327 mb_xy = s->mb_x + s->mb_y*s->mb_stride; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2328 deblock_left = h->slice_table[mb_xy] == h->slice_table[mb_xy - 1]; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2329 deblock_top = h->slice_table[mb_xy] == h->slice_table[h->top_mb_xy]; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2330 } else { |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2331 deblock_left = (s->mb_x > 0); |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2332 deblock_top = (s->mb_y > 0); |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2333 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2334 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2335 src_y -= linesize + 1; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2336 src_cb -= uvlinesize + 1; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2337 src_cr -= uvlinesize + 1; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2338 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2339 #define XCHG(a,b,t,xchg)\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2340 t= a;\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2341 if(xchg)\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2342 a= b;\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2343 b= t; |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2344 |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2345 if(deblock_left){ |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2346 for(i = !deblock_top; i<17; i++){ |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2347 XCHG(h->left_border[i ], src_y [i* linesize], temp8, xchg); |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2348 } |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2349 } |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2350 |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2351 if(deblock_top){ |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2352 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+0), *(uint64_t*)(src_y +1), temp64, xchg); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2353 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1); |
2803 | 2354 if(s->mb_x+1 < s->mb_width){ |
2755 | 2355 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x+1]), *(uint64_t*)(src_y +17), temp64, 1); |
2356 } | |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2357 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2358 |
5434 | 2359 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2360 if(deblock_left){ |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2361 for(i = !deblock_top; i<9; i++){ |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2362 XCHG(h->left_border[i+17 ], src_cb[i*uvlinesize], temp8, xchg); |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2363 XCHG(h->left_border[i+17+9], src_cr[i*uvlinesize], temp8, xchg); |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2364 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2365 } |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2366 if(deblock_top){ |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2367 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+16), *(uint64_t*)(src_cb+1), temp64, 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2368 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+24), *(uint64_t*)(src_cr+1), temp64, 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2369 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2370 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2371 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2372 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2373 static inline void backup_pair_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2374 MpegEncContext * const s = &h->s; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2375 int i; |
2967 | 2376 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2377 src_y -= 2 * linesize; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2378 src_cb -= 2 * uvlinesize; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2379 src_cr -= 2 * uvlinesize; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2380 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2381 // There are two lines saved, the line above the the top macroblock of a pair, |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2382 // and the line above the bottom macroblock |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2383 h->left_border[0]= h->top_borders[0][s->mb_x][15]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2384 h->left_border[1]= h->top_borders[1][s->mb_x][15]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2385 for(i=2; i<34; i++){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2386 h->left_border[i]= src_y[15+i* linesize]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2387 } |
2967 | 2388 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2389 *(uint64_t*)(h->top_borders[0][s->mb_x]+0)= *(uint64_t*)(src_y + 32*linesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2390 *(uint64_t*)(h->top_borders[0][s->mb_x]+8)= *(uint64_t*)(src_y +8+32*linesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2391 *(uint64_t*)(h->top_borders[1][s->mb_x]+0)= *(uint64_t*)(src_y + 33*linesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2392 *(uint64_t*)(h->top_borders[1][s->mb_x]+8)= *(uint64_t*)(src_y +8+33*linesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2393 |
5434 | 2394 if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2395 h->left_border[34 ]= h->top_borders[0][s->mb_x][16+7]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2396 h->left_border[34+ 1]= h->top_borders[1][s->mb_x][16+7]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2397 h->left_border[34+18 ]= h->top_borders[0][s->mb_x][24+7]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2398 h->left_border[34+18+1]= h->top_borders[1][s->mb_x][24+7]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2399 for(i=2; i<18; i++){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2400 h->left_border[i+34 ]= src_cb[7+i*uvlinesize]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2401 h->left_border[i+34+18]= src_cr[7+i*uvlinesize]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2402 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2403 *(uint64_t*)(h->top_borders[0][s->mb_x]+16)= *(uint64_t*)(src_cb+16*uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2404 *(uint64_t*)(h->top_borders[0][s->mb_x]+24)= *(uint64_t*)(src_cr+16*uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2405 *(uint64_t*)(h->top_borders[1][s->mb_x]+16)= *(uint64_t*)(src_cb+17*uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2406 *(uint64_t*)(h->top_borders[1][s->mb_x]+24)= *(uint64_t*)(src_cr+17*uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2407 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2408 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2409 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2410 static inline void xchg_pair_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int xchg){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2411 MpegEncContext * const s = &h->s; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2412 int temp8, i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2413 uint64_t temp64; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2414 int deblock_left = (s->mb_x > 0); |
3316 | 2415 int deblock_top = (s->mb_y > 1); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2416 |
4600 | 2417 tprintf(s->avctx, "xchg_pair_border: src_y:%p src_cb:%p src_cr:%p ls:%d uvls:%d\n", src_y, src_cb, src_cr, linesize, uvlinesize); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2418 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2419 src_y -= 2 * linesize + 1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2420 src_cb -= 2 * uvlinesize + 1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2421 src_cr -= 2 * uvlinesize + 1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2422 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2423 #define XCHG(a,b,t,xchg)\ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2424 t= a;\ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2425 if(xchg)\ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2426 a= b;\ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2427 b= t; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2428 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2429 if(deblock_left){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2430 for(i = (!deblock_top)<<1; i<34; i++){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2431 XCHG(h->left_border[i ], src_y [i* linesize], temp8, xchg); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2432 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2433 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2434 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2435 if(deblock_top){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2436 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+0), *(uint64_t*)(src_y +1), temp64, xchg); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2437 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2438 XCHG(*(uint64_t*)(h->top_borders[1][s->mb_x]+0), *(uint64_t*)(src_y +1 +linesize), temp64, xchg); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2439 XCHG(*(uint64_t*)(h->top_borders[1][s->mb_x]+8), *(uint64_t*)(src_y +9 +linesize), temp64, 1); |
3316 | 2440 if(s->mb_x+1 < s->mb_width){ |
2441 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x+1]), *(uint64_t*)(src_y +17), temp64, 1); | |
2442 XCHG(*(uint64_t*)(h->top_borders[1][s->mb_x+1]), *(uint64_t*)(src_y +17 +linesize), temp64, 1); | |
2443 } | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2444 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2445 |
5434 | 2446 if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2447 if(deblock_left){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2448 for(i = (!deblock_top) << 1; i<18; i++){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2449 XCHG(h->left_border[i+34 ], src_cb[i*uvlinesize], temp8, xchg); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2450 XCHG(h->left_border[i+34+18], src_cr[i*uvlinesize], temp8, xchg); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2451 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2452 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2453 if(deblock_top){ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2454 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+16), *(uint64_t*)(src_cb+1), temp64, 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2455 XCHG(*(uint64_t*)(h->top_borders[0][s->mb_x]+24), *(uint64_t*)(src_cr+1), temp64, 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2456 XCHG(*(uint64_t*)(h->top_borders[1][s->mb_x]+16), *(uint64_t*)(src_cb+1 +uvlinesize), temp64, 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2457 XCHG(*(uint64_t*)(h->top_borders[1][s->mb_x]+24), *(uint64_t*)(src_cr+1 +uvlinesize), temp64, 1); |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2458 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2459 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2460 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2461 |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4896
diff
changeset
|
2462 static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple){ |
1168 | 2463 MpegEncContext * const s = &h->s; |
2464 const int mb_x= s->mb_x; | |
2465 const int mb_y= s->mb_y; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
2466 const int mb_xy= mb_x + mb_y*s->mb_stride; |
1168 | 2467 const int mb_type= s->current_picture.mb_type[mb_xy]; |
2468 uint8_t *dest_y, *dest_cb, *dest_cr; | |
2469 int linesize, uvlinesize /*dct_offset*/; | |
2470 int i; | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2471 int *block_offset = &h->block_offset[0]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2472 const unsigned int bottom = mb_y & 1; |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2473 const int transform_bypass = (s->qscale == 0 && h->sps.transform_bypass), is_h264 = (simple || s->codec_id == CODEC_ID_H264); |
2763 | 2474 void (*idct_add)(uint8_t *dst, DCTELEM *block, int stride); |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2475 void (*idct_dc_add)(uint8_t *dst, DCTELEM *block, int stride); |
1168 | 2476 |
2477 dest_y = s->current_picture.data[0] + (mb_y * 16* s->linesize ) + mb_x * 16; | |
2478 dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; | |
2479 dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; | |
2480 | |
4000 | 2481 s->dsp.prefetch(dest_y + (s->mb_x&3)*4*s->linesize + 64, s->linesize, 4); |
2482 s->dsp.prefetch(dest_cb + (s->mb_x&7)*s->uvlinesize + 64, dest_cr - dest_cb, 2); | |
2483 | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2484 if (!simple && MB_FIELD) { |
3316 | 2485 linesize = h->mb_linesize = s->linesize * 2; |
2486 uvlinesize = h->mb_uvlinesize = s->uvlinesize * 2; | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2487 block_offset = &h->block_offset[24]; |
1168 | 2488 if(mb_y&1){ //FIXME move out of this func? |
2489 dest_y -= s->linesize*15; | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2490 dest_cb-= s->uvlinesize*7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2491 dest_cr-= s->uvlinesize*7; |
1168 | 2492 } |
3316 | 2493 if(FRAME_MBAFF) { |
2494 int list; | |
4533 | 2495 for(list=0; list<h->list_count; list++){ |
3316 | 2496 if(!USES_LIST(mb_type, list)) |
2497 continue; | |
2498 if(IS_16X16(mb_type)){ | |
2499 int8_t *ref = &h->ref_cache[list][scan8[0]]; | |
2500 fill_rectangle(ref, 4, 4, 8, 16+*ref^(s->mb_y&1), 1); | |
2501 }else{ | |
2502 for(i=0; i<16; i+=4){ | |
2503 //FIXME can refs be smaller than 8x8 when !direct_8x8_inference ? | |
2504 int ref = h->ref_cache[list][scan8[i]]; | |
2505 if(ref >= 0) | |
2506 fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, 16+ref^(s->mb_y&1), 1); | |
2507 } | |
2508 } | |
2509 } | |
2510 } | |
1168 | 2511 } else { |
3316 | 2512 linesize = h->mb_linesize = s->linesize; |
2513 uvlinesize = h->mb_uvlinesize = s->uvlinesize; | |
1168 | 2514 // dct_offset = s->linesize * 16; |
2515 } | |
2967 | 2516 |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2517 if(transform_bypass){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2518 idct_dc_add = |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2519 idct_add = IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 : s->dsp.add_pixels4; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2520 }else if(IS_8x8DCT(mb_type)){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2521 idct_dc_add = s->dsp.h264_idct8_dc_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2522 idct_add = s->dsp.h264_idct8_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2523 }else{ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2524 idct_dc_add = s->dsp.h264_idct_dc_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2525 idct_add = s->dsp.h264_idct_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2526 } |
1168 | 2527 |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2528 if(!simple && FRAME_MBAFF && h->deblocking_filter && IS_INTRA(mb_type) |
3316 | 2529 && (!bottom || !IS_INTRA(s->current_picture.mb_type[mb_xy-s->mb_stride]))){ |
2530 int mbt_y = mb_y&~1; | |
2531 uint8_t *top_y = s->current_picture.data[0] + (mbt_y * 16* s->linesize ) + mb_x * 16; | |
2532 uint8_t *top_cb = s->current_picture.data[1] + (mbt_y * 8 * s->uvlinesize) + mb_x * 8; | |
2533 uint8_t *top_cr = s->current_picture.data[2] + (mbt_y * 8 * s->uvlinesize) + mb_x * 8; | |
2534 xchg_pair_border(h, top_y, top_cb, top_cr, s->linesize, s->uvlinesize, 1); | |
2535 } | |
2536 | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2537 if (!simple && IS_INTRA_PCM(mb_type)) { |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2538 unsigned int x, y; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2539 |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2540 // The pixels are stored in h->mb array in the same order as levels, |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2541 // copy them in output in the correct order. |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2542 for(i=0; i<16; i++) { |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2543 for (y=0; y<4; y++) { |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2544 for (x=0; x<4; x++) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2545 *(dest_y + block_offset[i] + y*linesize + x) = h->mb[i*16+y*4+x]; |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2546 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2547 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2548 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2549 for(i=16; i<16+4; i++) { |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2550 for (y=0; y<4; y++) { |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2551 for (x=0; x<4; x++) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2552 *(dest_cb + block_offset[i] + y*uvlinesize + x) = h->mb[i*16+y*4+x]; |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2553 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2554 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2555 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2556 for(i=20; i<20+4; i++) { |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2557 for (y=0; y<4; y++) { |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2558 for (x=0; x<4; x++) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2559 *(dest_cr + block_offset[i] + y*uvlinesize + x) = h->mb[i*16+y*4+x]; |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2560 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2561 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
2562 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2563 } else { |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2564 if(IS_INTRA(mb_type)){ |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2565 if(h->deblocking_filter && (simple || !FRAME_MBAFF)) |
5106 | 2566 xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 1, simple); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2567 |
5434 | 2568 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2569 h->hpc.pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize); |
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2570 h->hpc.pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2571 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2572 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2573 if(IS_INTRA4x4(mb_type)){ |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2574 if(simple || !s->encoding){ |
2755 | 2575 if(IS_8x8DCT(mb_type)){ |
2576 for(i=0; i<16; i+=4){ | |
2577 uint8_t * const ptr= dest_y + block_offset[i]; | |
2578 const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ]; | |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2579 const int nnz = h->non_zero_count_cache[ scan8[i] ]; |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2580 h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000, |
4546 | 2581 (h->topright_samples_available<<i)&0x4000, linesize); |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2582 if(nnz){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2583 if(nnz == 1 && h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2584 idct_dc_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2585 else |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2586 idct_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2587 } |
2755 | 2588 } |
2589 }else | |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2590 for(i=0; i<16; i++){ |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2591 uint8_t * const ptr= dest_y + block_offset[i]; |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2592 uint8_t *topright; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2593 const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ]; |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2594 int nnz, tr; |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2595 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2596 if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2597 const int topright_avail= (h->topright_samples_available<<i)&0x8000; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2598 assert(mb_y || linesize <= block_offset[i]); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2599 if(!topright_avail){ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2600 tr= ptr[3 - linesize]*0x01010101; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2601 topright= (uint8_t*) &tr; |
2967 | 2602 }else |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2603 topright= ptr + 4 - linesize; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2604 }else |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2605 topright= NULL; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2606 |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2607 h->hpc.pred4x4[ dir ](ptr, topright, linesize); |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2608 nnz = h->non_zero_count_cache[ scan8[i] ]; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2609 if(nnz){ |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2610 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2611 if(nnz == 1 && h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2612 idct_dc_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2613 else |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2614 idct_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2615 }else |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2616 svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0); |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2617 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2618 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2619 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2620 }else{ |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2621 h->hpc.pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize); |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2622 if(is_h264){ |
2763 | 2623 if(!transform_bypass) |
5727 | 2624 h264_luma_dc_dequant_idct_c(h->mb, s->qscale, h->dequant4_coeff[0][s->qscale][0]); |
2763 | 2625 }else |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2626 svq3_luma_dc_dequant_idct_c(h->mb, s->qscale); |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2627 } |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2628 if(h->deblocking_filter && (simple || !FRAME_MBAFF)) |
5106 | 2629 xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0, simple); |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2630 }else if(is_h264){ |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2631 hl_motion(h, dest_y, dest_cb, dest_cr, |
3807
6a40092eb9e6
approximate qpel functions: sacrifice some quality for some decoding speed. enabled on B-frames with -lavdopts fast.
lorenm
parents:
3776
diff
changeset
|
2632 s->me.qpel_put, s->dsp.put_h264_chroma_pixels_tab, |
6a40092eb9e6
approximate qpel functions: sacrifice some quality for some decoding speed. enabled on B-frames with -lavdopts fast.
lorenm
parents:
3776
diff
changeset
|
2633 s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab, |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2634 s->dsp.weight_h264_pixels_tab, s->dsp.biweight_h264_pixels_tab); |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2635 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2636 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2637 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2638 if(!IS_INTRA4x4(mb_type)){ |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2639 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2640 if(IS_INTRA16x16(mb_type)){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2641 for(i=0; i<16; i++){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2642 if(h->non_zero_count_cache[ scan8[i] ]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2643 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2644 else if(h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2645 idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2646 } |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2647 }else{ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2648 const int di = IS_8x8DCT(mb_type) ? 4 : 1; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2649 for(i=0; i<16; i+=di){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2650 int nnz = h->non_zero_count_cache[ scan8[i] ]; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2651 if(nnz){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2652 if(nnz==1 && h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2653 idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2654 else |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2655 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2656 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2657 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2658 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2659 }else{ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2660 for(i=0; i<16; i++){ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2661 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2662 uint8_t * const ptr= dest_y + block_offset[i]; |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2663 svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0); |
1234 | 2664 } |
1168 | 2665 } |
2666 } | |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2667 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2668 |
5434 | 2669 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2670 uint8_t *dest[2] = {dest_cb, dest_cr}; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2671 if(transform_bypass){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2672 idct_add = idct_dc_add = s->dsp.add_pixels4; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2673 }else{ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2674 idct_add = s->dsp.h264_idct_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2675 idct_dc_add = s->dsp.h264_idct_dc_add; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2676 chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp[0], h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2677 chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]); |
2763 | 2678 } |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2679 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2680 for(i=16; i<16+8; i++){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2681 if(h->non_zero_count_cache[ scan8[i] ]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2682 idct_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2683 else if(h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2684 idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2685 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2686 }else{ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2687 for(i=16; i<16+8; i++){ |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2688 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2689 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i]; |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2690 svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2); |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2691 } |
1250 | 2692 } |
1168 | 2693 } |
2694 } | |
2695 } | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2696 if(h->deblocking_filter) { |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2697 if (!simple && FRAME_MBAFF) { |
3316 | 2698 //FIXME try deblocking one mb at a time? |
2699 // the reduction in load/storing mvs and such might outweigh the extra backup/xchg_border | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2700 const int mb_y = s->mb_y - 1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2701 uint8_t *pair_dest_y, *pair_dest_cb, *pair_dest_cr; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2702 const int mb_xy= mb_x + mb_y*s->mb_stride; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2703 const int mb_type_top = s->current_picture.mb_type[mb_xy]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2704 const int mb_type_bottom= s->current_picture.mb_type[mb_xy+s->mb_stride]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2705 if (!bottom) return; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2706 pair_dest_y = s->current_picture.data[0] + (mb_y * 16* s->linesize ) + mb_x * 16; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2707 pair_dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2708 pair_dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2709 |
3316 | 2710 if(IS_INTRA(mb_type_top | mb_type_bottom)) |
2711 xchg_pair_border(h, pair_dest_y, pair_dest_cb, pair_dest_cr, s->linesize, s->uvlinesize, 0); | |
2712 | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2713 backup_pair_border(h, pair_dest_y, pair_dest_cb, pair_dest_cr, s->linesize, s->uvlinesize); |
3316 | 2714 // deblock a pair |
2967 | 2715 // top |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2716 s->mb_y--; |
4600 | 2717 tprintf(h->s.avctx, "call mbaff filter_mb mb_x:%d mb_y:%d pair_dest_y = %p, dest_y = %p\n", mb_x, mb_y, pair_dest_y, dest_y); |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2718 fill_caches(h, mb_type_top, 1); //FIXME don't fill stuff which isn't used by filter_mb |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2719 h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy]); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2720 h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy]); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2721 filter_mb(h, mb_x, mb_y, pair_dest_y, pair_dest_cb, pair_dest_cr, linesize, uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2722 // bottom |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2723 s->mb_y++; |
4600 | 2724 tprintf(h->s.avctx, "call mbaff filter_mb\n"); |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2725 fill_caches(h, mb_type_bottom, 1); //FIXME don't fill stuff which isn't used by filter_mb |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2726 h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy+s->mb_stride]); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2727 h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy+s->mb_stride]); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2728 filter_mb(h, mb_x, mb_y+1, dest_y, dest_cb, dest_cr, linesize, uvlinesize); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2729 } else { |
4600 | 2730 tprintf(h->s.avctx, "call filter_mb\n"); |
5106 | 2731 backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, simple); |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2732 fill_caches(h, mb_type, 1); //FIXME don't fill stuff which isn't used by filter_mb |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
2733 filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
2734 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2735 } |
1168 | 2736 } |
2737 | |
2738 /** | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2739 * Process a macroblock; this case avoids checks for expensive uncommon cases. |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2740 */ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2741 static void hl_decode_mb_simple(H264Context *h){ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2742 hl_decode_mb_internal(h, 1); |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2743 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2744 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2745 /** |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2746 * Process a macroblock; this handles edge cases, such as interlacing. |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2747 */ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2748 static void av_noinline hl_decode_mb_complex(H264Context *h){ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2749 hl_decode_mb_internal(h, 0); |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2750 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2751 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2752 static void hl_decode_mb(H264Context *h){ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2753 MpegEncContext * const s = &h->s; |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2754 const int mb_x= s->mb_x; |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2755 const int mb_y= s->mb_y; |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2756 const int mb_xy= mb_x + mb_y*s->mb_stride; |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2757 const int mb_type= s->current_picture.mb_type[mb_xy]; |
5434 | 2758 int is_complex = FRAME_MBAFF || MB_FIELD || IS_INTRA_PCM(mb_type) || s->codec_id != CODEC_ID_H264 || (ENABLE_GRAY && (s->flags&CODEC_FLAG_GRAY)) || s->encoding; |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2759 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2760 if(!s->decode) |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2761 return; |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2762 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2763 if (is_complex) |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2764 hl_decode_mb_complex(h); |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2765 else hl_decode_mb_simple(h); |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2766 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2767 |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2768 static void pic_as_field(Picture *pic, const int parity){ |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2769 int i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2770 for (i = 0; i < 4; ++i) { |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2771 if (parity == PICT_BOTTOM_FIELD) |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2772 pic->data[i] += pic->linesize[i]; |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2773 pic->reference = parity; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2774 pic->linesize[i] *= 2; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2775 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2776 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2777 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2778 static int split_field_copy(Picture *dest, Picture *src, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2779 int parity, int id_add){ |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2780 int match = !!(src->reference & parity); |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2781 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2782 if (match) { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2783 *dest = *src; |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2784 pic_as_field(dest, parity); |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2785 dest->pic_id *= 2; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2786 dest->pic_id += id_add; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2787 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2788 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2789 return match; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2790 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2791 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2792 /** |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2793 * Split one reference list into field parts, interleaving by parity |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2794 * as per H.264 spec section 8.2.4.2.5. Output fields have their data pointers |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2795 * set to look at the actual start of data for that field. |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2796 * |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2797 * @param dest output list |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2798 * @param dest_len maximum number of fields to put in dest |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2799 * @param src the source reference list containing fields and/or field pairs |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2800 * (aka short_ref/long_ref, or |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2801 * refFrameListXShortTerm/refFrameListLongTerm in spec-speak) |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2802 * @param src_len number of Picture's in source (pairs and unmatched fields) |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2803 * @param parity the parity of the picture being decoded/needing |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2804 * these ref pics (PICT_{TOP,BOTTOM}_FIELD) |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2805 * @return number of fields placed in dest |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2806 */ |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2807 static int split_field_half_ref_list(Picture *dest, int dest_len, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2808 Picture *src, int src_len, int parity){ |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2809 int same_parity = 1; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2810 int same_i = 0; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2811 int opp_i = 0; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2812 int out_i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2813 int field_output; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2814 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2815 for (out_i = 0; out_i < dest_len; out_i += field_output) { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2816 if (same_parity && same_i < src_len) { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2817 field_output = split_field_copy(dest + out_i, src + same_i, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2818 parity, 1); |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2819 same_parity = !field_output; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2820 same_i++; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2821 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2822 } else if (opp_i < src_len) { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2823 field_output = split_field_copy(dest + out_i, src + opp_i, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2824 PICT_FRAME - parity, 0); |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2825 same_parity = field_output; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2826 opp_i++; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2827 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2828 } else { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2829 break; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2830 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2831 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2832 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2833 return out_i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2834 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2835 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2836 /** |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2837 * Split the reference frame list into a reference field list. |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2838 * This implements H.264 spec 8.2.4.2.5 for a combined input list. |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2839 * The input list contains both reference field pairs and |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2840 * unmatched reference fields; it is ordered as spec describes |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2841 * RefPicListX for frames in 8.2.4.2.1 and 8.2.4.2.3, except that |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2842 * unmatched field pairs are also present. Conceptually this is equivalent |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2843 * to concatenation of refFrameListXShortTerm with refFrameListLongTerm. |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2844 * |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2845 * @param dest output reference list where ordered fields are to be placed |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2846 * @param dest_len max number of fields to place at dest |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2847 * @param src source reference list, as described above |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2848 * @param src_len number of pictures (pairs and unmatched fields) in src |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2849 * @param parity parity of field being currently decoded |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2850 * (one of PICT_{TOP,BOTTOM}_FIELD) |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2851 * @param long_i index into src array that holds first long reference picture, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2852 * or src_len if no long refs present. |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2853 */ |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2854 static int split_field_ref_list(Picture *dest, int dest_len, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2855 Picture *src, int src_len, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2856 int parity, int long_i){ |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2857 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2858 int i = split_field_half_ref_list(dest, dest_len, src, long_i, parity); |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2859 dest += i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2860 dest_len -= i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2861 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2862 i += split_field_half_ref_list(dest, dest_len, src + long_i, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2863 src_len - long_i, parity); |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2864 return i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2865 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2866 |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2867 /** |
1168 | 2868 * fills the default_ref_list. |
2869 */ | |
2870 static int fill_default_ref_list(H264Context *h){ | |
2871 MpegEncContext * const s = &h->s; | |
2872 int i; | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2873 int smallest_poc_greater_than_current = -1; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2874 int structure_sel; |
2582 | 2875 Picture sorted_short_ref[32]; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2876 Picture field_entry_list[2][32]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2877 Picture *frame_list[2]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2878 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2879 if (FIELD_PICTURE) { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2880 structure_sel = PICT_FRAME; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2881 frame_list[0] = field_entry_list[0]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2882 frame_list[1] = field_entry_list[1]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2883 } else { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2884 structure_sel = 0; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2885 frame_list[0] = h->default_ref_list[0]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2886 frame_list[1] = h->default_ref_list[1]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2887 } |
2967 | 2888 |
1168 | 2889 if(h->slice_type==B_TYPE){ |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2890 int list; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2891 int len[2]; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2892 int short_len[2]; |
1168 | 2893 int out_i; |
2713 | 2894 int limit= INT_MIN; |
1168 | 2895 |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2896 /* sort frame according to poc in B slice */ |
1168 | 2897 for(out_i=0; out_i<h->short_ref_count; out_i++){ |
2713 | 2898 int best_i=INT_MIN; |
2255
507690ff49a2
assertion when playing AVC/H.264 streams fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2254
diff
changeset
|
2899 int best_poc=INT_MAX; |
1168 | 2900 |
2901 for(i=0; i<h->short_ref_count; i++){ | |
2902 const int poc= h->short_ref[i]->poc; | |
2903 if(poc > limit && poc < best_poc){ | |
2904 best_poc= poc; | |
2905 best_i= i; | |
2906 } | |
2907 } | |
2967 | 2908 |
2713 | 2909 assert(best_i != INT_MIN); |
2967 | 2910 |
1168 | 2911 limit= best_poc; |
2912 sorted_short_ref[out_i]= *h->short_ref[best_i]; | |
4600 | 2913 tprintf(h->s.avctx, "sorted poc: %d->%d poc:%d fn:%d\n", best_i, out_i, sorted_short_ref[out_i].poc, sorted_short_ref[out_i].frame_num); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2914 if (-1 == smallest_poc_greater_than_current) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2915 if (h->short_ref[best_i]->poc >= s->current_picture_ptr->poc) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2916 smallest_poc_greater_than_current = out_i; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2917 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2918 } |
1168 | 2919 } |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2920 |
5779
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2921 tprintf(h->s.avctx, "current poc: %d, smallest_poc_greater_than_current: %d\n", s->current_picture_ptr->poc, smallest_poc_greater_than_current); |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2922 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2923 // find the largest poc |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2924 for(list=0; list<2; list++){ |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2925 int index = 0; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2926 int j= -99; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2927 int step= list ? -1 : 1; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2928 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2929 for(i=0; i<h->short_ref_count && index < h->ref_count[list]; i++, j+=step) { |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2930 int sel; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2931 while(j<0 || j>= h->short_ref_count){ |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2932 if(j != -99 && step == (list ? -1 : 1)) |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2933 return -1; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2934 step = -step; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2935 j= smallest_poc_greater_than_current + (step>>1); |
1168 | 2936 } |
5779
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2937 sel = sorted_short_ref[j].reference | structure_sel; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2938 if(sel != PICT_FRAME) continue; |
5779
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2939 frame_list[list][index ]= sorted_short_ref[j]; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2940 frame_list[list][index++].pic_id= sorted_short_ref[j].frame_num; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2941 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2942 short_len[list] = index; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2943 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2944 for(i = 0; i < 16 && index < h->ref_count[ list ]; i++){ |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2945 int sel; |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2946 if(h->long_ref[i] == NULL) continue; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2947 sel = h->long_ref[i]->reference | structure_sel; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2948 if(sel != PICT_FRAME) continue; |
5779
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2949 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2950 frame_list[ list ][index ]= *h->long_ref[i]; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2951 frame_list[ list ][index++].pic_id= i;; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2952 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2953 len[list] = index; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2954 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2955 if(list && (smallest_poc_greater_than_current<=0 || smallest_poc_greater_than_current>=h->short_ref_count) && (1 < index)){ |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2956 // swap the two first elements of L1 when |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2957 // L0 and L1 are identical |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2958 Picture temp= frame_list[1][0]; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2959 frame_list[1][0] = frame_list[1][1]; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2960 frame_list[1][1] = temp; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2961 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2962 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2963 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2964 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2965 for(list=0; list<2; list++){ |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2966 if (FIELD_PICTURE) |
5779
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2967 len[list] = split_field_ref_list(h->default_ref_list[list], |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2968 h->ref_count[list], |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2969 frame_list[list], |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2970 len[list], |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2971 s->picture_structure, |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2972 short_len[list]); |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2973 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2974 if(len[list] < h->ref_count[ list ]) |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2975 memset(&h->default_ref_list[list][len[list]], 0, sizeof(Picture)*(h->ref_count[ list ] - len[list])); |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2976 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2977 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2978 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2979 }else{ |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2980 int index=0; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2981 int short_len; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2982 for(i=0; i<h->short_ref_count; i++){ |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2983 int sel; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2984 sel = h->short_ref[i]->reference | structure_sel; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2985 if(sel != PICT_FRAME) continue; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2986 frame_list[0][index ]= *h->short_ref[i]; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2987 frame_list[0][index++].pic_id= h->short_ref[i]->frame_num; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2988 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2989 short_len = index; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2990 for(i = 0; i < 16; i++){ |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2991 int sel; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2992 if(h->long_ref[i] == NULL) continue; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2993 sel = h->long_ref[i]->reference | structure_sel; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2994 if(sel != PICT_FRAME) continue; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2995 frame_list[0][index ]= *h->long_ref[i]; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2996 frame_list[0][index++].pic_id= i;; |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2997 } |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2998 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2999 if (FIELD_PICTURE) |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3000 index = split_field_ref_list(h->default_ref_list[0], |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3001 h->ref_count[0], frame_list[0], |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3002 index, s->picture_structure, |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3003 short_len); |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3004 |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3005 if(index < h->ref_count[0]) |
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
3006 memset(&h->default_ref_list[0][index], 0, sizeof(Picture)*(h->ref_count[0] - index)); |
1168 | 3007 } |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3008 #ifdef TRACE |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3009 for (i=0; i<h->ref_count[0]; i++) { |
4600 | 3010 tprintf(h->s.avctx, "List0: %s fn:%d 0x%p\n", (h->default_ref_list[0][i].long_ref ? "LT" : "ST"), h->default_ref_list[0][i].pic_id, h->default_ref_list[0][i].data[0]); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3011 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3012 if(h->slice_type==B_TYPE){ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3013 for (i=0; i<h->ref_count[1]; i++) { |
4600 | 3014 tprintf(h->s.avctx, "List1: %s fn:%d 0x%p\n", (h->default_ref_list[1][i].long_ref ? "LT" : "ST"), h->default_ref_list[1][i].pic_id, h->default_ref_list[0][i].data[0]); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3015 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3016 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3017 #endif |
1168 | 3018 return 0; |
3019 } | |
3020 | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3021 static void print_short_term(H264Context *h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3022 static void print_long_term(H264Context *h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3023 |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3024 /** |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3025 * Extract structure information about the picture described by pic_num in |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3026 * the current decoding context (frame or field). Note that pic_num is |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3027 * picture number without wrapping (so, 0<=pic_num<max_pic_num). |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3028 * @param pic_num picture number for which to extract structure information |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3029 * @param structure one of PICT_XXX describing structure of picture |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3030 * with pic_num |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3031 * @return frame number (short term) or long term index of picture |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3032 * described by pic_num |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3033 */ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3034 static int pic_num_extract(H264Context *h, int pic_num, int *structure){ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3035 MpegEncContext * const s = &h->s; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3036 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3037 *structure = s->picture_structure; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3038 if(FIELD_PICTURE){ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3039 if (!(pic_num & 1)) |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3040 /* opposite field */ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3041 *structure ^= PICT_FRAME; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3042 pic_num >>= 1; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3043 } |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3044 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3045 return pic_num; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3046 } |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3047 |
1168 | 3048 static int decode_ref_pic_list_reordering(H264Context *h){ |
3049 MpegEncContext * const s = &h->s; | |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3050 int list, index, pic_structure; |
2967 | 3051 |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3052 print_short_term(h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3053 print_long_term(h); |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
3054 if(h->slice_type==I_TYPE || h->slice_type==SI_TYPE) return 0; //FIXME move before func |
2967 | 3055 |
4533 | 3056 for(list=0; list<h->list_count; list++){ |
1168 | 3057 memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]); |
3058 | |
3059 if(get_bits1(&s->gb)){ | |
3060 int pred= h->curr_pic_num; | |
3061 | |
3062 for(index=0; ; index++){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3063 unsigned int reordering_of_pic_nums_idc= get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3064 unsigned int pic_id; |
1168 | 3065 int i; |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
3066 Picture *ref = NULL; |
2967 | 3067 |
3068 if(reordering_of_pic_nums_idc==3) | |
2284
6d26e105f68f
h.264 ref list reordering bugfix patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2272
diff
changeset
|
3069 break; |
2967 | 3070 |
1168 | 3071 if(index >= h->ref_count[list]){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3072 av_log(h->s.avctx, AV_LOG_ERROR, "reference count overflow\n"); |
1168 | 3073 return -1; |
3074 } | |
2967 | 3075 |
1168 | 3076 if(reordering_of_pic_nums_idc<3){ |
3077 if(reordering_of_pic_nums_idc<2){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3078 const unsigned int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1; |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3079 int frame_num; |
1168 | 3080 |
5805 | 3081 if(abs_diff_pic_num > h->max_pic_num){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3082 av_log(h->s.avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n"); |
1168 | 3083 return -1; |
3084 } | |
3085 | |
3086 if(reordering_of_pic_nums_idc == 0) pred-= abs_diff_pic_num; | |
3087 else pred+= abs_diff_pic_num; | |
3088 pred &= h->max_pic_num - 1; | |
2967 | 3089 |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3090 frame_num = pic_num_extract(h, pred, &pic_structure); |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3091 |
2683 | 3092 for(i= h->short_ref_count-1; i>=0; i--){ |
3093 ref = h->short_ref[i]; | |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3094 assert(ref->reference); |
2683 | 3095 assert(!ref->long_ref); |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3096 if(ref->data[0] != NULL && |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3097 ref->frame_num == frame_num && |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3098 (ref->reference & pic_structure) && |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3099 ref->long_ref == 0) // ignore non existing pictures by testing data[0] pointer |
1168 | 3100 break; |
3101 } | |
2683 | 3102 if(i>=0) |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3103 ref->pic_id= pred; |
1168 | 3104 }else{ |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3105 int long_idx; |
1168 | 3106 pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3107 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3108 long_idx= pic_num_extract(h, pic_id, &pic_structure); |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3109 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3110 if(long_idx>31){ |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3111 av_log(h->s.avctx, AV_LOG_ERROR, "long_term_pic_idx overflow\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3112 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3113 } |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3114 ref = h->long_ref[long_idx]; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3115 assert(!(ref && !ref->reference)); |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3116 if(ref && (ref->reference & pic_structure)){ |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3117 ref->pic_id= pic_id; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3118 assert(ref->long_ref); |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3119 i=0; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3120 }else{ |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3121 i=-1; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3122 } |
1168 | 3123 } |
3124 | |
2485
2844b8cf4e11
H.264 multiplce instance in reference list patch by (Loic <lll+ffmpeg m4x org )
michael
parents:
2484
diff
changeset
|
3125 if (i < 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3126 av_log(h->s.avctx, AV_LOG_ERROR, "reference picture missing during reorder\n"); |
1168 | 3127 memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME |
2683 | 3128 } else { |
3129 for(i=index; i+1<h->ref_count[list]; i++){ | |
3130 if(ref->long_ref == h->ref_list[list][i].long_ref && ref->pic_id == h->ref_list[list][i].pic_id) | |
3131 break; | |
2650
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
3132 } |
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
3133 for(; i > index; i--){ |
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
3134 h->ref_list[list][i]= h->ref_list[list][i-1]; |
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
3135 } |
2683 | 3136 h->ref_list[list][index]= *ref; |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3137 if (FIELD_PICTURE){ |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
3138 pic_as_field(&h->ref_list[list][index], pic_structure); |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
3139 } |
1168 | 3140 } |
2284
6d26e105f68f
h.264 ref list reordering bugfix patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2272
diff
changeset
|
3141 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3142 av_log(h->s.avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n"); |
1168 | 3143 return -1; |
3144 } | |
3145 } | |
3146 } | |
4533 | 3147 } |
3148 for(list=0; list<h->list_count; list++){ | |
2680
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
3149 for(index= 0; index < h->ref_count[list]; index++){ |
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
3150 if(!h->ref_list[list][index].data[0]) |
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
3151 h->ref_list[list][index]= s->current_picture; |
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
3152 } |
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
3153 } |
2967 | 3154 |
2396 | 3155 if(h->slice_type==B_TYPE && !h->direct_spatial_mv_pred) |
3156 direct_dist_scale_factor(h); | |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
3157 direct_ref_list_init(h); |
2967 | 3158 return 0; |
1168 | 3159 } |
3160 | |
3379
69901769c811
fill_mbaff_ref_list is missing a return statement, its return value
mru
parents:
3341
diff
changeset
|
3161 static void fill_mbaff_ref_list(H264Context *h){ |
3316 | 3162 int list, i, j; |
4533 | 3163 for(list=0; list<2; list++){ //FIXME try list_count |
3316 | 3164 for(i=0; i<h->ref_count[list]; i++){ |
3165 Picture *frame = &h->ref_list[list][i]; | |
3166 Picture *field = &h->ref_list[list][16+2*i]; | |
3167 field[0] = *frame; | |
3168 for(j=0; j<3; j++) | |
3169 field[0].linesize[j] <<= 1; | |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
3170 field[0].reference = PICT_TOP_FIELD; |
3316 | 3171 field[1] = field[0]; |
3172 for(j=0; j<3; j++) | |
3173 field[1].data[j] += frame->linesize[j]; | |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
3174 field[1].reference = PICT_BOTTOM_FIELD; |
3316 | 3175 |
3176 h->luma_weight[list][16+2*i] = h->luma_weight[list][16+2*i+1] = h->luma_weight[list][i]; | |
3177 h->luma_offset[list][16+2*i] = h->luma_offset[list][16+2*i+1] = h->luma_offset[list][i]; | |
3178 for(j=0; j<2; j++){ | |
3179 h->chroma_weight[list][16+2*i][j] = h->chroma_weight[list][16+2*i+1][j] = h->chroma_weight[list][i][j]; | |
3180 h->chroma_offset[list][16+2*i][j] = h->chroma_offset[list][16+2*i+1][j] = h->chroma_offset[list][i][j]; | |
3181 } | |
3182 } | |
3183 } | |
3184 for(j=0; j<h->ref_count[1]; j++){ | |
3185 for(i=0; i<h->ref_count[0]; i++) | |
3186 h->implicit_weight[j][16+2*i] = h->implicit_weight[j][16+2*i+1] = h->implicit_weight[j][i]; | |
3187 memcpy(h->implicit_weight[16+2*j], h->implicit_weight[j], sizeof(*h->implicit_weight)); | |
3188 memcpy(h->implicit_weight[16+2*j+1], h->implicit_weight[j], sizeof(*h->implicit_weight)); | |
3189 } | |
3190 } | |
3191 | |
1168 | 3192 static int pred_weight_table(H264Context *h){ |
3193 MpegEncContext * const s = &h->s; | |
3194 int list, i; | |
2415 | 3195 int luma_def, chroma_def; |
2967 | 3196 |
2415 | 3197 h->use_weight= 0; |
3198 h->use_weight_chroma= 0; | |
1168 | 3199 h->luma_log2_weight_denom= get_ue_golomb(&s->gb); |
3200 h->chroma_log2_weight_denom= get_ue_golomb(&s->gb); | |
2415 | 3201 luma_def = 1<<h->luma_log2_weight_denom; |
3202 chroma_def = 1<<h->chroma_log2_weight_denom; | |
1168 | 3203 |
3204 for(list=0; list<2; list++){ | |
3205 for(i=0; i<h->ref_count[list]; i++){ | |
3206 int luma_weight_flag, chroma_weight_flag; | |
2967 | 3207 |
1168 | 3208 luma_weight_flag= get_bits1(&s->gb); |
3209 if(luma_weight_flag){ | |
3210 h->luma_weight[list][i]= get_se_golomb(&s->gb); | |
3211 h->luma_offset[list][i]= get_se_golomb(&s->gb); | |
2415 | 3212 if( h->luma_weight[list][i] != luma_def |
3213 || h->luma_offset[list][i] != 0) | |
3214 h->use_weight= 1; | |
3215 }else{ | |
3216 h->luma_weight[list][i]= luma_def; | |
3217 h->luma_offset[list][i]= 0; | |
1168 | 3218 } |
3219 | |
3220 chroma_weight_flag= get_bits1(&s->gb); | |
3221 if(chroma_weight_flag){ | |
3222 int j; | |
3223 for(j=0; j<2; j++){ | |
3224 h->chroma_weight[list][i][j]= get_se_golomb(&s->gb); | |
3225 h->chroma_offset[list][i][j]= get_se_golomb(&s->gb); | |
2415 | 3226 if( h->chroma_weight[list][i][j] != chroma_def |
3227 || h->chroma_offset[list][i][j] != 0) | |
3228 h->use_weight_chroma= 1; | |
3229 } | |
3230 }else{ | |
3231 int j; | |
3232 for(j=0; j<2; j++){ | |
3233 h->chroma_weight[list][i][j]= chroma_def; | |
3234 h->chroma_offset[list][i][j]= 0; | |
1168 | 3235 } |
3236 } | |
3237 } | |
3238 if(h->slice_type != B_TYPE) break; | |
3239 } | |
2415 | 3240 h->use_weight= h->use_weight || h->use_weight_chroma; |
1168 | 3241 return 0; |
3242 } | |
3243 | |
2415 | 3244 static void implicit_weight_table(H264Context *h){ |
3245 MpegEncContext * const s = &h->s; | |
3246 int ref0, ref1; | |
3247 int cur_poc = s->current_picture_ptr->poc; | |
3248 | |
3249 if( h->ref_count[0] == 1 && h->ref_count[1] == 1 | |
3250 && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){ | |
3251 h->use_weight= 0; | |
3252 h->use_weight_chroma= 0; | |
3253 return; | |
3254 } | |
3255 | |
3256 h->use_weight= 2; | |
3257 h->use_weight_chroma= 2; | |
3258 h->luma_log2_weight_denom= 5; | |
3259 h->chroma_log2_weight_denom= 5; | |
3260 | |
3261 for(ref0=0; ref0 < h->ref_count[0]; ref0++){ | |
3262 int poc0 = h->ref_list[0][ref0].poc; | |
3263 for(ref1=0; ref1 < h->ref_count[1]; ref1++){ | |
2519 | 3264 int poc1 = h->ref_list[1][ref1].poc; |
4594 | 3265 int td = av_clip(poc1 - poc0, -128, 127); |
2415 | 3266 if(td){ |
4594 | 3267 int tb = av_clip(cur_poc - poc0, -128, 127); |
4001 | 3268 int tx = (16384 + (FFABS(td) >> 1)) / td; |
4594 | 3269 int dist_scale_factor = av_clip((tb*tx + 32) >> 6, -1024, 1023) >> 2; |
2415 | 3270 if(dist_scale_factor < -64 || dist_scale_factor > 128) |
3271 h->implicit_weight[ref0][ref1] = 32; | |
3272 else | |
3273 h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor; | |
3274 }else | |
3275 h->implicit_weight[ref0][ref1] = 32; | |
3276 } | |
3277 } | |
3278 } | |
3279 | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3280 /** |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3281 * Mark a picture as no longer needed for reference. The refmask |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3282 * argument allows unreferencing of individual fields or the whole frame. |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3283 * If the picture becomes entirely unreferenced, but is being held for |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3284 * display purposes, it is marked as such. |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3285 * @param refmask mask of fields to unreference; the mask is bitwise |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3286 * anded with the reference marking of pic |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3287 * @return non-zero if pic becomes entirely unreferenced (except possibly |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3288 * for display purposes) zero if one of the fields remains in |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3289 * reference |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3290 */ |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3291 static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){ |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3292 int i; |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3293 if (pic->reference &= refmask) { |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3294 return 0; |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3295 } else { |
5769 | 3296 if(pic == h->delayed_output_pic) |
3297 pic->reference=DELAYED_PIC_REF; | |
3298 else{ | |
3299 for(i = 0; h->delayed_pic[i]; i++) | |
3300 if(pic == h->delayed_pic[i]){ | |
3301 pic->reference=DELAYED_PIC_REF; | |
3302 break; | |
3303 } | |
3304 } | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3305 return 1; |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3306 } |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3307 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3308 |
1168 | 3309 /** |
2392 | 3310 * instantaneous decoder refresh. |
1168 | 3311 */ |
3312 static void idr(H264Context *h){ | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3313 int i; |
1168 | 3314 |
2484
a3188eb4266c
correct long term picture management patch by (Loic <lll+ffmpeg m4x org>)
michael
parents:
2471
diff
changeset
|
3315 for(i=0; i<16; i++){ |
a3188eb4266c
correct long term picture management patch by (Loic <lll+ffmpeg m4x org>)
michael
parents:
2471
diff
changeset
|
3316 if (h->long_ref[i] != NULL) { |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3317 unreference_pic(h, h->long_ref[i], 0); |
2484
a3188eb4266c
correct long term picture management patch by (Loic <lll+ffmpeg m4x org>)
michael
parents:
2471
diff
changeset
|
3318 h->long_ref[i]= NULL; |
a3188eb4266c
correct long term picture management patch by (Loic <lll+ffmpeg m4x org>)
michael
parents:
2471
diff
changeset
|
3319 } |
1168 | 3320 } |
3321 h->long_ref_count=0; | |
3322 | |
3323 for(i=0; i<h->short_ref_count; i++){ | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3324 unreference_pic(h, h->short_ref[i], 0); |
1168 | 3325 h->short_ref[i]= NULL; |
3326 } | |
3327 h->short_ref_count=0; | |
3328 } | |
3329 | |
2640 | 3330 /* forget old pics after a seek */ |
3331 static void flush_dpb(AVCodecContext *avctx){ | |
3332 H264Context *h= avctx->priv_data; | |
3333 int i; | |
3144 | 3334 for(i=0; i<16; i++) { |
3335 if(h->delayed_pic[i]) | |
3336 h->delayed_pic[i]->reference= 0; | |
2640 | 3337 h->delayed_pic[i]= NULL; |
3144 | 3338 } |
3339 if(h->delayed_output_pic) | |
3340 h->delayed_output_pic->reference= 0; | |
2640 | 3341 h->delayed_output_pic= NULL; |
3342 idr(h); | |
2751
3247049dfc7a
fix segfault if flush is called before the first frame
mru
parents:
2748
diff
changeset
|
3343 if(h->s.current_picture_ptr) |
3247049dfc7a
fix segfault if flush is called before the first frame
mru
parents:
2748
diff
changeset
|
3344 h->s.current_picture_ptr->reference= 0; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3345 h->s.first_field= 0; |
5926
77403dc808cd
Call mpegvideo flush routine on h264 flush. Needed in particular
heydowns
parents:
5904
diff
changeset
|
3346 ff_mpeg_flush(avctx); |
2640 | 3347 } |
3348 | |
1168 | 3349 /** |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3350 * Find a Picture in the short term reference list by frame number. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3351 * @param frame_num frame number to search for |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3352 * @param idx the index into h->short_ref where returned picture is found |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3353 * undefined if no picture found. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3354 * @return pointer to the found picture, or NULL if no pic with the provided |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3355 * frame number is found |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3356 */ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3357 static Picture * find_short(H264Context *h, int frame_num, int *idx){ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3358 MpegEncContext * const s = &h->s; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3359 int i; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3360 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3361 for(i=0; i<h->short_ref_count; i++){ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3362 Picture *pic= h->short_ref[i]; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3363 if(s->avctx->debug&FF_DEBUG_MMCO) |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3364 av_log(h->s.avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3365 if(pic->frame_num == frame_num) { |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3366 *idx = i; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3367 return pic; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3368 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3369 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3370 return NULL; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3371 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3372 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3373 /** |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3374 * Remove a picture from the short term reference list by its index in |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3375 * that list. This does no checking on the provided index; it is assumed |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3376 * to be valid. Other list entries are shifted down. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3377 * @param i index into h->short_ref of picture to remove. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3378 */ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3379 static void remove_short_at_index(H264Context *h, int i){ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3380 assert(i > 0 && i < h->short_ref_count); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3381 h->short_ref[i]= NULL; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3382 if (--h->short_ref_count) |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3383 memmove(&h->short_ref[i], &h->short_ref[i+1], (h->short_ref_count - i)*sizeof(Picture*)); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3384 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3385 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3386 /** |
1168 | 3387 * |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
3388 * @return the removed picture or NULL if an error occurs |
1168 | 3389 */ |
3390 static Picture * remove_short(H264Context *h, int frame_num){ | |
1169 | 3391 MpegEncContext * const s = &h->s; |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3392 Picture *pic; |
1168 | 3393 int i; |
2967 | 3394 |
1169 | 3395 if(s->avctx->debug&FF_DEBUG_MMCO) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3396 av_log(h->s.avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count); |
2967 | 3397 |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3398 pic = find_short(h, frame_num, &i); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3399 if (pic) |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3400 remove_short_at_index(h, i); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3401 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3402 return pic; |
1168 | 3403 } |
3404 | |
3405 /** | |
5774
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3406 * Remove a picture from the long term reference list by its index in |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3407 * that list. This does no checking on the provided index; it is assumed |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3408 * to be valid. The removed entry is set to NULL. Other entries are unaffected. |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3409 * @param i index into h->long_ref of picture to remove. |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3410 */ |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3411 static void remove_long_at_index(H264Context *h, int i){ |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3412 h->long_ref[i]= NULL; |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3413 h->long_ref_count--; |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3414 } |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3415 |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3416 /** |
1168 | 3417 * |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
3418 * @return the removed picture or NULL if an error occurs |
1168 | 3419 */ |
3420 static Picture * remove_long(H264Context *h, int i){ | |
3421 Picture *pic; | |
3422 | |
3423 pic= h->long_ref[i]; | |
5774
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3424 if (pic) |
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3425 remove_long_at_index(h, i); |
1168 | 3426 |
3427 return pic; | |
3428 } | |
3429 | |
3430 /** | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3431 * print short term list |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3432 */ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3433 static void print_short_term(H264Context *h) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3434 uint32_t i; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3435 if(h->s.avctx->debug&FF_DEBUG_MMCO) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3436 av_log(h->s.avctx, AV_LOG_DEBUG, "short term list:\n"); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3437 for(i=0; i<h->short_ref_count; i++){ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3438 Picture *pic= h->short_ref[i]; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3439 av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", i, pic->frame_num, pic->poc, pic->data[0]); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3440 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3441 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3442 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3443 |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3444 /** |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3445 * print long term list |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3446 */ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3447 static void print_long_term(H264Context *h) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3448 uint32_t i; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3449 if(h->s.avctx->debug&FF_DEBUG_MMCO) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3450 av_log(h->s.avctx, AV_LOG_DEBUG, "long term list:\n"); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3451 for(i = 0; i < 16; i++){ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3452 Picture *pic= h->long_ref[i]; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3453 if (pic) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3454 av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", i, pic->frame_num, pic->poc, pic->data[0]); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3455 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3456 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3457 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3458 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3459 |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3460 /** |
1168 | 3461 * Executes the reference picture marking (memory management control operations). |
3462 */ | |
3463 static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ | |
3464 MpegEncContext * const s = &h->s; | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3465 int i, j; |
5785
74fa2587b8de
Cosmetic renaming variable so that it makes more sense for forthcoming PAFF mmco patches.
andoma
parents:
5784
diff
changeset
|
3466 int current_ref_assigned=0; |
1168 | 3467 Picture *pic; |
2967 | 3468 |
1168 | 3469 if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3470 av_log(h->s.avctx, AV_LOG_DEBUG, "no mmco here\n"); |
2967 | 3471 |
1168 | 3472 for(i=0; i<mmco_count; i++){ |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3473 int structure, frame_num, unref_pic; |
1168 | 3474 if(s->avctx->debug&FF_DEBUG_MMCO) |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3475 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_pic_num, h->mmco[i].long_arg); |
1168 | 3476 |
3477 switch(mmco[i].opcode){ | |
3478 case MMCO_SHORT2UNUSED: | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3479 if(s->avctx->debug&FF_DEBUG_MMCO) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3480 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n", h->mmco[i].short_pic_num, h->short_ref_count); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3481 frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3482 pic = find_short(h, frame_num, &j); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3483 if (pic) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3484 if (unreference_pic(h, pic, structure ^ PICT_FRAME)) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3485 remove_short_at_index(h, j); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3486 } else if(s->avctx->debug&FF_DEBUG_MMCO) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3487 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref short failure\n"); |
1168 | 3488 break; |
3489 case MMCO_SHORT2LONG: | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3490 if (FIELD_PICTURE && mmco[i].long_arg < h->long_ref_count && |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3491 h->long_ref[mmco[i].long_arg]->frame_num == |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3492 mmco[i].short_pic_num / 2) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3493 /* do nothing, we've already moved this field pair. */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3494 } else { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3495 int frame_num = mmco[i].short_pic_num >> FIELD_PICTURE; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3496 |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3497 pic= remove_long(h, mmco[i].long_arg); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3498 if(pic) unreference_pic(h, pic, 0); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3499 |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3500 h->long_ref[ mmco[i].long_arg ]= remove_short(h, frame_num); |
5787 | 3501 if (h->long_ref[ mmco[i].long_arg ]){ |
3502 h->long_ref[ mmco[i].long_arg ]->long_ref=1; | |
3503 h->long_ref_count++; | |
3504 } | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3505 } |
1168 | 3506 break; |
3507 case MMCO_LONG2UNUSED: | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3508 j = pic_num_extract(h, mmco[i].long_arg, &structure); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3509 pic = h->long_ref[j]; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3510 if (pic) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3511 if (unreference_pic(h, pic, structure ^ PICT_FRAME)) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3512 remove_long_at_index(h, j); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3513 } else if(s->avctx->debug&FF_DEBUG_MMCO) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3514 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref long failure\n"); |
1168 | 3515 break; |
3516 case MMCO_LONG: | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3517 unref_pic = 1; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3518 if (FIELD_PICTURE && !s->first_field) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3519 if (h->long_ref[mmco[i].long_arg] == s->current_picture_ptr) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3520 /* Just mark second field as referenced */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3521 unref_pic = 0; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3522 } else if (s->current_picture_ptr->reference) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3523 /* First field in pair is in short term list or |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3524 * at a different long term index. |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3525 * This is not allowed; see 7.4.3, notes 2 and 3. |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3526 * Report the problem and keep the pair where it is, |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3527 * and mark this field valid. |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3528 */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3529 av_log(h->s.avctx, AV_LOG_ERROR, |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3530 "illegal long term reference assignment for second " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3531 "field in complementary field pair (first field is " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3532 "short term or has non-matching long index)\n"); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3533 unref_pic = 0; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3534 } |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3535 } |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3536 |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3537 if (unref_pic) { |
5787 | 3538 pic= remove_long(h, mmco[i].long_arg); |
3539 if(pic) unreference_pic(h, pic, 0); | |
3540 | |
3541 h->long_ref[ mmco[i].long_arg ]= s->current_picture_ptr; | |
3542 h->long_ref[ mmco[i].long_arg ]->long_ref=1; | |
3543 h->long_ref_count++; | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3544 } |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3545 |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3546 s->current_picture_ptr->reference |= s->picture_structure; |
5785
74fa2587b8de
Cosmetic renaming variable so that it makes more sense for forthcoming PAFF mmco patches.
andoma
parents:
5784
diff
changeset
|
3547 current_ref_assigned=1; |
1168 | 3548 break; |
3549 case MMCO_SET_MAX_LONG: | |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3550 assert(mmco[i].long_arg <= 16); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3551 // just remove the long term which index is greater than new max |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3552 for(j = mmco[i].long_arg; j<16; j++){ |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3553 pic = remove_long(h, j); |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3554 if (pic) unreference_pic(h, pic, 0); |
1168 | 3555 } |
3556 break; | |
3557 case MMCO_RESET: | |
3558 while(h->short_ref_count){ | |
3559 pic= remove_short(h, h->short_ref[0]->frame_num); | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3560 if(pic) unreference_pic(h, pic, 0); |
1168 | 3561 } |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3562 for(j = 0; j < 16; j++) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3563 pic= remove_long(h, j); |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3564 if(pic) unreference_pic(h, pic, 0); |
1168 | 3565 } |
3566 break; | |
3567 default: assert(0); | |
3568 } | |
3569 } | |
2967 | 3570 |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3571 if (!current_ref_assigned && FIELD_PICTURE && |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3572 !s->first_field && s->current_picture_ptr->reference) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3573 |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3574 /* Second field of complementary field pair; the first field of |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3575 * which is already referenced. If short referenced, it |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3576 * should be first entry in short_ref. If not, it must exist |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3577 * in long_ref; trying to put it on the short list here is an |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3578 * error in the encoded bit stream (ref: 7.4.3, NOTE 2 and 3). |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3579 */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3580 if (h->short_ref_count && h->short_ref[0] == s->current_picture_ptr) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3581 /* Just mark the second field valid */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3582 s->current_picture_ptr->reference = PICT_FRAME; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3583 } else if (s->current_picture_ptr->long_ref) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3584 av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term reference " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3585 "assignment for second field " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3586 "in complementary field pair " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3587 "(first field is long term)\n"); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3588 } else { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3589 /* |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3590 * First field in reference, but not in any sensible place on our |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3591 * reference lists. This shouldn't happen unless reference |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3592 * handling somewhere else is wrong. |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3593 */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3594 assert(0); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3595 } |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3596 current_ref_assigned = 1; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3597 } |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3598 |
5785
74fa2587b8de
Cosmetic renaming variable so that it makes more sense for forthcoming PAFF mmco patches.
andoma
parents:
5784
diff
changeset
|
3599 if(!current_ref_assigned){ |
1168 | 3600 pic= remove_short(h, s->current_picture_ptr->frame_num); |
3601 if(pic){ | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3602 unreference_pic(h, pic, 0); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3603 av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n"); |
1168 | 3604 } |
2967 | 3605 |
1168 | 3606 if(h->short_ref_count) |
1169 | 3607 memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*)); |
3608 | |
3609 h->short_ref[0]= s->current_picture_ptr; | |
1168 | 3610 h->short_ref[0]->long_ref=0; |
3611 h->short_ref_count++; | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3612 s->current_picture_ptr->reference |= s->picture_structure; |
1168 | 3613 } |
2967 | 3614 |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3615 print_short_term(h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3616 print_long_term(h); |
2967 | 3617 return 0; |
1168 | 3618 } |
3619 | |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3620 static int decode_ref_pic_marking(H264Context *h, GetBitContext *gb){ |
1168 | 3621 MpegEncContext * const s = &h->s; |
3622 int i; | |
2967 | 3623 |
1168 | 3624 if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3625 s->broken_link= get_bits1(gb) -1; |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3626 h->mmco[0].long_arg= get_bits1(gb) - 1; // current_long_term_idx |
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3627 if(h->mmco[0].long_arg == -1) |
1168 | 3628 h->mmco_index= 0; |
3629 else{ | |
3630 h->mmco[0].opcode= MMCO_LONG; | |
3631 h->mmco_index= 1; | |
2967 | 3632 } |
1168 | 3633 }else{ |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3634 if(get_bits1(gb)){ // adaptive_ref_pic_marking_mode_flag |
2967 | 3635 for(i= 0; i<MAX_MMCO_COUNT; i++) { |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3636 MMCOOpcode opcode= get_ue_golomb(gb); |
1168 | 3637 |
3638 h->mmco[i].opcode= opcode; | |
3639 if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){ | |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3640 h->mmco[i].short_pic_num= (h->curr_pic_num - get_ue_golomb(gb) - 1) & (h->max_pic_num - 1); |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3641 /* if(h->mmco[i].short_pic_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_pic_num ] == NULL){ |
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2844
diff
changeset
|
3642 av_log(s->avctx, AV_LOG_ERROR, "illegal short ref in memory management control operation %d\n", mmco); |
1168 | 3643 return -1; |
3644 }*/ | |
3645 } | |
3646 if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){ | |
5771
5290a3850c03
Rename variable to make sense in both field and frame contexts (support of PAFF implementation).
andoma
parents:
5770
diff
changeset
|
3647 unsigned int long_arg= get_ue_golomb(gb); |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3648 if(long_arg >= 32 || (long_arg >= 16 && !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE))){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3649 av_log(h->s.avctx, AV_LOG_ERROR, "illegal long ref in memory management control operation %d\n", opcode); |
1168 | 3650 return -1; |
3651 } | |
5771
5290a3850c03
Rename variable to make sense in both field and frame contexts (support of PAFF implementation).
andoma
parents:
5770
diff
changeset
|
3652 h->mmco[i].long_arg= long_arg; |
1168 | 3653 } |
2967 | 3654 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3655 if(opcode > (unsigned)MMCO_LONG){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3656 av_log(h->s.avctx, AV_LOG_ERROR, "illegal memory management control operation %d\n", opcode); |
1168 | 3657 return -1; |
3658 } | |
2255
507690ff49a2
assertion when playing AVC/H.264 streams fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2254
diff
changeset
|
3659 if(opcode == MMCO_END) |
507690ff49a2
assertion when playing AVC/H.264 streams fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2254
diff
changeset
|
3660 break; |
1168 | 3661 } |
3662 h->mmco_index= i; | |
3663 }else{ | |
3664 assert(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count); | |
3665 | |
5987 | 3666 if(h->short_ref_count && h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count && |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3667 !(FIELD_PICTURE && !s->first_field && s->current_picture_ptr->reference)) { |
1168 | 3668 h->mmco[0].opcode= MMCO_SHORT2UNUSED; |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3669 h->mmco[0].short_pic_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num; |
1168 | 3670 h->mmco_index= 1; |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3671 if (FIELD_PICTURE) { |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3672 h->mmco[0].short_pic_num *= 2; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3673 h->mmco[1].opcode= MMCO_SHORT2UNUSED; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3674 h->mmco[1].short_pic_num= h->mmco[0].short_pic_num + 1; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3675 h->mmco_index= 2; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3676 } |
1168 | 3677 }else |
3678 h->mmco_index= 0; | |
3679 } | |
3680 } | |
2967 | 3681 |
3682 return 0; | |
1168 | 3683 } |
3684 | |
3685 static int init_poc(H264Context *h){ | |
3686 MpegEncContext * const s = &h->s; | |
3687 const int max_frame_num= 1<<h->sps.log2_max_frame_num; | |
3688 int field_poc[2]; | |
3689 | |
3690 if(h->nal_unit_type == NAL_IDR_SLICE){ | |
3691 h->frame_num_offset= 0; | |
3692 }else{ | |
3693 if(h->frame_num < h->prev_frame_num) | |
3694 h->frame_num_offset= h->prev_frame_num_offset + max_frame_num; | |
3695 else | |
3696 h->frame_num_offset= h->prev_frame_num_offset; | |
3697 } | |
3698 | |
3699 if(h->sps.poc_type==0){ | |
3700 const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb; | |
3701 | |
2649
b2e6c5e9240b
fix decoding of conformace streams AUD_MW_E.264 and BA1_FT_C.264 again (there where last correctly decoded with h264.c rev 1.96)
michael
parents:
2648
diff
changeset
|
3702 if(h->nal_unit_type == NAL_IDR_SLICE){ |
b2e6c5e9240b
fix decoding of conformace streams AUD_MW_E.264 and BA1_FT_C.264 again (there where last correctly decoded with h264.c rev 1.96)
michael
parents:
2648
diff
changeset
|
3703 h->prev_poc_msb= |
b2e6c5e9240b
fix decoding of conformace streams AUD_MW_E.264 and BA1_FT_C.264 again (there where last correctly decoded with h264.c rev 1.96)
michael
parents:
2648
diff
changeset
|
3704 h->prev_poc_lsb= 0; |
b2e6c5e9240b
fix decoding of conformace streams AUD_MW_E.264 and BA1_FT_C.264 again (there where last correctly decoded with h264.c rev 1.96)
michael
parents:
2648
diff
changeset
|
3705 } |
b2e6c5e9240b
fix decoding of conformace streams AUD_MW_E.264 and BA1_FT_C.264 again (there where last correctly decoded with h264.c rev 1.96)
michael
parents:
2648
diff
changeset
|
3706 |
1168 | 3707 if (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2) |
3708 h->poc_msb = h->prev_poc_msb + max_poc_lsb; | |
3709 else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2) | |
3710 h->poc_msb = h->prev_poc_msb - max_poc_lsb; | |
3711 else | |
3712 h->poc_msb = h->prev_poc_msb; | |
3713 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb); | |
2967 | 3714 field_poc[0] = |
1168 | 3715 field_poc[1] = h->poc_msb + h->poc_lsb; |
2967 | 3716 if(s->picture_structure == PICT_FRAME) |
1168 | 3717 field_poc[1] += h->delta_poc_bottom; |
3718 }else if(h->sps.poc_type==1){ | |
3719 int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc; | |
3720 int i; | |
3721 | |
3722 if(h->sps.poc_cycle_length != 0) | |
3723 abs_frame_num = h->frame_num_offset + h->frame_num; | |
3724 else | |
3725 abs_frame_num = 0; | |
3726 | |
3727 if(h->nal_ref_idc==0 && abs_frame_num > 0) | |
3728 abs_frame_num--; | |
2967 | 3729 |
1168 | 3730 expected_delta_per_poc_cycle = 0; |
3731 for(i=0; i < h->sps.poc_cycle_length; i++) | |
3732 expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse | |
3733 | |
3734 if(abs_frame_num > 0){ | |
3735 int poc_cycle_cnt = (abs_frame_num - 1) / h->sps.poc_cycle_length; | |
3736 int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length; | |
3737 | |
3738 expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle; | |
3739 for(i = 0; i <= frame_num_in_poc_cycle; i++) | |
3740 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ]; | |
3741 } else | |
3742 expectedpoc = 0; | |
3743 | |
2967 | 3744 if(h->nal_ref_idc == 0) |
1168 | 3745 expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic; |
2967 | 3746 |
1168 | 3747 field_poc[0] = expectedpoc + h->delta_poc[0]; |
3748 field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field; | |
3749 | |
3750 if(s->picture_structure == PICT_FRAME) | |
3751 field_poc[1] += h->delta_poc[1]; | |
3752 }else{ | |
3753 int poc; | |
3754 if(h->nal_unit_type == NAL_IDR_SLICE){ | |
3755 poc= 0; | |
3756 }else{ | |
3757 if(h->nal_ref_idc) poc= 2*(h->frame_num_offset + h->frame_num); | |
3758 else poc= 2*(h->frame_num_offset + h->frame_num) - 1; | |
3759 } | |
3760 field_poc[0]= poc; | |
3761 field_poc[1]= poc; | |
3762 } | |
2967 | 3763 |
5782
58647a83d416
Set Picture.poc for fields and field pairs. Part of PAFF implementation.
andoma
parents:
5781
diff
changeset
|
3764 if(s->picture_structure != PICT_BOTTOM_FIELD) { |
1168 | 3765 s->current_picture_ptr->field_poc[0]= field_poc[0]; |
5782
58647a83d416
Set Picture.poc for fields and field pairs. Part of PAFF implementation.
andoma
parents:
5781
diff
changeset
|
3766 s->current_picture_ptr->poc = field_poc[0]; |
58647a83d416
Set Picture.poc for fields and field pairs. Part of PAFF implementation.
andoma
parents:
5781
diff
changeset
|
3767 } |
58647a83d416
Set Picture.poc for fields and field pairs. Part of PAFF implementation.
andoma
parents:
5781
diff
changeset
|
3768 if(s->picture_structure != PICT_TOP_FIELD) { |
1168 | 3769 s->current_picture_ptr->field_poc[1]= field_poc[1]; |
5782
58647a83d416
Set Picture.poc for fields and field pairs. Part of PAFF implementation.
andoma
parents:
5781
diff
changeset
|
3770 s->current_picture_ptr->poc = field_poc[1]; |
58647a83d416
Set Picture.poc for fields and field pairs. Part of PAFF implementation.
andoma
parents:
5781
diff
changeset
|
3771 } |
5878
6c962a4004a1
Fix poc for field pictures. Prior to this, the poc of the second field
heydowns
parents:
5876
diff
changeset
|
3772 if(!FIELD_PICTURE || !s->first_field) { |
6c962a4004a1
Fix poc for field pictures. Prior to this, the poc of the second field
heydowns
parents:
5876
diff
changeset
|
3773 Picture *cur = s->current_picture_ptr; |
6c962a4004a1
Fix poc for field pictures. Prior to this, the poc of the second field
heydowns
parents:
5876
diff
changeset
|
3774 cur->poc= FFMIN(cur->field_poc[0], cur->field_poc[1]); |
6c962a4004a1
Fix poc for field pictures. Prior to this, the poc of the second field
heydowns
parents:
5876
diff
changeset
|
3775 } |
1168 | 3776 |
3777 return 0; | |
3778 } | |
3779 | |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3780 |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3781 /** |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3782 * initialize scan tables |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3783 */ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3784 static void init_scan_tables(H264Context *h){ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3785 MpegEncContext * const s = &h->s; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3786 int i; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3787 if(s->dsp.h264_idct_add == ff_h264_idct_add_c){ //FIXME little ugly |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3788 memcpy(h->zigzag_scan, zigzag_scan, 16*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3789 memcpy(h-> field_scan, field_scan, 16*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3790 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3791 for(i=0; i<16; i++){ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3792 #define T(x) (x>>2) | ((x<<2) & 0xF) |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3793 h->zigzag_scan[i] = T(zigzag_scan[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3794 h-> field_scan[i] = T( field_scan[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3795 #undef T |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3796 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3797 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3798 if(s->dsp.h264_idct8_add == ff_h264_idct8_add_c){ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3799 memcpy(h->zigzag_scan8x8, zigzag_scan8x8, 64*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3800 memcpy(h->zigzag_scan8x8_cavlc, zigzag_scan8x8_cavlc, 64*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3801 memcpy(h->field_scan8x8, field_scan8x8, 64*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3802 memcpy(h->field_scan8x8_cavlc, field_scan8x8_cavlc, 64*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3803 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3804 for(i=0; i<64; i++){ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3805 #define T(x) (x>>3) | ((x&7)<<3) |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3806 h->zigzag_scan8x8[i] = T(zigzag_scan8x8[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3807 h->zigzag_scan8x8_cavlc[i] = T(zigzag_scan8x8_cavlc[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3808 h->field_scan8x8[i] = T(field_scan8x8[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3809 h->field_scan8x8_cavlc[i] = T(field_scan8x8_cavlc[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3810 #undef T |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3811 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3812 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3813 if(h->sps.transform_bypass){ //FIXME same ugly |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3814 h->zigzag_scan_q0 = zigzag_scan; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3815 h->zigzag_scan8x8_q0 = zigzag_scan8x8; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3816 h->zigzag_scan8x8_cavlc_q0 = zigzag_scan8x8_cavlc; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3817 h->field_scan_q0 = field_scan; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3818 h->field_scan8x8_q0 = field_scan8x8; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3819 h->field_scan8x8_cavlc_q0 = field_scan8x8_cavlc; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3820 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3821 h->zigzag_scan_q0 = h->zigzag_scan; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3822 h->zigzag_scan8x8_q0 = h->zigzag_scan8x8; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3823 h->zigzag_scan8x8_cavlc_q0 = h->zigzag_scan8x8_cavlc; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3824 h->field_scan_q0 = h->field_scan; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3825 h->field_scan8x8_q0 = h->field_scan8x8; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3826 h->field_scan8x8_cavlc_q0 = h->field_scan8x8_cavlc; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3827 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3828 } |
5642 | 3829 |
3830 /** | |
3831 * Replicates H264 "master" context to thread contexts. | |
3832 */ | |
3833 static void clone_slice(H264Context *dst, H264Context *src) | |
3834 { | |
3835 memcpy(dst->block_offset, src->block_offset, sizeof(dst->block_offset)); | |
3836 dst->s.current_picture_ptr = src->s.current_picture_ptr; | |
3837 dst->s.current_picture = src->s.current_picture; | |
3838 dst->s.linesize = src->s.linesize; | |
3839 dst->s.uvlinesize = src->s.uvlinesize; | |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3840 dst->s.first_field = src->s.first_field; |
5642 | 3841 |
3842 dst->prev_poc_msb = src->prev_poc_msb; | |
3843 dst->prev_poc_lsb = src->prev_poc_lsb; | |
3844 dst->prev_frame_num_offset = src->prev_frame_num_offset; | |
3845 dst->prev_frame_num = src->prev_frame_num; | |
3846 dst->short_ref_count = src->short_ref_count; | |
3847 | |
3848 memcpy(dst->short_ref, src->short_ref, sizeof(dst->short_ref)); | |
3849 memcpy(dst->long_ref, src->long_ref, sizeof(dst->long_ref)); | |
3850 memcpy(dst->default_ref_list, src->default_ref_list, sizeof(dst->default_ref_list)); | |
3851 memcpy(dst->ref_list, src->ref_list, sizeof(dst->ref_list)); | |
5685
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
3852 |
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
3853 memcpy(dst->dequant4_coeff, src->dequant4_coeff, sizeof(src->dequant4_coeff)); |
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
3854 memcpy(dst->dequant8_coeff, src->dequant8_coeff, sizeof(src->dequant8_coeff)); |
5642 | 3855 } |
3856 | |
1168 | 3857 /** |
3858 * decodes a slice header. | |
3859 * this will allso call MPV_common_init() and frame_start() as needed | |
5642 | 3860 * |
3861 * @param h h264context | |
3862 * @param h0 h264 master context (differs from 'h' when doing sliced based parallel decoding) | |
3863 * | |
3864 * @return 0 if okay, <0 if an error occured, 1 if decoding must not be multithreaded | |
1168 | 3865 */ |
5642 | 3866 static int decode_slice_header(H264Context *h, H264Context *h0){ |
1168 | 3867 MpegEncContext * const s = &h->s; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3868 MpegEncContext * const s0 = &h0->s; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3869 unsigned int first_mb_in_slice; |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3870 unsigned int pps_id; |
1168 | 3871 int num_ref_idx_active_override_flag; |
3872 static const uint8_t slice_type_map[5]= {P_TYPE, B_TYPE, I_TYPE, SP_TYPE, SI_TYPE}; | |
5642 | 3873 unsigned int slice_type, tmp, i; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3874 int default_ref_list_done = 0; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3875 int last_pic_structure; |
1168 | 3876 |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
3877 s->dropable= h->nal_ref_idc == 0; |
1168 | 3878 |
5984
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3879 if((s->avctx->flags2 & CODEC_FLAG2_FAST) && !h->nal_ref_idc){ |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3880 s->me.qpel_put= s->dsp.put_2tap_qpel_pixels_tab; |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3881 s->me.qpel_avg= s->dsp.avg_2tap_qpel_pixels_tab; |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3882 }else{ |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3883 s->me.qpel_put= s->dsp.put_h264_qpel_pixels_tab; |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3884 s->me.qpel_avg= s->dsp.avg_h264_qpel_pixels_tab; |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3885 } |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3886 |
1168 | 3887 first_mb_in_slice= get_ue_golomb(&s->gb); |
3888 | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3889 if((s->flags2 & CODEC_FLAG2_CHUNKS) && first_mb_in_slice == 0){ |
5642 | 3890 h0->current_slice = 0; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3891 if (!s0->first_field) |
5803 | 3892 s->current_picture_ptr= NULL; |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3893 } |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3894 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3895 slice_type= get_ue_golomb(&s->gb); |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3896 if(slice_type > 9){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3897 av_log(h->s.avctx, AV_LOG_ERROR, "slice type too large (%d) at %d %d\n", h->slice_type, s->mb_x, s->mb_y); |
2392 | 3898 return -1; |
1168 | 3899 } |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3900 if(slice_type > 4){ |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3901 slice_type -= 5; |
1168 | 3902 h->slice_type_fixed=1; |
3903 }else | |
3904 h->slice_type_fixed=0; | |
2967 | 3905 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3906 slice_type= slice_type_map[ slice_type ]; |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3907 if (slice_type == I_TYPE |
5642 | 3908 || (h0->current_slice != 0 && slice_type == h0->last_slice_type) ) { |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3909 default_ref_list_done = 1; |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3910 } |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3911 h->slice_type= slice_type; |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3912 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
3913 s->pict_type= h->slice_type; // to make a few old func happy, it's wrong though |
6016
5455f4e43948
Make h264 decoder conform to requirements of mpegvideo's MPV_frame_start.
heydowns
parents:
6014
diff
changeset
|
3914 if (s->pict_type == B_TYPE && s->last_picture_ptr == NULL) { |
5455f4e43948
Make h264 decoder conform to requirements of mpegvideo's MPV_frame_start.
heydowns
parents:
6014
diff
changeset
|
3915 av_log(h->s.avctx, AV_LOG_ERROR, |
5455f4e43948
Make h264 decoder conform to requirements of mpegvideo's MPV_frame_start.
heydowns
parents:
6014
diff
changeset
|
3916 "B picture before any references, skipping\n"); |
5455f4e43948
Make h264 decoder conform to requirements of mpegvideo's MPV_frame_start.
heydowns
parents:
6014
diff
changeset
|
3917 return -1; |
5455f4e43948
Make h264 decoder conform to requirements of mpegvideo's MPV_frame_start.
heydowns
parents:
6014
diff
changeset
|
3918 } |
2967 | 3919 |
1168 | 3920 pps_id= get_ue_golomb(&s->gb); |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
3921 if(pps_id>=MAX_PPS_COUNT){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3922 av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n"); |
1168 | 3923 return -1; |
3924 } | |
5642 | 3925 if(!h0->pps_buffers[pps_id]) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3926 av_log(h->s.avctx, AV_LOG_ERROR, "non existing PPS referenced\n"); |
1174 | 3927 return -1; |
3928 } | |
5642 | 3929 h->pps= *h0->pps_buffers[pps_id]; |
3930 | |
3931 if(!h0->sps_buffers[h->pps.sps_id]) { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3932 av_log(h->s.avctx, AV_LOG_ERROR, "non existing SPS referenced\n"); |
1174 | 3933 return -1; |
3934 } | |
5642 | 3935 h->sps = *h0->sps_buffers[h->pps.sps_id]; |
2919 | 3936 |
5685
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
3937 if(h == h0 && h->dequant_coeff_pps != pps_id){ |
4363 | 3938 h->dequant_coeff_pps = pps_id; |
2919 | 3939 init_dequant_tables(h); |
3940 } | |
2967 | 3941 |
1168 | 3942 s->mb_width= h->sps.mb_width; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
3943 s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag); |
2967 | 3944 |
3178 | 3945 h->b_stride= s->mb_width*4; |
3946 h->b8_stride= s->mb_width*2; | |
1168 | 3947 |
1371 | 3948 s->width = 16*s->mb_width - 2*(h->sps.crop_left + h->sps.crop_right ); |
1168 | 3949 if(h->sps.frame_mbs_only_flag) |
1371 | 3950 s->height= 16*s->mb_height - 2*(h->sps.crop_top + h->sps.crop_bottom); |
1168 | 3951 else |
1371 | 3952 s->height= 16*s->mb_height - 4*(h->sps.crop_top + h->sps.crop_bottom); //FIXME recheck |
2967 | 3953 |
3954 if (s->context_initialized | |
1548 | 3955 && ( s->width != s->avctx->width || s->height != s->avctx->height)) { |
5642 | 3956 if(h != h0) |
3957 return -1; // width / height changed during parallelized decoding | |
1168 | 3958 free_tables(h); |
3959 MPV_common_end(s); | |
3960 } | |
3961 if (!s->context_initialized) { | |
5642 | 3962 if(h != h0) |
3963 return -1; // we cant (re-)initialize context during parallel decoding | |
1168 | 3964 if (MPV_common_init(s) < 0) |
3965 return -1; | |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3966 s->first_field = 0; |
2967 | 3967 |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3968 init_scan_tables(h); |
1168 | 3969 alloc_tables(h); |
3970 | |
5642 | 3971 for(i = 1; i < s->avctx->thread_count; i++) { |
3972 H264Context *c; | |
3973 c = h->thread_context[i] = av_malloc(sizeof(H264Context)); | |
3974 memcpy(c, h, sizeof(MpegEncContext)); | |
3975 memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext)); | |
3976 c->sps = h->sps; | |
3977 c->pps = h->pps; | |
3978 init_scan_tables(c); | |
3979 clone_tables(c, h); | |
3980 } | |
3981 | |
3982 for(i = 0; i < s->avctx->thread_count; i++) | |
3983 if(context_init(h->thread_context[i]) < 0) | |
3984 return -1; | |
3985 | |
1168 | 3986 s->avctx->width = s->width; |
3987 s->avctx->height = s->height; | |
1548 | 3988 s->avctx->sample_aspect_ratio= h->sps.sar; |
2440 | 3989 if(!s->avctx->sample_aspect_ratio.den) |
3990 s->avctx->sample_aspect_ratio.den = 1; | |
2174
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
3991 |
2648 | 3992 if(h->sps.timing_info_present_flag){ |
3052 | 3993 s->avctx->time_base= (AVRational){h->sps.num_units_in_tick * 2, h->sps.time_scale}; |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3994 if(h->x264_build > 0 && h->x264_build < 44) |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3995 s->avctx->time_base.den *= 2; |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3996 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den, |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3997 s->avctx->time_base.num, s->avctx->time_base.den, 1<<30); |
2174
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
3998 } |
1168 | 3999 } |
4000 | |
4001 h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num); | |
4002 | |
3316 | 4003 h->mb_mbaff = 0; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
4004 h->mb_aff_frame = 0; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4005 last_pic_structure = s0->picture_structure; |
1168 | 4006 if(h->sps.frame_mbs_only_flag){ |
4007 s->picture_structure= PICT_FRAME; | |
4008 }else{ | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
4009 if(get_bits1(&s->gb)) { //field_pic_flag |
1168 | 4010 s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
4011 } else { |
1168 | 4012 s->picture_structure= PICT_FRAME; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
4013 h->mb_aff_frame = h->sps.mb_aff; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4014 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4015 } |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4016 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4017 if(h0->current_slice == 0){ |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4018 /* See if we have a decoded first field looking for a pair... */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4019 if (s0->first_field) { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4020 assert(s0->current_picture_ptr); |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4021 assert(s0->current_picture_ptr->data[0]); |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4022 assert(s0->current_picture_ptr->reference != DELAYED_PIC_REF); |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4023 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4024 /* figure out if we have a complementary field pair */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4025 if (!FIELD_PICTURE || s->picture_structure == last_pic_structure) { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4026 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4027 * Previous field is unmatched. Don't display it, but let it |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4028 * remain for reference if marked as such. |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4029 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4030 s0->current_picture_ptr = NULL; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4031 s0->first_field = FIELD_PICTURE; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4032 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4033 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4034 if (h->nal_ref_idc && |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4035 s0->current_picture_ptr->reference && |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4036 s0->current_picture_ptr->frame_num != h->frame_num) { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4037 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4038 * This and previous field were reference, but had |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4039 * different frame_nums. Consider this field first in |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4040 * pair. Throw away previous field except for reference |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4041 * purposes. |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4042 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4043 s0->first_field = 1; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4044 s0->current_picture_ptr = NULL; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4045 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4046 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4047 /* Second field in complementary pair */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4048 s0->first_field = 0; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4049 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4050 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4051 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4052 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4053 /* Frame or first field in a potentially complementary pair */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4054 assert(!s0->current_picture_ptr); |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4055 s0->first_field = FIELD_PICTURE; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4056 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4057 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4058 if((!FIELD_PICTURE || s0->first_field) && frame_start(h) < 0) { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4059 s0->first_field = 0; |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4060 return -1; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
4061 } |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4062 } |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4063 if(h != h0) |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4064 clone_slice(h, h0); |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4065 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4066 s->current_picture_ptr->frame_num= h->frame_num; //FIXME frame_num cleanup |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4067 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4068 assert(s->mb_num == s->mb_width * s->mb_height); |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
4069 if(first_mb_in_slice << FIELD_OR_MBAFF_PICTURE >= s->mb_num || |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4070 first_mb_in_slice >= s->mb_num){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4071 av_log(h->s.avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4072 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4073 } |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4074 s->resync_mb_x = s->mb_x = first_mb_in_slice % s->mb_width; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
4075 s->resync_mb_y = s->mb_y = (first_mb_in_slice / s->mb_width) << FIELD_OR_MBAFF_PICTURE; |
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
4076 if (s->picture_structure == PICT_BOTTOM_FIELD) |
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
4077 s->resync_mb_y = s->mb_y = s->mb_y + 1; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4078 assert(s->mb_y < s->mb_height); |
2967 | 4079 |
1168 | 4080 if(s->picture_structure==PICT_FRAME){ |
4081 h->curr_pic_num= h->frame_num; | |
4082 h->max_pic_num= 1<< h->sps.log2_max_frame_num; | |
4083 }else{ | |
5772
65b71bd21a4d
Fix h->curr_pic_num for field pictures. Necessary for proper PAFF support.
andoma
parents:
5771
diff
changeset
|
4084 h->curr_pic_num= 2*h->frame_num + 1; |
1168 | 4085 h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1); |
4086 } | |
2967 | 4087 |
1168 | 4088 if(h->nal_unit_type == NAL_IDR_SLICE){ |
1453 | 4089 get_ue_golomb(&s->gb); /* idr_pic_id */ |
1168 | 4090 } |
2967 | 4091 |
1168 | 4092 if(h->sps.poc_type==0){ |
4093 h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb); | |
2967 | 4094 |
1168 | 4095 if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){ |
4096 h->delta_poc_bottom= get_se_golomb(&s->gb); | |
4097 } | |
4098 } | |
2967 | 4099 |
1168 | 4100 if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){ |
4101 h->delta_poc[0]= get_se_golomb(&s->gb); | |
2967 | 4102 |
1168 | 4103 if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME) |
4104 h->delta_poc[1]= get_se_golomb(&s->gb); | |
4105 } | |
2967 | 4106 |
1168 | 4107 init_poc(h); |
2967 | 4108 |
1168 | 4109 if(h->pps.redundant_pic_cnt_present){ |
4110 h->redundant_pic_count= get_ue_golomb(&s->gb); | |
4111 } | |
4112 | |
4113 //set defaults, might be overriden a few line later | |
4114 h->ref_count[0]= h->pps.ref_count[0]; | |
4115 h->ref_count[1]= h->pps.ref_count[1]; | |
4116 | |
4117 if(h->slice_type == P_TYPE || h->slice_type == SP_TYPE || h->slice_type == B_TYPE){ | |
4118 if(h->slice_type == B_TYPE){ | |
4119 h->direct_spatial_mv_pred= get_bits1(&s->gb); | |
5812
05e66f9c15bb
Interlaced pictures (not just MBAFF) + spatial direct mode is not
cehoyos
parents:
5806
diff
changeset
|
4120 if(FIELD_OR_MBAFF_PICTURE && h->direct_spatial_mv_pred) |
05e66f9c15bb
Interlaced pictures (not just MBAFF) + spatial direct mode is not
cehoyos
parents:
5806
diff
changeset
|
4121 av_log(h->s.avctx, AV_LOG_ERROR, "Interlaced pictures + spatial direct mode is not implemented\n"); |
1168 | 4122 } |
4123 num_ref_idx_active_override_flag= get_bits1(&s->gb); | |
2967 | 4124 |
1168 | 4125 if(num_ref_idx_active_override_flag){ |
4126 h->ref_count[0]= get_ue_golomb(&s->gb) + 1; | |
4127 if(h->slice_type==B_TYPE) | |
4128 h->ref_count[1]= get_ue_golomb(&s->gb) + 1; | |
4129 | |
4532 | 4130 if(h->ref_count[0]-1 > 32-1 || h->ref_count[1]-1 > 32-1){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
4131 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n"); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4132 h->ref_count[0]= h->ref_count[1]= 1; |
1168 | 4133 return -1; |
4134 } | |
4135 } | |
4532 | 4136 if(h->slice_type == B_TYPE) |
4137 h->list_count= 2; | |
4138 else | |
4139 h->list_count= 1; | |
4140 }else | |
4141 h->list_count= 0; | |
1168 | 4142 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4143 if(!default_ref_list_done){ |
1168 | 4144 fill_default_ref_list(h); |
4145 } | |
4146 | |
2766
0609f405e000
make decoder a little bit more tolerant to missing NAL units
michael
parents:
2763
diff
changeset
|
4147 if(decode_ref_pic_list_reordering(h) < 0) |
0609f405e000
make decoder a little bit more tolerant to missing NAL units
michael
parents:
2763
diff
changeset
|
4148 return -1; |
1168 | 4149 |
2967 | 4150 if( (h->pps.weighted_pred && (h->slice_type == P_TYPE || h->slice_type == SP_TYPE )) |
1168 | 4151 || (h->pps.weighted_bipred_idc==1 && h->slice_type==B_TYPE ) ) |
4152 pred_weight_table(h); | |
2415 | 4153 else if(h->pps.weighted_bipred_idc==2 && h->slice_type==B_TYPE) |
4154 implicit_weight_table(h); | |
4155 else | |
4156 h->use_weight = 0; | |
2967 | 4157 |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
4158 if(h->nal_ref_idc) |
5642 | 4159 decode_ref_pic_marking(h0, &s->gb); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4160 |
3316 | 4161 if(FRAME_MBAFF) |
4162 fill_mbaff_ref_list(h); | |
4163 | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4164 if( h->slice_type != I_TYPE && h->slice_type != SI_TYPE && h->pps.cabac ){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4165 tmp = get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4166 if(tmp > 2){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4167 av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4168 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4169 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4170 h->cabac_init_idc= tmp; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4171 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4172 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4173 h->last_qscale_diff = 0; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4174 tmp = h->pps.init_qp + get_se_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4175 if(tmp>51){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4176 av_log(s->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp); |
1898 | 4177 return -1; |
4178 } | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4179 s->qscale= tmp; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4180 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4181 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
1168 | 4182 //FIXME qscale / qp ... stuff |
4183 if(h->slice_type == SP_TYPE){ | |
1453 | 4184 get_bits1(&s->gb); /* sp_for_switch_flag */ |
1168 | 4185 } |
4186 if(h->slice_type==SP_TYPE || h->slice_type == SI_TYPE){ | |
1453 | 4187 get_se_golomb(&s->gb); /* slice_qs_delta */ |
1168 | 4188 } |
4189 | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4190 h->deblocking_filter = 1; |
1898 | 4191 h->slice_alpha_c0_offset = 0; |
4192 h->slice_beta_offset = 0; | |
1168 | 4193 if( h->pps.deblocking_filter_parameters_present ) { |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4194 tmp= get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4195 if(tmp > 2){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4196 av_log(s->avctx, AV_LOG_ERROR, "deblocking_filter_idc %u out of range\n", tmp); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4197 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4198 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4199 h->deblocking_filter= tmp; |
2967 | 4200 if(h->deblocking_filter < 2) |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4201 h->deblocking_filter^= 1; // 1<->0 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4202 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4203 if( h->deblocking_filter ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
4204 h->slice_alpha_c0_offset = get_se_golomb(&s->gb) << 1; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
4205 h->slice_beta_offset = get_se_golomb(&s->gb) << 1; |
1168 | 4206 } |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
4207 } |
5642 | 4208 |
5698
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
4209 if( s->avctx->skip_loop_filter >= AVDISCARD_ALL |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
4210 ||(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY && h->slice_type != I_TYPE) |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
4211 ||(s->avctx->skip_loop_filter >= AVDISCARD_BIDIR && h->slice_type == B_TYPE) |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
4212 ||(s->avctx->skip_loop_filter >= AVDISCARD_NONREF && h->nal_ref_idc == 0)) |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
4213 h->deblocking_filter= 0; |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
4214 |
5642 | 4215 if(h->deblocking_filter == 1 && h0->max_contexts > 1) { |
5646 | 4216 if(s->avctx->flags2 & CODEC_FLAG2_FAST) { |
4217 /* Cheat slightly for speed: | |
4218 Dont bother to deblock across slices */ | |
4219 h->deblocking_filter = 2; | |
4220 } else { | |
5647 | 4221 h0->max_contexts = 1; |
4222 if(!h0->single_decode_warning) { | |
4223 av_log(s->avctx, AV_LOG_INFO, "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n"); | |
4224 h0->single_decode_warning = 1; | |
4225 } | |
4226 if(h != h0) | |
4227 return 1; // deblocking switched inside frame | |
5646 | 4228 } |
5642 | 4229 } |
4230 | |
1168 | 4231 #if 0 //FMO |
4232 if( h->pps.num_slice_groups > 1 && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5) | |
4233 slice_group_change_cycle= get_bits(&s->gb, ?); | |
4234 #endif | |
4235 | |
5642 | 4236 h0->last_slice_type = slice_type; |
4237 h->slice_num = ++h0->current_slice; | |
2392 | 4238 |
3316 | 4239 h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; |
5783
4b5dc5ad7410
Edge emulation for fields. Part of PAFF implementation
andoma
parents:
5782
diff
changeset
|
4240 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; |
3316 | 4241 |
1168 | 4242 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
4243 av_log(h->s.avctx, AV_LOG_DEBUG, "slice:%d %s mb:%d %c pps:%u frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d:%d:%d weight:%d%s\n", |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4244 h->slice_num, |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4245 (s->picture_structure==PICT_FRAME ? "F" : s->picture_structure==PICT_TOP_FIELD ? "T" : "B"), |
2967 | 4246 first_mb_in_slice, |
1264 | 4247 av_get_pict_type_char(h->slice_type), |
1168 | 4248 pps_id, h->frame_num, |
4249 s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1], | |
4250 h->ref_count[0], h->ref_count[1], | |
4251 s->qscale, | |
2583 | 4252 h->deblocking_filter, h->slice_alpha_c0_offset/2, h->slice_beta_offset/2, |
2415 | 4253 h->use_weight, |
4254 h->use_weight==1 && h->use_weight_chroma ? "c" : "" | |
1168 | 4255 ); |
4256 } | |
4257 | |
4258 return 0; | |
4259 } | |
4260 | |
4261 /** | |
4262 * | |
4263 */ | |
4264 static inline int get_level_prefix(GetBitContext *gb){ | |
4265 unsigned int buf; | |
4266 int log; | |
2967 | 4267 |
1168 | 4268 OPEN_READER(re, gb); |
4269 UPDATE_CACHE(re, gb); | |
4270 buf=GET_CACHE(re, gb); | |
2967 | 4271 |
1168 | 4272 log= 32 - av_log2(buf); |
4273 #ifdef TRACE | |
4274 print_bin(buf>>(32-log), log); | |
2272
cd43603c46f9
move h264 idct to its own file and call via function pointer in DspContext
michael
parents:
2255
diff
changeset
|
4275 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d lpr @%5d in %s get_level_prefix\n", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__); |
1168 | 4276 #endif |
4277 | |
4278 LAST_SKIP_BITS(re, gb, log); | |
4279 CLOSE_READER(re, gb); | |
4280 | |
4281 return log-1; | |
4282 } | |
4283 | |
2755 | 4284 static inline int get_dct8x8_allowed(H264Context *h){ |
4285 int i; | |
4286 for(i=0; i<4; i++){ | |
4287 if(!IS_SUB_8X8(h->sub_mb_type[i]) | |
2781
899a2ea0907c
parenthesing to avoid compiler errors in the future - compared asm outputs, behaviour didnt changed
alex
parents:
2774
diff
changeset
|
4288 || (!h->sps.direct_8x8_inference_flag && IS_DIRECT(h->sub_mb_type[i]))) |
2755 | 4289 return 0; |
4290 } | |
4291 return 1; | |
4292 } | |
4293 | |
1168 | 4294 /** |
4295 * decodes a residual block. | |
4296 * @param n block index | |
4297 * @param scantable scantable | |
4298 * @param max_coeff number of coefficients in the block | |
4299 * @return <0 if an error occured | |
4300 */ | |
2919 | 4301 static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){ |
1168 | 4302 MpegEncContext * const s = &h->s; |
4303 static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}; | |
2897 | 4304 int level[16]; |
4305 int zeros_left, coeff_num, coeff_token, total_coeff, i, j, trailing_ones, run_before; | |
1168 | 4306 |
4307 //FIXME put trailing_onex into the context | |
4308 | |
4309 if(n == CHROMA_DC_BLOCK_INDEX){ | |
4310 coeff_token= get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1); | |
4311 total_coeff= coeff_token>>2; | |
2967 | 4312 }else{ |
1168 | 4313 if(n == LUMA_DC_BLOCK_INDEX){ |
4314 total_coeff= pred_non_zero_count(h, 0); | |
4315 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2); | |
4316 total_coeff= coeff_token>>2; | |
4317 }else{ | |
4318 total_coeff= pred_non_zero_count(h, n); | |
4319 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2); | |
4320 total_coeff= coeff_token>>2; | |
4321 h->non_zero_count_cache[ scan8[n] ]= total_coeff; | |
4322 } | |
4323 } | |
4324 | |
4325 //FIXME set last_non_zero? | |
4326 | |
4327 if(total_coeff==0) | |
4328 return 0; | |
4391
20944c70a3c0
fix segfault with darkkben.free.fr/corrupted_h264.mp4
michael
parents:
4390
diff
changeset
|
4329 if(total_coeff > (unsigned)max_coeff) { |
20944c70a3c0
fix segfault with darkkben.free.fr/corrupted_h264.mp4
michael
parents:
4390
diff
changeset
|
4330 av_log(h->s.avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", s->mb_x, s->mb_y, total_coeff); |
4270 | 4331 return -1; |
4332 } | |
2967 | 4333 |
1168 | 4334 trailing_ones= coeff_token&3; |
4600 | 4335 tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff); |
1168 | 4336 assert(total_coeff<=16); |
2967 | 4337 |
1168 | 4338 for(i=0; i<trailing_ones; i++){ |
4339 level[i]= 1 - 2*get_bits1(gb); | |
4340 } | |
4341 | |
2897 | 4342 if(i<total_coeff) { |
1168 | 4343 int level_code, mask; |
2897 | 4344 int suffix_length = total_coeff > 10 && trailing_ones < 3; |
4345 int prefix= get_level_prefix(gb); | |
4346 | |
4347 //first coefficient has suffix_length equal to 0 or 1 | |
1168 | 4348 if(prefix<14){ //FIXME try to build a large unified VLC table for all this |
4349 if(suffix_length) | |
4350 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part | |
4351 else | |
4352 level_code= (prefix<<suffix_length); //part | |
4353 }else if(prefix==14){ | |
4354 if(suffix_length) | |
4355 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part | |
4356 else | |
4357 level_code= prefix + get_bits(gb, 4); //part | |
4358 }else if(prefix==15){ | |
4359 level_code= (prefix<<suffix_length) + get_bits(gb, 12); //part | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4360 if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense |
1168 | 4361 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
4362 av_log(h->s.avctx, AV_LOG_ERROR, "prefix too large at %d %d\n", s->mb_x, s->mb_y); |
1168 | 4363 return -1; |
4364 } | |
4365 | |
2897 | 4366 if(trailing_ones < 3) level_code += 2; |
4367 | |
4368 suffix_length = 1; | |
4369 if(level_code > 5) | |
4370 suffix_length++; | |
1168 | 4371 mask= -(level_code&1); |
4372 level[i]= (((2+level_code)>>1) ^ mask) - mask; | |
2897 | 4373 i++; |
4374 | |
4375 //remaining coefficients have suffix_length > 0 | |
4376 for(;i<total_coeff;i++) { | |
4377 static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX }; | |
4378 prefix = get_level_prefix(gb); | |
4379 if(prefix<15){ | |
4380 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length); | |
4381 }else if(prefix==15){ | |
4382 level_code = (prefix<<suffix_length) + get_bits(gb, 12); | |
4383 }else{ | |
4384 av_log(h->s.avctx, AV_LOG_ERROR, "prefix too large at %d %d\n", s->mb_x, s->mb_y); | |
4385 return -1; | |
4386 } | |
4387 mask= -(level_code&1); | |
4388 level[i]= (((2+level_code)>>1) ^ mask) - mask; | |
4389 if(level_code > suffix_limit[suffix_length]) | |
4390 suffix_length++; | |
4391 } | |
1168 | 4392 } |
4393 | |
4394 if(total_coeff == max_coeff) | |
4395 zeros_left=0; | |
4396 else{ | |
4397 if(n == CHROMA_DC_BLOCK_INDEX) | |
4398 zeros_left= get_vlc2(gb, chroma_dc_total_zeros_vlc[ total_coeff-1 ].table, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1); | |
4399 else | |
4400 zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff-1 ].table, TOTAL_ZEROS_VLC_BITS, 1); | |
4401 } | |
2897 | 4402 |
4403 coeff_num = zeros_left + total_coeff - 1; | |
4404 j = scantable[coeff_num]; | |
4405 if(n > 24){ | |
4406 block[j] = level[0]; | |
4407 for(i=1;i<total_coeff;i++) { | |
4408 if(zeros_left <= 0) | |
4409 run_before = 0; | |
4410 else if(zeros_left < 7){ | |
4411 run_before= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1); | |
4412 }else{ | |
4413 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); | |
4414 } | |
4415 zeros_left -= run_before; | |
4416 coeff_num -= 1 + run_before; | |
4417 j= scantable[ coeff_num ]; | |
4418 | |
4419 block[j]= level[i]; | |
4420 } | |
4421 }else{ | |
2919 | 4422 block[j] = (level[0] * qmul[j] + 32)>>6; |
2897 | 4423 for(i=1;i<total_coeff;i++) { |
4424 if(zeros_left <= 0) | |
4425 run_before = 0; | |
4426 else if(zeros_left < 7){ | |
4427 run_before= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1); | |
4428 }else{ | |
4429 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); | |
4430 } | |
4431 zeros_left -= run_before; | |
4432 coeff_num -= 1 + run_before; | |
4433 j= scantable[ coeff_num ]; | |
4434 | |
2919 | 4435 block[j]= (level[i] * qmul[j] + 32)>>6; |
2897 | 4436 } |
1168 | 4437 } |
4438 | |
4439 if(zeros_left<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
4440 av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y); |
1168 | 4441 return -1; |
4442 } | |
2897 | 4443 |
1168 | 4444 return 0; |
4445 } | |
4446 | |
3316 | 4447 static void predict_field_decoding_flag(H264Context *h){ |
4448 MpegEncContext * const s = &h->s; | |
4449 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; | |
4450 int mb_type = (h->slice_table[mb_xy-1] == h->slice_num) | |
4451 ? s->current_picture.mb_type[mb_xy-1] | |
4452 : (h->slice_table[mb_xy-s->mb_stride] == h->slice_num) | |
4453 ? s->current_picture.mb_type[mb_xy-s->mb_stride] | |
4454 : 0; | |
4455 h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0; | |
4456 } | |
4457 | |
1168 | 4458 /** |
2396 | 4459 * decodes a P_SKIP or B_SKIP macroblock |
4460 */ | |
4461 static void decode_mb_skip(H264Context *h){ | |
4462 MpegEncContext * const s = &h->s; | |
4463 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; | |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4464 int mb_type=0; |
2967 | 4465 |
2396 | 4466 memset(h->non_zero_count[mb_xy], 0, 16); |
4467 memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui | |
4468 | |
3316 | 4469 if(MB_FIELD) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
4470 mb_type|= MB_TYPE_INTERLACED; |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4471 |
2396 | 4472 if( h->slice_type == B_TYPE ) |
4473 { | |
4474 // just for fill_caches. pred_direct_motion will set the real mb_type | |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4475 mb_type|= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2|MB_TYPE_SKIP; |
2396 | 4476 |
2449 | 4477 fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ... |
2396 | 4478 pred_direct_motion(h, &mb_type); |
3927 | 4479 mb_type|= MB_TYPE_SKIP; |
2396 | 4480 } |
4481 else | |
4482 { | |
4483 int mx, my; | |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4484 mb_type|= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_SKIP; |
2396 | 4485 |
2449 | 4486 fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ... |
2396 | 4487 pred_pskip_motion(h, &mx, &my); |
4488 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1); | |
4489 fill_rectangle( h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4); | |
4490 } | |
4491 | |
4492 write_back_motion(h, mb_type); | |
3927 | 4493 s->current_picture.mb_type[mb_xy]= mb_type; |
2396 | 4494 s->current_picture.qscale_table[mb_xy]= s->qscale; |
4495 h->slice_table[ mb_xy ]= h->slice_num; | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
4496 h->prev_mb_skipped= 1; |
2396 | 4497 } |
4498 | |
4499 /** | |
1168 | 4500 * decodes a macroblock |
4501 * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed | |
4502 */ | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4503 static int decode_mb_cavlc(H264Context *h){ |
1168 | 4504 MpegEncContext * const s = &h->s; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
4505 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4506 int partition_count; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4507 unsigned int mb_type, cbp; |
2755 | 4508 int dct8x8_allowed= h->pps.transform_8x8_mode; |
1168 | 4509 |
2967 | 4510 s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong? |
1168 | 4511 |
4600 | 4512 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); |
1453 | 4513 cbp = 0; /* avoid warning. FIXME: find a solution without slowing |
4514 down the code */ | |
1168 | 4515 if(h->slice_type != I_TYPE && h->slice_type != SI_TYPE){ |
4516 if(s->mb_skip_run==-1) | |
4517 s->mb_skip_run= get_ue_golomb(&s->gb); | |
2967 | 4518 |
1168 | 4519 if (s->mb_skip_run--) { |
3316 | 4520 if(FRAME_MBAFF && (s->mb_y&1) == 0){ |
4521 if(s->mb_skip_run==0) | |
4522 h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb); | |
4523 else | |
4524 predict_field_decoding_flag(h); | |
4525 } | |
2396 | 4526 decode_mb_skip(h); |
1168 | 4527 return 0; |
4528 } | |
4529 } | |
3316 | 4530 if(FRAME_MBAFF){ |
4531 if( (s->mb_y&1) == 0 ) | |
4532 h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb); | |
1168 | 4533 }else |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4534 h->mb_field_decoding_flag= (s->picture_structure!=PICT_FRAME); |
2967 | 4535 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
4536 h->prev_mb_skipped= 0; |
2967 | 4537 |
1168 | 4538 mb_type= get_ue_golomb(&s->gb); |
4539 if(h->slice_type == B_TYPE){ | |
4540 if(mb_type < 23){ | |
4541 partition_count= b_mb_type_info[mb_type].partition_count; | |
4542 mb_type= b_mb_type_info[mb_type].type; | |
4543 }else{ | |
4544 mb_type -= 23; | |
4545 goto decode_intra_mb; | |
4546 } | |
4547 }else if(h->slice_type == P_TYPE /*|| h->slice_type == SP_TYPE */){ | |
4548 if(mb_type < 5){ | |
4549 partition_count= p_mb_type_info[mb_type].partition_count; | |
4550 mb_type= p_mb_type_info[mb_type].type; | |
4551 }else{ | |
4552 mb_type -= 5; | |
4553 goto decode_intra_mb; | |
4554 } | |
4555 }else{ | |
4556 assert(h->slice_type == I_TYPE); | |
4557 decode_intra_mb: | |
4558 if(mb_type > 25){ | |
3954 | 4559 av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_pict_type_char(h->slice_type), s->mb_x, s->mb_y); |
1168 | 4560 return -1; |
4561 } | |
4562 partition_count=0; | |
4563 cbp= i_mb_type_info[mb_type].cbp; | |
4564 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode; | |
4565 mb_type= i_mb_type_info[mb_type].type; | |
4566 } | |
4567 | |
3316 | 4568 if(MB_FIELD) |
1168 | 4569 mb_type |= MB_TYPE_INTERLACED; |
4570 | |
4571 h->slice_table[ mb_xy ]= h->slice_num; | |
2967 | 4572 |
1168 | 4573 if(IS_INTRA_PCM(mb_type)){ |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4574 unsigned int x, y; |
2967 | 4575 |
5127 | 4576 // We assume these blocks are very rare so we do not optimize it. |
1168 | 4577 align_get_bits(&s->gb); |
2967 | 4578 |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4579 // The pixels are stored in the same order as levels in h->mb array. |
1168 | 4580 for(y=0; y<16; y++){ |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4581 const int index= 4*(y&3) + 32*((y>>2)&1) + 128*(y>>3); |
1168 | 4582 for(x=0; x<16; x++){ |
4600 | 4583 tprintf(s->avctx, "LUMA ICPM LEVEL (%3d)\n", show_bits(&s->gb, 8)); |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4584 h->mb[index + (x&3) + 16*((x>>2)&1) + 64*(x>>3)]= get_bits(&s->gb, 8); |
1168 | 4585 } |
4586 } | |
4587 for(y=0; y<8; y++){ | |
4588 const int index= 256 + 4*(y&3) + 32*(y>>2); | |
4589 for(x=0; x<8; x++){ | |
4600 | 4590 tprintf(s->avctx, "CHROMA U ICPM LEVEL (%3d)\n", show_bits(&s->gb, 8)); |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4591 h->mb[index + (x&3) + 16*(x>>2)]= get_bits(&s->gb, 8); |
1168 | 4592 } |
4593 } | |
4594 for(y=0; y<8; y++){ | |
4595 const int index= 256 + 64 + 4*(y&3) + 32*(y>>2); | |
4596 for(x=0; x<8; x++){ | |
4600 | 4597 tprintf(s->avctx, "CHROMA V ICPM LEVEL (%3d)\n", show_bits(&s->gb, 8)); |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4598 h->mb[index + (x&3) + 16*(x>>2)]= get_bits(&s->gb, 8); |
1168 | 4599 } |
4600 } | |
2967 | 4601 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4602 // In deblocking, the quantizer is 0 |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4603 s->current_picture.qscale_table[mb_xy]= 0; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4604 h->chroma_qp[0] = get_chroma_qp(h, 0, 0); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4605 h->chroma_qp[1] = get_chroma_qp(h, 1, 0); |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4606 // All coeffs are present |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4607 memset(h->non_zero_count[mb_xy], 16, 16); |
2967 | 4608 |
2755 | 4609 s->current_picture.mb_type[mb_xy]= mb_type; |
1168 | 4610 return 0; |
4611 } | |
2967 | 4612 |
3316 | 4613 if(MB_MBAFF){ |
4614 h->ref_count[0] <<= 1; | |
4615 h->ref_count[1] <<= 1; | |
4616 } | |
4617 | |
2449 | 4618 fill_caches(h, mb_type, 0); |
1168 | 4619 |
4620 //mb_pred | |
4621 if(IS_INTRA(mb_type)){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4622 int pred_mode; |
1168 | 4623 // init_top_left_availability(h); |
4624 if(IS_INTRA4x4(mb_type)){ | |
4625 int i; | |
2755 | 4626 int di = 1; |
4627 if(dct8x8_allowed && get_bits1(&s->gb)){ | |
4628 mb_type |= MB_TYPE_8x8DCT; | |
4629 di = 4; | |
4630 } | |
1168 | 4631 |
4632 // fill_intra4x4_pred_table(h); | |
2755 | 4633 for(i=0; i<16; i+=di){ |
3409 | 4634 int mode= pred_intra_mode(h, i); |
4635 | |
4636 if(!get_bits1(&s->gb)){ | |
1168 | 4637 const int rem_mode= get_bits(&s->gb, 3); |
3409 | 4638 mode = rem_mode + (rem_mode >= mode); |
1168 | 4639 } |
2967 | 4640 |
2755 | 4641 if(di==4) |
4642 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 ); | |
4643 else | |
4644 h->intra4x4_pred_mode_cache[ scan8[i] ] = mode; | |
1168 | 4645 } |
4646 write_back_intra_pred_mode(h); | |
4647 if( check_intra4x4_pred_mode(h) < 0) | |
4648 return -1; | |
4649 }else{ | |
4650 h->intra16x16_pred_mode= check_intra_pred_mode(h, h->intra16x16_pred_mode); | |
4651 if(h->intra16x16_pred_mode < 0) | |
4652 return -1; | |
4653 } | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4654 |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4655 pred_mode= check_intra_pred_mode(h, get_ue_golomb(&s->gb)); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4656 if(pred_mode < 0) |
1168 | 4657 return -1; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4658 h->chroma_pred_mode= pred_mode; |
1168 | 4659 }else if(partition_count==4){ |
4660 int i, j, sub_partition_count[4], list, ref[2][4]; | |
2967 | 4661 |
1168 | 4662 if(h->slice_type == B_TYPE){ |
4663 for(i=0; i<4; i++){ | |
4664 h->sub_mb_type[i]= get_ue_golomb(&s->gb); | |
4665 if(h->sub_mb_type[i] >=13){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4666 av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y); |
1168 | 4667 return -1; |
4668 } | |
4669 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; | |
4670 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; | |
4671 } | |
2396 | 4672 if( IS_DIRECT(h->sub_mb_type[0]) || IS_DIRECT(h->sub_mb_type[1]) |
3003 | 4673 || IS_DIRECT(h->sub_mb_type[2]) || IS_DIRECT(h->sub_mb_type[3])) { |
2396 | 4674 pred_direct_motion(h, &mb_type); |
3003 | 4675 h->ref_cache[0][scan8[4]] = |
4676 h->ref_cache[1][scan8[4]] = | |
4677 h->ref_cache[0][scan8[12]] = | |
4678 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; | |
4679 } | |
1168 | 4680 }else{ |
4681 assert(h->slice_type == P_TYPE || h->slice_type == SP_TYPE); //FIXME SP correct ? | |
4682 for(i=0; i<4; i++){ | |
4683 h->sub_mb_type[i]= get_ue_golomb(&s->gb); | |
4684 if(h->sub_mb_type[i] >=4){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4685 av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y); |
1168 | 4686 return -1; |
4687 } | |
4688 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; | |
4689 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type; | |
4690 } | |
4691 } | |
2967 | 4692 |
4533 | 4693 for(list=0; list<h->list_count; list++){ |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4694 int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list]; |
1168 | 4695 for(i=0; i<4; i++){ |
2396 | 4696 if(IS_DIRECT(h->sub_mb_type[i])) continue; |
4697 if(IS_DIR(h->sub_mb_type[i], 0, list)){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4698 unsigned int tmp = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip? |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4699 if(tmp>=ref_count){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4700 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4701 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4702 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4703 ref[list][i]= tmp; |
1168 | 4704 }else{ |
4705 //FIXME | |
4706 ref[list][i] = -1; | |
4707 } | |
4708 } | |
4709 } | |
2967 | 4710 |
2755 | 4711 if(dct8x8_allowed) |
4712 dct8x8_allowed = get_dct8x8_allowed(h); | |
2967 | 4713 |
4533 | 4714 for(list=0; list<h->list_count; list++){ |
1168 | 4715 for(i=0; i<4; i++){ |
3003 | 4716 if(IS_DIRECT(h->sub_mb_type[i])) { |
4717 h->ref_cache[list][ scan8[4*i] ] = h->ref_cache[list][ scan8[4*i]+1 ]; | |
4718 continue; | |
4719 } | |
1168 | 4720 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ]= |
4721 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i]; | |
4722 | |
2396 | 4723 if(IS_DIR(h->sub_mb_type[i], 0, list)){ |
1168 | 4724 const int sub_mb_type= h->sub_mb_type[i]; |
4725 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1; | |
4726 for(j=0; j<sub_partition_count[i]; j++){ | |
4727 int mx, my; | |
4728 const int index= 4*i + block_width*j; | |
4729 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ]; | |
4730 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my); | |
4731 mx += get_se_golomb(&s->gb); | |
4732 my += get_se_golomb(&s->gb); | |
4600 | 4733 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4734 |
1168 | 4735 if(IS_SUB_8X8(sub_mb_type)){ |
4530 | 4736 mv_cache[ 1 ][0]= |
1168 | 4737 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx; |
4530 | 4738 mv_cache[ 1 ][1]= |
1168 | 4739 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my; |
4740 }else if(IS_SUB_8X4(sub_mb_type)){ | |
4530 | 4741 mv_cache[ 1 ][0]= mx; |
4742 mv_cache[ 1 ][1]= my; | |
1168 | 4743 }else if(IS_SUB_4X8(sub_mb_type)){ |
4530 | 4744 mv_cache[ 8 ][0]= mx; |
4745 mv_cache[ 8 ][1]= my; | |
1168 | 4746 } |
4530 | 4747 mv_cache[ 0 ][0]= mx; |
4748 mv_cache[ 0 ][1]= my; | |
1168 | 4749 } |
4750 }else{ | |
4751 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0]; | |
4752 p[0] = p[1]= | |
4753 p[8] = p[9]= 0; | |
4754 } | |
4755 } | |
4756 } | |
2396 | 4757 }else if(IS_DIRECT(mb_type)){ |
4758 pred_direct_motion(h, &mb_type); | |
2755 | 4759 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; |
2396 | 4760 }else{ |
1168 | 4761 int list, mx, my, i; |
4762 //FIXME we should set ref_idx_l? to 0 if we use that later ... | |
4763 if(IS_16X16(mb_type)){ | |
4534 | 4764 for(list=0; list<h->list_count; list++){ |
4765 unsigned int val; | |
1168 | 4766 if(IS_DIR(mb_type, 0, list)){ |
4534 | 4767 val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4768 if(val >= h->ref_count[list]){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4769 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4770 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4771 } |
2523 | 4772 }else |
4534 | 4773 val= LIST_NOT_USED&0xFF; |
4774 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1); | |
4775 } | |
4776 for(list=0; list<h->list_count; list++){ | |
4777 unsigned int val; | |
1168 | 4778 if(IS_DIR(mb_type, 0, list)){ |
4779 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); | |
4780 mx += get_se_golomb(&s->gb); | |
4781 my += get_se_golomb(&s->gb); | |
4600 | 4782 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4783 |
4534 | 4784 val= pack16to32(mx,my); |
2523 | 4785 }else |
4534 | 4786 val=0; |
4787 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, val, 4); | |
1168 | 4788 } |
4789 } | |
4790 else if(IS_16X8(mb_type)){ | |
4534 | 4791 for(list=0; list<h->list_count; list++){ |
1168 | 4792 for(i=0; i<2; i++){ |
4534 | 4793 unsigned int val; |
1168 | 4794 if(IS_DIR(mb_type, i, list)){ |
4534 | 4795 val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4796 if(val >= h->ref_count[list]){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4797 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4798 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4799 } |
2523 | 4800 }else |
4534 | 4801 val= LIST_NOT_USED&0xFF; |
4802 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1); | |
1168 | 4803 } |
4534 | 4804 } |
4805 for(list=0; list<h->list_count; list++){ | |
1168 | 4806 for(i=0; i<2; i++){ |
4534 | 4807 unsigned int val; |
1168 | 4808 if(IS_DIR(mb_type, i, list)){ |
4809 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my); | |
4810 mx += get_se_golomb(&s->gb); | |
4811 my += get_se_golomb(&s->gb); | |
4600 | 4812 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4813 |
4534 | 4814 val= pack16to32(mx,my); |
2396 | 4815 }else |
4534 | 4816 val=0; |
4817 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4); | |
1168 | 4818 } |
4819 } | |
4820 }else{ | |
4821 assert(IS_8X16(mb_type)); | |
4534 | 4822 for(list=0; list<h->list_count; list++){ |
1168 | 4823 for(i=0; i<2; i++){ |
4534 | 4824 unsigned int val; |
1168 | 4825 if(IS_DIR(mb_type, i, list)){ //FIXME optimize |
4534 | 4826 val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4827 if(val >= h->ref_count[list]){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4828 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4829 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4830 } |
2523 | 4831 }else |
4534 | 4832 val= LIST_NOT_USED&0xFF; |
4833 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1); | |
1168 | 4834 } |
4534 | 4835 } |
4836 for(list=0; list<h->list_count; list++){ | |
1168 | 4837 for(i=0; i<2; i++){ |
4534 | 4838 unsigned int val; |
1168 | 4839 if(IS_DIR(mb_type, i, list)){ |
4840 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my); | |
4841 mx += get_se_golomb(&s->gb); | |
4842 my += get_se_golomb(&s->gb); | |
4600 | 4843 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4844 |
4534 | 4845 val= pack16to32(mx,my); |
2396 | 4846 }else |
4534 | 4847 val=0; |
4848 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4); | |
1168 | 4849 } |
4850 } | |
4851 } | |
4852 } | |
2967 | 4853 |
1168 | 4854 if(IS_INTER(mb_type)) |
4855 write_back_motion(h, mb_type); | |
2967 | 4856 |
1168 | 4857 if(!IS_INTRA16x16(mb_type)){ |
4858 cbp= get_ue_golomb(&s->gb); | |
4859 if(cbp > 47){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4860 av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y); |
1168 | 4861 return -1; |
4862 } | |
2967 | 4863 |
1168 | 4864 if(IS_INTRA4x4(mb_type)) |
4865 cbp= golomb_to_intra4x4_cbp[cbp]; | |
4866 else | |
4867 cbp= golomb_to_inter_cbp[cbp]; | |
4868 } | |
3651 | 4869 h->cbp = cbp; |
1168 | 4870 |
2755 | 4871 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){ |
4872 if(get_bits1(&s->gb)) | |
4873 mb_type |= MB_TYPE_8x8DCT; | |
4874 } | |
4875 s->current_picture.mb_type[mb_xy]= mb_type; | |
4876 | |
1168 | 4877 if(cbp || IS_INTRA16x16(mb_type)){ |
4878 int i8x8, i4x4, chroma_idx; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4879 int dquant; |
1168 | 4880 GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr; |
3174 | 4881 const uint8_t *scan, *scan8x8, *dc_scan; |
2967 | 4882 |
1168 | 4883 // fill_non_zero_count_cache(h); |
4884 | |
4885 if(IS_INTERLACED(mb_type)){ | |
3316 | 4886 scan8x8= s->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0; |
2763 | 4887 scan= s->qscale ? h->field_scan : h->field_scan_q0; |
1168 | 4888 dc_scan= luma_dc_field_scan; |
4889 }else{ | |
3316 | 4890 scan8x8= s->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0; |
2763 | 4891 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; |
1168 | 4892 dc_scan= luma_dc_zigzag_scan; |
4893 } | |
4894 | |
4895 dquant= get_se_golomb(&s->gb); | |
4896 | |
4897 if( dquant > 25 || dquant < -26 ){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
4898 av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y); |
1168 | 4899 return -1; |
4900 } | |
2967 | 4901 |
1168 | 4902 s->qscale += dquant; |
4903 if(((unsigned)s->qscale) > 51){ | |
4904 if(s->qscale<0) s->qscale+= 52; | |
4905 else s->qscale-= 52; | |
4906 } | |
2967 | 4907 |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4908 h->chroma_qp[0]= get_chroma_qp(h, 0, s->qscale); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4909 h->chroma_qp[1]= get_chroma_qp(h, 1, s->qscale); |
1168 | 4910 if(IS_INTRA16x16(mb_type)){ |
2919 | 4911 if( decode_residual(h, h->intra_gb_ptr, h->mb, LUMA_DC_BLOCK_INDEX, dc_scan, h->dequant4_coeff[0][s->qscale], 16) < 0){ |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4912 return -1; //FIXME continue if partitioned and other return -1 too |
1168 | 4913 } |
4914 | |
4915 assert((cbp&15) == 0 || (cbp&15) == 15); | |
4916 | |
4917 if(cbp&15){ | |
4918 for(i8x8=0; i8x8<4; i8x8++){ | |
4919 for(i4x4=0; i4x4<4; i4x4++){ | |
4920 const int index= i4x4 + 4*i8x8; | |
2919 | 4921 if( decode_residual(h, h->intra_gb_ptr, h->mb + 16*index, index, scan + 1, h->dequant4_coeff[0][s->qscale], 15) < 0 ){ |
1168 | 4922 return -1; |
4923 } | |
4924 } | |
4925 } | |
4926 }else{ | |
1636 | 4927 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1); |
1168 | 4928 } |
4929 }else{ | |
4930 for(i8x8=0; i8x8<4; i8x8++){ | |
4931 if(cbp & (1<<i8x8)){ | |
2755 | 4932 if(IS_8x8DCT(mb_type)){ |
4933 DCTELEM *buf = &h->mb[64*i8x8]; | |
2757 | 4934 uint8_t *nnz; |
2755 | 4935 for(i4x4=0; i4x4<4; i4x4++){ |
3174 | 4936 if( decode_residual(h, gb, buf, i4x4+4*i8x8, scan8x8+16*i4x4, |
2919 | 4937 h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 16) <0 ) |
2755 | 4938 return -1; |
4939 } | |
2757 | 4940 nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ]; |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
4941 nnz[0] += nnz[1] + nnz[8] + nnz[9]; |
2755 | 4942 }else{ |
4943 for(i4x4=0; i4x4<4; i4x4++){ | |
4944 const int index= i4x4 + 4*i8x8; | |
2967 | 4945 |
2919 | 4946 if( decode_residual(h, gb, h->mb + 16*index, index, scan, h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale], 16) <0 ){ |
2755 | 4947 return -1; |
4948 } | |
1168 | 4949 } |
4950 } | |
4951 }else{ | |
4952 uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ]; | |
4953 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0; | |
4954 } | |
4955 } | |
4956 } | |
2967 | 4957 |
1168 | 4958 if(cbp&0x30){ |
4959 for(chroma_idx=0; chroma_idx<2; chroma_idx++) | |
2919 | 4960 if( decode_residual(h, gb, h->mb + 256 + 16*4*chroma_idx, CHROMA_DC_BLOCK_INDEX, chroma_dc_scan, NULL, 4) < 0){ |
1168 | 4961 return -1; |
4962 } | |
4963 } | |
4964 | |
4965 if(cbp&0x20){ | |
4966 for(chroma_idx=0; chroma_idx<2; chroma_idx++){ | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4967 const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]]; |
1168 | 4968 for(i4x4=0; i4x4<4; i4x4++){ |
4969 const int index= 16 + 4*chroma_idx + i4x4; | |
5225
099c495618c1
Compute the dequant coefficient table ptr outside the loop,
gpoirier
parents:
5215
diff
changeset
|
4970 if( decode_residual(h, gb, h->mb + 16*index, index, scan + 1, qmul, 15) < 0){ |
1168 | 4971 return -1; |
4972 } | |
4973 } | |
4974 } | |
4975 }else{ | |
4976 uint8_t * const nnz= &h->non_zero_count_cache[0]; | |
4977 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = | |
4978 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; | |
4979 } | |
4980 }else{ | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4981 uint8_t * const nnz= &h->non_zero_count_cache[0]; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4982 fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1); |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4983 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4984 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; |
1168 | 4985 } |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
4986 s->current_picture.qscale_table[mb_xy]= s->qscale; |
1168 | 4987 write_back_non_zero_count(h); |
4988 | |
3316 | 4989 if(MB_MBAFF){ |
4990 h->ref_count[0] >>= 1; | |
4991 h->ref_count[1] >>= 1; | |
4992 } | |
4993 | |
1168 | 4994 return 0; |
4995 } | |
4996 | |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4997 static int decode_cabac_field_decoding_flag(H264Context *h) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4998 MpegEncContext * const s = &h->s; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4999 const int mb_x = s->mb_x; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5000 const int mb_y = s->mb_y & ~1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5001 const int mba_xy = mb_x - 1 + mb_y *s->mb_stride; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5002 const int mbb_xy = mb_x + (mb_y-2)*s->mb_stride; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5003 |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5004 unsigned int ctx = 0; |
2967 | 5005 |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5006 if( h->slice_table[mba_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5007 ctx += 1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5008 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5009 if( h->slice_table[mbb_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5010 ctx += 1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5011 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5012 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5013 return get_cabac_noinline( &h->cabac, &h->cabac_state[70 + ctx] ); |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5014 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5015 |
2312 | 5016 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) { |
5017 uint8_t *state= &h->cabac_state[ctx_base]; | |
5018 int mb_type; | |
2967 | 5019 |
2312 | 5020 if(intra_slice){ |
5021 MpegEncContext * const s = &h->s; | |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5022 const int mba_xy = h->left_mb_xy[0]; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5023 const int mbb_xy = h->top_mb_xy; |
2312 | 5024 int ctx=0; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
5025 if( h->slice_table[mba_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mba_xy] ) ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5026 ctx++; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
5027 if( h->slice_table[mbb_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mbb_xy] ) ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5028 ctx++; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5029 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 ) |
2312 | 5030 return 0; /* I4x4 */ |
5031 state += 2; | |
5032 }else{ | |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5033 if( get_cabac_noinline( &h->cabac, &state[0] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5034 return 0; /* I4x4 */ |
2312 | 5035 } |
5036 | |
5037 if( get_cabac_terminate( &h->cabac ) ) | |
5038 return 25; /* PCM */ | |
5039 | |
5040 mb_type = 1; /* I16x16 */ | |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5041 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */ |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5042 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */ |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5043 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] ); |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5044 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] ); |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5045 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] ); |
2312 | 5046 return mb_type; |
5047 } | |
5048 | |
5049 static int decode_cabac_mb_type( H264Context *h ) { | |
5050 MpegEncContext * const s = &h->s; | |
5051 | |
5052 if( h->slice_type == I_TYPE ) { | |
5053 return decode_cabac_intra_mb_type(h, 3, 1); | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5054 } else if( h->slice_type == P_TYPE ) { |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5055 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5056 /* P-type */ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5057 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) { |
3138 | 5058 /* P_L0_D16x16, P_8x8 */ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5059 return 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5060 } else { |
3138 | 5061 /* P_L0_D8x16, P_L0_D16x8 */ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5062 return 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5063 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5064 } else { |
2312 | 5065 return decode_cabac_intra_mb_type(h, 17, 0) + 5; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5066 } |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5067 } else if( h->slice_type == B_TYPE ) { |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5068 const int mba_xy = h->left_mb_xy[0]; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5069 const int mbb_xy = h->top_mb_xy; |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5070 int ctx = 0; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5071 int bits; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5072 |
3138 | 5073 if( h->slice_table[mba_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mba_xy] ) ) |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5074 ctx++; |
3138 | 5075 if( h->slice_table[mbb_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mbb_xy] ) ) |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5076 ctx++; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5077 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5078 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ) |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5079 return 0; /* B_Direct_16x16 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5080 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5081 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) { |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5082 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */ |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5083 } |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5084 |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5085 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3; |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5086 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2; |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5087 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1; |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5088 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5089 if( bits < 8 ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5090 return bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5091 else if( bits == 13 ) { |
2312 | 5092 return decode_cabac_intra_mb_type(h, 32, 0) + 23; |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5093 } else if( bits == 14 ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5094 return 11; /* B_L1_L0_8x16 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5095 else if( bits == 15 ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5096 return 22; /* B_8x8 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5097 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5098 bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5099 return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */ |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5100 } else { |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5101 /* TODO SI/SP frames? */ |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5102 return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5103 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5104 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5105 |
3316 | 5106 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5107 MpegEncContext * const s = &h->s; |
3316 | 5108 int mba_xy, mbb_xy; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5109 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5110 |
3316 | 5111 if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches? |
5112 int mb_xy = mb_x + (mb_y&~1)*s->mb_stride; | |
5113 mba_xy = mb_xy - 1; | |
5114 if( (mb_y&1) | |
5115 && h->slice_table[mba_xy] == h->slice_num | |
5116 && MB_FIELD == !!IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) | |
5117 mba_xy += s->mb_stride; | |
5118 if( MB_FIELD ){ | |
5119 mbb_xy = mb_xy - s->mb_stride; | |
5120 if( !(mb_y&1) | |
5121 && h->slice_table[mbb_xy] == h->slice_num | |
5122 && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) | |
5123 mbb_xy -= s->mb_stride; | |
5124 }else | |
5125 mbb_xy = mb_x + (mb_y-1)*s->mb_stride; | |
5126 }else{ | |
5127 int mb_xy = mb_x + mb_y*s->mb_stride; | |
5128 mba_xy = mb_xy - 1; | |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
5129 mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); |
3316 | 5130 } |
5131 | |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
5132 if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mba_xy] )) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5133 ctx++; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
5134 if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mbb_xy] )) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5135 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5136 |
3138 | 5137 if( h->slice_type == B_TYPE ) |
5138 ctx += 13; | |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5139 return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5140 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5141 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5142 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5143 int mode = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5144 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5145 if( get_cabac( &h->cabac, &h->cabac_state[68] ) ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5146 return pred_mode; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5147 |
2928 | 5148 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] ); |
5149 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] ); | |
5150 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] ); | |
5151 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5152 if( mode >= pred_mode ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5153 return mode + 1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5154 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5155 return mode; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5156 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5157 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5158 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) { |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5159 const int mba_xy = h->left_mb_xy[0]; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5160 const int mbb_xy = h->top_mb_xy; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5161 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5162 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5163 |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5164 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */ |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
5165 if( h->slice_table[mba_xy] == h->slice_num && h->chroma_pred_mode_table[mba_xy] != 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5166 ctx++; |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5167 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
5168 if( h->slice_table[mbb_xy] == h->slice_num && h->chroma_pred_mode_table[mbb_xy] != 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5169 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5170 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5171 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5172 return 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5173 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5174 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5175 return 1; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5176 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5177 return 2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5178 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5179 return 3; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5180 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5181 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5182 static int decode_cabac_mb_cbp_luma( H264Context *h) { |
5694
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5183 int cbp_b, cbp_a, ctx, cbp = 0; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5184 |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5185 cbp_a = h->slice_table[h->left_mb_xy[0]] == h->slice_num ? h->left_cbp : -1; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5186 cbp_b = h->slice_table[h->top_mb_xy] == h->slice_num ? h->top_cbp : -1; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5187 |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5188 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5189 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5190 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5191 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5192 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5193 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5194 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
5195 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5196 return cbp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5197 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5198 static int decode_cabac_mb_cbp_chroma( H264Context *h) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5199 int ctx; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5200 int cbp_a, cbp_b; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5201 |
2314 | 5202 cbp_a = (h->left_cbp>>4)&0x03; |
5203 cbp_b = (h-> top_cbp>>4)&0x03; | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5204 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5205 ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5206 if( cbp_a > 0 ) ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5207 if( cbp_b > 0 ) ctx += 2; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5208 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5209 return 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5210 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5211 ctx = 4; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5212 if( cbp_a == 2 ) ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5213 if( cbp_b == 2 ) ctx += 2; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5214 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5215 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5216 static int decode_cabac_mb_dqp( H264Context *h) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5217 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5218 int val = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5219 |
3316 | 5220 if( h->last_qscale_diff != 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5221 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5222 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5223 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5224 if( ctx < 2 ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5225 ctx = 2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5226 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5227 ctx = 3; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5228 val++; |
3128 | 5229 if(val > 102) //prevent infinite loop |
2844
5f20ab245501
prevent assert failures and infinite loops with broken streams
michael
parents:
2834
diff
changeset
|
5230 return INT_MIN; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5231 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5232 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5233 if( val&0x01 ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5234 return (val + 1)/2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5235 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5236 return -(val + 1)/2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5237 } |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5238 static int decode_cabac_p_mb_sub_type( H264Context *h ) { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5239 if( get_cabac( &h->cabac, &h->cabac_state[21] ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5240 return 0; /* 8x8 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5241 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5242 return 1; /* 8x4 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5243 if( get_cabac( &h->cabac, &h->cabac_state[23] ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5244 return 2; /* 4x8 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5245 return 3; /* 4x4 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5246 } |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5247 static int decode_cabac_b_mb_sub_type( H264Context *h ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5248 int type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5249 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5250 return 0; /* B_Direct_8x8 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5251 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) ) |
2311
cdbb2f30e08b
small typo patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
2310
diff
changeset
|
5252 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */ |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5253 type = 3; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5254 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5255 if( get_cabac( &h->cabac, &h->cabac_state[39] ) ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5256 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5257 type += 4; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5258 } |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5259 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5260 type += get_cabac( &h->cabac, &h->cabac_state[39] ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5261 return type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5262 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5263 |
2755 | 5264 static inline int decode_cabac_mb_transform_size( H264Context *h ) { |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5265 return get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ); |
2755 | 5266 } |
5267 | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5268 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5269 int refa = h->ref_cache[list][scan8[n] - 1]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5270 int refb = h->ref_cache[list][scan8[n] - 8]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5271 int ref = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5272 int ctx = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5273 |
2396 | 5274 if( h->slice_type == B_TYPE) { |
5275 if( refa > 0 && !h->direct_cache[scan8[n] - 1] ) | |
5276 ctx++; | |
5277 if( refb > 0 && !h->direct_cache[scan8[n] - 8] ) | |
5278 ctx += 2; | |
5279 } else { | |
5280 if( refa > 0 ) | |
5281 ctx++; | |
5282 if( refb > 0 ) | |
5283 ctx += 2; | |
5284 } | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5285 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5286 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5287 ref++; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5288 if( ctx < 4 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5289 ctx = 4; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5290 else |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5291 ctx = 5; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5292 if(ref >= 32 /*h->ref_list[list]*/){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5293 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_ref\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5294 return 0; //FIXME we should return -1 and check the return everywhere |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5295 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5296 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5297 return ref; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5298 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5299 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5300 static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5301 int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) + |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5302 abs( h->mvd_cache[list][scan8[n] - 8][l] ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5303 int ctxbase = (l == 0) ? 40 : 47; |
2317 | 5304 int ctx, mvd; |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5305 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5306 if( amvd < 3 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5307 ctx = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5308 else if( amvd > 32 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5309 ctx = 2; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5310 else |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5311 ctx = 1; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5312 |
2317 | 5313 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+ctx])) |
5314 return 0; | |
5315 | |
5316 mvd= 1; | |
5317 ctx= 3; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5318 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5319 mvd++; |
2317 | 5320 if( ctx < 6 ) |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5321 ctx++; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5322 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5323 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5324 if( mvd >= 9 ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5325 int k = 3; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5326 while( get_cabac_bypass( &h->cabac ) ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5327 mvd += 1 << k; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5328 k++; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5329 if(k>24){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5330 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5331 return INT_MIN; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5332 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5333 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5334 while( k-- ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5335 if( get_cabac_bypass( &h->cabac ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5336 mvd += 1 << k; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5337 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5338 } |
4042 | 5339 return get_cabac_bypass_sign( &h->cabac, -mvd ); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5340 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5341 |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4896
diff
changeset
|
5342 static inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx ) { |
2314 | 5343 int nza, nzb; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5344 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5345 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5346 if( cat == 0 ) { |
2314 | 5347 nza = h->left_cbp&0x100; |
5348 nzb = h-> top_cbp&0x100; | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5349 } else if( cat == 1 || cat == 2 ) { |
2314 | 5350 nza = h->non_zero_count_cache[scan8[idx] - 1]; |
5351 nzb = h->non_zero_count_cache[scan8[idx] - 8]; | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5352 } else if( cat == 3 ) { |
2314 | 5353 nza = (h->left_cbp>>(6+idx))&0x01; |
5354 nzb = (h-> top_cbp>>(6+idx))&0x01; | |
5355 } else { | |
5356 assert(cat == 4); | |
5357 nza = h->non_zero_count_cache[scan8[16+idx] - 1]; | |
5358 nzb = h->non_zero_count_cache[scan8[16+idx] - 8]; | |
5359 } | |
5360 | |
5361 if( nza > 0 ) | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5362 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5363 |
2314 | 5364 if( nzb > 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5365 ctx += 2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5366 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5367 return ctx + 4 * cat; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5368 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5369 |
5006
28ebdd244a07
Change some leftover __attribute__((unused)) and __attribute__((used)) to
reimar
parents:
4984
diff
changeset
|
5370 static const attribute_used uint8_t last_coeff_flag_offset_8x8[63] = { |
4051 | 5371 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
5372 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
5373 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
5374 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8 | |
5375 }; | |
5376 | |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5377 static void decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5378 const int mb_xy = h->s.mb_x + h->s.mb_y*h->s.mb_stride; |
3316 | 5379 static const int significant_coeff_flag_offset[2][6] = { |
5380 { 105+0, 105+15, 105+29, 105+44, 105+47, 402 }, | |
5381 { 277+0, 277+15, 277+29, 277+44, 277+47, 436 } | |
5382 }; | |
5383 static const int last_coeff_flag_offset[2][6] = { | |
5384 { 166+0, 166+15, 166+29, 166+44, 166+47, 417 }, | |
5385 { 338+0, 338+15, 338+29, 338+44, 338+47, 451 } | |
5386 }; | |
5387 static const int coeff_abs_level_m1_offset[6] = { | |
5388 227+0, 227+10, 227+20, 227+30, 227+39, 426 | |
5389 }; | |
4007 | 5390 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = { |
3316 | 5391 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5, |
2755 | 5392 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7, |
5393 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11, | |
3316 | 5394 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 }, |
5395 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5, | |
5396 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11, | |
5397 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9, | |
5398 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 } | |
2755 | 5399 }; |
5400 | |
5401 int index[64]; | |
2313 | 5402 |
5262 | 5403 int av_unused last; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5404 int coeff_count = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5405 |
2316 | 5406 int abslevel1 = 1; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5407 int abslevelgt1 = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5408 |
2898 | 5409 uint8_t *significant_coeff_ctx_base; |
5410 uint8_t *last_coeff_ctx_base; | |
5411 uint8_t *abs_level_m1_ctx_base; | |
2755 | 5412 |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5413 #ifndef ARCH_X86 |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5414 #define CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5415 #endif |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5416 #ifdef CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5417 #define CC &cc |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5418 CABACContext cc; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5419 cc.range = h->cabac.range; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5420 cc.low = h->cabac.low; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5421 cc.bytestream= h->cabac.bytestream; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5422 #else |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5423 #define CC &h->cabac |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5424 #endif |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5425 |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5426 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5427 /* cat: 0-> DC 16x16 n = 0 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5428 * 1-> AC 16x16 n = luma4x4idx |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5429 * 2-> Luma4x4 n = luma4x4idx |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5430 * 3-> DC Chroma n = iCbCr |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5431 * 4-> AC Chroma n = 4 * iCbCr + chroma4x4idx |
2755 | 5432 * 5-> Luma8x8 n = 4 * luma8x8idx |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5433 */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5434 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5435 /* read coded block flag */ |
2898 | 5436 if( cat != 5 ) { |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5437 if( get_cabac( CC, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n ) ] ) == 0 ) { |
2755 | 5438 if( cat == 1 || cat == 2 ) |
5439 h->non_zero_count_cache[scan8[n]] = 0; | |
5440 else if( cat == 4 ) | |
5441 h->non_zero_count_cache[scan8[16+n]] = 0; | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5442 #ifdef CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5443 h->cabac.range = cc.range ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5444 h->cabac.low = cc.low ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5445 h->cabac.bytestream= cc.bytestream; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5446 #endif |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5447 return; |
2755 | 5448 } |
2898 | 5449 } |
5450 | |
5451 significant_coeff_ctx_base = h->cabac_state | |
3316 | 5452 + significant_coeff_flag_offset[MB_FIELD][cat]; |
2898 | 5453 last_coeff_ctx_base = h->cabac_state |
3316 | 5454 + last_coeff_flag_offset[MB_FIELD][cat]; |
2898 | 5455 abs_level_m1_ctx_base = h->cabac_state |
5456 + coeff_abs_level_m1_offset[cat]; | |
5457 | |
5458 if( cat == 5 ) { | |
5459 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \ | |
5460 for(last= 0; last < coefs; last++) { \ | |
5461 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \ | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5462 if( get_cabac( CC, sig_ctx )) { \ |
2898 | 5463 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \ |
5464 index[coeff_count++] = last; \ | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5465 if( get_cabac( CC, last_ctx ) ) { \ |
2898 | 5466 last= max_coeff; \ |
5467 break; \ | |
5468 } \ | |
5469 } \ | |
4037
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5470 }\ |
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5471 if( last == max_coeff -1 ) {\ |
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5472 index[coeff_count++] = last;\ |
2898 | 5473 } |
4009 | 5474 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD]; |
5547 | 5475 #if defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS) |
4051 | 5476 coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off); |
5477 } else { | |
5478 coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index); | |
5479 #else | |
3316 | 5480 DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] ); |
2898 | 5481 } else { |
5482 DECODE_SIGNIFICANCE( max_coeff - 1, last, last ); | |
4037
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5483 #endif |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5484 } |
2316 | 5485 assert(coeff_count > 0); |
5486 | |
5487 if( cat == 0 ) | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5488 h->cbp_table[mb_xy] |= 0x100; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5489 else if( cat == 1 || cat == 2 ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5490 h->non_zero_count_cache[scan8[n]] = coeff_count; |
2316 | 5491 else if( cat == 3 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5492 h->cbp_table[mb_xy] |= 0x40 << n; |
2755 | 5493 else if( cat == 4 ) |
5494 h->non_zero_count_cache[scan8[16+n]] = coeff_count; | |
2316 | 5495 else { |
2755 | 5496 assert( cat == 5 ); |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
5497 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1); |
2316 | 5498 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5499 |
4041
0113ceb0f953
1 variable less in decode_cabac_residual() no speed change (but less vars means less things gcc can load and store redundantly)
michael
parents:
4040
diff
changeset
|
5500 for( coeff_count--; coeff_count >= 0; coeff_count-- ) { |
2898 | 5501 uint8_t *ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 )) + abs_level_m1_ctx_base; |
4041
0113ceb0f953
1 variable less in decode_cabac_residual() no speed change (but less vars means less things gcc can load and store redundantly)
michael
parents:
4040
diff
changeset
|
5502 int j= scantable[index[coeff_count]]; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5503 |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5504 if( get_cabac( CC, ctx ) == 0 ) { |
2898 | 5505 if( !qmul ) { |
4040 | 5506 block[j] = get_cabac_bypass_sign( CC, -1); |
2316 | 5507 }else{ |
4040 | 5508 block[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6;; |
2316 | 5509 } |
2967 | 5510 |
2313 | 5511 abslevel1++; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5512 } else { |
2313 | 5513 int coeff_abs = 2; |
2898 | 5514 ctx = 5 + FFMIN( 4, abslevelgt1 ) + abs_level_m1_ctx_base; |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5515 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { |
2313 | 5516 coeff_abs++; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5517 } |
2313 | 5518 |
5519 if( coeff_abs >= 15 ) { | |
5520 int j = 0; | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5521 while( get_cabac_bypass( CC ) ) { |
2313 | 5522 j++; |
5523 } | |
2967 | 5524 |
4016 | 5525 coeff_abs=1; |
2313 | 5526 while( j-- ) { |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5527 coeff_abs += coeff_abs + get_cabac_bypass( CC ); |
2313 | 5528 } |
4016 | 5529 coeff_abs+= 14; |
2313 | 5530 } |
5531 | |
2898 | 5532 if( !qmul ) { |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5533 if( get_cabac_bypass( CC ) ) block[j] = -coeff_abs; |
2316 | 5534 else block[j] = coeff_abs; |
5535 }else{ | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5536 if( get_cabac_bypass( CC ) ) block[j] = (-coeff_abs * qmul[j] + 32) >> 6; |
2919 | 5537 else block[j] = ( coeff_abs * qmul[j] + 32) >> 6; |
2316 | 5538 } |
2967 | 5539 |
2313 | 5540 abslevelgt1++; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5541 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5542 } |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5543 #ifdef CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5544 h->cabac.range = cc.range ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5545 h->cabac.low = cc.low ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5546 h->cabac.bytestream= cc.bytestream; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5547 #endif |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5548 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5549 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5550 |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4896
diff
changeset
|
5551 static inline void compute_mb_neighbors(H264Context *h) |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5552 { |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5553 MpegEncContext * const s = &h->s; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5554 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5555 h->top_mb_xy = mb_xy - s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5556 h->left_mb_xy[0] = mb_xy - 1; |
3316 | 5557 if(FRAME_MBAFF){ |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5558 const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5559 const int top_pair_xy = pair_xy - s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5560 const int top_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]); |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5561 const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]); |
3316 | 5562 const int curr_mb_frame_flag = !MB_FIELD; |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5563 const int bottom = (s->mb_y & 1); |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5564 if (bottom |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5565 ? !curr_mb_frame_flag // bottom macroblock |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5566 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5567 ) { |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5568 h->top_mb_xy -= s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5569 } |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5570 if (left_mb_frame_flag != curr_mb_frame_flag) { |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5571 h->left_mb_xy[0] = pair_xy - 1; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5572 } |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
5573 } else if (FIELD_PICTURE) { |
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
5574 h->top_mb_xy -= s->mb_stride; |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5575 } |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5576 return; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5577 } |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5578 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5579 /** |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5580 * decodes a macroblock |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5581 * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5582 */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5583 static int decode_mb_cabac(H264Context *h) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5584 MpegEncContext * const s = &h->s; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5585 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5586 int mb_type, partition_count, cbp = 0; |
2755 | 5587 int dct8x8_allowed= h->pps.transform_8x8_mode; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5588 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5589 s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong?) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5590 |
4600 | 5591 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5592 if( h->slice_type != I_TYPE && h->slice_type != SI_TYPE ) { |
3316 | 5593 int skip; |
5594 /* a skipped mb needs the aff flag from the following mb */ | |
5595 if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 ) | |
5596 predict_field_decoding_flag(h); | |
5597 if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped ) | |
5598 skip = h->next_mb_skipped; | |
5599 else | |
5600 skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y ); | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5601 /* read skip flags */ |
3316 | 5602 if( skip ) { |
5603 if( FRAME_MBAFF && (s->mb_y&1)==0 ){ | |
5604 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP; | |
5605 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 ); | |
5606 if(h->next_mb_skipped) | |
5607 predict_field_decoding_flag(h); | |
5608 else | |
5609 h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); | |
5610 } | |
5611 | |
2396 | 5612 decode_mb_skip(h); |
5613 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5614 h->cbp_table[mb_xy] = 0; |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5615 h->chroma_pred_mode_table[mb_xy] = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5616 h->last_qscale_diff = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5617 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5618 return 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5619 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5620 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5621 } |
3316 | 5622 if(FRAME_MBAFF){ |
5623 if( (s->mb_y&1) == 0 ) | |
5624 h->mb_mbaff = | |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5625 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5626 }else |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5627 h->mb_field_decoding_flag= (s->picture_structure!=PICT_FRAME); |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5628 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
5629 h->prev_mb_skipped = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5630 |
3077 | 5631 compute_mb_neighbors(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5632 if( ( mb_type = decode_cabac_mb_type( h ) ) < 0 ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5633 av_log( h->s.avctx, AV_LOG_ERROR, "decode_cabac_mb_type failed\n" ); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5634 return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5635 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5636 |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5637 if( h->slice_type == B_TYPE ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5638 if( mb_type < 23 ){ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5639 partition_count= b_mb_type_info[mb_type].partition_count; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5640 mb_type= b_mb_type_info[mb_type].type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5641 }else{ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5642 mb_type -= 23; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5643 goto decode_intra_mb; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5644 } |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5645 } else if( h->slice_type == P_TYPE ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5646 if( mb_type < 5) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5647 partition_count= p_mb_type_info[mb_type].partition_count; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5648 mb_type= p_mb_type_info[mb_type].type; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5649 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5650 mb_type -= 5; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5651 goto decode_intra_mb; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5652 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5653 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5654 assert(h->slice_type == I_TYPE); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5655 decode_intra_mb: |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5656 partition_count = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5657 cbp= i_mb_type_info[mb_type].cbp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5658 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5659 mb_type= i_mb_type_info[mb_type].type; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5660 } |
3316 | 5661 if(MB_FIELD) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5662 mb_type |= MB_TYPE_INTERLACED; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5663 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5664 h->slice_table[ mb_xy ]= h->slice_num; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5665 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5666 if(IS_INTRA_PCM(mb_type)) { |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5667 const uint8_t *ptr; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5668 unsigned int x, y; |
2967 | 5669 |
5127 | 5670 // We assume these blocks are very rare so we do not optimize it. |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5671 // FIXME The two following lines get the bitstream position in the cabac |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5672 // decode, I think it should be done by a function in cabac.h (or cabac.c). |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5673 ptr= h->cabac.bytestream; |
4344 | 5674 if(h->cabac.low&0x1) ptr--; |
5675 if(CABAC_BITS==16){ | |
5676 if(h->cabac.low&0x1FF) ptr--; | |
5677 } | |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5678 |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5679 // The pixels are stored in the same order as levels in h->mb array. |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5680 for(y=0; y<16; y++){ |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5681 const int index= 4*(y&3) + 32*((y>>2)&1) + 128*(y>>3); |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5682 for(x=0; x<16; x++){ |
4600 | 5683 tprintf(s->avctx, "LUMA ICPM LEVEL (%3d)\n", *ptr); |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5684 h->mb[index + (x&3) + 16*((x>>2)&1) + 64*(x>>3)]= *ptr++; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5685 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5686 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5687 for(y=0; y<8; y++){ |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5688 const int index= 256 + 4*(y&3) + 32*(y>>2); |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5689 for(x=0; x<8; x++){ |
4600 | 5690 tprintf(s->avctx, "CHROMA U ICPM LEVEL (%3d)\n", *ptr); |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5691 h->mb[index + (x&3) + 16*(x>>2)]= *ptr++; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5692 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5693 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5694 for(y=0; y<8; y++){ |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5695 const int index= 256 + 64 + 4*(y&3) + 32*(y>>2); |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5696 for(x=0; x<8; x++){ |
4600 | 5697 tprintf(s->avctx, "CHROMA V ICPM LEVEL (%3d)\n", *ptr); |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5698 h->mb[index + (x&3) + 16*(x>>2)]= *ptr++; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5699 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5700 } |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5701 |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5702 ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr); |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5703 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5704 // All blocks are present |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5705 h->cbp_table[mb_xy] = 0x1ef; |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5706 h->chroma_pred_mode_table[mb_xy] = 0; |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5707 // In deblocking, the quantizer is 0 |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5708 s->current_picture.qscale_table[mb_xy]= 0; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
5709 h->chroma_qp[0] = get_chroma_qp(h, 0, 0); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
5710 h->chroma_qp[1] = get_chroma_qp(h, 1, 0); |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5711 // All coeffs are present |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5712 memset(h->non_zero_count[mb_xy], 16, 16); |
2755 | 5713 s->current_picture.mb_type[mb_xy]= mb_type; |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5714 return 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5715 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5716 |
3316 | 5717 if(MB_MBAFF){ |
5718 h->ref_count[0] <<= 1; | |
5719 h->ref_count[1] <<= 1; | |
5720 } | |
5721 | |
2449 | 5722 fill_caches(h, mb_type, 0); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5723 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5724 if( IS_INTRA( mb_type ) ) { |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5725 int i, pred_mode; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5726 if( IS_INTRA4x4( mb_type ) ) { |
2755 | 5727 if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) { |
5728 mb_type |= MB_TYPE_8x8DCT; | |
5729 for( i = 0; i < 16; i+=4 ) { | |
5730 int pred = pred_intra_mode( h, i ); | |
5731 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred ); | |
5732 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 ); | |
5733 } | |
5734 } else { | |
5735 for( i = 0; i < 16; i++ ) { | |
5736 int pred = pred_intra_mode( h, i ); | |
5737 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred ); | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5738 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5739 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] ); |
2755 | 5740 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5741 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5742 write_back_intra_pred_mode(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5743 if( check_intra4x4_pred_mode(h) < 0 ) return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5744 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5745 h->intra16x16_pred_mode= check_intra_pred_mode( h, h->intra16x16_pred_mode ); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5746 if( h->intra16x16_pred_mode < 0 ) return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5747 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5748 h->chroma_pred_mode_table[mb_xy] = |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5749 pred_mode = decode_cabac_mb_chroma_pre_mode( h ); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5750 |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5751 pred_mode= check_intra_pred_mode( h, pred_mode ); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5752 if( pred_mode < 0 ) return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5753 h->chroma_pred_mode= pred_mode; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5754 } else if( partition_count == 4 ) { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5755 int i, j, sub_partition_count[4], list, ref[2][4]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5756 |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5757 if( h->slice_type == B_TYPE ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5758 for( i = 0; i < 4; i++ ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5759 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5760 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5761 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5762 } |
3482 | 5763 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] | |
5764 h->sub_mb_type[2] | h->sub_mb_type[3]) ) { | |
2396 | 5765 pred_direct_motion(h, &mb_type); |
5425 | 5766 h->ref_cache[0][scan8[4]] = |
5767 h->ref_cache[1][scan8[4]] = | |
5768 h->ref_cache[0][scan8[12]] = | |
5769 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; | |
2396 | 5770 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) { |
5771 for( i = 0; i < 4; i++ ) | |
5772 if( IS_DIRECT(h->sub_mb_type[i]) ) | |
5773 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 ); | |
5774 } | |
5775 } | |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5776 } else { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5777 for( i = 0; i < 4; i++ ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5778 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5779 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5780 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5781 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5782 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5783 |
4533 | 5784 for( list = 0; list < h->list_count; list++ ) { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5785 for( i = 0; i < 4; i++ ) { |
2396 | 5786 if(IS_DIRECT(h->sub_mb_type[i])) continue; |
5787 if(IS_DIR(h->sub_mb_type[i], 0, list)){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5788 if( h->ref_count[list] > 1 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5789 ref[list][i] = decode_cabac_mb_ref( h, list, 4*i ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5790 else |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5791 ref[list][i] = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5792 } else { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5793 ref[list][i] = -1; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5794 } |
2110 | 5795 h->ref_cache[list][ scan8[4*i]+1 ]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5796 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5797 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5798 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5799 |
2755 | 5800 if(dct8x8_allowed) |
5801 dct8x8_allowed = get_dct8x8_allowed(h); | |
5802 | |
4533 | 5803 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5804 for(i=0; i<4; i++){ |
5425 | 5805 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ]; |
2396 | 5806 if(IS_DIRECT(h->sub_mb_type[i])){ |
5807 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4); | |
5808 continue; | |
5809 } | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5810 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5811 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5812 const int sub_mb_type= h->sub_mb_type[i]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5813 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5814 for(j=0; j<sub_partition_count[i]; j++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5815 int mpx, mpy; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5816 int mx, my; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5817 const int index= 4*i + block_width*j; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5818 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5819 int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5820 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5821 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5822 mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5823 my = mpy + decode_cabac_mb_mvd( h, list, index, 1 ); |
4600 | 5824 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5825 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5826 if(IS_SUB_8X8(sub_mb_type)){ |
4530 | 5827 mv_cache[ 1 ][0]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5828 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx; |
4530 | 5829 mv_cache[ 1 ][1]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5830 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5831 |
4530 | 5832 mvd_cache[ 1 ][0]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5833 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx; |
4530 | 5834 mvd_cache[ 1 ][1]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5835 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5836 }else if(IS_SUB_8X4(sub_mb_type)){ |
4530 | 5837 mv_cache[ 1 ][0]= mx; |
5838 mv_cache[ 1 ][1]= my; | |
5839 | |
5840 mvd_cache[ 1 ][0]= mx - mpx; | |
5841 mvd_cache[ 1 ][1]= my - mpy; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5842 }else if(IS_SUB_4X8(sub_mb_type)){ |
4530 | 5843 mv_cache[ 8 ][0]= mx; |
5844 mv_cache[ 8 ][1]= my; | |
5845 | |
5846 mvd_cache[ 8 ][0]= mx - mpx; | |
5847 mvd_cache[ 8 ][1]= my - mpy; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5848 } |
4530 | 5849 mv_cache[ 0 ][0]= mx; |
5850 mv_cache[ 0 ][1]= my; | |
5851 | |
5852 mvd_cache[ 0 ][0]= mx - mpx; | |
5853 mvd_cache[ 0 ][1]= my - mpy; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5854 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5855 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5856 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5857 uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5858 p[0] = p[1] = p[8] = p[9] = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5859 pd[0]= pd[1]= pd[8]= pd[9]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5860 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5861 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5862 } |
2396 | 5863 } else if( IS_DIRECT(mb_type) ) { |
5864 pred_direct_motion(h, &mb_type); | |
5865 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4); | |
5866 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4); | |
2755 | 5867 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; |
2396 | 5868 } else { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5869 int list, mx, my, i, mpx, mpy; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5870 if(IS_16X16(mb_type)){ |
4534 | 5871 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5872 if(IS_DIR(mb_type, 0, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5873 const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5874 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1); |
2523 | 5875 }else |
4534 | 5876 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too |
5877 } | |
5878 for(list=0; list<h->list_count; list++){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5879 if(IS_DIR(mb_type, 0, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5880 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5881 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5882 mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5883 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 ); |
4600 | 5884 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5885 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5886 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5887 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); |
2523 | 5888 }else |
5889 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5890 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5891 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5892 else if(IS_16X8(mb_type)){ |
4533 | 5893 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5894 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5895 if(IS_DIR(mb_type, i, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5896 const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 8*i ) : 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5897 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1); |
2396 | 5898 }else |
5899 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5900 } |
4533 | 5901 } |
5902 for(list=0; list<h->list_count; list++){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5903 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5904 if(IS_DIR(mb_type, i, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5905 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5906 mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5907 my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 ); |
4600 | 5908 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5909 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5910 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5911 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); |
2523 | 5912 }else{ |
2396 | 5913 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); |
5914 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5915 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5916 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5917 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5918 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5919 assert(IS_8X16(mb_type)); |
4533 | 5920 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5921 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5922 if(IS_DIR(mb_type, i, list)){ //FIXME optimize |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5923 const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 4*i ) : 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5924 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1); |
2396 | 5925 }else |
5926 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5927 } |
4533 | 5928 } |
5929 for(list=0; list<h->list_count; list++){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5930 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5931 if(IS_DIR(mb_type, i, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5932 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5933 mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5934 my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5935 |
4600 | 5936 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5937 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5938 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4); |
2523 | 5939 }else{ |
2396 | 5940 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); |
5941 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5942 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5943 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5944 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5945 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5946 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5947 |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5948 if( IS_INTER( mb_type ) ) { |
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5949 h->chroma_pred_mode_table[mb_xy] = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5950 write_back_motion( h, mb_type ); |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5951 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5952 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5953 if( !IS_INTRA16x16( mb_type ) ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5954 cbp = decode_cabac_mb_cbp_luma( h ); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5955 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5956 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5957 |
3651 | 5958 h->cbp_table[mb_xy] = h->cbp = cbp; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5959 |
2755 | 5960 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) { |
5961 if( decode_cabac_mb_transform_size( h ) ) | |
5962 mb_type |= MB_TYPE_8x8DCT; | |
5963 } | |
5964 s->current_picture.mb_type[mb_xy]= mb_type; | |
5965 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5966 if( cbp || IS_INTRA16x16( mb_type ) ) { |
3174 | 5967 const uint8_t *scan, *scan8x8, *dc_scan; |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5968 const uint32_t *qmul; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5969 int dqp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5970 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5971 if(IS_INTERLACED(mb_type)){ |
3316 | 5972 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0; |
2763 | 5973 scan= s->qscale ? h->field_scan : h->field_scan_q0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5974 dc_scan= luma_dc_field_scan; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5975 }else{ |
3316 | 5976 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0; |
2763 | 5977 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5978 dc_scan= luma_dc_zigzag_scan; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5979 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5980 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5981 h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h ); |
2883
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5982 if( dqp == INT_MIN ){ |
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5983 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y); |
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5984 return -1; |
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5985 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5986 s->qscale += dqp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5987 if(((unsigned)s->qscale) > 51){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5988 if(s->qscale<0) s->qscale+= 52; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5989 else s->qscale-= 52; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5990 } |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
5991 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
5992 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5993 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5994 if( IS_INTRA16x16( mb_type ) ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5995 int i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5996 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" ); |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5997 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16); |
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5998 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5999 if( cbp&15 ) { |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
6000 qmul = h->dequant4_coeff[0][s->qscale]; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6001 for( i = 0; i < 16; i++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6002 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i ); |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
6003 decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, qmul, 15); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6004 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6005 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6006 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6007 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6008 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6009 int i8x8, i4x4; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6010 for( i8x8 = 0; i8x8 < 4; i8x8++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6011 if( cbp & (1<<i8x8) ) { |
2755 | 6012 if( IS_8x8DCT(mb_type) ) { |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
6013 decode_cabac_residual(h, h->mb + 64*i8x8, 5, 4*i8x8, |
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
6014 scan8x8, h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 64); |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
6015 } else { |
5713 | 6016 qmul = h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale]; |
6017 for( i4x4 = 0; i4x4 < 4; i4x4++ ) { | |
6018 const int index = 4*i8x8 + i4x4; | |
6019 //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index ); | |
3972
f5f1c9af095d
move outcommented START/STOP_TIMER to a hopefully better place for benchmarking ...
michael
parents:
3955
diff
changeset
|
6020 //START_TIMER |
5713 | 6021 decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, qmul, 16); |
3972
f5f1c9af095d
move outcommented START/STOP_TIMER to a hopefully better place for benchmarking ...
michael
parents:
3955
diff
changeset
|
6022 //STOP_TIMER("decode_residual") |
5713 | 6023 } |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
6024 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6025 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6026 uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ]; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6027 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6028 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6029 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6030 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6031 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6032 if( cbp&0x30 ){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6033 int c; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6034 for( c = 0; c < 2; c++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6035 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c ); |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
6036 decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, NULL, 4); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6037 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6038 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6039 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6040 if( cbp&0x20 ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6041 int c, i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6042 for( c = 0; c < 2; c++ ) { |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
6043 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]]; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6044 for( i = 0; i < 4; i++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6045 const int index = 16 + 4 * c + i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6046 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 ); |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
6047 decode_cabac_residual(h, h->mb + 16*index, 4, index - 16, scan + 1, qmul, 15); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6048 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6049 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6050 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6051 uint8_t * const nnz= &h->non_zero_count_cache[0]; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6052 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6053 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6054 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6055 } else { |
2315 | 6056 uint8_t * const nnz= &h->non_zero_count_cache[0]; |
6057 fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1); | |
6058 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = | |
6059 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; | |
3316 | 6060 h->last_qscale_diff = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6061 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6062 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6063 s->current_picture.qscale_table[mb_xy]= s->qscale; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6064 write_back_non_zero_count(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6065 |
3316 | 6066 if(MB_MBAFF){ |
6067 h->ref_count[0] >>= 1; | |
6068 h->ref_count[1] >>= 1; | |
6069 } | |
6070 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6071 return 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6072 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6073 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6074 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6075 static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6076 int i, d; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6077 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6078 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6079 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6080 |
2633 | 6081 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6082 int8_t tc[4]; |
2633 | 6083 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6084 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1; |
2633 | 6085 h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc); |
6086 } else { | |
6087 /* 16px edge length, because bS=4 is triggered by being at | |
6088 * the edge of an intra MB, so all 4 bS are the same */ | |
6089 for( d = 0; d < 16; d++ ) { | |
1898 | 6090 const int p0 = pix[-1]; |
6091 const int p1 = pix[-2]; | |
6092 const int p2 = pix[-3]; | |
6093 | |
6094 const int q0 = pix[0]; | |
6095 const int q1 = pix[1]; | |
6096 const int q2 = pix[2]; | |
6097 | |
4001 | 6098 if( FFABS( p0 - q0 ) < alpha && |
6099 FFABS( p1 - p0 ) < beta && | |
6100 FFABS( q1 - q0 ) < beta ) { | |
6101 | |
6102 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ | |
6103 if( FFABS( p2 - p0 ) < beta) | |
1898 | 6104 { |
6105 const int p3 = pix[-4]; | |
6106 /* p0', p1', p2' */ | |
6107 pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; | |
6108 pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; | |
6109 pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; | |
6110 } else { | |
6111 /* p0' */ | |
6112 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
6113 } | |
4001 | 6114 if( FFABS( q2 - q0 ) < beta) |
1898 | 6115 { |
6116 const int q3 = pix[3]; | |
6117 /* q0', q1', q2' */ | |
6118 pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; | |
6119 pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; | |
6120 pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; | |
6121 } else { | |
6122 /* q0' */ | |
6123 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
6124 } | |
6125 }else{ | |
6126 /* p0', q0' */ | |
6127 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
6128 pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
6129 } | |
4600 | 6130 tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, p2, p1, p0, q0, q1, q2, pix[-2], pix[-1], pix[0], pix[1]); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6131 } |
1898 | 6132 pix += stride; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6133 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6134 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6135 } |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6136 static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
2834 | 6137 int i; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6138 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6139 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6140 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6141 |
2633 | 6142 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6143 int8_t tc[4]; |
2633 | 6144 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6145 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0; |
2633 | 6146 h->s.dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc); |
6147 } else { | |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6148 h->s.dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6149 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6150 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6151 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6152 static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) { |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6153 int i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6154 for( i = 0; i < 16; i++, pix += stride) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6155 int index_a; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6156 int alpha; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6157 int beta; |
2967 | 6158 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6159 int qp_index; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6160 int bS_index = (i >> 1); |
3316 | 6161 if (!MB_FIELD) { |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6162 bS_index &= ~1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6163 bS_index |= (i & 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6164 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6165 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6166 if( bS[bS_index] == 0 ) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6167 continue; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6168 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6169 |
3316 | 6170 qp_index = MB_FIELD ? (i >> 3) : (i & 1); |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6171 index_a = qp[qp_index] + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6172 alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6173 beta = (beta_table+52)[qp[qp_index] + h->slice_beta_offset]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6174 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6175 if( bS[bS_index] < 4 ) { |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6176 const int tc0 = (tc0_table+52)[index_a][bS[bS_index] - 1]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6177 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6178 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6179 const int p2 = pix[-3]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6180 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6181 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6182 const int q2 = pix[2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6183 |
4001 | 6184 if( FFABS( p0 - q0 ) < alpha && |
6185 FFABS( p1 - p0 ) < beta && | |
6186 FFABS( q1 - q0 ) < beta ) { | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6187 int tc = tc0; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6188 int i_delta; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6189 |
4001 | 6190 if( FFABS( p2 - p0 ) < beta ) { |
4594 | 6191 pix[-2] = p1 + av_clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 ); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6192 tc++; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6193 } |
4001 | 6194 if( FFABS( q2 - q0 ) < beta ) { |
4594 | 6195 pix[1] = q1 + av_clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 ); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6196 tc++; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6197 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6198 |
4594 | 6199 i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc ); |
6200 pix[-1] = av_clip_uint8( p0 + i_delta ); /* p0' */ | |
6201 pix[0] = av_clip_uint8( q0 - i_delta ); /* q0' */ | |
4600 | 6202 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6203 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6204 }else{ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6205 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6206 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6207 const int p2 = pix[-3]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6208 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6209 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6210 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6211 const int q2 = pix[2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6212 |
4001 | 6213 if( FFABS( p0 - q0 ) < alpha && |
6214 FFABS( p1 - p0 ) < beta && | |
6215 FFABS( q1 - q0 ) < beta ) { | |
6216 | |
6217 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ | |
6218 if( FFABS( p2 - p0 ) < beta) | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6219 { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6220 const int p3 = pix[-4]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6221 /* p0', p1', p2' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6222 pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6223 pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6224 pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6225 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6226 /* p0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6227 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6228 } |
4001 | 6229 if( FFABS( q2 - q0 ) < beta) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6230 { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6231 const int q3 = pix[3]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6232 /* q0', q1', q2' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6233 pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6234 pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6235 pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6236 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6237 /* q0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6238 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6239 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6240 }else{ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6241 /* p0', q0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6242 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6243 pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6244 } |
4600 | 6245 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, p2, p1, p0, q0, q1, q2, pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6246 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6247 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6248 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6249 } |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6250 static void filter_mb_mbaff_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) { |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6251 int i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6252 for( i = 0; i < 8; i++, pix += stride) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6253 int index_a; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6254 int alpha; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6255 int beta; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6256 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6257 int qp_index; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6258 int bS_index = i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6259 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6260 if( bS[bS_index] == 0 ) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6261 continue; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6262 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6263 |
3316 | 6264 qp_index = MB_FIELD ? (i >> 2) : (i & 1); |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6265 index_a = qp[qp_index] + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6266 alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6267 beta = (beta_table+52)[qp[qp_index] + h->slice_beta_offset]; |
3316 | 6268 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6269 if( bS[bS_index] < 4 ) { |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6270 const int tc = (tc0_table+52)[index_a][bS[bS_index] - 1] + 1; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6271 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6272 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6273 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6274 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6275 |
4001 | 6276 if( FFABS( p0 - q0 ) < alpha && |
6277 FFABS( p1 - p0 ) < beta && | |
6278 FFABS( q1 - q0 ) < beta ) { | |
4594 | 6279 const int i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc ); |
6280 | |
6281 pix[-1] = av_clip_uint8( p0 + i_delta ); /* p0' */ | |
6282 pix[0] = av_clip_uint8( q0 - i_delta ); /* q0' */ | |
4600 | 6283 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6284 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6285 }else{ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6286 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6287 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6288 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6289 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6290 |
4001 | 6291 if( FFABS( p0 - q0 ) < alpha && |
6292 FFABS( p1 - p0 ) < beta && | |
6293 FFABS( q1 - q0 ) < beta ) { | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6294 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6295 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; /* p0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6296 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; /* q0' */ |
4600 | 6297 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]\n", i, pix[-3], p1, p0, q0, q1, pix[2], pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6298 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6299 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6300 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6301 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6302 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6303 static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6304 int i, d; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6305 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6306 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6307 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6308 const int pix_next = stride; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6309 |
2633 | 6310 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6311 int8_t tc[4]; |
2633 | 6312 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6313 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1; |
2633 | 6314 h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc); |
6315 } else { | |
6316 /* 16px edge length, see filter_mb_edgev */ | |
6317 for( d = 0; d < 16; d++ ) { | |
1898 | 6318 const int p0 = pix[-1*pix_next]; |
6319 const int p1 = pix[-2*pix_next]; | |
6320 const int p2 = pix[-3*pix_next]; | |
6321 const int q0 = pix[0]; | |
6322 const int q1 = pix[1*pix_next]; | |
6323 const int q2 = pix[2*pix_next]; | |
6324 | |
4001 | 6325 if( FFABS( p0 - q0 ) < alpha && |
6326 FFABS( p1 - p0 ) < beta && | |
6327 FFABS( q1 - q0 ) < beta ) { | |
1898 | 6328 |
6329 const int p3 = pix[-4*pix_next]; | |
6330 const int q3 = pix[ 3*pix_next]; | |
6331 | |
4001 | 6332 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ |
6333 if( FFABS( p2 - p0 ) < beta) { | |
1898 | 6334 /* p0', p1', p2' */ |
6335 pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; | |
6336 pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; | |
6337 pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; | |
6338 } else { | |
6339 /* p0' */ | |
6340 pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
6341 } | |
4001 | 6342 if( FFABS( q2 - q0 ) < beta) { |
1898 | 6343 /* q0', q1', q2' */ |
6344 pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; | |
6345 pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; | |
6346 pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; | |
6347 } else { | |
6348 /* q0' */ | |
6349 pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
6350 } | |
6351 }else{ | |
6352 /* p0', q0' */ | |
6353 pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
6354 pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
6355 } | |
4600 | 6356 tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, qp, index_a, alpha, beta, bS[i], p2, p1, p0, q0, q1, q2, pix[-2*pix_next], pix[-pix_next], pix[0], pix[pix_next]); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6357 } |
1898 | 6358 pix++; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6359 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6360 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6361 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6362 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6363 static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
2834 | 6364 int i; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6365 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6366 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6367 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6368 |
2633 | 6369 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6370 int8_t tc[4]; |
2633 | 6371 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6372 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0; |
2633 | 6373 h->s.dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc); |
6374 } else { | |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6375 h->s.dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6376 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6377 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6378 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6379 static void filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6380 MpegEncContext * const s = &h->s; |
5883
c64d94561b19
Fix deblocking filter for field pictures by properly looking for first
heydowns
parents:
5878
diff
changeset
|
6381 int mb_y_firstrow = s->picture_structure == PICT_BOTTOM_FIELD; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6382 int mb_xy, mb_type; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6383 int qp, qp0, qp1, qpc, qpc0, qpc1, qp_thresh; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6384 |
5093
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6385 mb_xy = mb_x + mb_y*s->mb_stride; |
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6386 |
5883
c64d94561b19
Fix deblocking filter for field pictures by properly looking for first
heydowns
parents:
5878
diff
changeset
|
6387 if(mb_x==0 || mb_y==mb_y_firstrow || !s->dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff || |
5093
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6388 (h->deblocking_filter == 2 && (h->slice_table[mb_xy] != h->slice_table[h->top_mb_xy] || |
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6389 h->slice_table[mb_xy] != h->slice_table[mb_xy - 1]))) { |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6390 filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6391 return; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6392 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6393 assert(!FRAME_MBAFF); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6394 |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6395 mb_type = s->current_picture.mb_type[mb_xy]; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6396 qp = s->current_picture.qscale_table[mb_xy]; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6397 qp0 = s->current_picture.qscale_table[mb_xy-1]; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6398 qp1 = s->current_picture.qscale_table[h->top_mb_xy]; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6399 qpc = get_chroma_qp( h, 0, qp ); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6400 qpc0 = get_chroma_qp( h, 0, qp0 ); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6401 qpc1 = get_chroma_qp( h, 0, qp1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6402 qp0 = (qp + qp0 + 1) >> 1; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6403 qp1 = (qp + qp1 + 1) >> 1; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6404 qpc0 = (qpc + qpc0 + 1) >> 1; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6405 qpc1 = (qpc + qpc1 + 1) >> 1; |
3651 | 6406 qp_thresh = 15 - h->slice_alpha_c0_offset; |
6407 if(qp <= qp_thresh && qp0 <= qp_thresh && qp1 <= qp_thresh && | |
6408 qpc <= qp_thresh && qpc0 <= qp_thresh && qpc1 <= qp_thresh) | |
6409 return; | |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6410 |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6411 if( IS_INTRA(mb_type) ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6412 int16_t bS4[4] = {4,4,4,4}; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6413 int16_t bS3[4] = {3,3,3,3}; |
5797 | 6414 int16_t *bSH = FIELD_PICTURE ? bS3 : bS4; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6415 if( IS_8x8DCT(mb_type) ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6416 filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6417 filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp ); |
5797 | 6418 filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6419 filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6420 } else { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6421 filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6422 filter_mb_edgev( h, &img_y[4*1], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6423 filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6424 filter_mb_edgev( h, &img_y[4*3], linesize, bS3, qp ); |
5797 | 6425 filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6426 filter_mb_edgeh( h, &img_y[4*1*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6427 filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6428 filter_mb_edgeh( h, &img_y[4*3*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6429 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6430 filter_mb_edgecv( h, &img_cb[2*0], uvlinesize, bS4, qpc0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6431 filter_mb_edgecv( h, &img_cb[2*2], uvlinesize, bS3, qpc ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6432 filter_mb_edgecv( h, &img_cr[2*0], uvlinesize, bS4, qpc0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6433 filter_mb_edgecv( h, &img_cr[2*2], uvlinesize, bS3, qpc ); |
5797 | 6434 filter_mb_edgech( h, &img_cb[2*0*uvlinesize], uvlinesize, bSH, qpc1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6435 filter_mb_edgech( h, &img_cb[2*2*uvlinesize], uvlinesize, bS3, qpc ); |
5797 | 6436 filter_mb_edgech( h, &img_cr[2*0*uvlinesize], uvlinesize, bSH, qpc1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6437 filter_mb_edgech( h, &img_cr[2*2*uvlinesize], uvlinesize, bS3, qpc ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6438 return; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6439 } else { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6440 DECLARE_ALIGNED_8(int16_t, bS[2][4][4]); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6441 uint64_t (*bSv)[4] = (uint64_t(*)[4])bS; |
3651 | 6442 int edges; |
6443 if( IS_8x8DCT(mb_type) && (h->cbp&7) == 7 ) { | |
6444 edges = 4; | |
6445 bSv[0][0] = bSv[0][2] = bSv[1][0] = bSv[1][2] = 0x0002000200020002ULL; | |
6446 } else { | |
6447 int mask_edge1 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : | |
6448 (mb_type & MB_TYPE_16x8) ? 1 : 0; | |
6449 int mask_edge0 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) | |
6450 && (s->current_picture.mb_type[mb_xy-1] & (MB_TYPE_16x16 | MB_TYPE_8x16)) | |
6451 ? 3 : 0; | |
6452 int step = IS_8x8DCT(mb_type) ? 2 : 1; | |
6453 edges = (mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4; | |
6454 s->dsp.h264_loop_filter_strength( bS, h->non_zero_count_cache, h->ref_cache, h->mv_cache, | |
6455 (h->slice_type == B_TYPE), edges, step, mask_edge0, mask_edge1 ); | |
6456 } | |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6457 if( IS_INTRA(s->current_picture.mb_type[mb_xy-1]) ) |
5822
b49be74d387c
Fix mix-up of values in r10690 (deblocking for PAFF).
cehoyos
parents:
5815
diff
changeset
|
6458 bSv[0][0] = 0x0004000400040004ULL; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6459 if( IS_INTRA(s->current_picture.mb_type[h->top_mb_xy]) ) |
5822
b49be74d387c
Fix mix-up of values in r10690 (deblocking for PAFF).
cehoyos
parents:
5815
diff
changeset
|
6460 bSv[1][0] = FIELD_PICTURE ? 0x0003000300030003ULL : 0x0004000400040004ULL; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6461 |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6462 #define FILTER(hv,dir,edge)\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6463 if(bSv[dir][edge]) {\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6464 filter_mb_edge##hv( h, &img_y[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qp : qp##dir );\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6465 if(!(edge&1)) {\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6466 filter_mb_edgec##hv( h, &img_cb[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6467 filter_mb_edgec##hv( h, &img_cr[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6468 }\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6469 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6470 if( edges == 1 ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6471 FILTER(v,0,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6472 FILTER(h,1,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6473 } else if( IS_8x8DCT(mb_type) ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6474 FILTER(v,0,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6475 FILTER(v,0,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6476 FILTER(h,1,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6477 FILTER(h,1,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6478 } else { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6479 FILTER(v,0,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6480 FILTER(v,0,1); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6481 FILTER(v,0,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6482 FILTER(v,0,3); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6483 FILTER(h,1,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6484 FILTER(h,1,1); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6485 FILTER(h,1,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6486 FILTER(h,1,3); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6487 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6488 #undef FILTER |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6489 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6490 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6491 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6492 static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6493 MpegEncContext * const s = &h->s; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6494 const int mb_xy= mb_x + mb_y*s->mb_stride; |
3316 | 6495 const int mb_type = s->current_picture.mb_type[mb_xy]; |
6496 const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4; | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6497 int first_vertical_edge_done = 0; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6498 int dir; |
2629
202cd69d8d2e
fix ref comparison in B-frame deblocker ('unused' and 'unavailable' were treated as different)
lorenm
parents:
2628
diff
changeset
|
6499 /* FIXME: A given frame may occupy more than one position in |
202cd69d8d2e
fix ref comparison in B-frame deblocker ('unused' and 'unavailable' were treated as different)
lorenm
parents:
2628
diff
changeset
|
6500 * the reference list. So ref2frm should be populated with |
202cd69d8d2e
fix ref comparison in B-frame deblocker ('unused' and 'unavailable' were treated as different)
lorenm
parents:
2628
diff
changeset
|
6501 * frame numbers, not indices. */ |
3316 | 6502 static const int ref2frm[34] = {-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, |
6503 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; | |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6504 |
3101 | 6505 //for sufficiently low qp, filtering wouldn't do anything |
6506 //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp | |
3316 | 6507 if(!FRAME_MBAFF){ |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6508 int qp_thresh = 15 - h->slice_alpha_c0_offset - FFMAX(0, FFMAX(h->pps.chroma_qp_index_offset[0], h->pps.chroma_qp_index_offset[1])); |
3101 | 6509 int qp = s->current_picture.qscale_table[mb_xy]; |
6510 if(qp <= qp_thresh | |
6511 && (mb_x == 0 || ((qp + s->current_picture.qscale_table[mb_xy-1] + 1)>>1) <= qp_thresh) | |
6512 && (mb_y == 0 || ((qp + s->current_picture.qscale_table[h->top_mb_xy] + 1)>>1) <= qp_thresh)){ | |
6513 return; | |
6514 } | |
6515 } | |
6516 | |
3316 | 6517 if (FRAME_MBAFF |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6518 // left mb is in picture |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6519 && h->slice_table[mb_xy-1] != 255 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6520 // and current and left pair do not have the same interlaced type |
3316 | 6521 && (IS_INTERLACED(mb_type) != IS_INTERLACED(s->current_picture.mb_type[mb_xy-1])) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6522 // and left mb is in the same slice if deblocking_filter == 2 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6523 && (h->deblocking_filter!=2 || h->slice_table[mb_xy-1] == h->slice_table[mb_xy])) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6524 /* First vertical edge is different in MBAFF frames |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
6525 * There are 8 different bS to compute and 2 different Qp |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6526 */ |
3316 | 6527 const int pair_xy = mb_x + (mb_y&~1)*s->mb_stride; |
6528 const int left_mb_xy[2] = { pair_xy-1, pair_xy-1+s->mb_stride }; | |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6529 int16_t bS[8]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6530 int qp[2]; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6531 int bqp[2]; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6532 int rqp[2]; |
3316 | 6533 int mb_qp, mbn0_qp, mbn1_qp; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6534 int i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6535 first_vertical_edge_done = 1; |
3316 | 6536 |
6537 if( IS_INTRA(mb_type) ) | |
6538 bS[0] = bS[1] = bS[2] = bS[3] = bS[4] = bS[5] = bS[6] = bS[7] = 4; | |
6539 else { | |
6540 for( i = 0; i < 8; i++ ) { | |
6541 int mbn_xy = MB_FIELD ? left_mb_xy[i>>2] : left_mb_xy[i&1]; | |
6542 | |
6543 if( IS_INTRA( s->current_picture.mb_type[mbn_xy] ) ) | |
6544 bS[i] = 4; | |
6545 else if( h->non_zero_count_cache[12+8*(i>>1)] != 0 || | |
6546 /* FIXME: with 8x8dct + cavlc, should check cbp instead of nnz */ | |
6547 h->non_zero_count[mbn_xy][MB_FIELD ? i&3 : (i>>2)+(mb_y&1)*2] ) | |
6548 bS[i] = 2; | |
6549 else | |
6550 bS[i] = 1; | |
6551 } | |
6552 } | |
6553 | |
6554 mb_qp = s->current_picture.qscale_table[mb_xy]; | |
6555 mbn0_qp = s->current_picture.qscale_table[left_mb_xy[0]]; | |
6556 mbn1_qp = s->current_picture.qscale_table[left_mb_xy[1]]; | |
6557 qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6558 bqp[0] = ( get_chroma_qp( h, 0, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6559 get_chroma_qp( h, 0, mbn0_qp ) + 1 ) >> 1; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6560 rqp[0] = ( get_chroma_qp( h, 1, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6561 get_chroma_qp( h, 1, mbn0_qp ) + 1 ) >> 1; |
3316 | 6562 qp[1] = ( mb_qp + mbn1_qp + 1 ) >> 1; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6563 bqp[1] = ( get_chroma_qp( h, 0, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6564 get_chroma_qp( h, 0, mbn1_qp ) + 1 ) >> 1; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6565 rqp[1] = ( get_chroma_qp( h, 1, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6566 get_chroma_qp( h, 1, mbn1_qp ) + 1 ) >> 1; |
3316 | 6567 |
6568 /* Filter edge */ | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6569 tprintf(s->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize); |
4600 | 6570 { int i; for (i = 0; i < 8; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } |
3316 | 6571 filter_mb_mbaff_edgev ( h, &img_y [0], linesize, bS, qp ); |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6572 filter_mb_mbaff_edgecv( h, &img_cb[0], uvlinesize, bS, bqp ); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6573 filter_mb_mbaff_edgecv( h, &img_cr[0], uvlinesize, bS, rqp ); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6574 } |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6575 /* dir : 0 -> vertical edge, 1 -> horizontal edge */ |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6576 for( dir = 0; dir < 2; dir++ ) |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6577 { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6578 int edge; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6579 const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy; |
2924 | 6580 const int mbm_type = s->current_picture.mb_type[mbm_xy]; |
2454 | 6581 int start = h->slice_table[mbm_xy] == 255 ? 1 : 0; |
6582 | |
3101 | 6583 const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP)) |
6584 == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4; | |
2926 | 6585 // how often to recheck mv-based bS when iterating between edges |
6586 const int mask_edge = (mb_type & (MB_TYPE_16x16 | (MB_TYPE_16x8 << dir))) ? 3 : | |
6587 (mb_type & (MB_TYPE_8x16 >> dir)) ? 1 : 0; | |
6588 // how often to recheck mv-based bS when iterating along each edge | |
6589 const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)); | |
6590 | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6591 if (first_vertical_edge_done) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6592 start = 1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6593 first_vertical_edge_done = 0; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6594 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6595 |
2454 | 6596 if (h->deblocking_filter==2 && h->slice_table[mbm_xy] != h->slice_table[mb_xy]) |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6597 start = 1; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6598 |
3316 | 6599 if (FRAME_MBAFF && (dir == 1) && ((mb_y&1) == 0) && start == 0 |
6600 && !IS_INTERLACED(mb_type) | |
6601 && IS_INTERLACED(mbm_type) | |
6602 ) { | |
6603 // This is a special case in the norm where the filtering must | |
6604 // be done twice (one each of the field) even if we are in a | |
6605 // frame macroblock. | |
6606 // | |
6607 static const int nnz_idx[4] = {4,5,6,3}; | |
6608 unsigned int tmp_linesize = 2 * linesize; | |
6609 unsigned int tmp_uvlinesize = 2 * uvlinesize; | |
6610 int mbn_xy = mb_xy - 2 * s->mb_stride; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6611 int qp; |
3316 | 6612 int i, j; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6613 int16_t bS[4]; |
3316 | 6614 |
6615 for(j=0; j<2; j++, mbn_xy += s->mb_stride){ | |
6616 if( IS_INTRA(mb_type) || | |
6617 IS_INTRA(s->current_picture.mb_type[mbn_xy]) ) { | |
6618 bS[0] = bS[1] = bS[2] = bS[3] = 3; | |
6619 } else { | |
6620 const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy]; | |
6621 for( i = 0; i < 4; i++ ) { | |
6622 if( h->non_zero_count_cache[scan8[0]+i] != 0 || | |
6623 mbn_nnz[nnz_idx[i]] != 0 ) | |
6624 bS[i] = 2; | |
6625 else | |
6626 bS[i] = 1; | |
6627 } | |
6628 } | |
6629 // Do not use s->qscale as luma quantizer because it has not the same | |
6630 // value in IPCM macroblocks. | |
6631 qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1; | |
4600 | 6632 tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize); |
6633 { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } | |
3316 | 6634 filter_mb_edgeh( h, &img_y[j*linesize], tmp_linesize, bS, qp ); |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6635 filter_mb_edgech( h, &img_cb[j*uvlinesize], tmp_uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6636 ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6637 filter_mb_edgech( h, &img_cr[j*uvlinesize], tmp_uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6638 ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
3316 | 6639 } |
6640 | |
6641 start = 1; | |
6642 } | |
6643 | |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6644 /* Calculate bS */ |
2924 | 6645 for( edge = start; edge < edges; edge++ ) { |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
6646 /* mbn_xy: neighbor macroblock */ |
2924 | 6647 const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; |
6648 const int mbn_type = s->current_picture.mb_type[mbn_xy]; | |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6649 int16_t bS[4]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6650 int qp; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6651 |
2924 | 6652 if( (edge&1) && IS_8x8DCT(mb_type) ) |
2755 | 6653 continue; |
6654 | |
2924 | 6655 if( IS_INTRA(mb_type) || |
6656 IS_INTRA(mbn_type) ) { | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6657 int value; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6658 if (edge == 0) { |
2924 | 6659 if ( (!IS_INTERLACED(mb_type) && !IS_INTERLACED(mbm_type)) |
3316 | 6660 || ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0)) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6661 ) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6662 value = 4; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6663 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6664 value = 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6665 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6666 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6667 value = 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6668 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6669 bS[0] = bS[1] = bS[2] = bS[3] = value; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6670 } else { |
2924 | 6671 int i, l; |
6672 int mv_done; | |
6673 | |
6674 if( edge & mask_edge ) { | |
6675 bS[0] = bS[1] = bS[2] = bS[3] = 0; | |
6676 mv_done = 1; | |
6677 } | |
3316 | 6678 else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) { |
6679 bS[0] = bS[1] = bS[2] = bS[3] = 1; | |
6680 mv_done = 1; | |
6681 } | |
2924 | 6682 else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { |
6683 int b_idx= 8 + 4 + edge * (dir ? 8:1); | |
6684 int bn_idx= b_idx - (dir ? 8:1); | |
6685 int v = 0; | |
6686 for( l = 0; !v && l < 1 + (h->slice_type == B_TYPE); l++ ) { | |
6687 v |= ref2frm[h->ref_cache[l][b_idx]+2] != ref2frm[h->ref_cache[l][bn_idx]+2] || | |
4001 | 6688 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
6689 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit; | |
2924 | 6690 } |
6691 bS[0] = bS[1] = bS[2] = bS[3] = v; | |
6692 mv_done = 1; | |
6693 } | |
6694 else | |
6695 mv_done = 0; | |
6696 | |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6697 for( i = 0; i < 4; i++ ) { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6698 int x = dir == 0 ? edge : i; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6699 int y = dir == 0 ? i : edge; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6700 int b_idx= 8 + 4 + x + 8*y; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6701 int bn_idx= b_idx - (dir ? 8:1); |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6702 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6703 if( h->non_zero_count_cache[b_idx] != 0 || |
2449 | 6704 h->non_zero_count_cache[bn_idx] != 0 ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6705 bS[i] = 2; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6706 } |
2924 | 6707 else if(!mv_done) |
2523 | 6708 { |
6709 bS[i] = 0; | |
6710 for( l = 0; l < 1 + (h->slice_type == B_TYPE); l++ ) { | |
2629
202cd69d8d2e
fix ref comparison in B-frame deblocker ('unused' and 'unavailable' were treated as different)
lorenm
parents:
2628
diff
changeset
|
6711 if( ref2frm[h->ref_cache[l][b_idx]+2] != ref2frm[h->ref_cache[l][bn_idx]+2] || |
4001 | 6712 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
6713 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) { | |
2523 | 6714 bS[i] = 1; |
6715 break; | |
6716 } | |
6717 } | |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6718 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6719 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6720 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6721 if(bS[0]+bS[1]+bS[2]+bS[3] == 0) |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6722 continue; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6723 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6724 |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6725 /* Filter edge */ |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
6726 // Do not use s->qscale as luma quantizer because it has not the same |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
6727 // value in IPCM macroblocks. |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
6728 qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1; |
4600 | 6729 //tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp, s->current_picture.qscale_table[mbn_xy]); |
6730 tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); | |
6731 { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } | |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6732 if( dir == 0 ) { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6733 filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp ); |
1898 | 6734 if( (edge&1) == 0 ) { |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6735 filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6736 ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6737 filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6738 ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6739 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6740 } else { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6741 filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp ); |
1898 | 6742 if( (edge&1) == 0 ) { |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6743 filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6744 ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6745 filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6746 ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6747 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6748 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6749 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6750 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6751 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6752 |
5642 | 6753 static int decode_slice(struct AVCodecContext *avctx, H264Context *h){ |
1168 | 6754 MpegEncContext * const s = &h->s; |
6755 const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F; | |
6756 | |
6757 s->mb_skip_run= -1; | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6758 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6759 if( h->pps.cabac ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6760 int i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6761 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6762 /* realign */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6763 align_get_bits( &s->gb ); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6764 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6765 /* init cabac */ |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
6766 ff_init_cabac_states( &h->cabac); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6767 ff_init_cabac_decoder( &h->cabac, |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6768 s->gb.buffer + get_bits_count(&s->gb)/8, |
2116 | 6769 ( s->gb.size_in_bits - get_bits_count(&s->gb) + 7)/8); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6770 /* calculate pre-state */ |
2755 | 6771 for( i= 0; i < 460; i++ ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6772 int pre; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6773 if( h->slice_type == I_TYPE ) |
4594 | 6774 pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6775 else |
4594 | 6776 pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6777 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6778 if( pre <= 63 ) |
3976
27e90123b346
reverse remainder of the failed attempt to optimize *state=c->mps_state[s]
michael
parents:
3972
diff
changeset
|
6779 h->cabac_state[i] = 2 * ( 63 - pre ) + 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6780 else |
3976
27e90123b346
reverse remainder of the failed attempt to optimize *state=c->mps_state[s]
michael
parents:
3972
diff
changeset
|
6781 h->cabac_state[i] = 2 * ( pre - 64 ) + 1; |
1168 | 6782 } |
6783 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6784 for(;;){ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
6785 //START_TIMER |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6786 int ret = decode_mb_cabac(h); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6787 int eos; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
6788 //STOP_TIMER("decode_mb_cabac") |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6789 |
2163 | 6790 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6791 |
3316 | 6792 if( ret >= 0 && FRAME_MBAFF ) { //FIXME optimal? or let mb_decode decode 16x32 ? |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6793 s->mb_y++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6794 |
2163 | 6795 if(ret>=0) ret = decode_mb_cabac(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6796 |
2844
5f20ab245501
prevent assert failures and infinite loops with broken streams
michael
parents:
2834
diff
changeset
|
6797 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6798 s->mb_y--; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6799 } |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6800 eos = get_cabac_terminate( &h->cabac ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6801 |
3948
3edbf131ee44
refill cabac variables in 16bit steps, 3% faster get_cabac()
michael
parents:
3947
diff
changeset
|
6802 if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { |
5153 | 6803 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", s->mb_x, s->mb_y, h->cabac.bytestream_end - h->cabac.bytestream); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6804 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6805 return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6806 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6807 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6808 if( ++s->mb_x >= s->mb_width ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6809 s->mb_x = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6810 ff_draw_horiz_band(s, 16*s->mb_y, 16); |
2392 | 6811 ++s->mb_y; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
6812 if(FIELD_OR_MBAFF_PICTURE) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6813 ++s->mb_y; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6814 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6815 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6816 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6817 if( eos || s->mb_y >= s->mb_height ) { |
4600 | 6818 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6819 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6820 return 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6821 } |
1168 | 6822 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6823 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6824 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6825 for(;;){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6826 int ret = decode_mb_cavlc(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6827 |
2163 | 6828 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6829 |
3316 | 6830 if(ret>=0 && FRAME_MBAFF){ //FIXME optimal? or let mb_decode decode 16x32 ? |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6831 s->mb_y++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6832 ret = decode_mb_cavlc(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6833 |
2163 | 6834 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6835 s->mb_y--; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6836 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6837 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6838 if(ret<0){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6839 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6840 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6841 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6842 return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6843 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6844 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6845 if(++s->mb_x >= s->mb_width){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6846 s->mb_x=0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6847 ff_draw_horiz_band(s, 16*s->mb_y, 16); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6848 ++s->mb_y; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
6849 if(FIELD_OR_MBAFF_PICTURE) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6850 ++s->mb_y; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6851 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6852 if(s->mb_y >= s->mb_height){ |
4600 | 6853 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6854 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6855 if(get_bits_count(&s->gb) == s->gb.size_in_bits ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6856 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6857 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6858 return 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6859 }else{ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6860 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6861 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6862 return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6863 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6864 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6865 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6866 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6867 if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){ |
4600 | 6868 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6869 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){ |
1168 | 6870 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); |
6871 | |
6872 return 0; | |
6873 }else{ | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6874 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); |
1168 | 6875 |
6876 return -1; | |
6877 } | |
6878 } | |
6879 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6880 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6881 |
1168 | 6882 #if 0 |
6883 for(;s->mb_y < s->mb_height; s->mb_y++){ | |
6884 for(;s->mb_x < s->mb_width; s->mb_x++){ | |
6885 int ret= decode_mb(h); | |
2967 | 6886 |
1168 | 6887 hl_decode_mb(h); |
6888 | |
6889 if(ret<0){ | |
3177 | 6890 av_log(s->avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); |
1168 | 6891 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); |
6892 | |
6893 return -1; | |
6894 } | |
2967 | 6895 |
1168 | 6896 if(++s->mb_x >= s->mb_width){ |
6897 s->mb_x=0; | |
6898 if(++s->mb_y >= s->mb_height){ | |
6899 if(get_bits_count(s->gb) == s->gb.size_in_bits){ | |
6900 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); | |
6901 | |
6902 return 0; | |
6903 }else{ | |
6904 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); | |
6905 | |
6906 return -1; | |
6907 } | |
6908 } | |
6909 } | |
2967 | 6910 |
1168 | 6911 if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){ |
6912 if(get_bits_count(s->gb) == s->gb.size_in_bits){ | |
6913 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); | |
6914 | |
6915 return 0; | |
6916 }else{ | |
6917 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); | |
6918 | |
6919 return -1; | |
6920 } | |
6921 } | |
6922 } | |
6923 s->mb_x=0; | |
6924 ff_draw_horiz_band(s, 16*s->mb_y, 16); | |
6925 } | |
6926 #endif | |
6927 return -1; //not reached | |
6928 } | |
6929 | |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6930 static int decode_unregistered_user_data(H264Context *h, int size){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6931 MpegEncContext * const s = &h->s; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6932 uint8_t user_data[16+256]; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6933 int e, build, i; |
2967 | 6934 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6935 if(size<16) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6936 return -1; |
2967 | 6937 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6938 for(i=0; i<sizeof(user_data)-1 && i<size; i++){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6939 user_data[i]= get_bits(&s->gb, 8); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6940 } |
2967 | 6941 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6942 user_data[i]= 0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6943 e= sscanf(user_data+16, "x264 - core %d"/*%s - H.264/MPEG-4 AVC codec - Copyleft 2005 - http://www.videolan.org/x264.html*/, &build); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6944 if(e==1 && build>=0) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6945 h->x264_build= build; |
2967 | 6946 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6947 if(s->avctx->debug & FF_DEBUG_BUGS) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6948 av_log(s->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data+16); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6949 |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6950 for(; i<size; i++) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6951 skip_bits(&s->gb, 8); |
2967 | 6952 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6953 return 0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6954 } |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6955 |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6956 static int decode_sei(H264Context *h){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6957 MpegEncContext * const s = &h->s; |
2967 | 6958 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6959 while(get_bits_count(&s->gb) + 16 < s->gb.size_in_bits){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6960 int size, type; |
2967 | 6961 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6962 type=0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6963 do{ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6964 type+= show_bits(&s->gb, 8); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6965 }while(get_bits(&s->gb, 8) == 255); |
2967 | 6966 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6967 size=0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6968 do{ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6969 size+= show_bits(&s->gb, 8); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6970 }while(get_bits(&s->gb, 8) == 255); |
2967 | 6971 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6972 switch(type){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6973 case 5: |
3318 | 6974 if(decode_unregistered_user_data(h, size) < 0) |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6975 return -1; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6976 break; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6977 default: |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6978 skip_bits(&s->gb, 8*size); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6979 } |
2967 | 6980 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6981 //FIXME check bits here |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6982 align_get_bits(&s->gb); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6983 } |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6984 |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6985 return 0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6986 } |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6987 |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6988 static inline void decode_hrd_parameters(H264Context *h, SPS *sps){ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6989 MpegEncContext * const s = &h->s; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6990 int cpb_count, i; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6991 cpb_count = get_ue_golomb(&s->gb) + 1; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6992 get_bits(&s->gb, 4); /* bit_rate_scale */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6993 get_bits(&s->gb, 4); /* cpb_size_scale */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6994 for(i=0; i<cpb_count; i++){ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6995 get_ue_golomb(&s->gb); /* bit_rate_value_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6996 get_ue_golomb(&s->gb); /* cpb_size_value_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6997 get_bits1(&s->gb); /* cbr_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6998 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6999 get_bits(&s->gb, 5); /* initial_cpb_removal_delay_length_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7000 get_bits(&s->gb, 5); /* cpb_removal_delay_length_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7001 get_bits(&s->gb, 5); /* dpb_output_delay_length_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7002 get_bits(&s->gb, 5); /* time_offset_length */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7003 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7004 |
1168 | 7005 static inline int decode_vui_parameters(H264Context *h, SPS *sps){ |
7006 MpegEncContext * const s = &h->s; | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7007 int aspect_ratio_info_present_flag; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7008 unsigned int aspect_ratio_idc; |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7009 int nal_hrd_parameters_present_flag, vcl_hrd_parameters_present_flag; |
1168 | 7010 |
7011 aspect_ratio_info_present_flag= get_bits1(&s->gb); | |
2967 | 7012 |
1168 | 7013 if( aspect_ratio_info_present_flag ) { |
7014 aspect_ratio_idc= get_bits(&s->gb, 8); | |
7015 if( aspect_ratio_idc == EXTENDED_SAR ) { | |
1548 | 7016 sps->sar.num= get_bits(&s->gb, 16); |
7017 sps->sar.den= get_bits(&s->gb, 16); | |
3196
15157293beea
fixing coverity warnig CID: 253 (reading over the end of the aspect_ratio array for illegal aspect ratios)
michael
parents:
3178
diff
changeset
|
7018 }else if(aspect_ratio_idc < 14){ |
1548 | 7019 sps->sar= pixel_aspect[aspect_ratio_idc]; |
1168 | 7020 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7021 av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n"); |
1168 | 7022 return -1; |
7023 } | |
7024 }else{ | |
2967 | 7025 sps->sar.num= |
1548 | 7026 sps->sar.den= 0; |
1168 | 7027 } |
7028 // s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height); | |
2174
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7029 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7030 if(get_bits1(&s->gb)){ /* overscan_info_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7031 get_bits1(&s->gb); /* overscan_appropriate_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7032 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7033 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7034 if(get_bits1(&s->gb)){ /* video_signal_type_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7035 get_bits(&s->gb, 3); /* video_format */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7036 get_bits1(&s->gb); /* video_full_range_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7037 if(get_bits1(&s->gb)){ /* colour_description_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7038 get_bits(&s->gb, 8); /* colour_primaries */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7039 get_bits(&s->gb, 8); /* transfer_characteristics */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7040 get_bits(&s->gb, 8); /* matrix_coefficients */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7041 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7042 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7043 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7044 if(get_bits1(&s->gb)){ /* chroma_location_info_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7045 get_ue_golomb(&s->gb); /* chroma_sample_location_type_top_field */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7046 get_ue_golomb(&s->gb); /* chroma_sample_location_type_bottom_field */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7047 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7048 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7049 sps->timing_info_present_flag = get_bits1(&s->gb); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7050 if(sps->timing_info_present_flag){ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7051 sps->num_units_in_tick = get_bits_long(&s->gb, 32); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7052 sps->time_scale = get_bits_long(&s->gb, 32); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7053 sps->fixed_frame_rate_flag = get_bits1(&s->gb); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7054 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
7055 |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7056 nal_hrd_parameters_present_flag = get_bits1(&s->gb); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7057 if(nal_hrd_parameters_present_flag) |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7058 decode_hrd_parameters(h, sps); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7059 vcl_hrd_parameters_present_flag = get_bits1(&s->gb); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7060 if(vcl_hrd_parameters_present_flag) |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7061 decode_hrd_parameters(h, sps); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7062 if(nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7063 get_bits1(&s->gb); /* low_delay_hrd_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7064 get_bits1(&s->gb); /* pic_struct_present_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7065 |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7066 sps->bitstream_restriction_flag = get_bits1(&s->gb); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7067 if(sps->bitstream_restriction_flag){ |
4389 | 7068 unsigned int num_reorder_frames; |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7069 get_bits1(&s->gb); /* motion_vectors_over_pic_boundaries_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7070 get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7071 get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7072 get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7073 get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */ |
4389 | 7074 num_reorder_frames= get_ue_golomb(&s->gb); |
7075 get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/ | |
7076 | |
7077 if(num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){ | |
7078 av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", num_reorder_frames); | |
7079 return -1; | |
7080 } | |
7081 | |
7082 sps->num_reorder_frames= num_reorder_frames; | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7083 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
7084 |
1168 | 7085 return 0; |
7086 } | |
7087 | |
3004 | 7088 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size, |
7089 const uint8_t *jvt_list, const uint8_t *fallback_list){ | |
2919 | 7090 MpegEncContext * const s = &h->s; |
7091 int i, last = 8, next = 8; | |
7092 const uint8_t *scan = size == 16 ? zigzag_scan : zigzag_scan8x8; | |
3004 | 7093 if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */ |
7094 memcpy(factors, fallback_list, size*sizeof(uint8_t)); | |
2919 | 7095 else |
7096 for(i=0;i<size;i++){ | |
7097 if(next) | |
7098 next = (last + get_se_golomb(&s->gb)) & 0xff; | |
3004 | 7099 if(!i && !next){ /* matrix not written, we use the preset one */ |
7100 memcpy(factors, jvt_list, size*sizeof(uint8_t)); | |
2919 | 7101 break; |
7102 } | |
7103 last = factors[scan[i]] = next ? next : last; | |
7104 } | |
7105 } | |
7106 | |
7107 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps, | |
7108 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){ | |
7109 MpegEncContext * const s = &h->s; | |
7110 int fallback_sps = !is_sps && sps->scaling_matrix_present; | |
7111 const uint8_t *fallback[4] = { | |
7112 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], | |
7113 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1], | |
7114 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], | |
7115 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1] | |
7116 }; | |
7117 if(get_bits1(&s->gb)){ | |
7118 sps->scaling_matrix_present |= is_sps; | |
3004 | 7119 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y |
7120 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr | |
7121 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb | |
7122 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y | |
7123 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr | |
7124 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb | |
2919 | 7125 if(is_sps || pps->transform_8x8_mode){ |
3004 | 7126 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y |
7127 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y | |
2919 | 7128 } |
7129 } else if(fallback_sps) { | |
7130 memcpy(scaling_matrix4, sps->scaling_matrix4, 6*16*sizeof(uint8_t)); | |
7131 memcpy(scaling_matrix8, sps->scaling_matrix8, 2*64*sizeof(uint8_t)); | |
7132 } | |
7133 } | |
7134 | |
5079 | 7135 /** |
7136 * Returns and optionally allocates SPS / PPS structures in the supplied array 'vec' | |
7137 */ | |
7138 static void * | |
7139 alloc_parameter_set(H264Context *h, void **vec, const unsigned int id, const unsigned int max, | |
7140 const size_t size, const char *name) | |
7141 { | |
7142 if(id>=max) { | |
7143 av_log(h->s.avctx, AV_LOG_ERROR, "%s_id (%d) out of range\n", name, id); | |
7144 return NULL; | |
7145 } | |
7146 | |
7147 if(!vec[id]) { | |
7148 vec[id] = av_mallocz(size); | |
7149 if(vec[id] == NULL) | |
7150 av_log(h->s.avctx, AV_LOG_ERROR, "cannot allocate memory for %s\n", name); | |
7151 } | |
7152 return vec[id]; | |
7153 } | |
7154 | |
1168 | 7155 static inline int decode_seq_parameter_set(H264Context *h){ |
7156 MpegEncContext * const s = &h->s; | |
1371 | 7157 int profile_idc, level_idc; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7158 unsigned int sps_id, tmp, mb_width, mb_height; |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7159 int i; |
1168 | 7160 SPS *sps; |
2967 | 7161 |
1168 | 7162 profile_idc= get_bits(&s->gb, 8); |
1371 | 7163 get_bits1(&s->gb); //constraint_set0_flag |
7164 get_bits1(&s->gb); //constraint_set1_flag | |
7165 get_bits1(&s->gb); //constraint_set2_flag | |
2312 | 7166 get_bits1(&s->gb); //constraint_set3_flag |
7167 get_bits(&s->gb, 4); // reserved | |
1168 | 7168 level_idc= get_bits(&s->gb, 8); |
7169 sps_id= get_ue_golomb(&s->gb); | |
2967 | 7170 |
5079 | 7171 sps = alloc_parameter_set(h, (void **)h->sps_buffers, sps_id, MAX_SPS_COUNT, sizeof(SPS), "sps"); |
7172 if(sps == NULL) | |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7173 return -1; |
5079 | 7174 |
1168 | 7175 sps->profile_idc= profile_idc; |
7176 sps->level_idc= level_idc; | |
2312 | 7177 |
2755 | 7178 if(sps->profile_idc >= 100){ //high profile |
7179 if(get_ue_golomb(&s->gb) == 3) //chroma_format_idc | |
7180 get_bits1(&s->gb); //residual_color_transform_flag | |
7181 get_ue_golomb(&s->gb); //bit_depth_luma_minus8 | |
7182 get_ue_golomb(&s->gb); //bit_depth_chroma_minus8 | |
2763 | 7183 sps->transform_bypass = get_bits1(&s->gb); |
2919 | 7184 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8); |
7185 }else | |
7186 sps->scaling_matrix_present = 0; | |
2755 | 7187 |
1168 | 7188 sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4; |
7189 sps->poc_type= get_ue_golomb(&s->gb); | |
2967 | 7190 |
1168 | 7191 if(sps->poc_type == 0){ //FIXME #define |
7192 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4; | |
7193 } else if(sps->poc_type == 1){//FIXME #define | |
7194 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb); | |
7195 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb); | |
7196 sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb); | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7197 tmp= get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7198 |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7199 if(tmp >= sizeof(sps->offset_for_ref_frame) / sizeof(sps->offset_for_ref_frame[0])){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7200 av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", tmp); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7201 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7202 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7203 sps->poc_cycle_length= tmp; |
2967 | 7204 |
1168 | 7205 for(i=0; i<sps->poc_cycle_length; i++) |
7206 sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb); | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7207 }else if(sps->poc_type != 2){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7208 av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type); |
1168 | 7209 return -1; |
7210 } | |
7211 | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7212 tmp= get_ue_golomb(&s->gb); |
6017
e1404acccac3
Actually return with an error condition if we're being asked to deal with too
heydowns
parents:
6016
diff
changeset
|
7213 if(tmp > MAX_PICTURE_COUNT-2 || tmp >= 32){ |
2254
0dfe4e32b19c
H.264 max reference pictures fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2227
diff
changeset
|
7214 av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n"); |
6017
e1404acccac3
Actually return with an error condition if we're being asked to deal with too
heydowns
parents:
6016
diff
changeset
|
7215 return -1; |
2254
0dfe4e32b19c
H.264 max reference pictures fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2227
diff
changeset
|
7216 } |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7217 sps->ref_frame_count= tmp; |
1371 | 7218 sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7219 mb_width= get_ue_golomb(&s->gb) + 1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7220 mb_height= get_ue_golomb(&s->gb) + 1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7221 if(mb_width >= INT_MAX/16 || mb_height >= INT_MAX/16 || |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7222 avcodec_check_dimensions(NULL, 16*mb_width, 16*mb_height)){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7223 av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n"); |
2422 | 7224 return -1; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7225 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7226 sps->mb_width = mb_width; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7227 sps->mb_height= mb_height; |
2422 | 7228 |
1168 | 7229 sps->frame_mbs_only_flag= get_bits1(&s->gb); |
7230 if(!sps->frame_mbs_only_flag) | |
7231 sps->mb_aff= get_bits1(&s->gb); | |
7232 else | |
7233 sps->mb_aff= 0; | |
7234 | |
7235 sps->direct_8x8_inference_flag= get_bits1(&s->gb); | |
7236 | |
3316 | 7237 #ifndef ALLOW_INTERLACE |
7238 if(sps->mb_aff) | |
3954 | 7239 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n"); |
3316 | 7240 #endif |
7241 if(!sps->direct_8x8_inference_flag && sps->mb_aff) | |
7242 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF + !direct_8x8_inference is not implemented\n"); | |
7243 | |
1371 | 7244 sps->crop= get_bits1(&s->gb); |
7245 if(sps->crop){ | |
7246 sps->crop_left = get_ue_golomb(&s->gb); | |
7247 sps->crop_right = get_ue_golomb(&s->gb); | |
7248 sps->crop_top = get_ue_golomb(&s->gb); | |
7249 sps->crop_bottom= get_ue_golomb(&s->gb); | |
7250 if(sps->crop_left || sps->crop_top){ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
7251 av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n"); |
1371 | 7252 } |
7253 }else{ | |
2967 | 7254 sps->crop_left = |
7255 sps->crop_right = | |
7256 sps->crop_top = | |
1371 | 7257 sps->crop_bottom= 0; |
7258 } | |
7259 | |
1168 | 7260 sps->vui_parameters_present_flag= get_bits1(&s->gb); |
7261 if( sps->vui_parameters_present_flag ) | |
7262 decode_vui_parameters(h, sps); | |
2967 | 7263 |
1168 | 7264 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7265 av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s\n", |
1168 | 7266 sps_id, sps->profile_idc, sps->level_idc, |
7267 sps->poc_type, | |
7268 sps->ref_frame_count, | |
7269 sps->mb_width, sps->mb_height, | |
7270 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"), | |
7271 sps->direct_8x8_inference_flag ? "8B8" : "", | |
2967 | 7272 sps->crop_left, sps->crop_right, |
7273 sps->crop_top, sps->crop_bottom, | |
1168 | 7274 sps->vui_parameters_present_flag ? "VUI" : "" |
7275 ); | |
7276 } | |
7277 return 0; | |
7278 } | |
7279 | |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7280 static void |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7281 build_qp_table(PPS *pps, int t, int index) |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7282 { |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7283 int i; |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7284 for(i = 0; i < 255; i++) |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7285 pps->chroma_qp_table[t][i & 0xff] = chroma_qp[av_clip(i + index, 0, 51)]; |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7286 } |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7287 |
2755 | 7288 static inline int decode_picture_parameter_set(H264Context *h, int bit_length){ |
1168 | 7289 MpegEncContext * const s = &h->s; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7290 unsigned int tmp, pps_id= get_ue_golomb(&s->gb); |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7291 PPS *pps; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7292 |
5079 | 7293 pps = alloc_parameter_set(h, (void **)h->pps_buffers, pps_id, MAX_PPS_COUNT, sizeof(PPS), "pps"); |
7294 if(pps == NULL) | |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7295 return -1; |
2967 | 7296 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7297 tmp= get_ue_golomb(&s->gb); |
5079 | 7298 if(tmp>=MAX_SPS_COUNT || h->sps_buffers[tmp] == NULL){ |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7299 av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7300 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7301 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7302 pps->sps_id= tmp; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7303 |
1168 | 7304 pps->cabac= get_bits1(&s->gb); |
7305 pps->pic_order_present= get_bits1(&s->gb); | |
7306 pps->slice_group_count= get_ue_golomb(&s->gb) + 1; | |
7307 if(pps->slice_group_count > 1 ){ | |
7308 pps->mb_slice_group_map_type= get_ue_golomb(&s->gb); | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7309 av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n"); |
1168 | 7310 switch(pps->mb_slice_group_map_type){ |
7311 case 0: | |
7312 #if 0 | |
7313 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | | | |
7314 | run_length[ i ] |1 |ue(v) | | |
7315 #endif | |
7316 break; | |
7317 case 2: | |
7318 #if 0 | |
7319 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | | | |
7320 |{ | | | | |
7321 | top_left_mb[ i ] |1 |ue(v) | | |
7322 | bottom_right_mb[ i ] |1 |ue(v) | | |
7323 | } | | | | |
7324 #endif | |
7325 break; | |
7326 case 3: | |
7327 case 4: | |
7328 case 5: | |
7329 #if 0 | |
7330 | slice_group_change_direction_flag |1 |u(1) | | |
7331 | slice_group_change_rate_minus1 |1 |ue(v) | | |
7332 #endif | |
7333 break; | |
7334 case 6: | |
7335 #if 0 | |
7336 | slice_group_id_cnt_minus1 |1 |ue(v) | | |
7337 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | | | |
7338 |) | | | | |
7339 | slice_group_id[ i ] |1 |u(v) | | |
7340 #endif | |
1214 | 7341 break; |
1168 | 7342 } |
7343 } | |
7344 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1; | |
7345 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1; | |
4531 | 7346 if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7347 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n"); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7348 pps->ref_count[0]= pps->ref_count[1]= 1; |
1168 | 7349 return -1; |
7350 } | |
2967 | 7351 |
1168 | 7352 pps->weighted_pred= get_bits1(&s->gb); |
7353 pps->weighted_bipred_idc= get_bits(&s->gb, 2); | |
7354 pps->init_qp= get_se_golomb(&s->gb) + 26; | |
7355 pps->init_qs= get_se_golomb(&s->gb) + 26; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7356 pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb); |
1168 | 7357 pps->deblocking_filter_parameters_present= get_bits1(&s->gb); |
7358 pps->constrained_intra_pred= get_bits1(&s->gb); | |
7359 pps->redundant_pic_cnt_present = get_bits1(&s->gb); | |
2967 | 7360 |
3291
454de57e45cf
reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents:
3285
diff
changeset
|
7361 pps->transform_8x8_mode= 0; |
454de57e45cf
reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents:
3285
diff
changeset
|
7362 h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit |
2919 | 7363 memset(pps->scaling_matrix4, 16, 6*16*sizeof(uint8_t)); |
7364 memset(pps->scaling_matrix8, 16, 2*64*sizeof(uint8_t)); | |
2755 | 7365 |
7366 if(get_bits_count(&s->gb) < bit_length){ | |
7367 pps->transform_8x8_mode= get_bits1(&s->gb); | |
5079 | 7368 decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8); |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7369 pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7370 } else { |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7371 pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0]; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7372 } |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7373 |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7374 build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7375 if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1]) { |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7376 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7377 h->pps.chroma_qp_diff= 1; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7378 } else |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7379 memcpy(pps->chroma_qp_table[1], pps->chroma_qp_table[0], 256); |
2967 | 7380 |
1168 | 7381 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7382 av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n", |
1168 | 7383 pps_id, pps->sps_id, |
7384 pps->cabac ? "CABAC" : "CAVLC", | |
7385 pps->slice_group_count, | |
7386 pps->ref_count[0], pps->ref_count[1], | |
7387 pps->weighted_pred ? "weighted" : "", | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7388 pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1], |
1168 | 7389 pps->deblocking_filter_parameters_present ? "LPAR" : "", |
7390 pps->constrained_intra_pred ? "CONSTR" : "", | |
2755 | 7391 pps->redundant_pic_cnt_present ? "REDU" : "", |
7392 pps->transform_8x8_mode ? "8x8DCT" : "" | |
1168 | 7393 ); |
7394 } | |
2967 | 7395 |
1168 | 7396 return 0; |
7397 } | |
7398 | |
5642 | 7399 /** |
7400 * Call decode_slice() for each context. | |
7401 * | |
7402 * @param h h264 master context | |
7403 * @param context_count number of contexts to execute | |
7404 */ | |
7405 static void execute_decode_slices(H264Context *h, int context_count){ | |
7406 MpegEncContext * const s = &h->s; | |
7407 AVCodecContext * const avctx= s->avctx; | |
7408 H264Context *hx; | |
7409 int i; | |
7410 | |
7411 if(context_count == 1) { | |
7412 decode_slice(avctx, h); | |
7413 } else { | |
7414 for(i = 1; i < context_count; i++) { | |
7415 hx = h->thread_context[i]; | |
7416 hx->s.error_resilience = avctx->error_resilience; | |
7417 hx->s.error_count = 0; | |
7418 } | |
7419 | |
7420 avctx->execute(avctx, (void *)decode_slice, | |
7421 (void **)h->thread_context, NULL, context_count); | |
7422 | |
7423 /* pull back stuff from slices to master context */ | |
7424 hx = h->thread_context[context_count - 1]; | |
7425 s->mb_x = hx->s.mb_x; | |
7426 s->mb_y = hx->s.mb_y; | |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7427 s->dropable = hx->s.dropable; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7428 s->picture_structure = hx->s.picture_structure; |
5642 | 7429 for(i = 1; i < context_count; i++) |
7430 h->s.error_count += h->thread_context[i]->s.error_count; | |
7431 } | |
7432 } | |
7433 | |
7434 | |
1168 | 7435 static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){ |
7436 MpegEncContext * const s = &h->s; | |
7437 AVCodecContext * const avctx= s->avctx; | |
7438 int buf_index=0; | |
5642 | 7439 H264Context *hx; ///< thread context |
7440 int context_count = 0; | |
7441 | |
7442 h->max_contexts = avctx->thread_count; | |
1322 | 7443 #if 0 |
1168 | 7444 int i; |
2867
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
7445 for(i=0; i<50; i++){ |
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
7446 av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]); |
1168 | 7447 } |
7448 #endif | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7449 if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){ |
5642 | 7450 h->current_slice = 0; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7451 if (!s->first_field) |
5803 | 7452 s->current_picture_ptr= NULL; |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7453 } |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7454 |
1168 | 7455 for(;;){ |
7456 int consumed; | |
7457 int dst_length; | |
7458 int bit_length; | |
7459 uint8_t *ptr; | |
2227 | 7460 int i, nalsize = 0; |
5642 | 7461 int err; |
2967 | 7462 |
5170 | 7463 if(h->is_avc) { |
7464 if(buf_index >= buf_size) break; | |
7465 nalsize = 0; | |
7466 for(i = 0; i < h->nal_length_size; i++) | |
7467 nalsize = (nalsize << 8) | buf[buf_index++]; | |
7468 if(nalsize <= 1 || (nalsize+buf_index > buf_size)){ | |
7469 if(nalsize == 1){ | |
7470 buf_index++; | |
7471 continue; | |
7472 }else{ | |
7473 av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize); | |
7474 break; | |
7475 } | |
7476 } | |
7477 } else { | |
7478 // start code prefix search | |
7479 for(; buf_index + 3 < buf_size; buf_index++){ | |
7480 // This should always succeed in the first iteration. | |
7481 if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1) | |
7482 break; | |
7483 } | |
7484 | |
7485 if(buf_index+3 >= buf_size) break; | |
7486 | |
7487 buf_index+=3; | |
7488 } | |
2967 | 7489 |
5642 | 7490 hx = h->thread_context[context_count]; |
7491 | |
7492 ptr= decode_nal(hx, buf + buf_index, &dst_length, &consumed, h->is_avc ? nalsize : buf_size - buf_index); | |
4828
58f1856608f6
scenario: A properly coded frame is followed by an end of sequence NAL unit,
diego
parents:
4795
diff
changeset
|
7493 if (ptr==NULL || dst_length < 0){ |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7494 return -1; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7495 } |
4829
e3161603a048
Remove a NAL unit's trailing zero bytes even when dst_length is 1.
diego
parents:
4828
diff
changeset
|
7496 while(ptr[dst_length - 1] == 0 && dst_length > 0) |
3341 | 7497 dst_length--; |
4830
5a523aee7379
When dst_length == 0 bit_length has to be 0, too, but the current code still
diego
parents:
4829
diff
changeset
|
7498 bit_length= !dst_length ? 0 : (8*dst_length - decode_rbsp_trailing(h, ptr + dst_length - 1)); |
1168 | 7499 |
7500 if(s->avctx->debug&FF_DEBUG_STARTCODE){ | |
5642 | 7501 av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d/%d length %d\n", hx->nal_unit_type, buf_index, buf_size, dst_length); |
1168 | 7502 } |
2967 | 7503 |
2227 | 7504 if (h->is_avc && (nalsize != consumed)) |
7505 av_log(h->s.avctx, AV_LOG_ERROR, "AVC: Consumed only %d bytes instead of %d\n", consumed, nalsize); | |
7506 | |
1168 | 7507 buf_index += consumed; |
7508 | |
5127 | 7509 if( (s->hurry_up == 1 && h->nal_ref_idc == 0) //FIXME do not discard SEI id |
2792 | 7510 ||(avctx->skip_frame >= AVDISCARD_NONREF && h->nal_ref_idc == 0)) |
1168 | 7511 continue; |
2967 | 7512 |
5642 | 7513 again: |
7514 err = 0; | |
7515 switch(hx->nal_unit_type){ | |
1168 | 7516 case NAL_IDR_SLICE: |
5642 | 7517 if (h->nal_unit_type != NAL_IDR_SLICE) { |
7518 av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices"); | |
7519 return -1; | |
7520 } | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
7521 idr(h); //FIXME ensure we don't loose some frames if there is reordering |
1168 | 7522 case NAL_SLICE: |
5642 | 7523 init_get_bits(&hx->s.gb, ptr, bit_length); |
7524 hx->intra_gb_ptr= | |
7525 hx->inter_gb_ptr= &hx->s.gb; | |
7526 hx->s.data_partitioning = 0; | |
7527 | |
7528 if((err = decode_slice_header(hx, h))) | |
7529 break; | |
7530 | |
5773
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
7531 s->current_picture_ptr->key_frame|= (hx->nal_unit_type == NAL_IDR_SLICE); |
5642 | 7532 if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5 |
7533 && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) | |
7534 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type!=B_TYPE) | |
7535 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type==I_TYPE) | |
2793 | 7536 && avctx->skip_frame < AVDISCARD_ALL) |
5642 | 7537 context_count++; |
1168 | 7538 break; |
7539 case NAL_DPA: | |
5642 | 7540 init_get_bits(&hx->s.gb, ptr, bit_length); |
7541 hx->intra_gb_ptr= | |
7542 hx->inter_gb_ptr= NULL; | |
7543 hx->s.data_partitioning = 1; | |
7544 | |
7545 err = decode_slice_header(hx, h); | |
1168 | 7546 break; |
7547 case NAL_DPB: | |
5642 | 7548 init_get_bits(&hx->intra_gb, ptr, bit_length); |
7549 hx->intra_gb_ptr= &hx->intra_gb; | |
1168 | 7550 break; |
7551 case NAL_DPC: | |
5642 | 7552 init_get_bits(&hx->inter_gb, ptr, bit_length); |
7553 hx->inter_gb_ptr= &hx->inter_gb; | |
7554 | |
7555 if(hx->redundant_pic_count==0 && hx->intra_gb_ptr && hx->s.data_partitioning | |
4354
d18568fb0187
Avoid calling decode_slice when context_initialized is not set.
reimar
parents:
4344
diff
changeset
|
7556 && s->context_initialized |
2793 | 7557 && s->hurry_up < 5 |
5642 | 7558 && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) |
7559 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type!=B_TYPE) | |
7560 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type==I_TYPE) | |
2793 | 7561 && avctx->skip_frame < AVDISCARD_ALL) |
5642 | 7562 context_count++; |
1168 | 7563 break; |
7564 case NAL_SEI: | |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
7565 init_get_bits(&s->gb, ptr, bit_length); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
7566 decode_sei(h); |
1168 | 7567 break; |
7568 case NAL_SPS: | |
7569 init_get_bits(&s->gb, ptr, bit_length); | |
7570 decode_seq_parameter_set(h); | |
2967 | 7571 |
1168 | 7572 if(s->flags& CODEC_FLAG_LOW_DELAY) |
7573 s->low_delay=1; | |
2967 | 7574 |
2538 | 7575 if(avctx->has_b_frames < 2) |
7576 avctx->has_b_frames= !s->low_delay; | |
1168 | 7577 break; |
7578 case NAL_PPS: | |
7579 init_get_bits(&s->gb, ptr, bit_length); | |
2967 | 7580 |
2755 | 7581 decode_picture_parameter_set(h, bit_length); |
1168 | 7582 |
7583 break; | |
2960 | 7584 case NAL_AUD: |
7585 case NAL_END_SEQUENCE: | |
7586 case NAL_END_STREAM: | |
7587 case NAL_FILLER_DATA: | |
7588 case NAL_SPS_EXT: | |
7589 case NAL_AUXILIARY_SLICE: | |
1168 | 7590 break; |
2979 | 7591 default: |
5631 | 7592 av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n", h->nal_unit_type, bit_length); |
2967 | 7593 } |
5642 | 7594 |
7595 if(context_count == h->max_contexts) { | |
7596 execute_decode_slices(h, context_count); | |
7597 context_count = 0; | |
7598 } | |
7599 | |
7600 if (err < 0) | |
7601 av_log(h->s.avctx, AV_LOG_ERROR, "decode_slice_header error\n"); | |
7602 else if(err == 1) { | |
7603 /* Slice could not be decoded in parallel mode, copy down | |
7604 * NAL unit stuff to context 0 and restart. Note that | |
7605 * rbsp_buffer is not transfered, but since we no longer | |
7606 * run in parallel mode this should not be an issue. */ | |
7607 h->nal_unit_type = hx->nal_unit_type; | |
7608 h->nal_ref_idc = hx->nal_ref_idc; | |
7609 hx = h; | |
7610 goto again; | |
7611 } | |
7612 } | |
7613 if(context_count) | |
7614 execute_decode_slices(h, context_count); | |
1168 | 7615 return buf_index; |
7616 } | |
7617 | |
7618 /** | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
7619 * returns the number of bytes consumed for building the current frame |
1168 | 7620 */ |
7621 static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){ | |
7622 if(s->flags&CODEC_FLAG_TRUNCATED){ | |
7623 pos -= s->parse_context.last_index; | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
7624 if(pos<0) pos=0; // FIXME remove (unneeded?) |
2967 | 7625 |
1168 | 7626 return pos; |
7627 }else{ | |
5127 | 7628 if(pos==0) pos=1; //avoid infinite loops (i doubt that is needed but ...) |
1168 | 7629 if(pos+10>buf_size) pos=buf_size; // oops ;) |
7630 | |
7631 return pos; | |
7632 } | |
7633 } | |
7634 | |
2967 | 7635 static int decode_frame(AVCodecContext *avctx, |
1168 | 7636 void *data, int *data_size, |
7637 uint8_t *buf, int buf_size) | |
7638 { | |
7639 H264Context *h = avctx->priv_data; | |
7640 MpegEncContext *s = &h->s; | |
2967 | 7641 AVFrame *pict = data; |
1168 | 7642 int buf_index; |
2967 | 7643 |
1168 | 7644 s->flags= avctx->flags; |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1706
diff
changeset
|
7645 s->flags2= avctx->flags2; |
1168 | 7646 |
7647 /* no supplementary picture */ | |
7648 if (buf_size == 0) { | |
4556 | 7649 Picture *out; |
7650 int i, out_idx; | |
7651 | |
7652 //FIXME factorize this with the output code below | |
7653 out = h->delayed_pic[0]; | |
7654 out_idx = 0; | |
7655 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame; i++) | |
7656 if(h->delayed_pic[i]->poc < out->poc){ | |
7657 out = h->delayed_pic[i]; | |
7658 out_idx = i; | |
7659 } | |
7660 | |
7661 for(i=out_idx; h->delayed_pic[i]; i++) | |
7662 h->delayed_pic[i] = h->delayed_pic[i+1]; | |
7663 | |
7664 if(out){ | |
7665 *data_size = sizeof(AVFrame); | |
7666 *pict= *(AVFrame*)out; | |
7667 } | |
7668 | |
1168 | 7669 return 0; |
7670 } | |
2967 | 7671 |
1168 | 7672 if(s->flags&CODEC_FLAG_TRUNCATED){ |
4975 | 7673 int next= ff_h264_find_frame_end(h, buf, buf_size); |
2967 | 7674 |
4931
0d1cc37d9430
make some parser parameters const to avoid casting const to non-const
aurel
parents:
4908
diff
changeset
|
7675 if( ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 ) |
1168 | 7676 return buf_size; |
7677 //printf("next:%d buf_size:%d last_index:%d\n", next, buf_size, s->parse_context.last_index); | |
7678 } | |
7679 | |
2227 | 7680 if(h->is_avc && !h->got_avcC) { |
7681 int i, cnt, nalsize; | |
7682 unsigned char *p = avctx->extradata; | |
7683 if(avctx->extradata_size < 7) { | |
7684 av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); | |
7685 return -1; | |
7686 } | |
7687 if(*p != 1) { | |
7688 av_log(avctx, AV_LOG_ERROR, "Unknown avcC version %d\n", *p); | |
7689 return -1; | |
7690 } | |
7691 /* sps and pps in the avcC always have length coded with 2 bytes, | |
7692 so put a fake nal_length_size = 2 while parsing them */ | |
7693 h->nal_length_size = 2; | |
7694 // Decode sps from avcC | |
7695 cnt = *(p+5) & 0x1f; // Number of sps | |
7696 p += 6; | |
7697 for (i = 0; i < cnt; i++) { | |
4364 | 7698 nalsize = AV_RB16(p) + 2; |
2867
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
7699 if(decode_nal_units(h, p, nalsize) < 0) { |
2227 | 7700 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i); |
7701 return -1; | |
7702 } | |
7703 p += nalsize; | |
2967 | 7704 } |
2227 | 7705 // Decode pps from avcC |
7706 cnt = *(p++); // Number of pps | |
7707 for (i = 0; i < cnt; i++) { | |
4364 | 7708 nalsize = AV_RB16(p) + 2; |
2227 | 7709 if(decode_nal_units(h, p, nalsize) != nalsize) { |
7710 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i); | |
7711 return -1; | |
7712 } | |
7713 p += nalsize; | |
2967 | 7714 } |
2227 | 7715 // Now store right nal length size, that will be use to parse all other nals |
7716 h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; | |
7717 // Do not reparse avcC | |
7718 h->got_avcC = 1; | |
7719 } | |
7720 | |
4507
b80c704183e9
always decode extradata when of non-avc stream (like RTSP)
gpoirier
parents:
4391
diff
changeset
|
7721 if(avctx->frame_number==0 && !h->is_avc && s->avctx->extradata_size){ |
2967 | 7722 if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) < 0) |
1168 | 7723 return -1; |
7724 } | |
7725 | |
7726 buf_index=decode_nal_units(h, buf, buf_size); | |
2967 | 7727 if(buf_index < 0) |
1168 | 7728 return -1; |
7729 | |
4620 | 7730 if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ |
5629
7e5ebda833e9
Remove error raising when explicitely skipping frame
benoit
parents:
5547
diff
changeset
|
7731 if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; |
4620 | 7732 av_log(avctx, AV_LOG_ERROR, "no frame!\n"); |
7733 return -1; | |
7734 } | |
7735 | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7736 if(!(s->flags2 & CODEC_FLAG2_CHUNKS) || (s->mb_y >= s->mb_height && s->mb_height)){ |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7737 Picture *out = s->current_picture_ptr; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7738 Picture *cur = s->current_picture_ptr; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7739 Picture *prev = h->delayed_output_pic; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7740 int i, pics, cross_idr, out_of_order, out_idx; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7741 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7742 s->mb_y= 0; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7743 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7744 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7745 s->current_picture_ptr->pict_type= s->pict_type; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7746 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7747 h->prev_frame_num_offset= h->frame_num_offset; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7748 h->prev_frame_num= h->frame_num; |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7749 if(!s->dropable) { |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7750 h->prev_poc_msb= h->poc_msb; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7751 h->prev_poc_lsb= h->poc_lsb; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7752 execute_ref_pic_marking(h, h->mmco, h->mmco_index); |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
7753 } |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7754 |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7755 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7756 * FIXME: Error handling code does not seem to support interlaced |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7757 * when slices span multiple rows |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7758 * The ff_er_add_slice calls don't work right for bottom |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7759 * fields; they cause massive erroneous error concealing |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7760 * Error marking covers both fields (top and bottom). |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7761 * This causes a mismatched s->error_count |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7762 * and a bad error table. Further, the error count goes to |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7763 * INT_MAX when called for bottom field, because mb_y is |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7764 * past end by one (callers fault) and resync_mb_y != 0 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7765 * causes problems for the first MB line, too. |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7766 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7767 if (!FIELD_PICTURE) |
5803 | 7768 ff_er_frame_end(s); |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7769 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7770 MPV_frame_end(s); |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7771 |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7772 if (s->first_field) { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7773 /* Wait for second field. */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7774 *data_size = 0; |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7775 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7776 } else { |
5876
731ee5ad6bde
Correct assignment of interlaced_frame; was being set on output frames,
heydowns
parents:
5825
diff
changeset
|
7777 cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE; |
5904 | 7778 /* Derive top_field_first from field pocs. */ |
7779 cur->top_field_first = cur->field_poc[0] < cur->field_poc[1]; | |
5876
731ee5ad6bde
Correct assignment of interlaced_frame; was being set on output frames,
heydowns
parents:
5825
diff
changeset
|
7780 |
5803 | 7781 //FIXME do something with unavailable reference frames |
2967 | 7782 |
2561 | 7783 #if 0 //decode order |
5803 | 7784 *data_size = sizeof(AVFrame); |
2561 | 7785 #else |
5803 | 7786 /* Sort B-frames into display order */ |
7787 | |
7788 if(h->sps.bitstream_restriction_flag | |
7789 && s->avctx->has_b_frames < h->sps.num_reorder_frames){ | |
7790 s->avctx->has_b_frames = h->sps.num_reorder_frames; | |
7791 s->low_delay = 0; | |
7792 } | |
7793 | |
7794 pics = 0; | |
7795 while(h->delayed_pic[pics]) pics++; | |
7796 | |
7797 assert(pics+1 < sizeof(h->delayed_pic) / sizeof(h->delayed_pic[0])); | |
7798 | |
7799 h->delayed_pic[pics++] = cur; | |
7800 if(cur->reference == 0) | |
7801 cur->reference = DELAYED_PIC_REF; | |
7802 | |
7803 cross_idr = 0; | |
7804 for(i=0; h->delayed_pic[i]; i++) | |
7805 if(h->delayed_pic[i]->key_frame || h->delayed_pic[i]->poc==0) | |
7806 cross_idr = 1; | |
7807 | |
7808 out = h->delayed_pic[0]; | |
7809 out_idx = 0; | |
7810 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame; i++) | |
7811 if(h->delayed_pic[i]->poc < out->poc){ | |
7812 out = h->delayed_pic[i]; | |
7813 out_idx = i; | |
7814 } | |
7815 | |
7816 out_of_order = !cross_idr && prev && out->poc < prev->poc; | |
7817 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames) | |
7818 { } | |
7819 else if(prev && pics <= s->avctx->has_b_frames) | |
7820 out = prev; | |
7821 else if((out_of_order && pics-1 == s->avctx->has_b_frames && pics < 15) | |
7822 || (s->low_delay && | |
7823 ((!cross_idr && prev && out->poc > prev->poc + 2) | |
7824 || cur->pict_type == B_TYPE))) | |
7825 { | |
7826 s->low_delay = 0; | |
7827 s->avctx->has_b_frames++; | |
7828 out = prev; | |
7829 } | |
7830 else if(out_of_order) | |
7831 out = prev; | |
7832 | |
7833 if(out_of_order || pics > s->avctx->has_b_frames){ | |
7834 for(i=out_idx; h->delayed_pic[i]; i++) | |
7835 h->delayed_pic[i] = h->delayed_pic[i+1]; | |
7836 } | |
7837 | |
7838 if(prev == out) | |
7839 *data_size = 0; | |
7840 else | |
7841 *data_size = sizeof(AVFrame); | |
7842 if(prev && prev != out && prev->reference == DELAYED_PIC_REF) | |
7843 prev->reference = 0; | |
7844 h->delayed_output_pic = out; | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
7845 #endif |
2409 | 7846 |
5803 | 7847 if(out) |
7848 *pict= *(AVFrame*)out; | |
7849 else | |
7850 av_log(avctx, AV_LOG_DEBUG, "no picture\n"); | |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7851 } |
2937 | 7852 } |
7853 | |
7854 assert(pict->data[0] || !*data_size); | |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1698
diff
changeset
|
7855 ff_print_debug_info(s, pict); |
1168 | 7856 //printf("out %d\n", (int)pict->data[0]); |
7857 #if 0 //? | |
7858 | |
7859 /* Return the Picture timestamp as the frame number */ | |
5963 | 7860 /* we subtract 1 because it is added on utils.c */ |
1168 | 7861 avctx->frame_number = s->picture_number - 1; |
7862 #endif | |
7863 return get_consumed_bytes(s, buf_index, buf_size); | |
7864 } | |
7865 #if 0 | |
7866 static inline void fill_mb_avail(H264Context *h){ | |
7867 MpegEncContext * const s = &h->s; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
7868 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1168 | 7869 |
7870 if(s->mb_y){ | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
7871 h->mb_avail[0]= s->mb_x && h->slice_table[mb_xy - s->mb_stride - 1] == h->slice_num; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
7872 h->mb_avail[1]= h->slice_table[mb_xy - s->mb_stride ] == h->slice_num; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1174
diff
changeset
|
7873 h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num; |
1168 | 7874 }else{ |
7875 h->mb_avail[0]= | |
7876 h->mb_avail[1]= | |
7877 h->mb_avail[2]= 0; | |
7878 } | |
7879 h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num; | |
7880 h->mb_avail[4]= 1; //FIXME move out | |
7881 h->mb_avail[5]= 0; //FIXME move out | |
7882 } | |
7883 #endif | |
7884 | |
7885 #if 0 //selftest | |
5380
389366aa3458
Fix the self tests which are contained in some codecs and are using random().
takis
parents:
5338
diff
changeset
|
7886 #undef random |
1168 | 7887 #define COUNT 8000 |
7888 #define SIZE (COUNT*40) | |
5934 | 7889 int main(void){ |
1168 | 7890 int i; |
7891 uint8_t temp[SIZE]; | |
7892 PutBitContext pb; | |
7893 GetBitContext gb; | |
7894 // int int_temp[10000]; | |
7895 DSPContext dsp; | |
7896 AVCodecContext avctx; | |
2967 | 7897 |
1168 | 7898 dsputil_init(&dsp, &avctx); |
7899 | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1453
diff
changeset
|
7900 init_put_bits(&pb, temp, SIZE); |
1168 | 7901 printf("testing unsigned exp golomb\n"); |
7902 for(i=0; i<COUNT; i++){ | |
7903 START_TIMER | |
7904 set_ue_golomb(&pb, i); | |
7905 STOP_TIMER("set_ue_golomb"); | |
7906 } | |
7907 flush_put_bits(&pb); | |
2967 | 7908 |
1168 | 7909 init_get_bits(&gb, temp, 8*SIZE); |
7910 for(i=0; i<COUNT; i++){ | |
7911 int j, s; | |
2967 | 7912 |
1168 | 7913 s= show_bits(&gb, 24); |
2967 | 7914 |
1168 | 7915 START_TIMER |
7916 j= get_ue_golomb(&gb); | |
7917 if(j != i){ | |
5127 | 7918 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s); |
1168 | 7919 // return -1; |
7920 } | |
7921 STOP_TIMER("get_ue_golomb"); | |
7922 } | |
2967 | 7923 |
7924 | |
1524 | 7925 init_put_bits(&pb, temp, SIZE); |
1168 | 7926 printf("testing signed exp golomb\n"); |
7927 for(i=0; i<COUNT; i++){ | |
7928 START_TIMER | |
7929 set_se_golomb(&pb, i - COUNT/2); | |
7930 STOP_TIMER("set_se_golomb"); | |
7931 } | |
7932 flush_put_bits(&pb); | |
2967 | 7933 |
1168 | 7934 init_get_bits(&gb, temp, 8*SIZE); |
7935 for(i=0; i<COUNT; i++){ | |
7936 int j, s; | |
2967 | 7937 |
1168 | 7938 s= show_bits(&gb, 24); |
2967 | 7939 |
1168 | 7940 START_TIMER |
7941 j= get_se_golomb(&gb); | |
7942 if(j != i - COUNT/2){ | |
5127 | 7943 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s); |
1168 | 7944 // return -1; |
7945 } | |
7946 STOP_TIMER("get_se_golomb"); | |
7947 } | |
7948 | |
7949 printf("testing 4x4 (I)DCT\n"); | |
2967 | 7950 |
1168 | 7951 DCTELEM block[16]; |
7952 uint8_t src[16], ref[16]; | |
7953 uint64_t error= 0, max_error=0; | |
7954 | |
7955 for(i=0; i<COUNT; i++){ | |
7956 int j; | |
7957 // printf("%d %d %d\n", r1, r2, (r2-r1)*16); | |
7958 for(j=0; j<16; j++){ | |
7959 ref[j]= random()%255; | |
7960 src[j]= random()%255; | |
7961 } | |
7962 | |
7963 h264_diff_dct_c(block, src, ref, 4); | |
2967 | 7964 |
1168 | 7965 //normalize |
7966 for(j=0; j<16; j++){ | |
7967 // printf("%d ", block[j]); | |
7968 block[j]= block[j]*4; | |
7969 if(j&1) block[j]= (block[j]*4 + 2)/5; | |
7970 if(j&4) block[j]= (block[j]*4 + 2)/5; | |
7971 } | |
7972 // printf("\n"); | |
2967 | 7973 |
2272
cd43603c46f9
move h264 idct to its own file and call via function pointer in DspContext
michael
parents:
2255
diff
changeset
|
7974 s->dsp.h264_idct_add(ref, block, 4); |
1168 | 7975 /* for(j=0; j<16; j++){ |
7976 printf("%d ", ref[j]); | |
7977 } | |
7978 printf("\n");*/ | |
2967 | 7979 |
1168 | 7980 for(j=0; j<16; j++){ |
4001 | 7981 int diff= FFABS(src[j] - ref[j]); |
2967 | 7982 |
1168 | 7983 error+= diff*diff; |
7984 max_error= FFMAX(max_error, diff); | |
7985 } | |
7986 } | |
7987 printf("error=%f max_error=%d\n", ((float)error)/COUNT/16, (int)max_error ); | |
7988 #if 0 | |
7989 printf("testing quantizer\n"); | |
7990 for(qp=0; qp<52; qp++){ | |
7991 for(i=0; i<16; i++) | |
7992 src1_block[i]= src2_block[i]= random()%255; | |
2967 | 7993 |
1168 | 7994 } |
7995 #endif | |
7996 printf("Testing NAL layer\n"); | |
2967 | 7997 |
1168 | 7998 uint8_t bitstream[COUNT]; |
7999 uint8_t nal[COUNT*2]; | |
8000 H264Context h; | |
8001 memset(&h, 0, sizeof(H264Context)); | |
2967 | 8002 |
1168 | 8003 for(i=0; i<COUNT; i++){ |
8004 int zeros= i; | |
8005 int nal_length; | |
8006 int consumed; | |
8007 int out_length; | |
8008 uint8_t *out; | |
8009 int j; | |
2967 | 8010 |
1168 | 8011 for(j=0; j<COUNT; j++){ |
8012 bitstream[j]= (random() % 255) + 1; | |
8013 } | |
2967 | 8014 |
1168 | 8015 for(j=0; j<zeros; j++){ |
8016 int pos= random() % COUNT; | |
8017 while(bitstream[pos] == 0){ | |
8018 pos++; | |
8019 pos %= COUNT; | |
8020 } | |
8021 bitstream[pos]=0; | |
8022 } | |
2967 | 8023 |
1168 | 8024 START_TIMER |
2967 | 8025 |
1168 | 8026 nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2); |
8027 if(nal_length<0){ | |
8028 printf("encoding failed\n"); | |
8029 return -1; | |
8030 } | |
2967 | 8031 |
1168 | 8032 out= decode_nal(&h, nal, &out_length, &consumed, nal_length); |
8033 | |
8034 STOP_TIMER("NAL") | |
2967 | 8035 |
1168 | 8036 if(out_length != COUNT){ |
8037 printf("incorrect length %d %d\n", out_length, COUNT); | |
8038 return -1; | |
8039 } | |
2967 | 8040 |
1168 | 8041 if(consumed != nal_length){ |
8042 printf("incorrect consumed length %d %d\n", nal_length, consumed); | |
8043 return -1; | |
8044 } | |
2967 | 8045 |
1168 | 8046 if(memcmp(bitstream, out, COUNT)){ |
5127 | 8047 printf("mismatch\n"); |
1168 | 8048 return -1; |
8049 } | |
8050 } | |
2967 | 8051 |
1168 | 8052 printf("Testing RBSP\n"); |
2967 | 8053 |
8054 | |
1168 | 8055 return 0; |
8056 } | |
8057 #endif | |
8058 | |
8059 | |
8060 static int decode_end(AVCodecContext *avctx) | |
8061 { | |
8062 H264Context *h = avctx->priv_data; | |
8063 MpegEncContext *s = &h->s; | |
2967 | 8064 |
5174 | 8065 av_freep(&h->rbsp_buffer[0]); |
8066 av_freep(&h->rbsp_buffer[1]); | |
1168 | 8067 free_tables(h); //FIXME cleanup init stuff perhaps |
8068 MPV_common_end(s); | |
8069 | |
8070 // memset(h, 0, sizeof(H264Context)); | |
2967 | 8071 |
1168 | 8072 return 0; |
8073 } | |
8074 | |
8075 | |
8076 AVCodec h264_decoder = { | |
8077 "h264", | |
8078 CODEC_TYPE_VIDEO, | |
8079 CODEC_ID_H264, | |
8080 sizeof(H264Context), | |
8081 decode_init, | |
8082 NULL, | |
8083 decode_end, | |
8084 decode_frame, | |
2453 | 8085 /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, |
2640 | 8086 .flush= flush_dpb, |
1168 | 8087 }; |
8088 | |
1234 | 8089 #include "svq3.c" |