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