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