FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mpv_reconstruct_mb_template.c
Date: 2023-06-04 16:45:34
Exec Total Coverage
Lines: 139 152 91.4%
Functions: 3 3 100.0%
Branches: 104 124 83.9%

Line Branch Exec Source
1 /*
2 * MPEG macroblock reconstruction
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #define NOT_MPEG12 0
24 #define MAY_BE_MPEG12 1
25 #define DEFINITELY_MPEG12 2
26
27 /* put block[] to dest[] */
28 5005892 static inline void put_dct(MpegEncContext *s,
29 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
30 {
31 5005892 s->dct_unquantize_intra(s, block, i, qscale);
32 5005892 s->idsp.idct_put(dest, line_size, block);
33 5005892 }
34
35 23529744 static inline void add_dequant_dct(MpegEncContext *s,
36 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
37 {
38
2/2
✓ Branch 0 taken 9248456 times.
✓ Branch 1 taken 14281288 times.
23529744 if (s->block_last_index[i] >= 0) {
39 9248456 s->dct_unquantize_inter(s, block, i, qscale);
40
41 9248456 s->idsp.idct_add(dest, line_size, block);
42 }
43 23529744 }
44
45 /* generic function called after a macroblock has been parsed by the
46 decoder or after it has been encoded by the encoder.
47
48 Important variables used:
49 s->mb_intra : true if intra macroblock
50 s->mv_dir : motion vector direction
51 s->mv_type : motion vector type
52 s->mv : motion vector
53 s->interlaced_dct : true if interlaced dct used (mpeg2)
54 */
55 static av_always_inline
56 9947911 void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64],
57 int lowres_flag, int is_mpeg12)
58 {
59 #define IS_MPEG12(s) (is_mpeg12 == MAY_BE_MPEG12 ? ((s)->out_format == FMT_MPEG1) : is_mpeg12)
60 9947911 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
61
62 9947911 s->current_picture.qscale_table[mb_xy] = s->qscale;
63
64 /* update DC predictors for P macroblocks */
65
2/2
✓ Branch 0 taken 7938643 times.
✓ Branch 1 taken 2009268 times.
9947911 if (!s->mb_intra) {
66
6/6
✓ Branch 0 taken 5697665 times.
✓ Branch 1 taken 2240978 times.
✓ Branch 2 taken 2370187 times.
✓ Branch 3 taken 3327478 times.
✓ Branch 4 taken 103314 times.
✓ Branch 5 taken 2266873 times.
7938643 if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) {
67
2/2
✓ Branch 0 taken 371983 times.
✓ Branch 1 taken 3058809 times.
3430792 if (s->mbintra_table[mb_xy])
68 371983 ff_clean_intra_table_entries(s);
69 } else {
70 4507851 s->last_dc[0] =
71 4507851 s->last_dc[1] =
72 4507851 s->last_dc[2] = 128 << s->intra_dc_precision;
73 }
74
6/6
✓ Branch 0 taken 1691507 times.
✓ Branch 1 taken 317761 times.
✓ Branch 2 taken 1253748 times.
✓ Branch 3 taken 437759 times.
✓ Branch 4 taken 28866 times.
✓ Branch 5 taken 1224882 times.
2009268 } else if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic))
75 466625 s->mbintra_table[mb_xy] = 1;
76
77 #if IS_ENCODER
78
3/6
✓ Branch 0 taken 4867402 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4867402 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4867402 times.
✗ Branch 5 not taken.
4867402 if ((s->avctx->flags & AV_CODEC_FLAG_PSNR) || s->frame_skip_threshold || s->frame_skip_factor ||
79
4/4
✓ Branch 0 taken 3998640 times.
✓ Branch 1 taken 868762 times.
✓ Branch 2 taken 1236488 times.
✓ Branch 3 taken 2762152 times.
4867402 !((s->intra_only || s->pict_type == AV_PICTURE_TYPE_B) &&
80
2/2
✓ Branch 0 taken 1019792 times.
✓ Branch 1 taken 1085458 times.
2105250 s->avctx->mb_decision != FF_MB_DECISION_RD)) // FIXME precalc
81 #endif /* IS_ENCODER */
82 {
83 uint8_t *dest_y, *dest_cb, *dest_cr;
84 int dct_linesize, dct_offset;
85 8862453 const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics
86 8862453 const int uvlinesize = s->current_picture.f->linesize[1];
87
4/4
✓ Branch 0 taken 5037009 times.
✓ Branch 1 taken 43500 times.
✓ Branch 2 taken 3830933 times.
✓ Branch 3 taken 1206076 times.
8862453 const int readable = IS_ENCODER || lowres_flag || s->pict_type != AV_PICTURE_TYPE_B;
88
2/2
✓ Branch 0 taken 43500 times.
✓ Branch 1 taken 8818953 times.
8862453 const int block_size = lowres_flag ? 8 >> s->avctx->lowres : 8;
89
90 /* avoid copy if macroblock skipped in last frame too */
91 /* skip only during decoding as we might trash the buffers during encoding a bit */
92 if (!IS_ENCODER) {
93 5080509 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
94
95
2/2
✓ Branch 0 taken 385834 times.
✓ Branch 1 taken 4694675 times.
5080509 if (s->mb_skipped) {
96 385834 s->mb_skipped = 0;
97 av_assert2(s->pict_type!=AV_PICTURE_TYPE_I);
98 385834 *mbskip_ptr = 1;
99
2/2
✓ Branch 0 taken 1119765 times.
✓ Branch 1 taken 3574910 times.
4694675 } else if(!s->current_picture.reference) {
100 1119765 *mbskip_ptr = 1;
101 } else{
102 3574910 *mbskip_ptr = 0; /* not skipped */
103 }
104 }
105
106 8862453 dct_linesize = linesize << s->interlaced_dct;
107
2/2
✓ Branch 0 taken 8668168 times.
✓ Branch 1 taken 194285 times.
8862453 dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
108
109
2/2
✓ Branch 0 taken 7656377 times.
✓ Branch 1 taken 1206076 times.
8862453 if (readable) {
110 7656377 dest_y = s->dest[0];
111 7656377 dest_cb = s->dest[1];
112 7656377 dest_cr = s->dest[2];
113 } else {
114 1206076 dest_y = s->sc.b_scratchpad;
115 1206076 dest_cb = s->sc.b_scratchpad + 16 * linesize;
116 1206076 dest_cr = s->sc.b_scratchpad + 32 * linesize;
117 }
118
119
2/2
✓ Branch 0 taken 7721947 times.
✓ Branch 1 taken 1140506 times.
8862453 if (!s->mb_intra) {
120 /* motion handling */
121 /* decoding or more than one mb_type (MC was already done otherwise) */
122
123 #if !IS_ENCODER
124
2/2
✓ Branch 0 taken 2213709 times.
✓ Branch 1 taken 2240978 times.
4454687 if (HAVE_THREADS && is_mpeg12 != DEFINITELY_MPEG12 &&
125
2/2
✓ Branch 0 taken 60133 times.
✓ Branch 1 taken 2153576 times.
2213709 s->avctx->active_thread_type & FF_THREAD_FRAME) {
126
1/2
✓ Branch 0 taken 60133 times.
✗ Branch 1 not taken.
60133 if (s->mv_dir & MV_DIR_FORWARD) {
127 60133 ff_thread_await_progress(&s->last_picture_ptr->tf,
128 lowest_referenced_row(s, 0), 0);
129 }
130
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 60133 times.
60133 if (s->mv_dir & MV_DIR_BACKWARD) {
131 ff_thread_await_progress(&s->next_picture_ptr->tf,
132 lowest_referenced_row(s, 1), 0);
133 }
134 }
135
136
2/2
✓ Branch 0 taken 41123 times.
✓ Branch 1 taken 4413564 times.
4454687 if (lowres_flag) {
137 41123 const h264_chroma_mc_func *op_pix = s->h264chroma.put_h264_chroma_pixels_tab;
138
139
2/2
✓ Branch 0 taken 37429 times.
✓ Branch 1 taken 3694 times.
41123 if (s->mv_dir & MV_DIR_FORWARD) {
140 37429 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix);
141 37429 op_pix = s->h264chroma.avg_h264_chroma_pixels_tab;
142 }
143
2/2
✓ Branch 0 taken 18960 times.
✓ Branch 1 taken 22163 times.
41123 if (s->mv_dir & MV_DIR_BACKWARD) {
144 18960 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix);
145 }
146 } else {
147 op_pixels_func (*op_pix)[4];
148 qpel_mc_func (*op_qpix)[16];
149
150
5/6
✓ Branch 0 taken 2172586 times.
✓ Branch 1 taken 2240978 times.
✓ Branch 2 taken 793109 times.
✓ Branch 3 taken 1379477 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 793109 times.
4413564 if ((is_mpeg12 == DEFINITELY_MPEG12 || !s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
151 3620455 op_pix = s->hdsp.put_pixels_tab;
152 3620455 op_qpix = s->qdsp.put_qpel_pixels_tab;
153 } else {
154 793109 op_pix = s->hdsp.put_no_rnd_pixels_tab;
155 793109 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
156 }
157
2/2
✓ Branch 0 taken 4110795 times.
✓ Branch 1 taken 302769 times.
4413564 if (s->mv_dir & MV_DIR_FORWARD) {
158 4110795 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix, op_qpix);
159 4110795 op_pix = s->hdsp.avg_pixels_tab;
160 4110795 op_qpix = s->qdsp.avg_qpel_pixels_tab;
161 }
162
2/2
✓ Branch 0 taken 928562 times.
✓ Branch 1 taken 3485002 times.
4413564 if (s->mv_dir & MV_DIR_BACKWARD) {
163 928562 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix, op_qpix);
164 }
165 }
166
167 /* skip dequant / idct if we are really late ;) */
168
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4454687 times.
4454687 if (s->avctx->skip_idct) {
169 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
170 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
171 || s->avctx->skip_idct >= AVDISCARD_ALL)
172 goto skip_idct;
173 }
174
175 /* add dct residue */
176
7/8
✓ Branch 0 taken 41123 times.
✓ Branch 1 taken 4413564 times.
✓ Branch 2 taken 41123 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2172586 times.
✓ Branch 5 taken 2240978 times.
✓ Branch 6 taken 1845061 times.
✓ Branch 7 taken 368648 times.
4454687 if (!(IS_MPEG12(s) || s->msmpeg4_version ||
177
4/4
✓ Branch 0 taken 1368129 times.
✓ Branch 1 taken 476932 times.
✓ Branch 2 taken 61534 times.
✓ Branch 3 taken 1306595 times.
1845061 (s->codec_id == AV_CODEC_ID_MPEG4 && !s->mpeg_quant)))
178 #endif /* !IS_ENCODER */
179 {
180 3805726 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
181 3805726 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
182 3805726 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
183 3805726 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
184
185 538466 if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
186
2/2
✓ Branch 0 taken 3458032 times.
✓ Branch 1 taken 347694 times.
3805726 if (s->chroma_y_shift) {
187 3458032 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
188 3458032 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
189 } else {
190 347694 dct_linesize >>= 1;
191 347694 dct_offset >>= 1;
192 347694 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
193 347694 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
194 347694 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
195 347694 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
196 }
197 }
198 }
199 #if !IS_ENCODER
200
4/4
✓ Branch 0 taken 1675243 times.
✓ Branch 1 taken 2240978 times.
✓ Branch 2 taken 1485094 times.
✓ Branch 3 taken 190149 times.
3916221 else if (is_mpeg12 == DEFINITELY_MPEG12 || (s->codec_id != AV_CODEC_ID_WMV2)) {
201 3726072 add_dct(s, block[0], 0, dest_y , dct_linesize);
202 3726072 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
203 3726072 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
204 3726072 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
205
206 3726072 if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
207
2/2
✓ Branch 0 taken 3659121 times.
✓ Branch 1 taken 66951 times.
3726072 if (s->chroma_y_shift) {//Chroma420
208 3659121 add_dct(s, block[4], 4, dest_cb, uvlinesize);
209 3659121 add_dct(s, block[5], 5, dest_cr, uvlinesize);
210 } else {
211 //chroma422
212 66951 dct_linesize = uvlinesize << s->interlaced_dct;
213
2/2
✓ Branch 0 taken 65730 times.
✓ Branch 1 taken 1221 times.
66951 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
214
215 66951 add_dct(s, block[4], 4, dest_cb, dct_linesize);
216 66951 add_dct(s, block[5], 5, dest_cr, dct_linesize);
217 66951 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
218 66951 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 66951 times.
66951 if (!s->chroma_x_shift) {//Chroma444
220 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
221 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
222 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
223 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
224 }
225 }
226 } //fi gray
227 } else if (CONFIG_WMV2_DECODER) {
228 190149 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
229 }
230 #endif /* !IS_ENCODER */
231 } else {
232 #if !IS_ENCODER
233 /* Only MPEG-4 Simple Studio Profile is supported in > 8-bit mode.
234 TODO: Integrate 10-bit properly into mpegvideo.c so that ER works properly */
235
2/2
✓ Branch 0 taken 308061 times.
✓ Branch 1 taken 317761 times.
625822 if (is_mpeg12 != DEFINITELY_MPEG12 && CONFIG_MPEG4_DECODER &&
236 /* s->codec_id == AV_CODEC_ID_MPEG4 && */
237
2/2
✓ Branch 0 taken 1350 times.
✓ Branch 1 taken 306711 times.
308061 s->avctx->bits_per_raw_sample > 8) {
238 1350 ff_mpeg4_decode_studio(s, dest_y, dest_cb, dest_cr, block_size,
239 uvlinesize, dct_linesize, dct_offset);
240
4/4
✓ Branch 0 taken 2377 times.
✓ Branch 1 taken 622095 times.
✓ Branch 2 taken 306711 times.
✓ Branch 3 taken 317761 times.
624472 } else if (!IS_MPEG12(s))
241 #endif /* !IS_ENCODER */
242 {
243 /* dct only in intra block */
244 821395 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
245 821395 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
246 821395 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
247 821395 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
248
249 if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
250
2/2
✓ Branch 0 taken 782634 times.
✓ Branch 1 taken 38761 times.
821395 if (s->chroma_y_shift) {
251 782634 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
252 782634 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
253 } else {
254 38761 dct_offset >>=1;
255 38761 dct_linesize >>=1;
256 38761 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
257 38761 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
258 38761 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
259 38761 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
260 }
261 }
262 }
263 #if !IS_ENCODER
264 else {
265 317761 s->idsp.idct_put(dest_y, dct_linesize, block[0]);
266 317761 s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
267 317761 s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]);
268 317761 s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
269
270 if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
271
2/2
✓ Branch 0 taken 263602 times.
✓ Branch 1 taken 54159 times.
317761 if (s->chroma_y_shift) {
272 263602 s->idsp.idct_put(dest_cb, uvlinesize, block[4]);
273 263602 s->idsp.idct_put(dest_cr, uvlinesize, block[5]);
274 } else {
275 54159 dct_linesize = uvlinesize << s->interlaced_dct;
276
2/2
✓ Branch 0 taken 54119 times.
✓ Branch 1 taken 40 times.
54159 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
277
278 54159 s->idsp.idct_put(dest_cb, dct_linesize, block[4]);
279 54159 s->idsp.idct_put(dest_cr, dct_linesize, block[5]);
280 54159 s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
281 54159 s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
282
1/2
✓ Branch 0 taken 54159 times.
✗ Branch 1 not taken.
54159 if (!s->chroma_x_shift) { //Chroma444
283 s->idsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
284 s->idsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
285 s->idsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
286 s->idsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
287 }
288 }
289 } //gray
290 }
291 }
292 54159 skip_idct:
293
2/2
✓ Branch 0 taken 1206076 times.
✓ Branch 1 taken 3874433 times.
5080509 if (!readable) {
294 1206076 s->hdsp.put_pixels_tab[0][0](s->dest[0], dest_y, linesize, 16);
295 if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
296 1206076 s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize, 16 >> s->chroma_y_shift);
297 1206076 s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize, 16 >> s->chroma_y_shift);
298 }
299 #endif /* !IS_ENCODER */
300 }
301 }
302 9947911 }
303
304