Mercurial > libavcodec.hg
annotate h264.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | f7bedc1ce1bc |
children | 58a960d6e34c |
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 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11634
diff
changeset
|
23 * @file |
1168 | 24 * H.264 / AVC / MPEG4 part10 codec. |
25 * @author Michael Niedermayer <michaelni@gmx.at> | |
26 */ | |
27 | |
9012
15a3df8c01fd
More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents:
9004
diff
changeset
|
28 #include "internal.h" |
1168 | 29 #include "dsputil.h" |
30 #include "avcodec.h" | |
31 #include "mpegvideo.h" | |
4975 | 32 #include "h264.h" |
1168 | 33 #include "h264data.h" |
10864 | 34 #include "h264_mvpred.h" |
4975 | 35 #include "h264_parser.h" |
1168 | 36 #include "golomb.h" |
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8610
diff
changeset
|
37 #include "mathops.h" |
6020 | 38 #include "rectangle.h" |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
39 #include "vdpau_internal.h" |
1168 | 40 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
41 #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
|
42 |
3284
a224d9752912
don't force asserts in release builds. 2% faster h264.
lorenm
parents:
3219
diff
changeset
|
43 //#undef NDEBUG |
1168 | 44 #include <assert.h> |
45 | |
7993
2dfff0e25b47
Mark ff_div6 and ff_rem6 static in h264.c. Patch by Diego Petten
lu_zero
parents:
7974
diff
changeset
|
46 static const uint8_t rem6[52]={ |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
47 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
|
48 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
49 |
7993
2dfff0e25b47
Mark ff_div6 and ff_rem6 static in h264.c. Patch by Diego Petten
lu_zero
parents:
7974
diff
changeset
|
50 static const uint8_t div6[52]={ |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
51 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
|
52 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
53 |
11795
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
54 static const enum PixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = { |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
55 PIX_FMT_DXVA2_VLD, |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
56 PIX_FMT_VAAPI_VLD, |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
57 PIX_FMT_YUVJ420P, |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
58 PIX_FMT_NONE |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
59 }; |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
60 |
10852 | 61 void ff_h264_write_back_intra_pred_mode(H264Context *h){ |
11285 | 62 int8_t *mode= h->intra4x4_pred_mode + h->mb2br_xy[h->mb_xy]; |
63 | |
11286
db94c9bc5694
Reorder intra4x4_pred_mode so that we can read/write 4 values at once.
michael
parents:
11285
diff
changeset
|
64 AV_COPY32(mode, h->intra4x4_pred_mode_cache + 4 + 8*4); |
db94c9bc5694
Reorder intra4x4_pred_mode so that we can read/write 4 values at once.
michael
parents:
11285
diff
changeset
|
65 mode[4]= h->intra4x4_pred_mode_cache[7+8*3]; |
db94c9bc5694
Reorder intra4x4_pred_mode so that we can read/write 4 values at once.
michael
parents:
11285
diff
changeset
|
66 mode[5]= h->intra4x4_pred_mode_cache[7+8*2]; |
db94c9bc5694
Reorder intra4x4_pred_mode so that we can read/write 4 values at once.
michael
parents:
11285
diff
changeset
|
67 mode[6]= h->intra4x4_pred_mode_cache[7+8*1]; |
1168 | 68 } |
69 | |
70 /** | |
71 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |
72 */ | |
10863
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
73 int ff_h264_check_intra4x4_pred_mode(H264Context *h){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
74 MpegEncContext * const s = &h->s; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
75 static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0}; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
76 static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED}; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
77 int i; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
78 |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
79 if(!(h->top_samples_available&0x8000)){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
80 for(i=0; i<4; i++){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
81 int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ]; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
82 if(status<0){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
83 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); |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
84 return -1; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
85 } else if(status){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
86 h->intra4x4_pred_mode_cache[scan8[0] + i]= status; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
87 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
88 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
89 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
90 |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
91 if((h->left_samples_available&0x8888)!=0x8888){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
92 static const int mask[4]={0x8000,0x2000,0x80,0x20}; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
93 for(i=0; i<4; i++){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
94 if(!(h->left_samples_available&mask[i])){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
95 int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ]; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
96 if(status<0){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
97 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); |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
98 return -1; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
99 } else if(status){ |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
100 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
101 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
102 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
103 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
104 } |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
105 |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
106 return 0; |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
107 } //FIXME cleanup like ff_h264_check_intra_pred_mode |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
108 |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
109 /** |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
110 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. |
974ac220c93a
Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
michael
parents:
10862
diff
changeset
|
111 */ |
10852 | 112 int ff_h264_check_intra_pred_mode(H264Context *h, int mode){ |
1168 | 113 MpegEncContext * const s = &h->s; |
114 static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1}; | |
115 static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8}; | |
2967 | 116 |
4529 | 117 if(mode > 6U) { |
2392 | 118 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 | 119 return -1; |
2392 | 120 } |
2967 | 121 |
1168 | 122 if(!(h->top_samples_available&0x8000)){ |
123 mode= top[ mode ]; | |
124 if(mode<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
125 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 | 126 return -1; |
127 } | |
128 } | |
2967 | 129 |
7532 | 130 if((h->left_samples_available&0x8080) != 0x8080){ |
1168 | 131 mode= left[ mode ]; |
7532 | 132 if(h->left_samples_available&0x8080){ //mad cow disease mode, aka MBAFF + constrained_intra_pred |
133 mode= ALZHEIMER_DC_L0T_PRED8x8 + (!(h->left_samples_available&0x8000)) + 2*(mode == DC_128_PRED8x8); | |
134 } | |
1168 | 135 if(mode<0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
136 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 | 137 return -1; |
2967 | 138 } |
1168 | 139 } |
140 | |
141 return mode; | |
142 } | |
143 | |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
144 const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){ |
1168 | 145 int i, si, di; |
146 uint8_t *dst; | |
5174 | 147 int bufidx; |
1168 | 148 |
2979 | 149 // src[0]&0x80; //forbidden bit |
1168 | 150 h->nal_ref_idc= src[0]>>5; |
151 h->nal_unit_type= src[0]&0x1F; | |
152 | |
153 src++; length--; | |
2967 | 154 #if 0 |
1168 | 155 for(i=0; i<length; i++) |
156 printf("%2X ", src[i]); | |
157 #endif | |
8440
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
158 |
8590 | 159 #if HAVE_FAST_UNALIGNED |
160 # if HAVE_FAST_64BIT | |
8440
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
161 # define RS 7 |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
162 for(i=0; i+1<length; i+=9){ |
11203 | 163 if(!((~AV_RN64A(src+i) & (AV_RN64A(src+i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL)) |
8440
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
164 # else |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
165 # define RS 3 |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
166 for(i=0; i+1<length; i+=5){ |
11203 | 167 if(!((~AV_RN32A(src+i) & (AV_RN32A(src+i) - 0x01000101U)) & 0x80008080U)) |
8440
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
168 # endif |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
169 continue; |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
170 if(i>0 && !src[i]) i--; |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
171 while(src[i]) i++; |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
172 #else |
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
173 # define RS 0 |
1168 | 174 for(i=0; i+1<length; i+=2){ |
175 if(src[i]) continue; | |
176 if(i>0 && src[i-1]==0) i--; | |
8440
649ce1b30344
Optimize 0 0 0-3 search, 45% faster on pentium dual.
michael
parents:
8438
diff
changeset
|
177 #endif |
1168 | 178 if(i+2<length && src[i+1]==0 && src[i+2]<=3){ |
179 if(src[i+2]!=3){ | |
180 /* startcode, so we must be past the end */ | |
181 length=i; | |
182 } | |
183 break; | |
184 } | |
8441 | 185 i-= RS; |
1168 | 186 } |
187 | |
188 if(i>=length-1){ //no escaped 0 | |
189 *dst_length= length; | |
190 *consumed= length+1; //+1 for the header | |
2967 | 191 return src; |
1168 | 192 } |
193 | |
5174 | 194 bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data |
9415
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9386
diff
changeset
|
195 av_fast_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE); |
5174 | 196 dst= h->rbsp_buffer[bufidx]; |
1168 | 197 |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
198 if (dst == NULL){ |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
199 return NULL; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
200 } |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
201 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
202 //printf("decoding esc\n"); |
8446 | 203 memcpy(dst, src, i); |
204 si=di=i; | |
205 while(si+2<length){ | |
1168 | 206 //remove escapes (very rare 1:2^22) |
8446 | 207 if(src[si+2]>3){ |
208 dst[di++]= src[si++]; | |
209 dst[di++]= src[si++]; | |
210 }else if(src[si]==0 && src[si+1]==0){ | |
1168 | 211 if(src[si+2]==3){ //escape |
212 dst[di++]= 0; | |
213 dst[di++]= 0; | |
214 si+=3; | |
1957
54411768fa38
h264 nal decoding fix by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1956
diff
changeset
|
215 continue; |
1168 | 216 }else //next start code |
8446 | 217 goto nsc; |
1168 | 218 } |
219 | |
220 dst[di++]= src[si++]; | |
221 } | |
8446 | 222 while(si<length) |
223 dst[di++]= src[si++]; | |
224 nsc: | |
1168 | 225 |
8396
11b1f7762830
Clear FF_INPUT_BUFFER_PADDING_SIZE bytes at the end of NALs in rbsp_buffer.
astrange
parents:
8395
diff
changeset
|
226 memset(dst+di, 0, FF_INPUT_BUFFER_PADDING_SIZE); |
11b1f7762830
Clear FF_INPUT_BUFFER_PADDING_SIZE bytes at the end of NALs in rbsp_buffer.
astrange
parents:
8395
diff
changeset
|
227 |
1168 | 228 *dst_length= di; |
229 *consumed= si + 1;//+1 for the header | |
5129 | 230 //FIXME store exact number of bits in the getbitcontext (it is needed for decoding) |
1168 | 231 return dst; |
232 } | |
233 | |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
234 int ff_h264_decode_rbsp_trailing(H264Context *h, const uint8_t *src){ |
1168 | 235 int v= *src; |
236 int r; | |
237 | |
4600 | 238 tprintf(h->s.avctx, "rbsp trailing %X\n", v); |
1168 | 239 |
240 for(r=1; r<9; r++){ | |
241 if(v&1) return r; | |
242 v>>=1; | |
243 } | |
244 return 0; | |
245 } | |
246 | |
247 /** | |
7374 | 248 * IDCT transforms the 16 dc values and dequantizes them. |
1168 | 249 * @param qp quantization parameter |
250 */ | |
2919 | 251 static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){ |
1168 | 252 #define stride 16 |
253 int i; | |
254 int temp[16]; //FIXME check if this is a good idea | |
255 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
256 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
257 | |
258 //memset(block, 64, 2*256); | |
259 //return; | |
260 for(i=0; i<4; i++){ | |
261 const int offset= y_offset[i]; | |
262 const int z0= block[offset+stride*0] + block[offset+stride*4]; | |
263 const int z1= block[offset+stride*0] - block[offset+stride*4]; | |
264 const int z2= block[offset+stride*1] - block[offset+stride*5]; | |
265 const int z3= block[offset+stride*1] + block[offset+stride*5]; | |
266 | |
267 temp[4*i+0]= z0+z3; | |
268 temp[4*i+1]= z1+z2; | |
269 temp[4*i+2]= z1-z2; | |
270 temp[4*i+3]= z0-z3; | |
271 } | |
272 | |
273 for(i=0; i<4; i++){ | |
274 const int offset= x_offset[i]; | |
275 const int z0= temp[4*0+i] + temp[4*2+i]; | |
276 const int z1= temp[4*0+i] - temp[4*2+i]; | |
277 const int z2= temp[4*1+i] - temp[4*3+i]; | |
278 const int z3= temp[4*1+i] + temp[4*3+i]; | |
279 | |
7374 | 280 block[stride*0 +offset]= ((((z0 + z3)*qmul + 128 ) >> 8)); //FIXME think about merging this into decode_residual |
2919 | 281 block[stride*2 +offset]= ((((z1 + z2)*qmul + 128 ) >> 8)); |
282 block[stride*8 +offset]= ((((z1 - z2)*qmul + 128 ) >> 8)); | |
283 block[stride*10+offset]= ((((z0 - z3)*qmul + 128 ) >> 8)); | |
1168 | 284 } |
285 } | |
286 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
287 #if 0 |
1168 | 288 /** |
7374 | 289 * DCT transforms the 16 dc values. |
1168 | 290 * @param qp quantization parameter ??? FIXME |
291 */ | |
292 static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){ | |
293 // const int qmul= dequant_coeff[qp][0]; | |
294 int i; | |
295 int temp[16]; //FIXME check if this is a good idea | |
296 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
297 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
298 | |
299 for(i=0; i<4; i++){ | |
300 const int offset= y_offset[i]; | |
301 const int z0= block[offset+stride*0] + block[offset+stride*4]; | |
302 const int z1= block[offset+stride*0] - block[offset+stride*4]; | |
303 const int z2= block[offset+stride*1] - block[offset+stride*5]; | |
304 const int z3= block[offset+stride*1] + block[offset+stride*5]; | |
305 | |
306 temp[4*i+0]= z0+z3; | |
307 temp[4*i+1]= z1+z2; | |
308 temp[4*i+2]= z1-z2; | |
309 temp[4*i+3]= z0-z3; | |
310 } | |
311 | |
312 for(i=0; i<4; i++){ | |
313 const int offset= x_offset[i]; | |
314 const int z0= temp[4*0+i] + temp[4*2+i]; | |
315 const int z1= temp[4*0+i] - temp[4*2+i]; | |
316 const int z2= temp[4*1+i] - temp[4*3+i]; | |
317 const int z3= temp[4*1+i] + temp[4*3+i]; | |
318 | |
319 block[stride*0 +offset]= (z0 + z3)>>1; | |
320 block[stride*2 +offset]= (z1 + z2)>>1; | |
321 block[stride*8 +offset]= (z1 - z2)>>1; | |
322 block[stride*10+offset]= (z0 - z3)>>1; | |
323 } | |
324 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
325 #endif |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
326 |
1168 | 327 #undef xStride |
328 #undef stride | |
329 | |
2919 | 330 static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){ |
1168 | 331 const int stride= 16*2; |
332 const int xStride= 16; | |
333 int a,b,c,d,e; | |
334 | |
335 a= block[stride*0 + xStride*0]; | |
336 b= block[stride*0 + xStride*1]; | |
337 c= block[stride*1 + xStride*0]; | |
338 d= block[stride*1 + xStride*1]; | |
339 | |
340 e= a-b; | |
341 a= a+b; | |
342 b= c-d; | |
343 c= c+d; | |
344 | |
2919 | 345 block[stride*0 + xStride*0]= ((a+c)*qmul) >> 7; |
346 block[stride*0 + xStride*1]= ((e+b)*qmul) >> 7; | |
347 block[stride*1 + xStride*0]= ((a-c)*qmul) >> 7; | |
348 block[stride*1 + xStride*1]= ((e-b)*qmul) >> 7; | |
1168 | 349 } |
350 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
351 #if 0 |
1168 | 352 static void chroma_dc_dct_c(DCTELEM *block){ |
353 const int stride= 16*2; | |
354 const int xStride= 16; | |
355 int a,b,c,d,e; | |
356 | |
357 a= block[stride*0 + xStride*0]; | |
358 b= block[stride*0 + xStride*1]; | |
359 c= block[stride*1 + xStride*0]; | |
360 d= block[stride*1 + xStride*1]; | |
361 | |
362 e= a-b; | |
363 a= a+b; | |
364 b= c-d; | |
365 c= c+d; | |
366 | |
367 block[stride*0 + xStride*0]= (a+c); | |
368 block[stride*0 + xStride*1]= (e+b); | |
369 block[stride*1 + xStride*0]= (a-c); | |
370 block[stride*1 + xStride*1]= (e-b); | |
371 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
372 #endif |
1168 | 373 |
374 static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list, | |
375 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
376 int src_x_offset, int src_y_offset, | |
377 qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){ | |
378 MpegEncContext * const s = &h->s; | |
379 const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8; | |
3316 | 380 int my= h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8; |
1168 | 381 const int luma_xy= (mx&3) + ((my&3)<<2); |
3316 | 382 uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*h->mb_linesize; |
383 uint8_t * src_cb, * src_cr; | |
384 int extra_width= h->emu_edge_width; | |
385 int extra_height= h->emu_edge_height; | |
1168 | 386 int emu=0; |
387 const int full_mx= mx>>2; | |
388 const int full_my= my>>2; | |
2861
3b920e274b26
fix emulated edge motion compensation when resolution%16!=0
lorenm
parents:
2846
diff
changeset
|
389 const int pic_width = 16*s->mb_width; |
5815 | 390 const int pic_height = 16*s->mb_height >> MB_FIELD; |
2967 | 391 |
1168 | 392 if(mx&7) extra_width -= 3; |
393 if(my&7) extra_height -= 3; | |
2967 | 394 |
395 if( full_mx < 0-extra_width | |
396 || full_my < 0-extra_height | |
397 || full_mx + 16/*FIXME*/ > pic_width + extra_width | |
2861
3b920e274b26
fix emulated edge motion compensation when resolution%16!=0
lorenm
parents:
2846
diff
changeset
|
398 || full_my + 16/*FIXME*/ > pic_height + extra_height){ |
3316 | 399 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); |
400 src_y= s->edge_emu_buffer + 2 + 2*h->mb_linesize; | |
1168 | 401 emu=1; |
402 } | |
2967 | 403 |
3316 | 404 qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); //FIXME try variable height perhaps? |
1168 | 405 if(!square){ |
3316 | 406 qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize); |
1168 | 407 } |
2967 | 408 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
409 if(CONFIG_GRAY && s->flags&CODEC_FLAG_GRAY) return; |
2967 | 410 |
5815 | 411 if(MB_FIELD){ |
3316 | 412 // 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
|
413 my += 2 * ((s->mb_y & 1) - (pic->reference - 1)); |
3316 | 414 emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1); |
415 } | |
416 src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize; | |
417 src_cr= pic->data[2] + (mx>>3) + (my>>3)*h->mb_uvlinesize; | |
1168 | 418 |
419 if(emu){ | |
3316 | 420 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); |
421 src_cb= s->edge_emu_buffer; | |
422 } | |
423 chroma_op(dest_cb, src_cb, h->mb_uvlinesize, chroma_height, mx&7, my&7); | |
424 | |
425 if(emu){ | |
426 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 | 427 src_cr= s->edge_emu_buffer; |
428 } | |
3316 | 429 chroma_op(dest_cr, src_cr, h->mb_uvlinesize, chroma_height, mx&7, my&7); |
1168 | 430 } |
431 | |
2415 | 432 static inline void mc_part_std(H264Context *h, int n, int square, int chroma_height, int delta, |
1168 | 433 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
434 int x_offset, int y_offset, | |
435 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
436 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | |
437 int list0, int list1){ | |
438 MpegEncContext * const s = &h->s; | |
439 qpel_mc_func *qpix_op= qpix_put; | |
440 h264_chroma_mc_func chroma_op= chroma_put; | |
2967 | 441 |
3316 | 442 dest_y += 2*x_offset + 2*y_offset*h-> mb_linesize; |
443 dest_cb += x_offset + y_offset*h->mb_uvlinesize; | |
444 dest_cr += x_offset + y_offset*h->mb_uvlinesize; | |
1168 | 445 x_offset += 8*s->mb_x; |
5815 | 446 y_offset += 8*(s->mb_y >> MB_FIELD); |
2967 | 447 |
1168 | 448 if(list0){ |
1169 | 449 Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ]; |
1168 | 450 mc_dir_part(h, ref, n, square, chroma_height, delta, 0, |
451 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
452 qpix_op, chroma_op); | |
453 | |
454 qpix_op= qpix_avg; | |
455 chroma_op= chroma_avg; | |
456 } | |
457 | |
458 if(list1){ | |
1169 | 459 Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ]; |
1168 | 460 mc_dir_part(h, ref, n, square, chroma_height, delta, 1, |
461 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
462 qpix_op, chroma_op); | |
463 } | |
464 } | |
465 | |
2415 | 466 static inline void mc_part_weighted(H264Context *h, int n, int square, int chroma_height, int delta, |
467 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
468 int x_offset, int y_offset, | |
469 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
470 h264_weight_func luma_weight_op, h264_weight_func chroma_weight_op, | |
471 h264_biweight_func luma_weight_avg, h264_biweight_func chroma_weight_avg, | |
472 int list0, int list1){ | |
473 MpegEncContext * const s = &h->s; | |
474 | |
3316 | 475 dest_y += 2*x_offset + 2*y_offset*h-> mb_linesize; |
476 dest_cb += x_offset + y_offset*h->mb_uvlinesize; | |
477 dest_cr += x_offset + y_offset*h->mb_uvlinesize; | |
2415 | 478 x_offset += 8*s->mb_x; |
5815 | 479 y_offset += 8*(s->mb_y >> MB_FIELD); |
2967 | 480 |
2415 | 481 if(list0 && list1){ |
482 /* don't optimize for luma-only case, since B-frames usually | |
483 * use implicit weights => chroma too. */ | |
484 uint8_t *tmp_cb = s->obmc_scratchpad; | |
3316 | 485 uint8_t *tmp_cr = s->obmc_scratchpad + 8; |
486 uint8_t *tmp_y = s->obmc_scratchpad + 8*h->mb_uvlinesize; | |
2415 | 487 int refn0 = h->ref_cache[0][ scan8[n] ]; |
488 int refn1 = h->ref_cache[1][ scan8[n] ]; | |
489 | |
490 mc_dir_part(h, &h->ref_list[0][refn0], n, square, chroma_height, delta, 0, | |
491 dest_y, dest_cb, dest_cr, | |
492 x_offset, y_offset, qpix_put, chroma_put); | |
493 mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1, | |
494 tmp_y, tmp_cb, tmp_cr, | |
495 x_offset, y_offset, qpix_put, chroma_put); | |
496 | |
497 if(h->use_weight == 2){ | |
11558 | 498 int weight0 = h->implicit_weight[refn0][refn1][s->mb_y&1]; |
2415 | 499 int weight1 = 64 - weight0; |
3316 | 500 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, weight1, 0); |
501 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0); | |
502 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0); | |
2415 | 503 }else{ |
3316 | 504 luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_denom, |
11349 | 505 h->luma_weight[refn0][0][0] , h->luma_weight[refn1][1][0], |
506 h->luma_weight[refn0][0][1] + h->luma_weight[refn1][1][1]); | |
3316 | 507 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
11349 | 508 h->chroma_weight[refn0][0][0][0] , h->chroma_weight[refn1][1][0][0], |
509 h->chroma_weight[refn0][0][0][1] + h->chroma_weight[refn1][1][0][1]); | |
3316 | 510 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
11349 | 511 h->chroma_weight[refn0][0][1][0] , h->chroma_weight[refn1][1][1][0], |
512 h->chroma_weight[refn0][0][1][1] + h->chroma_weight[refn1][1][1][1]); | |
2415 | 513 } |
514 }else{ | |
515 int list = list1 ? 1 : 0; | |
516 int refn = h->ref_cache[list][ scan8[n] ]; | |
517 Picture *ref= &h->ref_list[list][refn]; | |
518 mc_dir_part(h, ref, n, square, chroma_height, delta, list, | |
519 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
520 qpix_put, chroma_put); | |
521 | |
3316 | 522 luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom, |
11349 | 523 h->luma_weight[refn][list][0], h->luma_weight[refn][list][1]); |
2415 | 524 if(h->use_weight_chroma){ |
3316 | 525 chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
11349 | 526 h->chroma_weight[refn][list][0][0], h->chroma_weight[refn][list][0][1]); |
3316 | 527 chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
11349 | 528 h->chroma_weight[refn][list][1][0], h->chroma_weight[refn][list][1][1]); |
2415 | 529 } |
530 } | |
531 } | |
532 | |
533 static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta, | |
534 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
535 int x_offset, int y_offset, | |
536 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
537 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | |
2967 | 538 h264_weight_func *weight_op, h264_biweight_func *weight_avg, |
2415 | 539 int list0, int list1){ |
540 if((h->use_weight==2 && list0 && list1 | |
11558 | 541 && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ][h->s.mb_y&1] != 32)) |
2415 | 542 || h->use_weight==1) |
543 mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | |
544 x_offset, y_offset, qpix_put, chroma_put, | |
545 weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1); | |
546 else | |
547 mc_part_std(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | |
548 x_offset, y_offset, qpix_put, chroma_put, qpix_avg, chroma_avg, list0, list1); | |
549 } | |
550 | |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
551 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
|
552 /* fetch pixels for estimated mv 4 macroblocks ahead |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
553 * optimized for 64byte cache lines */ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
554 MpegEncContext * const s = &h->s; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
555 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
|
556 if(refn >= 0){ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
557 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
|
558 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
|
559 uint8_t **src= h->ref_list[list][refn].data; |
3316 | 560 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
|
561 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
|
562 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
|
563 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
|
564 } |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
565 } |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
566 |
1168 | 567 static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
568 qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put), | |
2415 | 569 qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg), |
570 h264_weight_func *weight_op, h264_biweight_func *weight_avg){ | |
1168 | 571 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
572 const int mb_xy= h->mb_xy; |
1168 | 573 const int mb_type= s->current_picture.mb_type[mb_xy]; |
2967 | 574 |
1168 | 575 assert(IS_INTER(mb_type)); |
2967 | 576 |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
577 prefetch_motion(h, 0); |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
578 |
1168 | 579 if(IS_16X16(mb_type)){ |
580 mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0, | |
581 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0], | |
10930 | 582 weight_op, weight_avg, |
1168 | 583 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
584 }else if(IS_16X8(mb_type)){ | |
585 mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0, | |
586 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0], | |
2415 | 587 &weight_op[1], &weight_avg[1], |
1168 | 588 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
589 mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4, | |
590 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0], | |
2415 | 591 &weight_op[1], &weight_avg[1], |
1168 | 592 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1)); |
593 }else if(IS_8X16(mb_type)){ | |
3316 | 594 mc_part(h, 0, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 0, 0, |
1168 | 595 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], |
2415 | 596 &weight_op[2], &weight_avg[2], |
1168 | 597 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
3316 | 598 mc_part(h, 4, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 4, 0, |
1168 | 599 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], |
2415 | 600 &weight_op[2], &weight_avg[2], |
1168 | 601 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1)); |
602 }else{ | |
603 int i; | |
2967 | 604 |
1168 | 605 assert(IS_8X8(mb_type)); |
606 | |
607 for(i=0; i<4; i++){ | |
608 const int sub_mb_type= h->sub_mb_type[i]; | |
609 const int n= 4*i; | |
610 int x_offset= (i&1)<<2; | |
611 int y_offset= (i&2)<<1; | |
612 | |
613 if(IS_SUB_8X8(sub_mb_type)){ | |
614 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
615 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], | |
2415 | 616 &weight_op[3], &weight_avg[3], |
1168 | 617 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
618 }else if(IS_SUB_8X4(sub_mb_type)){ | |
619 mc_part(h, n , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
620 qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1], | |
2415 | 621 &weight_op[4], &weight_avg[4], |
1168 | 622 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
623 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2, | |
624 qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1], | |
2415 | 625 &weight_op[4], &weight_avg[4], |
1168 | 626 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
627 }else if(IS_SUB_4X8(sub_mb_type)){ | |
3316 | 628 mc_part(h, n , 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset, |
1168 | 629 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], |
2415 | 630 &weight_op[5], &weight_avg[5], |
1168 | 631 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
3316 | 632 mc_part(h, n+1, 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset, |
1168 | 633 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], |
2415 | 634 &weight_op[5], &weight_avg[5], |
1168 | 635 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
636 }else{ | |
637 int j; | |
638 assert(IS_SUB_4X4(sub_mb_type)); | |
639 for(j=0; j<4; j++){ | |
640 int sub_x_offset= x_offset + 2*(j&1); | |
641 int sub_y_offset= y_offset + (j&2); | |
642 mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset, | |
643 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], | |
2415 | 644 &weight_op[6], &weight_avg[6], |
1168 | 645 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
646 } | |
647 } | |
648 } | |
649 } | |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
650 |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
651 prefetch_motion(h, 1); |
1168 | 652 } |
653 | |
654 | |
655 static void free_tables(H264Context *h){ | |
5079 | 656 int i; |
5642 | 657 H264Context *hx; |
1168 | 658 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
|
659 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
|
660 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
|
661 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
|
662 av_freep(&h->mvd_table[1]); |
2396 | 663 av_freep(&h->direct_table); |
1168 | 664 av_freep(&h->non_zero_count); |
665 av_freep(&h->slice_table_base); | |
666 h->slice_table= NULL; | |
10906 | 667 av_freep(&h->list_counts); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
668 |
1168 | 669 av_freep(&h->mb2b_xy); |
11282 | 670 av_freep(&h->mb2br_xy); |
2415 | 671 |
9386
a673af90ed8f
Loop up to MAX_THREADS instead of h->s.avctx->thread_count to free the thread
reimar
parents:
9384
diff
changeset
|
672 for(i = 0; i < MAX_THREADS; i++) { |
5642 | 673 hx = h->thread_context[i]; |
674 if(!hx) continue; | |
675 av_freep(&hx->top_borders[1]); | |
676 av_freep(&hx->top_borders[0]); | |
677 av_freep(&hx->s.obmc_scratchpad); | |
9862 | 678 av_freep(&hx->rbsp_buffer[1]); |
679 av_freep(&hx->rbsp_buffer[0]); | |
10528
6fe84da648e2
Reset rbsp buffer size when freeing its data buffer.
benoit
parents:
10514
diff
changeset
|
680 hx->rbsp_buffer_size[0] = 0; |
6fe84da648e2
Reset rbsp buffer size when freeing its data buffer.
benoit
parents:
10514
diff
changeset
|
681 hx->rbsp_buffer_size[1] = 0; |
9862 | 682 if (i) av_freep(&h->thread_context[i]); |
5642 | 683 } |
1168 | 684 } |
685 | |
2919 | 686 static void init_dequant8_coeff_table(H264Context *h){ |
687 int i,q,x; | |
11499 | 688 const int transpose = (h->h264dsp.h264_idct8_add != ff_h264_idct8_add_c); //FIXME ugly |
2919 | 689 h->dequant8_coeff[0] = h->dequant8_buffer[0]; |
690 h->dequant8_coeff[1] = h->dequant8_buffer[1]; | |
691 | |
692 for(i=0; i<2; i++ ){ | |
693 if(i && !memcmp(h->pps.scaling_matrix8[0], h->pps.scaling_matrix8[1], 64*sizeof(uint8_t))){ | |
694 h->dequant8_coeff[1] = h->dequant8_buffer[0]; | |
695 break; | |
696 } | |
697 | |
698 for(q=0; q<52; q++){ | |
7993
2dfff0e25b47
Mark ff_div6 and ff_rem6 static in h264.c. Patch by Diego Petten
lu_zero
parents:
7974
diff
changeset
|
699 int shift = div6[q]; |
2dfff0e25b47
Mark ff_div6 and ff_rem6 static in h264.c. Patch by Diego Petten
lu_zero
parents:
7974
diff
changeset
|
700 int idx = rem6[q]; |
2919 | 701 for(x=0; x<64; x++) |
3174 | 702 h->dequant8_coeff[i][q][transpose ? (x>>3)|((x&7)<<3) : x] = |
703 ((uint32_t)dequant8_coeff_init[idx][ dequant8_coeff_init_scan[((x>>1)&12) | (x&3)] ] * | |
704 h->pps.scaling_matrix8[i][x]) << shift; | |
2919 | 705 } |
706 } | |
707 } | |
708 | |
709 static void init_dequant4_coeff_table(H264Context *h){ | |
710 int i,j,q,x; | |
11499 | 711 const int transpose = (h->h264dsp.h264_idct_add != ff_h264_idct_add_c); //FIXME ugly |
2919 | 712 for(i=0; i<6; i++ ){ |
713 h->dequant4_coeff[i] = h->dequant4_buffer[i]; | |
714 for(j=0; j<i; j++){ | |
715 if(!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i], 16*sizeof(uint8_t))){ | |
716 h->dequant4_coeff[i] = h->dequant4_buffer[j]; | |
717 break; | |
718 } | |
719 } | |
720 if(j<i) | |
721 continue; | |
722 | |
723 for(q=0; q<52; q++){ | |
7993
2dfff0e25b47
Mark ff_div6 and ff_rem6 static in h264.c. Patch by Diego Petten
lu_zero
parents:
7974
diff
changeset
|
724 int shift = div6[q] + 2; |
2dfff0e25b47
Mark ff_div6 and ff_rem6 static in h264.c. Patch by Diego Petten
lu_zero
parents:
7974
diff
changeset
|
725 int idx = rem6[q]; |
2919 | 726 for(x=0; x<16; x++) |
3005 | 727 h->dequant4_coeff[i][q][transpose ? (x>>2)|((x<<2)&0xF) : x] = |
728 ((uint32_t)dequant4_coeff_init[idx][(x&1) + ((x>>2)&1)] * | |
2919 | 729 h->pps.scaling_matrix4[i][x]) << shift; |
730 } | |
731 } | |
732 } | |
733 | |
734 static void init_dequant_tables(H264Context *h){ | |
735 int i,x; | |
736 init_dequant4_coeff_table(h); | |
737 if(h->pps.transform_8x8_mode) | |
738 init_dequant8_coeff_table(h); | |
739 if(h->sps.transform_bypass){ | |
740 for(i=0; i<6; i++) | |
741 for(x=0; x<16; x++) | |
742 h->dequant4_coeff[i][0][x] = 1<<6; | |
743 if(h->pps.transform_8x8_mode) | |
744 for(i=0; i<2; i++) | |
745 for(x=0; x<64; x++) | |
746 h->dequant8_coeff[i][0][x] = 1<<6; | |
747 } | |
748 } | |
749 | |
750 | |
10852 | 751 int ff_h264_alloc_tables(H264Context *h){ |
1168 | 752 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
|
753 const int big_mb_num= s->mb_stride * (s->mb_height+1); |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
754 const int row_mb_num= 2*s->mb_stride*s->avctx->thread_count; |
2919 | 755 int x,y; |
1168 | 756 |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
757 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->intra4x4_pred_mode, row_mb_num * 8 * sizeof(uint8_t), fail) |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
758 |
10906 | 759 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->non_zero_count , big_mb_num * 32 * sizeof(uint8_t), fail) |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
760 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->slice_table_base , (big_mb_num+s->mb_stride) * sizeof(*h->slice_table_base), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
761 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->cbp_table, big_mb_num * sizeof(uint16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
762 |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
763 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t), fail) |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
764 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[0], 16*row_mb_num * sizeof(uint8_t), fail); |
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
765 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[1], 16*row_mb_num * sizeof(uint8_t), fail); |
11289 | 766 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->direct_table, 4*big_mb_num * sizeof(uint8_t) , fail); |
10906 | 767 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->list_counts, big_mb_num * sizeof(uint8_t), fail) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
768 |
8079
2d3c7cd7d143
Replace literally hardcoded max slice number by named constant.
michael
parents:
8042
diff
changeset
|
769 memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride) * sizeof(*h->slice_table_base)); |
3316 | 770 h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; |
1168 | 771 |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
772 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b_xy , big_mb_num * sizeof(uint32_t), fail); |
11282 | 773 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2br_xy , big_mb_num * sizeof(uint32_t), fail); |
1168 | 774 for(y=0; y<s->mb_height; y++){ |
775 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
|
776 const int mb_xy= x + y*s->mb_stride; |
1168 | 777 const int b_xy = 4*x + 4*y*h->b_stride; |
2967 | 778 |
1168 | 779 h->mb2b_xy [mb_xy]= b_xy; |
11283
853e93a50fe5
Cut the size of mvd_table by yet another factor of 2.
michael
parents:
11282
diff
changeset
|
780 h->mb2br_xy[mb_xy]= 8*(FMO ? mb_xy : (mb_xy % (2*s->mb_stride))); |
1168 | 781 } |
782 } | |
2415 | 783 |
2417 | 784 s->obmc_scratchpad = NULL; |
785 | |
2920 | 786 if(!h->dequant4_coeff[0]) |
787 init_dequant_tables(h); | |
788 | |
1168 | 789 return 0; |
790 fail: | |
791 free_tables(h); | |
792 return -1; | |
793 } | |
794 | |
5642 | 795 /** |
796 * Mimic alloc_tables(), but for every context thread. | |
797 */ | |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
798 static void clone_tables(H264Context *dst, H264Context *src, int i){ |
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
799 MpegEncContext * const s = &src->s; |
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
800 dst->intra4x4_pred_mode = src->intra4x4_pred_mode + i*8*2*s->mb_stride; |
5642 | 801 dst->non_zero_count = src->non_zero_count; |
802 dst->slice_table = src->slice_table; | |
803 dst->cbp_table = src->cbp_table; | |
804 dst->mb2b_xy = src->mb2b_xy; | |
11282 | 805 dst->mb2br_xy = src->mb2br_xy; |
5642 | 806 dst->chroma_pred_mode_table = src->chroma_pred_mode_table; |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
807 dst->mvd_table[0] = src->mvd_table[0] + i*8*2*s->mb_stride; |
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
808 dst->mvd_table[1] = src->mvd_table[1] + i*8*2*s->mb_stride; |
5642 | 809 dst->direct_table = src->direct_table; |
10923 | 810 dst->list_counts = src->list_counts; |
5642 | 811 |
812 dst->s.obmc_scratchpad = NULL; | |
813 ff_h264_pred_init(&dst->hpc, src->s.codec_id); | |
814 } | |
815 | |
816 /** | |
817 * Init context | |
818 * Allocate buffers which are not shared amongst multiple threads. | |
819 */ | |
820 static int context_init(H264Context *h){ | |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
821 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9985
diff
changeset
|
822 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t), fail) |
5642 | 823 |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
824 h->ref_cache[0][scan8[5 ]+1] = h->ref_cache[0][scan8[7 ]+1] = h->ref_cache[0][scan8[13]+1] = |
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
825 h->ref_cache[1][scan8[5 ]+1] = h->ref_cache[1][scan8[7 ]+1] = h->ref_cache[1][scan8[13]+1] = PART_NOT_AVAILABLE; |
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
826 |
5642 | 827 return 0; |
828 fail: | |
829 return -1; // free_tables will clean up for us | |
830 } | |
831 | |
11248
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
832 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size); |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
833 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6490
diff
changeset
|
834 static av_cold void common_init(H264Context *h){ |
1168 | 835 MpegEncContext * const s = &h->s; |
836 | |
837 s->width = s->avctx->width; | |
838 s->height = s->avctx->height; | |
839 s->codec_id= s->avctx->codec->id; | |
2967 | 840 |
11499 | 841 ff_h264dsp_init(&h->h264dsp); |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
842 ff_h264_pred_init(&h->hpc, s->codec_id); |
1168 | 843 |
2919 | 844 h->dequant_coeff_pps= -1; |
1698 | 845 s->unrestricted_mv=1; |
1168 | 846 s->decode=1; //FIXME |
2920 | 847 |
8402 | 848 dsputil_init(&s->dsp, s->avctx); // needed so that idct permutation is known early |
849 | |
2920 | 850 memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t)); |
851 memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t)); | |
1168 | 852 } |
853 | |
11777 | 854 int ff_h264_decode_extradata(H264Context *h) |
855 { | |
856 AVCodecContext *avctx = h->s.avctx; | |
857 | |
858 if(*(char *)avctx->extradata == 1){ | |
11248
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
859 int i, cnt, nalsize; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
860 unsigned char *p = avctx->extradata; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
861 |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
862 h->is_avc = 1; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
863 |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
864 if(avctx->extradata_size < 7) { |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
865 av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
866 return -1; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
867 } |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
868 /* sps and pps in the avcC always have length coded with 2 bytes, |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
869 so put a fake nal_length_size = 2 while parsing them */ |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
870 h->nal_length_size = 2; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
871 // Decode sps from avcC |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
872 cnt = *(p+5) & 0x1f; // Number of sps |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
873 p += 6; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
874 for (i = 0; i < cnt; i++) { |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
875 nalsize = AV_RB16(p) + 2; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
876 if(decode_nal_units(h, p, nalsize) < 0) { |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
877 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i); |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
878 return -1; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
879 } |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
880 p += nalsize; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
881 } |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
882 // Decode pps from avcC |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
883 cnt = *(p++); // Number of pps |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
884 for (i = 0; i < cnt; i++) { |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
885 nalsize = AV_RB16(p) + 2; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
886 if(decode_nal_units(h, p, nalsize) != nalsize) { |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
887 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i); |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
888 return -1; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
889 } |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
890 p += nalsize; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
891 } |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
892 // Now store right nal length size, that will be use to parse all other nals |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
893 h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
894 } else { |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
895 h->is_avc = 0; |
11777 | 896 if(decode_nal_units(h, avctx->extradata, avctx->extradata_size) < 0) |
11248
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
897 return -1; |
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
898 } |
11777 | 899 return 0; |
900 } | |
901 | |
902 av_cold int ff_h264_decode_init(AVCodecContext *avctx){ | |
903 H264Context *h= avctx->priv_data; | |
904 MpegEncContext * const s = &h->s; | |
905 | |
906 MPV_decode_defaults(s); | |
907 | |
908 s->avctx = avctx; | |
909 common_init(h); | |
910 | |
911 s->out_format = FMT_H264; | |
912 s->workaround_bugs= avctx->workaround_bugs; | |
913 | |
914 // set defaults | |
915 // s->decode_mb= ff_h263_decode_mb; | |
916 s->quarter_sample = 1; | |
917 if(!avctx->has_b_frames) | |
918 s->low_delay= 1; | |
919 | |
920 avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; | |
921 | |
922 ff_h264_decode_init_vlc(); | |
923 | |
924 h->thread_context[0] = h; | |
925 h->outputed_poc = INT_MIN; | |
926 h->prev_poc_msb= 1<<16; | |
927 h->x264_build = -1; | |
928 ff_h264_reset_sei(h); | |
929 if(avctx->codec_id == CODEC_ID_H264){ | |
930 if(avctx->ticks_per_frame == 1){ | |
931 s->avctx->time_base.den *=2; | |
932 } | |
933 avctx->ticks_per_frame = 2; | |
934 } | |
935 | |
936 if(avctx->extradata_size > 0 && avctx->extradata && | |
937 ff_h264_decode_extradata(h)) | |
938 return -1; | |
939 | |
11249
6f17564ec228
Try to set has_b_frames in codec init if we know everything alraedy.
michael
parents:
11248
diff
changeset
|
940 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames < h->sps.num_reorder_frames){ |
6f17564ec228
Try to set has_b_frames in codec init if we know everything alraedy.
michael
parents:
11248
diff
changeset
|
941 s->avctx->has_b_frames = h->sps.num_reorder_frames; |
6f17564ec228
Try to set has_b_frames in codec init if we know everything alraedy.
michael
parents:
11248
diff
changeset
|
942 s->low_delay = 0; |
6f17564ec228
Try to set has_b_frames in codec init if we know everything alraedy.
michael
parents:
11248
diff
changeset
|
943 } |
11248
926dde10e50d
Move extradata reading code into codec init instead of doing it
michael
parents:
11236
diff
changeset
|
944 |
1168 | 945 return 0; |
946 } | |
947 | |
10852 | 948 int ff_h264_frame_start(H264Context *h){ |
1168 | 949 MpegEncContext * const s = &h->s; |
950 int i; | |
951 | |
2935 | 952 if(MPV_frame_start(s, s->avctx) < 0) |
953 return -1; | |
1168 | 954 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
|
955 /* |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
956 * 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
|
957 * This is incorrect for H.264; IDR markings must be used. |
7374 | 958 * Zero here; IDR markings per slice in frame or fields are ORed in later. |
5773
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
959 * 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
|
960 */ |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
961 s->current_picture_ptr->key_frame= 0; |
9885 | 962 s->current_picture_ptr->mmco_reset= 0; |
1168 | 963 |
964 assert(s->linesize && s->uvlinesize); | |
965 | |
966 for(i=0; i<16; i++){ | |
967 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
|
968 h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3); |
1168 | 969 } |
970 for(i=0; i<4; i++){ | |
971 h->block_offset[16+i]= | |
972 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
|
973 h->block_offset[24+16+i]= |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
974 h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3); |
1168 | 975 } |
976 | |
2416
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
977 /* 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
|
978 * FIXME: redo bipred weight to not require extra buffer? */ |
5642 | 979 for(i = 0; i < s->avctx->thread_count; i++) |
980 if(!h->thread_context[i]->s.obmc_scratchpad) | |
981 h->thread_context[i]->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize); | |
3316 | 982 |
11465 | 983 /* some macroblocks can be accessed before they're available in case of lost slices, mbaff or threading*/ |
11466 | 984 memset(h->slice_table, -1, (s->mb_height*s->mb_stride-1) * sizeof(*h->slice_table)); |
2416
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
985 |
1168 | 986 // s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1; |
7318 | 987 |
7374 | 988 // We mark the current picture as non-reference after allocating it, so |
7318 | 989 // that if we break out due to an error it can be released automatically |
990 // in the next MPV_frame_start(). | |
991 // SVQ3 as well as most other codecs have only last/next/current and thus | |
992 // get released even with set reference, besides SVQ3 and others do not | |
993 // mark frames as reference later "naturally". | |
994 if(s->codec_id != CODEC_ID_SVQ3) | |
995 s->current_picture_ptr->reference= 0; | |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
996 |
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
997 s->current_picture_ptr->field_poc[0]= |
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
998 s->current_picture_ptr->field_poc[1]= INT_MAX; |
7386
00b1f0ecb386
Assert that long_ref has been cleared for released pics.
michael
parents:
7385
diff
changeset
|
999 assert(s->current_picture_ptr->long_ref==0); |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
1000 |
2935 | 1001 return 0; |
1168 | 1002 } |
1003 | |
5106 | 1004 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
|
1005 MpegEncContext * const s = &h->s; |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1006 uint8_t *top_border; |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1007 int top_idx = 1; |
2967 | 1008 |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1009 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
|
1010 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
|
1011 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
|
1012 |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1013 if(!simple && FRAME_MBAFF){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1014 if(s->mb_y&1){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1015 if(!MB_MBAFF){ |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1016 top_border = h->top_borders[0][s->mb_x]; |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1017 AV_COPY128(top_border, src_y + 15*linesize); |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1018 if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1019 AV_COPY64(top_border+16, src_cb+7*uvlinesize); |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1020 AV_COPY64(top_border+24, src_cr+7*uvlinesize); |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1021 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1022 } |
10906 | 1023 }else if(MB_MBAFF){ |
1024 top_idx = 0; | |
1025 }else | |
1026 return; | |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1027 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1028 |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1029 top_border = h->top_borders[top_idx][s->mb_x]; |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
1030 // 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
|
1031 // and the line above the bottom macroblock |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1032 AV_COPY128(top_border, src_y + 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
|
1033 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1034 if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1035 AV_COPY64(top_border+16, src_cb+8*uvlinesize); |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1036 AV_COPY64(top_border+24, 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
|
1037 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1038 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1039 |
5106 | 1040 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
|
1041 MpegEncContext * const s = &h->s; |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1042 int deblock_left; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1043 int deblock_top; |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1044 int top_idx = 1; |
11003
72c026446d67
100l, correct wrong H.264+adaptive MBAFF decoding
astrange
parents:
11002
diff
changeset
|
1045 uint8_t *top_border_m1; |
72c026446d67
100l, correct wrong H.264+adaptive MBAFF decoding
astrange
parents:
11002
diff
changeset
|
1046 uint8_t *top_border; |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1047 |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1048 if(!simple && FRAME_MBAFF){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1049 if(s->mb_y&1){ |
10906 | 1050 if(!MB_MBAFF) |
1051 return; | |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1052 }else{ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1053 top_idx = MB_MBAFF ? 0 : 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1054 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1055 } |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1056 |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1057 if(h->deblocking_filter == 2) { |
11202
778139a5e058
Simplify deblock_left/top condition for deblocking_filter=2
michael
parents:
11192
diff
changeset
|
1058 deblock_left = h->left_type[0]; |
778139a5e058
Simplify deblock_left/top condition for deblocking_filter=2
michael
parents:
11192
diff
changeset
|
1059 deblock_top = h->top_type; |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1060 } else { |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1061 deblock_left = (s->mb_x > 0); |
7926
224dea3d9ac8
Avoid out of picture accesses when CODEC_FLAG_EMU_EDGE is set.
michael
parents:
7923
diff
changeset
|
1062 deblock_top = (s->mb_y > !!MB_FIELD); |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
1063 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1064 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1065 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
|
1066 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
|
1067 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
|
1068 |
11003
72c026446d67
100l, correct wrong H.264+adaptive MBAFF decoding
astrange
parents:
11002
diff
changeset
|
1069 top_border_m1 = h->top_borders[top_idx][s->mb_x-1]; |
72c026446d67
100l, correct wrong H.264+adaptive MBAFF decoding
astrange
parents:
11002
diff
changeset
|
1070 top_border = h->top_borders[top_idx][s->mb_x]; |
72c026446d67
100l, correct wrong H.264+adaptive MBAFF decoding
astrange
parents:
11002
diff
changeset
|
1071 |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1072 #define XCHG(a,b,xchg)\ |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1073 if (xchg) AV_SWAP64(b,a);\ |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1074 else AV_COPY64(b,a); |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
1075 |
10906 | 1076 if(deblock_top){ |
1077 if(deblock_left){ | |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1078 XCHG(top_border_m1+8, src_y -7, 1); |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1079 } |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1080 XCHG(top_border+0, src_y +1, xchg); |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1081 XCHG(top_border+8, src_y +9, 1); |
2803 | 1082 if(s->mb_x+1 < s->mb_width){ |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1083 XCHG(h->top_borders[top_idx][s->mb_x+1], src_y +17, 1); |
2755 | 1084 } |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
1085 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1086 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1087 if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
10906 | 1088 if(deblock_top){ |
1089 if(deblock_left){ | |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1090 XCHG(top_border_m1+16, src_cb -7, 1); |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1091 XCHG(top_border_m1+24, src_cr -7, 1); |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1092 } |
11002
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1093 XCHG(top_border+16, src_cb+1, 1); |
1c8892d7a090
H.264: Use 64-/128-bit write-combining macros for copies
astrange
parents:
10989
diff
changeset
|
1094 XCHG(top_border+24, src_cr+1, 1); |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
1095 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1096 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1097 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
1098 |
4908
777f250df232
Fix multiple "inline/static is not at beginning of declaration" warnings.
diego
parents:
4896
diff
changeset
|
1099 static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple){ |
1168 | 1100 MpegEncContext * const s = &h->s; |
1101 const int mb_x= s->mb_x; | |
1102 const int mb_y= s->mb_y; | |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
1103 const int mb_xy= h->mb_xy; |
1168 | 1104 const int mb_type= s->current_picture.mb_type[mb_xy]; |
1105 uint8_t *dest_y, *dest_cb, *dest_cr; | |
1106 int linesize, uvlinesize /*dct_offset*/; | |
1107 int i; | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
1108 int *block_offset = &h->block_offset[0]; |
8352 | 1109 const int transform_bypass = !simple && (s->qscale == 0 && h->sps.transform_bypass); |
8543
2cc3cf7b09b1
Disable SVQ3 checks if SVQ3 support is not compiled in.
diego
parents:
8525
diff
changeset
|
1110 /* is_h264 should always be true if SVQ3 is disabled. */ |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1111 const int is_h264 = !CONFIG_SVQ3_DECODER || simple || s->codec_id == CODEC_ID_H264; |
2763 | 1112 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
|
1113 void (*idct_dc_add)(uint8_t *dst, DCTELEM *block, int stride); |
1168 | 1114 |
8355
179f8e1327ce
Factorize 3 multiplications out, code becomes 3 cpu cycles faster.
michael
parents:
8354
diff
changeset
|
1115 dest_y = s->current_picture.data[0] + (mb_x + mb_y * s->linesize ) * 16; |
179f8e1327ce
Factorize 3 multiplications out, code becomes 3 cpu cycles faster.
michael
parents:
8354
diff
changeset
|
1116 dest_cb = s->current_picture.data[1] + (mb_x + mb_y * s->uvlinesize) * 8; |
179f8e1327ce
Factorize 3 multiplications out, code becomes 3 cpu cycles faster.
michael
parents:
8354
diff
changeset
|
1117 dest_cr = s->current_picture.data[2] + (mb_x + mb_y * s->uvlinesize) * 8; |
1168 | 1118 |
4000 | 1119 s->dsp.prefetch(dest_y + (s->mb_x&3)*4*s->linesize + 64, s->linesize, 4); |
1120 s->dsp.prefetch(dest_cb + (s->mb_x&7)*s->uvlinesize + 64, dest_cr - dest_cb, 2); | |
1121 | |
10906 | 1122 h->list_counts[mb_xy]= h->list_count; |
1123 | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1124 if (!simple && MB_FIELD) { |
3316 | 1125 linesize = h->mb_linesize = s->linesize * 2; |
1126 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
|
1127 block_offset = &h->block_offset[24]; |
7374 | 1128 if(mb_y&1){ //FIXME move out of this function? |
1168 | 1129 dest_y -= s->linesize*15; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
1130 dest_cb-= s->uvlinesize*7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
1131 dest_cr-= s->uvlinesize*7; |
1168 | 1132 } |
3316 | 1133 if(FRAME_MBAFF) { |
1134 int list; | |
4533 | 1135 for(list=0; list<h->list_count; list++){ |
3316 | 1136 if(!USES_LIST(mb_type, list)) |
1137 continue; | |
1138 if(IS_16X16(mb_type)){ | |
1139 int8_t *ref = &h->ref_cache[list][scan8[0]]; | |
6203 | 1140 fill_rectangle(ref, 4, 4, 8, (16+*ref)^(s->mb_y&1), 1); |
3316 | 1141 }else{ |
1142 for(i=0; i<16; i+=4){ | |
1143 int ref = h->ref_cache[list][scan8[i]]; | |
1144 if(ref >= 0) | |
6203 | 1145 fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, (16+ref)^(s->mb_y&1), 1); |
3316 | 1146 } |
1147 } | |
1148 } | |
1149 } | |
1168 | 1150 } else { |
3316 | 1151 linesize = h->mb_linesize = s->linesize; |
1152 uvlinesize = h->mb_uvlinesize = s->uvlinesize; | |
1168 | 1153 // dct_offset = s->linesize * 16; |
1154 } | |
2967 | 1155 |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1156 if (!simple && IS_INTRA_PCM(mb_type)) { |
7450 | 1157 for (i=0; i<16; i++) { |
1158 memcpy(dest_y + i* linesize, h->mb + i*8, 16); | |
1159 } | |
1160 for (i=0; i<8; i++) { | |
1161 memcpy(dest_cb+ i*uvlinesize, h->mb + 128 + i*4, 8); | |
1162 memcpy(dest_cr+ i*uvlinesize, h->mb + 160 + i*4, 8); | |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
1163 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1164 } else { |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1165 if(IS_INTRA(mb_type)){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1166 if(h->deblocking_filter) |
5106 | 1167 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
|
1168 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1169 if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
1170 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
|
1171 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
|
1172 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1173 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1174 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
|
1175 if(simple || !s->encoding){ |
2755 | 1176 if(IS_8x8DCT(mb_type)){ |
8379
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1177 if(transform_bypass){ |
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1178 idct_dc_add = |
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1179 idct_add = s->dsp.add_pixels8; |
8382
fe7d1c920aeb
Remove useless IS_8x8DCT check i forgot, spotted by dark shikari.
michael
parents:
8379
diff
changeset
|
1180 }else{ |
11499 | 1181 idct_dc_add = h->h264dsp.h264_idct8_dc_add; |
1182 idct_add = h->h264dsp.h264_idct8_add; | |
8379
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1183 } |
2755 | 1184 for(i=0; i<16; i+=4){ |
1185 uint8_t * const ptr= dest_y + block_offset[i]; | |
1186 const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ]; | |
8352 | 1187 if(transform_bypass && h->sps.profile_idc==244 && dir<=1){ |
1188 h->hpc.pred8x8l_add[dir](ptr, h->mb + i*16, linesize); | |
1189 }else{ | |
8357
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1190 const int nnz = h->non_zero_count_cache[ scan8[i] ]; |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1191 h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000, |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1192 (h->topright_samples_available<<i)&0x4000, linesize); |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1193 if(nnz){ |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1194 if(nnz == 1 && h->mb[i*16]) |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1195 idct_dc_add(ptr, h->mb + i*16, linesize); |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1196 else |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1197 idct_add (ptr, h->mb + i*16, linesize); |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1198 } |
8352 | 1199 } |
2755 | 1200 } |
8379
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1201 }else{ |
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1202 if(transform_bypass){ |
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1203 idct_dc_add = |
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1204 idct_add = s->dsp.add_pixels4; |
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1205 }else{ |
11499 | 1206 idct_dc_add = h->h264dsp.h264_idct_dc_add; |
1207 idct_add = h->h264dsp.h264_idct_add; | |
8379
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1208 } |
8389 | 1209 for(i=0; i<16; i++){ |
1210 uint8_t * const ptr= dest_y + block_offset[i]; | |
1211 const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ]; | |
1212 | |
1213 if(transform_bypass && h->sps.profile_idc==244 && dir<=1){ | |
1214 h->hpc.pred4x4_add[dir](ptr, h->mb + i*16, linesize); | |
1215 }else{ | |
1216 uint8_t *topright; | |
1217 int nnz, tr; | |
1218 if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){ | |
1219 const int topright_avail= (h->topright_samples_available<<i)&0x8000; | |
1220 assert(mb_y || linesize <= block_offset[i]); | |
1221 if(!topright_avail){ | |
1222 tr= ptr[3 - linesize]*0x01010101; | |
1223 topright= (uint8_t*) &tr; | |
1224 }else | |
1225 topright= ptr + 4 - linesize; | |
8357
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1226 }else |
8389 | 1227 topright= NULL; |
1228 | |
1229 h->hpc.pred4x4[ dir ](ptr, topright, linesize); | |
1230 nnz = h->non_zero_count_cache[ scan8[i] ]; | |
1231 if(nnz){ | |
1232 if(is_h264){ | |
1233 if(nnz == 1 && h->mb[i*16]) | |
1234 idct_dc_add(ptr, h->mb + i*16, linesize); | |
1235 else | |
1236 idct_add (ptr, h->mb + i*16, linesize); | |
1237 }else | |
11031 | 1238 ff_svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0); |
8389 | 1239 } |
8357
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1240 } |
8352 | 1241 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1242 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1243 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1244 }else{ |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
1245 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
|
1246 if(is_h264){ |
2763 | 1247 if(!transform_bypass) |
5727 | 1248 h264_luma_dc_dequant_idct_c(h->mb, s->qscale, h->dequant4_coeff[0][s->qscale][0]); |
2763 | 1249 }else |
11031 | 1250 ff_svq3_luma_dc_dequant_idct_c(h->mb, s->qscale); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1251 } |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
1252 if(h->deblocking_filter) |
5106 | 1253 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
|
1254 }else if(is_h264){ |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1255 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
|
1256 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
|
1257 s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab, |
11499 | 1258 h->h264dsp.weight_h264_pixels_tab, h->h264dsp.biweight_h264_pixels_tab); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1259 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1260 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1261 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1262 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
|
1263 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
1264 if(IS_INTRA16x16(mb_type)){ |
8376
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1265 if(transform_bypass){ |
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1266 if(h->sps.profile_idc==244 && (h->intra16x16_pred_mode==VERT_PRED8x8 || h->intra16x16_pred_mode==HOR_PRED8x8)){ |
8377 | 1267 h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset, h->mb, linesize); |
1268 }else{ | |
1269 for(i=0; i<16; i++){ | |
1270 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]) | |
8379
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1271 s->dsp.add_pixels4(dest_y + block_offset[i], h->mb + i*16, linesize); |
8377 | 1272 } |
8357
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1273 } |
8376
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1274 }else{ |
11499 | 1275 h->h264dsp.h264_idct_add16intra(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache); |
8352 | 1276 } |
8374
9000fd7c166e
Skip non intra luma code when there is no coded luma.
michael
parents:
8372
diff
changeset
|
1277 }else if(h->cbp&15){ |
8376
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1278 if(transform_bypass){ |
8377 | 1279 const int di = IS_8x8DCT(mb_type) ? 4 : 1; |
8379
be5e0a75b457
Do not calculate idct_dc_add/idct_add when the variables are unused.
michael
parents:
8378
diff
changeset
|
1280 idct_add= IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 : s->dsp.add_pixels4; |
8377 | 1281 for(i=0; i<16; i+=di){ |
8378 | 1282 if(h->non_zero_count_cache[ scan8[i] ]){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
1283 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
8377 | 1284 } |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
1285 } |
8376
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1286 }else{ |
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1287 if(IS_8x8DCT(mb_type)){ |
11499 | 1288 h->h264dsp.h264_idct8_add4(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache); |
8376
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1289 }else{ |
11499 | 1290 h->h264dsp.h264_idct_add16(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache); |
8376
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1291 } |
e1b242224970
Use the new idct functions (except chroma as it was slower in benchmarks)
michael
parents:
8374
diff
changeset
|
1292 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1293 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1294 }else{ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1295 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
|
1296 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
|
1297 uint8_t * const ptr= dest_y + block_offset[i]; |
11031 | 1298 ff_svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0); |
1234 | 1299 } |
1168 | 1300 } |
1301 } | |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1302 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1303 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1304 if((simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)) && (h->cbp&0x30)){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
1305 uint8_t *dest[2] = {dest_cb, dest_cr}; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
1306 if(transform_bypass){ |
8388
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1307 if(IS_INTRA(mb_type) && h->sps.profile_idc==244 && (h->chroma_pred_mode==VERT_PRED8x8 || h->chroma_pred_mode==HOR_PRED8x8)){ |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1308 h->hpc.pred8x8_add[h->chroma_pred_mode](dest[0], block_offset + 16, h->mb + 16*16, uvlinesize); |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1309 h->hpc.pred8x8_add[h->chroma_pred_mode](dest[1], block_offset + 20, h->mb + 20*16, uvlinesize); |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1310 }else{ |
8390 | 1311 idct_add = s->dsp.add_pixels4; |
8388
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1312 for(i=16; i<16+8; i++){ |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1313 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]) |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1314 idct_add (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1315 } |
9eb29759df54
Reorder ifs in chroma hl_decode_mb to avoid a duplicate transform_bypass
michael
parents:
8387
diff
changeset
|
1316 } |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
1317 }else{ |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
1318 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
|
1319 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]); |
8389 | 1320 if(is_h264){ |
11499 | 1321 idct_add = h->h264dsp.h264_idct_add; |
1322 idct_dc_add = h->h264dsp.h264_idct_dc_add; | |
8357
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1323 for(i=16; i<16+8; i++){ |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1324 if(h->non_zero_count_cache[ scan8[i] ]) |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1325 idct_add (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1326 else if(h->mb[i*16]) |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1327 idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
1ef90fd7706a
Fix indention, also do a little vertical alignment of changed lines.
michael
parents:
8355
diff
changeset
|
1328 } |
8389 | 1329 }else{ |
1330 for(i=16; i<16+8; i++){ | |
1331 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ | |
1332 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i]; | |
11031 | 1333 ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff_h264_chroma_qp[s->qscale + 12] - 12, 2); |
8389 | 1334 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
1335 } |
1250 | 1336 } |
1168 | 1337 } |
1338 } | |
1339 } | |
8415 | 1340 if(h->cbp || IS_INTRA(mb_type)) |
1341 s->dsp.clear_blocks(h->mb); | |
1168 | 1342 } |
1343 | |
1344 /** | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1345 * 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
|
1346 */ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1347 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
|
1348 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
|
1349 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1350 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1351 /** |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1352 * 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
|
1353 */ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1354 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
|
1355 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
|
1356 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1357 |
10852 | 1358 void ff_h264_hl_decode_mb(H264Context *h){ |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1359 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
1360 const int mb_xy= h->mb_xy; |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1361 const int mb_type= s->current_picture.mb_type[mb_xy]; |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1362 int is_complex = CONFIG_SMALL || h->is_complex || IS_INTRA_PCM(mb_type) || s->qscale == 0; |
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1363 |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1364 if (is_complex) |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1365 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
|
1366 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
|
1367 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
1368 |
1168 | 1369 static int pred_weight_table(H264Context *h){ |
1370 MpegEncContext * const s = &h->s; | |
1371 int list, i; | |
2415 | 1372 int luma_def, chroma_def; |
2967 | 1373 |
2415 | 1374 h->use_weight= 0; |
1375 h->use_weight_chroma= 0; | |
1168 | 1376 h->luma_log2_weight_denom= get_ue_golomb(&s->gb); |
1377 h->chroma_log2_weight_denom= get_ue_golomb(&s->gb); | |
2415 | 1378 luma_def = 1<<h->luma_log2_weight_denom; |
1379 chroma_def = 1<<h->chroma_log2_weight_denom; | |
1168 | 1380 |
1381 for(list=0; list<2; list++){ | |
8735
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
1382 h->luma_weight_flag[list] = 0; |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
1383 h->chroma_weight_flag[list] = 0; |
1168 | 1384 for(i=0; i<h->ref_count[list]; i++){ |
1385 int luma_weight_flag, chroma_weight_flag; | |
2967 | 1386 |
1168 | 1387 luma_weight_flag= get_bits1(&s->gb); |
1388 if(luma_weight_flag){ | |
11349 | 1389 h->luma_weight[i][list][0]= get_se_golomb(&s->gb); |
1390 h->luma_weight[i][list][1]= get_se_golomb(&s->gb); | |
1391 if( h->luma_weight[i][list][0] != luma_def | |
1392 || h->luma_weight[i][list][1] != 0) { | |
2415 | 1393 h->use_weight= 1; |
8735
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
1394 h->luma_weight_flag[list]= 1; |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
1395 } |
2415 | 1396 }else{ |
11349 | 1397 h->luma_weight[i][list][0]= luma_def; |
1398 h->luma_weight[i][list][1]= 0; | |
1168 | 1399 } |
1400 | |
7407 | 1401 if(CHROMA){ |
7408 | 1402 chroma_weight_flag= get_bits1(&s->gb); |
1403 if(chroma_weight_flag){ | |
1404 int j; | |
1405 for(j=0; j<2; j++){ | |
11349 | 1406 h->chroma_weight[i][list][j][0]= get_se_golomb(&s->gb); |
1407 h->chroma_weight[i][list][j][1]= get_se_golomb(&s->gb); | |
1408 if( h->chroma_weight[i][list][j][0] != chroma_def | |
1409 || h->chroma_weight[i][list][j][1] != 0) { | |
7408 | 1410 h->use_weight_chroma= 1; |
8735
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
1411 h->chroma_weight_flag[list]= 1; |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
1412 } |
7408 | 1413 } |
1414 }else{ | |
1415 int j; | |
1416 for(j=0; j<2; j++){ | |
11349 | 1417 h->chroma_weight[i][list][j][0]= chroma_def; |
1418 h->chroma_weight[i][list][j][1]= 0; | |
7408 | 1419 } |
2415 | 1420 } |
7407 | 1421 } |
1168 | 1422 } |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
1423 if(h->slice_type_nos != FF_B_TYPE) break; |
1168 | 1424 } |
2415 | 1425 h->use_weight= h->use_weight || h->use_weight_chroma; |
1168 | 1426 return 0; |
1427 } | |
1428 | |
11558 | 1429 /** |
1430 * Initialize implicit_weight table. | |
12064 | 1431 * @param field 0/1 initialize the weight for interlaced MBAFF |
11558 | 1432 * -1 initializes the rest |
1433 */ | |
1434 static void implicit_weight_table(H264Context *h, int field){ | |
2415 | 1435 MpegEncContext * const s = &h->s; |
11558 | 1436 int ref0, ref1, i, cur_poc, ref_start, ref_count0, ref_count1; |
2415 | 1437 |
8956
de631175196e
Move initialization of {luma,chroma}_weight_flag[] up,
benoit
parents:
8955
diff
changeset
|
1438 for (i = 0; i < 2; i++) { |
de631175196e
Move initialization of {luma,chroma}_weight_flag[] up,
benoit
parents:
8955
diff
changeset
|
1439 h->luma_weight_flag[i] = 0; |
de631175196e
Move initialization of {luma,chroma}_weight_flag[] up,
benoit
parents:
8955
diff
changeset
|
1440 h->chroma_weight_flag[i] = 0; |
de631175196e
Move initialization of {luma,chroma}_weight_flag[] up,
benoit
parents:
8955
diff
changeset
|
1441 } |
de631175196e
Move initialization of {luma,chroma}_weight_flag[] up,
benoit
parents:
8955
diff
changeset
|
1442 |
11558 | 1443 if(field < 0){ |
1444 cur_poc = s->current_picture_ptr->poc; | |
1445 if( h->ref_count[0] == 1 && h->ref_count[1] == 1 && !FRAME_MBAFF | |
2415 | 1446 && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){ |
1447 h->use_weight= 0; | |
1448 h->use_weight_chroma= 0; | |
1449 return; | |
1450 } | |
11558 | 1451 ref_start= 0; |
1452 ref_count0= h->ref_count[0]; | |
1453 ref_count1= h->ref_count[1]; | |
1454 }else{ | |
1455 cur_poc = s->current_picture_ptr->field_poc[field]; | |
1456 ref_start= 16; | |
1457 ref_count0= 16+2*h->ref_count[0]; | |
1458 ref_count1= 16+2*h->ref_count[1]; | |
1459 } | |
2415 | 1460 |
1461 h->use_weight= 2; | |
1462 h->use_weight_chroma= 2; | |
1463 h->luma_log2_weight_denom= 5; | |
1464 h->chroma_log2_weight_denom= 5; | |
1465 | |
11558 | 1466 for(ref0=ref_start; ref0 < ref_count0; ref0++){ |
2415 | 1467 int poc0 = h->ref_list[0][ref0].poc; |
11558 | 1468 for(ref1=ref_start; ref1 < ref_count1; ref1++){ |
2519 | 1469 int poc1 = h->ref_list[1][ref1].poc; |
4594 | 1470 int td = av_clip(poc1 - poc0, -128, 127); |
11558 | 1471 int w= 32; |
2415 | 1472 if(td){ |
4594 | 1473 int tb = av_clip(cur_poc - poc0, -128, 127); |
4001 | 1474 int tx = (16384 + (FFABS(td) >> 1)) / td; |
11338 | 1475 int dist_scale_factor = (tb*tx + 32) >> 8; |
1476 if(dist_scale_factor >= -64 && dist_scale_factor <= 128) | |
11558 | 1477 w = 64 - dist_scale_factor; |
1478 } | |
1479 if(field<0){ | |
1480 h->implicit_weight[ref0][ref1][0]= | |
1481 h->implicit_weight[ref0][ref1][1]= w; | |
1482 }else{ | |
1483 h->implicit_weight[ref0][ref1][field]=w; | |
11338 | 1484 } |
2415 | 1485 } |
1486 } | |
1487 } | |
1488 | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
1489 /** |
2392 | 1490 * instantaneous decoder refresh. |
1168 | 1491 */ |
1492 static void idr(H264Context *h){ | |
10862
d9c084a0c22b
Split all the reference picture handling off h264.c.
michael
parents:
10859
diff
changeset
|
1493 ff_h264_remove_all_refs(h); |
7362
443fdc440854
Reset prev_frame_num for idr frames as required by the spec.
michael
parents:
7361
diff
changeset
|
1494 h->prev_frame_num= 0; |
7379 | 1495 h->prev_frame_num_offset= 0; |
1496 h->prev_poc_msb= | |
1497 h->prev_poc_lsb= 0; | |
1168 | 1498 } |
1499 | |
2640 | 1500 /* forget old pics after a seek */ |
1501 static void flush_dpb(AVCodecContext *avctx){ | |
1502 H264Context *h= avctx->priv_data; | |
1503 int i; | |
7283
39e81fdd8d23
Move the size of the H264Context delayed_pic array into a #define.
astrange
parents:
7277
diff
changeset
|
1504 for(i=0; i<MAX_DELAYED_PIC_COUNT; i++) { |
3144 | 1505 if(h->delayed_pic[i]) |
1506 h->delayed_pic[i]->reference= 0; | |
2640 | 1507 h->delayed_pic[i]= NULL; |
3144 | 1508 } |
7310
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
1509 h->outputed_poc= INT_MIN; |
9831
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
1510 h->prev_interlaced_frame = 1; |
2640 | 1511 idr(h); |
2751
3247049dfc7a
fix segfault if flush is called before the first frame
mru
parents:
2748
diff
changeset
|
1512 if(h->s.current_picture_ptr) |
3247049dfc7a
fix segfault if flush is called before the first frame
mru
parents:
2748
diff
changeset
|
1513 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
|
1514 h->s.first_field= 0; |
10858 | 1515 ff_h264_reset_sei(h); |
5926
77403dc808cd
Call mpegvideo flush routine on h264 flush. Needed in particular
heydowns
parents:
5904
diff
changeset
|
1516 ff_mpeg_flush(avctx); |
2640 | 1517 } |
1518 | |
1168 | 1519 static int init_poc(H264Context *h){ |
1520 MpegEncContext * const s = &h->s; | |
1521 const int max_frame_num= 1<<h->sps.log2_max_frame_num; | |
1522 int field_poc[2]; | |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
1523 Picture *cur = s->current_picture_ptr; |
1168 | 1524 |
7381 | 1525 h->frame_num_offset= h->prev_frame_num_offset; |
7380 | 1526 if(h->frame_num < h->prev_frame_num) |
7381 | 1527 h->frame_num_offset += max_frame_num; |
1168 | 1528 |
1529 if(h->sps.poc_type==0){ | |
1530 const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb; | |
1531 | |
1532 if (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2) | |
1533 h->poc_msb = h->prev_poc_msb + max_poc_lsb; | |
1534 else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2) | |
1535 h->poc_msb = h->prev_poc_msb - max_poc_lsb; | |
1536 else | |
1537 h->poc_msb = h->prev_poc_msb; | |
1538 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb); | |
2967 | 1539 field_poc[0] = |
1168 | 1540 field_poc[1] = h->poc_msb + h->poc_lsb; |
2967 | 1541 if(s->picture_structure == PICT_FRAME) |
1168 | 1542 field_poc[1] += h->delta_poc_bottom; |
1543 }else if(h->sps.poc_type==1){ | |
1544 int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc; | |
1545 int i; | |
1546 | |
1547 if(h->sps.poc_cycle_length != 0) | |
1548 abs_frame_num = h->frame_num_offset + h->frame_num; | |
1549 else | |
1550 abs_frame_num = 0; | |
1551 | |
1552 if(h->nal_ref_idc==0 && abs_frame_num > 0) | |
1553 abs_frame_num--; | |
2967 | 1554 |
1168 | 1555 expected_delta_per_poc_cycle = 0; |
1556 for(i=0; i < h->sps.poc_cycle_length; i++) | |
1557 expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse | |
1558 | |
1559 if(abs_frame_num > 0){ | |
1560 int poc_cycle_cnt = (abs_frame_num - 1) / h->sps.poc_cycle_length; | |
1561 int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length; | |
1562 | |
1563 expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle; | |
1564 for(i = 0; i <= frame_num_in_poc_cycle; i++) | |
1565 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ]; | |
1566 } else | |
1567 expectedpoc = 0; | |
1568 | |
2967 | 1569 if(h->nal_ref_idc == 0) |
1168 | 1570 expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic; |
2967 | 1571 |
1168 | 1572 field_poc[0] = expectedpoc + h->delta_poc[0]; |
1573 field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field; | |
1574 | |
1575 if(s->picture_structure == PICT_FRAME) | |
1576 field_poc[1] += h->delta_poc[1]; | |
1577 }else{ | |
7381 | 1578 int poc= 2*(h->frame_num_offset + h->frame_num); |
1579 | |
1580 if(!h->nal_ref_idc) | |
1581 poc--; | |
7380 | 1582 |
1168 | 1583 field_poc[0]= poc; |
1584 field_poc[1]= poc; | |
1585 } | |
2967 | 1586 |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
1587 if(s->picture_structure != PICT_BOTTOM_FIELD) |
1168 | 1588 s->current_picture_ptr->field_poc[0]= field_poc[0]; |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
1589 if(s->picture_structure != PICT_TOP_FIELD) |
1168 | 1590 s->current_picture_ptr->field_poc[1]= field_poc[1]; |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
1591 cur->poc= FFMIN(cur->field_poc[0], cur->field_poc[1]); |
1168 | 1592 |
1593 return 0; | |
1594 } | |
1595 | |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1596 |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1597 /** |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1598 * initialize scan tables |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1599 */ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1600 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
|
1601 int i; |
11499 | 1602 if(h->h264dsp.h264_idct_add == ff_h264_idct_add_c){ //FIXME little ugly |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1603 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
|
1604 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
|
1605 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1606 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
|
1607 #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
|
1608 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
|
1609 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
|
1610 #undef T |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1611 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1612 } |
11499 | 1613 if(h->h264dsp.h264_idct8_add == ff_h264_idct8_add_c){ |
8646
8b52ac19a91c
remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents:
8627
diff
changeset
|
1614 memcpy(h->zigzag_scan8x8, ff_zigzag_direct, 64*sizeof(uint8_t)); |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1615 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
|
1616 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
|
1617 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
|
1618 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1619 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
|
1620 #define T(x) (x>>3) | ((x&7)<<3) |
8646
8b52ac19a91c
remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents:
8627
diff
changeset
|
1621 h->zigzag_scan8x8[i] = T(ff_zigzag_direct[i]); |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1622 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
|
1623 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
|
1624 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
|
1625 #undef T |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1626 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1627 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1628 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
|
1629 h->zigzag_scan_q0 = zigzag_scan; |
8646
8b52ac19a91c
remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents:
8627
diff
changeset
|
1630 h->zigzag_scan8x8_q0 = ff_zigzag_direct; |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1631 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
|
1632 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
|
1633 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
|
1634 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
|
1635 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1636 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
|
1637 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
|
1638 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
|
1639 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
|
1640 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
|
1641 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
|
1642 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1643 } |
5642 | 1644 |
9417 | 1645 static void field_end(H264Context *h){ |
1646 MpegEncContext * const s = &h->s; | |
1647 AVCodecContext * const avctx= s->avctx; | |
1648 s->mb_y= 0; | |
1649 | |
1650 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264; | |
1651 s->current_picture_ptr->pict_type= s->pict_type; | |
1652 | |
1653 if (CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) | |
1654 ff_vdpau_h264_set_reference_frames(s); | |
1655 | |
1656 if(!s->dropable) { | |
10862
d9c084a0c22b
Split all the reference picture handling off h264.c.
michael
parents:
10859
diff
changeset
|
1657 ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index); |
9417 | 1658 h->prev_poc_msb= h->poc_msb; |
1659 h->prev_poc_lsb= h->poc_lsb; | |
1660 } | |
1661 h->prev_frame_num_offset= h->frame_num_offset; | |
1662 h->prev_frame_num= h->frame_num; | |
1663 | |
1664 if (avctx->hwaccel) { | |
1665 if (avctx->hwaccel->end_frame(avctx) < 0) | |
1666 av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); | |
1667 } | |
1668 | |
1669 if (CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) | |
1670 ff_vdpau_h264_picture_complete(s); | |
1671 | |
1672 /* | |
1673 * FIXME: Error handling code does not seem to support interlaced | |
1674 * when slices span multiple rows | |
1675 * The ff_er_add_slice calls don't work right for bottom | |
1676 * fields; they cause massive erroneous error concealing | |
1677 * Error marking covers both fields (top and bottom). | |
1678 * This causes a mismatched s->error_count | |
1679 * and a bad error table. Further, the error count goes to | |
1680 * INT_MAX when called for bottom field, because mb_y is | |
1681 * past end by one (callers fault) and resync_mb_y != 0 | |
1682 * causes problems for the first MB line, too. | |
1683 */ | |
1684 if (!FIELD_PICTURE) | |
1685 ff_er_frame_end(s); | |
1686 | |
1687 MPV_frame_end(s); | |
9419 | 1688 |
1689 h->current_slice=0; | |
9417 | 1690 } |
1691 | |
5642 | 1692 /** |
12024 | 1693 * Replicate H264 "master" context to thread contexts. |
5642 | 1694 */ |
1695 static void clone_slice(H264Context *dst, H264Context *src) | |
1696 { | |
1697 memcpy(dst->block_offset, src->block_offset, sizeof(dst->block_offset)); | |
1698 dst->s.current_picture_ptr = src->s.current_picture_ptr; | |
1699 dst->s.current_picture = src->s.current_picture; | |
1700 dst->s.linesize = src->s.linesize; | |
1701 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
|
1702 dst->s.first_field = src->s.first_field; |
5642 | 1703 |
1704 dst->prev_poc_msb = src->prev_poc_msb; | |
1705 dst->prev_poc_lsb = src->prev_poc_lsb; | |
1706 dst->prev_frame_num_offset = src->prev_frame_num_offset; | |
1707 dst->prev_frame_num = src->prev_frame_num; | |
1708 dst->short_ref_count = src->short_ref_count; | |
1709 | |
1710 memcpy(dst->short_ref, src->short_ref, sizeof(dst->short_ref)); | |
1711 memcpy(dst->long_ref, src->long_ref, sizeof(dst->long_ref)); | |
1712 memcpy(dst->default_ref_list, src->default_ref_list, sizeof(dst->default_ref_list)); | |
1713 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
|
1714 |
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
1715 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
|
1716 memcpy(dst->dequant8_coeff, src->dequant8_coeff, sizeof(src->dequant8_coeff)); |
5642 | 1717 } |
1718 | |
1168 | 1719 /** |
1720 * decodes a slice header. | |
6918 | 1721 * This will also call MPV_common_init() and frame_start() as needed. |
5642 | 1722 * |
1723 * @param h h264context | |
1724 * @param h0 h264 master context (differs from 'h' when doing sliced based parallel decoding) | |
1725 * | |
6524 | 1726 * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded |
1168 | 1727 */ |
5642 | 1728 static int decode_slice_header(H264Context *h, H264Context *h0){ |
1168 | 1729 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
|
1730 MpegEncContext * const s0 = &h0->s; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
1731 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
|
1732 unsigned int pps_id; |
1168 | 1733 int num_ref_idx_active_override_flag; |
7332 | 1734 unsigned int slice_type, tmp, i, j; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
1735 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
|
1736 int last_pic_structure; |
1168 | 1737 |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1738 s->dropable= h->nal_ref_idc == 0; |
1168 | 1739 |
5984
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
1740 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
|
1741 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
|
1742 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
|
1743 }else{ |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
1744 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
|
1745 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
|
1746 } |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
1747 |
1168 | 1748 first_mb_in_slice= get_ue_golomb(&s->gb); |
1749 | |
9419 | 1750 if(first_mb_in_slice == 0){ //FIXME better field boundary detection |
1751 if(h0->current_slice && FIELD_PICTURE){ | |
1752 field_end(h); | |
1753 } | |
1754 | |
5642 | 1755 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
|
1756 if (!s0->first_field) |
5803 | 1757 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
|
1758 } |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
1759 |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
1760 slice_type= get_ue_golomb_31(&s->gb); |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
1761 if(slice_type > 9){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
1762 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 | 1763 return -1; |
1168 | 1764 } |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
1765 if(slice_type > 4){ |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
1766 slice_type -= 5; |
1168 | 1767 h->slice_type_fixed=1; |
1768 }else | |
1769 h->slice_type_fixed=0; | |
2967 | 1770 |
8206
5f399949a6a6
Use golomb_to_pict_type instead of its duplicate, slice_type_map.
diego
parents:
8140
diff
changeset
|
1771 slice_type= golomb_to_pict_type[ slice_type ]; |
6481 | 1772 if (slice_type == FF_I_TYPE |
5642 | 1773 || (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
|
1774 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
|
1775 } |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
1776 h->slice_type= slice_type; |
7338 | 1777 h->slice_type_nos= slice_type & 3; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
1778 |
7374 | 1779 s->pict_type= h->slice_type; // to make a few old functions happy, it's wrong though |
2967 | 1780 |
1168 | 1781 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
|
1782 if(pps_id>=MAX_PPS_COUNT){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
1783 av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n"); |
1168 | 1784 return -1; |
1785 } | |
5642 | 1786 if(!h0->pps_buffers[pps_id]) { |
9112
79818b0595c0
When a H.264 stream references a PPS or SPS id which doesn't exist, instead of
takis
parents:
9108
diff
changeset
|
1787 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS %u referenced\n", pps_id); |
1174 | 1788 return -1; |
1789 } | |
5642 | 1790 h->pps= *h0->pps_buffers[pps_id]; |
1791 | |
1792 if(!h0->sps_buffers[h->pps.sps_id]) { | |
9112
79818b0595c0
When a H.264 stream references a PPS or SPS id which doesn't exist, instead of
takis
parents:
9108
diff
changeset
|
1793 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS %u referenced\n", h->pps.sps_id); |
1174 | 1794 return -1; |
1795 } | |
5642 | 1796 h->sps = *h0->sps_buffers[h->pps.sps_id]; |
2919 | 1797 |
11633
d47bd24cb380
H.264: move avctx->{profile,level} init before AVCodecContext.get_format().
gb
parents:
11632
diff
changeset
|
1798 s->avctx->profile = h->sps.profile_idc; |
d47bd24cb380
H.264: move avctx->{profile,level} init before AVCodecContext.get_format().
gb
parents:
11632
diff
changeset
|
1799 s->avctx->level = h->sps.level_idc; |
11634 | 1800 s->avctx->refs = h->sps.ref_frame_count; |
11632
9a5c269f31f5
H.264: move avctx->refs init before AVCodecContext.get_format().
gb
parents:
11627
diff
changeset
|
1801 |
5685
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
1802 if(h == h0 && h->dequant_coeff_pps != pps_id){ |
4363 | 1803 h->dequant_coeff_pps = pps_id; |
2919 | 1804 init_dequant_tables(h); |
1805 } | |
2967 | 1806 |
1168 | 1807 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
|
1808 s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag); |
2967 | 1809 |
3178 | 1810 h->b_stride= s->mb_width*4; |
1168 | 1811 |
6581
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
1812 s->width = 16*s->mb_width - 2*FFMIN(h->sps.crop_right, 7); |
1168 | 1813 if(h->sps.frame_mbs_only_flag) |
6581
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
1814 s->height= 16*s->mb_height - 2*FFMIN(h->sps.crop_bottom, 7); |
1168 | 1815 else |
6581
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
1816 s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3); |
2967 | 1817 |
1818 if (s->context_initialized | |
11509
9adad5749f23
Reinitialize the h264 decoder context on every valid aspect ratio
stefano
parents:
11499
diff
changeset
|
1819 && ( s->width != s->avctx->width || s->height != s->avctx->height |
9adad5749f23
Reinitialize the h264 decoder context on every valid aspect ratio
stefano
parents:
11499
diff
changeset
|
1820 || av_cmp_q(h->sps.sar, s->avctx->sample_aspect_ratio))) { |
5642 | 1821 if(h != h0) |
1822 return -1; // width / height changed during parallelized decoding | |
1168 | 1823 free_tables(h); |
8231
0df3402e6b41
Fix segfault due to deallocated entries in delayed_pic after size change.
michael
parents:
8216
diff
changeset
|
1824 flush_dpb(s->avctx); |
1168 | 1825 MPV_common_end(s); |
1826 } | |
1827 if (!s->context_initialized) { | |
5642 | 1828 if(h != h0) |
1829 return -1; // we cant (re-)initialize context during parallel decoding | |
10565
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1830 |
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1831 avcodec_set_dimensions(s->avctx, s->width, s->height); |
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1832 s->avctx->sample_aspect_ratio= h->sps.sar; |
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1833 if(!s->avctx->sample_aspect_ratio.den) |
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1834 s->avctx->sample_aspect_ratio.den = 1; |
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1835 |
10837
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1836 if(h->sps.video_signal_type_present_flag){ |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1837 s->avctx->color_range = h->sps.full_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1838 if(h->sps.colour_description_present_flag){ |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1839 s->avctx->color_primaries = h->sps.color_primaries; |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1840 s->avctx->color_trc = h->sps.color_trc; |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1841 s->avctx->colorspace = h->sps.colorspace; |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1842 } |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1843 } |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
1844 |
10565
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1845 if(h->sps.timing_info_present_flag){ |
11076 | 1846 int64_t den= h->sps.time_scale; |
11097 | 1847 if(h->x264_build < 44U) |
11076 | 1848 den *= 2; |
10565
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1849 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den, |
11076 | 1850 h->sps.num_units_in_tick, den, 1<<30); |
10565
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1851 } |
11795
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
1852 s->avctx->pix_fmt = s->avctx->get_format(s->avctx, |
11800
966aa6b53dcf
Pass codec pixel format list to get_format, if present, fix vdpau decoding
bcoudurier
parents:
11795
diff
changeset
|
1853 s->avctx->codec->pix_fmts ? |
966aa6b53dcf
Pass codec pixel format list to get_format, if present, fix vdpau decoding
bcoudurier
parents:
11795
diff
changeset
|
1854 s->avctx->codec->pix_fmts : |
11795
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
1855 s->avctx->color_range == AVCOL_RANGE_JPEG ? |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
1856 hwaccel_pixfmt_list_h264_jpeg_420 : |
cb40fa41b796
In h264 decoder, use jpeg yuv pixel format when full range is set in vui
bcoudurier
parents:
11777
diff
changeset
|
1857 ff_hwaccel_pixfmt_list_420); |
10565
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1858 s->avctx->hwaccel = ff_find_hwaccel(s->avctx->codec->id, s->avctx->pix_fmt); |
26dc0444fa93
Call ff_find_hwaccel() after calling avcodec_set_dimensions().
cehoyos
parents:
10560
diff
changeset
|
1859 |
1168 | 1860 if (MPV_common_init(s) < 0) |
1861 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
|
1862 s->first_field = 0; |
9831
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
1863 h->prev_interlaced_frame = 1; |
2967 | 1864 |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas man %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
1865 init_scan_tables(h); |
10852 | 1866 ff_h264_alloc_tables(h); |
1168 | 1867 |
5642 | 1868 for(i = 1; i < s->avctx->thread_count; i++) { |
1869 H264Context *c; | |
1870 c = h->thread_context[i] = av_malloc(sizeof(H264Context)); | |
6193
52ccab2531bd
Fix memory leak in h264 decoder. allocated_edge_emu_buffer was being allocated
heydowns
parents:
6190
diff
changeset
|
1871 memcpy(c, h->s.thread_context[i], sizeof(MpegEncContext)); |
5642 | 1872 memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext)); |
11562
66f3d2ff88b7
H264: Copy h264dsp when creating new slice threads
astrange
parents:
11560
diff
changeset
|
1873 c->h264dsp = h->h264dsp; |
5642 | 1874 c->sps = h->sps; |
1875 c->pps = h->pps; | |
1876 init_scan_tables(c); | |
11330
e8e5dbbbf9c4
Fix a bunch of bugs ive introduced recently that broke threaded decoding.
michael
parents:
11326
diff
changeset
|
1877 clone_tables(c, h, i); |
5642 | 1878 } |
1879 | |
1880 for(i = 0; i < s->avctx->thread_count; i++) | |
1881 if(context_init(h->thread_context[i]) < 0) | |
1882 return -1; | |
1168 | 1883 } |
1884 | |
1885 h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num); | |
1886 | |
3316 | 1887 h->mb_mbaff = 0; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
1888 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
|
1889 last_pic_structure = s0->picture_structure; |
1168 | 1890 if(h->sps.frame_mbs_only_flag){ |
1891 s->picture_structure= PICT_FRAME; | |
1892 }else{ | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
1893 if(get_bits1(&s->gb)) { //field_pic_flag |
1168 | 1894 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
|
1895 } else { |
1168 | 1896 s->picture_structure= PICT_FRAME; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
1897 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
|
1898 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
1899 } |
7468 | 1900 h->mb_field_decoding_flag= s->picture_structure != PICT_FRAME; |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
1901 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
1902 if(h0->current_slice == 0){ |
7350 | 1903 while(h->frame_num != h->prev_frame_num && |
1904 h->frame_num != (h->prev_frame_num+1)%(1<<h->sps.log2_max_frame_num)){ | |
12083 | 1905 av_log(h->s.avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n", h->frame_num, h->prev_frame_num); |
10852 | 1906 if (ff_h264_frame_start(h) < 0) |
9004
aae80543bc6e
Check return value of frame_start(), this avoids a crash if AVCodecContext::get_buffer failed.
reimar
parents:
8996
diff
changeset
|
1907 return -1; |
7350 | 1908 h->prev_frame_num++; |
1909 h->prev_frame_num %= 1<<h->sps.log2_max_frame_num; | |
1910 s->current_picture_ptr->frame_num= h->prev_frame_num; | |
12094
f7bedc1ce1bc
Perform sliding window operation during frame gap handling.
michael
parents:
12083
diff
changeset
|
1911 ff_generate_sliding_window_mmcos(h); |
f7bedc1ce1bc
Perform sliding window operation during frame gap handling.
michael
parents:
12083
diff
changeset
|
1912 ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index); |
7350 | 1913 } |
1914 | |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1915 /* 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
|
1916 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
|
1917 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
|
1918 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
|
1919 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
|
1920 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1921 /* 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
|
1922 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
|
1923 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1924 * 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
|
1925 * 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
|
1926 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1927 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
|
1928 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
|
1929 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1930 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1931 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
|
1932 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
|
1933 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
|
1934 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1935 * 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
|
1936 * 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
|
1937 * 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
|
1938 * purposes. |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1939 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1940 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
|
1941 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
|
1942 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1943 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1944 /* 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
|
1945 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
|
1946 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1947 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1948 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1949 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1950 /* 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
|
1951 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
|
1952 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
|
1953 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1954 |
10852 | 1955 if((!FIELD_PICTURE || s0->first_field) && ff_h264_frame_start(h) < 0) { |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
1956 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
|
1957 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
|
1958 } |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
1959 } |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
1960 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
|
1961 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
|
1962 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
1963 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
|
1964 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
1965 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
|
1966 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
|
1967 first_mb_in_slice >= s->mb_num){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
1968 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
|
1969 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
1970 } |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
1971 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
|
1972 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
|
1973 if (s->picture_structure == PICT_BOTTOM_FIELD) |
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
1974 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
|
1975 assert(s->mb_y < s->mb_height); |
2967 | 1976 |
1168 | 1977 if(s->picture_structure==PICT_FRAME){ |
1978 h->curr_pic_num= h->frame_num; | |
1979 h->max_pic_num= 1<< h->sps.log2_max_frame_num; | |
1980 }else{ | |
5772
65b71bd21a4d
Fix h->curr_pic_num for field pictures. Necessary for proper PAFF support.
andoma
parents:
5771
diff
changeset
|
1981 h->curr_pic_num= 2*h->frame_num + 1; |
1168 | 1982 h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1); |
1983 } | |
2967 | 1984 |
1168 | 1985 if(h->nal_unit_type == NAL_IDR_SLICE){ |
1453 | 1986 get_ue_golomb(&s->gb); /* idr_pic_id */ |
1168 | 1987 } |
2967 | 1988 |
1168 | 1989 if(h->sps.poc_type==0){ |
1990 h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb); | |
2967 | 1991 |
1168 | 1992 if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){ |
1993 h->delta_poc_bottom= get_se_golomb(&s->gb); | |
1994 } | |
1995 } | |
2967 | 1996 |
1168 | 1997 if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){ |
1998 h->delta_poc[0]= get_se_golomb(&s->gb); | |
2967 | 1999 |
1168 | 2000 if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME) |
2001 h->delta_poc[1]= get_se_golomb(&s->gb); | |
2002 } | |
2967 | 2003 |
1168 | 2004 init_poc(h); |
2967 | 2005 |
1168 | 2006 if(h->pps.redundant_pic_cnt_present){ |
2007 h->redundant_pic_count= get_ue_golomb(&s->gb); | |
2008 } | |
2009 | |
7374 | 2010 //set defaults, might be overridden a few lines later |
1168 | 2011 h->ref_count[0]= h->pps.ref_count[0]; |
2012 h->ref_count[1]= h->pps.ref_count[1]; | |
2013 | |
7338 | 2014 if(h->slice_type_nos != FF_I_TYPE){ |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2015 if(h->slice_type_nos == FF_B_TYPE){ |
1168 | 2016 h->direct_spatial_mv_pred= get_bits1(&s->gb); |
2017 } | |
2018 num_ref_idx_active_override_flag= get_bits1(&s->gb); | |
2967 | 2019 |
1168 | 2020 if(num_ref_idx_active_override_flag){ |
2021 h->ref_count[0]= get_ue_golomb(&s->gb) + 1; | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2022 if(h->slice_type_nos==FF_B_TYPE) |
1168 | 2023 h->ref_count[1]= get_ue_golomb(&s->gb) + 1; |
2024 | |
4532 | 2025 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
|
2026 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
|
2027 h->ref_count[0]= h->ref_count[1]= 1; |
1168 | 2028 return -1; |
2029 } | |
2030 } | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2031 if(h->slice_type_nos == FF_B_TYPE) |
4532 | 2032 h->list_count= 2; |
2033 else | |
2034 h->list_count= 1; | |
2035 }else | |
2036 h->list_count= 0; | |
1168 | 2037 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
2038 if(!default_ref_list_done){ |
10862
d9c084a0c22b
Split all the reference picture handling off h264.c.
michael
parents:
10859
diff
changeset
|
2039 ff_h264_fill_default_ref_list(h); |
1168 | 2040 } |
2041 | |
10862
d9c084a0c22b
Split all the reference picture handling off h264.c.
michael
parents:
10859
diff
changeset
|
2042 if(h->slice_type_nos!=FF_I_TYPE && ff_h264_decode_ref_pic_list_reordering(h) < 0) |
2766
0609f405e000
make decoder a little bit more tolerant to missing NAL units
michael
parents:
2763
diff
changeset
|
2043 return -1; |
1168 | 2044 |
7921
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2045 if(h->slice_type_nos!=FF_I_TYPE){ |
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2046 s->last_picture_ptr= &h->ref_list[0][0]; |
7974 | 2047 ff_copy_picture(&s->last_picture, s->last_picture_ptr); |
7921
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2048 } |
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2049 if(h->slice_type_nos==FF_B_TYPE){ |
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2050 s->next_picture_ptr= &h->ref_list[1][0]; |
7974 | 2051 ff_copy_picture(&s->next_picture, s->next_picture_ptr); |
7921
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2052 } |
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
2053 |
7339 | 2054 if( (h->pps.weighted_pred && h->slice_type_nos == FF_P_TYPE ) |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2055 || (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) |
1168 | 2056 pred_weight_table(h); |
11345 | 2057 else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ |
11558 | 2058 implicit_weight_table(h, -1); |
11345 | 2059 }else { |
2415 | 2060 h->use_weight = 0; |
8735
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
2061 for (i = 0; i < 2; i++) { |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
2062 h->luma_weight_flag[i] = 0; |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
2063 h->chroma_weight_flag[i] = 0; |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
2064 } |
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
2065 } |
2967 | 2066 |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
2067 if(h->nal_ref_idc) |
10862
d9c084a0c22b
Split all the reference picture handling off h264.c.
michael
parents:
10859
diff
changeset
|
2068 ff_h264_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
|
2069 |
11558 | 2070 if(FRAME_MBAFF){ |
10862
d9c084a0c22b
Split all the reference picture handling off h264.c.
michael
parents:
10859
diff
changeset
|
2071 ff_h264_fill_mbaff_ref_list(h); |
3316 | 2072 |
11558 | 2073 if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ |
2074 implicit_weight_table(h, 0); | |
2075 implicit_weight_table(h, 1); | |
2076 } | |
2077 } | |
2078 | |
7897
004f3c69fe7b
Move direct_dist_scale_factor() and direct_ref_list_init() after fill_mbaff_ref_list()
michael
parents:
7896
diff
changeset
|
2079 if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred) |
10857
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
2080 ff_h264_direct_dist_scale_factor(h); |
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
2081 ff_h264_direct_ref_list_init(h); |
7897
004f3c69fe7b
Move direct_dist_scale_factor() and direct_ref_list_init() after fill_mbaff_ref_list()
michael
parents:
7896
diff
changeset
|
2082 |
7338 | 2083 if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){ |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
2084 tmp = get_ue_golomb_31(&s->gb); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2085 if(tmp > 2){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2086 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
|
2087 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2088 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2089 h->cabac_init_idc= tmp; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2090 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2091 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2092 h->last_qscale_diff = 0; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2093 tmp = h->pps.init_qp + get_se_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2094 if(tmp>51){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2095 av_log(s->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp); |
1898 | 2096 return -1; |
2097 } | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2098 s->qscale= tmp; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2099 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
|
2100 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
1168 | 2101 //FIXME qscale / qp ... stuff |
6481 | 2102 if(h->slice_type == FF_SP_TYPE){ |
1453 | 2103 get_bits1(&s->gb); /* sp_for_switch_flag */ |
1168 | 2104 } |
6481 | 2105 if(h->slice_type==FF_SP_TYPE || h->slice_type == FF_SI_TYPE){ |
1453 | 2106 get_se_golomb(&s->gb); /* slice_qs_delta */ |
1168 | 2107 } |
2108 | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2109 h->deblocking_filter = 1; |
10979
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2110 h->slice_alpha_c0_offset = 52; |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2111 h->slice_beta_offset = 52; |
1168 | 2112 if( h->pps.deblocking_filter_parameters_present ) { |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
2113 tmp= get_ue_golomb_31(&s->gb); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2114 if(tmp > 2){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2115 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
|
2116 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2117 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2118 h->deblocking_filter= tmp; |
2967 | 2119 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
|
2120 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
|
2121 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2122 if( h->deblocking_filter ) { |
10979
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2123 h->slice_alpha_c0_offset += get_se_golomb(&s->gb) << 1; |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2124 h->slice_beta_offset += get_se_golomb(&s->gb) << 1; |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2125 if( h->slice_alpha_c0_offset > 104U |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2126 || h->slice_beta_offset > 104U){ |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2127 av_log(s->avctx, AV_LOG_ERROR, "deblocking filter parameters %d %d out of range\n", h->slice_alpha_c0_offset, h->slice_beta_offset); |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2128 return -1; |
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2129 } |
1168 | 2130 } |
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
|
2131 } |
5642 | 2132 |
5698
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
2133 if( s->avctx->skip_loop_filter >= AVDISCARD_ALL |
7340 | 2134 ||(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY && h->slice_type_nos != FF_I_TYPE) |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2135 ||(s->avctx->skip_loop_filter >= AVDISCARD_BIDIR && h->slice_type_nos == FF_B_TYPE) |
5698
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
2136 ||(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
|
2137 h->deblocking_filter= 0; |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
2138 |
5642 | 2139 if(h->deblocking_filter == 1 && h0->max_contexts > 1) { |
5646 | 2140 if(s->avctx->flags2 & CODEC_FLAG2_FAST) { |
2141 /* Cheat slightly for speed: | |
6029 | 2142 Do not bother to deblock across slices. */ |
5646 | 2143 h->deblocking_filter = 2; |
2144 } else { | |
5647 | 2145 h0->max_contexts = 1; |
2146 if(!h0->single_decode_warning) { | |
2147 av_log(s->avctx, AV_LOG_INFO, "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n"); | |
2148 h0->single_decode_warning = 1; | |
2149 } | |
2150 if(h != h0) | |
2151 return 1; // deblocking switched inside frame | |
5646 | 2152 } |
5642 | 2153 } |
10979
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2154 h->qp_thresh= 15 + 52 - FFMIN(h->slice_alpha_c0_offset, h->slice_beta_offset) - FFMAX3(0, h->pps.chroma_qp_index_offset[0], h->pps.chroma_qp_index_offset[1]); |
5642 | 2155 |
1168 | 2156 #if 0 //FMO |
2157 if( h->pps.num_slice_groups > 1 && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5) | |
2158 slice_group_change_cycle= get_bits(&s->gb, ?); | |
2159 #endif | |
2160 | |
5642 | 2161 h0->last_slice_type = slice_type; |
2162 h->slice_num = ++h0->current_slice; | |
8079
2d3c7cd7d143
Replace literally hardcoded max slice number by named constant.
michael
parents:
8042
diff
changeset
|
2163 if(h->slice_num >= MAX_SLICES){ |
2d3c7cd7d143
Replace literally hardcoded max slice number by named constant.
michael
parents:
8042
diff
changeset
|
2164 av_log(s->avctx, AV_LOG_ERROR, "Too many slices, increase MAX_SLICES and recompile\n"); |
2d3c7cd7d143
Replace literally hardcoded max slice number by named constant.
michael
parents:
8042
diff
changeset
|
2165 } |
2392 | 2166 |
7343 | 2167 for(j=0; j<2; j++){ |
10913
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2168 int id_list[16]; |
8079
2d3c7cd7d143
Replace literally hardcoded max slice number by named constant.
michael
parents:
8042
diff
changeset
|
2169 int *ref2frm= h->ref2frm[h->slice_num&(MAX_SLICES-1)][j]; |
10913
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2170 for(i=0; i<16; i++){ |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2171 id_list[i]= 60; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2172 if(h->ref_list[j][i].data[0]){ |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2173 int k; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2174 uint8_t *base= h->ref_list[j][i].base[0]; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2175 for(k=0; k<h->short_ref_count; k++) |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2176 if(h->short_ref[k]->base[0] == base){ |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2177 id_list[i]= k; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2178 break; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2179 } |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2180 for(k=0; k<h->long_ref_count; k++) |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2181 if(h->long_ref[k] && h->long_ref[k]->base[0] == base){ |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2182 id_list[i]= h->short_ref_count + k; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2183 break; |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2184 } |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2185 } |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2186 } |
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2187 |
7343 | 2188 ref2frm[0]= |
2189 ref2frm[1]= -1; | |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
2190 for(i=0; i<16; i++) |
10913
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2191 ref2frm[i+2]= 4*id_list[i] |
7343 | 2192 +(h->ref_list[j][i].reference&3); |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
2193 ref2frm[18+0]= |
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
2194 ref2frm[18+1]= -1; |
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
2195 for(i=16; i<48; i++) |
10913
497929e9d912
Perform reference remapping at fill_cache() time instead of in the
michael
parents:
10910
diff
changeset
|
2196 ref2frm[i+4]= 4*id_list[(i-16)>>1] |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
2197 +(h->ref_list[j][i].reference&3); |
7343 | 2198 } |
2199 | |
3316 | 2200 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
|
2201 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; |
3316 | 2202 |
1168 | 2203 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
7920
b731ef917a01
Print which slices are IDR not just the slice type.
michael
parents:
7919
diff
changeset
|
2204 av_log(h->s.avctx, AV_LOG_DEBUG, "slice:%d %s mb:%d %c%s%s pps:%u frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d:%d:%d weight:%d%s %s\n", |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2205 h->slice_num, |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2206 (s->picture_structure==PICT_FRAME ? "F" : s->picture_structure==PICT_TOP_FIELD ? "T" : "B"), |
2967 | 2207 first_mb_in_slice, |
7920
b731ef917a01
Print which slices are IDR not just the slice type.
michael
parents:
7919
diff
changeset
|
2208 av_get_pict_type_char(h->slice_type), h->slice_type_fixed ? " fix" : "", h->nal_unit_type == NAL_IDR_SLICE ? " IDR" : "", |
1168 | 2209 pps_id, h->frame_num, |
2210 s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1], | |
2211 h->ref_count[0], h->ref_count[1], | |
2212 s->qscale, | |
10979
776dba50775c
Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents:
10930
diff
changeset
|
2213 h->deblocking_filter, h->slice_alpha_c0_offset/2-26, h->slice_beta_offset/2-26, |
2415 | 2214 h->use_weight, |
6890 | 2215 h->use_weight==1 && h->use_weight_chroma ? "c" : "", |
2216 h->slice_type == FF_B_TYPE ? (h->direct_spatial_mv_pred ? "SPAT" : "TEMP") : "" | |
1168 | 2217 ); |
2218 } | |
2219 | |
2220 return 0; | |
2221 } | |
2222 | |
10987
85de0c8a19b7
Added a missing const to ff_h264_get_slice_type().
fenrir
parents:
10984
diff
changeset
|
2223 int ff_h264_get_slice_type(const H264Context *h) |
10829
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2224 { |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2225 switch (h->slice_type) { |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2226 case FF_P_TYPE: return 0; |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2227 case FF_B_TYPE: return 1; |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2228 case FF_I_TYPE: return 2; |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2229 case FF_SP_TYPE: return 3; |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2230 case FF_SI_TYPE: return 4; |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2231 default: return -1; |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2232 } |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2233 } |
46a247e54d6e
Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents:
10826
diff
changeset
|
2234 |
11627
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2235 /** |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2236 * |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2237 * @return non zero if the loop filter can be skiped |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2238 */ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2239 static int fill_filter_caches(H264Context *h, int mb_type){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2240 MpegEncContext * const s = &h->s; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2241 const int mb_xy= h->mb_xy; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2242 int top_xy, left_xy[2]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2243 int top_type, left_type[2]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2244 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2245 top_xy = mb_xy - (s->mb_stride << MB_FIELD); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2246 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2247 //FIXME deblocking could skip the intra and nnz parts. |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2248 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2249 /* Wow, what a mess, why didn't they simplify the interlacing & intra |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2250 * stuff, I can't imagine that these complex rules are worth it. */ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2251 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2252 left_xy[1] = left_xy[0] = mb_xy-1; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2253 if(FRAME_MBAFF){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2254 const int left_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[mb_xy-1]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2255 const int curr_mb_field_flag = IS_INTERLACED(mb_type); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2256 if(s->mb_y&1){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2257 if (left_mb_field_flag != curr_mb_field_flag) { |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2258 left_xy[0] -= s->mb_stride; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2259 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2260 }else{ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2261 if(curr_mb_field_flag){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2262 top_xy += s->mb_stride & (((s->current_picture.mb_type[top_xy ]>>7)&1)-1); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2263 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2264 if (left_mb_field_flag != curr_mb_field_flag) { |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2265 left_xy[1] += s->mb_stride; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2266 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2267 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2268 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2269 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2270 h->top_mb_xy = top_xy; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2271 h->left_mb_xy[0] = left_xy[0]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2272 h->left_mb_xy[1] = left_xy[1]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2273 { |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2274 //for sufficiently low qp, filtering wouldn't do anything |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2275 //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2276 int qp_thresh = h->qp_thresh; //FIXME strictly we should store qp_thresh for each mb of a slice |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2277 int qp = s->current_picture.qscale_table[mb_xy]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2278 if(qp <= qp_thresh |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2279 && (left_xy[0]<0 || ((qp + s->current_picture.qscale_table[left_xy[0]] + 1)>>1) <= qp_thresh) |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2280 && (top_xy < 0 || ((qp + s->current_picture.qscale_table[top_xy ] + 1)>>1) <= qp_thresh)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2281 if(!FRAME_MBAFF) |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2282 return 1; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2283 if( (left_xy[0]< 0 || ((qp + s->current_picture.qscale_table[left_xy[1] ] + 1)>>1) <= qp_thresh) |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2284 && (top_xy < s->mb_stride || ((qp + s->current_picture.qscale_table[top_xy -s->mb_stride] + 1)>>1) <= qp_thresh)) |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2285 return 1; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2286 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2287 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2288 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2289 top_type = s->current_picture.mb_type[top_xy] ; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2290 left_type[0] = s->current_picture.mb_type[left_xy[0]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2291 left_type[1] = s->current_picture.mb_type[left_xy[1]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2292 if(h->deblocking_filter == 2){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2293 if(h->slice_table[top_xy ] != h->slice_num) top_type= 0; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2294 if(h->slice_table[left_xy[0] ] != h->slice_num) left_type[0]= left_type[1]= 0; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2295 }else{ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2296 if(h->slice_table[top_xy ] == 0xFFFF) top_type= 0; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2297 if(h->slice_table[left_xy[0] ] == 0xFFFF) left_type[0]= left_type[1] =0; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2298 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2299 h->top_type = top_type ; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2300 h->left_type[0]= left_type[0]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2301 h->left_type[1]= left_type[1]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2302 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2303 if(IS_INTRA(mb_type)) |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2304 return 0; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2305 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2306 AV_COPY64(&h->non_zero_count_cache[0+8*1], &h->non_zero_count[mb_xy][ 0]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2307 AV_COPY64(&h->non_zero_count_cache[0+8*2], &h->non_zero_count[mb_xy][ 8]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2308 AV_COPY32(&h->non_zero_count_cache[0+8*5], &h->non_zero_count[mb_xy][16]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2309 AV_COPY32(&h->non_zero_count_cache[4+8*3], &h->non_zero_count[mb_xy][20]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2310 AV_COPY64(&h->non_zero_count_cache[0+8*4], &h->non_zero_count[mb_xy][24]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2311 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2312 h->cbp= h->cbp_table[mb_xy]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2313 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2314 { |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2315 int list; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2316 for(list=0; list<h->list_count; list++){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2317 int8_t *ref; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2318 int y, b_stride; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2319 int16_t (*mv_dst)[2]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2320 int16_t (*mv_src)[2]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2321 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2322 if(!USES_LIST(mb_type, list)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2323 fill_rectangle( h->mv_cache[list][scan8[0]], 4, 4, 8, pack16to32(0,0), 4); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2324 AV_WN32A(&h->ref_cache[list][scan8[ 0]], ((LIST_NOT_USED)&0xFF)*0x01010101u); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2325 AV_WN32A(&h->ref_cache[list][scan8[ 2]], ((LIST_NOT_USED)&0xFF)*0x01010101u); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2326 AV_WN32A(&h->ref_cache[list][scan8[ 8]], ((LIST_NOT_USED)&0xFF)*0x01010101u); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2327 AV_WN32A(&h->ref_cache[list][scan8[10]], ((LIST_NOT_USED)&0xFF)*0x01010101u); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2328 continue; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2329 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2330 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2331 ref = &s->current_picture.ref_index[list][4*mb_xy]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2332 { |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2333 int (*ref2frm)[64] = h->ref2frm[ h->slice_num&(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2334 AV_WN32A(&h->ref_cache[list][scan8[ 0]], (pack16to32(ref2frm[list][ref[0]],ref2frm[list][ref[1]])&0x00FF00FF)*0x0101); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2335 AV_WN32A(&h->ref_cache[list][scan8[ 2]], (pack16to32(ref2frm[list][ref[0]],ref2frm[list][ref[1]])&0x00FF00FF)*0x0101); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2336 ref += 2; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2337 AV_WN32A(&h->ref_cache[list][scan8[ 8]], (pack16to32(ref2frm[list][ref[0]],ref2frm[list][ref[1]])&0x00FF00FF)*0x0101); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2338 AV_WN32A(&h->ref_cache[list][scan8[10]], (pack16to32(ref2frm[list][ref[0]],ref2frm[list][ref[1]])&0x00FF00FF)*0x0101); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2339 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2340 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2341 b_stride = h->b_stride; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2342 mv_dst = &h->mv_cache[list][scan8[0]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2343 mv_src = &s->current_picture.motion_val[list][4*s->mb_x + 4*s->mb_y*b_stride]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2344 for(y=0; y<4; y++){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2345 AV_COPY128(mv_dst + 8*y, mv_src + y*b_stride); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2346 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2347 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2348 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2349 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2350 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2351 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2352 /* |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2353 0 . T T. T T T T |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2354 1 L . .L . . . . |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2355 2 L . .L . . . . |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2356 3 . T TL . . . . |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2357 4 L . .L . . . . |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2358 5 L . .. . . . . |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2359 */ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2360 //FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec) |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2361 if(top_type){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2362 AV_COPY32(&h->non_zero_count_cache[4+8*0], &h->non_zero_count[top_xy][4+3*8]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2363 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2364 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2365 if(left_type[0]){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2366 h->non_zero_count_cache[3+8*1]= h->non_zero_count[left_xy[0]][7+0*8]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2367 h->non_zero_count_cache[3+8*2]= h->non_zero_count[left_xy[0]][7+1*8]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2368 h->non_zero_count_cache[3+8*3]= h->non_zero_count[left_xy[0]][7+2*8]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2369 h->non_zero_count_cache[3+8*4]= h->non_zero_count[left_xy[0]][7+3*8]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2370 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2371 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2372 // CAVLC 8x8dct requires NNZ values for residual decoding that differ from what the loop filter needs |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2373 if(!CABAC && h->pps.transform_8x8_mode){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2374 if(IS_8x8DCT(top_type)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2375 h->non_zero_count_cache[4+8*0]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2376 h->non_zero_count_cache[5+8*0]= h->cbp_table[top_xy] & 4; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2377 h->non_zero_count_cache[6+8*0]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2378 h->non_zero_count_cache[7+8*0]= h->cbp_table[top_xy] & 8; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2379 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2380 if(IS_8x8DCT(left_type[0])){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2381 h->non_zero_count_cache[3+8*1]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2382 h->non_zero_count_cache[3+8*2]= h->cbp_table[left_xy[0]]&2; //FIXME check MBAFF |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2383 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2384 if(IS_8x8DCT(left_type[1])){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2385 h->non_zero_count_cache[3+8*3]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2386 h->non_zero_count_cache[3+8*4]= h->cbp_table[left_xy[1]]&8; //FIXME check MBAFF |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2387 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2388 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2389 if(IS_8x8DCT(mb_type)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2390 h->non_zero_count_cache[scan8[0 ]]= h->non_zero_count_cache[scan8[1 ]]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2391 h->non_zero_count_cache[scan8[2 ]]= h->non_zero_count_cache[scan8[3 ]]= h->cbp & 1; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2392 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2393 h->non_zero_count_cache[scan8[0+ 4]]= h->non_zero_count_cache[scan8[1+ 4]]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2394 h->non_zero_count_cache[scan8[2+ 4]]= h->non_zero_count_cache[scan8[3+ 4]]= h->cbp & 2; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2395 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2396 h->non_zero_count_cache[scan8[0+ 8]]= h->non_zero_count_cache[scan8[1+ 8]]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2397 h->non_zero_count_cache[scan8[2+ 8]]= h->non_zero_count_cache[scan8[3+ 8]]= h->cbp & 4; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2398 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2399 h->non_zero_count_cache[scan8[0+12]]= h->non_zero_count_cache[scan8[1+12]]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2400 h->non_zero_count_cache[scan8[2+12]]= h->non_zero_count_cache[scan8[3+12]]= h->cbp & 8; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2401 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2402 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2403 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2404 if(IS_INTER(mb_type) || IS_DIRECT(mb_type)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2405 int list; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2406 for(list=0; list<h->list_count; list++){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2407 if(USES_LIST(top_type, list)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2408 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2409 const int b8_xy= 4*top_xy + 2; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2410 int (*ref2frm)[64] = h->ref2frm[ h->slice_table[top_xy]&(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2411 AV_COPY128(h->mv_cache[list][scan8[0] + 0 - 1*8], s->current_picture.motion_val[list][b_xy + 0]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2412 h->ref_cache[list][scan8[0] + 0 - 1*8]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2413 h->ref_cache[list][scan8[0] + 1 - 1*8]= ref2frm[list][s->current_picture.ref_index[list][b8_xy + 0]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2414 h->ref_cache[list][scan8[0] + 2 - 1*8]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2415 h->ref_cache[list][scan8[0] + 3 - 1*8]= ref2frm[list][s->current_picture.ref_index[list][b8_xy + 1]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2416 }else{ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2417 AV_ZERO128(h->mv_cache[list][scan8[0] + 0 - 1*8]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2418 AV_WN32A(&h->ref_cache[list][scan8[0] + 0 - 1*8], ((LIST_NOT_USED)&0xFF)*0x01010101u); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2419 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2420 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2421 if(!IS_INTERLACED(mb_type^left_type[0])){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2422 if(USES_LIST(left_type[0], list)){ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2423 const int b_xy= h->mb2b_xy[left_xy[0]] + 3; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2424 const int b8_xy= 4*left_xy[0] + 1; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2425 int (*ref2frm)[64] = h->ref2frm[ h->slice_table[left_xy[0]]&(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2426 AV_COPY32(h->mv_cache[list][scan8[0] - 1 + 0 ], s->current_picture.motion_val[list][b_xy + h->b_stride*0]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2427 AV_COPY32(h->mv_cache[list][scan8[0] - 1 + 8 ], s->current_picture.motion_val[list][b_xy + h->b_stride*1]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2428 AV_COPY32(h->mv_cache[list][scan8[0] - 1 +16 ], s->current_picture.motion_val[list][b_xy + h->b_stride*2]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2429 AV_COPY32(h->mv_cache[list][scan8[0] - 1 +24 ], s->current_picture.motion_val[list][b_xy + h->b_stride*3]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2430 h->ref_cache[list][scan8[0] - 1 + 0 ]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2431 h->ref_cache[list][scan8[0] - 1 + 8 ]= ref2frm[list][s->current_picture.ref_index[list][b8_xy + 2*0]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2432 h->ref_cache[list][scan8[0] - 1 +16 ]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2433 h->ref_cache[list][scan8[0] - 1 +24 ]= ref2frm[list][s->current_picture.ref_index[list][b8_xy + 2*1]]; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2434 }else{ |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2435 AV_ZERO32(h->mv_cache [list][scan8[0] - 1 + 0 ]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2436 AV_ZERO32(h->mv_cache [list][scan8[0] - 1 + 8 ]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2437 AV_ZERO32(h->mv_cache [list][scan8[0] - 1 +16 ]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2438 AV_ZERO32(h->mv_cache [list][scan8[0] - 1 +24 ]); |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2439 h->ref_cache[list][scan8[0] - 1 + 0 ]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2440 h->ref_cache[list][scan8[0] - 1 + 8 ]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2441 h->ref_cache[list][scan8[0] - 1 + 16 ]= |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2442 h->ref_cache[list][scan8[0] - 1 + 24 ]= LIST_NOT_USED; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2443 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2444 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2445 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2446 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2447 |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2448 return 0; |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2449 } |
56591b8041ea
Move static function fill_filter_caches() from h264.h to h264.c.
diego
parents:
11562
diff
changeset
|
2450 |
10906 | 2451 static void loop_filter(H264Context *h){ |
2452 MpegEncContext * const s = &h->s; | |
2453 uint8_t *dest_y, *dest_cb, *dest_cr; | |
2454 int linesize, uvlinesize, mb_x, mb_y; | |
2455 const int end_mb_y= s->mb_y + FRAME_MBAFF; | |
2456 const int old_slice_type= h->slice_type; | |
2457 | |
2458 if(h->deblocking_filter) { | |
2459 for(mb_x= 0; mb_x<s->mb_width; mb_x++){ | |
2460 for(mb_y=end_mb_y - FRAME_MBAFF; mb_y<= end_mb_y; mb_y++){ | |
11162 | 2461 int mb_xy, mb_type; |
10906 | 2462 mb_xy = h->mb_xy = mb_x + mb_y*s->mb_stride; |
2463 h->slice_num= h->slice_table[mb_xy]; | |
2464 mb_type= s->current_picture.mb_type[mb_xy]; | |
2465 h->list_count= h->list_counts[mb_xy]; | |
2466 | |
2467 if(FRAME_MBAFF) | |
2468 h->mb_mbaff = h->mb_field_decoding_flag = !!IS_INTERLACED(mb_type); | |
2469 | |
2470 s->mb_x= mb_x; | |
2471 s->mb_y= mb_y; | |
2472 dest_y = s->current_picture.data[0] + (mb_x + mb_y * s->linesize ) * 16; | |
2473 dest_cb = s->current_picture.data[1] + (mb_x + mb_y * s->uvlinesize) * 8; | |
2474 dest_cr = s->current_picture.data[2] + (mb_x + mb_y * s->uvlinesize) * 8; | |
2475 //FIXME simplify above | |
2476 | |
2477 if (MB_FIELD) { | |
2478 linesize = h->mb_linesize = s->linesize * 2; | |
2479 uvlinesize = h->mb_uvlinesize = s->uvlinesize * 2; | |
2480 if(mb_y&1){ //FIXME move out of this function? | |
2481 dest_y -= s->linesize*15; | |
2482 dest_cb-= s->uvlinesize*7; | |
2483 dest_cr-= s->uvlinesize*7; | |
2484 } | |
2485 } else { | |
2486 linesize = h->mb_linesize = s->linesize; | |
2487 uvlinesize = h->mb_uvlinesize = s->uvlinesize; | |
2488 } | |
10989
79f2e73f3714
Remove is_complex from loop_filter() its useless there in its current form.
michael
parents:
10987
diff
changeset
|
2489 backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0); |
11011
aa5bcf07731a
100l typo fix, mixed up +-1 forcing the loop filter skip to never skip.
michael
parents:
11003
diff
changeset
|
2490 if(fill_filter_caches(h, mb_type)) |
10910 | 2491 continue; |
10906 | 2492 h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy]); |
2493 h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy]); | |
2494 | |
10989
79f2e73f3714
Remove is_complex from loop_filter() its useless there in its current form.
michael
parents:
10987
diff
changeset
|
2495 if (FRAME_MBAFF) { |
10906 | 2496 ff_h264_filter_mb (h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize); |
2497 } else { | |
2498 ff_h264_filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize); | |
2499 } | |
2500 } | |
2501 } | |
2502 } | |
2503 h->slice_type= old_slice_type; | |
2504 s->mb_x= 0; | |
2505 s->mb_y= end_mb_y - FRAME_MBAFF; | |
11170
d092ec99cb59
Merge decode_cabac_mb_dqp() with surronding code.
michael
parents:
11169
diff
changeset
|
2506 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); |
d092ec99cb59
Merge decode_cabac_mb_dqp() with surronding code.
michael
parents:
11169
diff
changeset
|
2507 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
10906 | 2508 } |
2509 | |
11192
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2510 static void predict_field_decoding_flag(H264Context *h){ |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2511 MpegEncContext * const s = &h->s; |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2512 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2513 int mb_type = (h->slice_table[mb_xy-1] == h->slice_num) |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2514 ? s->current_picture.mb_type[mb_xy-1] |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2515 : (h->slice_table[mb_xy-s->mb_stride] == h->slice_num) |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2516 ? s->current_picture.mb_type[mb_xy-s->mb_stride] |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2517 : 0; |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2518 h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0; |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2519 } |
e1b4f03037d5
Move predict_field_decoding_flag() from h264.h to .c as its only used there and belongs
michael
parents:
11191
diff
changeset
|
2520 |
8129
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
8107
diff
changeset
|
2521 static int decode_slice(struct AVCodecContext *avctx, void *arg){ |
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
8107
diff
changeset
|
2522 H264Context *h = *(void**)arg; |
1168 | 2523 MpegEncContext * const s = &h->s; |
2524 const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F; | |
2525 | |
2526 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
|
2527 |
8353
add1a0d65370
Do not recalculate constant part of is_complex for every MB.
michael
parents:
8352
diff
changeset
|
2528 h->is_complex = FRAME_MBAFF || s->picture_structure != PICT_FRAME || s->codec_id != CODEC_ID_H264 || |
8742 | 2529 (CONFIG_GRAY && (s->flags&CODEC_FLAG_GRAY)); |
8353
add1a0d65370
Do not recalculate constant part of is_complex for every MB.
michael
parents:
8352
diff
changeset
|
2530 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2531 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
|
2532 /* realign */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2533 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
|
2534 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2535 /* 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
|
2536 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
|
2537 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
|
2538 s->gb.buffer + get_bits_count(&s->gb)/8, |
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
10528
diff
changeset
|
2539 (get_bits_left(&s->gb) + 7)/8); |
10869 | 2540 |
2541 ff_h264_init_cabac_states(h); | |
1168 | 2542 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2543 for(;;){ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
2544 //START_TIMER |
10869 | 2545 int ret = ff_h264_decode_mb_cabac(h); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2546 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
|
2547 //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
|
2548 |
10852 | 2549 if(ret>=0) ff_h264_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
|
2550 |
3316 | 2551 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
|
2552 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
|
2553 |
10869 | 2554 ret = ff_h264_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
|
2555 |
10852 | 2556 if(ret>=0) ff_h264_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
|
2557 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
|
2558 } |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2559 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
|
2560 |
11125
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2561 if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){ |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2562 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); |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2563 return 0; |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2564 } |
3948
3edbf131ee44
refill cabac variables in 16bit steps, 3% faster get_cabac()
michael
parents:
3947
diff
changeset
|
2565 if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { |
5153 | 2566 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
|
2567 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
|
2568 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
|
2569 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2570 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2571 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
|
2572 s->mb_x = 0; |
10906 | 2573 loop_filter(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
|
2574 ff_draw_horiz_band(s, 16*s->mb_y, 16); |
2392 | 2575 ++s->mb_y; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
2576 if(FIELD_OR_MBAFF_PICTURE) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2577 ++s->mb_y; |
11191
5e583a785508
Move check for and call of predict_field_decoding_flag() from the mb code to
michael
parents:
11170
diff
changeset
|
2578 if(FRAME_MBAFF && s->mb_y < s->mb_height) |
5e583a785508
Move check for and call of predict_field_decoding_flag() from the mb code to
michael
parents:
11170
diff
changeset
|
2579 predict_field_decoding_flag(h); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2580 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2581 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2582 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2583 if( eos || s->mb_y >= s->mb_height ) { |
4600 | 2584 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
|
2585 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
|
2586 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
|
2587 } |
1168 | 2588 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2589 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2590 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2591 for(;;){ |
10866 | 2592 int ret = ff_h264_decode_mb_cavlc(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
|
2593 |
10852 | 2594 if(ret>=0) ff_h264_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
|
2595 |
3316 | 2596 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
|
2597 s->mb_y++; |
10866 | 2598 ret = ff_h264_decode_mb_cavlc(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
|
2599 |
10852 | 2600 if(ret>=0) ff_h264_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
|
2601 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
|
2602 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2603 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2604 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
|
2605 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
|
2606 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
|
2607 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2608 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
|
2609 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2610 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2611 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
|
2612 s->mb_x=0; |
10906 | 2613 loop_filter(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
|
2614 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
|
2615 ++s->mb_y; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
2616 if(FIELD_OR_MBAFF_PICTURE) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2617 ++s->mb_y; |
11191
5e583a785508
Move check for and call of predict_field_decoding_flag() from the mb code to
michael
parents:
11170
diff
changeset
|
2618 if(FRAME_MBAFF && s->mb_y < s->mb_height) |
5e583a785508
Move check for and call of predict_field_decoding_flag() from the mb code to
michael
parents:
11170
diff
changeset
|
2619 predict_field_decoding_flag(h); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2620 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2621 if(s->mb_y >= s->mb_height){ |
4600 | 2622 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
|
2623 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2624 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
|
2625 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
|
2626 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2627 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
|
2628 }else{ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2629 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
|
2630 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2631 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
|
2632 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2633 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2634 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2635 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2636 if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){ |
4600 | 2637 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
|
2638 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){ |
1168 | 2639 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); |
2640 | |
2641 return 0; | |
2642 }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
|
2643 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 | 2644 |
2645 return -1; | |
2646 } | |
2647 } | |
2648 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2649 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2650 |
1168 | 2651 #if 0 |
2652 for(;s->mb_y < s->mb_height; s->mb_y++){ | |
2653 for(;s->mb_x < s->mb_width; s->mb_x++){ | |
2654 int ret= decode_mb(h); | |
2967 | 2655 |
10852 | 2656 ff_h264_hl_decode_mb(h); |
1168 | 2657 |
2658 if(ret<0){ | |
3177 | 2659 av_log(s->avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); |
1168 | 2660 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); |
2661 | |
2662 return -1; | |
2663 } | |
2967 | 2664 |
1168 | 2665 if(++s->mb_x >= s->mb_width){ |
2666 s->mb_x=0; | |
2667 if(++s->mb_y >= s->mb_height){ | |
2668 if(get_bits_count(s->gb) == s->gb.size_in_bits){ | |
2669 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); | |
2670 | |
2671 return 0; | |
2672 }else{ | |
2673 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); | |
2674 | |
2675 return -1; | |
2676 } | |
2677 } | |
2678 } | |
2967 | 2679 |
1168 | 2680 if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){ |
2681 if(get_bits_count(s->gb) == s->gb.size_in_bits){ | |
2682 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); | |
2683 | |
2684 return 0; | |
2685 }else{ | |
2686 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); | |
2687 | |
2688 return -1; | |
2689 } | |
2690 } | |
2691 } | |
2692 s->mb_x=0; | |
2693 ff_draw_horiz_band(s, 16*s->mb_y, 16); | |
2694 } | |
2695 #endif | |
2696 return -1; //not reached | |
2697 } | |
2698 | |
5642 | 2699 /** |
2700 * Call decode_slice() for each context. | |
2701 * | |
2702 * @param h h264 master context | |
2703 * @param context_count number of contexts to execute | |
2704 */ | |
2705 static void execute_decode_slices(H264Context *h, int context_count){ | |
2706 MpegEncContext * const s = &h->s; | |
2707 AVCodecContext * const avctx= s->avctx; | |
2708 H264Context *hx; | |
2709 int i; | |
2710 | |
9012
15a3df8c01fd
More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents:
9004
diff
changeset
|
2711 if (s->avctx->hwaccel) |
15a3df8c01fd
More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents:
9004
diff
changeset
|
2712 return; |
8610 | 2713 if(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
2714 return; |
5642 | 2715 if(context_count == 1) { |
8140 | 2716 decode_slice(avctx, &h); |
5642 | 2717 } else { |
2718 for(i = 1; i < context_count; i++) { | |
2719 hx = h->thread_context[i]; | |
7831 | 2720 hx->s.error_recognition = avctx->error_recognition; |
5642 | 2721 hx->s.error_count = 0; |
2722 } | |
2723 | |
2724 avctx->execute(avctx, (void *)decode_slice, | |
10368
59ec306245a4
Remove casts that are useless since the argument is void *.
reimar
parents:
10235
diff
changeset
|
2725 h->thread_context, NULL, context_count, sizeof(void*)); |
5642 | 2726 |
2727 /* pull back stuff from slices to master context */ | |
2728 hx = h->thread_context[context_count - 1]; | |
2729 s->mb_x = hx->s.mb_x; | |
2730 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
|
2731 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
|
2732 s->picture_structure = hx->s.picture_structure; |
5642 | 2733 for(i = 1; i < context_count; i++) |
2734 h->s.error_count += h->thread_context[i]->s.error_count; | |
2735 } | |
2736 } | |
2737 | |
2738 | |
6216 | 2739 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ |
1168 | 2740 MpegEncContext * const s = &h->s; |
2741 AVCodecContext * const avctx= s->avctx; | |
2742 int buf_index=0; | |
5642 | 2743 H264Context *hx; ///< thread context |
2744 int context_count = 0; | |
9449 | 2745 int next_avc= h->is_avc ? 0 : buf_size; |
5642 | 2746 |
2747 h->max_contexts = avctx->thread_count; | |
1322 | 2748 #if 0 |
1168 | 2749 int i; |
2867
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
2750 for(i=0; i<50; i++){ |
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
2751 av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]); |
1168 | 2752 } |
2753 #endif | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
2754 if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){ |
5642 | 2755 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
|
2756 if (!s->first_field) |
5803 | 2757 s->current_picture_ptr= NULL; |
10858 | 2758 ff_h264_reset_sei(h); |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
2759 } |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
2760 |
1168 | 2761 for(;;){ |
2762 int consumed; | |
2763 int dst_length; | |
2764 int bit_length; | |
6216 | 2765 const uint8_t *ptr; |
2227 | 2766 int i, nalsize = 0; |
5642 | 2767 int err; |
2967 | 2768 |
9449 | 2769 if(buf_index >= next_avc) { |
5170 | 2770 if(buf_index >= buf_size) break; |
2771 nalsize = 0; | |
2772 for(i = 0; i < h->nal_length_size; i++) | |
2773 nalsize = (nalsize << 8) | buf[buf_index++]; | |
9898
003d7f830e2a
Fix nalsize check to avoid an integer overflow that made the check
reimar
parents:
9885
diff
changeset
|
2774 if(nalsize <= 1 || nalsize > buf_size - buf_index){ |
5170 | 2775 if(nalsize == 1){ |
2776 buf_index++; | |
2777 continue; | |
2778 }else{ | |
2779 av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize); | |
2780 break; | |
2781 } | |
2782 } | |
9449 | 2783 next_avc= buf_index + nalsize; |
5170 | 2784 } else { |
2785 // start code prefix search | |
10663
dc61c373810e
End startcode prefix search at the end of a AVC unit.
michael
parents:
10656
diff
changeset
|
2786 for(; buf_index + 3 < next_avc; buf_index++){ |
5170 | 2787 // This should always succeed in the first iteration. |
2788 if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1) | |
2789 break; | |
2790 } | |
2791 | |
2792 if(buf_index+3 >= buf_size) break; | |
2793 | |
2794 buf_index+=3; | |
10663
dc61c373810e
End startcode prefix search at the end of a AVC unit.
michael
parents:
10656
diff
changeset
|
2795 if(buf_index >= next_avc) continue; |
5170 | 2796 } |
2967 | 2797 |
5642 | 2798 hx = h->thread_context[context_count]; |
2799 | |
9449 | 2800 ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed, next_avc - buf_index); |
4828
58f1856608f6
scenario: A properly coded frame is followed by an end of sequence NAL unit,
diego
parents:
4795
diff
changeset
|
2801 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
|
2802 return -1; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2803 } |
11125
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2804 i= buf_index + consumed; |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2805 if((s->workaround_bugs & FF_BUG_AUTODETECT) && i+3<next_avc && |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2806 buf[i]==0x00 && buf[i+1]==0x00 && buf[i+2]==0x01 && buf[i+3]==0xE0) |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2807 s->workaround_bugs |= FF_BUG_TRUNCATED; |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2808 |
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2809 if(!(s->workaround_bugs & FF_BUG_TRUNCATED)){ |
4829
e3161603a048
Remove a NAL unit's trailing zero bytes even when dst_length is 1.
diego
parents:
4828
diff
changeset
|
2810 while(ptr[dst_length - 1] == 0 && dst_length > 0) |
3341 | 2811 dst_length--; |
11125
1f13ac0e696b
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
michael
parents:
11097
diff
changeset
|
2812 } |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
2813 bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_trailing(h, ptr + dst_length - 1)); |
1168 | 2814 |
2815 if(s->avctx->debug&FF_DEBUG_STARTCODE){ | |
5642 | 2816 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 | 2817 } |
2967 | 2818 |
9449 | 2819 if (h->is_avc && (nalsize != consumed) && nalsize){ |
10656
34911596ffed
Reduce warnings about too few consumed bytes to debug level.
michael
parents:
10565
diff
changeset
|
2820 av_log(h->s.avctx, AV_LOG_DEBUG, "AVC: Consumed only %d bytes instead of %d\n", consumed, nalsize); |
6490
bb799e3bc64b
If consumed does not match nalsize, favor nalsize.
michael
parents:
6488
diff
changeset
|
2821 } |
2227 | 2822 |
1168 | 2823 buf_index += consumed; |
2824 | |
5127 | 2825 if( (s->hurry_up == 1 && h->nal_ref_idc == 0) //FIXME do not discard SEI id |
2792 | 2826 ||(avctx->skip_frame >= AVDISCARD_NONREF && h->nal_ref_idc == 0)) |
1168 | 2827 continue; |
2967 | 2828 |
5642 | 2829 again: |
2830 err = 0; | |
2831 switch(hx->nal_unit_type){ | |
1168 | 2832 case NAL_IDR_SLICE: |
5642 | 2833 if (h->nal_unit_type != NAL_IDR_SLICE) { |
2834 av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices"); | |
2835 return -1; | |
2836 } | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2837 idr(h); //FIXME ensure we don't loose some frames if there is reordering |
1168 | 2838 case NAL_SLICE: |
5642 | 2839 init_get_bits(&hx->s.gb, ptr, bit_length); |
2840 hx->intra_gb_ptr= | |
2841 hx->inter_gb_ptr= &hx->s.gb; | |
2842 hx->s.data_partitioning = 0; | |
2843 | |
2844 if((err = decode_slice_header(hx, h))) | |
2845 break; | |
2846 | |
11555
e603f624b03f
Set VDPAU H264 picture parameter field_order_cnt and frame_num at the
cehoyos
parents:
11533
diff
changeset
|
2847 if (h->current_slice == 1) { |
e603f624b03f
Set VDPAU H264 picture parameter field_order_cnt and frame_num at the
cehoyos
parents:
11533
diff
changeset
|
2848 if (s->avctx->hwaccel && s->avctx->hwaccel->start_frame(s->avctx, NULL, 0) < 0) |
9066 | 2849 return -1; |
11555
e603f624b03f
Set VDPAU H264 picture parameter field_order_cnt and frame_num at the
cehoyos
parents:
11533
diff
changeset
|
2850 if(CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) |
e603f624b03f
Set VDPAU H264 picture parameter field_order_cnt and frame_num at the
cehoyos
parents:
11533
diff
changeset
|
2851 ff_vdpau_h264_picture_start(s); |
9066 | 2852 } |
2853 | |
8783
e91ea98d868a
Add SEI recovery point frame counter to H264Context and use it when
cehoyos
parents:
8762
diff
changeset
|
2854 s->current_picture_ptr->key_frame |= |
e91ea98d868a
Add SEI recovery point frame counter to H264Context and use it when
cehoyos
parents:
8762
diff
changeset
|
2855 (hx->nal_unit_type == NAL_IDR_SLICE) || |
e91ea98d868a
Add SEI recovery point frame counter to H264Context and use it when
cehoyos
parents:
8762
diff
changeset
|
2856 (h->sei_recovery_frame_cnt >= 0); |
5642 | 2857 if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5 |
2858 && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2859 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE) |
7340 | 2860 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE) |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
2861 && avctx->skip_frame < AVDISCARD_ALL){ |
9045
5fb849bddf4a
Add hwaccel->decode_slice() call for avhwaccel by Gwenole Beauchesne.
michael
parents:
9035
diff
changeset
|
2862 if(avctx->hwaccel) { |
5fb849bddf4a
Add hwaccel->decode_slice() call for avhwaccel by Gwenole Beauchesne.
michael
parents:
9035
diff
changeset
|
2863 if (avctx->hwaccel->decode_slice(avctx, &buf[buf_index - consumed], consumed) < 0) |
5fb849bddf4a
Add hwaccel->decode_slice() call for avhwaccel by Gwenole Beauchesne.
michael
parents:
9035
diff
changeset
|
2864 return -1; |
5fb849bddf4a
Add hwaccel->decode_slice() call for avhwaccel by Gwenole Beauchesne.
michael
parents:
9035
diff
changeset
|
2865 }else |
8610 | 2866 if(CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){ |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
2867 static const uint8_t start_code[] = {0x00, 0x00, 0x01}; |
8563
b59279494d84
Cosmetics: Rename ff_vdpau_h264_add_data_chunk as ff_vdpau_add_data_chunk.
cehoyos
parents:
8562
diff
changeset
|
2868 ff_vdpau_add_data_chunk(s, start_code, sizeof(start_code)); |
b59279494d84
Cosmetics: Rename ff_vdpau_h264_add_data_chunk as ff_vdpau_add_data_chunk.
cehoyos
parents:
8562
diff
changeset
|
2869 ff_vdpau_add_data_chunk(s, &buf[buf_index - consumed], consumed ); |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
2870 }else |
8524 | 2871 context_count++; |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
2872 } |
1168 | 2873 break; |
2874 case NAL_DPA: | |
5642 | 2875 init_get_bits(&hx->s.gb, ptr, bit_length); |
2876 hx->intra_gb_ptr= | |
2877 hx->inter_gb_ptr= NULL; | |
9910
d07aee233d03
H.264: Don't set data_partitioning for invalid NAL_DPA.
astrange
parents:
9898
diff
changeset
|
2878 |
d07aee233d03
H.264: Don't set data_partitioning for invalid NAL_DPA.
astrange
parents:
9898
diff
changeset
|
2879 if ((err = decode_slice_header(hx, h)) < 0) |
d07aee233d03
H.264: Don't set data_partitioning for invalid NAL_DPA.
astrange
parents:
9898
diff
changeset
|
2880 break; |
d07aee233d03
H.264: Don't set data_partitioning for invalid NAL_DPA.
astrange
parents:
9898
diff
changeset
|
2881 |
5642 | 2882 hx->s.data_partitioning = 1; |
2883 | |
1168 | 2884 break; |
2885 case NAL_DPB: | |
5642 | 2886 init_get_bits(&hx->intra_gb, ptr, bit_length); |
2887 hx->intra_gb_ptr= &hx->intra_gb; | |
1168 | 2888 break; |
2889 case NAL_DPC: | |
5642 | 2890 init_get_bits(&hx->inter_gb, ptr, bit_length); |
2891 hx->inter_gb_ptr= &hx->inter_gb; | |
2892 | |
2893 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
|
2894 && s->context_initialized |
2793 | 2895 && s->hurry_up < 5 |
5642 | 2896 && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2897 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE) |
7340 | 2898 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE) |
2793 | 2899 && avctx->skip_frame < AVDISCARD_ALL) |
5642 | 2900 context_count++; |
1168 | 2901 break; |
2902 case NAL_SEI: | |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
2903 init_get_bits(&s->gb, ptr, bit_length); |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
2904 ff_h264_decode_sei(h); |
1168 | 2905 break; |
2906 case NAL_SPS: | |
2907 init_get_bits(&s->gb, ptr, bit_length); | |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
2908 ff_h264_decode_seq_parameter_set(h); |
2967 | 2909 |
1168 | 2910 if(s->flags& CODEC_FLAG_LOW_DELAY) |
2911 s->low_delay=1; | |
2967 | 2912 |
2538 | 2913 if(avctx->has_b_frames < 2) |
2914 avctx->has_b_frames= !s->low_delay; | |
1168 | 2915 break; |
2916 case NAL_PPS: | |
2917 init_get_bits(&s->gb, ptr, bit_length); | |
2967 | 2918 |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
2919 ff_h264_decode_picture_parameter_set(h, bit_length); |
1168 | 2920 |
2921 break; | |
2960 | 2922 case NAL_AUD: |
2923 case NAL_END_SEQUENCE: | |
2924 case NAL_END_STREAM: | |
2925 case NAL_FILLER_DATA: | |
2926 case NAL_SPS_EXT: | |
2927 case NAL_AUXILIARY_SLICE: | |
1168 | 2928 break; |
2979 | 2929 default: |
10811 | 2930 av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n", hx->nal_unit_type, bit_length); |
2967 | 2931 } |
5642 | 2932 |
2933 if(context_count == h->max_contexts) { | |
2934 execute_decode_slices(h, context_count); | |
2935 context_count = 0; | |
2936 } | |
2937 | |
2938 if (err < 0) | |
2939 av_log(h->s.avctx, AV_LOG_ERROR, "decode_slice_header error\n"); | |
2940 else if(err == 1) { | |
2941 /* Slice could not be decoded in parallel mode, copy down | |
2942 * NAL unit stuff to context 0 and restart. Note that | |
7374 | 2943 * rbsp_buffer is not transferred, but since we no longer |
5642 | 2944 * run in parallel mode this should not be an issue. */ |
2945 h->nal_unit_type = hx->nal_unit_type; | |
2946 h->nal_ref_idc = hx->nal_ref_idc; | |
2947 hx = h; | |
2948 goto again; | |
2949 } | |
2950 } | |
2951 if(context_count) | |
2952 execute_decode_slices(h, context_count); | |
1168 | 2953 return buf_index; |
2954 } | |
2955 | |
2956 /** | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2957 * returns the number of bytes consumed for building the current frame |
1168 | 2958 */ |
2959 static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){ | |
5127 | 2960 if(pos==0) pos=1; //avoid infinite loops (i doubt that is needed but ...) |
1168 | 2961 if(pos+10>buf_size) pos=buf_size; // oops ;) |
2962 | |
2963 return pos; | |
2964 } | |
2965 | |
2967 | 2966 static int decode_frame(AVCodecContext *avctx, |
1168 | 2967 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9163
diff
changeset
|
2968 AVPacket *avpkt) |
1168 | 2969 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9163
diff
changeset
|
2970 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9163
diff
changeset
|
2971 int buf_size = avpkt->size; |
1168 | 2972 H264Context *h = avctx->priv_data; |
2973 MpegEncContext *s = &h->s; | |
2967 | 2974 AVFrame *pict = data; |
1168 | 2975 int buf_index; |
2967 | 2976 |
1168 | 2977 s->flags= avctx->flags; |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1706
diff
changeset
|
2978 s->flags2= avctx->flags2; |
1168 | 2979 |
7374 | 2980 /* end of stream, output what is still in the buffers */ |
1168 | 2981 if (buf_size == 0) { |
4556 | 2982 Picture *out; |
2983 int i, out_idx; | |
2984 | |
2985 //FIXME factorize this with the output code below | |
2986 out = h->delayed_pic[0]; | |
2987 out_idx = 0; | |
9885 | 2988 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame && !h->delayed_pic[i]->mmco_reset; i++) |
4556 | 2989 if(h->delayed_pic[i]->poc < out->poc){ |
2990 out = h->delayed_pic[i]; | |
2991 out_idx = i; | |
2992 } | |
2993 | |
2994 for(i=out_idx; h->delayed_pic[i]; i++) | |
2995 h->delayed_pic[i] = h->delayed_pic[i+1]; | |
2996 | |
2997 if(out){ | |
2998 *data_size = sizeof(AVFrame); | |
2999 *pict= *(AVFrame*)out; | |
3000 } | |
3001 | |
1168 | 3002 return 0; |
3003 } | |
2967 | 3004 |
1168 | 3005 buf_index=decode_nal_units(h, buf, buf_size); |
2967 | 3006 if(buf_index < 0) |
1168 | 3007 return -1; |
3008 | |
4620 | 3009 if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ |
5629
7e5ebda833e9
Remove error raising when explicitely skipping frame
benoit
parents:
5547
diff
changeset
|
3010 if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; |
4620 | 3011 av_log(avctx, AV_LOG_ERROR, "no frame!\n"); |
3012 return -1; | |
3013 } | |
3014 | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3015 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
|
3016 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
|
3017 Picture *cur = s->current_picture_ptr; |
10511
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3018 int i, pics, out_of_order, out_idx; |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3019 |
9417 | 3020 field_end(h); |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3021 |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
3022 if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) { |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3023 /* 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
|
3024 *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
|
3025 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3026 } else { |
9831
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3027 cur->interlaced_frame = 0; |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3028 cur->repeat_pict = 0; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3029 |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3030 /* Signal interlacing information externally. */ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3031 /* Prioritize picture timing SEI information over used decoding process if it exists. */ |
9128
793cf8c68c4f
Add support for ct_type to correctly detect interlaced flag
schreter
parents:
9125
diff
changeset
|
3032 |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3033 if(h->sps.pic_struct_present_flag){ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3034 switch (h->sei_pic_struct) |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3035 { |
9831
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3036 case SEI_PIC_STRUCT_FRAME: |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3037 break; |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3038 case SEI_PIC_STRUCT_TOP_FIELD: |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3039 case SEI_PIC_STRUCT_BOTTOM_FIELD: |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3040 cur->interlaced_frame = 1; |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3041 break; |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3042 case SEI_PIC_STRUCT_TOP_BOTTOM: |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3043 case SEI_PIC_STRUCT_BOTTOM_TOP: |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3044 if (FIELD_OR_MBAFF_PICTURE) |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3045 cur->interlaced_frame = 1; |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3046 else |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3047 // try to flag soft telecine progressive |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3048 cur->interlaced_frame = h->prev_interlaced_frame; |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3049 break; |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3050 case SEI_PIC_STRUCT_TOP_BOTTOM_TOP: |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3051 case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3052 // Signal the possibility of telecined film externally (pic_struct 5,6) |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3053 // From these hints, let the applications decide if they apply deinterlacing. |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3054 cur->repeat_pict = 1; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3055 break; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3056 case SEI_PIC_STRUCT_FRAME_DOUBLING: |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3057 // Force progressive here, as doubling interlaced frame is a bad idea. |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3058 cur->repeat_pict = 2; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3059 break; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3060 case SEI_PIC_STRUCT_FRAME_TRIPLING: |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3061 cur->repeat_pict = 4; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3062 break; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3063 } |
9831
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3064 |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3065 if ((h->sei_ct_type & 3) && h->sei_pic_struct <= SEI_PIC_STRUCT_BOTTOM_TOP) |
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3066 cur->interlaced_frame = (h->sei_ct_type & (1<<1)) != 0; |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3067 }else{ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3068 /* Derive interlacing flag from used decoding process. */ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3069 cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3070 } |
9831
febe1855b64a
Add field prev_interlaced_frame to H264Context to be able to flag soft telecine
cehoyos
parents:
9790
diff
changeset
|
3071 h->prev_interlaced_frame = cur->interlaced_frame; |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3072 |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3073 if (cur->field_poc[0] != cur->field_poc[1]){ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3074 /* Derive top_field_first from field pocs. */ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3075 cur->top_field_first = cur->field_poc[0] < cur->field_poc[1]; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3076 }else{ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3077 if(cur->interlaced_frame || h->sps.pic_struct_present_flag){ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3078 /* Use picture timing SEI information. Even if it is a information of a past frame, better than nothing. */ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3079 if(h->sei_pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3080 || h->sei_pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM_TOP) |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3081 cur->top_field_first = 1; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3082 else |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3083 cur->top_field_first = 0; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3084 }else{ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3085 /* Most likely progressive */ |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3086 cur->top_field_first = 0; |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3087 } |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
3088 } |
5876
731ee5ad6bde
Correct assignment of interlaced_frame; was being set on output frames,
heydowns
parents:
5825
diff
changeset
|
3089 |
5803 | 3090 //FIXME do something with unavailable reference frames |
2967 | 3091 |
5803 | 3092 /* Sort B-frames into display order */ |
3093 | |
3094 if(h->sps.bitstream_restriction_flag | |
3095 && s->avctx->has_b_frames < h->sps.num_reorder_frames){ | |
3096 s->avctx->has_b_frames = h->sps.num_reorder_frames; | |
3097 s->low_delay = 0; | |
3098 } | |
3099 | |
7325
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
3100 if( s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
3101 && !h->sps.bitstream_restriction_flag){ |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
3102 s->avctx->has_b_frames= MAX_DELAYED_PIC_COUNT; |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
3103 s->low_delay= 0; |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
3104 } |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
3105 |
5803 | 3106 pics = 0; |
3107 while(h->delayed_pic[pics]) pics++; | |
3108 | |
7283
39e81fdd8d23
Move the size of the H264Context delayed_pic array into a #define.
astrange
parents:
7277
diff
changeset
|
3109 assert(pics <= MAX_DELAYED_PIC_COUNT); |
5803 | 3110 |
3111 h->delayed_pic[pics++] = cur; | |
3112 if(cur->reference == 0) | |
3113 cur->reference = DELAYED_PIC_REF; | |
3114 | |
3115 out = h->delayed_pic[0]; | |
3116 out_idx = 0; | |
9885 | 3117 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame && !h->delayed_pic[i]->mmco_reset; i++) |
5803 | 3118 if(h->delayed_pic[i]->poc < out->poc){ |
3119 out = h->delayed_pic[i]; | |
3120 out_idx = i; | |
3121 } | |
10511
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3122 if(s->avctx->has_b_frames == 0 && (h->delayed_pic[0]->key_frame || h->delayed_pic[0]->mmco_reset)) |
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3123 h->outputed_poc= INT_MIN; |
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3124 out_of_order = out->poc < h->outputed_poc; |
7310
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
3125 |
5803 | 3126 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames) |
3127 { } | |
7320
927ac918cddb
Make the automatic has_b_frames increasing code increase it up to the
michael
parents:
7318
diff
changeset
|
3128 else if((out_of_order && pics-1 == s->avctx->has_b_frames && s->avctx->has_b_frames < MAX_DELAYED_PIC_COUNT) |
5803 | 3129 || (s->low_delay && |
10511
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3130 ((h->outputed_poc != INT_MIN && out->poc > h->outputed_poc + 2) |
6481 | 3131 || cur->pict_type == FF_B_TYPE))) |
5803 | 3132 { |
3133 s->low_delay = 0; | |
3134 s->avctx->has_b_frames++; | |
7312 | 3135 } |
3136 | |
7316 | 3137 if(out_of_order || pics > s->avctx->has_b_frames){ |
7314
def12c3c7742
Do not forget marking disposed delayed pics as unused.
michael
parents:
7313
diff
changeset
|
3138 out->reference &= ~DELAYED_PIC_REF; |
5803 | 3139 for(i=out_idx; h->delayed_pic[i]; i++) |
3140 h->delayed_pic[i] = h->delayed_pic[i+1]; | |
3141 } | |
7316 | 3142 if(!out_of_order && pics > s->avctx->has_b_frames){ |
5803 | 3143 *data_size = sizeof(AVFrame); |
7310
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
3144 |
10511
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3145 if(out_idx==0 && h->delayed_pic[0] && (h->delayed_pic[0]->key_frame || h->delayed_pic[0]->mmco_reset)) { |
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3146 h->outputed_poc = INT_MIN; |
bfea93e47391
Try to fix has_b_frame calculation for open gop files.
michael
parents:
10368
diff
changeset
|
3147 } else |
10514 | 3148 h->outputed_poc = out->poc; |
5803 | 3149 *pict= *(AVFrame*)out; |
7316 | 3150 }else{ |
5803 | 3151 av_log(avctx, AV_LOG_DEBUG, "no picture\n"); |
7316 | 3152 } |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3153 } |
2937 | 3154 } |
3155 | |
3156 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
|
3157 ff_print_debug_info(s, pict); |
1168 | 3158 //printf("out %d\n", (int)pict->data[0]); |
9733
67f917b48068
remove unused hack which set AVCodecContext frame_number to pic timestamp
bcoudurier
parents:
9698
diff
changeset
|
3159 |
1168 | 3160 return get_consumed_bytes(s, buf_index, buf_size); |
3161 } | |
3162 #if 0 | |
3163 static inline void fill_mb_avail(H264Context *h){ | |
3164 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
|
3165 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1168 | 3166 |
3167 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
|
3168 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
|
3169 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
|
3170 h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num; |
1168 | 3171 }else{ |
3172 h->mb_avail[0]= | |
3173 h->mb_avail[1]= | |
3174 h->mb_avail[2]= 0; | |
3175 } | |
3176 h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num; | |
3177 h->mb_avail[4]= 1; //FIXME move out | |
3178 h->mb_avail[5]= 0; //FIXME move out | |
3179 } | |
3180 #endif | |
3181 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6046
diff
changeset
|
3182 #ifdef TEST |
6172
13aa4cac4dde
Add #undef printf and disable non-functional code to make test program compile.
diego
parents:
6164
diff
changeset
|
3183 #undef printf |
5380
389366aa3458
Fix the self tests which are contained in some codecs and are using random().
takis
parents:
5338
diff
changeset
|
3184 #undef random |
1168 | 3185 #define COUNT 8000 |
3186 #define SIZE (COUNT*40) | |
5934 | 3187 int main(void){ |
1168 | 3188 int i; |
3189 uint8_t temp[SIZE]; | |
3190 PutBitContext pb; | |
3191 GetBitContext gb; | |
3192 // int int_temp[10000]; | |
3193 DSPContext dsp; | |
3194 AVCodecContext avctx; | |
2967 | 3195 |
1168 | 3196 dsputil_init(&dsp, &avctx); |
3197 | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1453
diff
changeset
|
3198 init_put_bits(&pb, temp, SIZE); |
1168 | 3199 printf("testing unsigned exp golomb\n"); |
3200 for(i=0; i<COUNT; i++){ | |
3201 START_TIMER | |
3202 set_ue_golomb(&pb, i); | |
3203 STOP_TIMER("set_ue_golomb"); | |
3204 } | |
3205 flush_put_bits(&pb); | |
2967 | 3206 |
1168 | 3207 init_get_bits(&gb, temp, 8*SIZE); |
3208 for(i=0; i<COUNT; i++){ | |
3209 int j, s; | |
2967 | 3210 |
1168 | 3211 s= show_bits(&gb, 24); |
2967 | 3212 |
1168 | 3213 START_TIMER |
3214 j= get_ue_golomb(&gb); | |
3215 if(j != i){ | |
5127 | 3216 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s); |
1168 | 3217 // return -1; |
3218 } | |
3219 STOP_TIMER("get_ue_golomb"); | |
3220 } | |
2967 | 3221 |
3222 | |
1524 | 3223 init_put_bits(&pb, temp, SIZE); |
1168 | 3224 printf("testing signed exp golomb\n"); |
3225 for(i=0; i<COUNT; i++){ | |
3226 START_TIMER | |
3227 set_se_golomb(&pb, i - COUNT/2); | |
3228 STOP_TIMER("set_se_golomb"); | |
3229 } | |
3230 flush_put_bits(&pb); | |
2967 | 3231 |
1168 | 3232 init_get_bits(&gb, temp, 8*SIZE); |
3233 for(i=0; i<COUNT; i++){ | |
3234 int j, s; | |
2967 | 3235 |
1168 | 3236 s= show_bits(&gb, 24); |
2967 | 3237 |
1168 | 3238 START_TIMER |
3239 j= get_se_golomb(&gb); | |
3240 if(j != i - COUNT/2){ | |
5127 | 3241 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s); |
1168 | 3242 // return -1; |
3243 } | |
3244 STOP_TIMER("get_se_golomb"); | |
3245 } | |
3246 | |
6172
13aa4cac4dde
Add #undef printf and disable non-functional code to make test program compile.
diego
parents:
6164
diff
changeset
|
3247 #if 0 |
1168 | 3248 printf("testing 4x4 (I)DCT\n"); |
2967 | 3249 |
1168 | 3250 DCTELEM block[16]; |
3251 uint8_t src[16], ref[16]; | |
3252 uint64_t error= 0, max_error=0; | |
3253 | |
3254 for(i=0; i<COUNT; i++){ | |
3255 int j; | |
3256 // printf("%d %d %d\n", r1, r2, (r2-r1)*16); | |
3257 for(j=0; j<16; j++){ | |
3258 ref[j]= random()%255; | |
3259 src[j]= random()%255; | |
3260 } | |
3261 | |
3262 h264_diff_dct_c(block, src, ref, 4); | |
2967 | 3263 |
1168 | 3264 //normalize |
3265 for(j=0; j<16; j++){ | |
3266 // printf("%d ", block[j]); | |
3267 block[j]= block[j]*4; | |
3268 if(j&1) block[j]= (block[j]*4 + 2)/5; | |
3269 if(j&4) block[j]= (block[j]*4 + 2)/5; | |
3270 } | |
3271 // printf("\n"); | |
2967 | 3272 |
11499 | 3273 h->h264dsp.h264_idct_add(ref, block, 4); |
1168 | 3274 /* for(j=0; j<16; j++){ |
3275 printf("%d ", ref[j]); | |
3276 } | |
3277 printf("\n");*/ | |
2967 | 3278 |
1168 | 3279 for(j=0; j<16; j++){ |
4001 | 3280 int diff= FFABS(src[j] - ref[j]); |
2967 | 3281 |
1168 | 3282 error+= diff*diff; |
3283 max_error= FFMAX(max_error, diff); | |
3284 } | |
3285 } | |
3286 printf("error=%f max_error=%d\n", ((float)error)/COUNT/16, (int)max_error ); | |
3287 printf("testing quantizer\n"); | |
3288 for(qp=0; qp<52; qp++){ | |
3289 for(i=0; i<16; i++) | |
3290 src1_block[i]= src2_block[i]= random()%255; | |
2967 | 3291 |
1168 | 3292 } |
3293 printf("Testing NAL layer\n"); | |
2967 | 3294 |
1168 | 3295 uint8_t bitstream[COUNT]; |
3296 uint8_t nal[COUNT*2]; | |
3297 H264Context h; | |
3298 memset(&h, 0, sizeof(H264Context)); | |
2967 | 3299 |
1168 | 3300 for(i=0; i<COUNT; i++){ |
3301 int zeros= i; | |
3302 int nal_length; | |
3303 int consumed; | |
3304 int out_length; | |
3305 uint8_t *out; | |
3306 int j; | |
2967 | 3307 |
1168 | 3308 for(j=0; j<COUNT; j++){ |
3309 bitstream[j]= (random() % 255) + 1; | |
3310 } | |
2967 | 3311 |
1168 | 3312 for(j=0; j<zeros; j++){ |
3313 int pos= random() % COUNT; | |
3314 while(bitstream[pos] == 0){ | |
3315 pos++; | |
3316 pos %= COUNT; | |
3317 } | |
3318 bitstream[pos]=0; | |
3319 } | |
2967 | 3320 |
1168 | 3321 START_TIMER |
2967 | 3322 |
1168 | 3323 nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2); |
3324 if(nal_length<0){ | |
3325 printf("encoding failed\n"); | |
3326 return -1; | |
3327 } | |
2967 | 3328 |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
3329 out= ff_h264_decode_nal(&h, nal, &out_length, &consumed, nal_length); |
1168 | 3330 |
3331 STOP_TIMER("NAL") | |
2967 | 3332 |
1168 | 3333 if(out_length != COUNT){ |
3334 printf("incorrect length %d %d\n", out_length, COUNT); | |
3335 return -1; | |
3336 } | |
2967 | 3337 |
1168 | 3338 if(consumed != nal_length){ |
3339 printf("incorrect consumed length %d %d\n", nal_length, consumed); | |
3340 return -1; | |
3341 } | |
2967 | 3342 |
1168 | 3343 if(memcmp(bitstream, out, COUNT)){ |
5127 | 3344 printf("mismatch\n"); |
1168 | 3345 return -1; |
3346 } | |
3347 } | |
6172
13aa4cac4dde
Add #undef printf and disable non-functional code to make test program compile.
diego
parents:
6164
diff
changeset
|
3348 #endif |
2967 | 3349 |
1168 | 3350 printf("Testing RBSP\n"); |
2967 | 3351 |
3352 | |
1168 | 3353 return 0; |
3354 } | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6046
diff
changeset
|
3355 #endif /* TEST */ |
1168 | 3356 |
3357 | |
9384
828d15d322ed
Add forgotten void return type to ff_h264_free_context
reimar
parents:
9380
diff
changeset
|
3358 av_cold void ff_h264_free_context(H264Context *h) |
1168 | 3359 { |
7923 | 3360 int i; |
2967 | 3361 |
1168 | 3362 free_tables(h); //FIXME cleanup init stuff perhaps |
7923 | 3363 |
3364 for(i = 0; i < MAX_SPS_COUNT; i++) | |
3365 av_freep(h->sps_buffers + i); | |
3366 | |
3367 for(i = 0; i < MAX_PPS_COUNT; i++) | |
3368 av_freep(h->pps_buffers + i); | |
9380
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3369 } |
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3370 |
10852 | 3371 av_cold int ff_h264_decode_end(AVCodecContext *avctx) |
9380
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3372 { |
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3373 H264Context *h = avctx->priv_data; |
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3374 MpegEncContext *s = &h->s; |
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3375 |
54e650136c87
Add a ff_h264_free_context function and call it from the H.264 parser.
reimar
parents:
9355
diff
changeset
|
3376 ff_h264_free_context(h); |
7923 | 3377 |
1168 | 3378 MPV_common_end(s); |
3379 | |
3380 // memset(h, 0, sizeof(H264Context)); | |
2967 | 3381 |
1168 | 3382 return 0; |
3383 } | |
3384 | |
3385 | |
3386 AVCodec h264_decoder = { | |
3387 "h264", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11558
diff
changeset
|
3388 AVMEDIA_TYPE_VIDEO, |
1168 | 3389 CODEC_ID_H264, |
3390 sizeof(H264Context), | |
10852 | 3391 ff_h264_decode_init, |
1168 | 3392 NULL, |
10852 | 3393 ff_h264_decode_end, |
1168 | 3394 decode_frame, |
7359
1980cae356ad
Remove truncated support, use an AVParser if you used that, it is the same.
michael
parents:
7358
diff
changeset
|
3395 /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
2640 | 3396 .flush= flush_dpb, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6933
diff
changeset
|
3397 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), |
1168 | 3398 }; |
3399 | |
8590 | 3400 #if CONFIG_H264_VDPAU_DECODER |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3401 AVCodec h264_vdpau_decoder = { |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3402 "h264_vdpau", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11558
diff
changeset
|
3403 AVMEDIA_TYPE_VIDEO, |
8610 | 3404 CODEC_ID_H264, |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3405 sizeof(H264Context), |
10852 | 3406 ff_h264_decode_init, |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3407 NULL, |
10852 | 3408 ff_h264_decode_end, |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3409 decode_frame, |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3410 CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3411 .flush= flush_dpb, |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3412 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"), |
10512
6ec7b5450ca7
Add .pix_fmts to H264 VDPAU decoder declaration and remove obsolete test
cehoyos
parents:
10511
diff
changeset
|
3413 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_H264, PIX_FMT_NONE}, |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3414 }; |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8456
diff
changeset
|
3415 #endif |