Mercurial > libavcodec.hg
annotate h264.c @ 7983:47f50599b368 libavcodec
x264 has removed the b-rdo and bime options, and instead integrated
them into the subme number to attempt to reduce the number of
unnecessary options. subme now scales up to 9.
Patch by Jason Garett-Glaser %darkshikari A gmail P com%
author | gpoirier |
---|---|
date | Thu, 02 Oct 2008 19:05:35 +0000 |
parents | 2b20ad98e424 |
children | 2dfff0e25b47 |
rev | line source |
---|---|
1168 | 1 /* |
2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder | |
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1168 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1168 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1168 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3927
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3029
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1168 | 20 */ |
2967 | 21 |
1168 | 22 /** |
23 * @file h264.c | |
24 * H.264 / AVC / MPEG4 part10 codec. | |
25 * @author Michael Niedermayer <michaelni@gmx.at> | |
26 */ | |
27 | |
28 #include "dsputil.h" | |
29 #include "avcodec.h" | |
30 #include "mpegvideo.h" | |
4975 | 31 #include "h264.h" |
1168 | 32 #include "h264data.h" |
4975 | 33 #include "h264_parser.h" |
1168 | 34 #include "golomb.h" |
6020 | 35 #include "rectangle.h" |
1168 | 36 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
37 #include "cabac.h" |
6604
e226f34ca284
Redo r12838, this time using svn copy to create h264_i386.h from cabac.h.
heydowns
parents:
6603
diff
changeset
|
38 #ifdef ARCH_X86 |
e226f34ca284
Redo r12838, this time using svn copy to create h264_i386.h from cabac.h.
heydowns
parents:
6603
diff
changeset
|
39 #include "i386/h264_i386.h" |
e226f34ca284
Redo r12838, this time using svn copy to create h264_i386.h from cabac.h.
heydowns
parents:
6603
diff
changeset
|
40 #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
|
41 |
3284
a224d9752912
don't force asserts in release builds. 2% faster h264.
lorenm
parents:
3219
diff
changeset
|
42 //#undef NDEBUG |
1168 | 43 #include <assert.h> |
44 | |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
45 /** |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
46 * Value of Picture.reference when Picture is not a reference picture, but |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
47 * is held for delayed output. |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
48 */ |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
49 #define DELAYED_PIC_REF 4 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
50 |
1168 | 51 static VLC coeff_token_vlc[4]; |
7481 | 52 static VLC_TYPE coeff_token_vlc_tables[520+332+280+256][2]; |
53 static const int coeff_token_vlc_tables_size[4]={520,332,280,256}; | |
54 | |
1168 | 55 static VLC chroma_dc_coeff_token_vlc; |
7481 | 56 static VLC_TYPE chroma_dc_coeff_token_vlc_table[256][2]; |
57 static const int chroma_dc_coeff_token_vlc_table_size = 256; | |
1168 | 58 |
59 static VLC total_zeros_vlc[15]; | |
7481 | 60 static VLC_TYPE total_zeros_vlc_tables[15][512][2]; |
61 static const int total_zeros_vlc_tables_size = 512; | |
62 | |
1168 | 63 static VLC chroma_dc_total_zeros_vlc[3]; |
7481 | 64 static VLC_TYPE chroma_dc_total_zeros_vlc_tables[3][8][2]; |
65 static const int chroma_dc_total_zeros_vlc_tables_size = 8; | |
1168 | 66 |
67 static VLC run_vlc[6]; | |
7481 | 68 static VLC_TYPE run_vlc_tables[6][8][2]; |
69 static const int run_vlc_tables_size = 8; | |
70 | |
1168 | 71 static VLC run7_vlc; |
7481 | 72 static VLC_TYPE run7_vlc_table[96][2]; |
73 static const int run7_vlc_table_size = 96; | |
1168 | 74 |
1234 | 75 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp); |
76 static void svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc); | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
77 static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
78 static void filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize); |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
79 static Picture * remove_long(H264Context *h, int i, int ref_mask); |
1234 | 80 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4277
diff
changeset
|
81 static av_always_inline uint32_t pack16to32(int a, int b){ |
1269 | 82 #ifdef WORDS_BIGENDIAN |
83 return (b&0xFFFF) + (a<<16); | |
84 #else | |
85 return (a&0xFFFF) + (b<<16); | |
86 #endif | |
87 } | |
88 | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
89 const uint8_t ff_rem6[52]={ |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
90 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
|
91 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
92 |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
93 const uint8_t ff_div6[52]={ |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
94 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
|
95 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
96 |
7423 | 97 static const int left_block_options[4][8]={ |
98 {0,1,2,3,7,10,8,11}, | |
99 {2,2,3,3,8,11,8,11}, | |
100 {0,0,1,1,7,10,7,10}, | |
101 {0,2,0,2,7,10,7,10} | |
102 }; | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
103 |
3028 | 104 static void fill_caches(H264Context *h, int mb_type, int for_deblock){ |
1168 | 105 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
106 const int mb_xy= h->mb_xy; |
1168 | 107 int topleft_xy, top_xy, topright_xy, left_xy[2]; |
108 int topleft_type, top_type, topright_type, left_type[2]; | |
7423 | 109 int * left_block; |
6310 | 110 int topleft_partition= -1; |
1168 | 111 int i; |
112 | |
6014
33b0514769b2
Fix non_zero_count_cache for deblocking in field pictures.
heydowns
parents:
5987
diff
changeset
|
113 top_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); |
33b0514769b2
Fix non_zero_count_cache for deblocking in field pictures.
heydowns
parents:
5987
diff
changeset
|
114 |
3482 | 115 //FIXME deblocking could skip the intra and nnz parts. |
6014
33b0514769b2
Fix non_zero_count_cache for deblocking in field pictures.
heydowns
parents:
5987
diff
changeset
|
116 if(for_deblock && (h->slice_num == 1 || h->slice_table[mb_xy] == h->slice_table[top_xy]) && !FRAME_MBAFF) |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
117 return; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
118 |
6488 | 119 /* Wow, what a mess, why didn't they simplify the interlacing & intra |
120 * stuff, I can't imagine that these complex rules are worth it. */ | |
2967 | 121 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
122 topleft_xy = top_xy - 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
123 topright_xy= top_xy + 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
124 left_xy[1] = left_xy[0] = mb_xy-1; |
7423 | 125 left_block = left_block_options[0]; |
3316 | 126 if(FRAME_MBAFF){ |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
127 const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
128 const int top_pair_xy = pair_xy - s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
129 const int topleft_pair_xy = top_pair_xy - 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
130 const int topright_pair_xy = top_pair_xy + 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
131 const int topleft_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topleft_pair_xy]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
132 const int top_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
133 const int topright_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topright_pair_xy]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
134 const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
135 const int curr_mb_frame_flag = !IS_INTERLACED(mb_type); |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
136 const int bottom = (s->mb_y & 1); |
4600 | 137 tprintf(s->avctx, "fill_caches: curr_mb_frame_flag:%d, left_mb_frame_flag:%d, topleft_mb_frame_flag:%d, top_mb_frame_flag:%d, topright_mb_frame_flag:%d\n", curr_mb_frame_flag, left_mb_frame_flag, topleft_mb_frame_flag, top_mb_frame_flag, topright_mb_frame_flag); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
138 if (bottom |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
139 ? !curr_mb_frame_flag // bottom macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
140 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
141 ) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
142 top_xy -= s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
143 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
144 if (bottom |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
145 ? !curr_mb_frame_flag // bottom macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
146 : (!curr_mb_frame_flag && !topleft_mb_frame_flag) // top macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
147 ) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
148 topleft_xy -= s->mb_stride; |
6310 | 149 } else if(bottom && curr_mb_frame_flag && !left_mb_frame_flag) { |
150 topleft_xy += s->mb_stride; | |
7374 | 151 // take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition |
6310 | 152 topleft_partition = 0; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
153 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
154 if (bottom |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
155 ? !curr_mb_frame_flag // bottom macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
156 : (!curr_mb_frame_flag && !topright_mb_frame_flag) // top macroblock |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
157 ) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
158 topright_xy -= s->mb_stride; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
159 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
160 if (left_mb_frame_flag != curr_mb_frame_flag) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
161 left_xy[1] = left_xy[0] = pair_xy - 1; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
162 if (curr_mb_frame_flag) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
163 if (bottom) { |
7423 | 164 left_block = left_block_options[1]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
165 } else { |
7423 | 166 left_block= left_block_options[2]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
167 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
168 } else { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
169 left_xy[1] += s->mb_stride; |
7423 | 170 left_block = left_block_options[3]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
171 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
172 } |
1168 | 173 } |
174 | |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
175 h->top_mb_xy = top_xy; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
176 h->left_mb_xy[0] = left_xy[0]; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
177 h->left_mb_xy[1] = left_xy[1]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
178 if(for_deblock){ |
3482 | 179 topleft_type = 0; |
180 topright_type = 0; | |
2449 | 181 top_type = h->slice_table[top_xy ] < 255 ? s->current_picture.mb_type[top_xy] : 0; |
182 left_type[0] = h->slice_table[left_xy[0] ] < 255 ? s->current_picture.mb_type[left_xy[0]] : 0; | |
183 left_type[1] = h->slice_table[left_xy[1] ] < 255 ? s->current_picture.mb_type[left_xy[1]] : 0; | |
3316 | 184 |
7527
ebdac291453a
Remove a few more lines of unneeded code in fill_caches() for MBAFF.
michael
parents:
7526
diff
changeset
|
185 if(MB_MBAFF && !IS_INTRA(mb_type)){ |
3316 | 186 int list; |
4533 | 187 for(list=0; list<h->list_count; list++){ |
7527
ebdac291453a
Remove a few more lines of unneeded code in fill_caches() for MBAFF.
michael
parents:
7526
diff
changeset
|
188 //These values where changed for ease of performing MC, we need to change them back |
ebdac291453a
Remove a few more lines of unneeded code in fill_caches() for MBAFF.
michael
parents:
7526
diff
changeset
|
189 //FIXME maybe we can make MC and loop filter use the same values or prevent |
ebdac291453a
Remove a few more lines of unneeded code in fill_caches() for MBAFF.
michael
parents:
7526
diff
changeset
|
190 //the MC code from changing ref_cache and rather use a temporary array. |
3316 | 191 if(USES_LIST(mb_type,list)){ |
3776 | 192 int8_t *ref = &s->current_picture.ref_index[list][h->mb2b8_xy[mb_xy]]; |
3316 | 193 *(uint32_t*)&h->ref_cache[list][scan8[ 0]] = |
7528
553ec99ac3b0
Mask bits of reference indexes properly to avoid negative numbers entangling
michael
parents:
7527
diff
changeset
|
194 *(uint32_t*)&h->ref_cache[list][scan8[ 2]] = (pack16to32(ref[0],ref[1])&0x00FF00FF)*0x0101; |
3316 | 195 ref += h->b8_stride; |
196 *(uint32_t*)&h->ref_cache[list][scan8[ 8]] = | |
7528
553ec99ac3b0
Mask bits of reference indexes properly to avoid negative numbers entangling
michael
parents:
7527
diff
changeset
|
197 *(uint32_t*)&h->ref_cache[list][scan8[10]] = (pack16to32(ref[0],ref[1])&0x00FF00FF)*0x0101; |
3316 | 198 } |
199 } | |
200 } | |
2449 | 201 }else{ |
202 topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0; | |
203 top_type = h->slice_table[top_xy ] == h->slice_num ? s->current_picture.mb_type[top_xy] : 0; | |
204 topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0; | |
205 left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0; | |
206 left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0; | |
1168 | 207 |
208 if(IS_INTRA(mb_type)){ | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
209 int type_mask= h->pps.constrained_intra_pred ? IS_INTRA(-1) : -1; |
2967 | 210 h->topleft_samples_available= |
211 h->top_samples_available= | |
1168 | 212 h->left_samples_available= 0xFFFF; |
213 h->topright_samples_available= 0xEEEA; | |
214 | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
215 if(!(top_type & type_mask)){ |
1168 | 216 h->topleft_samples_available= 0xB3FF; |
217 h->top_samples_available= 0x33FF; | |
218 h->topright_samples_available= 0x26EA; | |
219 } | |
7532 | 220 if(IS_INTERLACED(mb_type) != IS_INTERLACED(left_type[0])){ |
221 if(IS_INTERLACED(mb_type)){ | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
222 if(!(left_type[0] & type_mask)){ |
7532 | 223 h->topleft_samples_available&= 0xDFFF; |
224 h->left_samples_available&= 0x5FFF; | |
225 } | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
226 if(!(left_type[1] & type_mask)){ |
7532 | 227 h->topleft_samples_available&= 0xFF5F; |
228 h->left_samples_available&= 0xFF5F; | |
229 } | |
230 }else{ | |
231 int left_typei = h->slice_table[left_xy[0] + s->mb_stride ] == h->slice_num | |
232 ? s->current_picture.mb_type[left_xy[0] + s->mb_stride] : 0; | |
233 assert(left_xy[0] == left_xy[1]); | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
234 if(!((left_typei & type_mask) && (left_type[0] & type_mask))){ |
7532 | 235 h->topleft_samples_available&= 0xDF5F; |
236 h->left_samples_available&= 0x5F5F; | |
237 } | |
238 } | |
239 }else{ | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
240 if(!(left_type[0] & type_mask)){ |
1168 | 241 h->topleft_samples_available&= 0xDF5F; |
242 h->left_samples_available&= 0x5F5F; | |
243 } | |
244 } | |
2967 | 245 |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
246 if(!(topleft_type & type_mask)) |
1168 | 247 h->topleft_samples_available&= 0x7FFF; |
2967 | 248 |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
249 if(!(topright_type & type_mask)) |
1168 | 250 h->topright_samples_available&= 0xFBFF; |
2967 | 251 |
1168 | 252 if(IS_INTRA4x4(mb_type)){ |
253 if(IS_INTRA4x4(top_type)){ | |
254 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4]; | |
255 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5]; | |
256 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6]; | |
257 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3]; | |
258 }else{ | |
259 int pred; | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
260 if(!(top_type & type_mask)) |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
261 pred= -1; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
262 else{ |
1168 | 263 pred= 2; |
264 } | |
265 h->intra4x4_pred_mode_cache[4+8*0]= | |
266 h->intra4x4_pred_mode_cache[5+8*0]= | |
267 h->intra4x4_pred_mode_cache[6+8*0]= | |
268 h->intra4x4_pred_mode_cache[7+8*0]= pred; | |
269 } | |
270 for(i=0; i<2; i++){ | |
271 if(IS_INTRA4x4(left_type[i])){ | |
272 h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]]; | |
273 h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]]; | |
274 }else{ | |
275 int pred; | |
7533
e61de3e409eb
Simplify constrained_intra_pred code in fill_caches().
michael
parents:
7532
diff
changeset
|
276 if(!(left_type[i] & type_mask)) |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
277 pred= -1; |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
278 else{ |
1168 | 279 pred= 2; |
280 } | |
281 h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= | |
282 h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred; | |
283 } | |
284 } | |
285 } | |
286 } | |
7534
4891fe700813
The deblock filter does not need all the intra availability stuff so do
michael
parents:
7533
diff
changeset
|
287 } |
2967 | 288 |
289 | |
1168 | 290 /* |
2967 | 291 0 . T T. T T T T |
292 1 L . .L . . . . | |
293 2 L . .L . . . . | |
294 3 . T TL . . . . | |
295 4 L . .L . . . . | |
296 5 L . .. . . . . | |
1168 | 297 */ |
7374 | 298 //FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec) |
1168 | 299 if(top_type){ |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
300 h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][4]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
301 h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][5]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
302 h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][6]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
303 h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3]; |
2967 | 304 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
305 h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][9]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
306 h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8]; |
2967 | 307 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
308 h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][12]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
309 h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11]; |
2967 | 310 |
1168 | 311 }else{ |
2967 | 312 h->non_zero_count_cache[4+8*0]= |
1168 | 313 h->non_zero_count_cache[5+8*0]= |
314 h->non_zero_count_cache[6+8*0]= | |
315 h->non_zero_count_cache[7+8*0]= | |
2967 | 316 |
1168 | 317 h->non_zero_count_cache[1+8*0]= |
318 h->non_zero_count_cache[2+8*0]= | |
2967 | 319 |
1168 | 320 h->non_zero_count_cache[1+8*3]= |
2314 | 321 h->non_zero_count_cache[2+8*3]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64; |
2967 | 322 |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
323 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
324 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
325 for (i=0; i<2; i++) { |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
326 if(left_type[i]){ |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
327 h->non_zero_count_cache[3+8*1 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[0+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
328 h->non_zero_count_cache[3+8*2 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[1+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
329 h->non_zero_count_cache[0+8*1 + 8*i]= h->non_zero_count[left_xy[i]][left_block[4+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
330 h->non_zero_count_cache[0+8*4 + 8*i]= h->non_zero_count[left_xy[i]][left_block[5+2*i]]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
331 }else{ |
2967 | 332 h->non_zero_count_cache[3+8*1 + 2*8*i]= |
333 h->non_zero_count_cache[3+8*2 + 2*8*i]= | |
334 h->non_zero_count_cache[0+8*1 + 8*i]= | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
335 h->non_zero_count_cache[0+8*4 + 8*i]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64; |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
336 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
337 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
338 |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
339 if( h->pps.cabac ) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
340 // top_cbp |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
341 if(top_type) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
342 h->top_cbp = h->cbp_table[top_xy]; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
343 } else if(IS_INTRA(mb_type)) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
344 h->top_cbp = 0x1C0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
345 } else { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
346 h->top_cbp = 0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
347 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
348 // left_cbp |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
349 if (left_type[0]) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
350 h->left_cbp = h->cbp_table[left_xy[0]] & 0x1f0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
351 } else if(IS_INTRA(mb_type)) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
352 h->left_cbp = 0x1C0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
353 } else { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
354 h->left_cbp = 0; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
355 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
356 if (left_type[0]) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
357 h->left_cbp |= ((h->cbp_table[left_xy[0]]>>((left_block[0]&(~1))+1))&0x1) << 1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
358 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
359 if (left_type[1]) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
360 h->left_cbp |= ((h->cbp_table[left_xy[1]]>>((left_block[2]&(~1))+1))&0x1) << 3; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
361 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
362 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
363 |
1168 | 364 #if 1 |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
365 if(IS_INTER(mb_type) || IS_DIRECT(mb_type)){ |
1168 | 366 int list; |
4533 | 367 for(list=0; list<h->list_count; list++){ |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
368 if(!USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !h->deblocking_filter){ |
1168 | 369 /*if(!h->mv_cache_clean[list]){ |
370 memset(h->mv_cache [list], 0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all? | |
371 memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t)); | |
372 h->mv_cache_clean[list]= 1; | |
373 }*/ | |
2396 | 374 continue; |
1168 | 375 } |
376 h->mv_cache_clean[list]= 0; | |
2967 | 377 |
3212 | 378 if(USES_LIST(top_type, list)){ |
1168 | 379 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride; |
380 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride; | |
381 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0]; | |
382 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1]; | |
383 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2]; | |
384 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3]; | |
385 h->ref_cache[list][scan8[0] + 0 - 1*8]= | |
386 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0]; | |
387 h->ref_cache[list][scan8[0] + 2 - 1*8]= | |
388 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1]; | |
389 }else{ | |
2967 | 390 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]= |
391 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]= | |
392 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]= | |
1168 | 393 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0; |
394 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101; | |
395 } | |
396 | |
4546 | 397 for(i=0; i<2; i++){ |
398 int cache_idx = scan8[0] - 1 + i*2*8; | |
399 if(USES_LIST(left_type[i], list)){ | |
400 const int b_xy= h->mb2b_xy[left_xy[i]] + 3; | |
401 const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1; | |
402 *(uint32_t*)h->mv_cache[list][cache_idx ]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0+i*2]]; | |
403 *(uint32_t*)h->mv_cache[list][cache_idx+8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1+i*2]]; | |
404 h->ref_cache[list][cache_idx ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)]; | |
405 h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)]; | |
406 }else{ | |
407 *(uint32_t*)h->mv_cache [list][cache_idx ]= | |
408 *(uint32_t*)h->mv_cache [list][cache_idx+8]= 0; | |
409 h->ref_cache[list][cache_idx ]= | |
410 h->ref_cache[list][cache_idx+8]= left_type[i] ? LIST_NOT_USED : PART_NOT_AVAILABLE; | |
411 } | |
1168 | 412 } |
413 | |
7525
2f159f961f3a
Do not execute the part of fill_caches() for the loopfilter that overwrites
michael
parents:
7524
diff
changeset
|
414 if(for_deblock || ((IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred) && !FRAME_MBAFF)) |
2449 | 415 continue; |
416 | |
3212 | 417 if(USES_LIST(topleft_type, list)){ |
6310 | 418 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + h->b_stride + (topleft_partition & 2*h->b_stride); |
419 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + (topleft_partition & h->b8_stride); | |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
420 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
421 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
422 }else{ |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
423 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
424 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
425 } |
2967 | 426 |
3212 | 427 if(USES_LIST(topright_type, list)){ |
2623
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
428 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
429 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
430 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
431 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy]; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
432 }else{ |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
433 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
434 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE; |
aaf8e94bce00
deblocking filter doesn't need to call fill_caches again. 1.4% faster decoding.
lorenm
parents:
2597
diff
changeset
|
435 } |
2967 | 436 |
3519 | 437 if((IS_SKIP(mb_type) || IS_DIRECT(mb_type)) && !FRAME_MBAFF) |
3482 | 438 continue; |
2967 | 439 |
440 h->ref_cache[list][scan8[5 ]+1] = | |
441 h->ref_cache[list][scan8[7 ]+1] = | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
442 h->ref_cache[list][scan8[13]+1] = //FIXME remove past 3 (init somewhere else) |
2967 | 443 h->ref_cache[list][scan8[4 ]] = |
1168 | 444 h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE; |
445 *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]= | |
446 *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]= | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
447 *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else) |
1168 | 448 *(uint32_t*)h->mv_cache [list][scan8[4 ]]= |
449 *(uint32_t*)h->mv_cache [list][scan8[12]]= 0; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
450 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
451 if( h->pps.cabac ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
452 /* XXX beurk, Load mvd */ |
3212 | 453 if(USES_LIST(top_type, list)){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
454 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
455 *(uint32_t*)h->mvd_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
456 *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
457 *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
458 *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
459 }else{ |
2967 | 460 *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]= |
461 *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]= | |
462 *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]= | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
463 *(uint32_t*)h->mvd_cache [list][scan8[0] + 3 - 1*8]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
464 } |
3212 | 465 if(USES_LIST(left_type[0], list)){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
466 const int b_xy= h->mb2b_xy[left_xy[0]] + 3; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
467 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 0*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[0]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
468 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[1]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
469 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
470 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
471 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 1*8]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
472 } |
3212 | 473 if(USES_LIST(left_type[1], list)){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
474 const int b_xy= h->mb2b_xy[left_xy[1]] + 3; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
475 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 2*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[2]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
476 *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 3*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[3]]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
477 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
478 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
479 *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
480 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
481 *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
482 *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]= |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
483 *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else) |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
484 *(uint32_t*)h->mvd_cache [list][scan8[4 ]]= |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
485 *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0; |
2396 | 486 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
487 if(h->slice_type_nos == FF_B_TYPE){ |
2396 | 488 fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, 0, 1); |
489 | |
490 if(IS_DIRECT(top_type)){ | |
491 *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101; | |
492 }else if(IS_8X8(top_type)){ | |
493 int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride; | |
494 h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy]; | |
495 h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1]; | |
496 }else{ | |
497 *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0; | |
498 } | |
2967 | 499 |
3316 | 500 if(IS_DIRECT(left_type[0])) |
501 h->direct_cache[scan8[0] - 1 + 0*8]= 1; | |
502 else if(IS_8X8(left_type[0])) | |
503 h->direct_cache[scan8[0] - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)]; | |
504 else | |
505 h->direct_cache[scan8[0] - 1 + 0*8]= 0; | |
506 | |
507 if(IS_DIRECT(left_type[1])) | |
2396 | 508 h->direct_cache[scan8[0] - 1 + 2*8]= 1; |
3316 | 509 else if(IS_8X8(left_type[1])) |
510 h->direct_cache[scan8[0] - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)]; | |
511 else | |
2396 | 512 h->direct_cache[scan8[0] - 1 + 2*8]= 0; |
3316 | 513 } |
514 } | |
515 | |
516 if(FRAME_MBAFF){ | |
517 #define MAP_MVS\ | |
518 MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\ | |
519 MAP_F2F(scan8[0] + 0 - 1*8, top_type)\ | |
520 MAP_F2F(scan8[0] + 1 - 1*8, top_type)\ | |
521 MAP_F2F(scan8[0] + 2 - 1*8, top_type)\ | |
522 MAP_F2F(scan8[0] + 3 - 1*8, top_type)\ | |
523 MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\ | |
524 MAP_F2F(scan8[0] - 1 + 0*8, left_type[0])\ | |
525 MAP_F2F(scan8[0] - 1 + 1*8, left_type[0])\ | |
526 MAP_F2F(scan8[0] - 1 + 2*8, left_type[1])\ | |
527 MAP_F2F(scan8[0] - 1 + 3*8, left_type[1]) | |
528 if(MB_FIELD){ | |
529 #define MAP_F2F(idx, mb_type)\ | |
530 if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\ | |
531 h->ref_cache[list][idx] <<= 1;\ | |
532 h->mv_cache[list][idx][1] /= 2;\ | |
533 h->mvd_cache[list][idx][1] /= 2;\ | |
2396 | 534 } |
3316 | 535 MAP_MVS |
536 #undef MAP_F2F | |
537 }else{ | |
538 #define MAP_F2F(idx, mb_type)\ | |
539 if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\ | |
540 h->ref_cache[list][idx] >>= 1;\ | |
541 h->mv_cache[list][idx][1] <<= 1;\ | |
542 h->mvd_cache[list][idx][1] <<= 1;\ | |
543 } | |
544 MAP_MVS | |
545 #undef MAP_F2F | |
2396 | 546 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
547 } |
1168 | 548 } |
549 } | |
550 #endif | |
2755 | 551 |
552 h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]); | |
1168 | 553 } |
554 | |
555 static inline void 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
|
556 const int mb_xy= h->mb_xy; |
1168 | 557 |
558 h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1]; | |
559 h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2]; | |
560 h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3]; | |
561 h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4]; | |
562 h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4]; | |
563 h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4]; | |
564 h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4]; | |
565 } | |
566 | |
567 /** | |
568 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |
569 */ | |
570 static inline int check_intra4x4_pred_mode(H264Context *h){ | |
571 MpegEncContext * const s = &h->s; | |
572 static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0}; | |
573 static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED}; | |
574 int i; | |
2967 | 575 |
1168 | 576 if(!(h->top_samples_available&0x8000)){ |
577 for(i=0; i<4; i++){ | |
578 int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ]; | |
579 if(status<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
580 av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y); |
1168 | 581 return -1; |
582 } else if(status){ | |
583 h->intra4x4_pred_mode_cache[scan8[0] + i]= status; | |
584 } | |
585 } | |
586 } | |
2967 | 587 |
7532 | 588 if((h->left_samples_available&0x8888)!=0x8888){ |
589 static const int mask[4]={0x8000,0x2000,0x80,0x20}; | |
1168 | 590 for(i=0; i<4; i++){ |
7532 | 591 if(!(h->left_samples_available&mask[i])){ |
1168 | 592 int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ]; |
593 if(status<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
594 av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y); |
1168 | 595 return -1; |
596 } else if(status){ | |
597 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status; | |
598 } | |
7532 | 599 } |
1168 | 600 } |
601 } | |
602 | |
603 return 0; | |
604 } //FIXME cleanup like next | |
605 | |
606 /** | |
607 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |
608 */ | |
609 static inline int check_intra_pred_mode(H264Context *h, int mode){ | |
610 MpegEncContext * const s = &h->s; | |
611 static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1}; | |
612 static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8}; | |
2967 | 613 |
4529 | 614 if(mode > 6U) { |
2392 | 615 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 | 616 return -1; |
2392 | 617 } |
2967 | 618 |
1168 | 619 if(!(h->top_samples_available&0x8000)){ |
620 mode= top[ mode ]; | |
621 if(mode<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
622 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 | 623 return -1; |
624 } | |
625 } | |
2967 | 626 |
7532 | 627 if((h->left_samples_available&0x8080) != 0x8080){ |
1168 | 628 mode= left[ mode ]; |
7532 | 629 if(h->left_samples_available&0x8080){ //mad cow disease mode, aka MBAFF + constrained_intra_pred |
630 mode= ALZHEIMER_DC_L0T_PRED8x8 + (!(h->left_samples_available&0x8000)) + 2*(mode == DC_128_PRED8x8); | |
631 } | |
1168 | 632 if(mode<0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
633 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 | 634 return -1; |
2967 | 635 } |
1168 | 636 } |
637 | |
638 return mode; | |
639 } | |
640 | |
641 /** | |
642 * gets the predicted intra4x4 prediction mode. | |
643 */ | |
644 static inline int pred_intra_mode(H264Context *h, int n){ | |
645 const int index8= scan8[n]; | |
646 const int left= h->intra4x4_pred_mode_cache[index8 - 1]; | |
647 const int top = h->intra4x4_pred_mode_cache[index8 - 8]; | |
648 const int min= FFMIN(left, top); | |
649 | |
4600 | 650 tprintf(h->s.avctx, "mode:%d %d min:%d\n", left ,top, min); |
1168 | 651 |
652 if(min<0) return DC_PRED; | |
653 else return min; | |
654 } | |
655 | |
656 static inline void write_back_non_zero_count(H264Context *h){ | |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
657 const int mb_xy= h->mb_xy; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
658 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
659 h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[7+8*1]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
660 h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[7+8*2]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
661 h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[7+8*3]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
662 h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
663 h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[4+8*4]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
664 h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[5+8*4]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
665 h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[6+8*4]; |
2967 | 666 |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
667 h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[1+8*2]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
668 h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
669 h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[2+8*1]; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
670 |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
671 h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[1+8*5]; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
672 h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5]; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
673 h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[2+8*4]; |
1168 | 674 } |
675 | |
676 /** | |
7374 | 677 * gets the predicted number of non-zero coefficients. |
1168 | 678 * @param n block index |
679 */ | |
680 static inline int pred_non_zero_count(H264Context *h, int n){ | |
681 const int index8= scan8[n]; | |
682 const int left= h->non_zero_count_cache[index8 - 1]; | |
683 const int top = h->non_zero_count_cache[index8 - 8]; | |
684 int i= left + top; | |
2967 | 685 |
1168 | 686 if(i<64) i= (i+1)>>1; |
687 | |
4600 | 688 tprintf(h->s.avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31); |
1168 | 689 |
690 return i&31; | |
691 } | |
692 | |
1169 | 693 static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){ |
694 const int topright_ref= h->ref_cache[list][ i - 8 + part_width ]; | |
4600 | 695 MpegEncContext *s = &h->s; |
1169 | 696 |
3316 | 697 /* there is no consistent mapping of mvs to neighboring locations that will |
698 * make mbaff happy, so we can't move all this logic to fill_caches */ | |
699 if(FRAME_MBAFF){ | |
3776 | 700 const uint32_t *mb_types = s->current_picture_ptr->mb_type; |
3316 | 701 const int16_t *mv; |
702 *(uint32_t*)h->mv_cache[list][scan8[0]-2] = 0; | |
703 *C = h->mv_cache[list][scan8[0]-2]; | |
704 | |
705 if(!MB_FIELD | |
706 && (s->mb_y&1) && i < scan8[0]+8 && topright_ref != PART_NOT_AVAILABLE){ | |
707 int topright_xy = s->mb_x + (s->mb_y-1)*s->mb_stride + (i == scan8[0]+3); | |
708 if(IS_INTERLACED(mb_types[topright_xy])){ | |
709 #define SET_DIAG_MV(MV_OP, REF_OP, X4, Y4)\ | |
710 const int x4 = X4, y4 = Y4;\ | |
711 const int mb_type = mb_types[(x4>>2)+(y4>>2)*s->mb_stride];\ | |
6310 | 712 if(!USES_LIST(mb_type,list))\ |
3316 | 713 return LIST_NOT_USED;\ |
714 mv = s->current_picture_ptr->motion_val[list][x4 + y4*h->b_stride];\ | |
715 h->mv_cache[list][scan8[0]-2][0] = mv[0];\ | |
716 h->mv_cache[list][scan8[0]-2][1] = mv[1] MV_OP;\ | |
717 return s->current_picture_ptr->ref_index[list][(x4>>1) + (y4>>1)*h->b8_stride] REF_OP; | |
718 | |
719 SET_DIAG_MV(*2, >>1, s->mb_x*4+(i&7)-4+part_width, s->mb_y*4-1); | |
720 } | |
721 } | |
722 if(topright_ref == PART_NOT_AVAILABLE | |
723 && ((s->mb_y&1) || i >= scan8[0]+8) && (i&7)==4 | |
724 && h->ref_cache[list][scan8[0]-1] != PART_NOT_AVAILABLE){ | |
725 if(!MB_FIELD | |
726 && IS_INTERLACED(mb_types[h->left_mb_xy[0]])){ | |
727 SET_DIAG_MV(*2, >>1, s->mb_x*4-1, (s->mb_y|1)*4+(s->mb_y&1)*2+(i>>4)-1); | |
728 } | |
729 if(MB_FIELD | |
730 && !IS_INTERLACED(mb_types[h->left_mb_xy[0]]) | |
731 && i >= scan8[0]+8){ | |
7374 | 732 // left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK. |
6310 | 733 SET_DIAG_MV(/2, <<1, s->mb_x*4-1, (s->mb_y&~1)*4 - 1 + ((i-scan8[0])>>3)*2); |
3316 | 734 } |
735 } | |
736 #undef SET_DIAG_MV | |
737 } | |
738 | |
1169 | 739 if(topright_ref != PART_NOT_AVAILABLE){ |
740 *C= h->mv_cache[list][ i - 8 + part_width ]; | |
741 return topright_ref; | |
742 }else{ | |
4600 | 743 tprintf(s->avctx, "topright MV not available\n"); |
1170 | 744 |
1169 | 745 *C= h->mv_cache[list][ i - 8 - 1 ]; |
746 return h->ref_cache[list][ i - 8 - 1 ]; | |
747 } | |
748 } | |
749 | |
1168 | 750 /** |
751 * gets the predicted MV. | |
752 * @param n the block index | |
753 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4) | |
754 * @param mx the x component of the predicted motion vector | |
755 * @param my the y component of the predicted motion vector | |
756 */ | |
757 static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){ | |
758 const int index8= scan8[n]; | |
759 const int top_ref= h->ref_cache[list][ index8 - 8 ]; | |
760 const int left_ref= h->ref_cache[list][ index8 - 1 ]; | |
761 const int16_t * const A= h->mv_cache[list][ index8 - 1 ]; | |
762 const int16_t * const B= h->mv_cache[list][ index8 - 8 ]; | |
1169 | 763 const int16_t * C; |
764 int diagonal_ref, match_count; | |
765 | |
1168 | 766 assert(part_width==1 || part_width==2 || part_width==4); |
1169 | 767 |
1168 | 768 /* mv_cache |
2967 | 769 B . . A T T T T |
1168 | 770 U . . L . . , . |
771 U . . L . . . . | |
772 U . . L . . , . | |
773 . . . L . . . . | |
774 */ | |
1169 | 775 |
776 diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width); | |
777 match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref); | |
4600 | 778 tprintf(h->s.avctx, "pred_motion match_count=%d\n", match_count); |
1169 | 779 if(match_count > 1){ //most common |
780 *mx= mid_pred(A[0], B[0], C[0]); | |
781 *my= mid_pred(A[1], B[1], C[1]); | |
782 }else if(match_count==1){ | |
783 if(left_ref==ref){ | |
784 *mx= A[0]; | |
2967 | 785 *my= A[1]; |
1169 | 786 }else if(top_ref==ref){ |
787 *mx= B[0]; | |
2967 | 788 *my= B[1]; |
1169 | 789 }else{ |
790 *mx= C[0]; | |
2967 | 791 *my= C[1]; |
1169 | 792 } |
793 }else{ | |
794 if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){ | |
795 *mx= A[0]; | |
2967 | 796 *my= A[1]; |
1168 | 797 }else{ |
798 *mx= mid_pred(A[0], B[0], C[0]); | |
799 *my= mid_pred(A[1], B[1], C[1]); | |
800 } | |
1169 | 801 } |
2967 | 802 |
4600 | 803 tprintf(h->s.avctx, "pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref, A[0], A[1], ref, *mx, *my, h->s.mb_x, h->s.mb_y, n, list); |
1168 | 804 } |
805 | |
806 /** | |
807 * gets the directionally predicted 16x8 MV. | |
808 * @param n the block index | |
809 * @param mx the x component of the predicted motion vector | |
810 * @param my the y component of the predicted motion vector | |
811 */ | |
812 static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){ | |
813 if(n==0){ | |
814 const int top_ref= h->ref_cache[list][ scan8[0] - 8 ]; | |
815 const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ]; | |
816 | |
4600 | 817 tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list); |
2967 | 818 |
1168 | 819 if(top_ref == ref){ |
820 *mx= B[0]; | |
821 *my= B[1]; | |
822 return; | |
823 } | |
824 }else{ | |
825 const int left_ref= h->ref_cache[list][ scan8[8] - 1 ]; | |
826 const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ]; | |
2967 | 827 |
4600 | 828 tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); |
1168 | 829 |
830 if(left_ref == ref){ | |
831 *mx= A[0]; | |
832 *my= A[1]; | |
833 return; | |
834 } | |
835 } | |
836 | |
837 //RARE | |
838 pred_motion(h, n, 4, list, ref, mx, my); | |
839 } | |
840 | |
841 /** | |
842 * gets the directionally predicted 8x16 MV. | |
843 * @param n the block index | |
844 * @param mx the x component of the predicted motion vector | |
845 * @param my the y component of the predicted motion vector | |
846 */ | |
847 static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){ | |
848 if(n==0){ | |
849 const int left_ref= h->ref_cache[list][ scan8[0] - 1 ]; | |
850 const int16_t * const A= h->mv_cache[list][ scan8[0] - 1 ]; | |
2967 | 851 |
4600 | 852 tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); |
1168 | 853 |
854 if(left_ref == ref){ | |
855 *mx= A[0]; | |
856 *my= A[1]; | |
857 return; | |
858 } | |
859 }else{ | |
1169 | 860 const int16_t * C; |
861 int diagonal_ref; | |
862 | |
863 diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2); | |
2967 | 864 |
4600 | 865 tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list); |
1168 | 866 |
2967 | 867 if(diagonal_ref == ref){ |
1168 | 868 *mx= C[0]; |
869 *my= C[1]; | |
870 return; | |
871 } | |
872 } | |
873 | |
874 //RARE | |
875 pred_motion(h, n, 2, list, ref, mx, my); | |
876 } | |
877 | |
878 static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){ | |
879 const int top_ref = h->ref_cache[0][ scan8[0] - 8 ]; | |
880 const int left_ref= h->ref_cache[0][ scan8[0] - 1 ]; | |
881 | |
4600 | 882 tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", top_ref, left_ref, h->s.mb_x, h->s.mb_y); |
1168 | 883 |
884 if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE | |
885 || (top_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ] == 0) | |
886 || (left_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ] == 0)){ | |
2967 | 887 |
1168 | 888 *mx = *my = 0; |
889 return; | |
890 } | |
2967 | 891 |
1168 | 892 pred_motion(h, 0, 4, 0, 0, mx, my); |
893 | |
894 return; | |
895 } | |
896 | |
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
897 static int get_scale_factor(H264Context * const h, int poc, int poc1, int i){ |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
898 int poc0 = h->ref_list[0][i].poc; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
899 int td = av_clip(poc1 - poc0, -128, 127); |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
900 if(td == 0 || h->ref_list[0][i].long_ref){ |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
901 return 256; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
902 }else{ |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
903 int tb = av_clip(poc - poc0, -128, 127); |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
904 int tx = (16384 + (FFABS(td) >> 1)) / td; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
905 return av_clip((tb*tx + 32) >> 6, -1024, 1023); |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
906 } |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
907 } |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
908 |
2396 | 909 static inline void direct_dist_scale_factor(H264Context * const h){ |
7462
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
910 MpegEncContext * const s = &h->s; |
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
911 const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ]; |
2396 | 912 const int poc1 = h->ref_list[1][0].poc; |
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
913 int i, field; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
914 for(field=0; field<2; field++){ |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
915 const int poc = h->s.current_picture_ptr->field_poc[field]; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
916 const int poc1 = h->ref_list[1][0].field_poc[field]; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
917 for(i=0; i < 2*h->ref_count[0]; i++) |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
918 h->dist_scale_factor_field[field][i^field] = get_scale_factor(h, poc, poc1, i+16); |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
919 } |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
920 |
2396 | 921 for(i=0; i<h->ref_count[0]; i++){ |
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
922 h->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i); |
3316 | 923 } |
2396 | 924 } |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
925 |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
926 static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, int colfield, int mbafi){ |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
927 MpegEncContext * const s = &h->s; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
928 Picture * const ref1 = &h->ref_list[1][0]; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
929 int j, old_ref, rfield; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
930 int start= mbafi ? 16 : 0; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
931 int end = mbafi ? 16+2*h->ref_count[list] : h->ref_count[list]; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
932 int interl= mbafi || s->picture_structure != PICT_FRAME; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
933 |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
934 /* bogus; fills in for missing frames */ |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
935 memset(map[list], 0, sizeof(map[list])); |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
936 |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
937 for(rfield=0; rfield<2; rfield++){ |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
938 for(old_ref=0; old_ref<ref1->ref_count[colfield][list]; old_ref++){ |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
939 int poc = ref1->ref_poc[colfield][list][old_ref]; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
940 |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
941 if (!interl) |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
942 poc |= 3; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
943 else if( interl && (poc&3) == 3) //FIXME store all MBAFF references so this isnt needed |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
944 poc= (poc&~3) + rfield + 1; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
945 |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
946 for(j=start; j<end; j++){ |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
947 if(4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3) == poc){ |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
948 int cur_ref= mbafi ? (j-16)^field : j; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
949 map[list][2*old_ref + (rfield^field) + 16] = cur_ref; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
950 if(rfield == field) |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
951 map[list][old_ref] = cur_ref; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
952 break; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
953 } |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
954 } |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
955 } |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
956 } |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
957 } |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
958 |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
959 static inline void direct_ref_list_init(H264Context * const h){ |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
960 MpegEncContext * const s = &h->s; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
961 Picture * const ref1 = &h->ref_list[1][0]; |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
962 Picture * const cur = s->current_picture_ptr; |
7928 | 963 int list, j, field; |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
964 int sidx= (s->picture_structure&1)^1; |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
965 int ref1sidx= (ref1->reference&1)^1; |
7907 | 966 |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
967 for(list=0; list<2; list++){ |
7462
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
968 cur->ref_count[sidx][list] = h->ref_count[list]; |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
969 for(j=0; j<h->ref_count[list]; j++) |
7487
13937730e79d
Use frame_num and reference instead of poc for matching frames for direct
michael
parents:
7486
diff
changeset
|
970 cur->ref_poc[sidx][list][j] = 4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3); |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
971 } |
7907 | 972 |
7482 | 973 if(s->picture_structure == PICT_FRAME){ |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
974 memcpy(cur->ref_count[1], cur->ref_count[0], sizeof(cur->ref_count[0])); |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
975 memcpy(cur->ref_poc [1], cur->ref_poc [0], sizeof(cur->ref_poc [0])); |
7482 | 976 } |
7907 | 977 |
7902
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
978 cur->mbaff= FRAME_MBAFF; |
7907 | 979 |
6481 | 980 if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred) |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
981 return; |
7907 | 982 |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
983 for(list=0; list<2; list++){ |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
984 fill_colmap(h, h->map_col_to_list0, list, sidx, ref1sidx, 0); |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
985 for(field=0; field<2; field++) |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
986 fill_colmap(h, h->map_col_to_list0_field[field], list, field, field, 1); |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
987 } |
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
988 } |
2396 | 989 |
990 static inline void pred_direct_motion(H264Context * const h, int *mb_type){ | |
991 MpegEncContext * const s = &h->s; | |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
992 int b8_stride = h->b8_stride; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
993 int b4_stride = h->b_stride; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
994 int mb_xy = h->mb_xy; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
995 int mb_type_col[2]; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
996 const int16_t (*l1mv0)[2], (*l1mv1)[2]; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
997 const int8_t *l1ref0, *l1ref1; |
2396 | 998 const int is_b8x8 = IS_8X8(*mb_type); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
999 unsigned int sub_mb_type; |
2396 | 1000 int i8, i4; |
1001 | |
3316 | 1002 #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM) |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1003 |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1004 if(IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])){ // AFL/AFR/FR/FL -> AFL/FL |
7900 | 1005 if(!IS_INTERLACED(*mb_type)){ // AFR/FR -> AFL/FL |
7901 | 1006 int cur_poc = s->current_picture_ptr->poc; |
1007 int *col_poc = h->ref_list[1]->field_poc; | |
1008 int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc); | |
1009 mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride; | |
1010 b8_stride = 0; | |
7918
84b37de61d98
Field -> MBAFF direct mode can use data from fields that are not
michael
parents:
7907
diff
changeset
|
1011 }else if(!(s->picture_structure & h->ref_list[1][0].reference) && !h->ref_list[1][0].mbaff){// FL -> FL & differ parity |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1012 int fieldoff= 2*(h->ref_list[1][0].reference)-3; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1013 mb_xy += s->mb_stride*fieldoff; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1014 } |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1015 goto single_col; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1016 }else{ // AFL/AFR/FR/FL -> AFR/FR |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1017 if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1018 mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1019 mb_type_col[0] = h->ref_list[1][0].mb_type[mb_xy]; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1020 mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy + s->mb_stride]; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1021 b8_stride *= 3; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1022 b4_stride *= 6; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1023 //FIXME IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1024 if( (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA) |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1025 && (mb_type_col[1] & MB_TYPE_16x16_OR_INTRA) |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1026 && !is_b8x8){ |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1027 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1028 *mb_type |= MB_TYPE_16x8 |MB_TYPE_L0L1|MB_TYPE_DIRECT2; /* B_16x8 */ |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1029 }else{ |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1030 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1031 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1032 } |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1033 }else{ // AFR/FR -> AFR/FR |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1034 single_col: |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1035 mb_type_col[0] = |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1036 mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy]; |
7494 | 1037 if(IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag){ |
1038 /* FIXME save sub mb types from previous frames (or derive from MVs) | |
1039 * so we know exactly what block size to use */ | |
1040 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */ | |
1041 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
1042 }else if(!is_b8x8 && (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)){ | |
1043 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
1044 *mb_type |= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */ | |
1045 }else{ | |
1046 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
1047 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
1048 } | |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1049 } |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1050 } |
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1051 |
7497 | 1052 l1mv0 = &h->ref_list[1][0].motion_val[0][h->mb2b_xy [mb_xy]]; |
1053 l1mv1 = &h->ref_list[1][0].motion_val[1][h->mb2b_xy [mb_xy]]; | |
1054 l1ref0 = &h->ref_list[1][0].ref_index [0][h->mb2b8_xy[mb_xy]]; | |
1055 l1ref1 = &h->ref_list[1][0].ref_index [1][h->mb2b8_xy[mb_xy]]; | |
7496 | 1056 if(!b8_stride){ |
1057 if(s->mb_y&1){ | |
1058 l1ref0 += h->b8_stride; | |
1059 l1ref1 += h->b8_stride; | |
1060 l1mv0 += 2*b4_stride; | |
1061 l1mv1 += 2*b4_stride; | |
1062 } | |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1063 } |
2967 | 1064 |
2396 | 1065 if(h->direct_spatial_mv_pred){ |
1066 int ref[2]; | |
1067 int mv[2][2]; | |
1068 int list; | |
1069 | |
3316 | 1070 /* FIXME interlacing + spatial direct uses wrong colocated block positions */ |
1071 | |
2396 | 1072 /* ref = min(neighbors) */ |
1073 for(list=0; list<2; list++){ | |
1074 int refa = h->ref_cache[list][scan8[0] - 1]; | |
1075 int refb = h->ref_cache[list][scan8[0] - 8]; | |
1076 int refc = h->ref_cache[list][scan8[0] - 8 + 4]; | |
7445
a202753ce99d
Use #define instead of a constant. Patch by Paul Kendall.
darkshikari
parents:
7444
diff
changeset
|
1077 if(refc == PART_NOT_AVAILABLE) |
2396 | 1078 refc = h->ref_cache[list][scan8[0] - 8 - 1]; |
7336
aaf3e396f094
Simplify spatial direct ref selection with FFMIN3()
michael
parents:
7332
diff
changeset
|
1079 ref[list] = FFMIN3((unsigned)refa, (unsigned)refb, (unsigned)refc); |
2396 | 1080 if(ref[list] < 0) |
1081 ref[list] = -1; | |
1082 } | |
1083 | |
1084 if(ref[0] < 0 && ref[1] < 0){ | |
1085 ref[0] = ref[1] = 0; | |
1086 mv[0][0] = mv[0][1] = | |
1087 mv[1][0] = mv[1][1] = 0; | |
1088 }else{ | |
1089 for(list=0; list<2; list++){ | |
1090 if(ref[list] >= 0) | |
1091 pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]); | |
1092 else | |
1093 mv[list][0] = mv[list][1] = 0; | |
1094 } | |
1095 } | |
1096 | |
1097 if(ref[1] < 0){ | |
6309 | 1098 if(!is_b8x8) |
1099 *mb_type &= ~MB_TYPE_L1; | |
1100 sub_mb_type &= ~MB_TYPE_L1; | |
2396 | 1101 }else if(ref[0] < 0){ |
6309 | 1102 if(!is_b8x8) |
1103 *mb_type &= ~MB_TYPE_L0; | |
1104 sub_mb_type &= ~MB_TYPE_L0; | |
1105 } | |
1106 | |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1107 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){ |
6309 | 1108 for(i8=0; i8<4; i8++){ |
1109 int x8 = i8&1; | |
1110 int y8 = i8>>1; | |
1111 int xy8 = x8+y8*b8_stride; | |
1112 int xy4 = 3*x8+y8*b4_stride; | |
1113 int a=0, b=0; | |
1114 | |
1115 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
1116 continue; | |
1117 h->sub_mb_type[i8] = sub_mb_type; | |
1118 | |
1119 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); | |
1120 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); | |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1121 if(!IS_INTRA(mb_type_col[y8]) |
6309 | 1122 && ( (l1ref0[xy8] == 0 && FFABS(l1mv0[xy4][0]) <= 1 && FFABS(l1mv0[xy4][1]) <= 1) |
1123 || (l1ref0[xy8] < 0 && l1ref1[xy8] == 0 && FFABS(l1mv1[xy4][0]) <= 1 && FFABS(l1mv1[xy4][1]) <= 1))){ | |
1124 if(ref[0] > 0) | |
1125 a= pack16to32(mv[0][0],mv[0][1]); | |
1126 if(ref[1] > 0) | |
1127 b= pack16to32(mv[1][0],mv[1][1]); | |
1128 }else{ | |
1129 a= pack16to32(mv[0][0],mv[0][1]); | |
1130 b= pack16to32(mv[1][0],mv[1][1]); | |
1131 } | |
1132 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, a, 4); | |
1133 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, b, 4); | |
1134 } | |
1135 }else if(IS_16X16(*mb_type)){ | |
4540 | 1136 int a=0, b=0; |
1137 | |
3001
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1138 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1); |
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1139 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1); |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1140 if(!IS_INTRA(mb_type_col[0]) |
4001 | 1141 && ( (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1) |
1142 || (l1ref0[0] < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1 | |
2834 | 1143 && (h->x264_build>33 || !h->x264_build)))){ |
2396 | 1144 if(ref[0] > 0) |
4540 | 1145 a= pack16to32(mv[0][0],mv[0][1]); |
2396 | 1146 if(ref[1] > 0) |
4540 | 1147 b= pack16to32(mv[1][0],mv[1][1]); |
2396 | 1148 }else{ |
4540 | 1149 a= pack16to32(mv[0][0],mv[0][1]); |
1150 b= pack16to32(mv[1][0],mv[1][1]); | |
1151 } | |
1152 fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4); | |
1153 fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4); | |
2396 | 1154 }else{ |
1155 for(i8=0; i8<4; i8++){ | |
1156 const int x8 = i8&1; | |
1157 const int y8 = i8>>1; | |
2967 | 1158 |
2396 | 1159 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) |
1160 continue; | |
1161 h->sub_mb_type[i8] = sub_mb_type; | |
2967 | 1162 |
2396 | 1163 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4); |
1164 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mv[1][0],mv[1][1]), 4); | |
3001
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1165 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); |
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
1166 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); |
2967 | 1167 |
2396 | 1168 /* col_zero_flag */ |
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1169 if(!IS_INTRA(mb_type_col[0]) && ( l1ref0[x8 + y8*b8_stride] == 0 |
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1170 || (l1ref0[x8 + y8*b8_stride] < 0 && l1ref1[x8 + y8*b8_stride] == 0 |
2834 | 1171 && (h->x264_build>33 || !h->x264_build)))){ |
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1172 const int16_t (*l1mv)[2]= l1ref0[x8 + y8*b8_stride] == 0 ? l1mv0 : l1mv1; |
3002 | 1173 if(IS_SUB_8X8(sub_mb_type)){ |
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1174 const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride]; |
4001 | 1175 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ |
3002 | 1176 if(ref[0] == 0) |
1177 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1178 if(ref[1] == 0) | |
1179 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1180 } | |
1181 }else | |
2396 | 1182 for(i4=0; i4<4; i4++){ |
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1183 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride]; |
4001 | 1184 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ |
2396 | 1185 if(ref[0] == 0) |
1186 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0; | |
1187 if(ref[1] == 0) | |
1188 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0; | |
1189 } | |
1190 } | |
1191 } | |
1192 } | |
1193 } | |
1194 }else{ /* direct temporal mv pred */ | |
3316 | 1195 const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]}; |
1196 const int *dist_scale_factor = h->dist_scale_factor; | |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1197 int ref_offset= 0; |
3316 | 1198 |
7494 | 1199 if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){ |
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
1200 map_col_to_list0[0] = h->map_col_to_list0_field[s->mb_y&1][0]; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
1201 map_col_to_list0[1] = h->map_col_to_list0_field[s->mb_y&1][1]; |
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
1202 dist_scale_factor =h->dist_scale_factor_field[s->mb_y&1]; |
7902
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
1203 } |
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
1204 if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0])) |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1205 ref_offset += 16; |
7902
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
1206 |
7494 | 1207 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){ |
1208 /* FIXME assumes direct_8x8_inference == 1 */ | |
7495 | 1209 int y_shift = 2*!IS_INTERLACED(*mb_type); |
7494 | 1210 |
1211 for(i8=0; i8<4; i8++){ | |
1212 const int x8 = i8&1; | |
1213 const int y8 = i8>>1; | |
1214 int ref0, scale; | |
1215 const int16_t (*l1mv)[2]= l1mv0; | |
1216 | |
1217 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
1218 continue; | |
1219 h->sub_mb_type[i8] = sub_mb_type; | |
1220 | |
1221 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1222 if(IS_INTRA(mb_type_col[y8])){ | |
1223 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1224 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1225 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1226 continue; | |
3316 | 1227 } |
1228 | |
7494 | 1229 ref0 = l1ref0[x8 + y8*b8_stride]; |
1230 if(ref0 >= 0) | |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1231 ref0 = map_col_to_list0[0][ref0 + ref_offset]; |
7494 | 1232 else{ |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1233 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset]; |
7494 | 1234 l1mv= l1mv1; |
3316 | 1235 } |
7494 | 1236 scale = dist_scale_factor[ref0]; |
1237 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); | |
1238 | |
1239 { | |
1240 const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride]; | |
1241 int my_col = (mv_col[1]<<y_shift)/2; | |
1242 int mx = (scale * mv_col[0] + 128) >> 8; | |
1243 int my = (scale * my_col + 128) >> 8; | |
1244 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); | |
1245 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4); | |
1246 } | |
1247 } | |
1248 return; | |
1249 } | |
3316 | 1250 |
1251 /* one-to-one mv scaling */ | |
1252 | |
2396 | 1253 if(IS_16X16(*mb_type)){ |
4541 | 1254 int ref, mv0, mv1; |
1255 | |
2396 | 1256 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1); |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1257 if(IS_INTRA(mb_type_col[0])){ |
4541 | 1258 ref=mv0=mv1=0; |
2396 | 1259 }else{ |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1260 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0] + ref_offset] |
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1261 : map_col_to_list0[1][l1ref1[0] + ref_offset]; |
3316 | 1262 const int scale = dist_scale_factor[ref0]; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1263 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0]; |
2396 | 1264 int mv_l0[2]; |
3316 | 1265 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; |
1266 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
4541 | 1267 ref= ref0; |
1268 mv0= pack16to32(mv_l0[0],mv_l0[1]); | |
1269 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
1270 } | |
1271 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1); | |
1272 fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4); | |
1273 fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4); | |
2396 | 1274 }else{ |
1275 for(i8=0; i8<4; i8++){ | |
1276 const int x8 = i8&1; | |
1277 const int y8 = i8>>1; | |
3316 | 1278 int ref0, scale; |
2834 | 1279 const int16_t (*l1mv)[2]= l1mv0; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1280 |
2396 | 1281 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) |
1282 continue; | |
1283 h->sub_mb_type[i8] = sub_mb_type; | |
3316 | 1284 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
1285 if(IS_INTRA(mb_type_col[0])){ |
2396 | 1286 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); |
1287 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1288 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1289 continue; | |
1290 } | |
2967 | 1291 |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1292 ref0 = l1ref0[x8 + y8*b8_stride] + ref_offset; |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
1293 if(ref0 >= 0) |
3316 | 1294 ref0 = map_col_to_list0[0][ref0]; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1295 else{ |
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
1296 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset]; |
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1297 l1mv= l1mv1; |
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
1298 } |
3316 | 1299 scale = dist_scale_factor[ref0]; |
2967 | 1300 |
2396 | 1301 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); |
3002 | 1302 if(IS_SUB_8X8(sub_mb_type)){ |
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1303 const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride]; |
3316 | 1304 int mx = (scale * mv_col[0] + 128) >> 8; |
1305 int my = (scale * mv_col[1] + 128) >> 8; | |
3002 | 1306 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); |
1307 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4); | |
1308 }else | |
2396 | 1309 for(i4=0; i4<4; i4++){ |
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
1310 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride]; |
2396 | 1311 int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]]; |
3316 | 1312 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; |
1313 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
2396 | 1314 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = |
1315 pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
1316 } | |
1317 } | |
1318 } | |
1319 } | |
1320 } | |
1321 | |
1168 | 1322 static inline void write_back_motion(H264Context *h, int mb_type){ |
1323 MpegEncContext * const s = &h->s; | |
1324 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; | |
1325 const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride; | |
1326 int list; | |
1327 | |
3219
cf233efbcece
10l in 1.199 (write_back_motion with B-pyramid + spatial)
lorenm
parents:
3215
diff
changeset
|
1328 if(!USES_LIST(mb_type, 0)) |
cf233efbcece
10l in 1.199 (write_back_motion with B-pyramid + spatial)
lorenm
parents:
3215
diff
changeset
|
1329 fill_rectangle(&s->current_picture.ref_index[0][b8_xy], 2, 2, h->b8_stride, (uint8_t)LIST_NOT_USED, 1); |
cf233efbcece
10l in 1.199 (write_back_motion with B-pyramid + spatial)
lorenm
parents:
3215
diff
changeset
|
1330 |
4533 | 1331 for(list=0; list<h->list_count; list++){ |
1168 | 1332 int y; |
3212 | 1333 if(!USES_LIST(mb_type, list)) |
2396 | 1334 continue; |
2967 | 1335 |
1168 | 1336 for(y=0; y<4; y++){ |
1337 *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+0 + 8*y]; | |
1338 *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+2 + 8*y]; | |
1339 } | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1340 if( h->pps.cabac ) { |
3927 | 1341 if(IS_SKIP(mb_type)) |
1342 fill_rectangle(h->mvd_table[list][b_xy], 4, 4, h->b_stride, 0, 4); | |
1343 else | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1344 for(y=0; y<4; y++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1345 *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1346 *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1347 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
1348 } |
3212 | 1349 |
1350 { | |
3776 | 1351 int8_t *ref_index = &s->current_picture.ref_index[list][b8_xy]; |
3212 | 1352 ref_index[0+0*h->b8_stride]= h->ref_cache[list][scan8[0]]; |
1353 ref_index[1+0*h->b8_stride]= h->ref_cache[list][scan8[4]]; | |
1354 ref_index[0+1*h->b8_stride]= h->ref_cache[list][scan8[8]]; | |
1355 ref_index[1+1*h->b8_stride]= h->ref_cache[list][scan8[12]]; | |
1168 | 1356 } |
1357 } | |
2967 | 1358 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
1359 if(h->slice_type_nos == FF_B_TYPE && h->pps.cabac){ |
2396 | 1360 if(IS_8X8(mb_type)){ |
3212 | 1361 uint8_t *direct_table = &h->direct_table[b8_xy]; |
1362 direct_table[1+0*h->b8_stride] = IS_DIRECT(h->sub_mb_type[1]) ? 1 : 0; | |
1363 direct_table[0+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[2]) ? 1 : 0; | |
1364 direct_table[1+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[3]) ? 1 : 0; | |
2396 | 1365 } |
1366 } | |
1168 | 1367 } |
1368 | |
1369 /** | |
1370 * Decodes a network abstraction layer unit. | |
1371 * @param consumed is the number of bytes used as input | |
1372 * @param length is the length of the array | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
1373 * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp tailing? |
2967 | 1374 * @returns decoded bytes, might be src+1 if no escapes |
1168 | 1375 */ |
6216 | 1376 static const uint8_t *decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){ |
1168 | 1377 int i, si, di; |
1378 uint8_t *dst; | |
5174 | 1379 int bufidx; |
1168 | 1380 |
2979 | 1381 // src[0]&0x80; //forbidden bit |
1168 | 1382 h->nal_ref_idc= src[0]>>5; |
1383 h->nal_unit_type= src[0]&0x1F; | |
1384 | |
1385 src++; length--; | |
2967 | 1386 #if 0 |
1168 | 1387 for(i=0; i<length; i++) |
1388 printf("%2X ", src[i]); | |
1389 #endif | |
1390 for(i=0; i+1<length; i+=2){ | |
1391 if(src[i]) continue; | |
1392 if(i>0 && src[i-1]==0) i--; | |
1393 if(i+2<length && src[i+1]==0 && src[i+2]<=3){ | |
1394 if(src[i+2]!=3){ | |
1395 /* startcode, so we must be past the end */ | |
1396 length=i; | |
1397 } | |
1398 break; | |
1399 } | |
1400 } | |
1401 | |
1402 if(i>=length-1){ //no escaped 0 | |
1403 *dst_length= length; | |
1404 *consumed= length+1; //+1 for the header | |
2967 | 1405 return src; |
1168 | 1406 } |
1407 | |
5174 | 1408 bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data |
1409 h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length); | |
1410 dst= h->rbsp_buffer[bufidx]; | |
1168 | 1411 |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1412 if (dst == NULL){ |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1413 return NULL; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1414 } |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
1415 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
1416 //printf("decoding esc\n"); |
1168 | 1417 si=di=0; |
2967 | 1418 while(si<length){ |
1168 | 1419 //remove escapes (very rare 1:2^22) |
1420 if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){ | |
1421 if(src[si+2]==3){ //escape | |
1422 dst[di++]= 0; | |
1423 dst[di++]= 0; | |
1424 si+=3; | |
1957
54411768fa38
h264 nal decoding fix by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1956
diff
changeset
|
1425 continue; |
1168 | 1426 }else //next start code |
1427 break; | |
1428 } | |
1429 | |
1430 dst[di++]= src[si++]; | |
1431 } | |
1432 | |
1433 *dst_length= di; | |
1434 *consumed= si + 1;//+1 for the header | |
5129 | 1435 //FIXME store exact number of bits in the getbitcontext (it is needed for decoding) |
1168 | 1436 return dst; |
1437 } | |
1438 | |
1439 /** | |
1440 * identifies the exact end of the bitstream | |
1441 * @return the length of the trailing, or 0 if damaged | |
1442 */ | |
6216 | 1443 static int decode_rbsp_trailing(H264Context *h, const uint8_t *src){ |
1168 | 1444 int v= *src; |
1445 int r; | |
1446 | |
4600 | 1447 tprintf(h->s.avctx, "rbsp trailing %X\n", v); |
1168 | 1448 |
1449 for(r=1; r<9; r++){ | |
1450 if(v&1) return r; | |
1451 v>>=1; | |
1452 } | |
1453 return 0; | |
1454 } | |
1455 | |
1456 /** | |
7374 | 1457 * IDCT transforms the 16 dc values and dequantizes them. |
1168 | 1458 * @param qp quantization parameter |
1459 */ | |
2919 | 1460 static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){ |
1168 | 1461 #define stride 16 |
1462 int i; | |
1463 int temp[16]; //FIXME check if this is a good idea | |
1464 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
1465 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
1466 | |
1467 //memset(block, 64, 2*256); | |
1468 //return; | |
1469 for(i=0; i<4; i++){ | |
1470 const int offset= y_offset[i]; | |
1471 const int z0= block[offset+stride*0] + block[offset+stride*4]; | |
1472 const int z1= block[offset+stride*0] - block[offset+stride*4]; | |
1473 const int z2= block[offset+stride*1] - block[offset+stride*5]; | |
1474 const int z3= block[offset+stride*1] + block[offset+stride*5]; | |
1475 | |
1476 temp[4*i+0]= z0+z3; | |
1477 temp[4*i+1]= z1+z2; | |
1478 temp[4*i+2]= z1-z2; | |
1479 temp[4*i+3]= z0-z3; | |
1480 } | |
1481 | |
1482 for(i=0; i<4; i++){ | |
1483 const int offset= x_offset[i]; | |
1484 const int z0= temp[4*0+i] + temp[4*2+i]; | |
1485 const int z1= temp[4*0+i] - temp[4*2+i]; | |
1486 const int z2= temp[4*1+i] - temp[4*3+i]; | |
1487 const int z3= temp[4*1+i] + temp[4*3+i]; | |
1488 | |
7374 | 1489 block[stride*0 +offset]= ((((z0 + z3)*qmul + 128 ) >> 8)); //FIXME think about merging this into decode_residual |
2919 | 1490 block[stride*2 +offset]= ((((z1 + z2)*qmul + 128 ) >> 8)); |
1491 block[stride*8 +offset]= ((((z1 - z2)*qmul + 128 ) >> 8)); | |
1492 block[stride*10+offset]= ((((z0 - z3)*qmul + 128 ) >> 8)); | |
1168 | 1493 } |
1494 } | |
1495 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1496 #if 0 |
1168 | 1497 /** |
7374 | 1498 * DCT transforms the 16 dc values. |
1168 | 1499 * @param qp quantization parameter ??? FIXME |
1500 */ | |
1501 static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){ | |
1502 // const int qmul= dequant_coeff[qp][0]; | |
1503 int i; | |
1504 int temp[16]; //FIXME check if this is a good idea | |
1505 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
1506 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
1507 | |
1508 for(i=0; i<4; i++){ | |
1509 const int offset= y_offset[i]; | |
1510 const int z0= block[offset+stride*0] + block[offset+stride*4]; | |
1511 const int z1= block[offset+stride*0] - block[offset+stride*4]; | |
1512 const int z2= block[offset+stride*1] - block[offset+stride*5]; | |
1513 const int z3= block[offset+stride*1] + block[offset+stride*5]; | |
1514 | |
1515 temp[4*i+0]= z0+z3; | |
1516 temp[4*i+1]= z1+z2; | |
1517 temp[4*i+2]= z1-z2; | |
1518 temp[4*i+3]= z0-z3; | |
1519 } | |
1520 | |
1521 for(i=0; i<4; i++){ | |
1522 const int offset= x_offset[i]; | |
1523 const int z0= temp[4*0+i] + temp[4*2+i]; | |
1524 const int z1= temp[4*0+i] - temp[4*2+i]; | |
1525 const int z2= temp[4*1+i] - temp[4*3+i]; | |
1526 const int z3= temp[4*1+i] + temp[4*3+i]; | |
1527 | |
1528 block[stride*0 +offset]= (z0 + z3)>>1; | |
1529 block[stride*2 +offset]= (z1 + z2)>>1; | |
1530 block[stride*8 +offset]= (z1 - z2)>>1; | |
1531 block[stride*10+offset]= (z0 - z3)>>1; | |
1532 } | |
1533 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1534 #endif |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1535 |
1168 | 1536 #undef xStride |
1537 #undef stride | |
1538 | |
2919 | 1539 static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){ |
1168 | 1540 const int stride= 16*2; |
1541 const int xStride= 16; | |
1542 int a,b,c,d,e; | |
1543 | |
1544 a= block[stride*0 + xStride*0]; | |
1545 b= block[stride*0 + xStride*1]; | |
1546 c= block[stride*1 + xStride*0]; | |
1547 d= block[stride*1 + xStride*1]; | |
1548 | |
1549 e= a-b; | |
1550 a= a+b; | |
1551 b= c-d; | |
1552 c= c+d; | |
1553 | |
2919 | 1554 block[stride*0 + xStride*0]= ((a+c)*qmul) >> 7; |
1555 block[stride*0 + xStride*1]= ((e+b)*qmul) >> 7; | |
1556 block[stride*1 + xStride*0]= ((a-c)*qmul) >> 7; | |
1557 block[stride*1 + xStride*1]= ((e-b)*qmul) >> 7; | |
1168 | 1558 } |
1559 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1560 #if 0 |
1168 | 1561 static void chroma_dc_dct_c(DCTELEM *block){ |
1562 const int stride= 16*2; | |
1563 const int xStride= 16; | |
1564 int a,b,c,d,e; | |
1565 | |
1566 a= block[stride*0 + xStride*0]; | |
1567 b= block[stride*0 + xStride*1]; | |
1568 c= block[stride*1 + xStride*0]; | |
1569 d= block[stride*1 + xStride*1]; | |
1570 | |
1571 e= a-b; | |
1572 a= a+b; | |
1573 b= c-d; | |
1574 c= c+d; | |
1575 | |
1576 block[stride*0 + xStride*0]= (a+c); | |
1577 block[stride*0 + xStride*1]= (e+b); | |
1578 block[stride*1 + xStride*0]= (a-c); | |
1579 block[stride*1 + xStride*1]= (e-b); | |
1580 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
1581 #endif |
1168 | 1582 |
1583 /** | |
1584 * gets the chroma qp. | |
1585 */ | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
1586 static inline int get_chroma_qp(H264Context *h, int t, int qscale){ |
7347
612a78c3b128
qscale has a range of 0..51 we thus do not need a 256 entry table and neither need
michael
parents:
7346
diff
changeset
|
1587 return h->pps.chroma_qp_table[t][qscale]; |
1168 | 1588 } |
1589 | |
6488 | 1590 //FIXME need to check that this does not overflow signed 32 bit for low qp, I am not sure, it's very close |
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4546
diff
changeset
|
1591 //FIXME check that gcc inlines this (and optimizes intra & separate_dc stuff away) |
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4546
diff
changeset
|
1592 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int separate_dc){ |
1168 | 1593 int i; |
1594 const int * const quant_table= quant_coeff[qscale]; | |
1595 const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6; | |
1596 const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1; | |
1597 const unsigned int threshold2= (threshold1<<1); | |
1598 int last_non_zero; | |
1599 | |
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4546
diff
changeset
|
1600 if(separate_dc){ |
1168 | 1601 if(qscale<=18){ |
1602 //avoid overflows | |
1603 const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6; | |
1604 const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1; | |
1605 const unsigned int dc_threshold2= (dc_threshold1<<1); | |
1606 | |
1607 int level= block[0]*quant_coeff[qscale+18][0]; | |
1608 if(((unsigned)(level+dc_threshold1))>dc_threshold2){ | |
1609 if(level>0){ | |
1610 level= (dc_bias + level)>>(QUANT_SHIFT-2); | |
1611 block[0]= level; | |
1612 }else{ | |
1613 level= (dc_bias - level)>>(QUANT_SHIFT-2); | |
1614 block[0]= -level; | |
1615 } | |
1616 // last_non_zero = i; | |
1617 }else{ | |
1618 block[0]=0; | |
1619 } | |
1620 }else{ | |
1621 const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6; | |
1622 const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1; | |
1623 const unsigned int dc_threshold2= (dc_threshold1<<1); | |
1624 | |
1625 int level= block[0]*quant_table[0]; | |
1626 if(((unsigned)(level+dc_threshold1))>dc_threshold2){ | |
1627 if(level>0){ | |
1628 level= (dc_bias + level)>>(QUANT_SHIFT+1); | |
1629 block[0]= level; | |
1630 }else{ | |
1631 level= (dc_bias - level)>>(QUANT_SHIFT+1); | |
1632 block[0]= -level; | |
1633 } | |
1634 // last_non_zero = i; | |
1635 }else{ | |
1636 block[0]=0; | |
1637 } | |
1638 } | |
1639 last_non_zero= 0; | |
1640 i=1; | |
1641 }else{ | |
1642 last_non_zero= -1; | |
1643 i=0; | |
1644 } | |
1645 | |
1646 for(; i<16; i++){ | |
1647 const int j= scantable[i]; | |
1648 int level= block[j]*quant_table[j]; | |
1649 | |
1650 // if( bias+level >= (1<<(QMAT_SHIFT - 3)) | |
1651 // || bias-level >= (1<<(QMAT_SHIFT - 3))){ | |
1652 if(((unsigned)(level+threshold1))>threshold2){ | |
1653 if(level>0){ | |
1654 level= (bias + level)>>QUANT_SHIFT; | |
1655 block[j]= level; | |
1656 }else{ | |
1657 level= (bias - level)>>QUANT_SHIFT; | |
1658 block[j]= -level; | |
1659 } | |
1660 last_non_zero = i; | |
1661 }else{ | |
1662 block[j]=0; | |
1663 } | |
1664 } | |
1665 | |
1666 return last_non_zero; | |
1667 } | |
1668 | |
1669 static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list, | |
1670 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
1671 int src_x_offset, int src_y_offset, | |
1672 qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){ | |
1673 MpegEncContext * const s = &h->s; | |
1674 const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8; | |
3316 | 1675 int my= h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8; |
1168 | 1676 const int luma_xy= (mx&3) + ((my&3)<<2); |
3316 | 1677 uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*h->mb_linesize; |
1678 uint8_t * src_cb, * src_cr; | |
1679 int extra_width= h->emu_edge_width; | |
1680 int extra_height= h->emu_edge_height; | |
1168 | 1681 int emu=0; |
1682 const int full_mx= mx>>2; | |
1683 const int full_my= my>>2; | |
2861
3b920e274b26
fix emulated edge motion compensation when resolution%16!=0
lorenm
parents:
2846
diff
changeset
|
1684 const int pic_width = 16*s->mb_width; |
5815 | 1685 const int pic_height = 16*s->mb_height >> MB_FIELD; |
2967 | 1686 |
7374 | 1687 if(!pic->data[0]) //FIXME this is unacceptable, some sensible error concealment must be done for missing reference frames |
3125 | 1688 return; |
2967 | 1689 |
1168 | 1690 if(mx&7) extra_width -= 3; |
1691 if(my&7) extra_height -= 3; | |
2967 | 1692 |
1693 if( full_mx < 0-extra_width | |
1694 || full_my < 0-extra_height | |
1695 || full_mx + 16/*FIXME*/ > pic_width + extra_width | |
2861
3b920e274b26
fix emulated edge motion compensation when resolution%16!=0
lorenm
parents:
2846
diff
changeset
|
1696 || full_my + 16/*FIXME*/ > pic_height + extra_height){ |
3316 | 1697 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); |
1698 src_y= s->edge_emu_buffer + 2 + 2*h->mb_linesize; | |
1168 | 1699 emu=1; |
1700 } | |
2967 | 1701 |
3316 | 1702 qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); //FIXME try variable height perhaps? |
1168 | 1703 if(!square){ |
3316 | 1704 qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize); |
1168 | 1705 } |
2967 | 1706 |
5434 | 1707 if(ENABLE_GRAY && s->flags&CODEC_FLAG_GRAY) return; |
2967 | 1708 |
5815 | 1709 if(MB_FIELD){ |
3316 | 1710 // 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
|
1711 my += 2 * ((s->mb_y & 1) - (pic->reference - 1)); |
3316 | 1712 emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1); |
1713 } | |
1714 src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize; | |
1715 src_cr= pic->data[2] + (mx>>3) + (my>>3)*h->mb_uvlinesize; | |
1168 | 1716 |
1717 if(emu){ | |
3316 | 1718 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); |
1719 src_cb= s->edge_emu_buffer; | |
1720 } | |
1721 chroma_op(dest_cb, src_cb, h->mb_uvlinesize, chroma_height, mx&7, my&7); | |
1722 | |
1723 if(emu){ | |
1724 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 | 1725 src_cr= s->edge_emu_buffer; |
1726 } | |
3316 | 1727 chroma_op(dest_cr, src_cr, h->mb_uvlinesize, chroma_height, mx&7, my&7); |
1168 | 1728 } |
1729 | |
2415 | 1730 static inline void mc_part_std(H264Context *h, int n, int square, int chroma_height, int delta, |
1168 | 1731 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
1732 int x_offset, int y_offset, | |
1733 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
1734 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | |
1735 int list0, int list1){ | |
1736 MpegEncContext * const s = &h->s; | |
1737 qpel_mc_func *qpix_op= qpix_put; | |
1738 h264_chroma_mc_func chroma_op= chroma_put; | |
2967 | 1739 |
3316 | 1740 dest_y += 2*x_offset + 2*y_offset*h-> mb_linesize; |
1741 dest_cb += x_offset + y_offset*h->mb_uvlinesize; | |
1742 dest_cr += x_offset + y_offset*h->mb_uvlinesize; | |
1168 | 1743 x_offset += 8*s->mb_x; |
5815 | 1744 y_offset += 8*(s->mb_y >> MB_FIELD); |
2967 | 1745 |
1168 | 1746 if(list0){ |
1169 | 1747 Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ]; |
1168 | 1748 mc_dir_part(h, ref, n, square, chroma_height, delta, 0, |
1749 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1750 qpix_op, chroma_op); | |
1751 | |
1752 qpix_op= qpix_avg; | |
1753 chroma_op= chroma_avg; | |
1754 } | |
1755 | |
1756 if(list1){ | |
1169 | 1757 Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ]; |
1168 | 1758 mc_dir_part(h, ref, n, square, chroma_height, delta, 1, |
1759 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1760 qpix_op, chroma_op); | |
1761 } | |
1762 } | |
1763 | |
2415 | 1764 static inline void mc_part_weighted(H264Context *h, int n, int square, int chroma_height, int delta, |
1765 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
1766 int x_offset, int y_offset, | |
1767 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
1768 h264_weight_func luma_weight_op, h264_weight_func chroma_weight_op, | |
1769 h264_biweight_func luma_weight_avg, h264_biweight_func chroma_weight_avg, | |
1770 int list0, int list1){ | |
1771 MpegEncContext * const s = &h->s; | |
1772 | |
3316 | 1773 dest_y += 2*x_offset + 2*y_offset*h-> mb_linesize; |
1774 dest_cb += x_offset + y_offset*h->mb_uvlinesize; | |
1775 dest_cr += x_offset + y_offset*h->mb_uvlinesize; | |
2415 | 1776 x_offset += 8*s->mb_x; |
5815 | 1777 y_offset += 8*(s->mb_y >> MB_FIELD); |
2967 | 1778 |
2415 | 1779 if(list0 && list1){ |
1780 /* don't optimize for luma-only case, since B-frames usually | |
1781 * use implicit weights => chroma too. */ | |
1782 uint8_t *tmp_cb = s->obmc_scratchpad; | |
3316 | 1783 uint8_t *tmp_cr = s->obmc_scratchpad + 8; |
1784 uint8_t *tmp_y = s->obmc_scratchpad + 8*h->mb_uvlinesize; | |
2415 | 1785 int refn0 = h->ref_cache[0][ scan8[n] ]; |
1786 int refn1 = h->ref_cache[1][ scan8[n] ]; | |
1787 | |
1788 mc_dir_part(h, &h->ref_list[0][refn0], n, square, chroma_height, delta, 0, | |
1789 dest_y, dest_cb, dest_cr, | |
1790 x_offset, y_offset, qpix_put, chroma_put); | |
1791 mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1, | |
1792 tmp_y, tmp_cb, tmp_cr, | |
1793 x_offset, y_offset, qpix_put, chroma_put); | |
1794 | |
1795 if(h->use_weight == 2){ | |
1796 int weight0 = h->implicit_weight[refn0][refn1]; | |
1797 int weight1 = 64 - weight0; | |
3316 | 1798 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, weight1, 0); |
1799 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0); | |
1800 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0); | |
2415 | 1801 }else{ |
3316 | 1802 luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_denom, |
2967 | 1803 h->luma_weight[0][refn0], h->luma_weight[1][refn1], |
3029 | 1804 h->luma_offset[0][refn0] + h->luma_offset[1][refn1]); |
3316 | 1805 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2967 | 1806 h->chroma_weight[0][refn0][0], h->chroma_weight[1][refn1][0], |
3029 | 1807 h->chroma_offset[0][refn0][0] + h->chroma_offset[1][refn1][0]); |
3316 | 1808 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2967 | 1809 h->chroma_weight[0][refn0][1], h->chroma_weight[1][refn1][1], |
3029 | 1810 h->chroma_offset[0][refn0][1] + h->chroma_offset[1][refn1][1]); |
2415 | 1811 } |
1812 }else{ | |
1813 int list = list1 ? 1 : 0; | |
1814 int refn = h->ref_cache[list][ scan8[n] ]; | |
1815 Picture *ref= &h->ref_list[list][refn]; | |
1816 mc_dir_part(h, ref, n, square, chroma_height, delta, list, | |
1817 dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1818 qpix_put, chroma_put); | |
1819 | |
3316 | 1820 luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom, |
2415 | 1821 h->luma_weight[list][refn], h->luma_offset[list][refn]); |
1822 if(h->use_weight_chroma){ | |
3316 | 1823 chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2415 | 1824 h->chroma_weight[list][refn][0], h->chroma_offset[list][refn][0]); |
3316 | 1825 chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
2415 | 1826 h->chroma_weight[list][refn][1], h->chroma_offset[list][refn][1]); |
1827 } | |
1828 } | |
1829 } | |
1830 | |
1831 static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta, | |
1832 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |
1833 int x_offset, int y_offset, | |
1834 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | |
1835 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | |
2967 | 1836 h264_weight_func *weight_op, h264_biweight_func *weight_avg, |
2415 | 1837 int list0, int list1){ |
1838 if((h->use_weight==2 && list0 && list1 | |
1839 && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ] != 32)) | |
1840 || h->use_weight==1) | |
1841 mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | |
1842 x_offset, y_offset, qpix_put, chroma_put, | |
1843 weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1); | |
1844 else | |
1845 mc_part_std(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | |
1846 x_offset, y_offset, qpix_put, chroma_put, qpix_avg, chroma_avg, list0, list1); | |
1847 } | |
1848 | |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1849 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
|
1850 /* fetch pixels for estimated mv 4 macroblocks ahead |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1851 * optimized for 64byte cache lines */ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1852 MpegEncContext * const s = &h->s; |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1853 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
|
1854 if(refn >= 0){ |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1855 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
|
1856 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
|
1857 uint8_t **src= h->ref_list[list][refn].data; |
3316 | 1858 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
|
1859 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
|
1860 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
|
1861 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
|
1862 } |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1863 } |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1864 |
1168 | 1865 static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
1866 qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put), | |
2415 | 1867 qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg), |
1868 h264_weight_func *weight_op, h264_biweight_func *weight_avg){ | |
1168 | 1869 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
1870 const int mb_xy= h->mb_xy; |
1168 | 1871 const int mb_type= s->current_picture.mb_type[mb_xy]; |
2967 | 1872 |
1168 | 1873 assert(IS_INTER(mb_type)); |
2967 | 1874 |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1875 prefetch_motion(h, 0); |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1876 |
1168 | 1877 if(IS_16X16(mb_type)){ |
1878 mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0, | |
1879 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0], | |
2415 | 1880 &weight_op[0], &weight_avg[0], |
1168 | 1881 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
1882 }else if(IS_16X8(mb_type)){ | |
1883 mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0, | |
1884 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0], | |
2415 | 1885 &weight_op[1], &weight_avg[1], |
1168 | 1886 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
1887 mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4, | |
1888 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0], | |
2415 | 1889 &weight_op[1], &weight_avg[1], |
1168 | 1890 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1)); |
1891 }else if(IS_8X16(mb_type)){ | |
3316 | 1892 mc_part(h, 0, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 0, 0, |
1168 | 1893 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], |
2415 | 1894 &weight_op[2], &weight_avg[2], |
1168 | 1895 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1)); |
3316 | 1896 mc_part(h, 4, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 4, 0, |
1168 | 1897 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], |
2415 | 1898 &weight_op[2], &weight_avg[2], |
1168 | 1899 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1)); |
1900 }else{ | |
1901 int i; | |
2967 | 1902 |
1168 | 1903 assert(IS_8X8(mb_type)); |
1904 | |
1905 for(i=0; i<4; i++){ | |
1906 const int sub_mb_type= h->sub_mb_type[i]; | |
1907 const int n= 4*i; | |
1908 int x_offset= (i&1)<<2; | |
1909 int y_offset= (i&2)<<1; | |
1910 | |
1911 if(IS_SUB_8X8(sub_mb_type)){ | |
1912 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1913 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1], | |
2415 | 1914 &weight_op[3], &weight_avg[3], |
1168 | 1915 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1916 }else if(IS_SUB_8X4(sub_mb_type)){ | |
1917 mc_part(h, n , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset, | |
1918 qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1], | |
2415 | 1919 &weight_op[4], &weight_avg[4], |
1168 | 1920 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1921 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2, | |
1922 qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1], | |
2415 | 1923 &weight_op[4], &weight_avg[4], |
1168 | 1924 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1925 }else if(IS_SUB_4X8(sub_mb_type)){ | |
3316 | 1926 mc_part(h, n , 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset, |
1168 | 1927 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], |
2415 | 1928 &weight_op[5], &weight_avg[5], |
1168 | 1929 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
3316 | 1930 mc_part(h, n+1, 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset, |
1168 | 1931 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], |
2415 | 1932 &weight_op[5], &weight_avg[5], |
1168 | 1933 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1934 }else{ | |
1935 int j; | |
1936 assert(IS_SUB_4X4(sub_mb_type)); | |
1937 for(j=0; j<4; j++){ | |
1938 int sub_x_offset= x_offset + 2*(j&1); | |
1939 int sub_y_offset= y_offset + (j&2); | |
1940 mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset, | |
1941 qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2], | |
2415 | 1942 &weight_op[6], &weight_avg[6], |
1168 | 1943 IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1)); |
1944 } | |
1945 } | |
1946 } | |
1947 } | |
3215
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1948 |
06f98047ff26
prefetch pixels for future motion compensation. 2-5% faster h264.
lorenm
parents:
3212
diff
changeset
|
1949 prefetch_motion(h, 1); |
1168 | 1950 } |
1951 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6490
diff
changeset
|
1952 static av_cold void decode_init_vlc(void){ |
1168 | 1953 static int done = 0; |
1954 | |
1955 if (!done) { | |
1956 int i; | |
7481 | 1957 int offset; |
1168 | 1958 done = 1; |
1959 | |
7481 | 1960 chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table; |
1961 chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size; | |
2967 | 1962 init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5, |
1168 | 1963 &chroma_dc_coeff_token_len [0], 1, 1, |
7481 | 1964 &chroma_dc_coeff_token_bits[0], 1, 1, |
1965 INIT_VLC_USE_NEW_STATIC); | |
1966 | |
1967 offset = 0; | |
1168 | 1968 for(i=0; i<4; i++){ |
7481 | 1969 coeff_token_vlc[i].table = coeff_token_vlc_tables+offset; |
1970 coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i]; | |
2967 | 1971 init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17, |
1168 | 1972 &coeff_token_len [i][0], 1, 1, |
7481 | 1973 &coeff_token_bits[i][0], 1, 1, |
1974 INIT_VLC_USE_NEW_STATIC); | |
1975 offset += coeff_token_vlc_tables_size[i]; | |
1976 } | |
1977 /* | |
1978 * This is a one time safety check to make sure that | |
1979 * the packed static coeff_token_vlc table sizes | |
1980 * were initialized correctly. | |
1981 */ | |
1982 assert(offset == sizeof(coeff_token_vlc_tables)/(sizeof(VLC_TYPE)*2)); | |
1168 | 1983 |
1984 for(i=0; i<3; i++){ | |
7481 | 1985 chroma_dc_total_zeros_vlc[i].table = chroma_dc_total_zeros_vlc_tables[i]; |
1986 chroma_dc_total_zeros_vlc[i].table_allocated = chroma_dc_total_zeros_vlc_tables_size; | |
1987 init_vlc(&chroma_dc_total_zeros_vlc[i], | |
1988 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4, | |
1168 | 1989 &chroma_dc_total_zeros_len [i][0], 1, 1, |
7481 | 1990 &chroma_dc_total_zeros_bits[i][0], 1, 1, |
1991 INIT_VLC_USE_NEW_STATIC); | |
1168 | 1992 } |
1993 for(i=0; i<15; i++){ | |
7481 | 1994 total_zeros_vlc[i].table = total_zeros_vlc_tables[i]; |
1995 total_zeros_vlc[i].table_allocated = total_zeros_vlc_tables_size; | |
1996 init_vlc(&total_zeros_vlc[i], | |
1997 TOTAL_ZEROS_VLC_BITS, 16, | |
1168 | 1998 &total_zeros_len [i][0], 1, 1, |
7481 | 1999 &total_zeros_bits[i][0], 1, 1, |
2000 INIT_VLC_USE_NEW_STATIC); | |
1168 | 2001 } |
2002 | |
2003 for(i=0; i<6; i++){ | |
7481 | 2004 run_vlc[i].table = run_vlc_tables[i]; |
2005 run_vlc[i].table_allocated = run_vlc_tables_size; | |
2006 init_vlc(&run_vlc[i], | |
2007 RUN_VLC_BITS, 7, | |
1168 | 2008 &run_len [i][0], 1, 1, |
7481 | 2009 &run_bits[i][0], 1, 1, |
2010 INIT_VLC_USE_NEW_STATIC); | |
2011 } | |
2012 run7_vlc.table = run7_vlc_table, | |
2013 run7_vlc.table_allocated = run7_vlc_table_size; | |
2967 | 2014 init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, |
1168 | 2015 &run_len [6][0], 1, 1, |
7481 | 2016 &run_bits[6][0], 1, 1, |
2017 INIT_VLC_USE_NEW_STATIC); | |
1168 | 2018 } |
2019 } | |
2020 | |
2021 static void free_tables(H264Context *h){ | |
5079 | 2022 int i; |
5642 | 2023 H264Context *hx; |
1168 | 2024 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
|
2025 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
|
2026 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
|
2027 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
|
2028 av_freep(&h->mvd_table[1]); |
2396 | 2029 av_freep(&h->direct_table); |
1168 | 2030 av_freep(&h->non_zero_count); |
2031 av_freep(&h->slice_table_base); | |
2032 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
|
2033 |
1168 | 2034 av_freep(&h->mb2b_xy); |
2035 av_freep(&h->mb2b8_xy); | |
2415 | 2036 |
5642 | 2037 for(i = 0; i < h->s.avctx->thread_count; i++) { |
2038 hx = h->thread_context[i]; | |
2039 if(!hx) continue; | |
2040 av_freep(&hx->top_borders[1]); | |
2041 av_freep(&hx->top_borders[0]); | |
2042 av_freep(&hx->s.obmc_scratchpad); | |
2043 } | |
1168 | 2044 } |
2045 | |
2919 | 2046 static void init_dequant8_coeff_table(H264Context *h){ |
2047 int i,q,x; | |
3174 | 2048 const int transpose = (h->s.dsp.h264_idct8_add != ff_h264_idct8_add_c); //FIXME ugly |
2919 | 2049 h->dequant8_coeff[0] = h->dequant8_buffer[0]; |
2050 h->dequant8_coeff[1] = h->dequant8_buffer[1]; | |
2051 | |
2052 for(i=0; i<2; i++ ){ | |
2053 if(i && !memcmp(h->pps.scaling_matrix8[0], h->pps.scaling_matrix8[1], 64*sizeof(uint8_t))){ | |
2054 h->dequant8_coeff[1] = h->dequant8_buffer[0]; | |
2055 break; | |
2056 } | |
2057 | |
2058 for(q=0; q<52; q++){ | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2059 int shift = ff_div6[q]; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2060 int idx = ff_rem6[q]; |
2919 | 2061 for(x=0; x<64; x++) |
3174 | 2062 h->dequant8_coeff[i][q][transpose ? (x>>3)|((x&7)<<3) : x] = |
2063 ((uint32_t)dequant8_coeff_init[idx][ dequant8_coeff_init_scan[((x>>1)&12) | (x&3)] ] * | |
2064 h->pps.scaling_matrix8[i][x]) << shift; | |
2919 | 2065 } |
2066 } | |
2067 } | |
2068 | |
2069 static void init_dequant4_coeff_table(H264Context *h){ | |
2070 int i,j,q,x; | |
3005 | 2071 const int transpose = (h->s.dsp.h264_idct_add != ff_h264_idct_add_c); //FIXME ugly |
2919 | 2072 for(i=0; i<6; i++ ){ |
2073 h->dequant4_coeff[i] = h->dequant4_buffer[i]; | |
2074 for(j=0; j<i; j++){ | |
2075 if(!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i], 16*sizeof(uint8_t))){ | |
2076 h->dequant4_coeff[i] = h->dequant4_buffer[j]; | |
2077 break; | |
2078 } | |
2079 } | |
2080 if(j<i) | |
2081 continue; | |
2082 | |
2083 for(q=0; q<52; q++){ | |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2084 int shift = ff_div6[q] + 2; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
2085 int idx = ff_rem6[q]; |
2919 | 2086 for(x=0; x<16; x++) |
3005 | 2087 h->dequant4_coeff[i][q][transpose ? (x>>2)|((x<<2)&0xF) : x] = |
2088 ((uint32_t)dequant4_coeff_init[idx][(x&1) + ((x>>2)&1)] * | |
2919 | 2089 h->pps.scaling_matrix4[i][x]) << shift; |
2090 } | |
2091 } | |
2092 } | |
2093 | |
2094 static void init_dequant_tables(H264Context *h){ | |
2095 int i,x; | |
2096 init_dequant4_coeff_table(h); | |
2097 if(h->pps.transform_8x8_mode) | |
2098 init_dequant8_coeff_table(h); | |
2099 if(h->sps.transform_bypass){ | |
2100 for(i=0; i<6; i++) | |
2101 for(x=0; x<16; x++) | |
2102 h->dequant4_coeff[i][0][x] = 1<<6; | |
2103 if(h->pps.transform_8x8_mode) | |
2104 for(i=0; i<2; i++) | |
2105 for(x=0; x<64; x++) | |
2106 h->dequant8_coeff[i][0][x] = 1<<6; | |
2107 } | |
2108 } | |
2109 | |
2110 | |
1168 | 2111 /** |
2112 * allocates tables. | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2113 * needs width/height |
1168 | 2114 */ |
2115 static int alloc_tables(H264Context *h){ | |
2116 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
|
2117 const int big_mb_num= s->mb_stride * (s->mb_height+1); |
2919 | 2118 int x,y; |
1168 | 2119 |
2120 CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8 * sizeof(uint8_t)) | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2121 |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2122 CHECKED_ALLOCZ(h->non_zero_count , big_mb_num * 16 * sizeof(uint8_t)) |
3316 | 2123 CHECKED_ALLOCZ(h->slice_table_base , (big_mb_num+s->mb_stride) * sizeof(uint8_t)) |
2336 | 2124 CHECKED_ALLOCZ(h->cbp_table, big_mb_num * sizeof(uint16_t)) |
1168 | 2125 |
6213
b26ccd688817
Indention, it seems i have forgotton to commit this.
michael
parents:
6203
diff
changeset
|
2126 CHECKED_ALLOCZ(h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t)) |
b26ccd688817
Indention, it seems i have forgotton to commit this.
michael
parents:
6203
diff
changeset
|
2127 CHECKED_ALLOCZ(h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t)); |
b26ccd688817
Indention, it seems i have forgotton to commit this.
michael
parents:
6203
diff
changeset
|
2128 CHECKED_ALLOCZ(h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t)); |
b26ccd688817
Indention, it seems i have forgotton to commit this.
michael
parents:
6203
diff
changeset
|
2129 CHECKED_ALLOCZ(h->direct_table, 32*big_mb_num * sizeof(uint8_t)); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
2130 |
3316 | 2131 memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride) * sizeof(uint8_t)); |
2132 h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; | |
1168 | 2133 |
2641
c337f851d0f9
fix storage of motion vectors for frames with more than 4096 macroblocks.
lorenm
parents:
2640
diff
changeset
|
2134 CHECKED_ALLOCZ(h->mb2b_xy , big_mb_num * sizeof(uint32_t)); |
c337f851d0f9
fix storage of motion vectors for frames with more than 4096 macroblocks.
lorenm
parents:
2640
diff
changeset
|
2135 CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint32_t)); |
1168 | 2136 for(y=0; y<s->mb_height; y++){ |
2137 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
|
2138 const int mb_xy= x + y*s->mb_stride; |
1168 | 2139 const int b_xy = 4*x + 4*y*h->b_stride; |
2140 const int b8_xy= 2*x + 2*y*h->b8_stride; | |
2967 | 2141 |
1168 | 2142 h->mb2b_xy [mb_xy]= b_xy; |
2143 h->mb2b8_xy[mb_xy]= b8_xy; | |
2144 } | |
2145 } | |
2415 | 2146 |
2417 | 2147 s->obmc_scratchpad = NULL; |
2148 | |
2920 | 2149 if(!h->dequant4_coeff[0]) |
2150 init_dequant_tables(h); | |
2151 | |
1168 | 2152 return 0; |
2153 fail: | |
2154 free_tables(h); | |
2155 return -1; | |
2156 } | |
2157 | |
5642 | 2158 /** |
2159 * Mimic alloc_tables(), but for every context thread. | |
2160 */ | |
2161 static void clone_tables(H264Context *dst, H264Context *src){ | |
2162 dst->intra4x4_pred_mode = src->intra4x4_pred_mode; | |
2163 dst->non_zero_count = src->non_zero_count; | |
2164 dst->slice_table = src->slice_table; | |
2165 dst->cbp_table = src->cbp_table; | |
2166 dst->mb2b_xy = src->mb2b_xy; | |
2167 dst->mb2b8_xy = src->mb2b8_xy; | |
2168 dst->chroma_pred_mode_table = src->chroma_pred_mode_table; | |
2169 dst->mvd_table[0] = src->mvd_table[0]; | |
2170 dst->mvd_table[1] = src->mvd_table[1]; | |
2171 dst->direct_table = src->direct_table; | |
2172 | |
2173 dst->s.obmc_scratchpad = NULL; | |
2174 ff_h264_pred_init(&dst->hpc, src->s.codec_id); | |
2175 } | |
2176 | |
2177 /** | |
2178 * Init context | |
2179 * Allocate buffers which are not shared amongst multiple threads. | |
2180 */ | |
2181 static int context_init(H264Context *h){ | |
2182 CHECKED_ALLOCZ(h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t)) | |
2183 CHECKED_ALLOCZ(h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t)) | |
2184 | |
2185 return 0; | |
2186 fail: | |
2187 return -1; // free_tables will clean up for us | |
2188 } | |
2189 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6490
diff
changeset
|
2190 static av_cold void common_init(H264Context *h){ |
1168 | 2191 MpegEncContext * const s = &h->s; |
2192 | |
2193 s->width = s->avctx->width; | |
2194 s->height = s->avctx->height; | |
2195 s->codec_id= s->avctx->codec->id; | |
2967 | 2196 |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2197 ff_h264_pred_init(&h->hpc, s->codec_id); |
1168 | 2198 |
2919 | 2199 h->dequant_coeff_pps= -1; |
1698 | 2200 s->unrestricted_mv=1; |
1168 | 2201 s->decode=1; //FIXME |
2920 | 2202 |
2203 memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t)); | |
2204 memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t)); | |
1168 | 2205 } |
2206 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6490
diff
changeset
|
2207 static av_cold int decode_init(AVCodecContext *avctx){ |
1168 | 2208 H264Context *h= avctx->priv_data; |
2209 MpegEncContext * const s = &h->s; | |
2210 | |
1892 | 2211 MPV_decode_defaults(s); |
2967 | 2212 |
1168 | 2213 s->avctx = avctx; |
2214 common_init(h); | |
2215 | |
2216 s->out_format = FMT_H264; | |
2217 s->workaround_bugs= avctx->workaround_bugs; | |
2218 | |
2219 // set defaults | |
2220 // 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
|
2221 s->quarter_sample = 1; |
1168 | 2222 s->low_delay= 1; |
7289 | 2223 |
2224 if(avctx->codec_id == CODEC_ID_SVQ3) | |
2225 avctx->pix_fmt= PIX_FMT_YUVJ420P; | |
2226 else | |
7290 | 2227 avctx->pix_fmt= PIX_FMT_YUV420P; |
1168 | 2228 |
4164
171e768324cd
Remove the H264Context parameter from decode_init_vlc() as it is not being used.
takis
parents:
4118
diff
changeset
|
2229 decode_init_vlc(); |
2967 | 2230 |
2547
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2231 if(avctx->extradata_size > 0 && avctx->extradata && |
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2232 *(char *)avctx->extradata == 1){ |
2227 | 2233 h->is_avc = 1; |
2234 h->got_avcC = 0; | |
2547
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2235 } else { |
c5781912ad8a
improved detection of "AVC1" style H.264 patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2538
diff
changeset
|
2236 h->is_avc = 0; |
2227 | 2237 } |
2238 | |
5642 | 2239 h->thread_context[0] = h; |
7424
69766900be2d
Initialize outputed_poc to INT_MIN at decoder initialization.
heydowns
parents:
7423
diff
changeset
|
2240 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
|
2241 h->prev_poc_msb= 1<<16; |
1168 | 2242 return 0; |
2243 } | |
2244 | |
2935 | 2245 static int frame_start(H264Context *h){ |
1168 | 2246 MpegEncContext * const s = &h->s; |
2247 int i; | |
2248 | |
2935 | 2249 if(MPV_frame_start(s, s->avctx) < 0) |
2250 return -1; | |
1168 | 2251 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
|
2252 /* |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2253 * 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
|
2254 * This is incorrect for H.264; IDR markings must be used. |
7374 | 2255 * 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
|
2256 * 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
|
2257 */ |
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
2258 s->current_picture_ptr->key_frame= 0; |
1168 | 2259 |
2260 assert(s->linesize && s->uvlinesize); | |
2261 | |
2262 for(i=0; i<16; i++){ | |
2263 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
|
2264 h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3); |
1168 | 2265 } |
2266 for(i=0; i<4; i++){ | |
2267 h->block_offset[16+i]= | |
2268 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
|
2269 h->block_offset[24+16+i]= |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2270 h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3); |
1168 | 2271 } |
2272 | |
2416
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
2273 /* 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
|
2274 * FIXME: redo bipred weight to not require extra buffer? */ |
5642 | 2275 for(i = 0; i < s->avctx->thread_count; i++) |
2276 if(!h->thread_context[i]->s.obmc_scratchpad) | |
2277 h->thread_context[i]->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize); | |
3316 | 2278 |
2279 /* some macroblocks will be accessed before they're available */ | |
5642 | 2280 if(FRAME_MBAFF || s->avctx->thread_count > 1) |
3316 | 2281 memset(h->slice_table, -1, (s->mb_height*s->mb_stride-1) * sizeof(uint8_t)); |
2416
06b7d678b582
10l: scratchpad could be allocated before its size was known.
lorenm
parents:
2415
diff
changeset
|
2282 |
1168 | 2283 // s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1; |
7318 | 2284 |
7374 | 2285 // We mark the current picture as non-reference after allocating it, so |
7318 | 2286 // that if we break out due to an error it can be released automatically |
2287 // in the next MPV_frame_start(). | |
2288 // SVQ3 as well as most other codecs have only last/next/current and thus | |
2289 // get released even with set reference, besides SVQ3 and others do not | |
2290 // mark frames as reference later "naturally". | |
2291 if(s->codec_id != CODEC_ID_SVQ3) | |
2292 s->current_picture_ptr->reference= 0; | |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
2293 |
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
2294 s->current_picture_ptr->field_poc[0]= |
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
2295 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
|
2296 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
|
2297 |
2935 | 2298 return 0; |
1168 | 2299 } |
2300 | |
5106 | 2301 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
|
2302 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
|
2303 int i; |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2304 int step = 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2305 int offset = 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2306 int uvoffset= 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2307 int top_idx = 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2308 int skiplast= 0; |
2967 | 2309 |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2310 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
|
2311 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
|
2312 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
|
2313 |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2314 if(!simple && FRAME_MBAFF){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2315 if(s->mb_y&1){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2316 offset = MB_MBAFF ? 1 : 17; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2317 uvoffset= MB_MBAFF ? 1 : 9; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2318 if(!MB_MBAFF){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2319 *(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
|
2320 *(uint64_t*)(h->top_borders[0][s->mb_x]+ 8)= *(uint64_t*)(src_y +8+15*linesize); |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2321 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2322 *(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
|
2323 *(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
|
2324 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2325 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2326 }else{ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2327 if(!MB_MBAFF){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2328 h->left_border[0]= h->top_borders[0][s->mb_x][15]; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2329 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2330 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
|
2331 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
|
2332 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2333 skiplast= 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2334 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2335 offset = |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2336 uvoffset= |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2337 top_idx = MB_MBAFF ? 0 : 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2338 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2339 step= MB_MBAFF ? 2 : 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2340 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2341 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
2342 // 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
|
2343 // and the line above the bottom macroblock |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2344 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
|
2345 for(i=1; i<17 - skiplast; i++){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2346 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
|
2347 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2348 |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2349 *(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
|
2350 *(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
|
2351 |
5434 | 2352 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2353 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
|
2354 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
|
2355 for(i=1; i<9 - skiplast; i++){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2356 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
|
2357 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
|
2358 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2359 *(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
|
2360 *(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
|
2361 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2362 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2363 |
5106 | 2364 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
|
2365 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
|
2366 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
|
2367 uint64_t temp64; |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2368 int deblock_left; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2369 int deblock_top; |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2370 int mb_xy; |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2371 int step = 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2372 int offset = 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2373 int uvoffset= 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2374 int top_idx = 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2375 |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2376 if(!simple && FRAME_MBAFF){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2377 if(s->mb_y&1){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2378 offset = MB_MBAFF ? 1 : 17; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2379 uvoffset= MB_MBAFF ? 1 : 9; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2380 }else{ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2381 offset = |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2382 uvoffset= |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2383 top_idx = MB_MBAFF ? 0 : 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2384 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2385 step= MB_MBAFF ? 2 : 1; |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2386 } |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2387 |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2388 if(h->deblocking_filter == 2) { |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
2389 mb_xy = h->mb_xy; |
5177
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2390 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
|
2391 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
|
2392 } else { |
ea61020e5e87
Don't swap back un-deblocked lines for intra prediction when
gpoirier
parents:
5174
diff
changeset
|
2393 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
|
2394 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
|
2395 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2396 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2397 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
|
2398 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
|
2399 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
|
2400 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2401 #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
|
2402 t= a;\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2403 if(xchg)\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2404 a= b;\ |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2405 b= t; |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2406 |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2407 if(deblock_left){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2408 for(i = !deblock_top; i<16; i++){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2409 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
|
2410 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2411 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
|
2412 } |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2413 |
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2414 if(deblock_top){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2415 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
|
2416 XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1); |
2803 | 2417 if(s->mb_x+1 < s->mb_width){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2418 XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x+1]), *(uint64_t*)(src_y +17), temp64, 1); |
2755 | 2419 } |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2420 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2421 |
5434 | 2422 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2423 if(deblock_left){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2424 for(i = !deblock_top; i<8; i++){ |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2425 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
|
2426 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
|
2427 } |
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2428 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
|
2429 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
|
2430 } |
2200
733c60a6e30c
h264 deblocking crash patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2175
diff
changeset
|
2431 if(deblock_top){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2432 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
|
2433 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
|
2434 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2435 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2436 } |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2437 |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4896
diff
changeset
|
2438 static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple){ |
1168 | 2439 MpegEncContext * const s = &h->s; |
2440 const int mb_x= s->mb_x; | |
2441 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
|
2442 const int mb_xy= h->mb_xy; |
1168 | 2443 const int mb_type= s->current_picture.mb_type[mb_xy]; |
2444 uint8_t *dest_y, *dest_cb, *dest_cr; | |
2445 int linesize, uvlinesize /*dct_offset*/; | |
2446 int i; | |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2447 int *block_offset = &h->block_offset[0]; |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2448 const int transform_bypass = (s->qscale == 0 && h->sps.transform_bypass), is_h264 = (simple || s->codec_id == CODEC_ID_H264); |
2763 | 2449 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
|
2450 void (*idct_dc_add)(uint8_t *dst, DCTELEM *block, int stride); |
1168 | 2451 |
2452 dest_y = s->current_picture.data[0] + (mb_y * 16* s->linesize ) + mb_x * 16; | |
2453 dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; | |
2454 dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; | |
2455 | |
4000 | 2456 s->dsp.prefetch(dest_y + (s->mb_x&3)*4*s->linesize + 64, s->linesize, 4); |
2457 s->dsp.prefetch(dest_cb + (s->mb_x&7)*s->uvlinesize + 64, dest_cr - dest_cb, 2); | |
2458 | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2459 if (!simple && MB_FIELD) { |
3316 | 2460 linesize = h->mb_linesize = s->linesize * 2; |
2461 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
|
2462 block_offset = &h->block_offset[24]; |
7374 | 2463 if(mb_y&1){ //FIXME move out of this function? |
1168 | 2464 dest_y -= s->linesize*15; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2465 dest_cb-= s->uvlinesize*7; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2466 dest_cr-= s->uvlinesize*7; |
1168 | 2467 } |
3316 | 2468 if(FRAME_MBAFF) { |
2469 int list; | |
4533 | 2470 for(list=0; list<h->list_count; list++){ |
3316 | 2471 if(!USES_LIST(mb_type, list)) |
2472 continue; | |
2473 if(IS_16X16(mb_type)){ | |
2474 int8_t *ref = &h->ref_cache[list][scan8[0]]; | |
6203 | 2475 fill_rectangle(ref, 4, 4, 8, (16+*ref)^(s->mb_y&1), 1); |
3316 | 2476 }else{ |
2477 for(i=0; i<16; i+=4){ | |
2478 int ref = h->ref_cache[list][scan8[i]]; | |
2479 if(ref >= 0) | |
6203 | 2480 fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, (16+ref)^(s->mb_y&1), 1); |
3316 | 2481 } |
2482 } | |
2483 } | |
2484 } | |
1168 | 2485 } else { |
3316 | 2486 linesize = h->mb_linesize = s->linesize; |
2487 uvlinesize = h->mb_uvlinesize = s->uvlinesize; | |
1168 | 2488 // dct_offset = s->linesize * 16; |
2489 } | |
2967 | 2490 |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2491 if(transform_bypass){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2492 idct_dc_add = |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2493 idct_add = IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 : s->dsp.add_pixels4; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2494 }else if(IS_8x8DCT(mb_type)){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2495 idct_dc_add = s->dsp.h264_idct8_dc_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2496 idct_add = s->dsp.h264_idct8_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2497 }else{ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2498 idct_dc_add = s->dsp.h264_idct_dc_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2499 idct_add = s->dsp.h264_idct_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2500 } |
1168 | 2501 |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2502 if (!simple && IS_INTRA_PCM(mb_type)) { |
7450 | 2503 for (i=0; i<16; i++) { |
2504 memcpy(dest_y + i* linesize, h->mb + i*8, 16); | |
2505 } | |
2506 for (i=0; i<8; i++) { | |
2507 memcpy(dest_cb+ i*uvlinesize, h->mb + 128 + i*4, 8); | |
2508 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
|
2509 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2510 } else { |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2511 if(IS_INTRA(mb_type)){ |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2512 if(h->deblocking_filter) |
5106 | 2513 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
|
2514 |
5434 | 2515 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2516 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
|
2517 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
|
2518 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2519 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2520 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
|
2521 if(simple || !s->encoding){ |
2755 | 2522 if(IS_8x8DCT(mb_type)){ |
2523 for(i=0; i<16; i+=4){ | |
2524 uint8_t * const ptr= dest_y + block_offset[i]; | |
2525 const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ]; | |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2526 const int nnz = h->non_zero_count_cache[ scan8[i] ]; |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2527 h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000, |
4546 | 2528 (h->topright_samples_available<<i)&0x4000, linesize); |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2529 if(nnz){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2530 if(nnz == 1 && h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2531 idct_dc_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2532 else |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2533 idct_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2534 } |
2755 | 2535 } |
2536 }else | |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2537 for(i=0; i<16; i++){ |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2538 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
|
2539 uint8_t *topright; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2540 const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ]; |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2541 int nnz, tr; |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2542 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2543 if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2544 const int topright_avail= (h->topright_samples_available<<i)&0x8000; |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
2545 assert(mb_y || linesize <= block_offset[i]); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2546 if(!topright_avail){ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2547 tr= ptr[3 - linesize]*0x01010101; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2548 topright= (uint8_t*) &tr; |
2967 | 2549 }else |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2550 topright= ptr + 4 - linesize; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2551 }else |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2552 topright= NULL; |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2553 |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2554 h->hpc.pred4x4[ dir ](ptr, topright, linesize); |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2555 nnz = h->non_zero_count_cache[ scan8[i] ]; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2556 if(nnz){ |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2557 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2558 if(nnz == 1 && h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2559 idct_dc_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2560 else |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2561 idct_add(ptr, h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2562 }else |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2563 svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0); |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2564 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2565 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2566 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2567 }else{ |
5638
4a26dc4ca11d
Move H.264 intra prediction functions into their own context
kostya
parents:
5631
diff
changeset
|
2568 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
|
2569 if(is_h264){ |
2763 | 2570 if(!transform_bypass) |
5727 | 2571 h264_luma_dc_dequant_idct_c(h->mb, s->qscale, h->dequant4_coeff[0][s->qscale][0]); |
2763 | 2572 }else |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2573 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
|
2574 } |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2575 if(h->deblocking_filter) |
5106 | 2576 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
|
2577 }else if(is_h264){ |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2578 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
|
2579 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
|
2580 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
|
2581 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
|
2582 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2583 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2584 |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2585 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
|
2586 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2587 if(IS_INTRA16x16(mb_type)){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2588 for(i=0; i<16; i++){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2589 if(h->non_zero_count_cache[ scan8[i] ]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2590 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2591 else if(h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2592 idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2593 } |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2594 }else{ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2595 const int di = IS_8x8DCT(mb_type) ? 4 : 1; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2596 for(i=0; i<16; i+=di){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2597 int nnz = h->non_zero_count_cache[ scan8[i] ]; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2598 if(nnz){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2599 if(nnz==1 && h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2600 idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2601 else |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2602 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2603 } |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2604 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2605 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2606 }else{ |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2607 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
|
2608 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
|
2609 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
|
2610 svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0); |
1234 | 2611 } |
1168 | 2612 } |
2613 } | |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2614 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2615 |
5434 | 2616 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2617 uint8_t *dest[2] = {dest_cb, dest_cr}; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2618 if(transform_bypass){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2619 idct_add = idct_dc_add = s->dsp.add_pixels4; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2620 }else{ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2621 idct_add = s->dsp.h264_idct_add; |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2622 idct_dc_add = s->dsp.h264_idct_dc_add; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
2623 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
|
2624 chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]); |
2763 | 2625 } |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2626 if(is_h264){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2627 for(i=16; i<16+8; i++){ |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2628 if(h->non_zero_count_cache[ scan8[i] ]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2629 idct_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2630 else if(h->mb[i*16]) |
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2631 idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize); |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2632 } |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2633 }else{ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2634 for(i=16; i<16+8; i++){ |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2635 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
2636 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i]; |
2509
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2637 svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2); |
b3b06ba8787c
remove goto and reindent patch by (Loic Le Loarer <lll+ffmpeg m4x org>)
michael
parents:
2504
diff
changeset
|
2638 } |
1250 | 2639 } |
1168 | 2640 } |
2641 } | |
2642 } | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2643 if(h->deblocking_filter) { |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2644 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
|
2645 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
|
2646 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
|
2647 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
|
2648 if (!simple && FRAME_MBAFF) { |
7522
4017c5ba7bab
Remove odd pairwise deblock filtering applied to MBAFF MBs.
michael
parents:
7498
diff
changeset
|
2649 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
|
2650 } else { |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
2651 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
|
2652 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
2653 } |
1168 | 2654 } |
2655 | |
2656 /** | |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2657 * 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
|
2658 */ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2659 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
|
2660 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
|
2661 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2662 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2663 /** |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2664 * 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
|
2665 */ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2666 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
|
2667 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
|
2668 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2669 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2670 static void hl_decode_mb(H264Context *h){ |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2671 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
2672 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
|
2673 const int mb_type= s->current_picture.mb_type[mb_xy]; |
7185 | 2674 int is_complex = FRAME_MBAFF || MB_FIELD || IS_INTRA_PCM(mb_type) || s->codec_id != CODEC_ID_H264 || |
2675 (ENABLE_GRAY && (s->flags&CODEC_FLAG_GRAY)) || (ENABLE_H264_ENCODER && s->encoding) || ENABLE_SMALL; | |
7178
9a31b6a8ae52
Don't test for H264 encoding unless an encoder exists.
astrange
parents:
7040
diff
changeset
|
2676 |
9a31b6a8ae52
Don't test for H264 encoding unless an encoder exists.
astrange
parents:
7040
diff
changeset
|
2677 if(ENABLE_H264_ENCODER && !s->decode) |
4587
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2678 return; |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2679 |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2680 if (is_complex) |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2681 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
|
2682 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
|
2683 } |
644687c58928
h264 optimization: common case hl_decode_mb patch by (Alexander Strange astrange ithinksw com)
michael
parents:
4556
diff
changeset
|
2684 |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2685 static void pic_as_field(Picture *pic, const int parity){ |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2686 int i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2687 for (i = 0; i < 4; ++i) { |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2688 if (parity == PICT_BOTTOM_FIELD) |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2689 pic->data[i] += pic->linesize[i]; |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2690 pic->reference = parity; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2691 pic->linesize[i] *= 2; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2692 } |
7462
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
2693 pic->poc= pic->field_poc[parity == PICT_BOTTOM_FIELD]; |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2694 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2695 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2696 static int split_field_copy(Picture *dest, Picture *src, |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2697 int parity, int id_add){ |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2698 int match = !!(src->reference & parity); |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2699 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2700 if (match) { |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2701 *dest = *src; |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2702 if(parity != PICT_FRAME){ |
7399 | 2703 pic_as_field(dest, parity); |
2704 dest->pic_id *= 2; | |
2705 dest->pic_id += id_add; | |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2706 } |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2707 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2708 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2709 return match; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2710 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2711 |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2712 static int build_def_list(Picture *def, Picture **in, int len, int is_long, int sel){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2713 int i[2]={0}; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2714 int index=0; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2715 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2716 while(i[0]<len || i[1]<len){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2717 while(i[0]<len && !(in[ i[0] ] && (in[ i[0] ]->reference & sel))) |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2718 i[0]++; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2719 while(i[1]<len && !(in[ i[1] ] && (in[ i[1] ]->reference & (sel^3)))) |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2720 i[1]++; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2721 if(i[0] < len){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2722 in[ i[0] ]->pic_id= is_long ? i[0] : in[ i[0] ]->frame_num; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2723 split_field_copy(&def[index++], in[ i[0]++ ], sel , 1); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2724 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2725 if(i[1] < len){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2726 in[ i[1] ]->pic_id= is_long ? i[1] : in[ i[1] ]->frame_num; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2727 split_field_copy(&def[index++], in[ i[1]++ ], sel^3, 0); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2728 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2729 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2730 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2731 return index; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2732 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2733 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2734 static int add_sorted(Picture **sorted, Picture **src, int len, int limit, int dir){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2735 int i, best_poc; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2736 int out_i= 0; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2737 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2738 for(;;){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2739 best_poc= dir ? INT_MIN : INT_MAX; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2740 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2741 for(i=0; i<len; i++){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2742 const int poc= src[i]->poc; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2743 if(((poc > limit) ^ dir) && ((poc < best_poc) ^ dir)){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2744 best_poc= poc; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2745 sorted[out_i]= src[i]; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2746 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2747 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2748 if(best_poc == (dir ? INT_MIN : INT_MAX)) |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2749 break; |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2750 limit= sorted[out_i++]->poc - dir; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2751 } |
5778
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2752 return out_i; |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2753 } |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2754 |
c4984d69d373
Support functions and changes to default reference list creation for PAFF.
andoma
parents:
5774
diff
changeset
|
2755 /** |
1168 | 2756 * fills the default_ref_list. |
2757 */ | |
2758 static int fill_default_ref_list(H264Context *h){ | |
2759 MpegEncContext * const s = &h->s; | |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2760 int i, len; |
2967 | 2761 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2762 if(h->slice_type_nos==FF_B_TYPE){ |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2763 Picture *sorted[32]; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2764 int cur_poc, list; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2765 int lens[2]; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2766 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2767 if(FIELD_PICTURE) |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2768 cur_poc= s->current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ]; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2769 else |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2770 cur_poc= s->current_picture_ptr->poc; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2771 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2772 for(list= 0; list<2; list++){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2773 len= add_sorted(sorted , h->short_ref, h->short_ref_count, cur_poc, 1^list); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2774 len+=add_sorted(sorted+len, h->short_ref, h->short_ref_count, cur_poc, 0^list); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2775 assert(len<=32); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2776 len= build_def_list(h->default_ref_list[list] , sorted , len, 0, s->picture_structure); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2777 len+=build_def_list(h->default_ref_list[list]+len, h->long_ref, 16 , 1, s->picture_structure); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2778 assert(len<=32); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2779 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2780 if(len < h->ref_count[list]) |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2781 memset(&h->default_ref_list[list][len], 0, sizeof(Picture)*(h->ref_count[list] - len)); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2782 lens[list]= len; |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2783 } |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2784 |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2785 if(lens[0] == lens[1] && lens[1] > 1){ |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2786 for(i=0; h->default_ref_list[0][i].data[0] == h->default_ref_list[1][i].data[0] && i<lens[0]; i++); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2787 if(i == lens[0]) |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2788 FFSWAP(Picture, h->default_ref_list[1][0], h->default_ref_list[1][1]); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2789 } |
5779
ad3168a70fbe
Reindent fill_default_ref_list after changes for PAFF
andoma
parents:
5778
diff
changeset
|
2790 }else{ |
7398
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2791 len = build_def_list(h->default_ref_list[0] , h->short_ref, h->short_ref_count, 0, s->picture_structure); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2792 len+= build_def_list(h->default_ref_list[0]+len, h-> long_ref, 16 , 1, s->picture_structure); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2793 assert(len <= 32); |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2794 if(len < h->ref_count[0]) |
bcede7e06618
Rewrite fill_default_ref_list(), the old code was obfuscated beyond
michael
parents:
7397
diff
changeset
|
2795 memset(&h->default_ref_list[0][len], 0, sizeof(Picture)*(h->ref_count[0] - len)); |
1168 | 2796 } |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2797 #ifdef TRACE |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2798 for (i=0; i<h->ref_count[0]; i++) { |
4600 | 2799 tprintf(h->s.avctx, "List0: %s fn:%d 0x%p\n", (h->default_ref_list[0][i].long_ref ? "LT" : "ST"), h->default_ref_list[0][i].pic_id, h->default_ref_list[0][i].data[0]); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2800 } |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
2801 if(h->slice_type_nos==FF_B_TYPE){ |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2802 for (i=0; i<h->ref_count[1]; i++) { |
6311
985f4195bb69
"swap first two elements of L1 if L0 and L1 are identical" applies after splitting the lists into fields
lorenm
parents:
6310
diff
changeset
|
2803 tprintf(h->s.avctx, "List1: %s fn:%d 0x%p\n", (h->default_ref_list[1][i].long_ref ? "LT" : "ST"), h->default_ref_list[1][i].pic_id, h->default_ref_list[1][i].data[0]); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2804 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2805 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2806 #endif |
1168 | 2807 return 0; |
2808 } | |
2809 | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2810 static void print_short_term(H264Context *h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2811 static void print_long_term(H264Context *h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2812 |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2813 /** |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2814 * Extract structure information about the picture described by pic_num in |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2815 * the current decoding context (frame or field). Note that pic_num is |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2816 * picture number without wrapping (so, 0<=pic_num<max_pic_num). |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2817 * @param pic_num picture number for which to extract structure information |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2818 * @param structure one of PICT_XXX describing structure of picture |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2819 * with pic_num |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2820 * @return frame number (short term) or long term index of picture |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2821 * described by pic_num |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2822 */ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2823 static int pic_num_extract(H264Context *h, int pic_num, int *structure){ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2824 MpegEncContext * const s = &h->s; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2825 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2826 *structure = s->picture_structure; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2827 if(FIELD_PICTURE){ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2828 if (!(pic_num & 1)) |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2829 /* opposite field */ |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2830 *structure ^= PICT_FRAME; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2831 pic_num >>= 1; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2832 } |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2833 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2834 return pic_num; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2835 } |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2836 |
1168 | 2837 static int decode_ref_pic_list_reordering(H264Context *h){ |
2838 MpegEncContext * const s = &h->s; | |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2839 int list, index, pic_structure; |
2967 | 2840 |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2841 print_short_term(h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
2842 print_long_term(h); |
2967 | 2843 |
4533 | 2844 for(list=0; list<h->list_count; list++){ |
1168 | 2845 memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]); |
2846 | |
2847 if(get_bits1(&s->gb)){ | |
2848 int pred= h->curr_pic_num; | |
2849 | |
2850 for(index=0; ; index++){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2851 unsigned int reordering_of_pic_nums_idc= get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2852 unsigned int pic_id; |
1168 | 2853 int i; |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
2854 Picture *ref = NULL; |
2967 | 2855 |
2856 if(reordering_of_pic_nums_idc==3) | |
2284
6d26e105f68f
h.264 ref list reordering bugfix patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2272
diff
changeset
|
2857 break; |
2967 | 2858 |
1168 | 2859 if(index >= h->ref_count[list]){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
2860 av_log(h->s.avctx, AV_LOG_ERROR, "reference count overflow\n"); |
1168 | 2861 return -1; |
2862 } | |
2967 | 2863 |
1168 | 2864 if(reordering_of_pic_nums_idc<3){ |
2865 if(reordering_of_pic_nums_idc<2){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2866 const unsigned int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1; |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2867 int frame_num; |
1168 | 2868 |
5805 | 2869 if(abs_diff_pic_num > h->max_pic_num){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
2870 av_log(h->s.avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n"); |
1168 | 2871 return -1; |
2872 } | |
2873 | |
2874 if(reordering_of_pic_nums_idc == 0) pred-= abs_diff_pic_num; | |
2875 else pred+= abs_diff_pic_num; | |
2876 pred &= h->max_pic_num - 1; | |
2967 | 2877 |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2878 frame_num = pic_num_extract(h, pred, &pic_structure); |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2879 |
2683 | 2880 for(i= h->short_ref_count-1; i>=0; i--){ |
2881 ref = h->short_ref[i]; | |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2882 assert(ref->reference); |
2683 | 2883 assert(!ref->long_ref); |
7402 | 2884 if( |
7405 | 2885 ref->frame_num == frame_num && |
2886 (ref->reference & pic_structure) | |
7402 | 2887 ) |
1168 | 2888 break; |
2889 } | |
2683 | 2890 if(i>=0) |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2891 ref->pic_id= pred; |
1168 | 2892 }else{ |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2893 int long_idx; |
1168 | 2894 pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2895 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2896 long_idx= pic_num_extract(h, pic_id, &pic_structure); |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2897 |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2898 if(long_idx>31){ |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2899 av_log(h->s.avctx, AV_LOG_ERROR, "long_term_pic_idx overflow\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2900 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
2901 } |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2902 ref = h->long_ref[long_idx]; |
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2903 assert(!(ref && !ref->reference)); |
7405 | 2904 if(ref && (ref->reference & pic_structure)){ |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2905 ref->pic_id= pic_id; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2906 assert(ref->long_ref); |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2907 i=0; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2908 }else{ |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2909 i=-1; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
2910 } |
1168 | 2911 } |
2912 | |
2485
2844b8cf4e11
H.264 multiplce instance in reference list patch by (Loic <lll+ffmpeg m4x org )
michael
parents:
2484
diff
changeset
|
2913 if (i < 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
2914 av_log(h->s.avctx, AV_LOG_ERROR, "reference picture missing during reorder\n"); |
1168 | 2915 memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME |
2683 | 2916 } else { |
2917 for(i=index; i+1<h->ref_count[list]; i++){ | |
2918 if(ref->long_ref == h->ref_list[list][i].long_ref && ref->pic_id == h->ref_list[list][i].pic_id) | |
2919 break; | |
2650
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
2920 } |
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
2921 for(; i > index; i--){ |
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
2922 h->ref_list[list][i]= h->ref_list[list][i-1]; |
d321fbf0b2ce
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
michael
parents:
2649
diff
changeset
|
2923 } |
2683 | 2924 h->ref_list[list][index]= *ref; |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2925 if (FIELD_PICTURE){ |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2926 pic_as_field(&h->ref_list[list][index], pic_structure); |
5780
bd3d1e4f937a
Support function and changes to reference picture reordering for PAFF.
andoma
parents:
5779
diff
changeset
|
2927 } |
1168 | 2928 } |
2284
6d26e105f68f
h.264 ref list reordering bugfix patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2272
diff
changeset
|
2929 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
2930 av_log(h->s.avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n"); |
1168 | 2931 return -1; |
2932 } | |
2933 } | |
2934 } | |
4533 | 2935 } |
2936 for(list=0; list<h->list_count; list++){ | |
2680
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
2937 for(index= 0; index < h->ref_count[list]; index++){ |
7403 | 2938 if(!h->ref_list[list][index].data[0]){ |
2939 av_log(h->s.avctx, AV_LOG_ERROR, "Missing reference picture\n"); | |
2940 h->ref_list[list][index]= s->current_picture; //FIXME this is not a sensible solution | |
2941 } | |
2680
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
2942 } |
1a6192e0b1f9
fill missing reference pictures with something to avoid assertion failure
michael
parents:
2675
diff
changeset
|
2943 } |
2967 | 2944 |
2945 return 0; | |
1168 | 2946 } |
2947 | |
3379
69901769c811
fill_mbaff_ref_list is missing a return statement, its return value
mru
parents:
3341
diff
changeset
|
2948 static void fill_mbaff_ref_list(H264Context *h){ |
3316 | 2949 int list, i, j; |
4533 | 2950 for(list=0; list<2; list++){ //FIXME try list_count |
3316 | 2951 for(i=0; i<h->ref_count[list]; i++){ |
2952 Picture *frame = &h->ref_list[list][i]; | |
2953 Picture *field = &h->ref_list[list][16+2*i]; | |
2954 field[0] = *frame; | |
2955 for(j=0; j<3; j++) | |
2956 field[0].linesize[j] <<= 1; | |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2957 field[0].reference = PICT_TOP_FIELD; |
7896 | 2958 field[0].poc= field[0].field_poc[0]; |
3316 | 2959 field[1] = field[0]; |
2960 for(j=0; j<3; j++) | |
2961 field[1].data[j] += frame->linesize[j]; | |
5825
18859ffa5705
Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by
cehoyos
parents:
5822
diff
changeset
|
2962 field[1].reference = PICT_BOTTOM_FIELD; |
7896 | 2963 field[1].poc= field[1].field_poc[1]; |
3316 | 2964 |
2965 h->luma_weight[list][16+2*i] = h->luma_weight[list][16+2*i+1] = h->luma_weight[list][i]; | |
2966 h->luma_offset[list][16+2*i] = h->luma_offset[list][16+2*i+1] = h->luma_offset[list][i]; | |
2967 for(j=0; j<2; j++){ | |
2968 h->chroma_weight[list][16+2*i][j] = h->chroma_weight[list][16+2*i+1][j] = h->chroma_weight[list][i][j]; | |
2969 h->chroma_offset[list][16+2*i][j] = h->chroma_offset[list][16+2*i+1][j] = h->chroma_offset[list][i][j]; | |
2970 } | |
2971 } | |
2972 } | |
2973 for(j=0; j<h->ref_count[1]; j++){ | |
2974 for(i=0; i<h->ref_count[0]; i++) | |
2975 h->implicit_weight[j][16+2*i] = h->implicit_weight[j][16+2*i+1] = h->implicit_weight[j][i]; | |
2976 memcpy(h->implicit_weight[16+2*j], h->implicit_weight[j], sizeof(*h->implicit_weight)); | |
2977 memcpy(h->implicit_weight[16+2*j+1], h->implicit_weight[j], sizeof(*h->implicit_weight)); | |
2978 } | |
2979 } | |
2980 | |
1168 | 2981 static int pred_weight_table(H264Context *h){ |
2982 MpegEncContext * const s = &h->s; | |
2983 int list, i; | |
2415 | 2984 int luma_def, chroma_def; |
2967 | 2985 |
2415 | 2986 h->use_weight= 0; |
2987 h->use_weight_chroma= 0; | |
1168 | 2988 h->luma_log2_weight_denom= get_ue_golomb(&s->gb); |
2989 h->chroma_log2_weight_denom= get_ue_golomb(&s->gb); | |
2415 | 2990 luma_def = 1<<h->luma_log2_weight_denom; |
2991 chroma_def = 1<<h->chroma_log2_weight_denom; | |
1168 | 2992 |
2993 for(list=0; list<2; list++){ | |
2994 for(i=0; i<h->ref_count[list]; i++){ | |
2995 int luma_weight_flag, chroma_weight_flag; | |
2967 | 2996 |
1168 | 2997 luma_weight_flag= get_bits1(&s->gb); |
2998 if(luma_weight_flag){ | |
2999 h->luma_weight[list][i]= get_se_golomb(&s->gb); | |
3000 h->luma_offset[list][i]= get_se_golomb(&s->gb); | |
2415 | 3001 if( h->luma_weight[list][i] != luma_def |
3002 || h->luma_offset[list][i] != 0) | |
3003 h->use_weight= 1; | |
3004 }else{ | |
3005 h->luma_weight[list][i]= luma_def; | |
3006 h->luma_offset[list][i]= 0; | |
1168 | 3007 } |
3008 | |
7407 | 3009 if(CHROMA){ |
7408 | 3010 chroma_weight_flag= get_bits1(&s->gb); |
3011 if(chroma_weight_flag){ | |
3012 int j; | |
3013 for(j=0; j<2; j++){ | |
3014 h->chroma_weight[list][i][j]= get_se_golomb(&s->gb); | |
3015 h->chroma_offset[list][i][j]= get_se_golomb(&s->gb); | |
3016 if( h->chroma_weight[list][i][j] != chroma_def | |
3017 || h->chroma_offset[list][i][j] != 0) | |
3018 h->use_weight_chroma= 1; | |
3019 } | |
3020 }else{ | |
3021 int j; | |
3022 for(j=0; j<2; j++){ | |
3023 h->chroma_weight[list][i][j]= chroma_def; | |
3024 h->chroma_offset[list][i][j]= 0; | |
3025 } | |
2415 | 3026 } |
7407 | 3027 } |
1168 | 3028 } |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
3029 if(h->slice_type_nos != FF_B_TYPE) break; |
1168 | 3030 } |
2415 | 3031 h->use_weight= h->use_weight || h->use_weight_chroma; |
1168 | 3032 return 0; |
3033 } | |
3034 | |
2415 | 3035 static void implicit_weight_table(H264Context *h){ |
3036 MpegEncContext * const s = &h->s; | |
3037 int ref0, ref1; | |
3038 int cur_poc = s->current_picture_ptr->poc; | |
3039 | |
3040 if( h->ref_count[0] == 1 && h->ref_count[1] == 1 | |
3041 && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){ | |
3042 h->use_weight= 0; | |
3043 h->use_weight_chroma= 0; | |
3044 return; | |
3045 } | |
3046 | |
3047 h->use_weight= 2; | |
3048 h->use_weight_chroma= 2; | |
3049 h->luma_log2_weight_denom= 5; | |
3050 h->chroma_log2_weight_denom= 5; | |
3051 | |
3052 for(ref0=0; ref0 < h->ref_count[0]; ref0++){ | |
3053 int poc0 = h->ref_list[0][ref0].poc; | |
3054 for(ref1=0; ref1 < h->ref_count[1]; ref1++){ | |
2519 | 3055 int poc1 = h->ref_list[1][ref1].poc; |
4594 | 3056 int td = av_clip(poc1 - poc0, -128, 127); |
2415 | 3057 if(td){ |
4594 | 3058 int tb = av_clip(cur_poc - poc0, -128, 127); |
4001 | 3059 int tx = (16384 + (FFABS(td) >> 1)) / td; |
4594 | 3060 int dist_scale_factor = av_clip((tb*tx + 32) >> 6, -1024, 1023) >> 2; |
2415 | 3061 if(dist_scale_factor < -64 || dist_scale_factor > 128) |
3062 h->implicit_weight[ref0][ref1] = 32; | |
3063 else | |
3064 h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor; | |
3065 }else | |
3066 h->implicit_weight[ref0][ref1] = 32; | |
3067 } | |
3068 } | |
3069 } | |
3070 | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3071 /** |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3072 * Mark a picture as no longer needed for reference. The refmask |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3073 * argument allows unreferencing of individual fields or the whole frame. |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3074 * If the picture becomes entirely unreferenced, but is being held for |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3075 * display purposes, it is marked as such. |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3076 * @param refmask mask of fields to unreference; the mask is bitwise |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3077 * anded with the reference marking of pic |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3078 * @return non-zero if pic becomes entirely unreferenced (except possibly |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3079 * for display purposes) zero if one of the fields remains in |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3080 * reference |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3081 */ |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3082 static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){ |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3083 int i; |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3084 if (pic->reference &= refmask) { |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3085 return 0; |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3086 } else { |
7313 | 3087 for(i = 0; h->delayed_pic[i]; i++) |
3088 if(pic == h->delayed_pic[i]){ | |
3089 pic->reference=DELAYED_PIC_REF; | |
3090 break; | |
3091 } | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3092 return 1; |
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3093 } |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3094 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3095 |
1168 | 3096 /** |
2392 | 3097 * instantaneous decoder refresh. |
1168 | 3098 */ |
3099 static void idr(H264Context *h){ | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
3100 int i; |
1168 | 3101 |
2484
a3188eb4266c
correct long term picture management patch by (Loic <lll+ffmpeg m4x org>)
michael
parents:
2471
diff
changeset
|
3102 for(i=0; i<16; i++){ |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3103 remove_long(h, i, 0); |
7385
617eababb511
Clear long_ref when a frame is no longer a long_ref.
michael
parents:
7384
diff
changeset
|
3104 } |
617eababb511
Clear long_ref when a frame is no longer a long_ref.
michael
parents:
7384
diff
changeset
|
3105 assert(h->long_ref_count==0); |
1168 | 3106 |
3107 for(i=0; i<h->short_ref_count; i++){ | |
5768
09b557fcfafb
Modify unreference_pic implementation with PAFF in mind.
andoma
parents:
5767
diff
changeset
|
3108 unreference_pic(h, h->short_ref[i], 0); |
1168 | 3109 h->short_ref[i]= NULL; |
3110 } | |
3111 h->short_ref_count=0; | |
7362
443fdc440854
Reset prev_frame_num for idr frames as required by the spec.
michael
parents:
7361
diff
changeset
|
3112 h->prev_frame_num= 0; |
7379 | 3113 h->prev_frame_num_offset= 0; |
3114 h->prev_poc_msb= | |
3115 h->prev_poc_lsb= 0; | |
1168 | 3116 } |
3117 | |
2640 | 3118 /* forget old pics after a seek */ |
3119 static void flush_dpb(AVCodecContext *avctx){ | |
3120 H264Context *h= avctx->priv_data; | |
3121 int i; | |
7283
39e81fdd8d23
Move the size of the H264Context delayed_pic array into a #define.
astrange
parents:
7277
diff
changeset
|
3122 for(i=0; i<MAX_DELAYED_PIC_COUNT; i++) { |
3144 | 3123 if(h->delayed_pic[i]) |
3124 h->delayed_pic[i]->reference= 0; | |
2640 | 3125 h->delayed_pic[i]= NULL; |
3144 | 3126 } |
7310
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
3127 h->outputed_poc= INT_MIN; |
2640 | 3128 idr(h); |
2751
3247049dfc7a
fix segfault if flush is called before the first frame
mru
parents:
2748
diff
changeset
|
3129 if(h->s.current_picture_ptr) |
3247049dfc7a
fix segfault if flush is called before the first frame
mru
parents:
2748
diff
changeset
|
3130 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
|
3131 h->s.first_field= 0; |
5926
77403dc808cd
Call mpegvideo flush routine on h264 flush. Needed in particular
heydowns
parents:
5904
diff
changeset
|
3132 ff_mpeg_flush(avctx); |
2640 | 3133 } |
3134 | |
1168 | 3135 /** |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3136 * Find a Picture in the short term reference list by frame number. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3137 * @param frame_num frame number to search for |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3138 * @param idx the index into h->short_ref where returned picture is found |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3139 * undefined if no picture found. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3140 * @return pointer to the found picture, or NULL if no pic with the provided |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3141 * frame number is found |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3142 */ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3143 static Picture * find_short(H264Context *h, int frame_num, int *idx){ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3144 MpegEncContext * const s = &h->s; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3145 int i; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3146 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3147 for(i=0; i<h->short_ref_count; i++){ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3148 Picture *pic= h->short_ref[i]; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3149 if(s->avctx->debug&FF_DEBUG_MMCO) |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3150 av_log(h->s.avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3151 if(pic->frame_num == frame_num) { |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3152 *idx = i; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3153 return pic; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3154 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3155 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3156 return NULL; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3157 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3158 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3159 /** |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3160 * Remove a picture from the short term reference list by its index in |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3161 * that list. This does no checking on the provided index; it is assumed |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3162 * to be valid. Other list entries are shifted down. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3163 * @param i index into h->short_ref of picture to remove. |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3164 */ |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3165 static void remove_short_at_index(H264Context *h, int i){ |
7277
2bd9df0236e8
H264: fix index range assert() in remove_short_at_index()
mru
parents:
7237
diff
changeset
|
3166 assert(i >= 0 && i < h->short_ref_count); |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3167 h->short_ref[i]= NULL; |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3168 if (--h->short_ref_count) |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3169 memmove(&h->short_ref[i], &h->short_ref[i+1], (h->short_ref_count - i)*sizeof(Picture*)); |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3170 } |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3171 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3172 /** |
1168 | 3173 * |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
3174 * @return the removed picture or NULL if an error occurs |
1168 | 3175 */ |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3176 static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){ |
1169 | 3177 MpegEncContext * const s = &h->s; |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3178 Picture *pic; |
1168 | 3179 int i; |
2967 | 3180 |
1169 | 3181 if(s->avctx->debug&FF_DEBUG_MMCO) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3182 av_log(h->s.avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count); |
2967 | 3183 |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3184 pic = find_short(h, frame_num, &i); |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3185 if (pic){ |
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3186 if(unreference_pic(h, pic, ref_mask)) |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3187 remove_short_at_index(h, i); |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3188 } |
5770
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3189 |
a1a947d67948
Further modularize short reference list management for upcoming PAFF implementation.
andoma
parents:
5769
diff
changeset
|
3190 return pic; |
1168 | 3191 } |
3192 | |
3193 /** | |
5774
e71de81878c4
Reorganize long reference management to minimize code duplication in upcoming PAFF implementation.
andoma
parents:
5773
diff
changeset
|
3194 * Remove a picture from the long term reference list by its index in |
7393
309c59802769
Merge oddly duplicated remove_long/remove_long_at_index() function.
michael
parents:
7392
diff
changeset
|
3195 * that list. |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
3196 * @return the removed picture or NULL if an error occurs |
1168 | 3197 */ |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3198 static Picture * remove_long(H264Context *h, int i, int ref_mask){ |
1168 | 3199 Picture *pic; |
3200 | |
3201 pic= h->long_ref[i]; | |
7393
309c59802769
Merge oddly duplicated remove_long/remove_long_at_index() function.
michael
parents:
7392
diff
changeset
|
3202 if (pic){ |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3203 if(unreference_pic(h, pic, ref_mask)){ |
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3204 assert(h->long_ref[i]->long_ref == 1); |
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3205 h->long_ref[i]->long_ref= 0; |
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3206 h->long_ref[i]= NULL; |
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3207 h->long_ref_count--; |
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3208 } |
7393
309c59802769
Merge oddly duplicated remove_long/remove_long_at_index() function.
michael
parents:
7392
diff
changeset
|
3209 } |
1168 | 3210 |
3211 return pic; | |
3212 } | |
3213 | |
3214 /** | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3215 * print short term list |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3216 */ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3217 static void print_short_term(H264Context *h) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3218 uint32_t i; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3219 if(h->s.avctx->debug&FF_DEBUG_MMCO) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3220 av_log(h->s.avctx, AV_LOG_DEBUG, "short term list:\n"); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3221 for(i=0; i<h->short_ref_count; i++){ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3222 Picture *pic= h->short_ref[i]; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3223 av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", i, pic->frame_num, pic->poc, pic->data[0]); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3224 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3225 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3226 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3227 |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3228 /** |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3229 * print long term list |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3230 */ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3231 static void print_long_term(H264Context *h) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3232 uint32_t i; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3233 if(h->s.avctx->debug&FF_DEBUG_MMCO) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3234 av_log(h->s.avctx, AV_LOG_DEBUG, "long term list:\n"); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3235 for(i = 0; i < 16; i++){ |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3236 Picture *pic= h->long_ref[i]; |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3237 if (pic) { |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3238 av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", i, pic->frame_num, pic->poc, pic->data[0]); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3239 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3240 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3241 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3242 } |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3243 |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3244 /** |
1168 | 3245 * Executes the reference picture marking (memory management control operations). |
3246 */ | |
3247 static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ | |
3248 MpegEncContext * const s = &h->s; | |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3249 int i, j; |
5785
74fa2587b8de
Cosmetic renaming variable so that it makes more sense for forthcoming PAFF mmco patches.
andoma
parents:
5784
diff
changeset
|
3250 int current_ref_assigned=0; |
1168 | 3251 Picture *pic; |
2967 | 3252 |
1168 | 3253 if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3254 av_log(h->s.avctx, AV_LOG_DEBUG, "no mmco here\n"); |
2967 | 3255 |
1168 | 3256 for(i=0; i<mmco_count; i++){ |
7383
c4e5f2158b20
Simplify strange obfuscated code in MMCO_LONG handling.
michael
parents:
7382
diff
changeset
|
3257 int structure, frame_num; |
1168 | 3258 if(s->avctx->debug&FF_DEBUG_MMCO) |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3259 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_pic_num, h->mmco[i].long_arg); |
1168 | 3260 |
7395
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3261 if( mmco[i].opcode == MMCO_SHORT2UNUSED |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3262 || mmco[i].opcode == MMCO_SHORT2LONG){ |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3263 frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure); |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3264 pic = find_short(h, frame_num, &j); |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3265 if(!pic){ |
7397
535664ced6f0
Do not scare the user with error messages when everything is ok.
michael
parents:
7396
diff
changeset
|
3266 if(mmco[i].opcode != MMCO_SHORT2LONG || !h->long_ref[mmco[i].long_arg] |
535664ced6f0
Do not scare the user with error messages when everything is ok.
michael
parents:
7396
diff
changeset
|
3267 || h->long_ref[mmco[i].long_arg]->frame_num != frame_num) |
7395
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3268 av_log(h->s.avctx, AV_LOG_ERROR, "mmco: unref short failure\n"); |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3269 continue; |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3270 } |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3271 } |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3272 |
1168 | 3273 switch(mmco[i].opcode){ |
3274 case MMCO_SHORT2UNUSED: | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3275 if(s->avctx->debug&FF_DEBUG_MMCO) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3276 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n", h->mmco[i].short_pic_num, h->short_ref_count); |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3277 remove_short(h, frame_num, structure ^ PICT_FRAME); |
1168 | 3278 break; |
3279 case MMCO_SHORT2LONG: | |
7395
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3280 if (h->long_ref[mmco[i].long_arg] != pic) |
08e81ea44a38
Removing yet another weird field pic special case,
michael
parents:
7394
diff
changeset
|
3281 remove_long(h, mmco[i].long_arg, 0); |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3282 |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3283 remove_short_at_index(h, j); |
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3284 h->long_ref[ mmco[i].long_arg ]= pic; |
5787 | 3285 if (h->long_ref[ mmco[i].long_arg ]){ |
3286 h->long_ref[ mmco[i].long_arg ]->long_ref=1; | |
3287 h->long_ref_count++; | |
3288 } | |
1168 | 3289 break; |
3290 case MMCO_LONG2UNUSED: | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3291 j = pic_num_extract(h, mmco[i].long_arg, &structure); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3292 pic = h->long_ref[j]; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3293 if (pic) { |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3294 remove_long(h, j, structure ^ PICT_FRAME); |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3295 } else if(s->avctx->debug&FF_DEBUG_MMCO) |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3296 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref long failure\n"); |
1168 | 3297 break; |
3298 case MMCO_LONG: | |
7383
c4e5f2158b20
Simplify strange obfuscated code in MMCO_LONG handling.
michael
parents:
7382
diff
changeset
|
3299 // Comment below left from previous code as it is an interresting note. |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3300 /* First field in pair is in short term list or |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3301 * at a different long term index. |
7420
30e8c4bf08a4
Fix reference to spec to be more specific and correct.
heydowns
parents:
7417
diff
changeset
|
3302 * This is not allowed; see 7.4.3.3, notes 2 and 3. |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3303 * Report the problem and keep the pair where it is, |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3304 * and mark this field valid. |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3305 */ |
7383
c4e5f2158b20
Simplify strange obfuscated code in MMCO_LONG handling.
michael
parents:
7382
diff
changeset
|
3306 |
c4e5f2158b20
Simplify strange obfuscated code in MMCO_LONG handling.
michael
parents:
7382
diff
changeset
|
3307 if (h->long_ref[mmco[i].long_arg] != s->current_picture_ptr) { |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3308 remove_long(h, mmco[i].long_arg, 0); |
5787 | 3309 |
3310 h->long_ref[ mmco[i].long_arg ]= s->current_picture_ptr; | |
3311 h->long_ref[ mmco[i].long_arg ]->long_ref=1; | |
3312 h->long_ref_count++; | |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3313 } |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3314 |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3315 s->current_picture_ptr->reference |= s->picture_structure; |
5785
74fa2587b8de
Cosmetic renaming variable so that it makes more sense for forthcoming PAFF mmco patches.
andoma
parents:
5784
diff
changeset
|
3316 current_ref_assigned=1; |
1168 | 3317 break; |
3318 case MMCO_SET_MAX_LONG: | |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3319 assert(mmco[i].long_arg <= 16); |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3320 // just remove the long term which index is greater than new max |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3321 for(j = mmco[i].long_arg; j<16; j++){ |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3322 remove_long(h, j, 0); |
1168 | 3323 } |
3324 break; | |
3325 case MMCO_RESET: | |
3326 while(h->short_ref_count){ | |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3327 remove_short(h, h->short_ref[0]->frame_num, 0); |
1168 | 3328 } |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3329 for(j = 0; j < 16; j++) { |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3330 remove_long(h, j, 0); |
1168 | 3331 } |
7350 | 3332 s->current_picture_ptr->poc= |
3333 s->current_picture_ptr->field_poc[0]= | |
3334 s->current_picture_ptr->field_poc[1]= | |
3335 h->poc_lsb= | |
3336 h->poc_msb= | |
3337 h->frame_num= | |
7349 | 3338 s->current_picture_ptr->frame_num= 0; |
1168 | 3339 break; |
3340 default: assert(0); | |
3341 } | |
3342 } | |
2967 | 3343 |
7389
8ef2e8f077ff
Remove another of these obfuscated special cases for field pictures
michael
parents:
7388
diff
changeset
|
3344 if (!current_ref_assigned) { |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3345 /* Second field of complementary field pair; the first field of |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3346 * which is already referenced. If short referenced, it |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3347 * should be first entry in short_ref. If not, it must exist |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3348 * in long_ref; trying to put it on the short list here is an |
7421
74534206d329
And.... Fix another spec reference to be more specific and correct.
heydowns
parents:
7420
diff
changeset
|
3349 * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3). |
5786
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3350 */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3351 if (h->short_ref_count && h->short_ref[0] == s->current_picture_ptr) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3352 /* Just mark the second field valid */ |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3353 s->current_picture_ptr->reference = PICT_FRAME; |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3354 } else if (s->current_picture_ptr->long_ref) { |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3355 av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term reference " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3356 "assignment for second field " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3357 "in complementary field pair " |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3358 "(first field is long term)\n"); |
8121e27dd9cc
Augment MMCO execution to work with both fields and frames. Part of PAFF
cehoyos
parents:
5785
diff
changeset
|
3359 } else { |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3360 pic= remove_short(h, s->current_picture_ptr->frame_num, 0); |
7391 | 3361 if(pic){ |
3362 av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n"); | |
3363 } | |
3364 | |
3365 if(h->short_ref_count) | |
3366 memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*)); | |
3367 | |
3368 h->short_ref[0]= s->current_picture_ptr; | |
3369 h->short_ref_count++; | |
3370 s->current_picture_ptr->reference |= s->picture_structure; | |
3371 } | |
7390 | 3372 } |
2967 | 3373 |
6019 | 3374 if (h->long_ref_count + h->short_ref_count > h->sps.ref_frame_count){ |
6018
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3375 |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3376 /* We have too many reference frames, probably due to corrupted |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3377 * stream. Need to discard one frame. Prevents overrun of the |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3378 * short_ref and long_ref buffers. |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3379 */ |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3380 av_log(h->s.avctx, AV_LOG_ERROR, |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3381 "number of reference frames exceeds max (probably " |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3382 "corrupt input), discarding one\n"); |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3383 |
7350 | 3384 if (h->long_ref_count && !h->short_ref_count) { |
6018
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3385 for (i = 0; i < 16; ++i) |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3386 if (h->long_ref[i]) |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3387 break; |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3388 |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3389 assert(i < 16); |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3390 remove_long(h, i, 0); |
6018
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3391 } else { |
6019 | 3392 pic = h->short_ref[h->short_ref_count - 1]; |
7396
9f765ea6d6df
Make remove_short() match remove_long() in that it calls unreference_pic().
michael
parents:
7395
diff
changeset
|
3393 remove_short(h, pic->frame_num, 0); |
7394
4ac8769cbb01
Make remove_long() call unreference_pic() internally.
michael
parents:
7393
diff
changeset
|
3394 } |
6018
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3395 } |
9d1654835629
Ensure that our total reference frame count does not exceed the SPS
heydowns
parents:
6017
diff
changeset
|
3396 |
2441
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3397 print_short_term(h); |
358813ec4ca2
H.264 b ref pic list order and long term pictures patch by (Loic Le Loarer <loic.le-loarer polytechnique org>)
michael
parents:
2440
diff
changeset
|
3398 print_long_term(h); |
2967 | 3399 return 0; |
1168 | 3400 } |
3401 | |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3402 static int decode_ref_pic_marking(H264Context *h, GetBitContext *gb){ |
1168 | 3403 MpegEncContext * const s = &h->s; |
3404 int i; | |
2967 | 3405 |
7384
8b9a02536781
Make sure mmco index is 0 (instead of uninitialized) in all error returns.
michael
parents:
7383
diff
changeset
|
3406 h->mmco_index= 0; |
1168 | 3407 if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3408 s->broken_link= get_bits1(gb) -1; |
7388 | 3409 if(get_bits1(gb)){ |
1168 | 3410 h->mmco[0].opcode= MMCO_LONG; |
7388 | 3411 h->mmco[0].long_arg= 0; |
1168 | 3412 h->mmco_index= 1; |
2967 | 3413 } |
1168 | 3414 }else{ |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3415 if(get_bits1(gb)){ // adaptive_ref_pic_marking_mode_flag |
2967 | 3416 for(i= 0; i<MAX_MMCO_COUNT; i++) { |
5172
60a4f209838b
Decouple bit context from h264 context in decode_ref_pic_marking()
gpoirier
parents:
5170
diff
changeset
|
3417 MMCOOpcode opcode= get_ue_golomb(gb); |
1168 | 3418 |
3419 h->mmco[i].opcode= opcode; | |
3420 if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){ | |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3421 h->mmco[i].short_pic_num= (h->curr_pic_num - get_ue_golomb(gb) - 1) & (h->max_pic_num - 1); |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3422 /* if(h->mmco[i].short_pic_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_pic_num ] == NULL){ |
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2844
diff
changeset
|
3423 av_log(s->avctx, AV_LOG_ERROR, "illegal short ref in memory management control operation %d\n", mmco); |
1168 | 3424 return -1; |
3425 }*/ | |
3426 } | |
3427 if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){ | |
5771
5290a3850c03
Rename variable to make sense in both field and frame contexts (support of PAFF implementation).
andoma
parents:
5770
diff
changeset
|
3428 unsigned int long_arg= get_ue_golomb(gb); |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3429 if(long_arg >= 32 || (long_arg >= 16 && !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE))){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3430 av_log(h->s.avctx, AV_LOG_ERROR, "illegal long ref in memory management control operation %d\n", opcode); |
1168 | 3431 return -1; |
3432 } | |
5771
5290a3850c03
Rename variable to make sense in both field and frame contexts (support of PAFF implementation).
andoma
parents:
5770
diff
changeset
|
3433 h->mmco[i].long_arg= long_arg; |
1168 | 3434 } |
2967 | 3435 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3436 if(opcode > (unsigned)MMCO_LONG){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3437 av_log(h->s.avctx, AV_LOG_ERROR, "illegal memory management control operation %d\n", opcode); |
1168 | 3438 return -1; |
3439 } | |
2255
507690ff49a2
assertion when playing AVC/H.264 streams fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2254
diff
changeset
|
3440 if(opcode == MMCO_END) |
507690ff49a2
assertion when playing AVC/H.264 streams fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2254
diff
changeset
|
3441 break; |
1168 | 3442 } |
3443 h->mmco_index= i; | |
3444 }else{ | |
3445 assert(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count); | |
3446 | |
5987 | 3447 if(h->short_ref_count && h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count && |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3448 !(FIELD_PICTURE && !s->first_field && s->current_picture_ptr->reference)) { |
1168 | 3449 h->mmco[0].opcode= MMCO_SHORT2UNUSED; |
5756
db5a041fd77c
Rename MMCO stuff to prepare for h264/PAFF implementation.
andoma
parents:
5727
diff
changeset
|
3450 h->mmco[0].short_pic_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num; |
1168 | 3451 h->mmco_index= 1; |
5784
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3452 if (FIELD_PICTURE) { |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3453 h->mmco[0].short_pic_num *= 2; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3454 h->mmco[1].opcode= MMCO_SHORT2UNUSED; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3455 h->mmco[1].short_pic_num= h->mmco[0].short_pic_num + 1; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3456 h->mmco_index= 2; |
af2dab646def
Augment mmcodecoding process to work properly with fields. Part of PAFF implementation.
andoma
parents:
5783
diff
changeset
|
3457 } |
7387 | 3458 } |
1168 | 3459 } |
3460 } | |
2967 | 3461 |
3462 return 0; | |
1168 | 3463 } |
3464 | |
3465 static int init_poc(H264Context *h){ | |
3466 MpegEncContext * const s = &h->s; | |
3467 const int max_frame_num= 1<<h->sps.log2_max_frame_num; | |
3468 int field_poc[2]; | |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
3469 Picture *cur = s->current_picture_ptr; |
1168 | 3470 |
7381 | 3471 h->frame_num_offset= h->prev_frame_num_offset; |
7380 | 3472 if(h->frame_num < h->prev_frame_num) |
7381 | 3473 h->frame_num_offset += max_frame_num; |
1168 | 3474 |
3475 if(h->sps.poc_type==0){ | |
3476 const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb; | |
3477 | |
3478 if (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2) | |
3479 h->poc_msb = h->prev_poc_msb + max_poc_lsb; | |
3480 else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2) | |
3481 h->poc_msb = h->prev_poc_msb - max_poc_lsb; | |
3482 else | |
3483 h->poc_msb = h->prev_poc_msb; | |
3484 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb); | |
2967 | 3485 field_poc[0] = |
1168 | 3486 field_poc[1] = h->poc_msb + h->poc_lsb; |
2967 | 3487 if(s->picture_structure == PICT_FRAME) |
1168 | 3488 field_poc[1] += h->delta_poc_bottom; |
3489 }else if(h->sps.poc_type==1){ | |
3490 int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc; | |
3491 int i; | |
3492 | |
3493 if(h->sps.poc_cycle_length != 0) | |
3494 abs_frame_num = h->frame_num_offset + h->frame_num; | |
3495 else | |
3496 abs_frame_num = 0; | |
3497 | |
3498 if(h->nal_ref_idc==0 && abs_frame_num > 0) | |
3499 abs_frame_num--; | |
2967 | 3500 |
1168 | 3501 expected_delta_per_poc_cycle = 0; |
3502 for(i=0; i < h->sps.poc_cycle_length; i++) | |
3503 expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse | |
3504 | |
3505 if(abs_frame_num > 0){ | |
3506 int poc_cycle_cnt = (abs_frame_num - 1) / h->sps.poc_cycle_length; | |
3507 int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length; | |
3508 | |
3509 expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle; | |
3510 for(i = 0; i <= frame_num_in_poc_cycle; i++) | |
3511 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ]; | |
3512 } else | |
3513 expectedpoc = 0; | |
3514 | |
2967 | 3515 if(h->nal_ref_idc == 0) |
1168 | 3516 expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic; |
2967 | 3517 |
1168 | 3518 field_poc[0] = expectedpoc + h->delta_poc[0]; |
3519 field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field; | |
3520 | |
3521 if(s->picture_structure == PICT_FRAME) | |
3522 field_poc[1] += h->delta_poc[1]; | |
3523 }else{ | |
7381 | 3524 int poc= 2*(h->frame_num_offset + h->frame_num); |
3525 | |
3526 if(!h->nal_ref_idc) | |
3527 poc--; | |
7380 | 3528 |
1168 | 3529 field_poc[0]= poc; |
3530 field_poc[1]= poc; | |
3531 } | |
2967 | 3532 |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
3533 if(s->picture_structure != PICT_BOTTOM_FIELD) |
1168 | 3534 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
|
3535 if(s->picture_structure != PICT_TOP_FIELD) |
1168 | 3536 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
|
3537 cur->poc= FFMIN(cur->field_poc[0], cur->field_poc[1]); |
1168 | 3538 |
3539 return 0; | |
3540 } | |
3541 | |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3542 |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3543 /** |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3544 * initialize scan tables |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3545 */ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3546 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
|
3547 MpegEncContext * const s = &h->s; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3548 int i; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3549 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
|
3550 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
|
3551 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
|
3552 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3553 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
|
3554 #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
|
3555 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
|
3556 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
|
3557 #undef T |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3558 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3559 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3560 if(s->dsp.h264_idct8_add == ff_h264_idct8_add_c){ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3561 memcpy(h->zigzag_scan8x8, zigzag_scan8x8, 64*sizeof(uint8_t)); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3562 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
|
3563 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
|
3564 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
|
3565 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3566 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
|
3567 #define T(x) (x>>3) | ((x&7)<<3) |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3568 h->zigzag_scan8x8[i] = T(zigzag_scan8x8[i]); |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3569 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
|
3570 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
|
3571 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
|
3572 #undef T |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3573 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3574 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3575 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
|
3576 h->zigzag_scan_q0 = zigzag_scan; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3577 h->zigzag_scan8x8_q0 = zigzag_scan8x8; |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3578 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
|
3579 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
|
3580 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
|
3581 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
|
3582 }else{ |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3583 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
|
3584 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
|
3585 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
|
3586 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
|
3587 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
|
3588 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
|
3589 } |
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3590 } |
5642 | 3591 |
3592 /** | |
3593 * Replicates H264 "master" context to thread contexts. | |
3594 */ | |
3595 static void clone_slice(H264Context *dst, H264Context *src) | |
3596 { | |
3597 memcpy(dst->block_offset, src->block_offset, sizeof(dst->block_offset)); | |
3598 dst->s.current_picture_ptr = src->s.current_picture_ptr; | |
3599 dst->s.current_picture = src->s.current_picture; | |
3600 dst->s.linesize = src->s.linesize; | |
3601 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
|
3602 dst->s.first_field = src->s.first_field; |
5642 | 3603 |
3604 dst->prev_poc_msb = src->prev_poc_msb; | |
3605 dst->prev_poc_lsb = src->prev_poc_lsb; | |
3606 dst->prev_frame_num_offset = src->prev_frame_num_offset; | |
3607 dst->prev_frame_num = src->prev_frame_num; | |
3608 dst->short_ref_count = src->short_ref_count; | |
3609 | |
3610 memcpy(dst->short_ref, src->short_ref, sizeof(dst->short_ref)); | |
3611 memcpy(dst->long_ref, src->long_ref, sizeof(dst->long_ref)); | |
3612 memcpy(dst->default_ref_list, src->default_ref_list, sizeof(dst->default_ref_list)); | |
3613 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
|
3614 |
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
3615 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
|
3616 memcpy(dst->dequant8_coeff, src->dequant8_coeff, sizeof(src->dequant8_coeff)); |
5642 | 3617 } |
3618 | |
1168 | 3619 /** |
3620 * decodes a slice header. | |
6918 | 3621 * This will also call MPV_common_init() and frame_start() as needed. |
5642 | 3622 * |
3623 * @param h h264context | |
3624 * @param h0 h264 master context (differs from 'h' when doing sliced based parallel decoding) | |
3625 * | |
6524 | 3626 * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded |
1168 | 3627 */ |
5642 | 3628 static int decode_slice_header(H264Context *h, H264Context *h0){ |
1168 | 3629 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
|
3630 MpegEncContext * const s0 = &h0->s; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3631 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
|
3632 unsigned int pps_id; |
1168 | 3633 int num_ref_idx_active_override_flag; |
6481 | 3634 static const uint8_t slice_type_map[5]= {FF_P_TYPE, FF_B_TYPE, FF_I_TYPE, FF_SP_TYPE, FF_SI_TYPE}; |
7332 | 3635 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
|
3636 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
|
3637 int last_pic_structure; |
1168 | 3638 |
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
3639 s->dropable= h->nal_ref_idc == 0; |
1168 | 3640 |
5984
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3641 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
|
3642 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
|
3643 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
|
3644 }else{ |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3645 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
|
3646 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
|
3647 } |
ba13cc3e38bb
Initialize function pointers used by error resilience code before any
heydowns
parents:
5963
diff
changeset
|
3648 |
1168 | 3649 first_mb_in_slice= get_ue_golomb(&s->gb); |
3650 | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3651 if((s->flags2 & CODEC_FLAG2_CHUNKS) && first_mb_in_slice == 0){ |
5642 | 3652 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
|
3653 if (!s0->first_field) |
5803 | 3654 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
|
3655 } |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
3656 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3657 slice_type= get_ue_golomb(&s->gb); |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3658 if(slice_type > 9){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3659 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 | 3660 return -1; |
1168 | 3661 } |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3662 if(slice_type > 4){ |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3663 slice_type -= 5; |
1168 | 3664 h->slice_type_fixed=1; |
3665 }else | |
3666 h->slice_type_fixed=0; | |
2967 | 3667 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3668 slice_type= slice_type_map[ slice_type ]; |
6481 | 3669 if (slice_type == FF_I_TYPE |
5642 | 3670 || (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
|
3671 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
|
3672 } |
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3673 h->slice_type= slice_type; |
7338 | 3674 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
|
3675 |
7374 | 3676 s->pict_type= h->slice_type; // to make a few old functions happy, it's wrong though |
6481 | 3677 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
|
3678 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
|
3679 "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
|
3680 return -1; |
5455f4e43948
Make h264 decoder conform to requirements of mpegvideo's MPV_frame_start.
heydowns
parents:
6014
diff
changeset
|
3681 } |
2967 | 3682 |
1168 | 3683 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
|
3684 if(pps_id>=MAX_PPS_COUNT){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
3685 av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n"); |
1168 | 3686 return -1; |
3687 } | |
5642 | 3688 if(!h0->pps_buffers[pps_id]) { |
7374 | 3689 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS referenced\n"); |
1174 | 3690 return -1; |
3691 } | |
5642 | 3692 h->pps= *h0->pps_buffers[pps_id]; |
3693 | |
3694 if(!h0->sps_buffers[h->pps.sps_id]) { | |
7374 | 3695 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS referenced\n"); |
1174 | 3696 return -1; |
3697 } | |
5642 | 3698 h->sps = *h0->sps_buffers[h->pps.sps_id]; |
2919 | 3699 |
5685
070a376d496b
fix image corruption when with multi-threaded decoding.
gpoirier
parents:
5647
diff
changeset
|
3700 if(h == h0 && h->dequant_coeff_pps != pps_id){ |
4363 | 3701 h->dequant_coeff_pps = pps_id; |
2919 | 3702 init_dequant_tables(h); |
3703 } | |
2967 | 3704 |
1168 | 3705 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
|
3706 s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag); |
2967 | 3707 |
3178 | 3708 h->b_stride= s->mb_width*4; |
3709 h->b8_stride= s->mb_width*2; | |
1168 | 3710 |
6581
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
3711 s->width = 16*s->mb_width - 2*FFMIN(h->sps.crop_right, 7); |
1168 | 3712 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
|
3713 s->height= 16*s->mb_height - 2*FFMIN(h->sps.crop_bottom, 7); |
1168 | 3714 else |
6581
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
3715 s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3); |
2967 | 3716 |
3717 if (s->context_initialized | |
1548 | 3718 && ( s->width != s->avctx->width || s->height != s->avctx->height)) { |
5642 | 3719 if(h != h0) |
3720 return -1; // width / height changed during parallelized decoding | |
1168 | 3721 free_tables(h); |
3722 MPV_common_end(s); | |
3723 } | |
3724 if (!s->context_initialized) { | |
5642 | 3725 if(h != h0) |
3726 return -1; // we cant (re-)initialize context during parallel decoding | |
1168 | 3727 if (MPV_common_init(s) < 0) |
3728 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
|
3729 s->first_field = 0; |
2967 | 3730 |
5160
13386224ff72
Factor out init_scan_tables(), patch by Andreas ªÓman %andreas A olebyn.nu%
gpoirier
parents:
5153
diff
changeset
|
3731 init_scan_tables(h); |
1168 | 3732 alloc_tables(h); |
3733 | |
5642 | 3734 for(i = 1; i < s->avctx->thread_count; i++) { |
3735 H264Context *c; | |
3736 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
|
3737 memcpy(c, h->s.thread_context[i], sizeof(MpegEncContext)); |
5642 | 3738 memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext)); |
3739 c->sps = h->sps; | |
3740 c->pps = h->pps; | |
3741 init_scan_tables(c); | |
3742 clone_tables(c, h); | |
3743 } | |
3744 | |
3745 for(i = 0; i < s->avctx->thread_count; i++) | |
3746 if(context_init(h->thread_context[i]) < 0) | |
3747 return -1; | |
3748 | |
1168 | 3749 s->avctx->width = s->width; |
3750 s->avctx->height = s->height; | |
1548 | 3751 s->avctx->sample_aspect_ratio= h->sps.sar; |
2440 | 3752 if(!s->avctx->sample_aspect_ratio.den) |
3753 s->avctx->sample_aspect_ratio.den = 1; | |
2174
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
3754 |
2648 | 3755 if(h->sps.timing_info_present_flag){ |
3052 | 3756 s->avctx->time_base= (AVRational){h->sps.num_units_in_tick * 2, h->sps.time_scale}; |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3757 if(h->x264_build > 0 && h->x264_build < 44) |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3758 s->avctx->time_base.den *= 2; |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3759 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den, |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3052
diff
changeset
|
3760 s->avctx->time_base.num, s->avctx->time_base.den, 1<<30); |
2174
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
3761 } |
1168 | 3762 } |
3763 | |
3764 h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num); | |
3765 | |
3316 | 3766 h->mb_mbaff = 0; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
3767 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
|
3768 last_pic_structure = s0->picture_structure; |
1168 | 3769 if(h->sps.frame_mbs_only_flag){ |
3770 s->picture_structure= PICT_FRAME; | |
3771 }else{ | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
3772 if(get_bits1(&s->gb)) { //field_pic_flag |
1168 | 3773 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
|
3774 } else { |
1168 | 3775 s->picture_structure= PICT_FRAME; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
3776 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
|
3777 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
3778 } |
7468 | 3779 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
|
3780 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
3781 if(h0->current_slice == 0){ |
7350 | 3782 while(h->frame_num != h->prev_frame_num && |
3783 h->frame_num != (h->prev_frame_num+1)%(1<<h->sps.log2_max_frame_num)){ | |
3784 av_log(NULL, AV_LOG_DEBUG, "Frame num gap %d %d\n", h->frame_num, h->prev_frame_num); | |
3785 frame_start(h); | |
3786 h->prev_frame_num++; | |
3787 h->prev_frame_num %= 1<<h->sps.log2_max_frame_num; | |
3788 s->current_picture_ptr->frame_num= h->prev_frame_num; | |
3789 execute_ref_pic_marking(h, NULL, 0); | |
3790 } | |
3791 | |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3792 /* 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
|
3793 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
|
3794 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
|
3795 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
|
3796 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
|
3797 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3798 /* 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
|
3799 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
|
3800 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3801 * 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
|
3802 * 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
|
3803 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3804 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
|
3805 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
|
3806 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3807 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3808 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
|
3809 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
|
3810 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
|
3811 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3812 * 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
|
3813 * 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
|
3814 * 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
|
3815 * purposes. |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3816 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3817 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
|
3818 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
|
3819 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3820 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3821 /* 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
|
3822 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
|
3823 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3824 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3825 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3826 } else { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3827 /* 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
|
3828 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
|
3829 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
|
3830 } |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3831 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3832 if((!FIELD_PICTURE || s0->first_field) && frame_start(h) < 0) { |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
3833 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
|
3834 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
|
3835 } |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
3836 } |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
3837 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
|
3838 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
|
3839 |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
3840 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
|
3841 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3842 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
|
3843 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
|
3844 first_mb_in_slice >= s->mb_num){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3845 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
|
3846 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3847 } |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
3848 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
|
3849 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
|
3850 if (s->picture_structure == PICT_BOTTOM_FIELD) |
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
3851 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
|
3852 assert(s->mb_y < s->mb_height); |
2967 | 3853 |
1168 | 3854 if(s->picture_structure==PICT_FRAME){ |
3855 h->curr_pic_num= h->frame_num; | |
3856 h->max_pic_num= 1<< h->sps.log2_max_frame_num; | |
3857 }else{ | |
5772
65b71bd21a4d
Fix h->curr_pic_num for field pictures. Necessary for proper PAFF support.
andoma
parents:
5771
diff
changeset
|
3858 h->curr_pic_num= 2*h->frame_num + 1; |
1168 | 3859 h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1); |
3860 } | |
2967 | 3861 |
1168 | 3862 if(h->nal_unit_type == NAL_IDR_SLICE){ |
1453 | 3863 get_ue_golomb(&s->gb); /* idr_pic_id */ |
1168 | 3864 } |
2967 | 3865 |
1168 | 3866 if(h->sps.poc_type==0){ |
3867 h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb); | |
2967 | 3868 |
1168 | 3869 if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){ |
3870 h->delta_poc_bottom= get_se_golomb(&s->gb); | |
3871 } | |
3872 } | |
2967 | 3873 |
1168 | 3874 if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){ |
3875 h->delta_poc[0]= get_se_golomb(&s->gb); | |
2967 | 3876 |
1168 | 3877 if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME) |
3878 h->delta_poc[1]= get_se_golomb(&s->gb); | |
3879 } | |
2967 | 3880 |
1168 | 3881 init_poc(h); |
2967 | 3882 |
1168 | 3883 if(h->pps.redundant_pic_cnt_present){ |
3884 h->redundant_pic_count= get_ue_golomb(&s->gb); | |
3885 } | |
3886 | |
7374 | 3887 //set defaults, might be overridden a few lines later |
1168 | 3888 h->ref_count[0]= h->pps.ref_count[0]; |
3889 h->ref_count[1]= h->pps.ref_count[1]; | |
3890 | |
7338 | 3891 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
|
3892 if(h->slice_type_nos == FF_B_TYPE){ |
1168 | 3893 h->direct_spatial_mv_pred= get_bits1(&s->gb); |
3894 } | |
3895 num_ref_idx_active_override_flag= get_bits1(&s->gb); | |
2967 | 3896 |
1168 | 3897 if(num_ref_idx_active_override_flag){ |
3898 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
|
3899 if(h->slice_type_nos==FF_B_TYPE) |
1168 | 3900 h->ref_count[1]= get_ue_golomb(&s->gb) + 1; |
3901 | |
4532 | 3902 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
|
3903 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
|
3904 h->ref_count[0]= h->ref_count[1]= 1; |
1168 | 3905 return -1; |
3906 } | |
3907 } | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
3908 if(h->slice_type_nos == FF_B_TYPE) |
4532 | 3909 h->list_count= 2; |
3910 else | |
3911 h->list_count= 1; | |
3912 }else | |
3913 h->list_count= 0; | |
1168 | 3914 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
3915 if(!default_ref_list_done){ |
1168 | 3916 fill_default_ref_list(h); |
3917 } | |
3918 | |
7417
5b281979b60e
Simple refactoring to resolve a FIXME. Patch by Paul Kendall.
darkshikari
parents:
7408
diff
changeset
|
3919 if(h->slice_type_nos!=FF_I_TYPE && 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
|
3920 return -1; |
1168 | 3921 |
7921
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
3922 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
|
3923 s->last_picture_ptr= &h->ref_list[0][0]; |
7974 | 3924 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
|
3925 } |
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
3926 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
|
3927 s->next_picture_ptr= &h->ref_list[1][0]; |
7974 | 3928 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
|
3929 } |
44570b9b3aa1
Initialize next/last_picture* as the generic code does not always
michael
parents:
7920
diff
changeset
|
3930 |
7339 | 3931 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
|
3932 || (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) |
1168 | 3933 pred_weight_table(h); |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
3934 else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE) |
2415 | 3935 implicit_weight_table(h); |
3936 else | |
3937 h->use_weight = 0; | |
2967 | 3938 |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5713
diff
changeset
|
3939 if(h->nal_ref_idc) |
5642 | 3940 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
|
3941 |
3316 | 3942 if(FRAME_MBAFF) |
3943 fill_mbaff_ref_list(h); | |
3944 | |
7897
004f3c69fe7b
Move direct_dist_scale_factor() and direct_ref_list_init() after fill_mbaff_ref_list()
michael
parents:
7896
diff
changeset
|
3945 if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred) |
004f3c69fe7b
Move direct_dist_scale_factor() and direct_ref_list_init() after fill_mbaff_ref_list()
michael
parents:
7896
diff
changeset
|
3946 direct_dist_scale_factor(h); |
004f3c69fe7b
Move direct_dist_scale_factor() and direct_ref_list_init() after fill_mbaff_ref_list()
michael
parents:
7896
diff
changeset
|
3947 direct_ref_list_init(h); |
004f3c69fe7b
Move direct_dist_scale_factor() and direct_ref_list_init() after fill_mbaff_ref_list()
michael
parents:
7896
diff
changeset
|
3948 |
7338 | 3949 if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){ |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3950 tmp = get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3951 if(tmp > 2){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3952 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
|
3953 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3954 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3955 h->cabac_init_idc= tmp; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3956 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
3957 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
3958 h->last_qscale_diff = 0; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3959 tmp = h->pps.init_qp + get_se_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3960 if(tmp>51){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3961 av_log(s->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp); |
1898 | 3962 return -1; |
3963 } | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3964 s->qscale= tmp; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
3965 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
|
3966 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
1168 | 3967 //FIXME qscale / qp ... stuff |
6481 | 3968 if(h->slice_type == FF_SP_TYPE){ |
1453 | 3969 get_bits1(&s->gb); /* sp_for_switch_flag */ |
1168 | 3970 } |
6481 | 3971 if(h->slice_type==FF_SP_TYPE || h->slice_type == FF_SI_TYPE){ |
1453 | 3972 get_se_golomb(&s->gb); /* slice_qs_delta */ |
1168 | 3973 } |
3974 | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
3975 h->deblocking_filter = 1; |
1898 | 3976 h->slice_alpha_c0_offset = 0; |
3977 h->slice_beta_offset = 0; | |
1168 | 3978 if( h->pps.deblocking_filter_parameters_present ) { |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3979 tmp= get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3980 if(tmp > 2){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3981 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
|
3982 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3983 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
3984 h->deblocking_filter= tmp; |
2967 | 3985 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
|
3986 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
|
3987 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
3988 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
|
3989 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
|
3990 h->slice_beta_offset = get_se_golomb(&s->gb) << 1; |
1168 | 3991 } |
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
|
3992 } |
5642 | 3993 |
5698
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
3994 if( s->avctx->skip_loop_filter >= AVDISCARD_ALL |
7340 | 3995 ||(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
|
3996 ||(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
|
3997 ||(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
|
3998 h->deblocking_filter= 0; |
9a26cb6747a9
Apply skip_loop_filter before checking if we can parallelize with the selected
reimar
parents:
5694
diff
changeset
|
3999 |
5642 | 4000 if(h->deblocking_filter == 1 && h0->max_contexts > 1) { |
5646 | 4001 if(s->avctx->flags2 & CODEC_FLAG2_FAST) { |
4002 /* Cheat slightly for speed: | |
6029 | 4003 Do not bother to deblock across slices. */ |
5646 | 4004 h->deblocking_filter = 2; |
4005 } else { | |
5647 | 4006 h0->max_contexts = 1; |
4007 if(!h0->single_decode_warning) { | |
4008 av_log(s->avctx, AV_LOG_INFO, "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n"); | |
4009 h0->single_decode_warning = 1; | |
4010 } | |
4011 if(h != h0) | |
4012 return 1; // deblocking switched inside frame | |
5646 | 4013 } |
5642 | 4014 } |
4015 | |
1168 | 4016 #if 0 //FMO |
4017 if( h->pps.num_slice_groups > 1 && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5) | |
4018 slice_group_change_cycle= get_bits(&s->gb, ?); | |
4019 #endif | |
4020 | |
5642 | 4021 h0->last_slice_type = slice_type; |
4022 h->slice_num = ++h0->current_slice; | |
2392 | 4023 |
7343 | 4024 for(j=0; j<2; j++){ |
4025 int *ref2frm= h->ref2frm[h->slice_num&15][j]; | |
4026 ref2frm[0]= | |
4027 ref2frm[1]= -1; | |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
4028 for(i=0; i<16; i++) |
7343 | 4029 ref2frm[i+2]= 4*h->ref_list[j][i].frame_num |
4030 +(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
|
4031 ref2frm[18+0]= |
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
4032 ref2frm[18+1]= -1; |
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
4033 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
|
4034 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
|
4035 +(h->ref_list[j][i].reference&3); |
7343 | 4036 } |
4037 | |
3316 | 4038 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
|
4039 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; |
3316 | 4040 |
1168 | 4041 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
|
4042 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
|
4043 h->slice_num, |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
4044 (s->picture_structure==PICT_FRAME ? "F" : s->picture_structure==PICT_TOP_FIELD ? "T" : "B"), |
2967 | 4045 first_mb_in_slice, |
7920
b731ef917a01
Print which slices are IDR not just the slice type.
michael
parents:
7919
diff
changeset
|
4046 av_get_pict_type_char(h->slice_type), h->slice_type_fixed ? " fix" : "", h->nal_unit_type == NAL_IDR_SLICE ? " IDR" : "", |
1168 | 4047 pps_id, h->frame_num, |
4048 s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1], | |
4049 h->ref_count[0], h->ref_count[1], | |
4050 s->qscale, | |
2583 | 4051 h->deblocking_filter, h->slice_alpha_c0_offset/2, h->slice_beta_offset/2, |
2415 | 4052 h->use_weight, |
6890 | 4053 h->use_weight==1 && h->use_weight_chroma ? "c" : "", |
4054 h->slice_type == FF_B_TYPE ? (h->direct_spatial_mv_pred ? "SPAT" : "TEMP") : "" | |
1168 | 4055 ); |
4056 } | |
4057 | |
4058 return 0; | |
4059 } | |
4060 | |
4061 /** | |
4062 * | |
4063 */ | |
4064 static inline int get_level_prefix(GetBitContext *gb){ | |
4065 unsigned int buf; | |
4066 int log; | |
2967 | 4067 |
1168 | 4068 OPEN_READER(re, gb); |
4069 UPDATE_CACHE(re, gb); | |
4070 buf=GET_CACHE(re, gb); | |
2967 | 4071 |
1168 | 4072 log= 32 - av_log2(buf); |
4073 #ifdef TRACE | |
4074 print_bin(buf>>(32-log), log); | |
2272
cd43603c46f9
move h264 idct to its own file and call via function pointer in DspContext
michael
parents:
2255
diff
changeset
|
4075 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d lpr @%5d in %s get_level_prefix\n", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__); |
1168 | 4076 #endif |
4077 | |
4078 LAST_SKIP_BITS(re, gb, log); | |
4079 CLOSE_READER(re, gb); | |
4080 | |
4081 return log-1; | |
4082 } | |
4083 | |
2755 | 4084 static inline int get_dct8x8_allowed(H264Context *h){ |
4085 int i; | |
4086 for(i=0; i<4; i++){ | |
4087 if(!IS_SUB_8X8(h->sub_mb_type[i]) | |
2781
899a2ea0907c
parenthesing to avoid compiler errors in the future - compared asm outputs, behaviour didnt changed
alex
parents:
2774
diff
changeset
|
4088 || (!h->sps.direct_8x8_inference_flag && IS_DIRECT(h->sub_mb_type[i]))) |
2755 | 4089 return 0; |
4090 } | |
4091 return 1; | |
4092 } | |
4093 | |
1168 | 4094 /** |
4095 * decodes a residual block. | |
4096 * @param n block index | |
4097 * @param scantable scantable | |
4098 * @param max_coeff number of coefficients in the block | |
6524 | 4099 * @return <0 if an error occurred |
1168 | 4100 */ |
2919 | 4101 static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){ |
1168 | 4102 MpegEncContext * const s = &h->s; |
4103 static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}; | |
2897 | 4104 int level[16]; |
4105 int zeros_left, coeff_num, coeff_token, total_coeff, i, j, trailing_ones, run_before; | |
1168 | 4106 |
4107 //FIXME put trailing_onex into the context | |
4108 | |
4109 if(n == CHROMA_DC_BLOCK_INDEX){ | |
4110 coeff_token= get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1); | |
4111 total_coeff= coeff_token>>2; | |
2967 | 4112 }else{ |
1168 | 4113 if(n == LUMA_DC_BLOCK_INDEX){ |
4114 total_coeff= pred_non_zero_count(h, 0); | |
4115 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2); | |
4116 total_coeff= coeff_token>>2; | |
4117 }else{ | |
4118 total_coeff= pred_non_zero_count(h, n); | |
4119 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2); | |
4120 total_coeff= coeff_token>>2; | |
4121 h->non_zero_count_cache[ scan8[n] ]= total_coeff; | |
4122 } | |
4123 } | |
4124 | |
4125 //FIXME set last_non_zero? | |
4126 | |
4127 if(total_coeff==0) | |
4128 return 0; | |
4391
20944c70a3c0
fix segfault with darkkben.free.fr/corrupted_h264.mp4
michael
parents:
4390
diff
changeset
|
4129 if(total_coeff > (unsigned)max_coeff) { |
20944c70a3c0
fix segfault with darkkben.free.fr/corrupted_h264.mp4
michael
parents:
4390
diff
changeset
|
4130 av_log(h->s.avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", s->mb_x, s->mb_y, total_coeff); |
4270 | 4131 return -1; |
4132 } | |
2967 | 4133 |
1168 | 4134 trailing_ones= coeff_token&3; |
4600 | 4135 tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff); |
1168 | 4136 assert(total_coeff<=16); |
2967 | 4137 |
1168 | 4138 for(i=0; i<trailing_ones; i++){ |
4139 level[i]= 1 - 2*get_bits1(gb); | |
4140 } | |
4141 | |
2897 | 4142 if(i<total_coeff) { |
1168 | 4143 int level_code, mask; |
2897 | 4144 int suffix_length = total_coeff > 10 && trailing_ones < 3; |
4145 int prefix= get_level_prefix(gb); | |
4146 | |
4147 //first coefficient has suffix_length equal to 0 or 1 | |
1168 | 4148 if(prefix<14){ //FIXME try to build a large unified VLC table for all this |
4149 if(suffix_length) | |
4150 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part | |
4151 else | |
4152 level_code= (prefix<<suffix_length); //part | |
4153 }else if(prefix==14){ | |
4154 if(suffix_length) | |
4155 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part | |
4156 else | |
4157 level_code= prefix + get_bits(gb, 4); //part | |
7225 | 4158 }else{ |
4159 level_code= (15<<suffix_length) + get_bits(gb, prefix-3); //part | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4160 if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense |
7225 | 4161 if(prefix>=16) |
4162 level_code += (1<<(prefix-3))-4096; | |
1168 | 4163 } |
4164 | |
2897 | 4165 if(trailing_ones < 3) level_code += 2; |
4166 | |
4167 suffix_length = 1; | |
4168 if(level_code > 5) | |
4169 suffix_length++; | |
1168 | 4170 mask= -(level_code&1); |
4171 level[i]= (((2+level_code)>>1) ^ mask) - mask; | |
2897 | 4172 i++; |
4173 | |
4174 //remaining coefficients have suffix_length > 0 | |
4175 for(;i<total_coeff;i++) { | |
4176 static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX }; | |
4177 prefix = get_level_prefix(gb); | |
4178 if(prefix<15){ | |
4179 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length); | |
4180 }else{ | |
7225 | 4181 level_code = (15<<suffix_length) + get_bits(gb, prefix-3); |
4182 if(prefix>=16) | |
4183 level_code += (1<<(prefix-3))-4096; | |
2897 | 4184 } |
4185 mask= -(level_code&1); | |
4186 level[i]= (((2+level_code)>>1) ^ mask) - mask; | |
4187 if(level_code > suffix_limit[suffix_length]) | |
4188 suffix_length++; | |
4189 } | |
1168 | 4190 } |
4191 | |
4192 if(total_coeff == max_coeff) | |
4193 zeros_left=0; | |
4194 else{ | |
4195 if(n == CHROMA_DC_BLOCK_INDEX) | |
4196 zeros_left= get_vlc2(gb, chroma_dc_total_zeros_vlc[ total_coeff-1 ].table, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1); | |
4197 else | |
4198 zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff-1 ].table, TOTAL_ZEROS_VLC_BITS, 1); | |
4199 } | |
2897 | 4200 |
4201 coeff_num = zeros_left + total_coeff - 1; | |
4202 j = scantable[coeff_num]; | |
4203 if(n > 24){ | |
4204 block[j] = level[0]; | |
4205 for(i=1;i<total_coeff;i++) { | |
4206 if(zeros_left <= 0) | |
4207 run_before = 0; | |
4208 else if(zeros_left < 7){ | |
4209 run_before= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1); | |
4210 }else{ | |
4211 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); | |
4212 } | |
4213 zeros_left -= run_before; | |
4214 coeff_num -= 1 + run_before; | |
4215 j= scantable[ coeff_num ]; | |
4216 | |
4217 block[j]= level[i]; | |
4218 } | |
4219 }else{ | |
2919 | 4220 block[j] = (level[0] * qmul[j] + 32)>>6; |
2897 | 4221 for(i=1;i<total_coeff;i++) { |
4222 if(zeros_left <= 0) | |
4223 run_before = 0; | |
4224 else if(zeros_left < 7){ | |
4225 run_before= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1); | |
4226 }else{ | |
4227 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); | |
4228 } | |
4229 zeros_left -= run_before; | |
4230 coeff_num -= 1 + run_before; | |
4231 j= scantable[ coeff_num ]; | |
4232 | |
2919 | 4233 block[j]= (level[i] * qmul[j] + 32)>>6; |
2897 | 4234 } |
1168 | 4235 } |
4236 | |
4237 if(zeros_left<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
4238 av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y); |
1168 | 4239 return -1; |
4240 } | |
2897 | 4241 |
1168 | 4242 return 0; |
4243 } | |
4244 | |
3316 | 4245 static void predict_field_decoding_flag(H264Context *h){ |
4246 MpegEncContext * const s = &h->s; | |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
4247 const int mb_xy= h->mb_xy; |
3316 | 4248 int mb_type = (h->slice_table[mb_xy-1] == h->slice_num) |
4249 ? s->current_picture.mb_type[mb_xy-1] | |
4250 : (h->slice_table[mb_xy-s->mb_stride] == h->slice_num) | |
4251 ? s->current_picture.mb_type[mb_xy-s->mb_stride] | |
4252 : 0; | |
4253 h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0; | |
4254 } | |
4255 | |
1168 | 4256 /** |
2396 | 4257 * decodes a P_SKIP or B_SKIP macroblock |
4258 */ | |
4259 static void decode_mb_skip(H264Context *h){ | |
4260 MpegEncContext * const s = &h->s; | |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
4261 const int mb_xy= h->mb_xy; |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4262 int mb_type=0; |
2967 | 4263 |
2396 | 4264 memset(h->non_zero_count[mb_xy], 0, 16); |
4265 memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui | |
4266 | |
3316 | 4267 if(MB_FIELD) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
4268 mb_type|= MB_TYPE_INTERLACED; |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4269 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
4270 if( h->slice_type_nos == FF_B_TYPE ) |
2396 | 4271 { |
4272 // just for fill_caches. pred_direct_motion will set the real mb_type | |
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
4273 mb_type|= MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2|MB_TYPE_SKIP; |
2396 | 4274 |
2449 | 4275 fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ... |
2396 | 4276 pred_direct_motion(h, &mb_type); |
3927 | 4277 mb_type|= MB_TYPE_SKIP; |
2396 | 4278 } |
4279 else | |
4280 { | |
4281 int mx, my; | |
2674
58fb8e1efcae
10l (mb_type uninitalized and then changed and overwritten)
michael
parents:
2673
diff
changeset
|
4282 mb_type|= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_SKIP; |
2396 | 4283 |
2449 | 4284 fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ... |
2396 | 4285 pred_pskip_motion(h, &mx, &my); |
4286 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1); | |
4287 fill_rectangle( h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4); | |
4288 } | |
4289 | |
4290 write_back_motion(h, mb_type); | |
3927 | 4291 s->current_picture.mb_type[mb_xy]= mb_type; |
2396 | 4292 s->current_picture.qscale_table[mb_xy]= s->qscale; |
4293 h->slice_table[ mb_xy ]= h->slice_num; | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
4294 h->prev_mb_skipped= 1; |
2396 | 4295 } |
4296 | |
4297 /** | |
1168 | 4298 * decodes a macroblock |
7374 | 4299 * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed |
1168 | 4300 */ |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4301 static int decode_mb_cavlc(H264Context *h){ |
1168 | 4302 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
4303 int mb_xy; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4304 int partition_count; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4305 unsigned int mb_type, cbp; |
2755 | 4306 int dct8x8_allowed= h->pps.transform_8x8_mode; |
1168 | 4307 |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
4308 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride; |
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
4309 |
2967 | 4310 s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong? |
1168 | 4311 |
4600 | 4312 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); |
1453 | 4313 cbp = 0; /* avoid warning. FIXME: find a solution without slowing |
4314 down the code */ | |
7338 | 4315 if(h->slice_type_nos != FF_I_TYPE){ |
1168 | 4316 if(s->mb_skip_run==-1) |
4317 s->mb_skip_run= get_ue_golomb(&s->gb); | |
2967 | 4318 |
1168 | 4319 if (s->mb_skip_run--) { |
3316 | 4320 if(FRAME_MBAFF && (s->mb_y&1) == 0){ |
4321 if(s->mb_skip_run==0) | |
4322 h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb); | |
4323 else | |
4324 predict_field_decoding_flag(h); | |
4325 } | |
2396 | 4326 decode_mb_skip(h); |
1168 | 4327 return 0; |
4328 } | |
4329 } | |
3316 | 4330 if(FRAME_MBAFF){ |
4331 if( (s->mb_y&1) == 0 ) | |
4332 h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb); | |
7469
856df346b536
Remove useless mb_field_decoding_flag setting code that was at the wrong spot.
michael
parents:
7468
diff
changeset
|
4333 } |
2967 | 4334 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
4335 h->prev_mb_skipped= 0; |
2967 | 4336 |
1168 | 4337 mb_type= get_ue_golomb(&s->gb); |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
4338 if(h->slice_type_nos == FF_B_TYPE){ |
1168 | 4339 if(mb_type < 23){ |
4340 partition_count= b_mb_type_info[mb_type].partition_count; | |
4341 mb_type= b_mb_type_info[mb_type].type; | |
4342 }else{ | |
4343 mb_type -= 23; | |
4344 goto decode_intra_mb; | |
4345 } | |
7340 | 4346 }else if(h->slice_type_nos == FF_P_TYPE){ |
1168 | 4347 if(mb_type < 5){ |
4348 partition_count= p_mb_type_info[mb_type].partition_count; | |
4349 mb_type= p_mb_type_info[mb_type].type; | |
4350 }else{ | |
4351 mb_type -= 5; | |
4352 goto decode_intra_mb; | |
4353 } | |
4354 }else{ | |
7340 | 4355 assert(h->slice_type_nos == FF_I_TYPE); |
4356 if(h->slice_type == FF_SI_TYPE && mb_type) | |
4357 mb_type--; | |
1168 | 4358 decode_intra_mb: |
4359 if(mb_type > 25){ | |
3954 | 4360 av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_pict_type_char(h->slice_type), s->mb_x, s->mb_y); |
1168 | 4361 return -1; |
4362 } | |
4363 partition_count=0; | |
4364 cbp= i_mb_type_info[mb_type].cbp; | |
4365 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode; | |
4366 mb_type= i_mb_type_info[mb_type].type; | |
4367 } | |
4368 | |
3316 | 4369 if(MB_FIELD) |
1168 | 4370 mb_type |= MB_TYPE_INTERLACED; |
4371 | |
4372 h->slice_table[ mb_xy ]= h->slice_num; | |
2967 | 4373 |
1168 | 4374 if(IS_INTRA_PCM(mb_type)){ |
7450 | 4375 unsigned int x; |
2967 | 4376 |
5127 | 4377 // We assume these blocks are very rare so we do not optimize it. |
1168 | 4378 align_get_bits(&s->gb); |
2967 | 4379 |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4380 // The pixels are stored in the same order as levels in h->mb array. |
7450 | 4381 for(x=0; x < (CHROMA ? 384 : 256); x++){ |
4382 ((uint8_t*)h->mb)[x]= get_bits(&s->gb, 8); | |
7407 | 4383 } |
2967 | 4384 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4385 // In deblocking, the quantizer is 0 |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
4386 s->current_picture.qscale_table[mb_xy]= 0; |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4387 // All coeffs are present |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4388 memset(h->non_zero_count[mb_xy], 16, 16); |
2967 | 4389 |
2755 | 4390 s->current_picture.mb_type[mb_xy]= mb_type; |
1168 | 4391 return 0; |
4392 } | |
2967 | 4393 |
3316 | 4394 if(MB_MBAFF){ |
4395 h->ref_count[0] <<= 1; | |
4396 h->ref_count[1] <<= 1; | |
4397 } | |
4398 | |
2449 | 4399 fill_caches(h, mb_type, 0); |
1168 | 4400 |
4401 //mb_pred | |
4402 if(IS_INTRA(mb_type)){ | |
7408 | 4403 int pred_mode; |
1168 | 4404 // init_top_left_availability(h); |
7408 | 4405 if(IS_INTRA4x4(mb_type)){ |
4406 int i; | |
4407 int di = 1; | |
4408 if(dct8x8_allowed && get_bits1(&s->gb)){ | |
4409 mb_type |= MB_TYPE_8x8DCT; | |
4410 di = 4; | |
4411 } | |
1168 | 4412 |
4413 // fill_intra4x4_pred_table(h); | |
7408 | 4414 for(i=0; i<16; i+=di){ |
4415 int mode= pred_intra_mode(h, i); | |
4416 | |
4417 if(!get_bits1(&s->gb)){ | |
4418 const int rem_mode= get_bits(&s->gb, 3); | |
4419 mode = rem_mode + (rem_mode >= mode); | |
1168 | 4420 } |
7408 | 4421 |
4422 if(di==4) | |
4423 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 ); | |
4424 else | |
4425 h->intra4x4_pred_mode_cache[ scan8[i] ] = mode; | |
4426 } | |
4427 write_back_intra_pred_mode(h); | |
4428 if( check_intra4x4_pred_mode(h) < 0) | |
4429 return -1; | |
4430 }else{ | |
4431 h->intra16x16_pred_mode= check_intra_pred_mode(h, h->intra16x16_pred_mode); | |
4432 if(h->intra16x16_pred_mode < 0) | |
4433 return -1; | |
4434 } | |
4435 if(CHROMA){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4436 pred_mode= check_intra_pred_mode(h, get_ue_golomb(&s->gb)); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4437 if(pred_mode < 0) |
1168 | 4438 return -1; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4439 h->chroma_pred_mode= pred_mode; |
7408 | 4440 } |
1168 | 4441 }else if(partition_count==4){ |
4442 int i, j, sub_partition_count[4], list, ref[2][4]; | |
2967 | 4443 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
4444 if(h->slice_type_nos == FF_B_TYPE){ |
1168 | 4445 for(i=0; i<4; i++){ |
4446 h->sub_mb_type[i]= get_ue_golomb(&s->gb); | |
4447 if(h->sub_mb_type[i] >=13){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4448 av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y); |
1168 | 4449 return -1; |
4450 } | |
4451 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; | |
4452 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; | |
4453 } | |
2396 | 4454 if( IS_DIRECT(h->sub_mb_type[0]) || IS_DIRECT(h->sub_mb_type[1]) |
3003 | 4455 || IS_DIRECT(h->sub_mb_type[2]) || IS_DIRECT(h->sub_mb_type[3])) { |
2396 | 4456 pred_direct_motion(h, &mb_type); |
3003 | 4457 h->ref_cache[0][scan8[4]] = |
4458 h->ref_cache[1][scan8[4]] = | |
4459 h->ref_cache[0][scan8[12]] = | |
4460 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; | |
4461 } | |
1168 | 4462 }else{ |
7338 | 4463 assert(h->slice_type_nos == FF_P_TYPE); //FIXME SP correct ? |
1168 | 4464 for(i=0; i<4; i++){ |
4465 h->sub_mb_type[i]= get_ue_golomb(&s->gb); | |
4466 if(h->sub_mb_type[i] >=4){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4467 av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y); |
1168 | 4468 return -1; |
4469 } | |
4470 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; | |
4471 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type; | |
4472 } | |
4473 } | |
2967 | 4474 |
4533 | 4475 for(list=0; list<h->list_count; list++){ |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4476 int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list]; |
1168 | 4477 for(i=0; i<4; i++){ |
2396 | 4478 if(IS_DIRECT(h->sub_mb_type[i])) continue; |
4479 if(IS_DIR(h->sub_mb_type[i], 0, list)){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4480 unsigned int tmp = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip? |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4481 if(tmp>=ref_count){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4482 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4483 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4484 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4485 ref[list][i]= tmp; |
1168 | 4486 }else{ |
4487 //FIXME | |
4488 ref[list][i] = -1; | |
4489 } | |
4490 } | |
4491 } | |
2967 | 4492 |
2755 | 4493 if(dct8x8_allowed) |
4494 dct8x8_allowed = get_dct8x8_allowed(h); | |
2967 | 4495 |
4533 | 4496 for(list=0; list<h->list_count; list++){ |
1168 | 4497 for(i=0; i<4; i++){ |
3003 | 4498 if(IS_DIRECT(h->sub_mb_type[i])) { |
4499 h->ref_cache[list][ scan8[4*i] ] = h->ref_cache[list][ scan8[4*i]+1 ]; | |
4500 continue; | |
4501 } | |
1168 | 4502 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ]= |
4503 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i]; | |
4504 | |
2396 | 4505 if(IS_DIR(h->sub_mb_type[i], 0, list)){ |
1168 | 4506 const int sub_mb_type= h->sub_mb_type[i]; |
4507 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1; | |
4508 for(j=0; j<sub_partition_count[i]; j++){ | |
4509 int mx, my; | |
4510 const int index= 4*i + block_width*j; | |
4511 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ]; | |
4512 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my); | |
4513 mx += get_se_golomb(&s->gb); | |
4514 my += get_se_golomb(&s->gb); | |
4600 | 4515 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4516 |
1168 | 4517 if(IS_SUB_8X8(sub_mb_type)){ |
4530 | 4518 mv_cache[ 1 ][0]= |
1168 | 4519 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx; |
4530 | 4520 mv_cache[ 1 ][1]= |
1168 | 4521 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my; |
4522 }else if(IS_SUB_8X4(sub_mb_type)){ | |
4530 | 4523 mv_cache[ 1 ][0]= mx; |
4524 mv_cache[ 1 ][1]= my; | |
1168 | 4525 }else if(IS_SUB_4X8(sub_mb_type)){ |
4530 | 4526 mv_cache[ 8 ][0]= mx; |
4527 mv_cache[ 8 ][1]= my; | |
1168 | 4528 } |
4530 | 4529 mv_cache[ 0 ][0]= mx; |
4530 mv_cache[ 0 ][1]= my; | |
1168 | 4531 } |
4532 }else{ | |
4533 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0]; | |
4534 p[0] = p[1]= | |
4535 p[8] = p[9]= 0; | |
4536 } | |
4537 } | |
4538 } | |
2396 | 4539 }else if(IS_DIRECT(mb_type)){ |
4540 pred_direct_motion(h, &mb_type); | |
2755 | 4541 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; |
2396 | 4542 }else{ |
1168 | 4543 int list, mx, my, i; |
4544 //FIXME we should set ref_idx_l? to 0 if we use that later ... | |
4545 if(IS_16X16(mb_type)){ | |
4534 | 4546 for(list=0; list<h->list_count; list++){ |
4547 unsigned int val; | |
1168 | 4548 if(IS_DIR(mb_type, 0, list)){ |
4534 | 4549 val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4550 if(val >= h->ref_count[list]){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4551 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4552 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4553 } |
2523 | 4554 }else |
4534 | 4555 val= LIST_NOT_USED&0xFF; |
4556 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1); | |
4557 } | |
4558 for(list=0; list<h->list_count; list++){ | |
4559 unsigned int val; | |
1168 | 4560 if(IS_DIR(mb_type, 0, list)){ |
4561 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); | |
4562 mx += get_se_golomb(&s->gb); | |
4563 my += get_se_golomb(&s->gb); | |
4600 | 4564 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4565 |
4534 | 4566 val= pack16to32(mx,my); |
2523 | 4567 }else |
4534 | 4568 val=0; |
4569 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, val, 4); | |
1168 | 4570 } |
4571 } | |
4572 else if(IS_16X8(mb_type)){ | |
4534 | 4573 for(list=0; list<h->list_count; list++){ |
1168 | 4574 for(i=0; i<2; i++){ |
4534 | 4575 unsigned int val; |
1168 | 4576 if(IS_DIR(mb_type, i, list)){ |
4534 | 4577 val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4578 if(val >= h->ref_count[list]){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4579 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4580 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4581 } |
2523 | 4582 }else |
4534 | 4583 val= LIST_NOT_USED&0xFF; |
4584 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1); | |
1168 | 4585 } |
4534 | 4586 } |
4587 for(list=0; list<h->list_count; list++){ | |
1168 | 4588 for(i=0; i<2; i++){ |
4534 | 4589 unsigned int val; |
1168 | 4590 if(IS_DIR(mb_type, i, list)){ |
4591 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my); | |
4592 mx += get_se_golomb(&s->gb); | |
4593 my += get_se_golomb(&s->gb); | |
4600 | 4594 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4595 |
4534 | 4596 val= pack16to32(mx,my); |
2396 | 4597 }else |
4534 | 4598 val=0; |
4599 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4); | |
1168 | 4600 } |
4601 } | |
4602 }else{ | |
4603 assert(IS_8X16(mb_type)); | |
4534 | 4604 for(list=0; list<h->list_count; list++){ |
1168 | 4605 for(i=0; i<2; i++){ |
4534 | 4606 unsigned int val; |
1168 | 4607 if(IS_DIR(mb_type, i, list)){ //FIXME optimize |
4534 | 4608 val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4609 if(val >= h->ref_count[list]){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4610 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4611 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4612 } |
2523 | 4613 }else |
4534 | 4614 val= LIST_NOT_USED&0xFF; |
4615 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1); | |
1168 | 4616 } |
4534 | 4617 } |
4618 for(list=0; list<h->list_count; list++){ | |
1168 | 4619 for(i=0; i<2; i++){ |
4534 | 4620 unsigned int val; |
1168 | 4621 if(IS_DIR(mb_type, i, list)){ |
4622 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my); | |
4623 mx += get_se_golomb(&s->gb); | |
4624 my += get_se_golomb(&s->gb); | |
4600 | 4625 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1170 | 4626 |
4534 | 4627 val= pack16to32(mx,my); |
2396 | 4628 }else |
4534 | 4629 val=0; |
4630 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4); | |
1168 | 4631 } |
4632 } | |
4633 } | |
4634 } | |
2967 | 4635 |
1168 | 4636 if(IS_INTER(mb_type)) |
4637 write_back_motion(h, mb_type); | |
2967 | 4638 |
1168 | 4639 if(!IS_INTRA16x16(mb_type)){ |
4640 cbp= get_ue_golomb(&s->gb); | |
4641 if(cbp > 47){ | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
4642 av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y); |
1168 | 4643 return -1; |
4644 } | |
2967 | 4645 |
7407 | 4646 if(CHROMA){ |
7408 | 4647 if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp[cbp]; |
4648 else cbp= golomb_to_inter_cbp [cbp]; | |
7407 | 4649 }else{ |
4650 if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp]; | |
4651 else cbp= golomb_to_inter_cbp_gray[cbp]; | |
4652 } | |
1168 | 4653 } |
3651 | 4654 h->cbp = cbp; |
1168 | 4655 |
2755 | 4656 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){ |
7378 | 4657 if(get_bits1(&s->gb)){ |
2755 | 4658 mb_type |= MB_TYPE_8x8DCT; |
7378 | 4659 h->cbp_table[mb_xy]= cbp; |
4660 } | |
2755 | 4661 } |
4662 s->current_picture.mb_type[mb_xy]= mb_type; | |
4663 | |
1168 | 4664 if(cbp || IS_INTRA16x16(mb_type)){ |
4665 int i8x8, i4x4, chroma_idx; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4666 int dquant; |
1168 | 4667 GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr; |
3174 | 4668 const uint8_t *scan, *scan8x8, *dc_scan; |
2967 | 4669 |
1168 | 4670 // fill_non_zero_count_cache(h); |
4671 | |
4672 if(IS_INTERLACED(mb_type)){ | |
3316 | 4673 scan8x8= s->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0; |
2763 | 4674 scan= s->qscale ? h->field_scan : h->field_scan_q0; |
1168 | 4675 dc_scan= luma_dc_field_scan; |
4676 }else{ | |
3316 | 4677 scan8x8= s->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0; |
2763 | 4678 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; |
1168 | 4679 dc_scan= luma_dc_zigzag_scan; |
4680 } | |
4681 | |
4682 dquant= get_se_golomb(&s->gb); | |
4683 | |
4684 if( dquant > 25 || dquant < -26 ){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
4685 av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y); |
1168 | 4686 return -1; |
4687 } | |
2967 | 4688 |
1168 | 4689 s->qscale += dquant; |
4690 if(((unsigned)s->qscale) > 51){ | |
4691 if(s->qscale<0) s->qscale+= 52; | |
4692 else s->qscale-= 52; | |
4693 } | |
2967 | 4694 |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4695 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
|
4696 h->chroma_qp[1]= get_chroma_qp(h, 1, s->qscale); |
1168 | 4697 if(IS_INTRA16x16(mb_type)){ |
2919 | 4698 if( decode_residual(h, h->intra_gb_ptr, h->mb, LUMA_DC_BLOCK_INDEX, dc_scan, h->dequant4_coeff[0][s->qscale], 16) < 0){ |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
4699 return -1; //FIXME continue if partitioned and other return -1 too |
1168 | 4700 } |
4701 | |
4702 assert((cbp&15) == 0 || (cbp&15) == 15); | |
4703 | |
4704 if(cbp&15){ | |
4705 for(i8x8=0; i8x8<4; i8x8++){ | |
4706 for(i4x4=0; i4x4<4; i4x4++){ | |
4707 const int index= i4x4 + 4*i8x8; | |
2919 | 4708 if( decode_residual(h, h->intra_gb_ptr, h->mb + 16*index, index, scan + 1, h->dequant4_coeff[0][s->qscale], 15) < 0 ){ |
1168 | 4709 return -1; |
4710 } | |
4711 } | |
4712 } | |
4713 }else{ | |
1636 | 4714 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1); |
1168 | 4715 } |
4716 }else{ | |
4717 for(i8x8=0; i8x8<4; i8x8++){ | |
4718 if(cbp & (1<<i8x8)){ | |
2755 | 4719 if(IS_8x8DCT(mb_type)){ |
4720 DCTELEM *buf = &h->mb[64*i8x8]; | |
2757 | 4721 uint8_t *nnz; |
2755 | 4722 for(i4x4=0; i4x4<4; i4x4++){ |
3174 | 4723 if( decode_residual(h, gb, buf, i4x4+4*i8x8, scan8x8+16*i4x4, |
2919 | 4724 h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 16) <0 ) |
2755 | 4725 return -1; |
4726 } | |
2757 | 4727 nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ]; |
3105
2d35fb3cb940
h264: special case dc-only idct. ~1% faster overall
lorenm
parents:
3101
diff
changeset
|
4728 nnz[0] += nnz[1] + nnz[8] + nnz[9]; |
2755 | 4729 }else{ |
4730 for(i4x4=0; i4x4<4; i4x4++){ | |
4731 const int index= i4x4 + 4*i8x8; | |
2967 | 4732 |
2919 | 4733 if( decode_residual(h, gb, h->mb + 16*index, index, scan, h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale], 16) <0 ){ |
2755 | 4734 return -1; |
4735 } | |
1168 | 4736 } |
4737 } | |
4738 }else{ | |
4739 uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ]; | |
4740 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0; | |
4741 } | |
4742 } | |
4743 } | |
2967 | 4744 |
1168 | 4745 if(cbp&0x30){ |
4746 for(chroma_idx=0; chroma_idx<2; chroma_idx++) | |
2919 | 4747 if( decode_residual(h, gb, h->mb + 256 + 16*4*chroma_idx, CHROMA_DC_BLOCK_INDEX, chroma_dc_scan, NULL, 4) < 0){ |
1168 | 4748 return -1; |
4749 } | |
4750 } | |
4751 | |
4752 if(cbp&0x20){ | |
4753 for(chroma_idx=0; chroma_idx<2; chroma_idx++){ | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
4754 const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]]; |
1168 | 4755 for(i4x4=0; i4x4<4; i4x4++){ |
4756 const int index= 16 + 4*chroma_idx + i4x4; | |
5225
099c495618c1
Compute the dequant coefficient table ptr outside the loop,
gpoirier
parents:
5215
diff
changeset
|
4757 if( decode_residual(h, gb, h->mb + 16*index, index, scan + 1, qmul, 15) < 0){ |
1168 | 4758 return -1; |
4759 } | |
4760 } | |
4761 } | |
4762 }else{ | |
4763 uint8_t * const nnz= &h->non_zero_count_cache[0]; | |
4764 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = | |
4765 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; | |
4766 } | |
4767 }else{ | |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4768 uint8_t * const nnz= &h->non_zero_count_cache[0]; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4769 fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1); |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4770 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
4771 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; |
1168 | 4772 } |
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
|
4773 s->current_picture.qscale_table[mb_xy]= s->qscale; |
1168 | 4774 write_back_non_zero_count(h); |
4775 | |
3316 | 4776 if(MB_MBAFF){ |
4777 h->ref_count[0] >>= 1; | |
4778 h->ref_count[1] >>= 1; | |
4779 } | |
4780 | |
1168 | 4781 return 0; |
4782 } | |
4783 | |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4784 static int decode_cabac_field_decoding_flag(H264Context *h) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4785 MpegEncContext * const s = &h->s; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4786 const int mb_x = s->mb_x; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4787 const int mb_y = s->mb_y & ~1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4788 const int mba_xy = mb_x - 1 + mb_y *s->mb_stride; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4789 const int mbb_xy = mb_x + (mb_y-2)*s->mb_stride; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4790 |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4791 unsigned int ctx = 0; |
2967 | 4792 |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4793 if( h->slice_table[mba_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4794 ctx += 1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4795 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4796 if( h->slice_table[mbb_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) { |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4797 ctx += 1; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4798 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4799 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4800 return get_cabac_noinline( &h->cabac, &h->cabac_state[70 + ctx] ); |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4801 } |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4802 |
2312 | 4803 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) { |
4804 uint8_t *state= &h->cabac_state[ctx_base]; | |
4805 int mb_type; | |
2967 | 4806 |
2312 | 4807 if(intra_slice){ |
4808 MpegEncContext * const s = &h->s; | |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
4809 const int mba_xy = h->left_mb_xy[0]; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
4810 const int mbb_xy = h->top_mb_xy; |
2312 | 4811 int ctx=0; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4812 if( h->slice_table[mba_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mba_xy] ) ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4813 ctx++; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4814 if( h->slice_table[mbb_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mbb_xy] ) ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4815 ctx++; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4816 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 ) |
2312 | 4817 return 0; /* I4x4 */ |
4818 state += 2; | |
4819 }else{ | |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4820 if( get_cabac_noinline( &h->cabac, &state[0] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4821 return 0; /* I4x4 */ |
2312 | 4822 } |
4823 | |
4824 if( get_cabac_terminate( &h->cabac ) ) | |
4825 return 25; /* PCM */ | |
4826 | |
4827 mb_type = 1; /* I16x16 */ | |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4828 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */ |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4829 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */ |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4830 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] ); |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4831 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] ); |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4832 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] ); |
2312 | 4833 return mb_type; |
4834 } | |
4835 | |
4836 static int decode_cabac_mb_type( H264Context *h ) { | |
4837 MpegEncContext * const s = &h->s; | |
4838 | |
7340 | 4839 if( h->slice_type_nos == FF_I_TYPE ) { |
2312 | 4840 return decode_cabac_intra_mb_type(h, 3, 1); |
7340 | 4841 } else if( h->slice_type_nos == FF_P_TYPE ) { |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4842 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4843 /* P-type */ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4844 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) { |
3138 | 4845 /* P_L0_D16x16, P_8x8 */ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4846 return 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4847 } else { |
3138 | 4848 /* P_L0_D8x16, P_L0_D16x8 */ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4849 return 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4850 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4851 } else { |
2312 | 4852 return decode_cabac_intra_mb_type(h, 17, 0) + 5; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4853 } |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
4854 } else if( h->slice_type_nos == FF_B_TYPE ) { |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
4855 const int mba_xy = h->left_mb_xy[0]; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
4856 const int mbb_xy = h->top_mb_xy; |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4857 int ctx = 0; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4858 int bits; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4859 |
3138 | 4860 if( h->slice_table[mba_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mba_xy] ) ) |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4861 ctx++; |
3138 | 4862 if( h->slice_table[mbb_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mbb_xy] ) ) |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4863 ctx++; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4864 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4865 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ) |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4866 return 0; /* B_Direct_16x16 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4867 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4868 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) { |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4869 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */ |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4870 } |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4871 |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4872 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3; |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4873 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2; |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4874 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1; |
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4875 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4876 if( bits < 8 ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4877 return bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4878 else if( bits == 13 ) { |
2312 | 4879 return decode_cabac_intra_mb_type(h, 32, 0) + 23; |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4880 } else if( bits == 14 ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4881 return 11; /* B_L1_L0_8x16 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4882 else if( bits == 15 ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4883 return 22; /* B_8x8 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4884 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4885 bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4886 return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */ |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4887 } else { |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
4888 /* TODO SI/SP frames? */ |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4889 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
|
4890 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4891 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4892 |
3316 | 4893 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4894 MpegEncContext * const s = &h->s; |
3316 | 4895 int mba_xy, mbb_xy; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4896 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4897 |
3316 | 4898 if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches? |
4899 int mb_xy = mb_x + (mb_y&~1)*s->mb_stride; | |
4900 mba_xy = mb_xy - 1; | |
4901 if( (mb_y&1) | |
4902 && h->slice_table[mba_xy] == h->slice_num | |
4903 && MB_FIELD == !!IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) | |
4904 mba_xy += s->mb_stride; | |
4905 if( MB_FIELD ){ | |
4906 mbb_xy = mb_xy - s->mb_stride; | |
4907 if( !(mb_y&1) | |
4908 && h->slice_table[mbb_xy] == h->slice_num | |
4909 && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) | |
4910 mbb_xy -= s->mb_stride; | |
4911 }else | |
4912 mbb_xy = mb_x + (mb_y-1)*s->mb_stride; | |
4913 }else{ | |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
4914 int mb_xy = h->mb_xy; |
3316 | 4915 mba_xy = mb_xy - 1; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
4916 mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); |
3316 | 4917 } |
4918 | |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4919 if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mba_xy] )) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4920 ctx++; |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4921 if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mbb_xy] )) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4922 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4923 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
4924 if( h->slice_type_nos == FF_B_TYPE ) |
3138 | 4925 ctx += 13; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4926 return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4927 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4928 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4929 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4930 int mode = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4931 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4932 if( get_cabac( &h->cabac, &h->cabac_state[68] ) ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4933 return pred_mode; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4934 |
2928 | 4935 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] ); |
4936 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] ); | |
4937 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] ); | |
4938 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4939 if( mode >= pred_mode ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4940 return mode + 1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4941 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4942 return mode; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4943 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4944 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4945 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) { |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4946 const int mba_xy = h->left_mb_xy[0]; |
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
4947 const int mbb_xy = h->top_mb_xy; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4948 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4949 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4950 |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
4951 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */ |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4952 if( h->slice_table[mba_xy] == h->slice_num && h->chroma_pred_mode_table[mba_xy] != 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4953 ctx++; |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
4954 |
2498
4d6d056a00c6
H.264 multiple slice support in CABAC patch by (Loic (lll+ffmpeg m4x org)
michael
parents:
2485
diff
changeset
|
4955 if( h->slice_table[mbb_xy] == h->slice_num && h->chroma_pred_mode_table[mbb_xy] != 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4956 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4957 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4958 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4959 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
|
4960 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4961 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4962 return 1; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4963 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4964 return 2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4965 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4966 return 3; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4967 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4968 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4969 static int decode_cabac_mb_cbp_luma( H264Context *h) { |
5694
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4970 int cbp_b, cbp_a, ctx, cbp = 0; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4971 |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4972 cbp_a = h->slice_table[h->left_mb_xy[0]] == h->slice_num ? h->left_cbp : -1; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4973 cbp_b = h->slice_table[h->top_mb_xy] == h->slice_num ? h->top_cbp : -1; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4974 |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4975 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4976 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4977 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4978 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4979 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4980 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2; |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4981 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02); |
7c2ce28a0314
Simplify H.264 decode_cabac_mb_cbp_luma(), giving a ~0.5% speedup.
diego
parents:
5685
diff
changeset
|
4982 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4983 return cbp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4984 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4985 static int decode_cabac_mb_cbp_chroma( H264Context *h) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4986 int ctx; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4987 int cbp_a, cbp_b; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4988 |
2314 | 4989 cbp_a = (h->left_cbp>>4)&0x03; |
4990 cbp_b = (h-> top_cbp>>4)&0x03; | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4991 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4992 ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4993 if( cbp_a > 0 ) ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4994 if( cbp_b > 0 ) ctx += 2; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
4995 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4996 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
|
4997 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4998 ctx = 4; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
4999 if( cbp_a == 2 ) ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5000 if( cbp_b == 2 ) ctx += 2; |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5001 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5002 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5003 static int decode_cabac_mb_dqp( H264Context *h) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5004 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5005 int val = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5006 |
3316 | 5007 if( h->last_qscale_diff != 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5008 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5009 |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5010 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5011 if( ctx < 2 ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5012 ctx = 2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5013 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5014 ctx = 3; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5015 val++; |
3128 | 5016 if(val > 102) //prevent infinite loop |
2844
5f20ab245501
prevent assert failures and infinite loops with broken streams
michael
parents:
2834
diff
changeset
|
5017 return INT_MIN; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5018 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5019 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5020 if( val&0x01 ) |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5021 return (val + 1)/2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5022 else |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5023 return -(val + 1)/2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5024 } |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5025 static int decode_cabac_p_mb_sub_type( H264Context *h ) { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5026 if( get_cabac( &h->cabac, &h->cabac_state[21] ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5027 return 0; /* 8x8 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5028 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5029 return 1; /* 8x4 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5030 if( get_cabac( &h->cabac, &h->cabac_state[23] ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5031 return 2; /* 4x8 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5032 return 3; /* 4x4 */ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5033 } |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5034 static int decode_cabac_b_mb_sub_type( H264Context *h ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5035 int type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5036 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5037 return 0; /* B_Direct_8x8 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5038 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) ) |
2311
cdbb2f30e08b
small typo patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
2310
diff
changeset
|
5039 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */ |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5040 type = 3; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5041 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5042 if( get_cabac( &h->cabac, &h->cabac_state[39] ) ) |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5043 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5044 type += 4; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5045 } |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5046 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5047 type += get_cabac( &h->cabac, &h->cabac_state[39] ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5048 return type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5049 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5050 |
2755 | 5051 static inline int decode_cabac_mb_transform_size( H264Context *h ) { |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
5052 return get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ); |
2755 | 5053 } |
5054 | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5055 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5056 int refa = h->ref_cache[list][scan8[n] - 1]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5057 int refb = h->ref_cache[list][scan8[n] - 8]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5058 int ref = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5059 int ctx = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5060 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
5061 if( h->slice_type_nos == FF_B_TYPE) { |
2396 | 5062 if( refa > 0 && !h->direct_cache[scan8[n] - 1] ) |
5063 ctx++; | |
5064 if( refb > 0 && !h->direct_cache[scan8[n] - 8] ) | |
5065 ctx += 2; | |
5066 } else { | |
5067 if( refa > 0 ) | |
5068 ctx++; | |
5069 if( refb > 0 ) | |
5070 ctx += 2; | |
5071 } | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5072 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5073 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5074 ref++; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5075 if( ctx < 4 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5076 ctx = 4; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5077 else |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5078 ctx = 5; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5079 if(ref >= 32 /*h->ref_list[list]*/){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5080 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_ref\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5081 return 0; //FIXME we should return -1 and check the return everywhere |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5082 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5083 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5084 return ref; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5085 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5086 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5087 static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5088 int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) + |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5089 abs( h->mvd_cache[list][scan8[n] - 8][l] ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5090 int ctxbase = (l == 0) ? 40 : 47; |
2317 | 5091 int ctx, mvd; |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5092 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5093 if( amvd < 3 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5094 ctx = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5095 else if( amvd > 32 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5096 ctx = 2; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5097 else |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5098 ctx = 1; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5099 |
2317 | 5100 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+ctx])) |
5101 return 0; | |
5102 | |
5103 mvd= 1; | |
5104 ctx= 3; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5105 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5106 mvd++; |
2317 | 5107 if( ctx < 6 ) |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5108 ctx++; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5109 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5110 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5111 if( mvd >= 9 ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5112 int k = 3; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5113 while( get_cabac_bypass( &h->cabac ) ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5114 mvd += 1 << k; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5115 k++; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5116 if(k>24){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5117 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5118 return INT_MIN; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5119 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5120 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5121 while( k-- ) { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5122 if( get_cabac_bypass( &h->cabac ) ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5123 mvd += 1 << k; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5124 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5125 } |
4042 | 5126 return get_cabac_bypass_sign( &h->cabac, -mvd ); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5127 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5128 |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5129 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int is_dc ) { |
2314 | 5130 int nza, nzb; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5131 int ctx = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5132 |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5133 if( is_dc ) { |
7181 | 5134 if( cat == 0 ) { |
5135 nza = h->left_cbp&0x100; | |
5136 nzb = h-> top_cbp&0x100; | |
5137 } else { | |
5138 nza = (h->left_cbp>>(6+idx))&0x01; | |
5139 nzb = (h-> top_cbp>>(6+idx))&0x01; | |
5140 } | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5141 } else { |
7183
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5142 if( cat == 4 ) { |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5143 nza = h->non_zero_count_cache[scan8[16+idx] - 1]; |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5144 nzb = h->non_zero_count_cache[scan8[16+idx] - 8]; |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5145 } else { |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5146 assert(cat == 1 || cat == 2); |
7181 | 5147 nza = h->non_zero_count_cache[scan8[idx] - 1]; |
5148 nzb = h->non_zero_count_cache[scan8[idx] - 8]; | |
5149 } | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5150 } |
2314 | 5151 |
5152 if( nza > 0 ) | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5153 ctx++; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5154 |
2314 | 5155 if( nzb > 0 ) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5156 ctx += 2; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5157 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5158 return ctx + 4 * cat; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5159 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5160 |
6753 | 5161 DECLARE_ASM_CONST(1, uint8_t, last_coeff_flag_offset_8x8[63]) = { |
4051 | 5162 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
5163 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
5164 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
5165 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8 | |
5166 }; | |
5167 | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5168 static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff, int is_dc ) { |
3316 | 5169 static const int significant_coeff_flag_offset[2][6] = { |
5170 { 105+0, 105+15, 105+29, 105+44, 105+47, 402 }, | |
5171 { 277+0, 277+15, 277+29, 277+44, 277+47, 436 } | |
5172 }; | |
5173 static const int last_coeff_flag_offset[2][6] = { | |
5174 { 166+0, 166+15, 166+29, 166+44, 166+47, 417 }, | |
5175 { 338+0, 338+15, 338+29, 338+44, 338+47, 451 } | |
5176 }; | |
5177 static const int coeff_abs_level_m1_offset[6] = { | |
5178 227+0, 227+10, 227+20, 227+30, 227+39, 426 | |
5179 }; | |
4007 | 5180 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = { |
3316 | 5181 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5, |
2755 | 5182 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7, |
5183 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11, | |
3316 | 5184 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 }, |
5185 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5, | |
5186 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11, | |
5187 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9, | |
5188 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 } | |
2755 | 5189 }; |
6749
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5190 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0). |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5191 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter). |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5192 * map node ctx => cabac ctx for level=1 */ |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5193 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 }; |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5194 /* map node ctx => cabac ctx for level>1 */ |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5195 static const uint8_t coeff_abs_levelgt1_ctx[8] = { 5, 5, 5, 5, 6, 7, 8, 9 }; |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5196 static const uint8_t coeff_abs_level_transition[2][8] = { |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5197 /* update node ctx after decoding a level=1 */ |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5198 { 1, 2, 3, 3, 4, 5, 6, 7 }, |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5199 /* update node ctx after decoding a level>1 */ |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5200 { 4, 4, 4, 4, 5, 6, 7, 7 } |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5201 }; |
2755 | 5202 |
5203 int index[64]; | |
2313 | 5204 |
5262 | 5205 int av_unused last; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5206 int coeff_count = 0; |
6749
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5207 int node_ctx = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5208 |
2898 | 5209 uint8_t *significant_coeff_ctx_base; |
5210 uint8_t *last_coeff_ctx_base; | |
5211 uint8_t *abs_level_m1_ctx_base; | |
2755 | 5212 |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5213 #ifndef ARCH_X86 |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5214 #define CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5215 #endif |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5216 #ifdef CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5217 #define CC &cc |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5218 CABACContext cc; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5219 cc.range = h->cabac.range; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5220 cc.low = h->cabac.low; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5221 cc.bytestream= h->cabac.bytestream; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5222 #else |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5223 #define CC &h->cabac |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5224 #endif |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5225 |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5226 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5227 /* cat: 0-> DC 16x16 n = 0 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5228 * 1-> AC 16x16 n = luma4x4idx |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5229 * 2-> Luma4x4 n = luma4x4idx |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5230 * 3-> DC Chroma n = iCbCr |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5231 * 4-> AC Chroma n = 4 * iCbCr + chroma4x4idx |
2755 | 5232 * 5-> Luma8x8 n = 4 * luma8x8idx |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5233 */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5234 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5235 /* read coded block flag */ |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5236 if( is_dc || cat != 5 ) { |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5237 if( get_cabac( CC, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n, is_dc ) ] ) == 0 ) { |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5238 if( !is_dc ) { |
7183
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5239 if( cat == 4 ) |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5240 h->non_zero_count_cache[scan8[16+n]] = 0; |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5241 else |
7181 | 5242 h->non_zero_count_cache[scan8[n]] = 0; |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5243 } |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5244 |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5245 #ifdef CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5246 h->cabac.range = cc.range ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5247 h->cabac.low = cc.low ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5248 h->cabac.bytestream= cc.bytestream; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5249 #endif |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5250 return; |
2755 | 5251 } |
2898 | 5252 } |
5253 | |
5254 significant_coeff_ctx_base = h->cabac_state | |
3316 | 5255 + significant_coeff_flag_offset[MB_FIELD][cat]; |
2898 | 5256 last_coeff_ctx_base = h->cabac_state |
3316 | 5257 + last_coeff_flag_offset[MB_FIELD][cat]; |
2898 | 5258 abs_level_m1_ctx_base = h->cabac_state |
5259 + coeff_abs_level_m1_offset[cat]; | |
5260 | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5261 if( !is_dc && cat == 5 ) { |
2898 | 5262 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \ |
5263 for(last= 0; last < coefs; last++) { \ | |
5264 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \ | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5265 if( get_cabac( CC, sig_ctx )) { \ |
2898 | 5266 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \ |
5267 index[coeff_count++] = last; \ | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5268 if( get_cabac( CC, last_ctx ) ) { \ |
2898 | 5269 last= max_coeff; \ |
5270 break; \ | |
5271 } \ | |
5272 } \ | |
4037
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5273 }\ |
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5274 if( last == max_coeff -1 ) {\ |
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5275 index[coeff_count++] = last;\ |
2898 | 5276 } |
4009 | 5277 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD]; |
5547 | 5278 #if defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS) |
4051 | 5279 coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off); |
5280 } else { | |
5281 coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index); | |
5282 #else | |
3316 | 5283 DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] ); |
2898 | 5284 } else { |
5285 DECODE_SIGNIFICANCE( max_coeff - 1, last, last ); | |
4037
53be304c7f54
x86 asm version of the decode significance loop (not 8x8) of decode_residual() 5% faster decode_residual() on P3
michael
parents:
4016
diff
changeset
|
5286 #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
|
5287 } |
2316 | 5288 assert(coeff_count > 0); |
5289 | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5290 if( is_dc ) { |
7181 | 5291 if( cat == 0 ) |
5292 h->cbp_table[h->mb_xy] |= 0x100; | |
5293 else | |
5294 h->cbp_table[h->mb_xy] |= 0x40 << n; | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5295 } else { |
7183
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5296 if( cat == 5 ) |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5297 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1); |
7181 | 5298 else if( cat == 4 ) |
5299 h->non_zero_count_cache[scan8[16+n]] = coeff_count; | |
5300 else { | |
7183
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5301 assert( cat == 1 || cat == 2 ); |
db32d2544050
Reorder the if/else for residual cats to match gcc's branch prediction.
astrange
parents:
7182
diff
changeset
|
5302 h->non_zero_count_cache[scan8[n]] = coeff_count; |
7181 | 5303 } |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5304 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5305 |
7444
a9da32d66fec
Small h264 decoding speed optimization: while->do/while
darkshikari
parents:
7424
diff
changeset
|
5306 do { |
6749
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5307 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5308 |
7444
a9da32d66fec
Small h264 decoding speed optimization: while->do/while
darkshikari
parents:
7424
diff
changeset
|
5309 int j= scantable[index[--coeff_count]]; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5310 |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5311 if( get_cabac( CC, ctx ) == 0 ) { |
6749
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5312 node_ctx = coeff_abs_level_transition[0][node_ctx]; |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5313 if( is_dc ) { |
4040 | 5314 block[j] = get_cabac_bypass_sign( CC, -1); |
2316 | 5315 }else{ |
6377 | 5316 block[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; |
2316 | 5317 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5318 } else { |
2313 | 5319 int coeff_abs = 2; |
6749
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5320 ctx = coeff_abs_levelgt1_ctx[node_ctx] + abs_level_m1_ctx_base; |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5321 node_ctx = coeff_abs_level_transition[1][node_ctx]; |
b1778cf7f3b1
Use a state machine to reduce branching logic in decode_cabac_residual.
astrange
parents:
6717
diff
changeset
|
5322 |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5323 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { |
2313 | 5324 coeff_abs++; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5325 } |
2313 | 5326 |
5327 if( coeff_abs >= 15 ) { | |
5328 int j = 0; | |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5329 while( get_cabac_bypass( CC ) ) { |
2313 | 5330 j++; |
5331 } | |
2967 | 5332 |
4016 | 5333 coeff_abs=1; |
2313 | 5334 while( j-- ) { |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5335 coeff_abs += coeff_abs + get_cabac_bypass( CC ); |
2313 | 5336 } |
4016 | 5337 coeff_abs+= 14; |
2313 | 5338 } |
5339 | |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5340 if( is_dc ) { |
7184 | 5341 block[j] = get_cabac_bypass_sign( CC, -coeff_abs ); |
2316 | 5342 }else{ |
7184 | 5343 block[j] = (get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32) >> 6; |
2316 | 5344 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5345 } |
7444
a9da32d66fec
Small h264 decoding speed optimization: while->do/while
darkshikari
parents:
7424
diff
changeset
|
5346 } while( coeff_count ); |
4038
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5347 #ifdef CABAC_ON_STACK |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5348 h->cabac.range = cc.range ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5349 h->cabac.low = cc.low ; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5350 h->cabac.bytestream= cc.bytestream; |
16697bdf4ac2
copy cabac context onto the stack for the c code in decode_cabac_residual() (15% faster on P3 but still slower then the current asm)
michael
parents:
4037
diff
changeset
|
5351 #endif |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5352 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5353 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5354 |
7180
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5355 #ifndef CONFIG_SMALL |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5356 static void decode_cabac_residual_dc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) { |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5357 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 1); |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5358 } |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5359 |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5360 static void decode_cabac_residual_nondc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) { |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5361 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0); |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5362 } |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5363 #endif |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5364 |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5365 static void decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) { |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5366 #ifdef CONFIG_SMALL |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5367 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, cat == 0 || cat == 3); |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5368 #else |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5369 if( cat == 0 || cat == 3 ) decode_cabac_residual_dc(h, block, cat, n, scantable, qmul, max_coeff); |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5370 else decode_cabac_residual_nondc(h, block, cat, n, scantable, qmul, max_coeff); |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5371 #endif |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5372 } |
4acdafd254bf
Clone decode_cabac_residual() for DC residuals, to get rid of a bunch of branches in the main loop.
astrange
parents:
7179
diff
changeset
|
5373 |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4896
diff
changeset
|
5374 static inline void compute_mb_neighbors(H264Context *h) |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5375 { |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5376 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
5377 const int mb_xy = h->mb_xy; |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5378 h->top_mb_xy = mb_xy - s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5379 h->left_mb_xy[0] = mb_xy - 1; |
3316 | 5380 if(FRAME_MBAFF){ |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5381 const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5382 const int top_pair_xy = pair_xy - s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5383 const int top_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]); |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5384 const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]); |
3316 | 5385 const int curr_mb_frame_flag = !MB_FIELD; |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5386 const int bottom = (s->mb_y & 1); |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5387 if (bottom |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5388 ? !curr_mb_frame_flag // bottom macroblock |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5389 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5390 ) { |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5391 h->top_mb_xy -= s->mb_stride; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5392 } |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5393 if (left_mb_frame_flag != curr_mb_frame_flag) { |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5394 h->left_mb_xy[0] = pair_xy - 1; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5395 } |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
5396 } else if (FIELD_PICTURE) { |
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
5397 h->top_mb_xy -= s->mb_stride; |
2597
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5398 } |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5399 return; |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5400 } |
b5b09255f7c3
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer < lll+ffmpeg m4x org)
michael
parents:
2594
diff
changeset
|
5401 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5402 /** |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5403 * decodes a macroblock |
7374 | 5404 * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5405 */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5406 static int decode_mb_cabac(H264Context *h) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5407 MpegEncContext * const s = &h->s; |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
5408 int mb_xy; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5409 int mb_type, partition_count, cbp = 0; |
2755 | 5410 int dct8x8_allowed= h->pps.transform_8x8_mode; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5411 |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
5412 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride; |
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
5413 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5414 s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong?) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5415 |
4600 | 5416 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); |
7338 | 5417 if( h->slice_type_nos != FF_I_TYPE ) { |
3316 | 5418 int skip; |
5419 /* a skipped mb needs the aff flag from the following mb */ | |
5420 if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 ) | |
5421 predict_field_decoding_flag(h); | |
5422 if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped ) | |
5423 skip = h->next_mb_skipped; | |
5424 else | |
5425 skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y ); | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5426 /* read skip flags */ |
3316 | 5427 if( skip ) { |
5428 if( FRAME_MBAFF && (s->mb_y&1)==0 ){ | |
5429 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP; | |
5430 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 ); | |
5431 if(h->next_mb_skipped) | |
5432 predict_field_decoding_flag(h); | |
5433 else | |
5434 h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); | |
5435 } | |
5436 | |
2396 | 5437 decode_mb_skip(h); |
5438 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5439 h->cbp_table[mb_xy] = 0; |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5440 h->chroma_pred_mode_table[mb_xy] = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5441 h->last_qscale_diff = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5442 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5443 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
|
5444 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5445 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5446 } |
3316 | 5447 if(FRAME_MBAFF){ |
5448 if( (s->mb_y&1) == 0 ) | |
5449 h->mb_mbaff = | |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5450 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); |
7469
856df346b536
Remove useless mb_field_decoding_flag setting code that was at the wrong spot.
michael
parents:
7468
diff
changeset
|
5451 } |
2594
5357b214eda0
CABAC support for MBAFF I frames patch by (Lo«Ác Le Loarer | lll+ffmpeg m4x org)
michael
parents:
2583
diff
changeset
|
5452 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
5453 h->prev_mb_skipped = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5454 |
3077 | 5455 compute_mb_neighbors(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5456 if( ( mb_type = decode_cabac_mb_type( h ) ) < 0 ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5457 av_log( h->s.avctx, AV_LOG_ERROR, "decode_cabac_mb_type failed\n" ); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5458 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
|
5459 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5460 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
5461 if( h->slice_type_nos == FF_B_TYPE ) { |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5462 if( mb_type < 23 ){ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5463 partition_count= b_mb_type_info[mb_type].partition_count; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5464 mb_type= b_mb_type_info[mb_type].type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5465 }else{ |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5466 mb_type -= 23; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5467 goto decode_intra_mb; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5468 } |
7340 | 5469 } else if( h->slice_type_nos == FF_P_TYPE ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5470 if( mb_type < 5) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5471 partition_count= p_mb_type_info[mb_type].partition_count; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5472 mb_type= p_mb_type_info[mb_type].type; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5473 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5474 mb_type -= 5; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5475 goto decode_intra_mb; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5476 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5477 } else { |
7340 | 5478 if(h->slice_type == FF_SI_TYPE && mb_type) |
5479 mb_type--; | |
5480 assert(h->slice_type_nos == FF_I_TYPE); | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5481 decode_intra_mb: |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5482 partition_count = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5483 cbp= i_mb_type_info[mb_type].cbp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5484 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5485 mb_type= i_mb_type_info[mb_type].type; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5486 } |
3316 | 5487 if(MB_FIELD) |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5488 mb_type |= MB_TYPE_INTERLACED; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5489 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5490 h->slice_table[ mb_xy ]= h->slice_num; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5491 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5492 if(IS_INTRA_PCM(mb_type)) { |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5493 const uint8_t *ptr; |
2967 | 5494 |
5127 | 5495 // We assume these blocks are very rare so we do not optimize it. |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5496 // FIXME The two following lines get the bitstream position in the cabac |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5497 // decode, I think it should be done by a function in cabac.h (or cabac.c). |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5498 ptr= h->cabac.bytestream; |
4344 | 5499 if(h->cabac.low&0x1) ptr--; |
5500 if(CABAC_BITS==16){ | |
5501 if(h->cabac.low&0x1FF) ptr--; | |
5502 } | |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5503 |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5504 // The pixels are stored in the same order as levels in h->mb array. |
7450 | 5505 memcpy(h->mb, ptr, 256); ptr+=256; |
7407 | 5506 if(CHROMA){ |
7450 | 5507 memcpy(h->mb+128, ptr, 128); ptr+=128; |
7407 | 5508 } |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5509 |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5510 ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr); |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5511 |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5512 // All blocks are present |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5513 h->cbp_table[mb_xy] = 0x1ef; |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5514 h->chroma_pred_mode_table[mb_xy] = 0; |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5515 // In deblocking, the quantizer is 0 |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5516 s->current_picture.qscale_table[mb_xy]= 0; |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
5517 // All coeffs are present |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5518 memset(h->non_zero_count[mb_xy], 16, 16); |
2755 | 5519 s->current_picture.mb_type[mb_xy]= mb_type; |
7237
9a5cdba22eeb
H264: Fix decoding with CABAC/delta_qp/PCM macroblocks.
astrange
parents:
7225
diff
changeset
|
5520 h->last_qscale_diff = 0; |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
5521 return 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5522 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5523 |
3316 | 5524 if(MB_MBAFF){ |
5525 h->ref_count[0] <<= 1; | |
5526 h->ref_count[1] <<= 1; | |
5527 } | |
5528 | |
2449 | 5529 fill_caches(h, mb_type, 0); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5530 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5531 if( IS_INTRA( mb_type ) ) { |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
5532 int i, pred_mode; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5533 if( IS_INTRA4x4( mb_type ) ) { |
2755 | 5534 if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) { |
5535 mb_type |= MB_TYPE_8x8DCT; | |
5536 for( i = 0; i < 16; i+=4 ) { | |
5537 int pred = pred_intra_mode( h, i ); | |
5538 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred ); | |
5539 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 ); | |
5540 } | |
5541 } else { | |
5542 for( i = 0; i < 16; i++ ) { | |
5543 int pred = pred_intra_mode( h, i ); | |
5544 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred ); | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5545 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5546 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] ); |
2755 | 5547 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5548 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5549 write_back_intra_pred_mode(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5550 if( check_intra4x4_pred_mode(h) < 0 ) return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5551 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5552 h->intra16x16_pred_mode= check_intra_pred_mode( h, h->intra16x16_pred_mode ); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5553 if( h->intra16x16_pred_mode < 0 ) return -1; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5554 } |
7407 | 5555 if(CHROMA){ |
7408 | 5556 h->chroma_pred_mode_table[mb_xy] = |
5557 pred_mode = decode_cabac_mb_chroma_pre_mode( h ); | |
5558 | |
5559 pred_mode= check_intra_pred_mode( h, pred_mode ); | |
5560 if( pred_mode < 0 ) return -1; | |
5561 h->chroma_pred_mode= pred_mode; | |
7407 | 5562 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5563 } else if( partition_count == 4 ) { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5564 int i, j, sub_partition_count[4], list, ref[2][4]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5565 |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
5566 if( h->slice_type_nos == FF_B_TYPE ) { |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5567 for( i = 0; i < 4; i++ ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5568 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5569 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5570 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5571 } |
3482 | 5572 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] | |
5573 h->sub_mb_type[2] | h->sub_mb_type[3]) ) { | |
2396 | 5574 pred_direct_motion(h, &mb_type); |
5425 | 5575 h->ref_cache[0][scan8[4]] = |
5576 h->ref_cache[1][scan8[4]] = | |
5577 h->ref_cache[0][scan8[12]] = | |
5578 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; | |
2396 | 5579 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) { |
5580 for( i = 0; i < 4; i++ ) | |
5581 if( IS_DIRECT(h->sub_mb_type[i]) ) | |
5582 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 ); | |
5583 } | |
5584 } | |
2310
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5585 } else { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5586 for( i = 0; i < 4; i++ ) { |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5587 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h ); |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5588 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5589 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type; |
c5cd8a064c34
H.264 CABAC + B-frames patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2284
diff
changeset
|
5590 } |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5591 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5592 |
4533 | 5593 for( list = 0; list < h->list_count; list++ ) { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5594 for( i = 0; i < 4; i++ ) { |
2396 | 5595 if(IS_DIRECT(h->sub_mb_type[i])) continue; |
5596 if(IS_DIR(h->sub_mb_type[i], 0, list)){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5597 if( h->ref_count[list] > 1 ) |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5598 ref[list][i] = decode_cabac_mb_ref( h, list, 4*i ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5599 else |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5600 ref[list][i] = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5601 } else { |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5602 ref[list][i] = -1; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5603 } |
2110 | 5604 h->ref_cache[list][ scan8[4*i]+1 ]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5605 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5606 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5607 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5608 |
2755 | 5609 if(dct8x8_allowed) |
5610 dct8x8_allowed = get_dct8x8_allowed(h); | |
5611 | |
4533 | 5612 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5613 for(i=0; i<4; i++){ |
5425 | 5614 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ]; |
2396 | 5615 if(IS_DIRECT(h->sub_mb_type[i])){ |
5616 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4); | |
5617 continue; | |
5618 } | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5619 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5620 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5621 const int sub_mb_type= h->sub_mb_type[i]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5622 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5623 for(j=0; j<sub_partition_count[i]; j++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5624 int mpx, mpy; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5625 int mx, my; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5626 const int index= 4*i + block_width*j; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5627 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5628 int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5629 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5630 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5631 mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5632 my = mpy + decode_cabac_mb_mvd( h, list, index, 1 ); |
4600 | 5633 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5634 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5635 if(IS_SUB_8X8(sub_mb_type)){ |
4530 | 5636 mv_cache[ 1 ][0]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5637 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx; |
4530 | 5638 mv_cache[ 1 ][1]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5639 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5640 |
4530 | 5641 mvd_cache[ 1 ][0]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5642 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx; |
4530 | 5643 mvd_cache[ 1 ][1]= |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5644 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5645 }else if(IS_SUB_8X4(sub_mb_type)){ |
4530 | 5646 mv_cache[ 1 ][0]= mx; |
5647 mv_cache[ 1 ][1]= my; | |
5648 | |
5649 mvd_cache[ 1 ][0]= mx - mpx; | |
5650 mvd_cache[ 1 ][1]= my - mpy; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5651 }else if(IS_SUB_4X8(sub_mb_type)){ |
4530 | 5652 mv_cache[ 8 ][0]= mx; |
5653 mv_cache[ 8 ][1]= my; | |
5654 | |
5655 mvd_cache[ 8 ][0]= mx - mpx; | |
5656 mvd_cache[ 8 ][1]= my - mpy; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5657 } |
4530 | 5658 mv_cache[ 0 ][0]= mx; |
5659 mv_cache[ 0 ][1]= my; | |
5660 | |
5661 mvd_cache[ 0 ][0]= mx - mpx; | |
5662 mvd_cache[ 0 ][1]= my - mpy; | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5663 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5664 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5665 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5666 uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0]; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5667 p[0] = p[1] = p[8] = p[9] = 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5668 pd[0]= pd[1]= pd[8]= pd[9]= 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5669 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5670 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5671 } |
2396 | 5672 } else if( IS_DIRECT(mb_type) ) { |
5673 pred_direct_motion(h, &mb_type); | |
5674 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4); | |
5675 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4); | |
2755 | 5676 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; |
2396 | 5677 } else { |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5678 int list, mx, my, i, mpx, mpy; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5679 if(IS_16X16(mb_type)){ |
4534 | 5680 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5681 if(IS_DIR(mb_type, 0, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5682 const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5683 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1); |
2523 | 5684 }else |
4534 | 5685 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too |
5686 } | |
5687 for(list=0; list<h->list_count; list++){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5688 if(IS_DIR(mb_type, 0, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5689 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5690 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5691 mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5692 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 ); |
4600 | 5693 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5694 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5695 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5696 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); |
2523 | 5697 }else |
5698 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5699 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5700 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5701 else if(IS_16X8(mb_type)){ |
4533 | 5702 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5703 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5704 if(IS_DIR(mb_type, i, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5705 const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 8*i ) : 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5706 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1); |
2396 | 5707 }else |
5708 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5709 } |
4533 | 5710 } |
5711 for(list=0; list<h->list_count; list++){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5712 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5713 if(IS_DIR(mb_type, i, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5714 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5715 mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5716 my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 ); |
4600 | 5717 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5718 |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5719 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5720 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); |
2523 | 5721 }else{ |
2396 | 5722 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); |
5723 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5724 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5725 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5726 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5727 }else{ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5728 assert(IS_8X16(mb_type)); |
4533 | 5729 for(list=0; list<h->list_count; list++){ |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5730 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5731 if(IS_DIR(mb_type, i, list)){ //FIXME optimize |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5732 const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 4*i ) : 0; |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5733 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1); |
2396 | 5734 }else |
5735 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5736 } |
4533 | 5737 } |
5738 for(list=0; list<h->list_count; list++){ | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5739 for(i=0; i<2; i++){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5740 if(IS_DIR(mb_type, i, list)){ |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5741 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5742 mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5743 my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 ); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5744 |
4600 | 5745 tprintf(s->avctx, "final mv:%d %d\n", mx, my); |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5746 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4); |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5747 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4); |
2523 | 5748 }else{ |
2396 | 5749 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); |
5750 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); | |
1935
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5751 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5752 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5753 } |
e935af90767b
progressive P frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1909
diff
changeset
|
5754 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5755 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5756 |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5757 if( IS_INTER( mb_type ) ) { |
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5758 h->chroma_pred_mode_table[mb_xy] = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5759 write_back_motion( h, mb_type ); |
1956
0eb2947f56f6
h264 hurry up fix and a tiny cabac clean patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1935
diff
changeset
|
5760 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5761 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5762 if( !IS_INTRA16x16( mb_type ) ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5763 cbp = decode_cabac_mb_cbp_luma( h ); |
7407 | 5764 if(CHROMA) |
7408 | 5765 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5766 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5767 |
3651 | 5768 h->cbp_table[mb_xy] = h->cbp = cbp; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5769 |
2755 | 5770 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) { |
5771 if( decode_cabac_mb_transform_size( h ) ) | |
5772 mb_type |= MB_TYPE_8x8DCT; | |
5773 } | |
5774 s->current_picture.mb_type[mb_xy]= mb_type; | |
5775 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5776 if( cbp || IS_INTRA16x16( mb_type ) ) { |
3174 | 5777 const uint8_t *scan, *scan8x8, *dc_scan; |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5778 const uint32_t *qmul; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5779 int dqp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5780 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5781 if(IS_INTERLACED(mb_type)){ |
3316 | 5782 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0; |
2763 | 5783 scan= s->qscale ? h->field_scan : h->field_scan_q0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5784 dc_scan= luma_dc_field_scan; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5785 }else{ |
3316 | 5786 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0; |
2763 | 5787 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5788 dc_scan= luma_dc_zigzag_scan; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5789 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5790 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5791 h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h ); |
2883
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5792 if( dqp == INT_MIN ){ |
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5793 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y); |
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5794 return -1; |
a95e55679dfa
check return value of decode_cabac_mb_dqp, it is INT_MIN on error.
reimar
parents:
2867
diff
changeset
|
5795 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5796 s->qscale += dqp; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5797 if(((unsigned)s->qscale) > 51){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5798 if(s->qscale<0) s->qscale+= 52; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5799 else s->qscale-= 52; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5800 } |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
5801 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
|
5802 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5803 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5804 if( IS_INTRA16x16( mb_type ) ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5805 int i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5806 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" ); |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5807 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16); |
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5808 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5809 if( cbp&15 ) { |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5810 qmul = h->dequant4_coeff[0][s->qscale]; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5811 for( i = 0; i < 16; i++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5812 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i ); |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5813 decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, qmul, 15); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5814 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5815 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5816 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5817 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5818 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5819 int i8x8, i4x4; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5820 for( i8x8 = 0; i8x8 < 4; i8x8++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5821 if( cbp & (1<<i8x8) ) { |
2755 | 5822 if( IS_8x8DCT(mb_type) ) { |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5823 decode_cabac_residual(h, h->mb + 64*i8x8, 5, 4*i8x8, |
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5824 scan8x8, h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 64); |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5825 } else { |
5713 | 5826 qmul = h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale]; |
5827 for( i4x4 = 0; i4x4 < 4; i4x4++ ) { | |
5828 const int index = 4*i8x8 + i4x4; | |
5829 //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index ); | |
3972
f5f1c9af095d
move outcommented START/STOP_TIMER to a hopefully better place for benchmarking ...
michael
parents:
3955
diff
changeset
|
5830 //START_TIMER |
5713 | 5831 decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, qmul, 16); |
3972
f5f1c9af095d
move outcommented START/STOP_TIMER to a hopefully better place for benchmarking ...
michael
parents:
3955
diff
changeset
|
5832 //STOP_TIMER("decode_residual") |
5713 | 5833 } |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5834 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5835 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5836 uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ]; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5837 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5838 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5839 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5840 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5841 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5842 if( cbp&0x30 ){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5843 int c; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5844 for( c = 0; c < 2; c++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5845 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c ); |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5846 decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, NULL, 4); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5847 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5848 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5849 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5850 if( cbp&0x20 ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5851 int c, i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5852 for( c = 0; c < 2; c++ ) { |
5705
c08c9340c7ca
factor out dequant table lookup outside loops, gives a 1-2% speed-up
gpoirier
parents:
5698
diff
changeset
|
5853 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]]; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5854 for( i = 0; i < 4; i++ ) { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5855 const int index = 16 + 4 * c + i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5856 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 ); |
5528
4c3b1222ff57
Don't check the return value of decode_cabac_residual since it always
conrad
parents:
5508
diff
changeset
|
5857 decode_cabac_residual(h, h->mb + 16*index, 4, index - 16, scan + 1, qmul, 15); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5858 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5859 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5860 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5861 uint8_t * const nnz= &h->non_zero_count_cache[0]; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5862 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5863 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5864 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5865 } else { |
2315 | 5866 uint8_t * const nnz= &h->non_zero_count_cache[0]; |
5867 fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1); | |
5868 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] = | |
5869 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0; | |
3316 | 5870 h->last_qscale_diff = 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5871 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5872 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5873 s->current_picture.qscale_table[mb_xy]= s->qscale; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5874 write_back_non_zero_count(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5875 |
3316 | 5876 if(MB_MBAFF){ |
5877 h->ref_count[0] >>= 1; | |
5878 h->ref_count[1] >>= 1; | |
5879 } | |
5880 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5881 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
|
5882 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5883 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
5884 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
5885 static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5886 int i, d; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5887 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5888 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5889 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5890 |
2633 | 5891 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
5892 int8_t tc[4]; |
2633 | 5893 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5894 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1; |
2633 | 5895 h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc); |
5896 } else { | |
5897 /* 16px edge length, because bS=4 is triggered by being at | |
5898 * the edge of an intra MB, so all 4 bS are the same */ | |
5899 for( d = 0; d < 16; d++ ) { | |
1898 | 5900 const int p0 = pix[-1]; |
5901 const int p1 = pix[-2]; | |
5902 const int p2 = pix[-3]; | |
5903 | |
5904 const int q0 = pix[0]; | |
5905 const int q1 = pix[1]; | |
5906 const int q2 = pix[2]; | |
5907 | |
4001 | 5908 if( FFABS( p0 - q0 ) < alpha && |
5909 FFABS( p1 - p0 ) < beta && | |
5910 FFABS( q1 - q0 ) < beta ) { | |
5911 | |
5912 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ | |
5913 if( FFABS( p2 - p0 ) < beta) | |
1898 | 5914 { |
5915 const int p3 = pix[-4]; | |
5916 /* p0', p1', p2' */ | |
5917 pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; | |
5918 pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; | |
5919 pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; | |
5920 } else { | |
5921 /* p0' */ | |
5922 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
5923 } | |
4001 | 5924 if( FFABS( q2 - q0 ) < beta) |
1898 | 5925 { |
5926 const int q3 = pix[3]; | |
5927 /* q0', q1', q2' */ | |
5928 pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; | |
5929 pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; | |
5930 pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; | |
5931 } else { | |
5932 /* q0' */ | |
5933 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
5934 } | |
5935 }else{ | |
5936 /* p0', q0' */ | |
5937 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
5938 pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
5939 } | |
4600 | 5940 tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, p2, p1, p0, q0, q1, q2, pix[-2], pix[-1], pix[0], pix[1]); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5941 } |
1898 | 5942 pix += stride; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5943 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5944 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5945 } |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
5946 static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
2834 | 5947 int i; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5948 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5949 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5950 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5951 |
2633 | 5952 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
5953 int8_t tc[4]; |
2633 | 5954 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5955 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0; |
2633 | 5956 h->s.dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc); |
5957 } else { | |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
5958 h->s.dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5959 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5960 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
5961 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
5962 static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) { |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5963 int i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5964 for( i = 0; i < 16; i++, pix += stride) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5965 int index_a; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5966 int alpha; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5967 int beta; |
2967 | 5968 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5969 int qp_index; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5970 int bS_index = (i >> 1); |
3316 | 5971 if (!MB_FIELD) { |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5972 bS_index &= ~1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5973 bS_index |= (i & 1); |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5974 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5975 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5976 if( bS[bS_index] == 0 ) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5977 continue; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5978 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5979 |
3316 | 5980 qp_index = MB_FIELD ? (i >> 3) : (i & 1); |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5981 index_a = qp[qp_index] + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5982 alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5983 beta = (beta_table+52)[qp[qp_index] + h->slice_beta_offset]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5984 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5985 if( bS[bS_index] < 4 ) { |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
5986 const int tc0 = (tc0_table+52)[index_a][bS[bS_index] - 1]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5987 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5988 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5989 const int p2 = pix[-3]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5990 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5991 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5992 const int q2 = pix[2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5993 |
4001 | 5994 if( FFABS( p0 - q0 ) < alpha && |
5995 FFABS( p1 - p0 ) < beta && | |
5996 FFABS( q1 - q0 ) < beta ) { | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5997 int tc = tc0; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5998 int i_delta; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
5999 |
4001 | 6000 if( FFABS( p2 - p0 ) < beta ) { |
4594 | 6001 pix[-2] = p1 + av_clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 ); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6002 tc++; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6003 } |
4001 | 6004 if( FFABS( q2 - q0 ) < beta ) { |
4594 | 6005 pix[1] = q1 + av_clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 ); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6006 tc++; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6007 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6008 |
4594 | 6009 i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc ); |
6010 pix[-1] = av_clip_uint8( p0 + i_delta ); /* p0' */ | |
6011 pix[0] = av_clip_uint8( q0 - i_delta ); /* q0' */ | |
4600 | 6012 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6013 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6014 }else{ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6015 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6016 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6017 const int p2 = pix[-3]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6018 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6019 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6020 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6021 const int q2 = pix[2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6022 |
4001 | 6023 if( FFABS( p0 - q0 ) < alpha && |
6024 FFABS( p1 - p0 ) < beta && | |
6025 FFABS( q1 - q0 ) < beta ) { | |
6026 | |
6027 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ | |
6028 if( FFABS( p2 - p0 ) < beta) | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6029 { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6030 const int p3 = pix[-4]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6031 /* p0', p1', p2' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6032 pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6033 pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6034 pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6035 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6036 /* p0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6037 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6038 } |
4001 | 6039 if( FFABS( q2 - q0 ) < beta) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6040 { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6041 const int q3 = pix[3]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6042 /* q0', q1', q2' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6043 pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6044 pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6045 pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6046 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6047 /* q0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6048 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6049 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6050 }else{ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6051 /* p0', q0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6052 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6053 pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6054 } |
4600 | 6055 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, p2, p1, p0, q0, q1, q2, pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6056 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6057 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6058 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6059 } |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6060 static void filter_mb_mbaff_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) { |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6061 int i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6062 for( i = 0; i < 8; i++, pix += stride) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6063 int index_a; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6064 int alpha; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6065 int beta; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6066 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6067 int qp_index; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6068 int bS_index = i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6069 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6070 if( bS[bS_index] == 0 ) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6071 continue; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6072 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6073 |
3316 | 6074 qp_index = MB_FIELD ? (i >> 2) : (i & 1); |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6075 index_a = qp[qp_index] + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6076 alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6077 beta = (beta_table+52)[qp[qp_index] + h->slice_beta_offset]; |
3316 | 6078 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6079 if( bS[bS_index] < 4 ) { |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6080 const int tc = (tc0_table+52)[index_a][bS[bS_index] - 1] + 1; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6081 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6082 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6083 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6084 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6085 |
4001 | 6086 if( FFABS( p0 - q0 ) < alpha && |
6087 FFABS( p1 - p0 ) < beta && | |
6088 FFABS( q1 - q0 ) < beta ) { | |
4594 | 6089 const int i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc ); |
6090 | |
6091 pix[-1] = av_clip_uint8( p0 + i_delta ); /* p0' */ | |
6092 pix[0] = av_clip_uint8( q0 - i_delta ); /* q0' */ | |
4600 | 6093 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6094 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6095 }else{ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6096 const int p0 = pix[-1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6097 const int p1 = pix[-2]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6098 const int q0 = pix[0]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6099 const int q1 = pix[1]; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6100 |
4001 | 6101 if( FFABS( p0 - q0 ) < alpha && |
6102 FFABS( p1 - p0 ) < beta && | |
6103 FFABS( q1 - q0 ) < beta ) { | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6104 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6105 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2; /* p0' */ |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6106 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; /* q0' */ |
4600 | 6107 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]\n", i, pix[-3], p1, p0, q0, q1, pix[2], pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6108 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6109 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6110 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6111 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6112 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6113 static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6114 int i, d; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6115 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6116 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6117 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6118 const int pix_next = stride; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6119 |
2633 | 6120 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6121 int8_t tc[4]; |
2633 | 6122 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6123 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1; |
2633 | 6124 h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc); |
6125 } else { | |
6126 /* 16px edge length, see filter_mb_edgev */ | |
6127 for( d = 0; d < 16; d++ ) { | |
1898 | 6128 const int p0 = pix[-1*pix_next]; |
6129 const int p1 = pix[-2*pix_next]; | |
6130 const int p2 = pix[-3*pix_next]; | |
6131 const int q0 = pix[0]; | |
6132 const int q1 = pix[1*pix_next]; | |
6133 const int q2 = pix[2*pix_next]; | |
6134 | |
4001 | 6135 if( FFABS( p0 - q0 ) < alpha && |
6136 FFABS( p1 - p0 ) < beta && | |
6137 FFABS( q1 - q0 ) < beta ) { | |
1898 | 6138 |
6139 const int p3 = pix[-4*pix_next]; | |
6140 const int q3 = pix[ 3*pix_next]; | |
6141 | |
4001 | 6142 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ |
6143 if( FFABS( p2 - p0 ) < beta) { | |
1898 | 6144 /* p0', p1', p2' */ |
6145 pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; | |
6146 pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; | |
6147 pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; | |
6148 } else { | |
6149 /* p0' */ | |
6150 pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
6151 } | |
4001 | 6152 if( FFABS( q2 - q0 ) < beta) { |
1898 | 6153 /* q0', q1', q2' */ |
6154 pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; | |
6155 pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; | |
6156 pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; | |
6157 } else { | |
6158 /* q0' */ | |
6159 pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
6160 } | |
6161 }else{ | |
6162 /* p0', q0' */ | |
6163 pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2; | |
6164 pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2; | |
6165 } | |
4600 | 6166 tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, qp, index_a, alpha, beta, bS[i], p2, p1, p0, q0, q1, q2, pix[-2*pix_next], pix[-pix_next], pix[0], pix[pix_next]); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6167 } |
1898 | 6168 pix++; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6169 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6170 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6171 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6172 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6173 static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { |
2834 | 6174 int i; |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6175 const int index_a = qp + h->slice_alpha_c0_offset; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6176 const int alpha = (alpha_table+52)[index_a]; |
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6177 const int beta = (beta_table+52)[qp + h->slice_beta_offset]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6178 |
2633 | 6179 if( bS[0] < 4 ) { |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6180 int8_t tc[4]; |
2633 | 6181 for(i=0; i<4; i++) |
4118
a1786732cd62
merge clip() into the alpha/beta/tc0 tables (10% faster filter_mb_fast() on P3)
michael
parents:
4113
diff
changeset
|
6182 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0; |
2633 | 6183 h->s.dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc); |
6184 } else { | |
2707
360024d31dab
H.264 deblocking optimizations (mmx for chroma_bS4 case, convert existing cases to 8-bit math)
lorenm
parents:
2683
diff
changeset
|
6185 h->s.dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6186 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6187 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6188 |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6189 static void filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6190 MpegEncContext * const s = &h->s; |
5883
c64d94561b19
Fix deblocking filter for field pictures by properly looking for first
heydowns
parents:
5878
diff
changeset
|
6191 int mb_y_firstrow = s->picture_structure == PICT_BOTTOM_FIELD; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6192 int mb_xy, mb_type; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6193 int qp, qp0, qp1, qpc, qpc0, qpc1, qp_thresh; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6194 |
6783
df0893f4fd86
Store mb_xy in H264Context and only calculate it once per MB.
astrange
parents:
6753
diff
changeset
|
6195 mb_xy = h->mb_xy; |
5093
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6196 |
5883
c64d94561b19
Fix deblocking filter for field pictures by properly looking for first
heydowns
parents:
5878
diff
changeset
|
6197 if(mb_x==0 || mb_y==mb_y_firstrow || !s->dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff || |
7332 | 6198 1 || |
5093
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6199 (h->deblocking_filter == 2 && (h->slice_table[mb_xy] != h->slice_table[h->top_mb_xy] || |
f0ffa056b77c
filter_mb_fast() doesn't handle h->deblocking_filter==2 (skip slice edges), so delegate that case to filter_mb().
lorenm
parents:
5083
diff
changeset
|
6200 h->slice_table[mb_xy] != h->slice_table[mb_xy - 1]))) { |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6201 filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6202 return; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6203 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6204 assert(!FRAME_MBAFF); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6205 |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6206 mb_type = s->current_picture.mb_type[mb_xy]; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6207 qp = s->current_picture.qscale_table[mb_xy]; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6208 qp0 = s->current_picture.qscale_table[mb_xy-1]; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6209 qp1 = s->current_picture.qscale_table[h->top_mb_xy]; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6210 qpc = get_chroma_qp( h, 0, qp ); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6211 qpc0 = get_chroma_qp( h, 0, qp0 ); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6212 qpc1 = get_chroma_qp( h, 0, qp1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6213 qp0 = (qp + qp0 + 1) >> 1; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6214 qp1 = (qp + qp1 + 1) >> 1; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6215 qpc0 = (qpc + qpc0 + 1) >> 1; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6216 qpc1 = (qpc + qpc1 + 1) >> 1; |
3651 | 6217 qp_thresh = 15 - h->slice_alpha_c0_offset; |
6218 if(qp <= qp_thresh && qp0 <= qp_thresh && qp1 <= qp_thresh && | |
6219 qpc <= qp_thresh && qpc0 <= qp_thresh && qpc1 <= qp_thresh) | |
6220 return; | |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6221 |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6222 if( IS_INTRA(mb_type) ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6223 int16_t bS4[4] = {4,4,4,4}; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6224 int16_t bS3[4] = {3,3,3,3}; |
5797 | 6225 int16_t *bSH = FIELD_PICTURE ? bS3 : bS4; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6226 if( IS_8x8DCT(mb_type) ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6227 filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6228 filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp ); |
5797 | 6229 filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6230 filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6231 } else { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6232 filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6233 filter_mb_edgev( h, &img_y[4*1], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6234 filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6235 filter_mb_edgev( h, &img_y[4*3], linesize, bS3, qp ); |
5797 | 6236 filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6237 filter_mb_edgeh( h, &img_y[4*1*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6238 filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6239 filter_mb_edgeh( h, &img_y[4*3*linesize], linesize, bS3, qp ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6240 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6241 filter_mb_edgecv( h, &img_cb[2*0], uvlinesize, bS4, qpc0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6242 filter_mb_edgecv( h, &img_cb[2*2], uvlinesize, bS3, qpc ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6243 filter_mb_edgecv( h, &img_cr[2*0], uvlinesize, bS4, qpc0 ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6244 filter_mb_edgecv( h, &img_cr[2*2], uvlinesize, bS3, qpc ); |
5797 | 6245 filter_mb_edgech( h, &img_cb[2*0*uvlinesize], uvlinesize, bSH, qpc1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6246 filter_mb_edgech( h, &img_cb[2*2*uvlinesize], uvlinesize, bS3, qpc ); |
5797 | 6247 filter_mb_edgech( h, &img_cr[2*0*uvlinesize], uvlinesize, bSH, qpc1 ); |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6248 filter_mb_edgech( h, &img_cr[2*2*uvlinesize], uvlinesize, bS3, qpc ); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6249 return; |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6250 } else { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6251 DECLARE_ALIGNED_8(int16_t, bS[2][4][4]); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6252 uint64_t (*bSv)[4] = (uint64_t(*)[4])bS; |
3651 | 6253 int edges; |
6254 if( IS_8x8DCT(mb_type) && (h->cbp&7) == 7 ) { | |
6255 edges = 4; | |
6256 bSv[0][0] = bSv[0][2] = bSv[1][0] = bSv[1][2] = 0x0002000200020002ULL; | |
6257 } else { | |
6258 int mask_edge1 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : | |
6259 (mb_type & MB_TYPE_16x8) ? 1 : 0; | |
6260 int mask_edge0 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) | |
6261 && (s->current_picture.mb_type[mb_xy-1] & (MB_TYPE_16x16 | MB_TYPE_8x16)) | |
6262 ? 3 : 0; | |
6263 int step = IS_8x8DCT(mb_type) ? 2 : 1; | |
6264 edges = (mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4; | |
6265 s->dsp.h264_loop_filter_strength( bS, h->non_zero_count_cache, h->ref_cache, h->mv_cache, | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
6266 (h->slice_type_nos == FF_B_TYPE), edges, step, mask_edge0, mask_edge1, FIELD_PICTURE); |
3651 | 6267 } |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6268 if( IS_INTRA(s->current_picture.mb_type[mb_xy-1]) ) |
5822
b49be74d387c
Fix mix-up of values in r10690 (deblocking for PAFF).
cehoyos
parents:
5815
diff
changeset
|
6269 bSv[0][0] = 0x0004000400040004ULL; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6270 if( IS_INTRA(s->current_picture.mb_type[h->top_mb_xy]) ) |
5822
b49be74d387c
Fix mix-up of values in r10690 (deblocking for PAFF).
cehoyos
parents:
5815
diff
changeset
|
6271 bSv[1][0] = FIELD_PICTURE ? 0x0003000300030003ULL : 0x0004000400040004ULL; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6272 |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6273 #define FILTER(hv,dir,edge)\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6274 if(bSv[dir][edge]) {\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6275 filter_mb_edge##hv( h, &img_y[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qp : qp##dir );\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6276 if(!(edge&1)) {\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6277 filter_mb_edgec##hv( h, &img_cb[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6278 filter_mb_edgec##hv( h, &img_cr[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6279 }\ |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6280 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6281 if( edges == 1 ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6282 FILTER(v,0,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6283 FILTER(h,1,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6284 } else if( IS_8x8DCT(mb_type) ) { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6285 FILTER(v,0,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6286 FILTER(v,0,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6287 FILTER(h,1,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6288 FILTER(h,1,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6289 } else { |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6290 FILTER(v,0,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6291 FILTER(v,0,1); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6292 FILTER(v,0,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6293 FILTER(v,0,3); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6294 FILTER(h,1,0); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6295 FILTER(h,1,1); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6296 FILTER(h,1,2); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6297 FILTER(h,1,3); |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6298 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6299 #undef FILTER |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6300 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6301 } |
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6302 |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6303 static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6304 MpegEncContext * const s = &h->s; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6305 const int mb_xy= mb_x + mb_y*s->mb_stride; |
3316 | 6306 const int mb_type = s->current_picture.mb_type[mb_xy]; |
6307 const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4; | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6308 int first_vertical_edge_done = 0; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6309 int dir; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6310 |
3101 | 6311 //for sufficiently low qp, filtering wouldn't do anything |
6312 //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp | |
3316 | 6313 if(!FRAME_MBAFF){ |
6655
22cca5d3173a
Implement FFMAX3(a,b,c) - maximum over three arguments.
voroshil
parents:
6604
diff
changeset
|
6314 int qp_thresh = 15 - h->slice_alpha_c0_offset - FFMAX3(0, h->pps.chroma_qp_index_offset[0], h->pps.chroma_qp_index_offset[1]); |
3101 | 6315 int qp = s->current_picture.qscale_table[mb_xy]; |
6316 if(qp <= qp_thresh | |
6317 && (mb_x == 0 || ((qp + s->current_picture.qscale_table[mb_xy-1] + 1)>>1) <= qp_thresh) | |
6318 && (mb_y == 0 || ((qp + s->current_picture.qscale_table[h->top_mb_xy] + 1)>>1) <= qp_thresh)){ | |
6319 return; | |
6320 } | |
6321 } | |
6322 | |
7378 | 6323 // CAVLC 8x8dct requires NNZ values for residual decoding that differ from what the loop filter needs |
6324 if(!h->pps.cabac && h->pps.transform_8x8_mode){ | |
6325 int top_type, left_type[2]; | |
6326 top_type = s->current_picture.mb_type[h->top_mb_xy] ; | |
6327 left_type[0] = s->current_picture.mb_type[h->left_mb_xy[0]]; | |
6328 left_type[1] = s->current_picture.mb_type[h->left_mb_xy[1]]; | |
6329 | |
6330 if(IS_8x8DCT(top_type)){ | |
6331 h->non_zero_count_cache[4+8*0]= | |
6332 h->non_zero_count_cache[5+8*0]= h->cbp_table[h->top_mb_xy] & 4; | |
6333 h->non_zero_count_cache[6+8*0]= | |
6334 h->non_zero_count_cache[7+8*0]= h->cbp_table[h->top_mb_xy] & 8; | |
6335 } | |
6336 if(IS_8x8DCT(left_type[0])){ | |
6337 h->non_zero_count_cache[3+8*1]= | |
6338 h->non_zero_count_cache[3+8*2]= h->cbp_table[h->left_mb_xy[0]]&2; //FIXME check MBAFF | |
6339 } | |
6340 if(IS_8x8DCT(left_type[1])){ | |
6341 h->non_zero_count_cache[3+8*3]= | |
6342 h->non_zero_count_cache[3+8*4]= h->cbp_table[h->left_mb_xy[1]]&8; //FIXME check MBAFF | |
6343 } | |
6344 | |
6345 if(IS_8x8DCT(mb_type)){ | |
6346 h->non_zero_count_cache[scan8[0 ]]= h->non_zero_count_cache[scan8[1 ]]= | |
6347 h->non_zero_count_cache[scan8[2 ]]= h->non_zero_count_cache[scan8[3 ]]= h->cbp_table[mb_xy] & 1; | |
6348 | |
6349 h->non_zero_count_cache[scan8[0+ 4]]= h->non_zero_count_cache[scan8[1+ 4]]= | |
6350 h->non_zero_count_cache[scan8[2+ 4]]= h->non_zero_count_cache[scan8[3+ 4]]= h->cbp_table[mb_xy] & 2; | |
6351 | |
6352 h->non_zero_count_cache[scan8[0+ 8]]= h->non_zero_count_cache[scan8[1+ 8]]= | |
6353 h->non_zero_count_cache[scan8[2+ 8]]= h->non_zero_count_cache[scan8[3+ 8]]= h->cbp_table[mb_xy] & 4; | |
6354 | |
6355 h->non_zero_count_cache[scan8[0+12]]= h->non_zero_count_cache[scan8[1+12]]= | |
6356 h->non_zero_count_cache[scan8[2+12]]= h->non_zero_count_cache[scan8[3+12]]= h->cbp_table[mb_xy] & 8; | |
6357 } | |
6358 } | |
6359 | |
3316 | 6360 if (FRAME_MBAFF |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6361 // left mb is in picture |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6362 && h->slice_table[mb_xy-1] != 255 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6363 // and current and left pair do not have the same interlaced type |
3316 | 6364 && (IS_INTERLACED(mb_type) != IS_INTERLACED(s->current_picture.mb_type[mb_xy-1])) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6365 // and left mb is in the same slice if deblocking_filter == 2 |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6366 && (h->deblocking_filter!=2 || h->slice_table[mb_xy-1] == h->slice_table[mb_xy])) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6367 /* First vertical edge is different in MBAFF frames |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
6368 * There are 8 different bS to compute and 2 different Qp |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6369 */ |
3316 | 6370 const int pair_xy = mb_x + (mb_y&~1)*s->mb_stride; |
6371 const int left_mb_xy[2] = { pair_xy-1, pair_xy-1+s->mb_stride }; | |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6372 int16_t bS[8]; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6373 int qp[2]; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6374 int bqp[2]; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6375 int rqp[2]; |
3316 | 6376 int mb_qp, mbn0_qp, mbn1_qp; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6377 int i; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6378 first_vertical_edge_done = 1; |
3316 | 6379 |
6380 if( IS_INTRA(mb_type) ) | |
6381 bS[0] = bS[1] = bS[2] = bS[3] = bS[4] = bS[5] = bS[6] = bS[7] = 4; | |
6382 else { | |
6383 for( i = 0; i < 8; i++ ) { | |
6384 int mbn_xy = MB_FIELD ? left_mb_xy[i>>2] : left_mb_xy[i&1]; | |
6385 | |
6386 if( IS_INTRA( s->current_picture.mb_type[mbn_xy] ) ) | |
6387 bS[i] = 4; | |
6388 else if( h->non_zero_count_cache[12+8*(i>>1)] != 0 || | |
7919 | 6389 ((!h->pps.cabac && IS_8x8DCT(s->current_picture.mb_type[mbn_xy])) ? |
6390 (h->cbp_table[mbn_xy] & ((MB_FIELD ? (i&2) : (mb_y&1)) ? 8 : 2)) | |
6391 : | |
6392 h->non_zero_count[mbn_xy][MB_FIELD ? i&3 : (i>>2)+(mb_y&1)*2])) | |
3316 | 6393 bS[i] = 2; |
6394 else | |
6395 bS[i] = 1; | |
6396 } | |
6397 } | |
6398 | |
6399 mb_qp = s->current_picture.qscale_table[mb_xy]; | |
6400 mbn0_qp = s->current_picture.qscale_table[left_mb_xy[0]]; | |
6401 mbn1_qp = s->current_picture.qscale_table[left_mb_xy[1]]; | |
6402 qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6403 bqp[0] = ( get_chroma_qp( h, 0, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6404 get_chroma_qp( h, 0, mbn0_qp ) + 1 ) >> 1; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6405 rqp[0] = ( get_chroma_qp( h, 1, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6406 get_chroma_qp( h, 1, mbn0_qp ) + 1 ) >> 1; |
3316 | 6407 qp[1] = ( mb_qp + mbn1_qp + 1 ) >> 1; |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6408 bqp[1] = ( get_chroma_qp( h, 0, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6409 get_chroma_qp( h, 0, mbn1_qp ) + 1 ) >> 1; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6410 rqp[1] = ( get_chroma_qp( h, 1, mb_qp ) + |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6411 get_chroma_qp( h, 1, mbn1_qp ) + 1 ) >> 1; |
3316 | 6412 |
6413 /* Filter edge */ | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6414 tprintf(s->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize); |
4600 | 6415 { int i; for (i = 0; i < 8; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } |
3316 | 6416 filter_mb_mbaff_edgev ( h, &img_y [0], linesize, bS, qp ); |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6417 filter_mb_mbaff_edgecv( h, &img_cb[0], uvlinesize, bS, bqp ); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6418 filter_mb_mbaff_edgecv( h, &img_cr[0], uvlinesize, bS, rqp ); |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6419 } |
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
|
6420 /* dir : 0 -> vertical edge, 1 -> horizontal edge */ |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6421 for( dir = 0; dir < 2; dir++ ) |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6422 { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6423 int edge; |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6424 const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy; |
2924 | 6425 const int mbm_type = s->current_picture.mb_type[mbm_xy]; |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6426 int (*ref2frm) [64] = h->ref2frm[ h->slice_num &15 ][0] + (MB_MBAFF ? 20 : 2); |
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6427 int (*ref2frmm)[64] = h->ref2frm[ h->slice_table[mbm_xy]&15 ][0] + (MB_MBAFF ? 20 : 2); |
2454 | 6428 int start = h->slice_table[mbm_xy] == 255 ? 1 : 0; |
6429 | |
3101 | 6430 const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP)) |
6431 == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4; | |
2926 | 6432 // how often to recheck mv-based bS when iterating between edges |
6433 const int mask_edge = (mb_type & (MB_TYPE_16x16 | (MB_TYPE_16x8 << dir))) ? 3 : | |
6434 (mb_type & (MB_TYPE_8x16 >> dir)) ? 1 : 0; | |
6435 // how often to recheck mv-based bS when iterating along each edge | |
6436 const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)); | |
6437 | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6438 if (first_vertical_edge_done) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6439 start = 1; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6440 first_vertical_edge_done = 0; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6441 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6442 |
2454 | 6443 if (h->deblocking_filter==2 && h->slice_table[mbm_xy] != h->slice_table[mb_xy]) |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6444 start = 1; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6445 |
3316 | 6446 if (FRAME_MBAFF && (dir == 1) && ((mb_y&1) == 0) && start == 0 |
6447 && !IS_INTERLACED(mb_type) | |
6448 && IS_INTERLACED(mbm_type) | |
6449 ) { | |
6450 // This is a special case in the norm where the filtering must | |
6451 // be done twice (one each of the field) even if we are in a | |
6452 // frame macroblock. | |
6453 // | |
6454 static const int nnz_idx[4] = {4,5,6,3}; | |
6455 unsigned int tmp_linesize = 2 * linesize; | |
6456 unsigned int tmp_uvlinesize = 2 * uvlinesize; | |
6457 int mbn_xy = mb_xy - 2 * s->mb_stride; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6458 int qp; |
3316 | 6459 int i, j; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6460 int16_t bS[4]; |
3316 | 6461 |
6462 for(j=0; j<2; j++, mbn_xy += s->mb_stride){ | |
6463 if( IS_INTRA(mb_type) || | |
6464 IS_INTRA(s->current_picture.mb_type[mbn_xy]) ) { | |
6465 bS[0] = bS[1] = bS[2] = bS[3] = 3; | |
6466 } else { | |
6467 const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy]; | |
6468 for( i = 0; i < 4; i++ ) { | |
6469 if( h->non_zero_count_cache[scan8[0]+i] != 0 || | |
6470 mbn_nnz[nnz_idx[i]] != 0 ) | |
6471 bS[i] = 2; | |
6472 else | |
6473 bS[i] = 1; | |
6474 } | |
6475 } | |
6476 // Do not use s->qscale as luma quantizer because it has not the same | |
6477 // value in IPCM macroblocks. | |
6478 qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1; | |
4600 | 6479 tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize); |
6480 { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } | |
3316 | 6481 filter_mb_edgeh( h, &img_y[j*linesize], tmp_linesize, bS, qp ); |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6482 filter_mb_edgech( h, &img_cb[j*uvlinesize], tmp_uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6483 ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6484 filter_mb_edgech( h, &img_cr[j*uvlinesize], tmp_uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6485 ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
3316 | 6486 } |
6487 | |
6488 start = 1; | |
6489 } | |
6490 | |
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
|
6491 /* Calculate bS */ |
2924 | 6492 for( edge = start; edge < edges; edge++ ) { |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
6493 /* mbn_xy: neighbor macroblock */ |
2924 | 6494 const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; |
6495 const int mbn_type = s->current_picture.mb_type[mbn_xy]; | |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6496 int (*ref2frmn)[64] = edge > 0 ? ref2frm : ref2frmm; |
3645
47821be55b6c
mmx implementation of deblocking strength decision.
lorenm
parents:
3519
diff
changeset
|
6497 int16_t bS[4]; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6498 int qp; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6499 |
2924 | 6500 if( (edge&1) && IS_8x8DCT(mb_type) ) |
2755 | 6501 continue; |
6502 | |
2924 | 6503 if( IS_INTRA(mb_type) || |
6504 IS_INTRA(mbn_type) ) { | |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6505 int value; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6506 if (edge == 0) { |
2924 | 6507 if ( (!IS_INTERLACED(mb_type) && !IS_INTERLACED(mbm_type)) |
3316 | 6508 || ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0)) |
2581
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6509 ) { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6510 value = 4; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6511 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6512 value = 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6513 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6514 } else { |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6515 value = 3; |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6516 } |
ae72796e722f
This is the second patch for MBAFF support, this adds the deblocking
michael
parents:
2580
diff
changeset
|
6517 bS[0] = bS[1] = bS[2] = bS[3] = value; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6518 } else { |
2924 | 6519 int i, l; |
6520 int mv_done; | |
6521 | |
6522 if( edge & mask_edge ) { | |
6523 bS[0] = bS[1] = bS[2] = bS[3] = 0; | |
6524 mv_done = 1; | |
6525 } | |
3316 | 6526 else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) { |
6527 bS[0] = bS[1] = bS[2] = bS[3] = 1; | |
6528 mv_done = 1; | |
6529 } | |
2924 | 6530 else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { |
6531 int b_idx= 8 + 4 + edge * (dir ? 8:1); | |
6532 int bn_idx= b_idx - (dir ? 8:1); | |
6533 int v = 0; | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
6534 |
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
6535 for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6536 v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] || |
7348
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6537 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6538 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit; |
2924 | 6539 } |
7348
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6540 |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6541 if(h->slice_type_nos == FF_B_TYPE && v){ |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6542 v=0; |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6543 for( l = 0; !v && l < 2; l++ ) { |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6544 int ln= 1-l; |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6545 v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] || |
7348
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6546 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6547 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit; |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6548 } |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6549 } |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6550 |
2924 | 6551 bS[0] = bS[1] = bS[2] = bS[3] = v; |
6552 mv_done = 1; | |
6553 } | |
6554 else | |
6555 mv_done = 0; | |
6556 | |
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
|
6557 for( i = 0; i < 4; i++ ) { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6558 int x = dir == 0 ? edge : i; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6559 int y = dir == 0 ? i : edge; |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6560 int b_idx= 8 + 4 + x + 8*y; |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6561 int bn_idx= b_idx - (dir ? 8:1); |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6562 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6563 if( h->non_zero_count_cache[b_idx] != 0 || |
2449 | 6564 h->non_zero_count_cache[bn_idx] != 0 ) { |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6565 bS[i] = 2; |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6566 } |
2924 | 6567 else if(!mv_done) |
2523 | 6568 { |
6569 bS[i] = 0; | |
7341
b75aa0197be4
Use slice_type_nos instead of slice_type where it makes no difference.
michael
parents:
7340
diff
changeset
|
6570 for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6571 if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] || |
7348
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6572 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6573 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) { |
2523 | 6574 bS[i] = 1; |
6575 break; | |
6576 } | |
6577 } | |
7348
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6578 |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6579 if(h->slice_type_nos == FF_B_TYPE && bS[i]){ |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6580 bS[i] = 0; |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6581 for( l = 0; l < 2; l++ ) { |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6582 int ln= 1-l; |
7526
3749f13a0d02
Use the correct reference tables for interlaced MBAFF MBs in the loop filter.
michael
parents:
7525
diff
changeset
|
6583 if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] || |
7348
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6584 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6585 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) { |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6586 bS[i] = 1; |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6587 break; |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6588 } |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6589 } |
39e5cadcebab
3rd try to get the loop filter ref/mv check working correctly.
michael
parents:
7347
diff
changeset
|
6590 } |
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
|
6591 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6592 } |
1899
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6593 |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6594 if(bS[0]+bS[1]+bS[2]+bS[3] == 0) |
379a18a7131f
do loop filter immediatly after each macroblock is decoded instead of after a frame is decoded
michael
parents:
1898
diff
changeset
|
6595 continue; |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6596 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6597 |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6598 /* Filter edge */ |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
6599 // Do not use s->qscale as luma quantizer because it has not the same |
2504
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
6600 // value in IPCM macroblocks. |
f12657081093
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
michael
parents:
2498
diff
changeset
|
6601 qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1; |
4600 | 6602 //tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp, s->current_picture.qscale_table[mbn_xy]); |
6603 tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); | |
6604 { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } | |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6605 if( dir == 0 ) { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6606 filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp ); |
1898 | 6607 if( (edge&1) == 0 ) { |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6608 filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6609 ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6610 filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6611 ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6612 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6613 } else { |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6614 filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp ); |
1898 | 6615 if( (edge&1) == 0 ) { |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6616 filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6617 ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6618 filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS, |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
6619 ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1); |
1897
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6620 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6621 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6622 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6623 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6624 } |
4e8ed93524f6
h264 loop filter for progressive I&P frames by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1892
diff
changeset
|
6625 |
5642 | 6626 static int decode_slice(struct AVCodecContext *avctx, H264Context *h){ |
1168 | 6627 MpegEncContext * const s = &h->s; |
6628 const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F; | |
6629 | |
6630 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
|
6631 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6632 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
|
6633 int i; |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6634 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6635 /* realign */ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6636 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
|
6637 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6638 /* 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
|
6639 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
|
6640 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
|
6641 s->gb.buffer + get_bits_count(&s->gb)/8, |
2116 | 6642 ( s->gb.size_in_bits - get_bits_count(&s->gb) + 7)/8); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6643 /* calculate pre-state */ |
2755 | 6644 for( i= 0; i < 460; i++ ) { |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6645 int pre; |
7340 | 6646 if( h->slice_type_nos == FF_I_TYPE ) |
4594 | 6647 pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6648 else |
4594 | 6649 pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 ); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6650 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6651 if( pre <= 63 ) |
3976
27e90123b346
reverse remainder of the failed attempt to optimize *state=c->mps_state[s]
michael
parents:
3972
diff
changeset
|
6652 h->cabac_state[i] = 2 * ( 63 - pre ) + 0; |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6653 else |
3976
27e90123b346
reverse remainder of the failed attempt to optimize *state=c->mps_state[s]
michael
parents:
3972
diff
changeset
|
6654 h->cabac_state[i] = 2 * ( pre - 64 ) + 1; |
1168 | 6655 } |
6656 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6657 for(;;){ |
4008
b636f3d59283
prevent "mb level" get_cabac() calls from being inlined (3% faster decode_mb_cabac() on P3)
michael
parents:
4007
diff
changeset
|
6658 //START_TIMER |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6659 int ret = decode_mb_cabac(h); |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6660 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
|
6661 //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
|
6662 |
2163 | 6663 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6664 |
3316 | 6665 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
|
6666 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
|
6667 |
2163 | 6668 if(ret>=0) ret = decode_mb_cabac(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6669 |
2844
5f20ab245501
prevent assert failures and infinite loops with broken streams
michael
parents:
2834
diff
changeset
|
6670 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6671 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
|
6672 } |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6673 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
|
6674 |
3948
3edbf131ee44
refill cabac variables in 16bit steps, 3% faster get_cabac()
michael
parents:
3947
diff
changeset
|
6675 if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { |
5153 | 6676 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
|
6677 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
|
6678 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
|
6679 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6680 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6681 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
|
6682 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
|
6683 ff_draw_horiz_band(s, 16*s->mb_y, 16); |
2392 | 6684 ++s->mb_y; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
6685 if(FIELD_OR_MBAFF_PICTURE) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6686 ++s->mb_y; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6687 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6688 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6689 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6690 if( eos || s->mb_y >= s->mb_height ) { |
4600 | 6691 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
|
6692 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
|
6693 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
|
6694 } |
1168 | 6695 } |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6696 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6697 } else { |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6698 for(;;){ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6699 int ret = decode_mb_cavlc(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6700 |
2163 | 6701 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6702 |
3316 | 6703 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
|
6704 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
|
6705 ret = decode_mb_cavlc(h); |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6706 |
2163 | 6707 if(ret>=0) hl_decode_mb(h); |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6708 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
|
6709 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6710 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6711 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
|
6712 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
|
6713 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
|
6714 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6715 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
|
6716 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6717 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6718 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
|
6719 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
|
6720 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
|
6721 ++s->mb_y; |
5781
0b3aa6f4c313
Modifies macroblock addressing and current macroblock y-position for field decoding.
andoma
parents:
5780
diff
changeset
|
6722 if(FIELD_OR_MBAFF_PICTURE) { |
2551
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6723 ++s->mb_y; |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6724 } |
615995277bc5
MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents:
2548
diff
changeset
|
6725 if(s->mb_y >= s->mb_height){ |
4600 | 6726 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
|
6727 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6728 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
|
6729 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
|
6730 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6731 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
|
6732 }else{ |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6733 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
|
6734 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6735 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
|
6736 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6737 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6738 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6739 |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6740 if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){ |
4600 | 6741 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
|
6742 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){ |
1168 | 6743 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); |
6744 | |
6745 return 0; | |
6746 }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
|
6747 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 | 6748 |
6749 return -1; | |
6750 } | |
6751 } | |
6752 } | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6753 } |
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
6754 |
1168 | 6755 #if 0 |
6756 for(;s->mb_y < s->mb_height; s->mb_y++){ | |
6757 for(;s->mb_x < s->mb_width; s->mb_x++){ | |
6758 int ret= decode_mb(h); | |
2967 | 6759 |
1168 | 6760 hl_decode_mb(h); |
6761 | |
6762 if(ret<0){ | |
3177 | 6763 av_log(s->avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); |
1168 | 6764 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); |
6765 | |
6766 return -1; | |
6767 } | |
2967 | 6768 |
1168 | 6769 if(++s->mb_x >= s->mb_width){ |
6770 s->mb_x=0; | |
6771 if(++s->mb_y >= s->mb_height){ | |
6772 if(get_bits_count(s->gb) == s->gb.size_in_bits){ | |
6773 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); | |
6774 | |
6775 return 0; | |
6776 }else{ | |
6777 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); | |
6778 | |
6779 return -1; | |
6780 } | |
6781 } | |
6782 } | |
2967 | 6783 |
1168 | 6784 if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){ |
6785 if(get_bits_count(s->gb) == s->gb.size_in_bits){ | |
6786 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); | |
6787 | |
6788 return 0; | |
6789 }else{ | |
6790 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); | |
6791 | |
6792 return -1; | |
6793 } | |
6794 } | |
6795 } | |
6796 s->mb_x=0; | |
6797 ff_draw_horiz_band(s, 16*s->mb_y, 16); | |
6798 } | |
6799 #endif | |
6800 return -1; //not reached | |
6801 } | |
6802 | |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6803 static int decode_unregistered_user_data(H264Context *h, int size){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6804 MpegEncContext * const s = &h->s; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6805 uint8_t user_data[16+256]; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6806 int e, build, i; |
2967 | 6807 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6808 if(size<16) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6809 return -1; |
2967 | 6810 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6811 for(i=0; i<sizeof(user_data)-1 && i<size; i++){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6812 user_data[i]= get_bits(&s->gb, 8); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6813 } |
2967 | 6814 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6815 user_data[i]= 0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6816 e= sscanf(user_data+16, "x264 - core %d"/*%s - H.264/MPEG-4 AVC codec - Copyleft 2005 - http://www.videolan.org/x264.html*/, &build); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6817 if(e==1 && build>=0) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6818 h->x264_build= build; |
2967 | 6819 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6820 if(s->avctx->debug & FF_DEBUG_BUGS) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6821 av_log(s->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data+16); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6822 |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6823 for(; i<size; i++) |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6824 skip_bits(&s->gb, 8); |
2967 | 6825 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6826 return 0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6827 } |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6828 |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6829 static int decode_sei(H264Context *h){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6830 MpegEncContext * const s = &h->s; |
2967 | 6831 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6832 while(get_bits_count(&s->gb) + 16 < s->gb.size_in_bits){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6833 int size, type; |
2967 | 6834 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6835 type=0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6836 do{ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6837 type+= show_bits(&s->gb, 8); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6838 }while(get_bits(&s->gb, 8) == 255); |
2967 | 6839 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6840 size=0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6841 do{ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6842 size+= show_bits(&s->gb, 8); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6843 }while(get_bits(&s->gb, 8) == 255); |
2967 | 6844 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6845 switch(type){ |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6846 case 5: |
3318 | 6847 if(decode_unregistered_user_data(h, size) < 0) |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6848 return -1; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6849 break; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6850 default: |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6851 skip_bits(&s->gb, 8*size); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6852 } |
2967 | 6853 |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6854 //FIXME check bits here |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6855 align_get_bits(&s->gb); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6856 } |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6857 |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6858 return 0; |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6859 } |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
6860 |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6861 static inline void decode_hrd_parameters(H264Context *h, SPS *sps){ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6862 MpegEncContext * const s = &h->s; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6863 int cpb_count, i; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6864 cpb_count = get_ue_golomb(&s->gb) + 1; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6865 get_bits(&s->gb, 4); /* bit_rate_scale */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6866 get_bits(&s->gb, 4); /* cpb_size_scale */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6867 for(i=0; i<cpb_count; i++){ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6868 get_ue_golomb(&s->gb); /* bit_rate_value_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6869 get_ue_golomb(&s->gb); /* cpb_size_value_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6870 get_bits1(&s->gb); /* cbr_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6871 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6872 get_bits(&s->gb, 5); /* initial_cpb_removal_delay_length_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6873 get_bits(&s->gb, 5); /* cpb_removal_delay_length_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6874 get_bits(&s->gb, 5); /* dpb_output_delay_length_minus1 */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6875 get_bits(&s->gb, 5); /* time_offset_length */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6876 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6877 |
1168 | 6878 static inline int decode_vui_parameters(H264Context *h, SPS *sps){ |
6879 MpegEncContext * const s = &h->s; | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
6880 int aspect_ratio_info_present_flag; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
6881 unsigned int aspect_ratio_idc; |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6882 int nal_hrd_parameters_present_flag, vcl_hrd_parameters_present_flag; |
1168 | 6883 |
6884 aspect_ratio_info_present_flag= get_bits1(&s->gb); | |
2967 | 6885 |
1168 | 6886 if( aspect_ratio_info_present_flag ) { |
6887 aspect_ratio_idc= get_bits(&s->gb, 8); | |
6888 if( aspect_ratio_idc == EXTENDED_SAR ) { | |
1548 | 6889 sps->sar.num= get_bits(&s->gb, 16); |
6890 sps->sar.den= get_bits(&s->gb, 16); | |
6429 | 6891 }else if(aspect_ratio_idc < sizeof(pixel_aspect)/sizeof(*pixel_aspect)){ |
1548 | 6892 sps->sar= pixel_aspect[aspect_ratio_idc]; |
1168 | 6893 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
6894 av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n"); |
1168 | 6895 return -1; |
6896 } | |
6897 }else{ | |
2967 | 6898 sps->sar.num= |
1548 | 6899 sps->sar.den= 0; |
1168 | 6900 } |
6901 // s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height); | |
2174
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6902 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6903 if(get_bits1(&s->gb)){ /* overscan_info_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6904 get_bits1(&s->gb); /* overscan_appropriate_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6905 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6906 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6907 if(get_bits1(&s->gb)){ /* video_signal_type_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6908 get_bits(&s->gb, 3); /* video_format */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6909 get_bits1(&s->gb); /* video_full_range_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6910 if(get_bits1(&s->gb)){ /* colour_description_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6911 get_bits(&s->gb, 8); /* colour_primaries */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6912 get_bits(&s->gb, 8); /* transfer_characteristics */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6913 get_bits(&s->gb, 8); /* matrix_coefficients */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6914 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6915 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6916 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6917 if(get_bits1(&s->gb)){ /* chroma_location_info_present_flag */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6918 get_ue_golomb(&s->gb); /* chroma_sample_location_type_top_field */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6919 get_ue_golomb(&s->gb); /* chroma_sample_location_type_bottom_field */ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6920 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6921 |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6922 sps->timing_info_present_flag = get_bits1(&s->gb); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6923 if(sps->timing_info_present_flag){ |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6924 sps->num_units_in_tick = get_bits_long(&s->gb, 32); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6925 sps->time_scale = get_bits_long(&s->gb, 32); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6926 sps->fixed_frame_rate_flag = get_bits1(&s->gb); |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6927 } |
6d614374d907
Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents:
2163
diff
changeset
|
6928 |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6929 nal_hrd_parameters_present_flag = get_bits1(&s->gb); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6930 if(nal_hrd_parameters_present_flag) |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6931 decode_hrd_parameters(h, sps); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6932 vcl_hrd_parameters_present_flag = get_bits1(&s->gb); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6933 if(vcl_hrd_parameters_present_flag) |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6934 decode_hrd_parameters(h, sps); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6935 if(nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6936 get_bits1(&s->gb); /* low_delay_hrd_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6937 get_bits1(&s->gb); /* pic_struct_present_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6938 |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6939 sps->bitstream_restriction_flag = get_bits1(&s->gb); |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6940 if(sps->bitstream_restriction_flag){ |
4389 | 6941 unsigned int num_reorder_frames; |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6942 get_bits1(&s->gb); /* motion_vectors_over_pic_boundaries_flag */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6943 get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6944 get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6945 get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6946 get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */ |
4389 | 6947 num_reorder_frames= get_ue_golomb(&s->gb); |
6948 get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/ | |
6949 | |
6950 if(num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){ | |
6951 av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", num_reorder_frames); | |
6952 return -1; | |
6953 } | |
6954 | |
6955 sps->num_reorder_frames= num_reorder_frames; | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6956 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
6957 |
1168 | 6958 return 0; |
6959 } | |
6960 | |
3004 | 6961 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size, |
6962 const uint8_t *jvt_list, const uint8_t *fallback_list){ | |
2919 | 6963 MpegEncContext * const s = &h->s; |
6964 int i, last = 8, next = 8; | |
6965 const uint8_t *scan = size == 16 ? zigzag_scan : zigzag_scan8x8; | |
3004 | 6966 if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */ |
6967 memcpy(factors, fallback_list, size*sizeof(uint8_t)); | |
2919 | 6968 else |
6969 for(i=0;i<size;i++){ | |
6970 if(next) | |
6971 next = (last + get_se_golomb(&s->gb)) & 0xff; | |
3004 | 6972 if(!i && !next){ /* matrix not written, we use the preset one */ |
6973 memcpy(factors, jvt_list, size*sizeof(uint8_t)); | |
2919 | 6974 break; |
6975 } | |
6976 last = factors[scan[i]] = next ? next : last; | |
6977 } | |
6978 } | |
6979 | |
6980 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps, | |
6981 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){ | |
6982 MpegEncContext * const s = &h->s; | |
6983 int fallback_sps = !is_sps && sps->scaling_matrix_present; | |
6984 const uint8_t *fallback[4] = { | |
6985 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], | |
6986 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1], | |
6987 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], | |
6988 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1] | |
6989 }; | |
6990 if(get_bits1(&s->gb)){ | |
6991 sps->scaling_matrix_present |= is_sps; | |
3004 | 6992 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y |
6993 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr | |
6994 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb | |
6995 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y | |
6996 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr | |
6997 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb | |
2919 | 6998 if(is_sps || pps->transform_8x8_mode){ |
3004 | 6999 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y |
7000 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y | |
2919 | 7001 } |
7002 } | |
7003 } | |
7004 | |
5079 | 7005 /** |
7006 * Returns and optionally allocates SPS / PPS structures in the supplied array 'vec' | |
7007 */ | |
7008 static void * | |
7009 alloc_parameter_set(H264Context *h, void **vec, const unsigned int id, const unsigned int max, | |
7010 const size_t size, const char *name) | |
7011 { | |
7012 if(id>=max) { | |
7013 av_log(h->s.avctx, AV_LOG_ERROR, "%s_id (%d) out of range\n", name, id); | |
7014 return NULL; | |
7015 } | |
7016 | |
7017 if(!vec[id]) { | |
7018 vec[id] = av_mallocz(size); | |
7019 if(vec[id] == NULL) | |
7020 av_log(h->s.avctx, AV_LOG_ERROR, "cannot allocate memory for %s\n", name); | |
7021 } | |
7022 return vec[id]; | |
7023 } | |
7024 | |
1168 | 7025 static inline int decode_seq_parameter_set(H264Context *h){ |
7026 MpegEncContext * const s = &h->s; | |
1371 | 7027 int profile_idc, level_idc; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7028 unsigned int sps_id, tmp, mb_width, mb_height; |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7029 int i; |
1168 | 7030 SPS *sps; |
2967 | 7031 |
1168 | 7032 profile_idc= get_bits(&s->gb, 8); |
1371 | 7033 get_bits1(&s->gb); //constraint_set0_flag |
7034 get_bits1(&s->gb); //constraint_set1_flag | |
7035 get_bits1(&s->gb); //constraint_set2_flag | |
2312 | 7036 get_bits1(&s->gb); //constraint_set3_flag |
7037 get_bits(&s->gb, 4); // reserved | |
1168 | 7038 level_idc= get_bits(&s->gb, 8); |
7039 sps_id= get_ue_golomb(&s->gb); | |
2967 | 7040 |
5079 | 7041 sps = alloc_parameter_set(h, (void **)h->sps_buffers, sps_id, MAX_SPS_COUNT, sizeof(SPS), "sps"); |
7042 if(sps == NULL) | |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7043 return -1; |
5079 | 7044 |
1168 | 7045 sps->profile_idc= profile_idc; |
7046 sps->level_idc= level_idc; | |
2312 | 7047 |
7892
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
7048 memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4)); |
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
7049 memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8)); |
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
7050 sps->scaling_matrix_present = 0; |
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
7051 |
2755 | 7052 if(sps->profile_idc >= 100){ //high profile |
7407 | 7053 sps->chroma_format_idc= get_ue_golomb(&s->gb); |
7054 if(sps->chroma_format_idc == 3) | |
2755 | 7055 get_bits1(&s->gb); //residual_color_transform_flag |
7056 get_ue_golomb(&s->gb); //bit_depth_luma_minus8 | |
7057 get_ue_golomb(&s->gb); //bit_depth_chroma_minus8 | |
2763 | 7058 sps->transform_bypass = get_bits1(&s->gb); |
2919 | 7059 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8); |
7407 | 7060 }else{ |
7061 sps->chroma_format_idc= 1; | |
7062 } | |
2755 | 7063 |
1168 | 7064 sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4; |
7065 sps->poc_type= get_ue_golomb(&s->gb); | |
2967 | 7066 |
1168 | 7067 if(sps->poc_type == 0){ //FIXME #define |
7068 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4; | |
7069 } else if(sps->poc_type == 1){//FIXME #define | |
7070 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb); | |
7071 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb); | |
7072 sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb); | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7073 tmp= get_ue_golomb(&s->gb); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7074 |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7075 if(tmp >= sizeof(sps->offset_for_ref_frame) / sizeof(sps->offset_for_ref_frame[0])){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7076 av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", tmp); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7077 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7078 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7079 sps->poc_cycle_length= tmp; |
2967 | 7080 |
1168 | 7081 for(i=0; i<sps->poc_cycle_length; i++) |
7082 sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb); | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7083 }else if(sps->poc_type != 2){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7084 av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type); |
1168 | 7085 return -1; |
7086 } | |
7087 | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7088 tmp= get_ue_golomb(&s->gb); |
6017
e1404acccac3
Actually return with an error condition if we're being asked to deal with too
heydowns
parents:
6016
diff
changeset
|
7089 if(tmp > MAX_PICTURE_COUNT-2 || tmp >= 32){ |
2254
0dfe4e32b19c
H.264 max reference pictures fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2227
diff
changeset
|
7090 av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n"); |
6017
e1404acccac3
Actually return with an error condition if we're being asked to deal with too
heydowns
parents:
6016
diff
changeset
|
7091 return -1; |
2254
0dfe4e32b19c
H.264 max reference pictures fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2227
diff
changeset
|
7092 } |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7093 sps->ref_frame_count= tmp; |
1371 | 7094 sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7095 mb_width= get_ue_golomb(&s->gb) + 1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7096 mb_height= get_ue_golomb(&s->gb) + 1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7097 if(mb_width >= INT_MAX/16 || mb_height >= INT_MAX/16 || |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7098 avcodec_check_dimensions(NULL, 16*mb_width, 16*mb_height)){ |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7099 av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n"); |
2422 | 7100 return -1; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7101 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7102 sps->mb_width = mb_width; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7103 sps->mb_height= mb_height; |
2422 | 7104 |
1168 | 7105 sps->frame_mbs_only_flag= get_bits1(&s->gb); |
7106 if(!sps->frame_mbs_only_flag) | |
7107 sps->mb_aff= get_bits1(&s->gb); | |
7108 else | |
7109 sps->mb_aff= 0; | |
7110 | |
7111 sps->direct_8x8_inference_flag= get_bits1(&s->gb); | |
7112 | |
3316 | 7113 #ifndef ALLOW_INTERLACE |
7114 if(sps->mb_aff) | |
3954 | 7115 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n"); |
3316 | 7116 #endif |
1371 | 7117 sps->crop= get_bits1(&s->gb); |
7118 if(sps->crop){ | |
7119 sps->crop_left = get_ue_golomb(&s->gb); | |
7120 sps->crop_right = get_ue_golomb(&s->gb); | |
7121 sps->crop_top = get_ue_golomb(&s->gb); | |
7122 sps->crop_bottom= get_ue_golomb(&s->gb); | |
7123 if(sps->crop_left || sps->crop_top){ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2623
diff
changeset
|
7124 av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n"); |
1371 | 7125 } |
7844
d35a71a3db5f
Fix incorrect printing of brainfart cropping error in some cases in progressive mode.
darkshikari
parents:
7831
diff
changeset
|
7126 if(sps->crop_right >= 8 || sps->crop_bottom >= (8>> !sps->frame_mbs_only_flag)){ |
6581
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
7127 av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n"); |
e6d8c5bbeeac
Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents:
6524
diff
changeset
|
7128 } |
1371 | 7129 }else{ |
2967 | 7130 sps->crop_left = |
7131 sps->crop_right = | |
7132 sps->crop_top = | |
1371 | 7133 sps->crop_bottom= 0; |
7134 } | |
7135 | |
1168 | 7136 sps->vui_parameters_present_flag= get_bits1(&s->gb); |
7137 if( sps->vui_parameters_present_flag ) | |
7138 decode_vui_parameters(h, sps); | |
2967 | 7139 |
1168 | 7140 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
7407 | 7141 av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s\n", |
1168 | 7142 sps_id, sps->profile_idc, sps->level_idc, |
7143 sps->poc_type, | |
7144 sps->ref_frame_count, | |
7145 sps->mb_width, sps->mb_height, | |
7146 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"), | |
7147 sps->direct_8x8_inference_flag ? "8B8" : "", | |
2967 | 7148 sps->crop_left, sps->crop_right, |
7149 sps->crop_top, sps->crop_bottom, | |
7407 | 7150 sps->vui_parameters_present_flag ? "VUI" : "", |
7151 ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc] | |
1168 | 7152 ); |
7153 } | |
7154 return 0; | |
7155 } | |
7156 | |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7157 static void |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7158 build_qp_table(PPS *pps, int t, int index) |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7159 { |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7160 int i; |
7347
612a78c3b128
qscale has a range of 0..51 we thus do not need a 256 entry table and neither need
michael
parents:
7346
diff
changeset
|
7161 for(i = 0; i < 52; i++) |
612a78c3b128
qscale has a range of 0..51 we thus do not need a 256 entry table and neither need
michael
parents:
7346
diff
changeset
|
7162 pps->chroma_qp_table[t][i] = chroma_qp[av_clip(i + index, 0, 51)]; |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7163 } |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
7164 |
2755 | 7165 static inline int decode_picture_parameter_set(H264Context *h, int bit_length){ |
1168 | 7166 MpegEncContext * const s = &h->s; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7167 unsigned int tmp, pps_id= get_ue_golomb(&s->gb); |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7168 PPS *pps; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7169 |
5079 | 7170 pps = alloc_parameter_set(h, (void **)h->pps_buffers, pps_id, MAX_PPS_COUNT, sizeof(PPS), "pps"); |
7171 if(pps == NULL) | |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7172 return -1; |
2967 | 7173 |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7174 tmp= get_ue_golomb(&s->gb); |
5079 | 7175 if(tmp>=MAX_SPS_COUNT || h->sps_buffers[tmp] == NULL){ |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7176 av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n"); |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7177 return -1; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7178 } |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7179 pps->sps_id= tmp; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7180 |
1168 | 7181 pps->cabac= get_bits1(&s->gb); |
7182 pps->pic_order_present= get_bits1(&s->gb); | |
7183 pps->slice_group_count= get_ue_golomb(&s->gb) + 1; | |
7184 if(pps->slice_group_count > 1 ){ | |
7185 pps->mb_slice_group_map_type= get_ue_golomb(&s->gb); | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7186 av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n"); |
1168 | 7187 switch(pps->mb_slice_group_map_type){ |
7188 case 0: | |
7189 #if 0 | |
7190 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | | | |
7191 | run_length[ i ] |1 |ue(v) | | |
7192 #endif | |
7193 break; | |
7194 case 2: | |
7195 #if 0 | |
7196 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | | | |
7197 |{ | | | | |
7198 | top_left_mb[ i ] |1 |ue(v) | | |
7199 | bottom_right_mb[ i ] |1 |ue(v) | | |
7200 | } | | | | |
7201 #endif | |
7202 break; | |
7203 case 3: | |
7204 case 4: | |
7205 case 5: | |
7206 #if 0 | |
7207 | slice_group_change_direction_flag |1 |u(1) | | |
7208 | slice_group_change_rate_minus1 |1 |ue(v) | | |
7209 #endif | |
7210 break; | |
7211 case 6: | |
7212 #if 0 | |
7213 | slice_group_id_cnt_minus1 |1 |ue(v) | | |
7214 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | | | |
7215 |) | | | | |
7216 | slice_group_id[ i ] |1 |u(v) | | |
7217 #endif | |
1214 | 7218 break; |
1168 | 7219 } |
7220 } | |
7221 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1; | |
7222 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1; | |
4531 | 7223 if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
7224 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n"); |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
7225 pps->ref_count[0]= pps->ref_count[1]= 1; |
1168 | 7226 return -1; |
7227 } | |
2967 | 7228 |
1168 | 7229 pps->weighted_pred= get_bits1(&s->gb); |
7230 pps->weighted_bipred_idc= get_bits(&s->gb, 2); | |
7231 pps->init_qp= get_se_golomb(&s->gb) + 26; | |
7232 pps->init_qs= get_se_golomb(&s->gb) + 26; | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7233 pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb); |
1168 | 7234 pps->deblocking_filter_parameters_present= get_bits1(&s->gb); |
7235 pps->constrained_intra_pred= get_bits1(&s->gb); | |
7236 pps->redundant_pic_cnt_present = get_bits1(&s->gb); | |
2967 | 7237 |
3291
454de57e45cf
reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents:
3285
diff
changeset
|
7238 pps->transform_8x8_mode= 0; |
454de57e45cf
reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents:
3285
diff
changeset
|
7239 h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit |
7892
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
7240 memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4)); |
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
7241 memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8)); |
2755 | 7242 |
7243 if(get_bits_count(&s->gb) < bit_length){ | |
7244 pps->transform_8x8_mode= get_bits1(&s->gb); | |
5079 | 7245 decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8); |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7246 pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7247 } else { |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7248 pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0]; |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7249 } |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7250 |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7251 build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]); |
7345 | 7252 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]); |
7253 if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1]) | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7254 h->pps.chroma_qp_diff= 1; |
2967 | 7255 |
1168 | 7256 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7257 av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n", |
1168 | 7258 pps_id, pps->sps_id, |
7259 pps->cabac ? "CABAC" : "CAVLC", | |
7260 pps->slice_group_count, | |
7261 pps->ref_count[0], pps->ref_count[1], | |
7262 pps->weighted_pred ? "weighted" : "", | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
7263 pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1], |
1168 | 7264 pps->deblocking_filter_parameters_present ? "LPAR" : "", |
7265 pps->constrained_intra_pred ? "CONSTR" : "", | |
2755 | 7266 pps->redundant_pic_cnt_present ? "REDU" : "", |
7267 pps->transform_8x8_mode ? "8x8DCT" : "" | |
1168 | 7268 ); |
7269 } | |
2967 | 7270 |
1168 | 7271 return 0; |
7272 } | |
7273 | |
5642 | 7274 /** |
7275 * Call decode_slice() for each context. | |
7276 * | |
7277 * @param h h264 master context | |
7278 * @param context_count number of contexts to execute | |
7279 */ | |
7280 static void execute_decode_slices(H264Context *h, int context_count){ | |
7281 MpegEncContext * const s = &h->s; | |
7282 AVCodecContext * const avctx= s->avctx; | |
7283 H264Context *hx; | |
7284 int i; | |
7285 | |
7286 if(context_count == 1) { | |
7287 decode_slice(avctx, h); | |
7288 } else { | |
7289 for(i = 1; i < context_count; i++) { | |
7290 hx = h->thread_context[i]; | |
7831 | 7291 hx->s.error_recognition = avctx->error_recognition; |
5642 | 7292 hx->s.error_count = 0; |
7293 } | |
7294 | |
7295 avctx->execute(avctx, (void *)decode_slice, | |
7296 (void **)h->thread_context, NULL, context_count); | |
7297 | |
7298 /* pull back stuff from slices to master context */ | |
7299 hx = h->thread_context[context_count - 1]; | |
7300 s->mb_x = hx->s.mb_x; | |
7301 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
|
7302 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
|
7303 s->picture_structure = hx->s.picture_structure; |
5642 | 7304 for(i = 1; i < context_count; i++) |
7305 h->s.error_count += h->thread_context[i]->s.error_count; | |
7306 } | |
7307 } | |
7308 | |
7309 | |
6216 | 7310 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ |
1168 | 7311 MpegEncContext * const s = &h->s; |
7312 AVCodecContext * const avctx= s->avctx; | |
7313 int buf_index=0; | |
5642 | 7314 H264Context *hx; ///< thread context |
7315 int context_count = 0; | |
7316 | |
7317 h->max_contexts = avctx->thread_count; | |
1322 | 7318 #if 0 |
1168 | 7319 int i; |
2867
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
7320 for(i=0; i<50; i++){ |
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
7321 av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]); |
1168 | 7322 } |
7323 #endif | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7324 if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){ |
5642 | 7325 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
|
7326 if (!s->first_field) |
5803 | 7327 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
|
7328 } |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7329 |
1168 | 7330 for(;;){ |
7331 int consumed; | |
7332 int dst_length; | |
7333 int bit_length; | |
6216 | 7334 const uint8_t *ptr; |
2227 | 7335 int i, nalsize = 0; |
5642 | 7336 int err; |
2967 | 7337 |
5170 | 7338 if(h->is_avc) { |
7339 if(buf_index >= buf_size) break; | |
7340 nalsize = 0; | |
7341 for(i = 0; i < h->nal_length_size; i++) | |
7342 nalsize = (nalsize << 8) | buf[buf_index++]; | |
7343 if(nalsize <= 1 || (nalsize+buf_index > buf_size)){ | |
7344 if(nalsize == 1){ | |
7345 buf_index++; | |
7346 continue; | |
7347 }else{ | |
7348 av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize); | |
7349 break; | |
7350 } | |
7351 } | |
7352 } else { | |
7353 // start code prefix search | |
7354 for(; buf_index + 3 < buf_size; buf_index++){ | |
7355 // This should always succeed in the first iteration. | |
7356 if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1) | |
7357 break; | |
7358 } | |
7359 | |
7360 if(buf_index+3 >= buf_size) break; | |
7361 | |
7362 buf_index+=3; | |
7363 } | |
2967 | 7364 |
5642 | 7365 hx = h->thread_context[context_count]; |
7366 | |
7367 ptr= decode_nal(hx, buf + buf_index, &dst_length, &consumed, h->is_avc ? nalsize : buf_size - buf_index); | |
4828
58f1856608f6
scenario: A properly coded frame is followed by an end of sequence NAL unit,
diego
parents:
4795
diff
changeset
|
7368 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
|
7369 return -1; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
7370 } |
4829
e3161603a048
Remove a NAL unit's trailing zero bytes even when dst_length is 1.
diego
parents:
4828
diff
changeset
|
7371 while(ptr[dst_length - 1] == 0 && dst_length > 0) |
3341 | 7372 dst_length--; |
4830
5a523aee7379
When dst_length == 0 bit_length has to be 0, too, but the current code still
diego
parents:
4829
diff
changeset
|
7373 bit_length= !dst_length ? 0 : (8*dst_length - decode_rbsp_trailing(h, ptr + dst_length - 1)); |
1168 | 7374 |
7375 if(s->avctx->debug&FF_DEBUG_STARTCODE){ | |
5642 | 7376 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 | 7377 } |
2967 | 7378 |
6490
bb799e3bc64b
If consumed does not match nalsize, favor nalsize.
michael
parents:
6488
diff
changeset
|
7379 if (h->is_avc && (nalsize != consumed)){ |
2227 | 7380 av_log(h->s.avctx, AV_LOG_ERROR, "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
|
7381 consumed= nalsize; |
bb799e3bc64b
If consumed does not match nalsize, favor nalsize.
michael
parents:
6488
diff
changeset
|
7382 } |
2227 | 7383 |
1168 | 7384 buf_index += consumed; |
7385 | |
5127 | 7386 if( (s->hurry_up == 1 && h->nal_ref_idc == 0) //FIXME do not discard SEI id |
2792 | 7387 ||(avctx->skip_frame >= AVDISCARD_NONREF && h->nal_ref_idc == 0)) |
1168 | 7388 continue; |
2967 | 7389 |
5642 | 7390 again: |
7391 err = 0; | |
7392 switch(hx->nal_unit_type){ | |
1168 | 7393 case NAL_IDR_SLICE: |
5642 | 7394 if (h->nal_unit_type != NAL_IDR_SLICE) { |
7395 av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices"); | |
7396 return -1; | |
7397 } | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
7398 idr(h); //FIXME ensure we don't loose some frames if there is reordering |
1168 | 7399 case NAL_SLICE: |
5642 | 7400 init_get_bits(&hx->s.gb, ptr, bit_length); |
7401 hx->intra_gb_ptr= | |
7402 hx->inter_gb_ptr= &hx->s.gb; | |
7403 hx->s.data_partitioning = 0; | |
7404 | |
7405 if((err = decode_slice_header(hx, h))) | |
7406 break; | |
7407 | |
5773
e3d7a78e2df3
Fix Picture.key_frame setting to be compatible with frame and field contexts. Part of PAFF implementation.
andoma
parents:
5772
diff
changeset
|
7408 s->current_picture_ptr->key_frame|= (hx->nal_unit_type == NAL_IDR_SLICE); |
5642 | 7409 if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5 |
7410 && (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
|
7411 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE) |
7340 | 7412 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE) |
2793 | 7413 && avctx->skip_frame < AVDISCARD_ALL) |
5642 | 7414 context_count++; |
1168 | 7415 break; |
7416 case NAL_DPA: | |
5642 | 7417 init_get_bits(&hx->s.gb, ptr, bit_length); |
7418 hx->intra_gb_ptr= | |
7419 hx->inter_gb_ptr= NULL; | |
7420 hx->s.data_partitioning = 1; | |
7421 | |
7422 err = decode_slice_header(hx, h); | |
1168 | 7423 break; |
7424 case NAL_DPB: | |
5642 | 7425 init_get_bits(&hx->intra_gb, ptr, bit_length); |
7426 hx->intra_gb_ptr= &hx->intra_gb; | |
1168 | 7427 break; |
7428 case NAL_DPC: | |
5642 | 7429 init_get_bits(&hx->inter_gb, ptr, bit_length); |
7430 hx->inter_gb_ptr= &hx->inter_gb; | |
7431 | |
7432 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
|
7433 && s->context_initialized |
2793 | 7434 && s->hurry_up < 5 |
5642 | 7435 && (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
|
7436 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE) |
7340 | 7437 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE) |
2793 | 7438 && avctx->skip_frame < AVDISCARD_ALL) |
5642 | 7439 context_count++; |
1168 | 7440 break; |
7441 case NAL_SEI: | |
2815
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
7442 init_get_bits(&s->gb, ptr, bit_length); |
636133fccbdc
workaround 'colocated mv if colocated block is L1 predicted' bug in x264
michael
parents:
2809
diff
changeset
|
7443 decode_sei(h); |
1168 | 7444 break; |
7445 case NAL_SPS: | |
7446 init_get_bits(&s->gb, ptr, bit_length); | |
7447 decode_seq_parameter_set(h); | |
2967 | 7448 |
1168 | 7449 if(s->flags& CODEC_FLAG_LOW_DELAY) |
7450 s->low_delay=1; | |
2967 | 7451 |
2538 | 7452 if(avctx->has_b_frames < 2) |
7453 avctx->has_b_frames= !s->low_delay; | |
1168 | 7454 break; |
7455 case NAL_PPS: | |
7456 init_get_bits(&s->gb, ptr, bit_length); | |
2967 | 7457 |
2755 | 7458 decode_picture_parameter_set(h, bit_length); |
1168 | 7459 |
7460 break; | |
2960 | 7461 case NAL_AUD: |
7462 case NAL_END_SEQUENCE: | |
7463 case NAL_END_STREAM: | |
7464 case NAL_FILLER_DATA: | |
7465 case NAL_SPS_EXT: | |
7466 case NAL_AUXILIARY_SLICE: | |
1168 | 7467 break; |
2979 | 7468 default: |
5631 | 7469 av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n", h->nal_unit_type, bit_length); |
2967 | 7470 } |
5642 | 7471 |
7472 if(context_count == h->max_contexts) { | |
7473 execute_decode_slices(h, context_count); | |
7474 context_count = 0; | |
7475 } | |
7476 | |
7477 if (err < 0) | |
7478 av_log(h->s.avctx, AV_LOG_ERROR, "decode_slice_header error\n"); | |
7479 else if(err == 1) { | |
7480 /* Slice could not be decoded in parallel mode, copy down | |
7481 * NAL unit stuff to context 0 and restart. Note that | |
7374 | 7482 * rbsp_buffer is not transferred, but since we no longer |
5642 | 7483 * run in parallel mode this should not be an issue. */ |
7484 h->nal_unit_type = hx->nal_unit_type; | |
7485 h->nal_ref_idc = hx->nal_ref_idc; | |
7486 hx = h; | |
7487 goto again; | |
7488 } | |
7489 } | |
7490 if(context_count) | |
7491 execute_decode_slices(h, context_count); | |
1168 | 7492 return buf_index; |
7493 } | |
7494 | |
7495 /** | |
2645
42528c1f0246
More spelling errors patch by (Kevin Baragona (kevinmb500 gawab com>)
michael
parents:
2641
diff
changeset
|
7496 * returns the number of bytes consumed for building the current frame |
1168 | 7497 */ |
7498 static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){ | |
5127 | 7499 if(pos==0) pos=1; //avoid infinite loops (i doubt that is needed but ...) |
1168 | 7500 if(pos+10>buf_size) pos=buf_size; // oops ;) |
7501 | |
7502 return pos; | |
7503 } | |
7504 | |
2967 | 7505 static int decode_frame(AVCodecContext *avctx, |
1168 | 7506 void *data, int *data_size, |
6216 | 7507 const uint8_t *buf, int buf_size) |
1168 | 7508 { |
7509 H264Context *h = avctx->priv_data; | |
7510 MpegEncContext *s = &h->s; | |
2967 | 7511 AVFrame *pict = data; |
1168 | 7512 int buf_index; |
2967 | 7513 |
1168 | 7514 s->flags= avctx->flags; |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1706
diff
changeset
|
7515 s->flags2= avctx->flags2; |
1168 | 7516 |
7374 | 7517 /* end of stream, output what is still in the buffers */ |
1168 | 7518 if (buf_size == 0) { |
4556 | 7519 Picture *out; |
7520 int i, out_idx; | |
7521 | |
7522 //FIXME factorize this with the output code below | |
7523 out = h->delayed_pic[0]; | |
7524 out_idx = 0; | |
7772
834a8f89b75e
Try to support invalid h264 that does not mark IDR with POC=0.
michael
parents:
7558
diff
changeset
|
7525 for(i=1; h->delayed_pic[i] && (h->delayed_pic[i]->poc && !h->delayed_pic[i]->key_frame); i++) |
4556 | 7526 if(h->delayed_pic[i]->poc < out->poc){ |
7527 out = h->delayed_pic[i]; | |
7528 out_idx = i; | |
7529 } | |
7530 | |
7531 for(i=out_idx; h->delayed_pic[i]; i++) | |
7532 h->delayed_pic[i] = h->delayed_pic[i+1]; | |
7533 | |
7534 if(out){ | |
7535 *data_size = sizeof(AVFrame); | |
7536 *pict= *(AVFrame*)out; | |
7537 } | |
7538 | |
1168 | 7539 return 0; |
7540 } | |
2967 | 7541 |
2227 | 7542 if(h->is_avc && !h->got_avcC) { |
7543 int i, cnt, nalsize; | |
7544 unsigned char *p = avctx->extradata; | |
7545 if(avctx->extradata_size < 7) { | |
7546 av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); | |
7547 return -1; | |
7548 } | |
7549 if(*p != 1) { | |
7550 av_log(avctx, AV_LOG_ERROR, "Unknown avcC version %d\n", *p); | |
7551 return -1; | |
7552 } | |
7553 /* sps and pps in the avcC always have length coded with 2 bytes, | |
7554 so put a fake nal_length_size = 2 while parsing them */ | |
7555 h->nal_length_size = 2; | |
7556 // Decode sps from avcC | |
7557 cnt = *(p+5) & 0x1f; // Number of sps | |
7558 p += 6; | |
7559 for (i = 0; i < cnt; i++) { | |
4364 | 7560 nalsize = AV_RB16(p) + 2; |
2867
7c7edddaa835
dont be so picky with .mp4 ... fixes Mr&MrsSmith.mp4
michael
parents:
2861
diff
changeset
|
7561 if(decode_nal_units(h, p, nalsize) < 0) { |
2227 | 7562 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i); |
7563 return -1; | |
7564 } | |
7565 p += nalsize; | |
2967 | 7566 } |
2227 | 7567 // Decode pps from avcC |
7568 cnt = *(p++); // Number of pps | |
7569 for (i = 0; i < cnt; i++) { | |
4364 | 7570 nalsize = AV_RB16(p) + 2; |
2227 | 7571 if(decode_nal_units(h, p, nalsize) != nalsize) { |
7572 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i); | |
7573 return -1; | |
7574 } | |
7575 p += nalsize; | |
2967 | 7576 } |
2227 | 7577 // Now store right nal length size, that will be use to parse all other nals |
7578 h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; | |
7579 // Do not reparse avcC | |
7580 h->got_avcC = 1; | |
7581 } | |
7582 | |
7888 | 7583 if(!h->got_avcC && !h->is_avc && s->avctx->extradata_size){ |
2967 | 7584 if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) < 0) |
1168 | 7585 return -1; |
7888 | 7586 h->got_avcC = 1; |
1168 | 7587 } |
7588 | |
7589 buf_index=decode_nal_units(h, buf, buf_size); | |
2967 | 7590 if(buf_index < 0) |
1168 | 7591 return -1; |
7592 | |
4620 | 7593 if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ |
5629
7e5ebda833e9
Remove error raising when explicitely skipping frame
benoit
parents:
5547
diff
changeset
|
7594 if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; |
4620 | 7595 av_log(avctx, AV_LOG_ERROR, "no frame!\n"); |
7596 return -1; | |
7597 } | |
7598 | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7599 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
|
7600 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
|
7601 Picture *cur = s->current_picture_ptr; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7602 int i, pics, cross_idr, out_of_order, out_idx; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7603 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7604 s->mb_y= 0; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7605 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7606 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7607 s->current_picture_ptr->pict_type= s->pict_type; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7608 |
7350 | 7609 if(!s->dropable) { |
7610 execute_ref_pic_marking(h, h->mmco, h->mmco_index); | |
7611 h->prev_poc_msb= h->poc_msb; | |
7612 h->prev_poc_lsb= h->poc_lsb; | |
7613 } | |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7614 h->prev_frame_num_offset= h->frame_num_offset; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7615 h->prev_frame_num= h->frame_num; |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7616 |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7617 /* |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7618 * FIXME: Error handling code does not seem to support interlaced |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7619 * when slices span multiple rows |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7620 * The ff_er_add_slice calls don't work right for bottom |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7621 * fields; they cause massive erroneous error concealing |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7622 * Error marking covers both fields (top and bottom). |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7623 * This causes a mismatched s->error_count |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7624 * and a bad error table. Further, the error count goes to |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7625 * INT_MAX when called for bottom field, because mb_y is |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7626 * past end by one (callers fault) and resync_mb_y != 0 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7627 * causes problems for the first MB line, too. |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7628 */ |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7629 if (!FIELD_PICTURE) |
5803 | 7630 ff_er_frame_end(s); |
4616
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7631 |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7632 MPV_frame_end(s); |
8036b117ae26
support feeding individual NAL units to the decoder instead of just complete frames
michael
parents:
4600
diff
changeset
|
7633 |
7382
f9e70983fc35
Set field_poc (it was half uninitialized before) and use it
michael
parents:
7381
diff
changeset
|
7634 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
|
7635 /* 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
|
7636 *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
|
7637 |
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7638 } else { |
5876
731ee5ad6bde
Correct assignment of interlaced_frame; was being set on output frames,
heydowns
parents:
5825
diff
changeset
|
7639 cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE; |
5904 | 7640 /* Derive top_field_first from field pocs. */ |
7641 cur->top_field_first = cur->field_poc[0] < cur->field_poc[1]; | |
5876
731ee5ad6bde
Correct assignment of interlaced_frame; was being set on output frames,
heydowns
parents:
5825
diff
changeset
|
7642 |
5803 | 7643 //FIXME do something with unavailable reference frames |
2967 | 7644 |
5803 | 7645 /* Sort B-frames into display order */ |
7646 | |
7647 if(h->sps.bitstream_restriction_flag | |
7648 && s->avctx->has_b_frames < h->sps.num_reorder_frames){ | |
7649 s->avctx->has_b_frames = h->sps.num_reorder_frames; | |
7650 s->low_delay = 0; | |
7651 } | |
7652 | |
7325
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
7653 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
|
7654 && !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
|
7655 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
|
7656 s->low_delay= 0; |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
7657 } |
af725308adf4
Take the brain amputated spec literally if the user asks for it (-strict 1).
michael
parents:
7320
diff
changeset
|
7658 |
5803 | 7659 pics = 0; |
7660 while(h->delayed_pic[pics]) pics++; | |
7661 | |
7283
39e81fdd8d23
Move the size of the H264Context delayed_pic array into a #define.
astrange
parents:
7277
diff
changeset
|
7662 assert(pics <= MAX_DELAYED_PIC_COUNT); |
5803 | 7663 |
7664 h->delayed_pic[pics++] = cur; | |
7665 if(cur->reference == 0) | |
7666 cur->reference = DELAYED_PIC_REF; | |
7667 | |
7668 out = h->delayed_pic[0]; | |
7669 out_idx = 0; | |
7772
834a8f89b75e
Try to support invalid h264 that does not mark IDR with POC=0.
michael
parents:
7558
diff
changeset
|
7670 for(i=1; h->delayed_pic[i] && (h->delayed_pic[i]->poc && !h->delayed_pic[i]->key_frame); i++) |
5803 | 7671 if(h->delayed_pic[i]->poc < out->poc){ |
7672 out = h->delayed_pic[i]; | |
7673 out_idx = i; | |
7674 } | |
7772
834a8f89b75e
Try to support invalid h264 that does not mark IDR with POC=0.
michael
parents:
7558
diff
changeset
|
7675 cross_idr = !h->delayed_pic[0]->poc || !!h->delayed_pic[i] || h->delayed_pic[0]->key_frame; |
5803 | 7676 |
7310
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
7677 out_of_order = !cross_idr && out->poc < h->outputed_poc; |
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
7678 |
5803 | 7679 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames) |
7680 { } | |
7320
927ac918cddb
Make the automatic has_b_frames increasing code increase it up to the
michael
parents:
7318
diff
changeset
|
7681 else if((out_of_order && pics-1 == s->avctx->has_b_frames && s->avctx->has_b_frames < MAX_DELAYED_PIC_COUNT) |
5803 | 7682 || (s->low_delay && |
7317 | 7683 ((!cross_idr && out->poc > h->outputed_poc + 2) |
6481 | 7684 || cur->pict_type == FF_B_TYPE))) |
5803 | 7685 { |
7686 s->low_delay = 0; | |
7687 s->avctx->has_b_frames++; | |
7312 | 7688 } |
7689 | |
7316 | 7690 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
|
7691 out->reference &= ~DELAYED_PIC_REF; |
5803 | 7692 for(i=out_idx; h->delayed_pic[i]; i++) |
7693 h->delayed_pic[i] = h->delayed_pic[i+1]; | |
7694 } | |
7316 | 7695 if(!out_of_order && pics > s->avctx->has_b_frames){ |
5803 | 7696 *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
|
7697 |
033d10927d45
Remove delayed_output_pic, I do not understand what this variable was good for.
michael
parents:
7309
diff
changeset
|
7698 h->outputed_poc = out->poc; |
5803 | 7699 *pict= *(AVFrame*)out; |
7316 | 7700 }else{ |
5803 | 7701 av_log(avctx, AV_LOG_DEBUG, "no picture\n"); |
7316 | 7702 } |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5797
diff
changeset
|
7703 } |
2937 | 7704 } |
7705 | |
7706 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
|
7707 ff_print_debug_info(s, pict); |
1168 | 7708 //printf("out %d\n", (int)pict->data[0]); |
7709 #if 0 //? | |
7710 | |
7711 /* Return the Picture timestamp as the frame number */ | |
5963 | 7712 /* we subtract 1 because it is added on utils.c */ |
1168 | 7713 avctx->frame_number = s->picture_number - 1; |
7714 #endif | |
7715 return get_consumed_bytes(s, buf_index, buf_size); | |
7716 } | |
7717 #if 0 | |
7718 static inline void fill_mb_avail(H264Context *h){ | |
7719 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
|
7720 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
1168 | 7721 |
7722 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
|
7723 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
|
7724 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
|
7725 h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num; |
1168 | 7726 }else{ |
7727 h->mb_avail[0]= | |
7728 h->mb_avail[1]= | |
7729 h->mb_avail[2]= 0; | |
7730 } | |
7731 h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num; | |
7732 h->mb_avail[4]= 1; //FIXME move out | |
7733 h->mb_avail[5]= 0; //FIXME move out | |
7734 } | |
7735 #endif | |
7736 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6046
diff
changeset
|
7737 #ifdef TEST |
6172
13aa4cac4dde
Add #undef printf and disable non-functional code to make test program compile.
diego
parents:
6164
diff
changeset
|
7738 #undef printf |
5380
389366aa3458
Fix the self tests which are contained in some codecs and are using random().
takis
parents:
5338
diff
changeset
|
7739 #undef random |
1168 | 7740 #define COUNT 8000 |
7741 #define SIZE (COUNT*40) | |
5934 | 7742 int main(void){ |
1168 | 7743 int i; |
7744 uint8_t temp[SIZE]; | |
7745 PutBitContext pb; | |
7746 GetBitContext gb; | |
7747 // int int_temp[10000]; | |
7748 DSPContext dsp; | |
7749 AVCodecContext avctx; | |
2967 | 7750 |
1168 | 7751 dsputil_init(&dsp, &avctx); |
7752 | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1453
diff
changeset
|
7753 init_put_bits(&pb, temp, SIZE); |
1168 | 7754 printf("testing unsigned exp golomb\n"); |
7755 for(i=0; i<COUNT; i++){ | |
7756 START_TIMER | |
7757 set_ue_golomb(&pb, i); | |
7758 STOP_TIMER("set_ue_golomb"); | |
7759 } | |
7760 flush_put_bits(&pb); | |
2967 | 7761 |
1168 | 7762 init_get_bits(&gb, temp, 8*SIZE); |
7763 for(i=0; i<COUNT; i++){ | |
7764 int j, s; | |
2967 | 7765 |
1168 | 7766 s= show_bits(&gb, 24); |
2967 | 7767 |
1168 | 7768 START_TIMER |
7769 j= get_ue_golomb(&gb); | |
7770 if(j != i){ | |
5127 | 7771 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s); |
1168 | 7772 // return -1; |
7773 } | |
7774 STOP_TIMER("get_ue_golomb"); | |
7775 } | |
2967 | 7776 |
7777 | |
1524 | 7778 init_put_bits(&pb, temp, SIZE); |
1168 | 7779 printf("testing signed exp golomb\n"); |
7780 for(i=0; i<COUNT; i++){ | |
7781 START_TIMER | |
7782 set_se_golomb(&pb, i - COUNT/2); | |
7783 STOP_TIMER("set_se_golomb"); | |
7784 } | |
7785 flush_put_bits(&pb); | |
2967 | 7786 |
1168 | 7787 init_get_bits(&gb, temp, 8*SIZE); |
7788 for(i=0; i<COUNT; i++){ | |
7789 int j, s; | |
2967 | 7790 |
1168 | 7791 s= show_bits(&gb, 24); |
2967 | 7792 |
1168 | 7793 START_TIMER |
7794 j= get_se_golomb(&gb); | |
7795 if(j != i - COUNT/2){ | |
5127 | 7796 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s); |
1168 | 7797 // return -1; |
7798 } | |
7799 STOP_TIMER("get_se_golomb"); | |
7800 } | |
7801 | |
6172
13aa4cac4dde
Add #undef printf and disable non-functional code to make test program compile.
diego
parents:
6164
diff
changeset
|
7802 #if 0 |
1168 | 7803 printf("testing 4x4 (I)DCT\n"); |
2967 | 7804 |
1168 | 7805 DCTELEM block[16]; |
7806 uint8_t src[16], ref[16]; | |
7807 uint64_t error= 0, max_error=0; | |
7808 | |
7809 for(i=0; i<COUNT; i++){ | |
7810 int j; | |
7811 // printf("%d %d %d\n", r1, r2, (r2-r1)*16); | |
7812 for(j=0; j<16; j++){ | |
7813 ref[j]= random()%255; | |
7814 src[j]= random()%255; | |
7815 } | |
7816 | |
7817 h264_diff_dct_c(block, src, ref, 4); | |
2967 | 7818 |
1168 | 7819 //normalize |
7820 for(j=0; j<16; j++){ | |
7821 // printf("%d ", block[j]); | |
7822 block[j]= block[j]*4; | |
7823 if(j&1) block[j]= (block[j]*4 + 2)/5; | |
7824 if(j&4) block[j]= (block[j]*4 + 2)/5; | |
7825 } | |
7826 // printf("\n"); | |
2967 | 7827 |
2272
cd43603c46f9
move h264 idct to its own file and call via function pointer in DspContext
michael
parents:
2255
diff
changeset
|
7828 s->dsp.h264_idct_add(ref, block, 4); |
1168 | 7829 /* for(j=0; j<16; j++){ |
7830 printf("%d ", ref[j]); | |
7831 } | |
7832 printf("\n");*/ | |
2967 | 7833 |
1168 | 7834 for(j=0; j<16; j++){ |
4001 | 7835 int diff= FFABS(src[j] - ref[j]); |
2967 | 7836 |
1168 | 7837 error+= diff*diff; |
7838 max_error= FFMAX(max_error, diff); | |
7839 } | |
7840 } | |
7841 printf("error=%f max_error=%d\n", ((float)error)/COUNT/16, (int)max_error ); | |
7842 printf("testing quantizer\n"); | |
7843 for(qp=0; qp<52; qp++){ | |
7844 for(i=0; i<16; i++) | |
7845 src1_block[i]= src2_block[i]= random()%255; | |
2967 | 7846 |
1168 | 7847 } |
7848 printf("Testing NAL layer\n"); | |
2967 | 7849 |
1168 | 7850 uint8_t bitstream[COUNT]; |
7851 uint8_t nal[COUNT*2]; | |
7852 H264Context h; | |
7853 memset(&h, 0, sizeof(H264Context)); | |
2967 | 7854 |
1168 | 7855 for(i=0; i<COUNT; i++){ |
7856 int zeros= i; | |
7857 int nal_length; | |
7858 int consumed; | |
7859 int out_length; | |
7860 uint8_t *out; | |
7861 int j; | |
2967 | 7862 |
1168 | 7863 for(j=0; j<COUNT; j++){ |
7864 bitstream[j]= (random() % 255) + 1; | |
7865 } | |
2967 | 7866 |
1168 | 7867 for(j=0; j<zeros; j++){ |
7868 int pos= random() % COUNT; | |
7869 while(bitstream[pos] == 0){ | |
7870 pos++; | |
7871 pos %= COUNT; | |
7872 } | |
7873 bitstream[pos]=0; | |
7874 } | |
2967 | 7875 |
1168 | 7876 START_TIMER |
2967 | 7877 |
1168 | 7878 nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2); |
7879 if(nal_length<0){ | |
7880 printf("encoding failed\n"); | |
7881 return -1; | |
7882 } | |
2967 | 7883 |
1168 | 7884 out= decode_nal(&h, nal, &out_length, &consumed, nal_length); |
7885 | |
7886 STOP_TIMER("NAL") | |
2967 | 7887 |
1168 | 7888 if(out_length != COUNT){ |
7889 printf("incorrect length %d %d\n", out_length, COUNT); | |
7890 return -1; | |
7891 } | |
2967 | 7892 |
1168 | 7893 if(consumed != nal_length){ |
7894 printf("incorrect consumed length %d %d\n", nal_length, consumed); | |
7895 return -1; | |
7896 } | |
2967 | 7897 |
1168 | 7898 if(memcmp(bitstream, out, COUNT)){ |
5127 | 7899 printf("mismatch\n"); |
1168 | 7900 return -1; |
7901 } | |
7902 } | |
6172
13aa4cac4dde
Add #undef printf and disable non-functional code to make test program compile.
diego
parents:
6164
diff
changeset
|
7903 #endif |
2967 | 7904 |
1168 | 7905 printf("Testing RBSP\n"); |
2967 | 7906 |
7907 | |
1168 | 7908 return 0; |
7909 } | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6046
diff
changeset
|
7910 #endif /* TEST */ |
1168 | 7911 |
7912 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6490
diff
changeset
|
7913 static av_cold int decode_end(AVCodecContext *avctx) |
1168 | 7914 { |
7915 H264Context *h = avctx->priv_data; | |
7916 MpegEncContext *s = &h->s; | |
7923 | 7917 int i; |
2967 | 7918 |
5174 | 7919 av_freep(&h->rbsp_buffer[0]); |
7920 av_freep(&h->rbsp_buffer[1]); | |
1168 | 7921 free_tables(h); //FIXME cleanup init stuff perhaps |
7923 | 7922 |
7923 for(i = 0; i < MAX_SPS_COUNT; i++) | |
7924 av_freep(h->sps_buffers + i); | |
7925 | |
7926 for(i = 0; i < MAX_PPS_COUNT; i++) | |
7927 av_freep(h->pps_buffers + i); | |
7928 | |
1168 | 7929 MPV_common_end(s); |
7930 | |
7931 // memset(h, 0, sizeof(H264Context)); | |
2967 | 7932 |
1168 | 7933 return 0; |
7934 } | |
7935 | |
7936 | |
7937 AVCodec h264_decoder = { | |
7938 "h264", | |
7939 CODEC_TYPE_VIDEO, | |
7940 CODEC_ID_H264, | |
7941 sizeof(H264Context), | |
7942 decode_init, | |
7943 NULL, | |
7944 decode_end, | |
7945 decode_frame, | |
7359
1980cae356ad
Remove truncated support, use an AVParser if you used that, it is the same.
michael
parents:
7358
diff
changeset
|
7946 /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
2640 | 7947 .flush= flush_dpb, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6933
diff
changeset
|
7948 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), |
1168 | 7949 }; |
7950 | |
1234 | 7951 #include "svq3.c" |