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