avcodec: Remove some commented-out debug cruft
[ffmpeg.git] / libavcodec / h264.c
1 /*
2  * H.26L/H.264/AVC/JVT/14496-10/... decoder
3  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav is distributed in the hope that it will be useful,
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
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * H.264 / AVC / MPEG4 part10 codec.
25  * @author Michael Niedermayer <michaelni@gmx.at>
26  */
27
28 #include "libavutil/avassert.h"
29 #include "libavutil/imgutils.h"
30 #include "internal.h"
31 #include "cabac.h"
32 #include "cabac_functions.h"
33 #include "dsputil.h"
34 #include "error_resilience.h"
35 #include "avcodec.h"
36 #include "mpegvideo.h"
37 #include "h264.h"
38 #include "h264data.h"
39 #include "h264chroma.h"
40 #include "h264_mvpred.h"
41 #include "golomb.h"
42 #include "mathops.h"
43 #include "rectangle.h"
44 #include "svq3.h"
45 #include "thread.h"
46
47 #include <assert.h>
48
49 const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 };
50
51 static const uint8_t rem6[QP_MAX_NUM + 1] = {
52     0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
53     3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
54     0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
55 };
56
57 static const uint8_t div6[QP_MAX_NUM + 1] = {
58     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3,  3,  3,
59     3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,  6,  6,
60     7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
61 };
62
63 static const enum AVPixelFormat h264_hwaccel_pixfmt_list_420[] = {
64 #if CONFIG_H264_DXVA2_HWACCEL
65     AV_PIX_FMT_DXVA2_VLD,
66 #endif
67 #if CONFIG_H264_VAAPI_HWACCEL
68     AV_PIX_FMT_VAAPI_VLD,
69 #endif
70 #if CONFIG_H264_VDA_HWACCEL
71     AV_PIX_FMT_VDA_VLD,
72 #endif
73 #if CONFIG_H264_VDPAU_HWACCEL
74     AV_PIX_FMT_VDPAU,
75 #endif
76     AV_PIX_FMT_YUV420P,
77     AV_PIX_FMT_NONE
78 };
79
80 static const enum AVPixelFormat h264_hwaccel_pixfmt_list_jpeg_420[] = {
81 #if CONFIG_H264_DXVA2_HWACCEL
82     AV_PIX_FMT_DXVA2_VLD,
83 #endif
84 #if CONFIG_H264_VAAPI_HWACCEL
85     AV_PIX_FMT_VAAPI_VLD,
86 #endif
87 #if CONFIG_H264_VDA_HWACCEL
88     AV_PIX_FMT_VDA_VLD,
89 #endif
90 #if CONFIG_H264_VDPAU_HWACCEL
91     AV_PIX_FMT_VDPAU,
92 #endif
93     AV_PIX_FMT_YUVJ420P,
94     AV_PIX_FMT_NONE
95 };
96
97 static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
98                               int (*mv)[2][4][2],
99                               int mb_x, int mb_y, int mb_intra, int mb_skipped)
100 {
101     H264Context *h = opaque;
102
103     h->mb_x  = mb_x;
104     h->mb_y  = mb_y;
105     h->mb_xy = mb_x + mb_y * h->mb_stride;
106     memset(h->non_zero_count_cache, 0, sizeof(h->non_zero_count_cache));
107     assert(ref >= 0);
108     /* FIXME: It is possible albeit uncommon that slice references
109      * differ between slices. We take the easy approach and ignore
110      * it for now. If this turns out to have any relevance in
111      * practice then correct remapping should be added. */
112     if (ref >= h->ref_count[0])
113         ref = 0;
114     fill_rectangle(&h->cur_pic.ref_index[0][4 * h->mb_xy],
115                    2, 2, 2, ref, 1);
116     fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1);
117     fill_rectangle(h->mv_cache[0][scan8[0]], 4, 4, 8,
118                    pack16to32((*mv)[0][0][0], (*mv)[0][0][1]), 4);
119     assert(!FRAME_MBAFF(h));
120     ff_h264_hl_decode_mb(h);
121 }
122
123 void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
124 {
125     AVCodecContext *avctx = h->avctx;
126     Picture *cur  = &h->cur_pic;
127     Picture *last = h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL;
128     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
129     int vshift = desc->log2_chroma_h;
130     const int field_pic = h->picture_structure != PICT_FRAME;
131     if (field_pic) {
132         height <<= 1;
133         y      <<= 1;
134     }
135
136     height = FFMIN(height, avctx->height - y);
137
138     if (field_pic && h->first_field && !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD))
139         return;
140
141     if (avctx->draw_horiz_band) {
142         AVFrame *src;
143         int offset[AV_NUM_DATA_POINTERS];
144         int i;
145
146         if (cur->f.pict_type == AV_PICTURE_TYPE_B || h->low_delay ||
147             (avctx->slice_flags & SLICE_FLAG_CODED_ORDER))
148             src = &cur->f;
149         else if (last)
150             src = &last->f;
151         else
152             return;
153
154         offset[0] = y * src->linesize[0];
155         offset[1] =
156         offset[2] = (y >> vshift) * src->linesize[1];
157         for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
158             offset[i] = 0;
159
160         emms_c();
161
162         avctx->draw_horiz_band(avctx, src, offset,
163                                y, h->picture_structure, height);
164     }
165 }
166
167 static void unref_picture(H264Context *h, Picture *pic)
168 {
169     int off = offsetof(Picture, tf) + sizeof(pic->tf);
170     int i;
171
172     if (!pic->f.data[0])
173         return;
174
175     ff_thread_release_buffer(h->avctx, &pic->tf);
176     av_buffer_unref(&pic->hwaccel_priv_buf);
177
178     av_buffer_unref(&pic->qscale_table_buf);
179     av_buffer_unref(&pic->mb_type_buf);
180     for (i = 0; i < 2; i++) {
181         av_buffer_unref(&pic->motion_val_buf[i]);
182         av_buffer_unref(&pic->ref_index_buf[i]);
183     }
184
185     memset((uint8_t*)pic + off, 0, sizeof(*pic) - off);
186 }
187
188 static void release_unused_pictures(H264Context *h, int remove_current)
189 {
190     int i;
191
192     /* release non reference frames */
193     for (i = 0; i < MAX_PICTURE_COUNT; i++) {
194         if (h->DPB[i].f.data[0] && !h->DPB[i].reference &&
195             (remove_current || &h->DPB[i] != h->cur_pic_ptr)) {
196             unref_picture(h, &h->DPB[i]);
197         }
198     }
199 }
200
201 static int ref_picture(H264Context *h, Picture *dst, Picture *src)
202 {
203     int ret, i;
204
205     av_assert0(!dst->f.buf[0]);
206     av_assert0(src->f.buf[0]);
207
208     src->tf.f = &src->f;
209     dst->tf.f = &dst->f;
210     ret = ff_thread_ref_frame(&dst->tf, &src->tf);
211     if (ret < 0)
212         goto fail;
213
214     dst->qscale_table_buf = av_buffer_ref(src->qscale_table_buf);
215     dst->mb_type_buf      = av_buffer_ref(src->mb_type_buf);
216     if (!dst->qscale_table_buf || !dst->mb_type_buf)
217         goto fail;
218     dst->qscale_table = src->qscale_table;
219     dst->mb_type      = src->mb_type;
220
221     for (i = 0; i < 2; i++) {
222         dst->motion_val_buf[i] = av_buffer_ref(src->motion_val_buf[i]);
223         dst->ref_index_buf[i]  = av_buffer_ref(src->ref_index_buf[i]);
224         if (!dst->motion_val_buf[i] || !dst->ref_index_buf[i])
225             goto fail;
226         dst->motion_val[i] = src->motion_val[i];
227         dst->ref_index[i]  = src->ref_index[i];
228     }
229
230     if (src->hwaccel_picture_private) {
231         dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf);
232         if (!dst->hwaccel_priv_buf)
233             goto fail;
234         dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data;
235     }
236
237     for (i = 0; i < 2; i++)
238         dst->field_poc[i] = src->field_poc[i];
239
240     memcpy(dst->ref_poc,   src->ref_poc,   sizeof(src->ref_poc));
241     memcpy(dst->ref_count, src->ref_count, sizeof(src->ref_count));
242
243     dst->poc           = src->poc;
244     dst->frame_num     = src->frame_num;
245     dst->mmco_reset    = src->mmco_reset;
246     dst->pic_id        = src->pic_id;
247     dst->long_ref      = src->long_ref;
248     dst->mbaff         = src->mbaff;
249     dst->field_picture = src->field_picture;
250     dst->needs_realloc = src->needs_realloc;
251     dst->reference     = src->reference;
252
253     return 0;
254 fail:
255     unref_picture(h, dst);
256     return ret;
257 }
258
259 static int alloc_scratch_buffers(H264Context *h, int linesize)
260 {
261     int alloc_size = FFALIGN(FFABS(linesize) + 32, 32);
262
263     if (h->bipred_scratchpad)
264         return 0;
265
266     h->bipred_scratchpad = av_malloc(16 * 6 * alloc_size);
267     // edge emu needs blocksize + filter length - 1
268     // (= 21x21 for  h264)
269     h->edge_emu_buffer = av_mallocz(alloc_size * 2 * 21);
270     h->me.scratchpad   = av_mallocz(alloc_size * 2 * 16 * 2);
271
272     if (!h->bipred_scratchpad || !h->edge_emu_buffer || !h->me.scratchpad) {
273         av_freep(&h->bipred_scratchpad);
274         av_freep(&h->edge_emu_buffer);
275         av_freep(&h->me.scratchpad);
276         return AVERROR(ENOMEM);
277     }
278
279     h->me.temp = h->me.scratchpad;
280
281     return 0;
282 }
283
284 static int init_table_pools(H264Context *h)
285 {
286     const int big_mb_num    = h->mb_stride * (h->mb_height + 1) + 1;
287     const int mb_array_size = h->mb_stride * h->mb_height;
288     const int b4_stride     = h->mb_width * 4 + 1;
289     const int b4_array_size = b4_stride * h->mb_height * 4;
290
291     h->qscale_table_pool = av_buffer_pool_init(big_mb_num + h->mb_stride,
292                                                av_buffer_allocz);
293     h->mb_type_pool      = av_buffer_pool_init((big_mb_num + h->mb_stride) *
294                                                sizeof(uint32_t), av_buffer_allocz);
295     h->motion_val_pool = av_buffer_pool_init(2 * (b4_array_size + 4) *
296                                              sizeof(int16_t), av_buffer_allocz);
297     h->ref_index_pool  = av_buffer_pool_init(4 * mb_array_size, av_buffer_allocz);
298
299     if (!h->qscale_table_pool || !h->mb_type_pool || !h->motion_val_pool ||
300         !h->ref_index_pool) {
301         av_buffer_pool_uninit(&h->qscale_table_pool);
302         av_buffer_pool_uninit(&h->mb_type_pool);
303         av_buffer_pool_uninit(&h->motion_val_pool);
304         av_buffer_pool_uninit(&h->ref_index_pool);
305         return AVERROR(ENOMEM);
306     }
307
308     return 0;
309 }
310
311 static int alloc_picture(H264Context *h, Picture *pic)
312 {
313     int i, ret = 0;
314
315     av_assert0(!pic->f.data[0]);
316
317     pic->tf.f = &pic->f;
318     ret = ff_thread_get_buffer(h->avctx, &pic->tf, pic->reference ?
319                                                    AV_GET_BUFFER_FLAG_REF : 0);
320     if (ret < 0)
321         goto fail;
322
323     h->linesize   = pic->f.linesize[0];
324     h->uvlinesize = pic->f.linesize[1];
325
326     if (h->avctx->hwaccel) {
327         const AVHWAccel *hwaccel = h->avctx->hwaccel;
328         av_assert0(!pic->hwaccel_picture_private);
329         if (hwaccel->priv_data_size) {
330             pic->hwaccel_priv_buf = av_buffer_allocz(hwaccel->priv_data_size);
331             if (!pic->hwaccel_priv_buf)
332                 return AVERROR(ENOMEM);
333             pic->hwaccel_picture_private = pic->hwaccel_priv_buf->data;
334         }
335     }
336
337     if (!h->qscale_table_pool) {
338         ret = init_table_pools(h);
339         if (ret < 0)
340             goto fail;
341     }
342
343     pic->qscale_table_buf = av_buffer_pool_get(h->qscale_table_pool);
344     pic->mb_type_buf      = av_buffer_pool_get(h->mb_type_pool);
345     if (!pic->qscale_table_buf || !pic->mb_type_buf)
346         goto fail;
347
348     pic->mb_type      = (uint32_t*)pic->mb_type_buf->data + 2 * h->mb_stride + 1;
349     pic->qscale_table = pic->qscale_table_buf->data + 2 * h->mb_stride + 1;
350
351     for (i = 0; i < 2; i++) {
352         pic->motion_val_buf[i] = av_buffer_pool_get(h->motion_val_pool);
353         pic->ref_index_buf[i]  = av_buffer_pool_get(h->ref_index_pool);
354         if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i])
355             goto fail;
356
357         pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
358         pic->ref_index[i]  = pic->ref_index_buf[i]->data;
359     }
360
361     return 0;
362 fail:
363     unref_picture(h, pic);
364     return (ret < 0) ? ret : AVERROR(ENOMEM);
365 }
366
367 static inline int pic_is_unused(H264Context *h, Picture *pic)
368 {
369     if (pic->f.data[0] == NULL)
370         return 1;
371     if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF))
372         return 1;
373     return 0;
374 }
375
376 static int find_unused_picture(H264Context *h)
377 {
378     int i;
379
380     for (i = 0; i < MAX_PICTURE_COUNT; i++) {
381         if (pic_is_unused(h, &h->DPB[i]))
382             break;
383     }
384     if (i == MAX_PICTURE_COUNT)
385         return AVERROR_INVALIDDATA;
386
387     if (h->DPB[i].needs_realloc) {
388         h->DPB[i].needs_realloc = 0;
389         unref_picture(h, &h->DPB[i]);
390     }
391
392     return i;
393 }
394
395 /**
396  * Check if the top & left blocks are available if needed and
397  * change the dc mode so it only uses the available blocks.
398  */
399 int ff_h264_check_intra4x4_pred_mode(H264Context *h)
400 {
401     static const int8_t top[12] = {
402         -1, 0, LEFT_DC_PRED, -1, -1, -1, -1, -1, 0
403     };
404     static const int8_t left[12] = {
405         0, -1, TOP_DC_PRED, 0, -1, -1, -1, 0, -1, DC_128_PRED
406     };
407     int i;
408
409     if (!(h->top_samples_available & 0x8000)) {
410         for (i = 0; i < 4; i++) {
411             int status = top[h->intra4x4_pred_mode_cache[scan8[0] + i]];
412             if (status < 0) {
413                 av_log(h->avctx, AV_LOG_ERROR,
414                        "top block unavailable for requested intra4x4 mode %d at %d %d\n",
415                        status, h->mb_x, h->mb_y);
416                 return AVERROR_INVALIDDATA;
417             } else if (status) {
418                 h->intra4x4_pred_mode_cache[scan8[0] + i] = status;
419             }
420         }
421     }
422
423     if ((h->left_samples_available & 0x8888) != 0x8888) {
424         static const int mask[4] = { 0x8000, 0x2000, 0x80, 0x20 };
425         for (i = 0; i < 4; i++)
426             if (!(h->left_samples_available & mask[i])) {
427                 int status = left[h->intra4x4_pred_mode_cache[scan8[0] + 8 * i]];
428                 if (status < 0) {
429                     av_log(h->avctx, AV_LOG_ERROR,
430                            "left block unavailable for requested intra4x4 mode %d at %d %d\n",
431                            status, h->mb_x, h->mb_y);
432                     return AVERROR_INVALIDDATA;
433                 } else if (status) {
434                     h->intra4x4_pred_mode_cache[scan8[0] + 8 * i] = status;
435                 }
436             }
437     }
438
439     return 0;
440 } // FIXME cleanup like ff_h264_check_intra_pred_mode
441
442 /**
443  * Check if the top & left blocks are available if needed and
444  * change the dc mode so it only uses the available blocks.
445  */
446 int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma)
447 {
448     static const int8_t top[7]  = { LEFT_DC_PRED8x8, 1, -1, -1 };
449     static const int8_t left[7] = { TOP_DC_PRED8x8, -1, 2, -1, DC_128_PRED8x8 };
450
451     if (mode > 6U) {
452         av_log(h->avctx, AV_LOG_ERROR,
453                "out of range intra chroma pred mode at %d %d\n",
454                h->mb_x, h->mb_y);
455         return AVERROR_INVALIDDATA;
456     }
457
458     if (!(h->top_samples_available & 0x8000)) {
459         mode = top[mode];
460         if (mode < 0) {
461             av_log(h->avctx, AV_LOG_ERROR,
462                    "top block unavailable for requested intra mode at %d %d\n",
463                    h->mb_x, h->mb_y);
464             return AVERROR_INVALIDDATA;
465         }
466     }
467
468     if ((h->left_samples_available & 0x8080) != 0x8080) {
469         mode = left[mode];
470         if (is_chroma && (h->left_samples_available & 0x8080)) {
471             // mad cow disease mode, aka MBAFF + constrained_intra_pred
472             mode = ALZHEIMER_DC_L0T_PRED8x8 +
473                    (!(h->left_samples_available & 0x8000)) +
474                    2 * (mode == DC_128_PRED8x8);
475         }
476         if (mode < 0) {
477             av_log(h->avctx, AV_LOG_ERROR,
478                    "left block unavailable for requested intra mode at %d %d\n",
479                    h->mb_x, h->mb_y);
480             return AVERROR_INVALIDDATA;
481         }
482     }
483
484     return mode;
485 }
486
487 const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
488                                   int *dst_length, int *consumed, int length)
489 {
490     int i, si, di;
491     uint8_t *dst;
492     int bufidx;
493
494     // src[0]&0x80; // forbidden bit
495     h->nal_ref_idc   = src[0] >> 5;
496     h->nal_unit_type = src[0] & 0x1F;
497
498     src++;
499     length--;
500
501 #define STARTCODE_TEST                                                  \
502     if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) {         \
503         if (src[i + 2] != 3) {                                          \
504             /* startcode, so we must be past the end */                 \
505             length = i;                                                 \
506         }                                                               \
507         break;                                                          \
508     }
509
510 #if HAVE_FAST_UNALIGNED
511 #define FIND_FIRST_ZERO                                                 \
512     if (i > 0 && !src[i])                                               \
513         i--;                                                            \
514     while (src[i])                                                      \
515         i++
516
517 #if HAVE_FAST_64BIT
518     for (i = 0; i + 1 < length; i += 9) {
519         if (!((~AV_RN64A(src + i) &
520                (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
521               0x8000800080008080ULL))
522             continue;
523         FIND_FIRST_ZERO;
524         STARTCODE_TEST;
525         i -= 7;
526     }
527 #else
528     for (i = 0; i + 1 < length; i += 5) {
529         if (!((~AV_RN32A(src + i) &
530                (AV_RN32A(src + i) - 0x01000101U)) &
531               0x80008080U))
532             continue;
533         FIND_FIRST_ZERO;
534         STARTCODE_TEST;
535         i -= 3;
536     }
537 #endif
538 #else
539     for (i = 0; i + 1 < length; i += 2) {
540         if (src[i])
541             continue;
542         if (i > 0 && src[i - 1] == 0)
543             i--;
544         STARTCODE_TEST;
545     }
546 #endif
547
548     if (i >= length - 1) { // no escaped 0
549         *dst_length = length;
550         *consumed   = length + 1; // +1 for the header
551         return src;
552     }
553
554     // use second escape buffer for inter data
555     bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0;
556     av_fast_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx],
557                    length + FF_INPUT_BUFFER_PADDING_SIZE);
558     dst = h->rbsp_buffer[bufidx];
559
560     if (dst == NULL)
561         return NULL;
562
563     memcpy(dst, src, i);
564     si = di = i;
565     while (si + 2 < length) {
566         // remove escapes (very rare 1:2^22)
567         if (src[si + 2] > 3) {
568             dst[di++] = src[si++];
569             dst[di++] = src[si++];
570         } else if (src[si] == 0 && src[si + 1] == 0) {
571             if (src[si + 2] == 3) { // escape
572                 dst[di++]  = 0;
573                 dst[di++]  = 0;
574                 si        += 3;
575                 continue;
576             } else // next start code
577                 goto nsc;
578         }
579
580         dst[di++] = src[si++];
581     }
582     while (si < length)
583         dst[di++] = src[si++];
584
585 nsc:
586     memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
587
588     *dst_length = di;
589     *consumed   = si + 1; // +1 for the header
590     /* FIXME store exact number of bits in the getbitcontext
591      * (it is needed for decoding) */
592     return dst;
593 }
594
595 /**
596  * Identify the exact end of the bitstream
597  * @return the length of the trailing, or 0 if damaged
598  */
599 static int decode_rbsp_trailing(H264Context *h, const uint8_t *src)
600 {
601     int v = *src;
602     int r;
603
604     tprintf(h->avctx, "rbsp trailing %X\n", v);
605
606     for (r = 1; r < 9; r++) {
607         if (v & 1)
608             return r;
609         v >>= 1;
610     }
611     return 0;
612 }
613
614 static inline int get_lowest_part_list_y(H264Context *h, Picture *pic, int n,
615                                          int height, int y_offset, int list)
616 {
617     int raw_my             = h->mv_cache[list][scan8[n]][1];
618     int filter_height_up   = (raw_my & 3) ? 2 : 0;
619     int filter_height_down = (raw_my & 3) ? 3 : 0;
620     int full_my            = (raw_my >> 2) + y_offset;
621     int top                = full_my - filter_height_up;
622     int bottom             = full_my + filter_height_down + height;
623
624     return FFMAX(abs(top), bottom);
625 }
626
627 static inline void get_lowest_part_y(H264Context *h, int refs[2][48], int n,
628                                      int height, int y_offset, int list0,
629                                      int list1, int *nrefs)
630 {
631     int my;
632
633     y_offset += 16 * (h->mb_y >> MB_FIELD(h));
634
635     if (list0) {
636         int ref_n    = h->ref_cache[0][scan8[n]];
637         Picture *ref = &h->ref_list[0][ref_n];
638
639         // Error resilience puts the current picture in the ref list.
640         // Don't try to wait on these as it will cause a deadlock.
641         // Fields can wait on each other, though.
642         if (ref->tf.progress->data != h->cur_pic.tf.progress->data ||
643             (ref->reference & 3) != h->picture_structure) {
644             my = get_lowest_part_list_y(h, ref, n, height, y_offset, 0);
645             if (refs[0][ref_n] < 0)
646                 nrefs[0] += 1;
647             refs[0][ref_n] = FFMAX(refs[0][ref_n], my);
648         }
649     }
650
651     if (list1) {
652         int ref_n    = h->ref_cache[1][scan8[n]];
653         Picture *ref = &h->ref_list[1][ref_n];
654
655         if (ref->tf.progress->data != h->cur_pic.tf.progress->data ||
656             (ref->reference & 3) != h->picture_structure) {
657             my = get_lowest_part_list_y(h, ref, n, height, y_offset, 1);
658             if (refs[1][ref_n] < 0)
659                 nrefs[1] += 1;
660             refs[1][ref_n] = FFMAX(refs[1][ref_n], my);
661         }
662     }
663 }
664
665 /**
666  * Wait until all reference frames are available for MC operations.
667  *
668  * @param h the H264 context
669  */
670 static void await_references(H264Context *h)
671 {
672     const int mb_xy   = h->mb_xy;
673     const int mb_type = h->cur_pic.mb_type[mb_xy];
674     int refs[2][48];
675     int nrefs[2] = { 0 };
676     int ref, list;
677
678     memset(refs, -1, sizeof(refs));
679
680     if (IS_16X16(mb_type)) {
681         get_lowest_part_y(h, refs, 0, 16, 0,
682                           IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), nrefs);
683     } else if (IS_16X8(mb_type)) {
684         get_lowest_part_y(h, refs, 0, 8, 0,
685                           IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), nrefs);
686         get_lowest_part_y(h, refs, 8, 8, 8,
687                           IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1), nrefs);
688     } else if (IS_8X16(mb_type)) {
689         get_lowest_part_y(h, refs, 0, 16, 0,
690                           IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), nrefs);
691         get_lowest_part_y(h, refs, 4, 16, 0,
692                           IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1), nrefs);
693     } else {
694         int i;
695
696         assert(IS_8X8(mb_type));
697
698         for (i = 0; i < 4; i++) {
699             const int sub_mb_type = h->sub_mb_type[i];
700             const int n           = 4 * i;
701             int y_offset          = (i & 2) << 2;
702
703             if (IS_SUB_8X8(sub_mb_type)) {
704                 get_lowest_part_y(h, refs, n, 8, y_offset,
705                                   IS_DIR(sub_mb_type, 0, 0),
706                                   IS_DIR(sub_mb_type, 0, 1),
707                                   nrefs);
708             } else if (IS_SUB_8X4(sub_mb_type)) {
709                 get_lowest_part_y(h, refs, n, 4, y_offset,
710                                   IS_DIR(sub_mb_type, 0, 0),
711                                   IS_DIR(sub_mb_type, 0, 1),
712                                   nrefs);
713                 get_lowest_part_y(h, refs, n + 2, 4, y_offset + 4,
714                                   IS_DIR(sub_mb_type, 0, 0),
715                                   IS_DIR(sub_mb_type, 0, 1),
716                                   nrefs);
717             } else if (IS_SUB_4X8(sub_mb_type)) {
718                 get_lowest_part_y(h, refs, n, 8, y_offset,
719                                   IS_DIR(sub_mb_type, 0, 0),
720                                   IS_DIR(sub_mb_type, 0, 1),
721                                   nrefs);
722                 get_lowest_part_y(h, refs, n + 1, 8, y_offset,
723                                   IS_DIR(sub_mb_type, 0, 0),
724                                   IS_DIR(sub_mb_type, 0, 1),
725                                   nrefs);
726             } else {
727                 int j;
728                 assert(IS_SUB_4X4(sub_mb_type));
729                 for (j = 0; j < 4; j++) {
730                     int sub_y_offset = y_offset + 2 * (j & 2);
731                     get_lowest_part_y(h, refs, n + j, 4, sub_y_offset,
732                                       IS_DIR(sub_mb_type, 0, 0),
733                                       IS_DIR(sub_mb_type, 0, 1),
734                                       nrefs);
735                 }
736             }
737         }
738     }
739
740     for (list = h->list_count - 1; list >= 0; list--)
741         for (ref = 0; ref < 48 && nrefs[list]; ref++) {
742             int row = refs[list][ref];
743             if (row >= 0) {
744                 Picture *ref_pic      = &h->ref_list[list][ref];
745                 int ref_field         = ref_pic->reference - 1;
746                 int ref_field_picture = ref_pic->field_picture;
747                 int pic_height        = 16 * h->mb_height >> ref_field_picture;
748
749                 row <<= MB_MBAFF(h);
750                 nrefs[list]--;
751
752                 if (!FIELD_PICTURE(h) && ref_field_picture) { // frame referencing two fields
753                     ff_thread_await_progress(&ref_pic->tf,
754                                              FFMIN((row >> 1) - !(row & 1),
755                                                    pic_height - 1),
756                                              1);
757                     ff_thread_await_progress(&ref_pic->tf,
758                                              FFMIN((row >> 1), pic_height - 1),
759                                              0);
760                 } else if (FIELD_PICTURE(h) && !ref_field_picture) { // field referencing one field of a frame
761                     ff_thread_await_progress(&ref_pic->tf,
762                                              FFMIN(row * 2 + ref_field,
763                                                    pic_height - 1),
764                                              0);
765                 } else if (FIELD_PICTURE(h)) {
766                     ff_thread_await_progress(&ref_pic->tf,
767                                              FFMIN(row, pic_height - 1),
768                                              ref_field);
769                 } else {
770                     ff_thread_await_progress(&ref_pic->tf,
771                                              FFMIN(row, pic_height - 1),
772                                              0);
773                 }
774             }
775         }
776 }
777
778 static av_always_inline void mc_dir_part(H264Context *h, Picture *pic,
779                                          int n, int square, int height,
780                                          int delta, int list,
781                                          uint8_t *dest_y, uint8_t *dest_cb,
782                                          uint8_t *dest_cr,
783                                          int src_x_offset, int src_y_offset,
784                                          qpel_mc_func *qpix_op,
785                                          h264_chroma_mc_func chroma_op,
786                                          int pixel_shift, int chroma_idc)
787 {
788     const int mx      = h->mv_cache[list][scan8[n]][0] + src_x_offset * 8;
789     int my            = h->mv_cache[list][scan8[n]][1] + src_y_offset * 8;
790     const int luma_xy = (mx & 3) + ((my & 3) << 2);
791     int offset        = ((mx >> 2) << pixel_shift) + (my >> 2) * h->mb_linesize;
792     uint8_t *src_y    = pic->f.data[0] + offset;
793     uint8_t *src_cb, *src_cr;
794     int extra_width  = 0;
795     int extra_height = 0;
796     int emu = 0;
797     const int full_mx    = mx >> 2;
798     const int full_my    = my >> 2;
799     const int pic_width  = 16 * h->mb_width;
800     const int pic_height = 16 * h->mb_height >> MB_FIELD(h);
801     int ysh;
802
803     if (mx & 7)
804         extra_width -= 3;
805     if (my & 7)
806         extra_height -= 3;
807
808     if (full_mx                <          0 - extra_width  ||
809         full_my                <          0 - extra_height ||
810         full_mx + 16 /*FIXME*/ > pic_width  + extra_width  ||
811         full_my + 16 /*FIXME*/ > pic_height + extra_height) {
812         h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
813                                  src_y - (2 << pixel_shift) - 2 * h->mb_linesize,
814                                  h->mb_linesize,
815                                  16 + 5, 16 + 5 /*FIXME*/, full_mx - 2,
816                                  full_my - 2, pic_width, pic_height);
817         src_y = h->edge_emu_buffer + (2 << pixel_shift) + 2 * h->mb_linesize;
818         emu   = 1;
819     }
820
821     qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); // FIXME try variable height perhaps?
822     if (!square)
823         qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize);
824
825     if (CONFIG_GRAY && h->flags & CODEC_FLAG_GRAY)
826         return;
827
828     if (chroma_idc == 3 /* yuv444 */) {
829         src_cb = pic->f.data[1] + offset;
830         if (emu) {
831             h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
832                                      src_cb - (2 << pixel_shift) - 2 * h->mb_linesize,
833                                      h->mb_linesize,
834                                      16 + 5, 16 + 5 /*FIXME*/,
835                                      full_mx - 2, full_my - 2,
836                                      pic_width, pic_height);
837             src_cb = h->edge_emu_buffer + (2 << pixel_shift) + 2 * h->mb_linesize;
838         }
839         qpix_op[luma_xy](dest_cb, src_cb, h->mb_linesize); // FIXME try variable height perhaps?
840         if (!square)
841             qpix_op[luma_xy](dest_cb + delta, src_cb + delta, h->mb_linesize);
842
843         src_cr = pic->f.data[2] + offset;
844         if (emu) {
845             h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
846                                      src_cr - (2 << pixel_shift) - 2 * h->mb_linesize,
847                                      h->mb_linesize,
848                                      16 + 5, 16 + 5 /*FIXME*/,
849                                      full_mx - 2, full_my - 2,
850                                      pic_width, pic_height);
851             src_cr = h->edge_emu_buffer + (2 << pixel_shift) + 2 * h->mb_linesize;
852         }
853         qpix_op[luma_xy](dest_cr, src_cr, h->mb_linesize); // FIXME try variable height perhaps?
854         if (!square)
855             qpix_op[luma_xy](dest_cr + delta, src_cr + delta, h->mb_linesize);
856         return;
857     }
858
859     ysh = 3 - (chroma_idc == 2 /* yuv422 */);
860     if (chroma_idc == 1 /* yuv420 */ && MB_FIELD(h)) {
861         // chroma offset when predicting from a field of opposite parity
862         my  += 2 * ((h->mb_y & 1) - (pic->reference - 1));
863         emu |= (my >> 3) < 0 || (my >> 3) + 8 >= (pic_height >> 1);
864     }
865
866     src_cb = pic->f.data[1] + ((mx >> 3) << pixel_shift) +
867              (my >> ysh) * h->mb_uvlinesize;
868     src_cr = pic->f.data[2] + ((mx >> 3) << pixel_shift) +
869              (my >> ysh) * h->mb_uvlinesize;
870
871     if (emu) {
872         h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cb, h->mb_uvlinesize,
873                                  9, 8 * chroma_idc + 1, (mx >> 3), (my >> ysh),
874                                  pic_width >> 1, pic_height >> (chroma_idc == 1 /* yuv420 */));
875         src_cb = h->edge_emu_buffer;
876     }
877     chroma_op(dest_cb, src_cb, h->mb_uvlinesize,
878               height >> (chroma_idc == 1 /* yuv420 */),
879               mx & 7, (my << (chroma_idc == 2 /* yuv422 */)) & 7);
880
881     if (emu) {
882         h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cr, h->mb_uvlinesize,
883                                  9, 8 * chroma_idc + 1, (mx >> 3), (my >> ysh),
884                                  pic_width >> 1, pic_height >> (chroma_idc == 1 /* yuv420 */));
885         src_cr = h->edge_emu_buffer;
886     }
887     chroma_op(dest_cr, src_cr, h->mb_uvlinesize, height >> (chroma_idc == 1 /* yuv420 */),
888               mx & 7, (my << (chroma_idc == 2 /* yuv422 */)) & 7);
889 }
890
891 static av_always_inline void mc_part_std(H264Context *h, int n, int square,
892                                          int height, int delta,
893                                          uint8_t *dest_y, uint8_t *dest_cb,
894                                          uint8_t *dest_cr,
895                                          int x_offset, int y_offset,
896                                          qpel_mc_func *qpix_put,
897                                          h264_chroma_mc_func chroma_put,
898                                          qpel_mc_func *qpix_avg,
899                                          h264_chroma_mc_func chroma_avg,
900                                          int list0, int list1,
901                                          int pixel_shift, int chroma_idc)
902 {
903     qpel_mc_func *qpix_op         = qpix_put;
904     h264_chroma_mc_func chroma_op = chroma_put;
905
906     dest_y += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
907     if (chroma_idc == 3 /* yuv444 */) {
908         dest_cb += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
909         dest_cr += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
910     } else if (chroma_idc == 2 /* yuv422 */) {
911         dest_cb += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
912         dest_cr += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
913     } else { /* yuv420 */
914         dest_cb += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
915         dest_cr += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
916     }
917     x_offset += 8 * h->mb_x;
918     y_offset += 8 * (h->mb_y >> MB_FIELD(h));
919
920     if (list0) {
921         Picture *ref = &h->ref_list[0][h->ref_cache[0][scan8[n]]];
922         mc_dir_part(h, ref, n, square, height, delta, 0,
923                     dest_y, dest_cb, dest_cr, x_offset, y_offset,
924                     qpix_op, chroma_op, pixel_shift, chroma_idc);
925
926         qpix_op   = qpix_avg;
927         chroma_op = chroma_avg;
928     }
929
930     if (list1) {
931         Picture *ref = &h->ref_list[1][h->ref_cache[1][scan8[n]]];
932         mc_dir_part(h, ref, n, square, height, delta, 1,
933                     dest_y, dest_cb, dest_cr, x_offset, y_offset,
934                     qpix_op, chroma_op, pixel_shift, chroma_idc);
935     }
936 }
937
938 static av_always_inline void mc_part_weighted(H264Context *h, int n, int square,
939                                               int height, int delta,
940                                               uint8_t *dest_y, uint8_t *dest_cb,
941                                               uint8_t *dest_cr,
942                                               int x_offset, int y_offset,
943                                               qpel_mc_func *qpix_put,
944                                               h264_chroma_mc_func chroma_put,
945                                               h264_weight_func luma_weight_op,
946                                               h264_weight_func chroma_weight_op,
947                                               h264_biweight_func luma_weight_avg,
948                                               h264_biweight_func chroma_weight_avg,
949                                               int list0, int list1,
950                                               int pixel_shift, int chroma_idc)
951 {
952     int chroma_height;
953
954     dest_y += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
955     if (chroma_idc == 3 /* yuv444 */) {
956         chroma_height     = height;
957         chroma_weight_avg = luma_weight_avg;
958         chroma_weight_op  = luma_weight_op;
959         dest_cb += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
960         dest_cr += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
961     } else if (chroma_idc == 2 /* yuv422 */) {
962         chroma_height = height;
963         dest_cb      += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
964         dest_cr      += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
965     } else { /* yuv420 */
966         chroma_height = height >> 1;
967         dest_cb      += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
968         dest_cr      += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
969     }
970     x_offset += 8 * h->mb_x;
971     y_offset += 8 * (h->mb_y >> MB_FIELD(h));
972
973     if (list0 && list1) {
974         /* don't optimize for luma-only case, since B-frames usually
975          * use implicit weights => chroma too. */
976         uint8_t *tmp_cb = h->bipred_scratchpad;
977         uint8_t *tmp_cr = h->bipred_scratchpad + (16 << pixel_shift);
978         uint8_t *tmp_y  = h->bipred_scratchpad + 16 * h->mb_uvlinesize;
979         int refn0       = h->ref_cache[0][scan8[n]];
980         int refn1       = h->ref_cache[1][scan8[n]];
981
982         mc_dir_part(h, &h->ref_list[0][refn0], n, square, height, delta, 0,
983                     dest_y, dest_cb, dest_cr,
984                     x_offset, y_offset, qpix_put, chroma_put,
985                     pixel_shift, chroma_idc);
986         mc_dir_part(h, &h->ref_list[1][refn1], n, square, height, delta, 1,
987                     tmp_y, tmp_cb, tmp_cr,
988                     x_offset, y_offset, qpix_put, chroma_put,
989                     pixel_shift, chroma_idc);
990
991         if (h->use_weight == 2) {
992             int weight0 = h->implicit_weight[refn0][refn1][h->mb_y & 1];
993             int weight1 = 64 - weight0;
994             luma_weight_avg(dest_y, tmp_y, h->mb_linesize,
995                             height, 5, weight0, weight1, 0);
996             chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize,
997                               chroma_height, 5, weight0, weight1, 0);
998             chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize,
999                               chroma_height, 5, weight0, weight1, 0);
1000         } else {
1001             luma_weight_avg(dest_y, tmp_y, h->mb_linesize, height,
1002                             h->luma_log2_weight_denom,
1003                             h->luma_weight[refn0][0][0],
1004                             h->luma_weight[refn1][1][0],
1005                             h->luma_weight[refn0][0][1] +
1006                             h->luma_weight[refn1][1][1]);
1007             chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, chroma_height,
1008                               h->chroma_log2_weight_denom,
1009                               h->chroma_weight[refn0][0][0][0],
1010                               h->chroma_weight[refn1][1][0][0],
1011                               h->chroma_weight[refn0][0][0][1] +
1012                               h->chroma_weight[refn1][1][0][1]);
1013             chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, chroma_height,
1014                               h->chroma_log2_weight_denom,
1015                               h->chroma_weight[refn0][0][1][0],
1016                               h->chroma_weight[refn1][1][1][0],
1017                               h->chroma_weight[refn0][0][1][1] +
1018                               h->chroma_weight[refn1][1][1][1]);
1019         }
1020     } else {
1021         int list     = list1 ? 1 : 0;
1022         int refn     = h->ref_cache[list][scan8[n]];
1023         Picture *ref = &h->ref_list[list][refn];
1024         mc_dir_part(h, ref, n, square, height, delta, list,
1025                     dest_y, dest_cb, dest_cr, x_offset, y_offset,
1026                     qpix_put, chroma_put, pixel_shift, chroma_idc);
1027
1028         luma_weight_op(dest_y, h->mb_linesize, height,
1029                        h->luma_log2_weight_denom,
1030                        h->luma_weight[refn][list][0],
1031                        h->luma_weight[refn][list][1]);
1032         if (h->use_weight_chroma) {
1033             chroma_weight_op(dest_cb, h->mb_uvlinesize, chroma_height,
1034                              h->chroma_log2_weight_denom,
1035                              h->chroma_weight[refn][list][0][0],
1036                              h->chroma_weight[refn][list][0][1]);
1037             chroma_weight_op(dest_cr, h->mb_uvlinesize, chroma_height,
1038                              h->chroma_log2_weight_denom,
1039                              h->chroma_weight[refn][list][1][0],
1040                              h->chroma_weight[refn][list][1][1]);
1041         }
1042     }
1043 }
1044
1045 static av_always_inline void prefetch_motion(H264Context *h, int list,
1046                                              int pixel_shift, int chroma_idc)
1047 {
1048     /* fetch pixels for estimated mv 4 macroblocks ahead
1049      * optimized for 64byte cache lines */
1050     const int refn = h->ref_cache[list][scan8[0]];
1051     if (refn >= 0) {
1052         const int mx  = (h->mv_cache[list][scan8[0]][0] >> 2) + 16 * h->mb_x + 8;
1053         const int my  = (h->mv_cache[list][scan8[0]][1] >> 2) + 16 * h->mb_y;
1054         uint8_t **src = h->ref_list[list][refn].f.data;
1055         int off       = (mx << pixel_shift) +
1056                         (my + (h->mb_x & 3) * 4) * h->mb_linesize +
1057                         (64 << pixel_shift);
1058         h->vdsp.prefetch(src[0] + off, h->linesize, 4);
1059         if (chroma_idc == 3 /* yuv444 */) {
1060             h->vdsp.prefetch(src[1] + off, h->linesize, 4);
1061             h->vdsp.prefetch(src[2] + off, h->linesize, 4);
1062         } else {
1063             off = ((mx >> 1) << pixel_shift) +
1064                   ((my >> 1) + (h->mb_x & 7)) * h->uvlinesize +
1065                   (64 << pixel_shift);
1066             h->vdsp.prefetch(src[1] + off, src[2] - src[1], 2);
1067         }
1068     }
1069 }
1070
1071 static void free_tables(H264Context *h, int free_rbsp)
1072 {
1073     int i;
1074     H264Context *hx;
1075
1076     av_freep(&h->intra4x4_pred_mode);
1077     av_freep(&h->chroma_pred_mode_table);
1078     av_freep(&h->cbp_table);
1079     av_freep(&h->mvd_table[0]);
1080     av_freep(&h->mvd_table[1]);
1081     av_freep(&h->direct_table);
1082     av_freep(&h->non_zero_count);
1083     av_freep(&h->slice_table_base);
1084     h->slice_table = NULL;
1085     av_freep(&h->list_counts);
1086
1087     av_freep(&h->mb2b_xy);
1088     av_freep(&h->mb2br_xy);
1089
1090     av_buffer_pool_uninit(&h->qscale_table_pool);
1091     av_buffer_pool_uninit(&h->mb_type_pool);
1092     av_buffer_pool_uninit(&h->motion_val_pool);
1093     av_buffer_pool_uninit(&h->ref_index_pool);
1094
1095     if (free_rbsp && h->DPB) {
1096         for (i = 0; i < MAX_PICTURE_COUNT; i++)
1097             unref_picture(h, &h->DPB[i]);
1098         av_freep(&h->DPB);
1099     } else if (h->DPB) {
1100         for (i = 0; i < MAX_PICTURE_COUNT; i++)
1101             h->DPB[i].needs_realloc = 1;
1102     }
1103
1104     h->cur_pic_ptr = NULL;
1105
1106     for (i = 0; i < MAX_THREADS; i++) {
1107         hx = h->thread_context[i];
1108         if (!hx)
1109             continue;
1110         av_freep(&hx->top_borders[1]);
1111         av_freep(&hx->top_borders[0]);
1112         av_freep(&hx->bipred_scratchpad);
1113         av_freep(&hx->edge_emu_buffer);
1114         av_freep(&hx->dc_val_base);
1115         av_freep(&hx->me.scratchpad);
1116         av_freep(&hx->er.mb_index2xy);
1117         av_freep(&hx->er.error_status_table);
1118         av_freep(&hx->er.er_temp_buffer);
1119         av_freep(&hx->er.mbintra_table);
1120         av_freep(&hx->er.mbskip_table);
1121
1122         if (free_rbsp) {
1123             av_freep(&hx->rbsp_buffer[1]);
1124             av_freep(&hx->rbsp_buffer[0]);
1125             hx->rbsp_buffer_size[0] = 0;
1126             hx->rbsp_buffer_size[1] = 0;
1127         }
1128         if (i)
1129             av_freep(&h->thread_context[i]);
1130     }
1131 }
1132
1133 static void init_dequant8_coeff_table(H264Context *h)
1134 {
1135     int i, j, q, x;
1136     const int max_qp = 51 + 6 * (h->sps.bit_depth_luma - 8);
1137
1138     for (i = 0; i < 6; i++) {
1139         h->dequant8_coeff[i] = h->dequant8_buffer[i];
1140         for (j = 0; j < i; j++)
1141             if (!memcmp(h->pps.scaling_matrix8[j], h->pps.scaling_matrix8[i],
1142                         64 * sizeof(uint8_t))) {
1143                 h->dequant8_coeff[i] = h->dequant8_buffer[j];
1144                 break;
1145             }
1146         if (j < i)
1147             continue;
1148
1149         for (q = 0; q < max_qp + 1; q++) {
1150             int shift = div6[q];
1151             int idx   = rem6[q];
1152             for (x = 0; x < 64; x++)
1153                 h->dequant8_coeff[i][q][(x >> 3) | ((x & 7) << 3)] =
1154                     ((uint32_t)dequant8_coeff_init[idx][dequant8_coeff_init_scan[((x >> 1) & 12) | (x & 3)]] *
1155                      h->pps.scaling_matrix8[i][x]) << shift;
1156         }
1157     }
1158 }
1159
1160 static void init_dequant4_coeff_table(H264Context *h)
1161 {
1162     int i, j, q, x;
1163     const int max_qp = 51 + 6 * (h->sps.bit_depth_luma - 8);
1164     for (i = 0; i < 6; i++) {
1165         h->dequant4_coeff[i] = h->dequant4_buffer[i];
1166         for (j = 0; j < i; j++)
1167             if (!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i],
1168                         16 * sizeof(uint8_t))) {
1169                 h->dequant4_coeff[i] = h->dequant4_buffer[j];
1170                 break;
1171             }
1172         if (j < i)
1173             continue;
1174
1175         for (q = 0; q < max_qp + 1; q++) {
1176             int shift = div6[q] + 2;
1177             int idx   = rem6[q];
1178             for (x = 0; x < 16; x++)
1179                 h->dequant4_coeff[i][q][(x >> 2) | ((x << 2) & 0xF)] =
1180                     ((uint32_t)dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] *
1181                      h->pps.scaling_matrix4[i][x]) << shift;
1182         }
1183     }
1184 }
1185
1186 static void init_dequant_tables(H264Context *h)
1187 {
1188     int i, x;
1189     init_dequant4_coeff_table(h);
1190     if (h->pps.transform_8x8_mode)
1191         init_dequant8_coeff_table(h);
1192     if (h->sps.transform_bypass) {
1193         for (i = 0; i < 6; i++)
1194             for (x = 0; x < 16; x++)
1195                 h->dequant4_coeff[i][0][x] = 1 << 6;
1196         if (h->pps.transform_8x8_mode)
1197             for (i = 0; i < 6; i++)
1198                 for (x = 0; x < 64; x++)
1199                     h->dequant8_coeff[i][0][x] = 1 << 6;
1200     }
1201 }
1202
1203 int ff_h264_alloc_tables(H264Context *h)
1204 {
1205     const int big_mb_num = h->mb_stride * (h->mb_height + 1);
1206     const int row_mb_num = h->mb_stride * 2 * h->avctx->thread_count;
1207     int x, y, i;
1208
1209     FF_ALLOCZ_OR_GOTO(h->avctx, h->intra4x4_pred_mode,
1210                       row_mb_num * 8 * sizeof(uint8_t), fail)
1211     FF_ALLOCZ_OR_GOTO(h->avctx, h->non_zero_count,
1212                       big_mb_num * 48 * sizeof(uint8_t), fail)
1213     FF_ALLOCZ_OR_GOTO(h->avctx, h->slice_table_base,
1214                       (big_mb_num + h->mb_stride) * sizeof(*h->slice_table_base), fail)
1215     FF_ALLOCZ_OR_GOTO(h->avctx, h->cbp_table,
1216                       big_mb_num * sizeof(uint16_t), fail)
1217     FF_ALLOCZ_OR_GOTO(h->avctx, h->chroma_pred_mode_table,
1218                       big_mb_num * sizeof(uint8_t), fail)
1219     FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[0],
1220                       16 * row_mb_num * sizeof(uint8_t), fail);
1221     FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[1],
1222                       16 * row_mb_num * sizeof(uint8_t), fail);
1223     FF_ALLOCZ_OR_GOTO(h->avctx, h->direct_table,
1224                       4 * big_mb_num * sizeof(uint8_t), fail);
1225     FF_ALLOCZ_OR_GOTO(h->avctx, h->list_counts,
1226                       big_mb_num * sizeof(uint8_t), fail)
1227
1228     memset(h->slice_table_base, -1,
1229            (big_mb_num + h->mb_stride) * sizeof(*h->slice_table_base));
1230     h->slice_table = h->slice_table_base + h->mb_stride * 2 + 1;
1231
1232     FF_ALLOCZ_OR_GOTO(h->avctx, h->mb2b_xy,
1233                       big_mb_num * sizeof(uint32_t), fail);
1234     FF_ALLOCZ_OR_GOTO(h->avctx, h->mb2br_xy,
1235                       big_mb_num * sizeof(uint32_t), fail);
1236     for (y = 0; y < h->mb_height; y++)
1237         for (x = 0; x < h->mb_width; x++) {
1238             const int mb_xy = x + y * h->mb_stride;
1239             const int b_xy  = 4 * x + 4 * y * h->b_stride;
1240
1241             h->mb2b_xy[mb_xy]  = b_xy;
1242             h->mb2br_xy[mb_xy] = 8 * (FMO ? mb_xy : (mb_xy % (2 * h->mb_stride)));
1243         }
1244
1245     if (!h->dequant4_coeff[0])
1246         init_dequant_tables(h);
1247
1248     if (!h->DPB) {
1249         h->DPB = av_mallocz_array(MAX_PICTURE_COUNT, sizeof(*h->DPB));
1250         if (!h->DPB)
1251             return AVERROR(ENOMEM);
1252         for (i = 0; i < MAX_PICTURE_COUNT; i++)
1253             avcodec_get_frame_defaults(&h->DPB[i].f);
1254         avcodec_get_frame_defaults(&h->cur_pic.f);
1255     }
1256
1257     return 0;
1258
1259 fail:
1260     free_tables(h, 1);
1261     return AVERROR(ENOMEM);
1262 }
1263
1264 /**
1265  * Mimic alloc_tables(), but for every context thread.
1266  */
1267 static void clone_tables(H264Context *dst, H264Context *src, int i)
1268 {
1269     dst->intra4x4_pred_mode     = src->intra4x4_pred_mode + i * 8 * 2 * src->mb_stride;
1270     dst->non_zero_count         = src->non_zero_count;
1271     dst->slice_table            = src->slice_table;
1272     dst->cbp_table              = src->cbp_table;
1273     dst->mb2b_xy                = src->mb2b_xy;
1274     dst->mb2br_xy               = src->mb2br_xy;
1275     dst->chroma_pred_mode_table = src->chroma_pred_mode_table;
1276     dst->mvd_table[0]           = src->mvd_table[0] + i * 8 * 2 * src->mb_stride;
1277     dst->mvd_table[1]           = src->mvd_table[1] + i * 8 * 2 * src->mb_stride;
1278     dst->direct_table           = src->direct_table;
1279     dst->list_counts            = src->list_counts;
1280     dst->DPB                    = src->DPB;
1281     dst->cur_pic_ptr            = src->cur_pic_ptr;
1282     dst->cur_pic                = src->cur_pic;
1283     dst->bipred_scratchpad      = NULL;
1284     dst->edge_emu_buffer        = NULL;
1285     dst->me.scratchpad          = NULL;
1286     ff_h264_pred_init(&dst->hpc, src->avctx->codec_id, src->sps.bit_depth_luma,
1287                       src->sps.chroma_format_idc);
1288 }
1289
1290 /**
1291  * Init context
1292  * Allocate buffers which are not shared amongst multiple threads.
1293  */
1294 static int context_init(H264Context *h)
1295 {
1296     ERContext *er = &h->er;
1297     int mb_array_size = h->mb_height * h->mb_stride;
1298     int y_size  = (2 * h->mb_width + 1) * (2 * h->mb_height + 1);
1299     int c_size  = h->mb_stride * (h->mb_height + 1);
1300     int yc_size = y_size + 2   * c_size;
1301     int x, y, i;
1302
1303     FF_ALLOCZ_OR_GOTO(h->avctx, h->top_borders[0],
1304                       h->mb_width * 16 * 3 * sizeof(uint8_t) * 2, fail)
1305     FF_ALLOCZ_OR_GOTO(h->avctx, h->top_borders[1],
1306                       h->mb_width * 16 * 3 * sizeof(uint8_t) * 2, fail)
1307
1308     h->ref_cache[0][scan8[5]  + 1] =
1309     h->ref_cache[0][scan8[7]  + 1] =
1310     h->ref_cache[0][scan8[13] + 1] =
1311     h->ref_cache[1][scan8[5]  + 1] =
1312     h->ref_cache[1][scan8[7]  + 1] =
1313     h->ref_cache[1][scan8[13] + 1] = PART_NOT_AVAILABLE;
1314
1315     if (CONFIG_ERROR_RESILIENCE) {
1316         /* init ER */
1317         er->avctx          = h->avctx;
1318         er->dsp            = &h->dsp;
1319         er->decode_mb      = h264_er_decode_mb;
1320         er->opaque         = h;
1321         er->quarter_sample = 1;
1322
1323         er->mb_num      = h->mb_num;
1324         er->mb_width    = h->mb_width;
1325         er->mb_height   = h->mb_height;
1326         er->mb_stride   = h->mb_stride;
1327         er->b8_stride   = h->mb_width * 2 + 1;
1328
1329         FF_ALLOCZ_OR_GOTO(h->avctx, er->mb_index2xy, (h->mb_num + 1) * sizeof(int),
1330                           fail); // error ressilience code looks cleaner with this
1331         for (y = 0; y < h->mb_height; y++)
1332             for (x = 0; x < h->mb_width; x++)
1333                 er->mb_index2xy[x + y * h->mb_width] = x + y * h->mb_stride;
1334
1335         er->mb_index2xy[h->mb_height * h->mb_width] = (h->mb_height - 1) *
1336                                                       h->mb_stride + h->mb_width;
1337
1338         FF_ALLOCZ_OR_GOTO(h->avctx, er->error_status_table,
1339                           mb_array_size * sizeof(uint8_t), fail);
1340
1341         FF_ALLOC_OR_GOTO(h->avctx, er->mbintra_table, mb_array_size, fail);
1342         memset(er->mbintra_table, 1, mb_array_size);
1343
1344         FF_ALLOCZ_OR_GOTO(h->avctx, er->mbskip_table, mb_array_size + 2, fail);
1345
1346         FF_ALLOC_OR_GOTO(h->avctx, er->er_temp_buffer, h->mb_height * h->mb_stride,
1347                          fail);
1348
1349         FF_ALLOCZ_OR_GOTO(h->avctx, h->dc_val_base, yc_size * sizeof(int16_t), fail);
1350         er->dc_val[0] = h->dc_val_base + h->mb_width * 2 + 2;
1351         er->dc_val[1] = h->dc_val_base + y_size + h->mb_stride + 1;
1352         er->dc_val[2] = er->dc_val[1] + c_size;
1353         for (i = 0; i < yc_size; i++)
1354             h->dc_val_base[i] = 1024;
1355     }
1356
1357     return 0;
1358
1359 fail:
1360     return AVERROR(ENOMEM); // free_tables will clean up for us
1361 }
1362
1363 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
1364                             int parse_extradata);
1365
1366 int ff_h264_decode_extradata(H264Context *h)
1367 {
1368     AVCodecContext *avctx = h->avctx;
1369     int ret;
1370
1371     if (avctx->extradata[0] == 1) {
1372         int i, cnt, nalsize;
1373         unsigned char *p = avctx->extradata;
1374
1375         h->is_avc = 1;
1376
1377         if (avctx->extradata_size < 7) {
1378             av_log(avctx, AV_LOG_ERROR, "avcC too short\n");
1379             return AVERROR_INVALIDDATA;
1380         }
1381         /* sps and pps in the avcC always have length coded with 2 bytes,
1382          * so put a fake nal_length_size = 2 while parsing them */
1383         h->nal_length_size = 2;
1384         // Decode sps from avcC
1385         cnt = *(p + 5) & 0x1f; // Number of sps
1386         p  += 6;
1387         for (i = 0; i < cnt; i++) {
1388             nalsize = AV_RB16(p) + 2;
1389             if (p - avctx->extradata + nalsize > avctx->extradata_size)
1390                 return AVERROR_INVALIDDATA;
1391             ret = decode_nal_units(h, p, nalsize, 1);
1392             if (ret < 0) {
1393                 av_log(avctx, AV_LOG_ERROR,
1394                        "Decoding sps %d from avcC failed\n", i);
1395                 return ret;
1396             }
1397             p += nalsize;
1398         }
1399         // Decode pps from avcC
1400         cnt = *(p++); // Number of pps
1401         for (i = 0; i < cnt; i++) {
1402             nalsize = AV_RB16(p) + 2;
1403             if (p - avctx->extradata + nalsize > avctx->extradata_size)
1404                 return AVERROR_INVALIDDATA;
1405             ret = decode_nal_units(h, p, nalsize, 1);
1406             if (ret < 0) {
1407                 av_log(avctx, AV_LOG_ERROR,
1408                        "Decoding pps %d from avcC failed\n", i);
1409                 return ret;
1410             }
1411             p += nalsize;
1412         }
1413         // Now store right nal length size, that will be used to parse all other nals
1414         h->nal_length_size = (avctx->extradata[4] & 0x03) + 1;
1415     } else {
1416         h->is_avc = 0;
1417         ret = decode_nal_units(h, avctx->extradata, avctx->extradata_size, 1);
1418         if (ret < 0)
1419             return ret;
1420     }
1421     return 0;
1422 }
1423
1424 av_cold int ff_h264_decode_init(AVCodecContext *avctx)
1425 {
1426     H264Context *h = avctx->priv_data;
1427     int i;
1428     int ret;
1429
1430     h->avctx = avctx;
1431
1432     h->bit_depth_luma    = 8;
1433     h->chroma_format_idc = 1;
1434
1435     ff_h264dsp_init(&h->h264dsp, 8, 1);
1436     ff_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma);
1437     ff_h264qpel_init(&h->h264qpel, 8);
1438     ff_h264_pred_init(&h->hpc, h->avctx->codec_id, 8, 1);
1439
1440     h->dequant_coeff_pps = -1;
1441
1442     /* needed so that IDCT permutation is known early */
1443     if (CONFIG_ERROR_RESILIENCE)
1444         ff_dsputil_init(&h->dsp, h->avctx);
1445     ff_videodsp_init(&h->vdsp, 8);
1446
1447     memset(h->pps.scaling_matrix4, 16, 6 * 16 * sizeof(uint8_t));
1448     memset(h->pps.scaling_matrix8, 16, 2 * 64 * sizeof(uint8_t));
1449
1450     h->picture_structure   = PICT_FRAME;
1451     h->slice_context_count = 1;
1452     h->workaround_bugs     = avctx->workaround_bugs;
1453     h->flags               = avctx->flags;
1454
1455     /* set defaults */
1456     // s->decode_mb = ff_h263_decode_mb;
1457     if (!avctx->has_b_frames)
1458         h->low_delay = 1;
1459
1460     avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
1461
1462     ff_h264_decode_init_vlc();
1463
1464     h->pixel_shift        = 0;
1465     h->sps.bit_depth_luma = avctx->bits_per_raw_sample = 8;
1466
1467     h->thread_context[0] = h;
1468     h->outputed_poc      = h->next_outputed_poc = INT_MIN;
1469     for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
1470         h->last_pocs[i] = INT_MIN;
1471     h->prev_poc_msb = 1 << 16;
1472     h->x264_build   = -1;
1473     ff_h264_reset_sei(h);
1474     if (avctx->codec_id == AV_CODEC_ID_H264) {
1475         if (avctx->ticks_per_frame == 1)
1476             h->avctx->time_base.den *= 2;
1477         avctx->ticks_per_frame = 2;
1478     }
1479
1480     if (avctx->extradata_size > 0 && avctx->extradata) {
1481        ret = ff_h264_decode_extradata(h);
1482        if (ret < 0)
1483            return ret;
1484     }
1485
1486     if (h->sps.bitstream_restriction_flag &&
1487         h->avctx->has_b_frames < h->sps.num_reorder_frames) {
1488         h->avctx->has_b_frames = h->sps.num_reorder_frames;
1489         h->low_delay           = 0;
1490     }
1491
1492     avctx->internal->allocate_progress = 1;
1493
1494     return 0;
1495 }
1496
1497 #define IN_RANGE(a, b, size) (((a) >= (b)) && ((a) < ((b) + (size))))
1498 #undef REBASE_PICTURE
1499 #define REBASE_PICTURE(pic, new_ctx, old_ctx)             \
1500     ((pic && pic >= old_ctx->DPB &&                       \
1501       pic < old_ctx->DPB + MAX_PICTURE_COUNT) ?           \
1502      &new_ctx->DPB[pic - old_ctx->DPB] : NULL)
1503
1504 static void copy_picture_range(Picture **to, Picture **from, int count,
1505                                H264Context *new_base,
1506                                H264Context *old_base)
1507 {
1508     int i;
1509
1510     for (i = 0; i < count; i++) {
1511         assert((IN_RANGE(from[i], old_base, sizeof(*old_base)) ||
1512                 IN_RANGE(from[i], old_base->DPB,
1513                          sizeof(Picture) * MAX_PICTURE_COUNT) ||
1514                 !from[i]));
1515         to[i] = REBASE_PICTURE(from[i], new_base, old_base);
1516     }
1517 }
1518
1519 static void copy_parameter_set(void **to, void **from, int count, int size)
1520 {
1521     int i;
1522
1523     for (i = 0; i < count; i++) {
1524         if (to[i] && !from[i])
1525             av_freep(&to[i]);
1526         else if (from[i] && !to[i])
1527             to[i] = av_malloc(size);
1528
1529         if (from[i])
1530             memcpy(to[i], from[i], size);
1531     }
1532 }
1533
1534 static int decode_init_thread_copy(AVCodecContext *avctx)
1535 {
1536     H264Context *h = avctx->priv_data;
1537
1538     if (!avctx->internal->is_copy)
1539         return 0;
1540     memset(h->sps_buffers, 0, sizeof(h->sps_buffers));
1541     memset(h->pps_buffers, 0, sizeof(h->pps_buffers));
1542
1543     h->context_initialized = 0;
1544
1545     return 0;
1546 }
1547
1548 #define copy_fields(to, from, start_field, end_field)                   \
1549     memcpy(&to->start_field, &from->start_field,                        \
1550            (char *)&to->end_field - (char *)&to->start_field)
1551
1552 static int h264_slice_header_init(H264Context *, int);
1553
1554 static int h264_set_parameter_from_sps(H264Context *h);
1555
1556 static int decode_update_thread_context(AVCodecContext *dst,
1557                                         const AVCodecContext *src)
1558 {
1559     H264Context *h = dst->priv_data, *h1 = src->priv_data;
1560     int inited = h->context_initialized, err = 0;
1561     int context_reinitialized = 0;
1562     int i, ret;
1563
1564     if (dst == src || !h1->context_initialized)
1565         return 0;
1566
1567     if (inited &&
1568         (h->width                 != h1->width                 ||
1569          h->height                != h1->height                ||
1570          h->mb_width              != h1->mb_width              ||
1571          h->mb_height             != h1->mb_height             ||
1572          h->sps.bit_depth_luma    != h1->sps.bit_depth_luma    ||
1573          h->sps.chroma_format_idc != h1->sps.chroma_format_idc ||
1574          h->sps.colorspace        != h1->sps.colorspace)) {
1575
1576         /* set bits_per_raw_sample to the previous value. the check for changed
1577          * bit depth in h264_set_parameter_from_sps() uses it and sets it to
1578          * the current value */
1579         h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma;
1580
1581         av_freep(&h->bipred_scratchpad);
1582
1583         h->width     = h1->width;
1584         h->height    = h1->height;
1585         h->mb_height = h1->mb_height;
1586         h->mb_width  = h1->mb_width;
1587         h->mb_num    = h1->mb_num;
1588         h->mb_stride = h1->mb_stride;
1589         h->b_stride  = h1->b_stride;
1590
1591         if ((err = h264_slice_header_init(h, 1)) < 0) {
1592             av_log(h->avctx, AV_LOG_ERROR, "h264_slice_header_init() failed");
1593             return err;
1594         }
1595         context_reinitialized = 1;
1596
1597         /* update linesize on resize. The decoder doesn't
1598          * necessarily call h264_frame_start in the new thread */
1599         h->linesize   = h1->linesize;
1600         h->uvlinesize = h1->uvlinesize;
1601
1602         /* copy block_offset since frame_start may not be called */
1603         memcpy(h->block_offset, h1->block_offset, sizeof(h->block_offset));
1604     }
1605
1606     if (!inited) {
1607         for (i = 0; i < MAX_SPS_COUNT; i++)
1608             av_freep(h->sps_buffers + i);
1609
1610         for (i = 0; i < MAX_PPS_COUNT; i++)
1611             av_freep(h->pps_buffers + i);
1612
1613         memcpy(h, h1, sizeof(*h1));
1614         memset(h->sps_buffers, 0, sizeof(h->sps_buffers));
1615         memset(h->pps_buffers, 0, sizeof(h->pps_buffers));
1616         memset(&h->er, 0, sizeof(h->er));
1617         memset(&h->me, 0, sizeof(h->me));
1618         memset(&h->mb, 0, sizeof(h->mb));
1619         memset(&h->mb_luma_dc, 0, sizeof(h->mb_luma_dc));
1620         memset(&h->mb_padding, 0, sizeof(h->mb_padding));
1621         h->context_initialized = 0;
1622
1623         memset(&h->cur_pic, 0, sizeof(h->cur_pic));
1624         avcodec_get_frame_defaults(&h->cur_pic.f);
1625         h->cur_pic.tf.f = &h->cur_pic.f;
1626
1627         h->avctx             = dst;
1628         h->DPB               = NULL;
1629         h->qscale_table_pool = NULL;
1630         h->mb_type_pool      = NULL;
1631         h->ref_index_pool    = NULL;
1632         h->motion_val_pool   = NULL;
1633
1634         ret = ff_h264_alloc_tables(h);
1635         if (ret < 0) {
1636             av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n");
1637             return ret;
1638         }
1639         ret = context_init(h);
1640         if (ret < 0) {
1641             av_log(dst, AV_LOG_ERROR, "context_init() failed.\n");
1642             return ret;
1643         }
1644
1645         for (i = 0; i < 2; i++) {
1646             h->rbsp_buffer[i]      = NULL;
1647             h->rbsp_buffer_size[i] = 0;
1648         }
1649         h->bipred_scratchpad = NULL;
1650         h->edge_emu_buffer   = NULL;
1651
1652         h->thread_context[0] = h;
1653
1654         h->context_initialized = 1;
1655     }
1656
1657     h->avctx->coded_height  = h1->avctx->coded_height;
1658     h->avctx->coded_width   = h1->avctx->coded_width;
1659     h->avctx->width         = h1->avctx->width;
1660     h->avctx->height        = h1->avctx->height;
1661     h->coded_picture_number = h1->coded_picture_number;
1662     h->first_field          = h1->first_field;
1663     h->picture_structure    = h1->picture_structure;
1664     h->qscale               = h1->qscale;
1665     h->droppable            = h1->droppable;
1666     h->data_partitioning    = h1->data_partitioning;
1667     h->low_delay            = h1->low_delay;
1668
1669     for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1670         unref_picture(h, &h->DPB[i]);
1671         if (h1->DPB[i].f.data[0] &&
1672             (ret = ref_picture(h, &h->DPB[i], &h1->DPB[i])) < 0)
1673             return ret;
1674     }
1675
1676     h->cur_pic_ptr = REBASE_PICTURE(h1->cur_pic_ptr, h, h1);
1677     unref_picture(h, &h->cur_pic);
1678     if ((ret = ref_picture(h, &h->cur_pic, &h1->cur_pic)) < 0)
1679         return ret;
1680
1681     h->workaround_bugs = h1->workaround_bugs;
1682     h->low_delay       = h1->low_delay;
1683     h->droppable       = h1->droppable;
1684
1685     /* frame_start may not be called for the next thread (if it's decoding
1686      * a bottom field) so this has to be allocated here */
1687     err = alloc_scratch_buffers(h, h1->linesize);
1688     if (err < 0)
1689         return err;
1690
1691     // extradata/NAL handling
1692     h->is_avc = h1->is_avc;
1693
1694     // SPS/PPS
1695     copy_parameter_set((void **)h->sps_buffers, (void **)h1->sps_buffers,
1696                        MAX_SPS_COUNT, sizeof(SPS));
1697     h->sps = h1->sps;
1698     copy_parameter_set((void **)h->pps_buffers, (void **)h1->pps_buffers,
1699                        MAX_PPS_COUNT, sizeof(PPS));
1700     h->pps = h1->pps;
1701
1702     // Dequantization matrices
1703     // FIXME these are big - can they be only copied when PPS changes?
1704     copy_fields(h, h1, dequant4_buffer, dequant4_coeff);
1705
1706     for (i = 0; i < 6; i++)
1707         h->dequant4_coeff[i] = h->dequant4_buffer[0] +
1708                                (h1->dequant4_coeff[i] - h1->dequant4_buffer[0]);
1709
1710     for (i = 0; i < 6; i++)
1711         h->dequant8_coeff[i] = h->dequant8_buffer[0] +
1712                                (h1->dequant8_coeff[i] - h1->dequant8_buffer[0]);
1713
1714     h->dequant_coeff_pps = h1->dequant_coeff_pps;
1715
1716     // POC timing
1717     copy_fields(h, h1, poc_lsb, redundant_pic_count);
1718
1719     // reference lists
1720     copy_fields(h, h1, short_ref, cabac_init_idc);
1721
1722     copy_picture_range(h->short_ref, h1->short_ref, 32, h, h1);
1723     copy_picture_range(h->long_ref, h1->long_ref, 32, h, h1);
1724     copy_picture_range(h->delayed_pic, h1->delayed_pic,
1725                        MAX_DELAYED_PIC_COUNT + 2, h, h1);
1726
1727     h->last_slice_type = h1->last_slice_type;
1728
1729     if (context_reinitialized)
1730         h264_set_parameter_from_sps(h);
1731
1732     if (!h->cur_pic_ptr)
1733         return 0;
1734
1735     if (!h->droppable) {
1736         err = ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
1737         h->prev_poc_msb = h->poc_msb;
1738         h->prev_poc_lsb = h->poc_lsb;
1739     }
1740     h->prev_frame_num_offset = h->frame_num_offset;
1741     h->prev_frame_num        = h->frame_num;
1742     h->outputed_poc          = h->next_outputed_poc;
1743
1744     return err;
1745 }
1746
1747 static int h264_frame_start(H264Context *h)
1748 {
1749     Picture *pic;
1750     int i, ret;
1751     const int pixel_shift = h->pixel_shift;
1752
1753     release_unused_pictures(h, 1);
1754     h->cur_pic_ptr = NULL;
1755
1756     i = find_unused_picture(h);
1757     if (i < 0) {
1758         av_log(h->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1759         return i;
1760     }
1761     pic = &h->DPB[i];
1762
1763     pic->reference              = h->droppable ? 0 : h->picture_structure;
1764     pic->f.coded_picture_number = h->coded_picture_number++;
1765     pic->field_picture          = h->picture_structure != PICT_FRAME;
1766     /*
1767      * Zero key_frame here; IDR markings per slice in frame or fields are ORed
1768      * in later.
1769      * See decode_nal_units().
1770      */
1771     pic->f.key_frame = 0;
1772     pic->mmco_reset  = 0;
1773
1774     if ((ret = alloc_picture(h, pic)) < 0)
1775         return ret;
1776
1777     h->cur_pic_ptr = pic;
1778     unref_picture(h, &h->cur_pic);
1779     if ((ret = ref_picture(h, &h->cur_pic, h->cur_pic_ptr)) < 0)
1780         return ret;
1781
1782     if (CONFIG_ERROR_RESILIENCE)
1783         ff_er_frame_start(&h->er);
1784
1785     assert(h->linesize && h->uvlinesize);
1786
1787     for (i = 0; i < 16; i++) {
1788         h->block_offset[i]           = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 4 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
1789         h->block_offset[48 + i]      = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 8 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
1790     }
1791     for (i = 0; i < 16; i++) {
1792         h->block_offset[16 + i]      =
1793         h->block_offset[32 + i]      = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 4 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
1794         h->block_offset[48 + 16 + i] =
1795         h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 8 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
1796     }
1797
1798     /* can't be in alloc_tables because linesize isn't known there.
1799      * FIXME: redo bipred weight to not require extra buffer? */
1800     for (i = 0; i < h->slice_context_count; i++)
1801         if (h->thread_context[i]) {
1802             ret = alloc_scratch_buffers(h->thread_context[i], h->linesize);
1803             if (ret < 0)
1804                 return ret;
1805         }
1806
1807     /* Some macroblocks can be accessed before they're available in case
1808      * of lost slices, MBAFF or threading. */
1809     memset(h->slice_table, -1,
1810            (h->mb_height * h->mb_stride - 1) * sizeof(*h->slice_table));
1811
1812     // s->decode = (s->flags & CODEC_FLAG_PSNR) || !s->encoding ||
1813     //             s->current_picture.f.reference /* || h->contains_intra */ || 1;
1814
1815     /* We mark the current picture as non-reference after allocating it, so
1816      * that if we break out due to an error it can be released automatically
1817      * in the next ff_MPV_frame_start().
1818      */
1819     h->cur_pic_ptr->reference = 0;
1820
1821     h->cur_pic_ptr->field_poc[0] = h->cur_pic_ptr->field_poc[1] = INT_MAX;
1822
1823     h->next_output_pic = NULL;
1824
1825     assert(h->cur_pic_ptr->long_ref == 0);
1826
1827     return 0;
1828 }
1829
1830 /**
1831  * Run setup operations that must be run after slice header decoding.
1832  * This includes finding the next displayed frame.
1833  *
1834  * @param h h264 master context
1835  * @param setup_finished enough NALs have been read that we can call
1836  * ff_thread_finish_setup()
1837  */
1838 static void decode_postinit(H264Context *h, int setup_finished)
1839 {
1840     Picture *out = h->cur_pic_ptr;
1841     Picture *cur = h->cur_pic_ptr;
1842     int i, pics, out_of_order, out_idx;
1843     int invalid = 0, cnt = 0;
1844
1845     h->cur_pic_ptr->f.pict_type = h->pict_type;
1846
1847     if (h->next_output_pic)
1848         return;
1849
1850     if (cur->field_poc[0] == INT_MAX || cur->field_poc[1] == INT_MAX) {
1851         /* FIXME: if we have two PAFF fields in one packet, we can't start
1852          * the next thread here. If we have one field per packet, we can.
1853          * The check in decode_nal_units() is not good enough to find this
1854          * yet, so we assume the worst for now. */
1855         // if (setup_finished)
1856         //    ff_thread_finish_setup(h->avctx);
1857         return;
1858     }
1859
1860     cur->f.interlaced_frame = 0;
1861     cur->f.repeat_pict      = 0;
1862
1863     /* Signal interlacing information externally. */
1864     /* Prioritize picture timing SEI information over used
1865      * decoding process if it exists. */
1866
1867     if (h->sps.pic_struct_present_flag) {
1868         switch (h->sei_pic_struct) {
1869         case SEI_PIC_STRUCT_FRAME:
1870             break;
1871         case SEI_PIC_STRUCT_TOP_FIELD:
1872         case SEI_PIC_STRUCT_BOTTOM_FIELD:
1873             cur->f.interlaced_frame = 1;
1874             break;
1875         case SEI_PIC_STRUCT_TOP_BOTTOM:
1876         case SEI_PIC_STRUCT_BOTTOM_TOP:
1877             if (FIELD_OR_MBAFF_PICTURE(h))
1878                 cur->f.interlaced_frame = 1;
1879             else
1880                 // try to flag soft telecine progressive
1881                 cur->f.interlaced_frame = h->prev_interlaced_frame;
1882             break;
1883         case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
1884         case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM:
1885             /* Signal the possibility of telecined film externally
1886              * (pic_struct 5,6). From these hints, let the applications
1887              * decide if they apply deinterlacing. */
1888             cur->f.repeat_pict = 1;
1889             break;
1890         case SEI_PIC_STRUCT_FRAME_DOUBLING:
1891             cur->f.repeat_pict = 2;
1892             break;
1893         case SEI_PIC_STRUCT_FRAME_TRIPLING:
1894             cur->f.repeat_pict = 4;
1895             break;
1896         }
1897
1898         if ((h->sei_ct_type & 3) &&
1899             h->sei_pic_struct <= SEI_PIC_STRUCT_BOTTOM_TOP)
1900             cur->f.interlaced_frame = (h->sei_ct_type & (1 << 1)) != 0;
1901     } else {
1902         /* Derive interlacing flag from used decoding process. */
1903         cur->f.interlaced_frame = FIELD_OR_MBAFF_PICTURE(h);
1904     }
1905     h->prev_interlaced_frame = cur->f.interlaced_frame;
1906
1907     if (cur->field_poc[0] != cur->field_poc[1]) {
1908         /* Derive top_field_first from field pocs. */
1909         cur->f.top_field_first = cur->field_poc[0] < cur->field_poc[1];
1910     } else {
1911         if (cur->f.interlaced_frame || h->sps.pic_struct_present_flag) {
1912             /* Use picture timing SEI information. Even if it is a
1913              * information of a past frame, better than nothing. */
1914             if (h->sei_pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM ||
1915                 h->sei_pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM_TOP)
1916                 cur->f.top_field_first = 1;
1917             else
1918                 cur->f.top_field_first = 0;
1919         } else {
1920             /* Most likely progressive */
1921             cur->f.top_field_first = 0;
1922         }
1923     }
1924
1925     // FIXME do something with unavailable reference frames
1926
1927     /* Sort B-frames into display order */
1928
1929     if (h->sps.bitstream_restriction_flag &&
1930         h->avctx->has_b_frames < h->sps.num_reorder_frames) {
1931         h->avctx->has_b_frames = h->sps.num_reorder_frames;
1932         h->low_delay           = 0;
1933     }
1934
1935     if (h->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT &&
1936         !h->sps.bitstream_restriction_flag) {
1937         h->avctx->has_b_frames = MAX_DELAYED_PIC_COUNT - 1;
1938         h->low_delay           = 0;
1939     }
1940
1941     pics = 0;
1942     while (h->delayed_pic[pics])
1943         pics++;
1944
1945     assert(pics <= MAX_DELAYED_PIC_COUNT);
1946
1947     h->delayed_pic[pics++] = cur;
1948     if (cur->reference == 0)
1949         cur->reference = DELAYED_PIC_REF;
1950
1951     /* Frame reordering. This code takes pictures from coding order and sorts
1952      * them by their incremental POC value into display order. It supports POC
1953      * gaps, MMCO reset codes and random resets.
1954      * A "display group" can start either with a IDR frame (f.key_frame = 1),
1955      * and/or can be closed down with a MMCO reset code. In sequences where
1956      * there is no delay, we can't detect that (since the frame was already
1957      * output to the user), so we also set h->mmco_reset to detect the MMCO
1958      * reset code.
1959      * FIXME: if we detect insufficient delays (as per h->avctx->has_b_frames),
1960      * we increase the delay between input and output. All frames affected by
1961      * the lag (e.g. those that should have been output before another frame
1962      * that we already returned to the user) will be dropped. This is a bug
1963      * that we will fix later. */
1964     for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++) {
1965         cnt     += out->poc < h->last_pocs[i];
1966         invalid += out->poc == INT_MIN;
1967     }
1968     if (!h->mmco_reset && !cur->f.key_frame &&
1969         cnt + invalid == MAX_DELAYED_PIC_COUNT && cnt > 0) {
1970         h->mmco_reset = 2;
1971         if (pics > 1)
1972             h->delayed_pic[pics - 2]->mmco_reset = 2;
1973     }
1974     if (h->mmco_reset || cur->f.key_frame) {
1975         for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
1976             h->last_pocs[i] = INT_MIN;
1977         cnt     = 0;
1978         invalid = MAX_DELAYED_PIC_COUNT;
1979     }
1980     out     = h->delayed_pic[0];
1981     out_idx = 0;
1982     for (i = 1; i < MAX_DELAYED_PIC_COUNT &&
1983                 h->delayed_pic[i] &&
1984                 !h->delayed_pic[i - 1]->mmco_reset &&
1985                 !h->delayed_pic[i]->f.key_frame;
1986          i++)
1987         if (h->delayed_pic[i]->poc < out->poc) {
1988             out     = h->delayed_pic[i];
1989             out_idx = i;
1990         }
1991     if (h->avctx->has_b_frames == 0 &&
1992         (h->delayed_pic[0]->f.key_frame || h->mmco_reset))
1993         h->next_outputed_poc = INT_MIN;
1994     out_of_order = !out->f.key_frame && !h->mmco_reset &&
1995                    (out->poc < h->next_outputed_poc);
1996
1997     if (h->sps.bitstream_restriction_flag &&
1998         h->avctx->has_b_frames >= h->sps.num_reorder_frames) {
1999     } else if (out_of_order && pics - 1 == h->avctx->has_b_frames &&
2000                h->avctx->has_b_frames < MAX_DELAYED_PIC_COUNT) {
2001         if (invalid + cnt < MAX_DELAYED_PIC_COUNT) {
2002             h->avctx->has_b_frames = FFMAX(h->avctx->has_b_frames, cnt);
2003         }
2004         h->low_delay = 0;
2005     } else if (h->low_delay &&
2006                ((h->next_outputed_poc != INT_MIN &&
2007                  out->poc > h->next_outputed_poc + 2) ||
2008                 cur->f.pict_type == AV_PICTURE_TYPE_B)) {
2009         h->low_delay = 0;
2010         h->avctx->has_b_frames++;
2011     }
2012
2013     if (pics > h->avctx->has_b_frames) {
2014         out->reference &= ~DELAYED_PIC_REF;
2015         // for frame threading, the owner must be the second field's thread or
2016         // else the first thread can release the picture and reuse it unsafely
2017         for (i = out_idx; h->delayed_pic[i]; i++)
2018             h->delayed_pic[i] = h->delayed_pic[i + 1];
2019     }
2020     memmove(h->last_pocs, &h->last_pocs[1],
2021             sizeof(*h->last_pocs) * (MAX_DELAYED_PIC_COUNT - 1));
2022     h->last_pocs[MAX_DELAYED_PIC_COUNT - 1] = cur->poc;
2023     if (!out_of_order && pics > h->avctx->has_b_frames) {
2024         h->next_output_pic = out;
2025         if (out->mmco_reset) {
2026             if (out_idx > 0) {
2027                 h->next_outputed_poc                    = out->poc;
2028                 h->delayed_pic[out_idx - 1]->mmco_reset = out->mmco_reset;
2029             } else {
2030                 h->next_outputed_poc = INT_MIN;
2031             }
2032         } else {
2033             if (out_idx == 0 && pics > 1 && h->delayed_pic[0]->f.key_frame) {
2034                 h->next_outputed_poc = INT_MIN;
2035             } else {
2036                 h->next_outputed_poc = out->poc;
2037             }
2038         }
2039         h->mmco_reset = 0;
2040     } else {
2041         av_log(h->avctx, AV_LOG_DEBUG, "no picture\n");
2042     }
2043
2044     if (setup_finished && !h->avctx->hwaccel)
2045         ff_thread_finish_setup(h->avctx);
2046 }
2047
2048 static av_always_inline void backup_mb_border(H264Context *h, uint8_t *src_y,
2049                                               uint8_t *src_cb, uint8_t *src_cr,
2050                                               int linesize, int uvlinesize,
2051                                               int simple)
2052 {
2053     uint8_t *top_border;
2054     int top_idx = 1;
2055     const int pixel_shift = h->pixel_shift;
2056     int chroma444 = CHROMA444(h);
2057     int chroma422 = CHROMA422(h);
2058
2059     src_y  -= linesize;
2060     src_cb -= uvlinesize;
2061     src_cr -= uvlinesize;
2062
2063     if (!simple && FRAME_MBAFF(h)) {
2064         if (h->mb_y & 1) {
2065             if (!MB_MBAFF(h)) {
2066                 top_border = h->top_borders[0][h->mb_x];
2067                 AV_COPY128(top_border, src_y + 15 * linesize);
2068                 if (pixel_shift)
2069                     AV_COPY128(top_border + 16, src_y + 15 * linesize + 16);
2070                 if (simple || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
2071                     if (chroma444) {
2072                         if (pixel_shift) {
2073                             AV_COPY128(top_border + 32, src_cb + 15 * uvlinesize);
2074                             AV_COPY128(top_border + 48, src_cb + 15 * uvlinesize + 16);
2075                             AV_COPY128(top_border + 64, src_cr + 15 * uvlinesize);
2076                             AV_COPY128(top_border + 80, src_cr + 15 * uvlinesize + 16);
2077                         } else {
2078                             AV_COPY128(top_border + 16, src_cb + 15 * uvlinesize);
2079                             AV_COPY128(top_border + 32, src_cr + 15 * uvlinesize);
2080                         }
2081                     } else if (chroma422) {
2082                         if (pixel_shift) {
2083                             AV_COPY128(top_border + 32, src_cb + 15 * uvlinesize);
2084                             AV_COPY128(top_border + 48, src_cr + 15 * uvlinesize);
2085                         } else {
2086                             AV_COPY64(top_border + 16, src_cb + 15 * uvlinesize);
2087                             AV_COPY64(top_border + 24, src_cr + 15 * uvlinesize);
2088                         }
2089                     } else {
2090                         if (pixel_shift) {
2091                             AV_COPY128(top_border + 32, src_cb + 7 * uvlinesize);
2092                             AV_COPY128(top_border + 48, src_cr + 7 * uvlinesize);
2093                         } else {
2094                             AV_COPY64(top_border + 16, src_cb + 7 * uvlinesize);
2095                             AV_COPY64(top_border + 24, src_cr + 7 * uvlinesize);
2096                         }
2097                     }
2098                 }
2099             }
2100         } else if (MB_MBAFF(h)) {
2101             top_idx = 0;
2102         } else
2103             return;
2104     }
2105
2106     top_border = h->top_borders[top_idx][h->mb_x];
2107     /* There are two lines saved, the line above the top macroblock
2108      * of a pair, and the line above the bottom macroblock. */
2109     AV_COPY128(top_border, src_y + 16 * linesize);
2110     if (pixel_shift)
2111         AV_COPY128(top_border + 16, src_y + 16 * linesize + 16);
2112
2113     if (simple || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
2114         if (chroma444) {
2115             if (pixel_shift) {
2116                 AV_COPY128(top_border + 32, src_cb + 16 * linesize);
2117                 AV_COPY128(top_border + 48, src_cb + 16 * linesize + 16);
2118                 AV_COPY128(top_border + 64, src_cr + 16 * linesize);
2119                 AV_COPY128(top_border + 80, src_cr + 16 * linesize + 16);
2120             } else {
2121                 AV_COPY128(top_border + 16, src_cb + 16 * linesize);
2122                 AV_COPY128(top_border + 32, src_cr + 16 * linesize);
2123             }
2124         } else if (chroma422) {
2125             if (pixel_shift) {
2126                 AV_COPY128(top_border + 32, src_cb + 16 * uvlinesize);
2127                 AV_COPY128(top_border + 48, src_cr + 16 * uvlinesize);
2128             } else {
2129                 AV_COPY64(top_border + 16, src_cb + 16 * uvlinesize);
2130                 AV_COPY64(top_border + 24, src_cr + 16 * uvlinesize);
2131             }
2132         } else {
2133             if (pixel_shift) {
2134                 AV_COPY128(top_border + 32, src_cb + 8 * uvlinesize);
2135                 AV_COPY128(top_border + 48, src_cr + 8 * uvlinesize);
2136             } else {
2137                 AV_COPY64(top_border + 16, src_cb + 8 * uvlinesize);
2138                 AV_COPY64(top_border + 24, src_cr + 8 * uvlinesize);
2139             }
2140         }
2141     }
2142 }
2143
2144 static av_always_inline void xchg_mb_border(H264Context *h, uint8_t *src_y,
2145                                             uint8_t *src_cb, uint8_t *src_cr,
2146                                             int linesize, int uvlinesize,
2147                                             int xchg, int chroma444,
2148                                             int simple, int pixel_shift)
2149 {
2150     int deblock_topleft;
2151     int deblock_top;
2152     int top_idx = 1;
2153     uint8_t *top_border_m1;
2154     uint8_t *top_border;
2155
2156     if (!simple && FRAME_MBAFF(h)) {
2157         if (h->mb_y & 1) {
2158             if (!MB_MBAFF(h))
2159                 return;
2160         } else {
2161             top_idx = MB_MBAFF(h) ? 0 : 1;
2162         }
2163     }
2164
2165     if (h->deblocking_filter == 2) {
2166         deblock_topleft = h->slice_table[h->mb_xy - 1 - h->mb_stride] == h->slice_num;
2167         deblock_top     = h->top_type;
2168     } else {
2169         deblock_topleft = (h->mb_x > 0);
2170         deblock_top     = (h->mb_y > !!MB_FIELD(h));
2171     }
2172
2173     src_y  -= linesize   + 1 + pixel_shift;
2174     src_cb -= uvlinesize + 1 + pixel_shift;
2175     src_cr -= uvlinesize + 1 + pixel_shift;
2176
2177     top_border_m1 = h->top_borders[top_idx][h->mb_x - 1];
2178     top_border    = h->top_borders[top_idx][h->mb_x];
2179
2180 #define XCHG(a, b, xchg)                        \
2181     if (pixel_shift) {                          \
2182         if (xchg) {                             \
2183             AV_SWAP64(b + 0, a + 0);            \
2184             AV_SWAP64(b + 8, a + 8);            \
2185         } else {                                \
2186             AV_COPY128(b, a);                   \
2187         }                                       \
2188     } else if (xchg)                            \
2189         AV_SWAP64(b, a);                        \
2190     else                                        \
2191         AV_COPY64(b, a);
2192
2193     if (deblock_top) {
2194         if (deblock_topleft) {
2195             XCHG(top_border_m1 + (8 << pixel_shift),
2196                  src_y - (7 << pixel_shift), 1);
2197         }
2198         XCHG(top_border + (0 << pixel_shift), src_y + (1 << pixel_shift), xchg);
2199         XCHG(top_border + (8 << pixel_shift), src_y + (9 << pixel_shift), 1);
2200         if (h->mb_x + 1 < h->mb_width) {
2201             XCHG(h->top_borders[top_idx][h->mb_x + 1],
2202                  src_y + (17 << pixel_shift), 1);
2203         }
2204     }
2205     if (simple || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
2206         if (chroma444) {
2207             if (deblock_topleft) {
2208                 XCHG(top_border_m1 + (24 << pixel_shift), src_cb - (7 << pixel_shift), 1);
2209                 XCHG(top_border_m1 + (40 << pixel_shift), src_cr - (7 << pixel_shift), 1);
2210             }
2211             XCHG(top_border + (16 << pixel_shift), src_cb + (1 << pixel_shift), xchg);
2212             XCHG(top_border + (24 << pixel_shift), src_cb + (9 << pixel_shift), 1);
2213             XCHG(top_border + (32 << pixel_shift), src_cr + (1 << pixel_shift), xchg);
2214             XCHG(top_border + (40 << pixel_shift), src_cr + (9 << pixel_shift), 1);
2215             if (h->mb_x + 1 < h->mb_width) {
2216                 XCHG(h->top_borders[top_idx][h->mb_x + 1] + (16 << pixel_shift), src_cb + (17 << pixel_shift), 1);
2217                 XCHG(h->top_borders[top_idx][h->mb_x + 1] + (32 << pixel_shift), src_cr + (17 << pixel_shift), 1);
2218             }
2219         } else {
2220             if (deblock_top) {
2221                 if (deblock_topleft) {
2222                     XCHG(top_border_m1 + (16 << pixel_shift), src_cb - (7 << pixel_shift), 1);
2223                     XCHG(top_border_m1 + (24 << pixel_shift), src_cr - (7 << pixel_shift), 1);
2224                 }
2225                 XCHG(top_border + (16 << pixel_shift), src_cb + 1 + pixel_shift, 1);
2226                 XCHG(top_border + (24 << pixel_shift), src_cr + 1 + pixel_shift, 1);
2227             }
2228         }
2229     }
2230 }
2231
2232 static av_always_inline int dctcoef_get(int16_t *mb, int high_bit_depth,
2233                                         int index)
2234 {
2235     if (high_bit_depth) {
2236         return AV_RN32A(((int32_t *)mb) + index);
2237     } else
2238         return AV_RN16A(mb + index);
2239 }
2240
2241 static av_always_inline void dctcoef_set(int16_t *mb, int high_bit_depth,
2242                                          int index, int value)
2243 {
2244     if (high_bit_depth) {
2245         AV_WN32A(((int32_t *)mb) + index, value);
2246     } else
2247         AV_WN16A(mb + index, value);
2248 }
2249
2250 static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
2251                                                        int mb_type, int is_h264,
2252                                                        int simple,
2253                                                        int transform_bypass,
2254                                                        int pixel_shift,
2255                                                        int *block_offset,
2256                                                        int linesize,
2257                                                        uint8_t *dest_y, int p)
2258 {
2259     void (*idct_add)(uint8_t *dst, int16_t *block, int stride);
2260     void (*idct_dc_add)(uint8_t *dst, int16_t *block, int stride);
2261     int i;
2262     int qscale = p == 0 ? h->qscale : h->chroma_qp[p - 1];
2263     block_offset += 16 * p;
2264     if (IS_INTRA4x4(mb_type)) {
2265         if (IS_8x8DCT(mb_type)) {
2266             if (transform_bypass) {
2267                 idct_dc_add =
2268                 idct_add    = h->h264dsp.h264_add_pixels8_clear;
2269             } else {
2270                 idct_dc_add = h->h264dsp.h264_idct8_dc_add;
2271                 idct_add    = h->h264dsp.h264_idct8_add;
2272             }
2273             for (i = 0; i < 16; i += 4) {
2274                 uint8_t *const ptr = dest_y + block_offset[i];
2275                 const int dir      = h->intra4x4_pred_mode_cache[scan8[i]];
2276                 if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) {
2277                     h->hpc.pred8x8l_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
2278                 } else {
2279                     const int nnz = h->non_zero_count_cache[scan8[i + p * 16]];
2280                     h->hpc.pred8x8l[dir](ptr, (h->topleft_samples_available << i) & 0x8000,
2281                                          (h->topright_samples_available << i) & 0x4000, linesize);
2282                     if (nnz) {
2283                         if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256))
2284                             idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
2285                         else
2286                             idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
2287                     }
2288                 }
2289             }
2290         } else {
2291             if (transform_bypass) {
2292                 idct_dc_add  =
2293                 idct_add     = h->h264dsp.h264_add_pixels4_clear;
2294             } else {
2295                 idct_dc_add = h->h264dsp.h264_idct_dc_add;
2296                 idct_add    = h->h264dsp.h264_idct_add;
2297             }
2298             for (i = 0; i < 16; i++) {
2299                 uint8_t *const ptr = dest_y + block_offset[i];
2300                 const int dir      = h->intra4x4_pred_mode_cache[scan8[i]];
2301
2302                 if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) {
2303                     h->hpc.pred4x4_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
2304                 } else {
2305                     uint8_t *topright;
2306                     int nnz, tr;
2307                     uint64_t tr_high;
2308                     if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
2309                         const int topright_avail = (h->topright_samples_available << i) & 0x8000;
2310                         assert(h->mb_y || linesize <= block_offset[i]);
2311                         if (!topright_avail) {
2312                             if (pixel_shift) {
2313                                 tr_high  = ((uint16_t *)ptr)[3 - linesize / 2] * 0x0001000100010001ULL;
2314                                 topright = (uint8_t *)&tr_high;
2315                             } else {
2316                                 tr       = ptr[3 - linesize] * 0x01010101u;
2317                                 topright = (uint8_t *)&tr;
2318                             }
2319                         } else
2320                             topright = ptr + (4 << pixel_shift) - linesize;
2321                     } else
2322                         topright = NULL;
2323
2324                     h->hpc.pred4x4[dir](ptr, topright, linesize);
2325                     nnz = h->non_zero_count_cache[scan8[i + p * 16]];
2326                     if (nnz) {
2327                         if (is_h264) {
2328                             if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256))
2329                                 idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
2330                             else
2331                                 idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
2332                         } else if (CONFIG_SVQ3_DECODER)
2333                             ff_svq3_add_idct_c(ptr, h->mb + i * 16 + p * 256, linesize, qscale, 0);
2334                     }
2335                 }
2336             }
2337         }
2338     } else {
2339         h->hpc.pred16x16[h->intra16x16_pred_mode](dest_y, linesize);
2340         if (is_h264) {
2341             if (h->non_zero_count_cache[scan8[LUMA_DC_BLOCK_INDEX + p]]) {
2342                 if (!transform_bypass)
2343                     h->h264dsp.h264_luma_dc_dequant_idct(h->mb + (p * 256 << pixel_shift),
2344                                                          h->mb_luma_dc[p],
2345                                                          h->dequant4_coeff[p][qscale][0]);
2346                 else {
2347                     static const uint8_t dc_mapping[16] = {
2348                          0 * 16,  1 * 16,  4 * 16,  5 * 16,
2349                          2 * 16,  3 * 16,  6 * 16,  7 * 16,
2350                          8 * 16,  9 * 16, 12 * 16, 13 * 16,
2351                         10 * 16, 11 * 16, 14 * 16, 15 * 16
2352                     };
2353                     for (i = 0; i < 16; i++)
2354                         dctcoef_set(h->mb + (p * 256 << pixel_shift),
2355                                     pixel_shift, dc_mapping[i],
2356                                     dctcoef_get(h->mb_luma_dc[p],
2357                                                 pixel_shift, i));
2358                 }
2359             }
2360         } else if (CONFIG_SVQ3_DECODER)
2361             ff_svq3_luma_dc_dequant_idct_c(h->mb + p * 256,
2362                                            h->mb_luma_dc[p], qscale);
2363     }
2364 }
2365
2366 static av_always_inline void hl_decode_mb_idct_luma(H264Context *h, int mb_type,
2367                                                     int is_h264, int simple,
2368                                                     int transform_bypass,
2369                                                     int pixel_shift,
2370                                                     int *block_offset,
2371                                                     int linesize,
2372                                                     uint8_t *dest_y, int p)
2373 {
2374     void (*idct_add)(uint8_t *dst, int16_t *block, int stride);
2375     int i;
2376     block_offset += 16 * p;
2377     if (!IS_INTRA4x4(mb_type)) {
2378         if (is_h264) {
2379             if (IS_INTRA16x16(mb_type)) {
2380                 if (transform_bypass) {
2381                     if (h->sps.profile_idc == 244 &&
2382                         (h->intra16x16_pred_mode == VERT_PRED8x8 ||
2383                          h->intra16x16_pred_mode == HOR_PRED8x8)) {
2384                         h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset,
2385                                                                       h->mb + (p * 256 << pixel_shift),
2386                                                                       linesize);
2387                     } else {
2388                         for (i = 0; i < 16; i++)
2389                             if (h->non_zero_count_cache[scan8[i + p * 16]] ||
2390                                 dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256))
2391                                 h->h264dsp.h264_add_pixels4_clear(dest_y + block_offset[i],
2392                                                                   h->mb + (i * 16 + p * 256 << pixel_shift),
2393                                                                   linesize);
2394                     }
2395                 } else {
2396                     h->h264dsp.h264_idct_add16intra(dest_y, block_offset,
2397                                                     h->mb + (p * 256 << pixel_shift),
2398                                                     linesize,
2399                                                     h->non_zero_count_cache + p * 5 * 8);
2400                 }
2401             } else if (h->cbp & 15) {
2402                 if (transform_bypass) {
2403                     const int di = IS_8x8DCT(mb_type) ? 4 : 1;
2404                     idct_add = IS_8x8DCT(mb_type) ? h->h264dsp.h264_add_pixels8_clear
2405                                                   : h->h264dsp.h264_add_pixels4_clear;
2406                     for (i = 0; i < 16; i += di)
2407                         if (h->non_zero_count_cache[scan8[i + p * 16]])
2408                             idct_add(dest_y + block_offset[i],
2409                                      h->mb + (i * 16 + p * 256 << pixel_shift),
2410                                      linesize);
2411                 } else {
2412                     if (IS_8x8DCT(mb_type))
2413                         h->h264dsp.h264_idct8_add4(dest_y, block_offset,
2414                                                    h->mb + (p * 256 << pixel_shift),
2415                                                    linesize,
2416                                                    h->non_zero_count_cache + p * 5 * 8);
2417                     else
2418                         h->h264dsp.h264_idct_add16(dest_y, block_offset,
2419                                                    h->mb + (p * 256 << pixel_shift),
2420                                                    linesize,
2421                                                    h->non_zero_count_cache + p * 5 * 8);
2422                 }
2423             }
2424         } else if (CONFIG_SVQ3_DECODER) {
2425             for (i = 0; i < 16; i++)
2426                 if (h->non_zero_count_cache[scan8[i + p * 16]] || h->mb[i * 16 + p * 256]) {
2427                     // FIXME benchmark weird rule, & below
2428                     uint8_t *const ptr = dest_y + block_offset[i];
2429                     ff_svq3_add_idct_c(ptr, h->mb + i * 16 + p * 256, linesize,
2430                                        h->qscale, IS_INTRA(mb_type) ? 1 : 0);
2431                 }
2432         }
2433     }
2434 }
2435
2436 #define BITS   8
2437 #define SIMPLE 1
2438 #include "h264_mb_template.c"
2439
2440 #undef  BITS
2441 #define BITS   16
2442 #include "h264_mb_template.c"
2443
2444 #undef  SIMPLE
2445 #define SIMPLE 0
2446 #include "h264_mb_template.c"
2447
2448 void ff_h264_hl_decode_mb(H264Context *h)
2449 {
2450     const int mb_xy   = h->mb_xy;
2451     const int mb_type = h->cur_pic.mb_type[mb_xy];
2452     int is_complex    = CONFIG_SMALL || h->is_complex ||
2453                         IS_INTRA_PCM(mb_type) || h->qscale == 0;
2454
2455     if (CHROMA444(h)) {
2456         if (is_complex || h->pixel_shift)
2457             hl_decode_mb_444_complex(h);
2458         else
2459             hl_decode_mb_444_simple_8(h);
2460     } else if (is_complex) {
2461         hl_decode_mb_complex(h);
2462     } else if (h->pixel_shift) {
2463         hl_decode_mb_simple_16(h);
2464     } else
2465         hl_decode_mb_simple_8(h);
2466 }
2467
2468 static int pred_weight_table(H264Context *h)
2469 {
2470     int list, i;
2471     int luma_def, chroma_def;
2472
2473     h->use_weight             = 0;
2474     h->use_weight_chroma      = 0;
2475     h->luma_log2_weight_denom = get_ue_golomb(&h->gb);
2476     if (h->sps.chroma_format_idc)
2477         h->chroma_log2_weight_denom = get_ue_golomb(&h->gb);
2478     luma_def   = 1 << h->luma_log2_weight_denom;
2479     chroma_def = 1 << h->chroma_log2_weight_denom;
2480
2481     for (list = 0; list < 2; list++) {
2482         h->luma_weight_flag[list]   = 0;
2483         h->chroma_weight_flag[list] = 0;
2484         for (i = 0; i < h->ref_count[list]; i++) {
2485             int luma_weight_flag, chroma_weight_flag;
2486
2487             luma_weight_flag = get_bits1(&h->gb);
2488             if (luma_weight_flag) {
2489                 h->luma_weight[i][list][0] = get_se_golomb(&h->gb);
2490                 h->luma_weight[i][list][1] = get_se_golomb(&h->gb);
2491                 if (h->luma_weight[i][list][0] != luma_def ||
2492                     h->luma_weight[i][list][1] != 0) {
2493                     h->use_weight             = 1;
2494                     h->luma_weight_flag[list] = 1;
2495                 }
2496             } else {
2497                 h->luma_weight[i][list][0] = luma_def;
2498                 h->luma_weight[i][list][1] = 0;
2499             }
2500
2501             if (h->sps.chroma_format_idc) {
2502                 chroma_weight_flag = get_bits1(&h->gb);
2503                 if (chroma_weight_flag) {
2504                     int j;
2505                     for (j = 0; j < 2; j++) {
2506                         h->chroma_weight[i][list][j][0] = get_se_golomb(&h->gb);
2507                         h->chroma_weight[i][list][j][1] = get_se_golomb(&h->gb);
2508                         if (h->chroma_weight[i][list][j][0] != chroma_def ||
2509                             h->chroma_weight[i][list][j][1] != 0) {
2510                             h->use_weight_chroma        = 1;
2511                             h->chroma_weight_flag[list] = 1;
2512                         }
2513                     }
2514                 } else {
2515                     int j;
2516                     for (j = 0; j < 2; j++) {
2517                         h->chroma_weight[i][list][j][0] = chroma_def;
2518                         h->chroma_weight[i][list][j][1] = 0;
2519                     }
2520                 }
2521             }
2522         }
2523         if (h->slice_type_nos != AV_PICTURE_TYPE_B)
2524             break;
2525     }
2526     h->use_weight = h->use_weight || h->use_weight_chroma;
2527     return 0;
2528 }
2529
2530 /**
2531  * Initialize implicit_weight table.
2532  * @param field  0/1 initialize the weight for interlaced MBAFF
2533  *                -1 initializes the rest
2534  */
2535 static void implicit_weight_table(H264Context *h, int field)
2536 {
2537     int ref0, ref1, i, cur_poc, ref_start, ref_count0, ref_count1;
2538
2539     for (i = 0; i < 2; i++) {
2540         h->luma_weight_flag[i]   = 0;
2541         h->chroma_weight_flag[i] = 0;
2542     }
2543
2544     if (field < 0) {
2545         if (h->picture_structure == PICT_FRAME) {
2546             cur_poc = h->cur_pic_ptr->poc;
2547         } else {
2548             cur_poc = h->cur_pic_ptr->field_poc[h->picture_structure - 1];
2549         }
2550         if (h->ref_count[0] == 1 && h->ref_count[1] == 1 && !FRAME_MBAFF(h) &&
2551             h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2 * cur_poc) {
2552             h->use_weight        = 0;
2553             h->use_weight_chroma = 0;
2554             return;
2555         }
2556         ref_start  = 0;
2557         ref_count0 = h->ref_count[0];
2558         ref_count1 = h->ref_count[1];
2559     } else {
2560         cur_poc    = h->cur_pic_ptr->field_poc[field];
2561         ref_start  = 16;
2562         ref_count0 = 16 + 2 * h->ref_count[0];
2563         ref_count1 = 16 + 2 * h->ref_count[1];
2564     }
2565
2566     h->use_weight               = 2;
2567     h->use_weight_chroma        = 2;
2568     h->luma_log2_weight_denom   = 5;
2569     h->chroma_log2_weight_denom = 5;
2570
2571     for (ref0 = ref_start; ref0 < ref_count0; ref0++) {
2572         int poc0 = h->ref_list[0][ref0].poc;
2573         for (ref1 = ref_start; ref1 < ref_count1; ref1++) {
2574             int w = 32;
2575             if (!h->ref_list[0][ref0].long_ref && !h->ref_list[1][ref1].long_ref) {
2576                 int poc1 = h->ref_list[1][ref1].poc;
2577                 int td   = av_clip(poc1 - poc0, -128, 127);
2578                 if (td) {
2579                     int tb = av_clip(cur_poc - poc0, -128, 127);
2580                     int tx = (16384 + (FFABS(td) >> 1)) / td;
2581                     int dist_scale_factor = (tb * tx + 32) >> 8;
2582                     if (dist_scale_factor >= -64 && dist_scale_factor <= 128)
2583                         w = 64 - dist_scale_factor;
2584                 }
2585             }
2586             if (field < 0) {
2587                 h->implicit_weight[ref0][ref1][0] =
2588                 h->implicit_weight[ref0][ref1][1] = w;
2589             } else {
2590                 h->implicit_weight[ref0][ref1][field] = w;
2591             }
2592         }
2593     }
2594 }
2595
2596 /**
2597  * instantaneous decoder refresh.
2598  */
2599 static void idr(H264Context *h)
2600 {
2601     ff_h264_remove_all_refs(h);
2602     h->prev_frame_num        = 0;
2603     h->prev_frame_num_offset = 0;
2604     h->prev_poc_msb          =
2605     h->prev_poc_lsb          = 0;
2606 }
2607
2608 /* forget old pics after a seek */
2609 static void flush_change(H264Context *h)
2610 {
2611     int i;
2612     for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
2613         h->last_pocs[i] = INT_MIN;
2614     h->outputed_poc          = h->next_outputed_poc = INT_MIN;
2615     h->prev_interlaced_frame = 1;
2616     idr(h);
2617     if (h->cur_pic_ptr)
2618         h->cur_pic_ptr->reference = 0;
2619     h->first_field = 0;
2620     memset(h->ref_list[0], 0, sizeof(h->ref_list[0]));
2621     memset(h->ref_list[1], 0, sizeof(h->ref_list[1]));
2622     memset(h->default_ref_list[0], 0, sizeof(h->default_ref_list[0]));
2623     memset(h->default_ref_list[1], 0, sizeof(h->default_ref_list[1]));
2624     ff_h264_reset_sei(h);
2625 }
2626
2627 /* forget old pics after a seek */
2628 static void flush_dpb(AVCodecContext *avctx)
2629 {
2630     H264Context *h = avctx->priv_data;
2631     int i;
2632
2633     for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++) {
2634         if (h->delayed_pic[i])
2635             h->delayed_pic[i]->reference = 0;
2636         h->delayed_pic[i] = NULL;
2637     }
2638
2639     flush_change(h);
2640
2641     if (h->DPB)
2642         for (i = 0; i < MAX_PICTURE_COUNT; i++)
2643             unref_picture(h, &h->DPB[i]);
2644     h->cur_pic_ptr = NULL;
2645     unref_picture(h, &h->cur_pic);
2646
2647     h->mb_x = h->mb_y = 0;
2648
2649     h->parse_context.state             = -1;
2650     h->parse_context.frame_start_found = 0;
2651     h->parse_context.overread          = 0;
2652     h->parse_context.overread_index    = 0;
2653     h->parse_context.index             = 0;
2654     h->parse_context.last_index        = 0;
2655 }
2656
2657 int ff_init_poc(H264Context *h, int pic_field_poc[2], int *pic_poc)
2658 {
2659     const int max_frame_num = 1 << h->sps.log2_max_frame_num;
2660     int field_poc[2];
2661
2662     h->frame_num_offset = h->prev_frame_num_offset;
2663     if (h->frame_num < h->prev_frame_num)
2664         h->frame_num_offset += max_frame_num;
2665
2666     if (h->sps.poc_type == 0) {
2667         const int max_poc_lsb = 1 << h->sps.log2_max_poc_lsb;
2668
2669         if (h->poc_lsb < h->prev_poc_lsb &&
2670             h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb / 2)
2671             h->poc_msb = h->prev_poc_msb + max_poc_lsb;
2672         else if (h->poc_lsb > h->prev_poc_lsb &&
2673                  h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb / 2)
2674             h->poc_msb = h->prev_poc_msb - max_poc_lsb;
2675         else
2676             h->poc_msb = h->prev_poc_msb;
2677         field_poc[0] =
2678         field_poc[1] = h->poc_msb + h->poc_lsb;
2679         if (h->picture_structure == PICT_FRAME)
2680             field_poc[1] += h->delta_poc_bottom;
2681     } else if (h->sps.poc_type == 1) {
2682         int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
2683         int i;
2684
2685         if (h->sps.poc_cycle_length != 0)
2686             abs_frame_num = h->frame_num_offset + h->frame_num;
2687         else
2688             abs_frame_num = 0;
2689
2690         if (h->nal_ref_idc == 0 && abs_frame_num > 0)
2691             abs_frame_num--;
2692
2693         expected_delta_per_poc_cycle = 0;
2694         for (i = 0; i < h->sps.poc_cycle_length; i++)
2695             // FIXME integrate during sps parse
2696             expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[i];
2697
2698         if (abs_frame_num > 0) {
2699             int poc_cycle_cnt          = (abs_frame_num - 1) / h->sps.poc_cycle_length;
2700             int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length;
2701
2702             expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle;
2703             for (i = 0; i <= frame_num_in_poc_cycle; i++)
2704                 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[i];
2705         } else
2706             expectedpoc = 0;
2707
2708         if (h->nal_ref_idc == 0)
2709             expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic;
2710
2711         field_poc[0] = expectedpoc + h->delta_poc[0];
2712         field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field;
2713
2714         if (h->picture_structure == PICT_FRAME)
2715             field_poc[1] += h->delta_poc[1];
2716     } else {
2717         int poc = 2 * (h->frame_num_offset + h->frame_num);
2718
2719         if (!h->nal_ref_idc)
2720             poc--;
2721
2722         field_poc[0] = poc;
2723         field_poc[1] = poc;
2724     }
2725
2726     if (h->picture_structure != PICT_BOTTOM_FIELD)
2727         pic_field_poc[0] = field_poc[0];
2728     if (h->picture_structure != PICT_TOP_FIELD)
2729         pic_field_poc[1] = field_poc[1];
2730     *pic_poc = FFMIN(pic_field_poc[0], pic_field_poc[1]);
2731
2732     return 0;
2733 }
2734
2735 /**
2736  * initialize scan tables
2737  */
2738 static void init_scan_tables(H264Context *h)
2739 {
2740     int i;
2741     for (i = 0; i < 16; i++) {
2742 #define T(x) (x >> 2) | ((x << 2) & 0xF)
2743         h->zigzag_scan[i] = T(zigzag_scan[i]);
2744         h->field_scan[i]  = T(field_scan[i]);
2745 #undef T
2746     }
2747     for (i = 0; i < 64; i++) {
2748 #define T(x) (x >> 3) | ((x & 7) << 3)
2749         h->zigzag_scan8x8[i]       = T(ff_zigzag_direct[i]);
2750         h->zigzag_scan8x8_cavlc[i] = T(zigzag_scan8x8_cavlc[i]);
2751         h->field_scan8x8[i]        = T(field_scan8x8[i]);
2752         h->field_scan8x8_cavlc[i]  = T(field_scan8x8_cavlc[i]);
2753 #undef T
2754     }
2755     if (h->sps.transform_bypass) { // FIXME same ugly
2756         h->zigzag_scan_q0          = zigzag_scan;
2757         h->zigzag_scan8x8_q0       = ff_zigzag_direct;
2758         h->zigzag_scan8x8_cavlc_q0 = zigzag_scan8x8_cavlc;
2759         h->field_scan_q0           = field_scan;
2760         h->field_scan8x8_q0        = field_scan8x8;
2761         h->field_scan8x8_cavlc_q0  = field_scan8x8_cavlc;
2762     } else {
2763         h->zigzag_scan_q0          = h->zigzag_scan;
2764         h->zigzag_scan8x8_q0       = h->zigzag_scan8x8;
2765         h->zigzag_scan8x8_cavlc_q0 = h->zigzag_scan8x8_cavlc;
2766         h->field_scan_q0           = h->field_scan;
2767         h->field_scan8x8_q0        = h->field_scan8x8;
2768         h->field_scan8x8_cavlc_q0  = h->field_scan8x8_cavlc;
2769     }
2770 }
2771
2772 static int field_end(H264Context *h, int in_setup)
2773 {
2774     AVCodecContext *const avctx = h->avctx;
2775     int err = 0;
2776     h->mb_y = 0;
2777
2778     if (!in_setup && !h->droppable)
2779         ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
2780                                   h->picture_structure == PICT_BOTTOM_FIELD);
2781
2782     if (in_setup || !(avctx->active_thread_type & FF_THREAD_FRAME)) {
2783         if (!h->droppable) {
2784             err = ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
2785             h->prev_poc_msb = h->poc_msb;
2786             h->prev_poc_lsb = h->poc_lsb;
2787         }
2788         h->prev_frame_num_offset = h->frame_num_offset;
2789         h->prev_frame_num        = h->frame_num;
2790         h->outputed_poc          = h->next_outputed_poc;
2791     }
2792
2793     if (avctx->hwaccel) {
2794         if (avctx->hwaccel->end_frame(avctx) < 0)
2795             av_log(avctx, AV_LOG_ERROR,
2796                    "hardware accelerator failed to decode picture\n");
2797     }
2798
2799     /*
2800      * FIXME: Error handling code does not seem to support interlaced
2801      * when slices span multiple rows
2802      * The ff_er_add_slice calls don't work right for bottom
2803      * fields; they cause massive erroneous error concealing
2804      * Error marking covers both fields (top and bottom).
2805      * This causes a mismatched s->error_count
2806      * and a bad error table. Further, the error count goes to
2807      * INT_MAX when called for bottom field, because mb_y is
2808      * past end by one (callers fault) and resync_mb_y != 0
2809      * causes problems for the first MB line, too.
2810      */
2811     if (CONFIG_ERROR_RESILIENCE && !FIELD_PICTURE(h)) {
2812         h->er.cur_pic  = h->cur_pic_ptr;
2813         h->er.last_pic = h->ref_count[0] ? &h->ref_list[0][0] : NULL;
2814         h->er.next_pic = h->ref_count[1] ? &h->ref_list[1][0] : NULL;
2815         ff_er_frame_end(&h->er);
2816     }
2817     emms_c();
2818
2819     h->current_slice = 0;
2820
2821     return err;
2822 }
2823
2824 /**
2825  * Replicate H264 "master" context to thread contexts.
2826  */
2827 static int clone_slice(H264Context *dst, H264Context *src)
2828 {
2829     memcpy(dst->block_offset, src->block_offset, sizeof(dst->block_offset));
2830     dst->cur_pic_ptr = src->cur_pic_ptr;
2831     dst->cur_pic     = src->cur_pic;
2832     dst->linesize    = src->linesize;
2833     dst->uvlinesize  = src->uvlinesize;
2834     dst->first_field = src->first_field;
2835
2836     dst->prev_poc_msb          = src->prev_poc_msb;
2837     dst->prev_poc_lsb          = src->prev_poc_lsb;
2838     dst->prev_frame_num_offset = src->prev_frame_num_offset;
2839     dst->prev_frame_num        = src->prev_frame_num;
2840     dst->short_ref_count       = src->short_ref_count;
2841
2842     memcpy(dst->short_ref,        src->short_ref,        sizeof(dst->short_ref));
2843     memcpy(dst->long_ref,         src->long_ref,         sizeof(dst->long_ref));
2844     memcpy(dst->default_ref_list, src->default_ref_list, sizeof(dst->default_ref_list));
2845
2846     memcpy(dst->dequant4_coeff,   src->dequant4_coeff,   sizeof(src->dequant4_coeff));
2847     memcpy(dst->dequant8_coeff,   src->dequant8_coeff,   sizeof(src->dequant8_coeff));
2848
2849     return 0;
2850 }
2851
2852 /**
2853  * Compute profile from profile_idc and constraint_set?_flags.
2854  *
2855  * @param sps SPS
2856  *
2857  * @return profile as defined by FF_PROFILE_H264_*
2858  */
2859 int ff_h264_get_profile(SPS *sps)
2860 {
2861     int profile = sps->profile_idc;
2862
2863     switch (sps->profile_idc) {
2864     case FF_PROFILE_H264_BASELINE:
2865         // constraint_set1_flag set to 1
2866         profile |= (sps->constraint_set_flags & 1 << 1) ? FF_PROFILE_H264_CONSTRAINED : 0;
2867         break;
2868     case FF_PROFILE_H264_HIGH_10:
2869     case FF_PROFILE_H264_HIGH_422:
2870     case FF_PROFILE_H264_HIGH_444_PREDICTIVE:
2871         // constraint_set3_flag set to 1
2872         profile |= (sps->constraint_set_flags & 1 << 3) ? FF_PROFILE_H264_INTRA : 0;
2873         break;
2874     }
2875
2876     return profile;
2877 }
2878
2879 static int h264_set_parameter_from_sps(H264Context *h)
2880 {
2881     if (h->flags & CODEC_FLAG_LOW_DELAY ||
2882         (h->sps.bitstream_restriction_flag &&
2883          !h->sps.num_reorder_frames)) {
2884         if (h->avctx->has_b_frames > 1 || h->delayed_pic[0])
2885             av_log(h->avctx, AV_LOG_WARNING, "Delayed frames seen. "
2886                    "Reenabling low delay requires a codec flush.\n");
2887         else
2888             h->low_delay = 1;
2889     }
2890
2891     if (h->avctx->has_b_frames < 2)
2892         h->avctx->has_b_frames = !h->low_delay;
2893
2894     if (h->sps.bit_depth_luma != h->sps.bit_depth_chroma) {
2895         avpriv_request_sample(h->avctx,
2896                               "Different chroma and luma bit depth");
2897         return AVERROR_PATCHWELCOME;
2898     }
2899
2900     if (h->avctx->bits_per_raw_sample != h->sps.bit_depth_luma ||
2901         h->cur_chroma_format_idc      != h->sps.chroma_format_idc) {
2902         if (h->sps.bit_depth_luma >= 8 && h->sps.bit_depth_luma <= 10) {
2903             h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma;
2904             h->cur_chroma_format_idc      = h->sps.chroma_format_idc;
2905             h->pixel_shift                = h->sps.bit_depth_luma > 8;
2906
2907             ff_h264dsp_init(&h->h264dsp, h->sps.bit_depth_luma,
2908                             h->sps.chroma_format_idc);
2909             ff_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma);
2910             ff_h264qpel_init(&h->h264qpel, h->sps.bit_depth_luma);
2911             ff_h264_pred_init(&h->hpc, h->avctx->codec_id, h->sps.bit_depth_luma,
2912                               h->sps.chroma_format_idc);
2913             if (CONFIG_ERROR_RESILIENCE)
2914                 ff_dsputil_init(&h->dsp, h->avctx);
2915             ff_videodsp_init(&h->vdsp, h->sps.bit_depth_luma);
2916         } else {
2917             av_log(h->avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n",
2918                    h->sps.bit_depth_luma);
2919             return AVERROR_INVALIDDATA;
2920         }
2921     }
2922     return 0;
2923 }
2924
2925 static enum AVPixelFormat get_pixel_format(H264Context *h)
2926 {
2927     switch (h->sps.bit_depth_luma) {
2928     case 9:
2929         if (CHROMA444(h)) {
2930             if (h->avctx->colorspace == AVCOL_SPC_RGB) {
2931                 return AV_PIX_FMT_GBRP9;
2932             } else
2933                 return AV_PIX_FMT_YUV444P9;
2934         } else if (CHROMA422(h))
2935             return AV_PIX_FMT_YUV422P9;
2936         else
2937             return AV_PIX_FMT_YUV420P9;
2938         break;
2939     case 10:
2940         if (CHROMA444(h)) {
2941             if (h->avctx->colorspace == AVCOL_SPC_RGB) {
2942                 return AV_PIX_FMT_GBRP10;
2943             } else
2944                 return AV_PIX_FMT_YUV444P10;
2945         } else if (CHROMA422(h))
2946             return AV_PIX_FMT_YUV422P10;
2947         else
2948             return AV_PIX_FMT_YUV420P10;
2949         break;
2950     case 8:
2951         if (CHROMA444(h)) {
2952             if (h->avctx->colorspace == AVCOL_SPC_RGB) {
2953                 return AV_PIX_FMT_GBRP;
2954             } else
2955                 return h->avctx->color_range == AVCOL_RANGE_JPEG ? AV_PIX_FMT_YUVJ444P
2956                                                                  : AV_PIX_FMT_YUV444P;
2957         } else if (CHROMA422(h)) {
2958             return h->avctx->color_range == AVCOL_RANGE_JPEG ? AV_PIX_FMT_YUVJ422P
2959                                                              : AV_PIX_FMT_YUV422P;
2960         } else {
2961             return h->avctx->get_format(h->avctx, h->avctx->codec->pix_fmts ?
2962                                         h->avctx->codec->pix_fmts :
2963                                         h->avctx->color_range == AVCOL_RANGE_JPEG ?
2964                                         h264_hwaccel_pixfmt_list_jpeg_420 :
2965                                         h264_hwaccel_pixfmt_list_420);
2966         }
2967         break;
2968     default:
2969         av_log(h->avctx, AV_LOG_ERROR,
2970                "Unsupported bit depth: %d\n", h->sps.bit_depth_luma);
2971         return AVERROR_INVALIDDATA;
2972     }
2973 }
2974
2975 /* export coded and cropped frame dimensions to AVCodecContext */
2976 static int init_dimensions(H264Context *h)
2977 {
2978     int width  = h->width  - (h->sps.crop_right + h->sps.crop_left);
2979     int height = h->height - (h->sps.crop_top   + h->sps.crop_bottom);
2980
2981     /* handle container cropping */
2982     if (!h->sps.crop &&
2983         FFALIGN(h->avctx->width,  16) == h->width &&
2984         FFALIGN(h->avctx->height, 16) == h->height) {
2985         width  = h->avctx->width;
2986         height = h->avctx->height;
2987     }
2988
2989     if (width <= 0 || height <= 0) {
2990         av_log(h->avctx, AV_LOG_ERROR, "Invalid cropped dimensions: %dx%d.\n",
2991                width, height);
2992         if (h->avctx->err_recognition & AV_EF_EXPLODE)
2993             return AVERROR_INVALIDDATA;
2994
2995         av_log(h->avctx, AV_LOG_WARNING, "Ignoring cropping information.\n");
2996         h->sps.crop_bottom = h->sps.crop_top = h->sps.crop_right = h->sps.crop_left = 0;
2997         h->sps.crop        = 0;
2998
2999         width  = h->width;
3000         height = h->height;
3001     }
3002
3003     h->avctx->coded_width  = h->width;
3004     h->avctx->coded_height = h->height;
3005     h->avctx->width        = width;
3006     h->avctx->height       = height;
3007
3008     return 0;
3009 }
3010
3011 static int h264_slice_header_init(H264Context *h, int reinit)
3012 {
3013     int nb_slices = (HAVE_THREADS &&
3014                      h->avctx->active_thread_type & FF_THREAD_SLICE) ?
3015                     h->avctx->thread_count : 1;
3016     int i, ret;
3017
3018     h->avctx->sample_aspect_ratio = h->sps.sar;
3019     av_assert0(h->avctx->sample_aspect_ratio.den);
3020     av_pix_fmt_get_chroma_sub_sample(h->avctx->pix_fmt,
3021                                      &h->chroma_x_shift, &h->chroma_y_shift);
3022
3023     if (h->sps.timing_info_present_flag) {
3024         int64_t den = h->sps.time_scale;
3025         if (h->x264_build < 44U)
3026             den *= 2;
3027         av_reduce(&h->avctx->time_base.num, &h->avctx->time_base.den,
3028                   h->sps.num_units_in_tick, den, 1 << 30);
3029     }
3030
3031     h->avctx->hwaccel = ff_find_hwaccel(h->avctx->codec->id, h->avctx->pix_fmt);
3032
3033     if (reinit)
3034         free_tables(h, 0);
3035     h->first_field           = 0;
3036     h->prev_interlaced_frame = 1;
3037
3038     init_scan_tables(h);
3039     ret = ff_h264_alloc_tables(h);
3040     if (ret < 0) {
3041         av_log(h->avctx, AV_LOG_ERROR,
3042                "Could not allocate memory for h264\n");
3043         return ret;
3044     }
3045
3046     if (nb_slices > MAX_THREADS || (nb_slices > h->mb_height && h->mb_height)) {
3047         int max_slices;
3048         if (h->mb_height)
3049             max_slices = FFMIN(MAX_THREADS, h->mb_height);
3050         else
3051             max_slices = MAX_THREADS;
3052         av_log(h->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
3053                " reducing to %d\n", nb_slices, max_slices);
3054         nb_slices = max_slices;
3055     }
3056     h->slice_context_count = nb_slices;
3057
3058     if (!HAVE_THREADS || !(h->avctx->active_thread_type & FF_THREAD_SLICE)) {
3059         ret = context_init(h);
3060         if (ret < 0) {
3061             av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
3062             return ret;
3063         }
3064     } else {
3065         for (i = 1; i < h->slice_context_count; i++) {
3066             H264Context *c;
3067             c                    = h->thread_context[i] = av_mallocz(sizeof(H264Context));
3068             c->avctx             = h->avctx;
3069             c->dsp               = h->dsp;
3070             c->vdsp              = h->vdsp;
3071             c->h264dsp           = h->h264dsp;
3072             c->h264qpel          = h->h264qpel;
3073             c->h264chroma        = h->h264chroma;
3074             c->sps               = h->sps;
3075             c->pps               = h->pps;
3076             c->pixel_shift       = h->pixel_shift;
3077             c->width             = h->width;
3078             c->height            = h->height;
3079             c->linesize          = h->linesize;
3080             c->uvlinesize        = h->uvlinesize;
3081             c->chroma_x_shift    = h->chroma_x_shift;
3082             c->chroma_y_shift    = h->chroma_y_shift;
3083             c->qscale            = h->qscale;
3084             c->droppable         = h->droppable;
3085             c->data_partitioning = h->data_partitioning;
3086             c->low_delay         = h->low_delay;
3087             c->mb_width          = h->mb_width;
3088             c->mb_height         = h->mb_height;
3089             c->mb_stride         = h->mb_stride;
3090             c->mb_num            = h->mb_num;
3091             c->flags             = h->flags;
3092             c->workaround_bugs   = h->workaround_bugs;
3093             c->pict_type         = h->pict_type;
3094
3095             init_scan_tables(c);
3096             clone_tables(c, h, i);
3097             c->context_initialized = 1;
3098         }
3099
3100         for (i = 0; i < h->slice_context_count; i++)
3101             if ((ret = context_init(h->thread_context[i])) < 0) {
3102                 av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
3103                 return ret;
3104             }
3105     }
3106
3107     h->context_initialized = 1;
3108
3109     return 0;
3110 }
3111
3112 /**
3113  * Decode a slice header.
3114  * This will also call ff_MPV_common_init() and frame_start() as needed.
3115  *
3116  * @param h h264context
3117  * @param h0 h264 master context (differs from 'h' when doing sliced based
3118  *           parallel decoding)
3119  *
3120  * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded
3121  */
3122 static int decode_slice_header(H264Context *h, H264Context *h0)
3123 {
3124     unsigned int first_mb_in_slice;
3125     unsigned int pps_id;
3126     int num_ref_idx_active_override_flag, max_refs, ret;
3127     unsigned int slice_type, tmp, i, j;
3128     int default_ref_list_done = 0;
3129     int last_pic_structure, last_pic_droppable;
3130     int needs_reinit = 0;
3131     int field_pic_flag, bottom_field_flag;
3132
3133     h->me.qpel_put = h->h264qpel.put_h264_qpel_pixels_tab;
3134     h->me.qpel_avg = h->h264qpel.avg_h264_qpel_pixels_tab;
3135
3136     first_mb_in_slice = get_ue_golomb(&h->gb);
3137
3138     if (first_mb_in_slice == 0) { // FIXME better field boundary detection
3139         if (h0->current_slice && FIELD_PICTURE(h)) {
3140             field_end(h, 1);
3141         }
3142
3143         h0->current_slice = 0;
3144         if (!h0->first_field) {
3145             if (h->cur_pic_ptr && !h->droppable) {
3146                 ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
3147                                           h->picture_structure == PICT_BOTTOM_FIELD);
3148             }
3149             h->cur_pic_ptr = NULL;
3150         }
3151     }
3152
3153     slice_type = get_ue_golomb_31(&h->gb);
3154     if (slice_type > 9) {
3155         av_log(h->avctx, AV_LOG_ERROR,
3156                "slice type too large (%d) at %d %d\n",
3157                h->slice_type, h->mb_x, h->mb_y);
3158         return AVERROR_INVALIDDATA;
3159     }
3160     if (slice_type > 4) {
3161         slice_type -= 5;
3162         h->slice_type_fixed = 1;
3163     } else
3164         h->slice_type_fixed = 0;
3165
3166     slice_type = golomb_to_pict_type[slice_type];
3167     if (slice_type == AV_PICTURE_TYPE_I ||
3168         (h0->current_slice != 0 && slice_type == h0->last_slice_type)) {
3169         default_ref_list_done = 1;
3170     }
3171     h->slice_type     = slice_type;
3172     h->slice_type_nos = slice_type & 3;
3173
3174     // to make a few old functions happy, it's wrong though
3175     h->pict_type = h->slice_type;
3176
3177     pps_id = get_ue_golomb(&h->gb);
3178     if (pps_id >= MAX_PPS_COUNT) {
3179         av_log(h->avctx, AV_LOG_ERROR, "pps_id out of range\n");
3180         return AVERROR_INVALIDDATA;
3181     }
3182     if (!h0->pps_buffers[pps_id]) {
3183         av_log(h->avctx, AV_LOG_ERROR,
3184                "non-existing PPS %u referenced\n",
3185                pps_id);
3186         return AVERROR_INVALIDDATA;
3187     }
3188     h->pps = *h0->pps_buffers[pps_id];
3189
3190     if (!h0->sps_buffers[h->pps.sps_id]) {
3191         av_log(h->avctx, AV_LOG_ERROR,
3192                "non-existing SPS %u referenced\n",
3193                h->pps.sps_id);
3194         return AVERROR_INVALIDDATA;
3195     }
3196
3197     if (h->pps.sps_id != h->current_sps_id ||
3198         h0->sps_buffers[h->pps.sps_id]->new) {
3199         h0->sps_buffers[h->pps.sps_id]->new = 0;
3200
3201         h->current_sps_id = h->pps.sps_id;
3202         h->sps            = *h0->sps_buffers[h->pps.sps_id];
3203
3204         if (h->bit_depth_luma    != h->sps.bit_depth_luma ||
3205             h->chroma_format_idc != h->sps.chroma_format_idc) {
3206             h->bit_depth_luma    = h->sps.bit_depth_luma;
3207             h->chroma_format_idc = h->sps.chroma_format_idc;
3208             needs_reinit         = 1;
3209         }
3210         if ((ret = h264_set_parameter_from_sps(h)) < 0)
3211             return ret;
3212     }
3213
3214     h->avctx->profile = ff_h264_get_profile(&h->sps);
3215     h->avctx->level   = h->sps.level_idc;
3216     h->avctx->refs    = h->sps.ref_frame_count;
3217
3218     if (h->mb_width  != h->sps.mb_width ||
3219         h->mb_height != h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag))
3220         needs_reinit = 1;
3221
3222     h->mb_width  = h->sps.mb_width;
3223     h->mb_height = h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag);
3224     h->mb_num    = h->mb_width * h->mb_height;
3225     h->mb_stride = h->mb_width + 1;
3226
3227     h->b_stride = h->mb_width * 4;
3228
3229     h->chroma_y_shift = h->sps.chroma_format_idc <= 1; // 400 uses yuv420p
3230
3231     h->width  = 16 * h->mb_width;
3232     h->height = 16 * h->mb_height;
3233
3234     ret = init_dimensions(h);
3235     if (ret < 0)
3236         return ret;
3237
3238     if (h->sps.video_signal_type_present_flag) {
3239         h->avctx->color_range = h->sps.full_range ? AVCOL_RANGE_JPEG
3240                                                   : AVCOL_RANGE_MPEG;
3241         if (h->sps.colour_description_present_flag) {
3242             if (h->avctx->colorspace != h->sps.colorspace)
3243                 needs_reinit = 1;
3244             h->avctx->color_primaries = h->sps.color_primaries;
3245             h->avctx->color_trc       = h->sps.color_trc;
3246             h->avctx->colorspace      = h->sps.colorspace;
3247         }
3248     }
3249
3250     if (h->context_initialized &&
3251         (h->width  != h->avctx->coded_width   ||
3252          h->height != h->avctx->coded_height  ||
3253          needs_reinit)) {
3254         if (h != h0) {
3255             av_log(h->avctx, AV_LOG_ERROR, "changing width/height on "
3256                    "slice %d\n", h0->current_slice + 1);
3257             return AVERROR_INVALIDDATA;
3258         }
3259
3260         flush_change(h);
3261
3262         if ((ret = get_pixel_format(h)) < 0)
3263             return ret;
3264         h->avctx->pix_fmt = ret;
3265
3266         av_log(h->avctx, AV_LOG_INFO, "Reinit context to %dx%d, "
3267                "pix_fmt: %d\n", h->width, h->height, h->avctx->pix_fmt);
3268
3269         if ((ret = h264_slice_header_init(h, 1)) < 0) {
3270             av_log(h->avctx, AV_LOG_ERROR,
3271                    "h264_slice_header_init() failed\n");
3272             return ret;
3273         }
3274     }
3275     if (!h->context_initialized) {
3276         if (h != h0) {
3277             av_log(h->avctx, AV_LOG_ERROR,
3278                    "Cannot (re-)initialize context during parallel decoding.\n");
3279             return AVERROR_PATCHWELCOME;
3280         }
3281
3282         if ((ret = get_pixel_format(h)) < 0)
3283             return ret;
3284         h->avctx->pix_fmt = ret;
3285
3286         if ((ret = h264_slice_header_init(h, 0)) < 0) {
3287             av_log(h->avctx, AV_LOG_ERROR,
3288                    "h264_slice_header_init() failed\n");
3289             return ret;
3290         }
3291     }
3292
3293     if (h == h0 && h->dequant_coeff_pps != pps_id) {
3294         h->dequant_coeff_pps = pps_id;
3295         init_dequant_tables(h);
3296     }
3297
3298     h->frame_num = get_bits(&h->gb, h->sps.log2_max_frame_num);
3299
3300     h->mb_mbaff        = 0;
3301     h->mb_aff_frame    = 0;
3302     last_pic_structure = h0->picture_structure;
3303     last_pic_droppable = h0->droppable;
3304     h->droppable       = h->nal_ref_idc == 0;
3305     if (h->sps.frame_mbs_only_flag) {
3306         h->picture_structure = PICT_FRAME;
3307     } else {
3308         field_pic_flag = get_bits1(&h->gb);
3309         if (field_pic_flag) {
3310             bottom_field_flag = get_bits1(&h->gb);
3311             h->picture_structure = PICT_TOP_FIELD + bottom_field_flag;
3312         } else {
3313             h->picture_structure = PICT_FRAME;
3314             h->mb_aff_frame      = h->sps.mb_aff;
3315         }
3316     }
3317     h->mb_field_decoding_flag = h->picture_structure != PICT_FRAME;
3318
3319     if (h0->current_slice != 0) {
3320         if (last_pic_structure != h->picture_structure ||
3321             last_pic_droppable != h->droppable) {
3322             av_log(h->avctx, AV_LOG_ERROR,
3323                    "Changing field mode (%d -> %d) between slices is not allowed\n",
3324                    last_pic_structure, h->picture_structure);
3325             h->picture_structure = last_pic_structure;
3326             h->droppable         = last_pic_droppable;
3327             return AVERROR_INVALIDDATA;
3328         } else if (!h0->cur_pic_ptr) {
3329             av_log(h->avctx, AV_LOG_ERROR,
3330                    "unset cur_pic_ptr on %d. slice\n",
3331                    h0->current_slice + 1);
3332             return AVERROR_INVALIDDATA;
3333         }
3334     } else {
3335         /* Shorten frame num gaps so we don't have to allocate reference
3336          * frames just to throw them away */
3337         if (h->frame_num != h->prev_frame_num) {
3338             int unwrap_prev_frame_num = h->prev_frame_num;
3339             int max_frame_num         = 1 << h->sps.log2_max_frame_num;
3340
3341             if (unwrap_prev_frame_num > h->frame_num)
3342                 unwrap_prev_frame_num -= max_frame_num;
3343
3344             if ((h->frame_num - unwrap_prev_frame_num) > h->sps.ref_frame_count) {
3345                 unwrap_prev_frame_num = (h->frame_num - h->sps.ref_frame_count) - 1;
3346                 if (unwrap_prev_frame_num < 0)
3347                     unwrap_prev_frame_num += max_frame_num;
3348
3349                 h->prev_frame_num = unwrap_prev_frame_num;
3350             }
3351         }
3352
3353         /* See if we have a decoded first field looking for a pair...
3354          * Here, we're using that to see if we should mark previously
3355          * decode frames as "finished".
3356          * We have to do that before the "dummy" in-between frame allocation,
3357          * since that can modify s->current_picture_ptr. */
3358         if (h0->first_field) {
3359             assert(h0->cur_pic_ptr);
3360             assert(h0->cur_pic_ptr->f.data[0]);
3361             assert(h0->cur_pic_ptr->reference != DELAYED_PIC_REF);
3362
3363             /* figure out if we have a complementary field pair */
3364             if (!FIELD_PICTURE(h) || h->picture_structure == last_pic_structure) {
3365                 /* Previous field is unmatched. Don't display it, but let it
3366                  * remain for reference if marked as such. */
3367                 if (!last_pic_droppable && last_pic_structure != PICT_FRAME) {
3368                     ff_thread_report_progress(&h0->cur_pic_ptr->tf, INT_MAX,
3369                                               last_pic_structure == PICT_TOP_FIELD);
3370                 }
3371             } else {
3372                 if (h0->cur_pic_ptr->frame_num != h->frame_num) {
3373                     /* This and previous field were reference, but had
3374                      * different frame_nums. Consider this field first in
3375                      * pair. Throw away previous field except for reference
3376                      * purposes. */
3377                     if (!last_pic_droppable && last_pic_structure != PICT_FRAME) {
3378                         ff_thread_report_progress(&h0->cur_pic_ptr->tf, INT_MAX,
3379                                                   last_pic_structure == PICT_TOP_FIELD);
3380                     }
3381                 } else {
3382                     /* Second field in complementary pair */
3383                     if (!((last_pic_structure   == PICT_TOP_FIELD &&
3384                            h->picture_structure == PICT_BOTTOM_FIELD) ||
3385                           (last_pic_structure   == PICT_BOTTOM_FIELD &&
3386                            h->picture_structure == PICT_TOP_FIELD))) {
3387                         av_log(h->avctx, AV_LOG_ERROR,
3388                                "Invalid field mode combination %d/%d\n",
3389                                last_pic_structure, h->picture_structure);
3390                         h->picture_structure = last_pic_structure;
3391                         h->droppable         = last_pic_droppable;
3392                         return AVERROR_INVALIDDATA;
3393                     } else if (last_pic_droppable != h->droppable) {
3394                         avpriv_request_sample(h->avctx,
3395                                               "Found reference and non-reference fields in the same frame, which");
3396                         h->picture_structure = last_pic_structure;
3397                         h->droppable         = last_pic_droppable;
3398                         return AVERROR_PATCHWELCOME;
3399                     }
3400                 }
3401             }
3402         }
3403
3404         while (h->frame_num != h->prev_frame_num &&
3405                h->frame_num != (h->prev_frame_num + 1) % (1 << h->sps.log2_max_frame_num)) {
3406             Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
3407             av_log(h->avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n",
3408                    h->frame_num, h->prev_frame_num);
3409             ret = h264_frame_start(h);
3410             if (ret < 0)
3411                 return ret;
3412             h->prev_frame_num++;
3413             h->prev_frame_num        %= 1 << h->sps.log2_max_frame_num;
3414             h->cur_pic_ptr->frame_num = h->prev_frame_num;
3415             ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 0);
3416             ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 1);
3417             ret = ff_generate_sliding_window_mmcos(h, 1);
3418             if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
3419                 return ret;
3420             ret = ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
3421             if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
3422                 return ret;
3423             /* Error concealment: If a ref is missing, copy the previous ref
3424              * in its place.
3425              * FIXME: Avoiding a memcpy would be nice, but ref handling makes
3426              * many assumptions about there being no actual duplicates.
3427              * FIXME: This does not copy padding for out-of-frame motion
3428              * vectors.  Given we are concealing a lost frame, this probably
3429              * is not noticeable by comparison, but it should be fixed. */
3430             if (h->short_ref_count) {
3431                 if (prev) {
3432                     av_image_copy(h->short_ref[0]->f.data,
3433                                   h->short_ref[0]->f.linesize,
3434                                   (const uint8_t **)prev->f.data,
3435                                   prev->f.linesize,
3436                                   h->avctx->pix_fmt,
3437                                   h->mb_width  * 16,
3438                                   h->mb_height * 16);
3439                     h->short_ref[0]->poc = prev->poc + 2;
3440                 }
3441                 h->short_ref[0]->frame_num = h->prev_frame_num;
3442             }
3443         }
3444
3445         /* See if we have a decoded first field looking for a pair...
3446          * We're using that to see whether to continue decoding in that
3447          * frame, or to allocate a new one. */
3448         if (h0->first_field) {
3449             assert(h0->cur_pic_ptr);
3450             assert(h0->cur_pic_ptr->f.data[0]);
3451             assert(h0->cur_pic_ptr->reference != DELAYED_PIC_REF);
3452
3453             /* figure out if we have a complementary field pair */
3454             if (!FIELD_PICTURE(h) || h->picture_structure == last_pic_structure) {
3455                 /* Previous field is unmatched. Don't display it, but let it
3456                  * remain for reference if marked as such. */
3457                 h0->cur_pic_ptr = NULL;
3458                 h0->first_field = FIELD_PICTURE(h);
3459             } else {
3460                 if (h0->cur_pic_ptr->frame_num != h->frame_num) {
3461                     /* This and the previous field had different frame_nums.
3462                      * Consider this field first in pair. Throw away previous
3463                      * one except for reference purposes. */
3464                     h0->first_field = 1;
3465                     h0->cur_pic_ptr = NULL;
3466                 } else {
3467                     /* Second field in complementary pair */
3468                     h0->first_field = 0;
3469                 }
3470             }
3471         } else {
3472             /* Frame or first field in a potentially complementary pair */
3473             h0->first_field = FIELD_PICTURE(h);
3474         }
3475
3476         if (!FIELD_PICTURE(h) || h0->first_field) {
3477             if (h264_frame_start(h) < 0) {
3478                 h0->first_field = 0;
3479                 return AVERROR_INVALIDDATA;
3480             }
3481         } else {
3482             release_unused_pictures(h, 0);
3483         }
3484     }
3485     if (h != h0 && (ret = clone_slice(h, h0)) < 0)
3486         return ret;
3487
3488     h->cur_pic_ptr->frame_num = h->frame_num; // FIXME frame_num cleanup
3489
3490     assert(h->mb_num == h->mb_width * h->mb_height);
3491     if (first_mb_in_slice << FIELD_OR_MBAFF_PICTURE(h) >= h->mb_num ||
3492         first_mb_in_slice >= h->mb_num) {
3493         av_log(h->avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n");
3494         return AVERROR_INVALIDDATA;
3495     }
3496     h->resync_mb_x = h->mb_x =  first_mb_in_slice % h->mb_width;
3497     h->resync_mb_y = h->mb_y = (first_mb_in_slice / h->mb_width) <<
3498                                FIELD_OR_MBAFF_PICTURE(h);
3499     if (h->picture_structure == PICT_BOTTOM_FIELD)
3500         h->resync_mb_y = h->mb_y = h->mb_y + 1;
3501     assert(h->mb_y < h->mb_height);
3502
3503     if (h->picture_structure == PICT_FRAME) {
3504         h->curr_pic_num = h->frame_num;
3505         h->max_pic_num  = 1 << h->sps.log2_max_frame_num;
3506     } else {
3507         h->curr_pic_num = 2 * h->frame_num + 1;
3508         h->max_pic_num  = 1 << (h->sps.log2_max_frame_num + 1);
3509     }
3510
3511     if (h->nal_unit_type == NAL_IDR_SLICE)
3512         get_ue_golomb(&h->gb); /* idr_pic_id */
3513
3514     if (h->sps.poc_type == 0) {
3515         h->poc_lsb = get_bits(&h->gb, h->sps.log2_max_poc_lsb);
3516
3517         if (h->pps.pic_order_present == 1 && h->picture_structure == PICT_FRAME)
3518             h->delta_poc_bottom = get_se_golomb(&h->gb);
3519     }
3520
3521     if (h->sps.poc_type == 1 && !h->sps.delta_pic_order_always_zero_flag) {
3522         h->delta_poc[0] = get_se_golomb(&h->gb);
3523
3524         if (h->pps.pic_order_present == 1 && h->picture_structure == PICT_FRAME)
3525             h->delta_poc[1] = get_se_golomb(&h->gb);
3526     }
3527
3528     ff_init_poc(h, h->cur_pic_ptr->field_poc, &h->cur_pic_ptr->poc);
3529
3530     if (h->pps.redundant_pic_cnt_present)
3531         h->redundant_pic_count = get_ue_golomb(&h->gb);
3532
3533     // set defaults, might be overridden a few lines later
3534     h->ref_count[0] = h->pps.ref_count[0];
3535     h->ref_count[1] = h->pps.ref_count[1];
3536
3537     if (h->slice_type_nos != AV_PICTURE_TYPE_I) {
3538         if (h->slice_type_nos == AV_PICTURE_TYPE_B)
3539             h->direct_spatial_mv_pred = get_bits1(&h->gb);
3540         num_ref_idx_active_override_flag = get_bits1(&h->gb);
3541
3542         if (num_ref_idx_active_override_flag) {
3543             h->ref_count[0] = get_ue_golomb(&h->gb) + 1;
3544             if (h->ref_count[0] < 1)
3545                 return AVERROR_INVALIDDATA;
3546             if (h->slice_type_nos == AV_PICTURE_TYPE_B) {
3547                 h->ref_count[1] = get_ue_golomb(&h->gb) + 1;
3548                 if (h->ref_count[1] < 1)
3549                     return AVERROR_INVALIDDATA;
3550             }
3551         }
3552
3553         if (h->slice_type_nos == AV_PICTURE_TYPE_B)
3554             h->list_count = 2;
3555         else
3556             h->list_count = 1;
3557     } else {
3558         h->list_count   = 0;
3559         h->ref_count[0] = h->ref_count[1] = 0;
3560     }
3561
3562     max_refs = h->picture_structure == PICT_FRAME ? 16 : 32;
3563
3564     if (h->ref_count[0] > max_refs || h->ref_count[1] > max_refs) {
3565         av_log(h->avctx, AV_LOG_ERROR, "reference overflow\n");
3566         h->ref_count[0] = h->ref_count[1] = 0;
3567         return AVERROR_INVALIDDATA;
3568     }
3569
3570     if (!default_ref_list_done)
3571         ff_h264_fill_default_ref_list(h);
3572
3573     if (h->slice_type_nos != AV_PICTURE_TYPE_I) {
3574        ret = ff_h264_decode_ref_pic_list_reordering(h);
3575        if (ret < 0) {
3576            h->ref_count[1] = h->ref_count[0] = 0;
3577            return ret;
3578        }
3579     }
3580
3581     if ((h->pps.weighted_pred && h->slice_type_nos == AV_PICTURE_TYPE_P) ||
3582         (h->pps.weighted_bipred_idc == 1 &&
3583          h->slice_type_nos == AV_PICTURE_TYPE_B))
3584         pred_weight_table(h);
3585     else if (h->pps.weighted_bipred_idc == 2 &&
3586              h->slice_type_nos == AV_PICTURE_TYPE_B) {
3587         implicit_weight_table(h, -1);
3588     } else {
3589         h->use_weight = 0;
3590         for (i = 0; i < 2; i++) {
3591             h->luma_weight_flag[i]   = 0;
3592             h->chroma_weight_flag[i] = 0;
3593         }
3594     }
3595
3596     // If frame-mt is enabled, only update mmco tables for the first slice
3597     // in a field. Subsequent slices can temporarily clobber h->mmco_index
3598     // or h->mmco, which will cause ref list mix-ups and decoding errors
3599     // further down the line. This may break decoding if the first slice is
3600     // corrupt, thus we only do this if frame-mt is enabled.
3601     if (h->nal_ref_idc) {
3602         ret = ff_h264_decode_ref_pic_marking(h0, &h->gb,
3603                                              !(h->avctx->active_thread_type & FF_THREAD_FRAME) ||
3604                                              h0->current_slice == 0);
3605         if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
3606             return AVERROR_INVALIDDATA;
3607     }
3608
3609     if (FRAME_MBAFF(h)) {
3610         ff_h264_fill_mbaff_ref_list(h);
3611
3612         if (h->pps.weighted_bipred_idc == 2 && h->slice_type_nos == AV_PICTURE_TYPE_B) {
3613             implicit_weight_table(h, 0);
3614             implicit_weight_table(h, 1);
3615         }
3616     }
3617
3618     if (h->slice_type_nos == AV_PICTURE_TYPE_B && !h->direct_spatial_mv_pred)
3619         ff_h264_direct_dist_scale_factor(h);
3620     ff_h264_direct_ref_list_init(h);
3621
3622     if (h->slice_type_nos != AV_PICTURE_TYPE_I && h->pps.cabac) {
3623         tmp = get_ue_golomb_31(&h->gb);
3624         if (tmp > 2) {
3625             av_log(h->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n");
3626             return AVERROR_INVALIDDATA;
3627         }
3628         h->cabac_init_idc = tmp;
3629     }
3630
3631     h->last_qscale_diff = 0;
3632     tmp = h->pps.init_qp + get_se_golomb(&h->gb);
3633     if (tmp > 51 + 6 * (h->sps.bit_depth_luma - 8)) {
3634         av_log(h->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp);
3635         return AVERROR_INVALIDDATA;
3636     }
3637     h->qscale       = tmp;
3638     h->chroma_qp[0] = get_chroma_qp(h, 0, h->qscale);
3639     h->chroma_qp[1] = get_chroma_qp(h, 1, h->qscale);
3640     // FIXME qscale / qp ... stuff
3641     if (h->slice_type == AV_PICTURE_TYPE_SP)
3642         get_bits1(&h->gb); /* sp_for_switch_flag */
3643     if (h->slice_type == AV_PICTURE_TYPE_SP ||
3644         h->slice_type == AV_PICTURE_TYPE_SI)
3645         get_se_golomb(&h->gb); /* slice_qs_delta */
3646
3647     h->deblocking_filter     = 1;
3648     h->slice_alpha_c0_offset = 52;
3649     h->slice_beta_offset     = 52;
3650     if (h->pps.deblocking_filter_parameters_present) {
3651         tmp = get_ue_golomb_31(&h->gb);
3652         if (tmp > 2) {
3653             av_log(h->avctx, AV_LOG_ERROR,
3654                    "deblocking_filter_idc %u out of range\n", tmp);
3655             return AVERROR_INVALIDDATA;
3656         }
3657         h->deblocking_filter = tmp;
3658         if (h->deblocking_filter < 2)
3659             h->deblocking_filter ^= 1;  // 1<->0
3660
3661         if (h->deblocking_filter) {
3662             h->slice_alpha_c0_offset += get_se_golomb(&h->gb) << 1;
3663             h->slice_beta_offset     += get_se_golomb(&h->gb) << 1;
3664             if (h->slice_alpha_c0_offset > 104U ||
3665                 h->slice_beta_offset     > 104U) {
3666                 av_log(h->avctx, AV_LOG_ERROR,
3667                        "deblocking filter parameters %d %d out of range\n",
3668                        h->slice_alpha_c0_offset, h->slice_beta_offset);
3669                 return AVERROR_INVALIDDATA;
3670             }
3671         }
3672     }
3673
3674     if (h->avctx->skip_loop_filter >= AVDISCARD_ALL ||
3675         (h->avctx->skip_loop_filter >= AVDISCARD_NONKEY &&
3676          h->slice_type_nos != AV_PICTURE_TYPE_I) ||
3677         (h->avctx->skip_loop_filter >= AVDISCARD_BIDIR  &&
3678          h->slice_type_nos == AV_PICTURE_TYPE_B) ||
3679         (h->avctx->skip_loop_filter >= AVDISCARD_NONREF &&
3680          h->nal_ref_idc == 0))
3681         h->deblocking_filter = 0;
3682
3683     if (h->deblocking_filter == 1 && h0->max_contexts > 1) {
3684         if (h->avctx->flags2 & CODEC_FLAG2_FAST) {
3685             /* Cheat slightly for speed:
3686              * Do not bother to deblock across slices. */
3687             h->deblocking_filter = 2;
3688         } else {
3689             h0->max_contexts = 1;
3690             if (!h0->single_decode_warning) {
3691                 av_log(h->avctx, AV_LOG_INFO,
3692                        "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n");
3693                 h0->single_decode_warning = 1;
3694             }
3695             if (h != h0) {
3696                 av_log(h->avctx, AV_LOG_ERROR,
3697                        "Deblocking switched inside frame.\n");
3698                 return 1;
3699             }
3700         }
3701     }
3702     h->qp_thresh = 15 + 52 -
3703                    FFMIN(h->slice_alpha_c0_offset, h->slice_beta_offset) -
3704                    FFMAX3(0,
3705                           h->pps.chroma_qp_index_offset[0],
3706                           h->pps.chroma_qp_index_offset[1]) +
3707                    6 * (h->sps.bit_depth_luma - 8);
3708
3709     h0->last_slice_type = slice_type;
3710     h->slice_num        = ++h0->current_slice;
3711     if (h->slice_num >= MAX_SLICES) {
3712         av_log(h->avctx, AV_LOG_ERROR,
3713                "Too many slices, increase MAX_SLICES and recompile\n");
3714     }
3715
3716     for (j = 0; j < 2; j++) {
3717         int id_list[16];
3718         int *ref2frm = h->ref2frm[h->slice_num & (MAX_SLICES - 1)][j];
3719         for (i = 0; i < 16; i++) {
3720             id_list[i] = 60;
3721             if (j < h->list_count && i < h->ref_count[j] &&
3722                 h->ref_list[j][i].f.buf[0]) {
3723                 int k;
3724                 AVBuffer *buf = h->ref_list[j][i].f.buf[0]->buffer;
3725                 for (k = 0; k < h->short_ref_count; k++)
3726                     if (h->short_ref[k]->f.buf[0]->buffer == buf) {
3727                         id_list[i] = k;
3728                         break;
3729                     }
3730                 for (k = 0; k < h->long_ref_count; k++)
3731                     if (h->long_ref[k] && h->long_ref[k]->f.buf[0]->buffer == buf) {
3732                         id_list[i] = h->short_ref_count + k;
3733                         break;
3734                     }
3735             }
3736         }
3737
3738         ref2frm[0] =
3739         ref2frm[1] = -1;
3740         for (i = 0; i < 16; i++)
3741             ref2frm[i + 2] = 4 * id_list[i] + (h->ref_list[j][i].reference & 3);
3742         ref2frm[18 + 0] =
3743         ref2frm[18 + 1] = -1;
3744         for (i = 16; i < 48; i++)
3745             ref2frm[i + 4] = 4 * id_list[(i - 16) >> 1] +
3746                              (h->ref_list[j][i].reference & 3);
3747     }
3748
3749     if (h->avctx->debug & FF_DEBUG_PICT_INFO) {
3750         av_log(h->avctx, AV_LOG_DEBUG,
3751                "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",
3752                h->slice_num,
3753                (h->picture_structure == PICT_FRAME ? "F" : h->picture_structure == PICT_TOP_FIELD ? "T" : "B"),
3754                first_mb_in_slice,
3755                av_get_picture_type_char(h->slice_type),
3756                h->slice_type_fixed ? " fix" : "",
3757                h->nal_unit_type == NAL_IDR_SLICE ? " IDR" : "",
3758                pps_id, h->frame_num,
3759                h->cur_pic_ptr->field_poc[0],
3760                h->cur_pic_ptr->field_poc[1],
3761                h->ref_count[0], h->ref_count[1],
3762                h->qscale,
3763                h->deblocking_filter,
3764                h->slice_alpha_c0_offset / 2 - 26, h->slice_beta_offset / 2 - 26,
3765                h->use_weight,
3766                h->use_weight == 1 && h->use_weight_chroma ? "c" : "",
3767                h->slice_type == AV_PICTURE_TYPE_B ? (h->direct_spatial_mv_pred ? "SPAT" : "TEMP") : "");
3768     }
3769
3770     return 0;
3771 }
3772
3773 int ff_h264_get_slice_type(const H264Context *h)
3774 {
3775     switch (h->slice_type) {
3776     case AV_PICTURE_TYPE_P:
3777         return 0;
3778     case AV_PICTURE_TYPE_B:
3779         return 1;
3780     case AV_PICTURE_TYPE_I:
3781         return 2;
3782     case AV_PICTURE_TYPE_SP:
3783         return 3;
3784     case AV_PICTURE_TYPE_SI:
3785         return 4;
3786     default:
3787         return AVERROR_INVALIDDATA;
3788     }
3789 }
3790
3791 static av_always_inline void fill_filter_caches_inter(H264Context *h,
3792                                                       int mb_type, int top_xy,
3793                                                       int left_xy[LEFT_MBS],
3794                                                       int top_type,
3795                                                       int left_type[LEFT_MBS],
3796                                                       int mb_xy, int list)
3797 {
3798     int b_stride = h->b_stride;
3799     int16_t(*mv_dst)[2] = &h->mv_cache[list][scan8[0]];
3800     int8_t *ref_cache = &h->ref_cache[list][scan8[0]];
3801     if (IS_INTER(mb_type) || IS_DIRECT(mb_type)) {
3802         if (USES_LIST(top_type, list)) {
3803             const int b_xy  = h->mb2b_xy[top_xy] + 3 * b_stride;
3804             const int b8_xy = 4 * top_xy + 2;
3805             int (*ref2frm)[64] = h->ref2frm[h->slice_table[top_xy] & (MAX_SLICES - 1)][0] + (MB_MBAFF(h) ? 20 : 2);
3806             AV_COPY128(mv_dst - 1 * 8, h->cur_pic.motion_val[list][b_xy + 0]);
3807             ref_cache[0 - 1 * 8] =
3808             ref_cache[1 - 1 * 8] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 0]];
3809             ref_cache[2 - 1 * 8] =
3810             ref_cache[3 - 1 * 8] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 1]];
3811         } else {
3812             AV_ZERO128(mv_dst - 1 * 8);
3813             AV_WN32A(&ref_cache[0 - 1 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
3814         }
3815
3816         if (!IS_INTERLACED(mb_type ^ left_type[LTOP])) {
3817             if (USES_LIST(left_type[LTOP], list)) {
3818                 const int b_xy  = h->mb2b_xy[left_xy[LTOP]] + 3;
3819                 const int b8_xy = 4 * left_xy[LTOP] + 1;
3820                 int (*ref2frm)[64] = h->ref2frm[h->slice_table[left_xy[LTOP]] & (MAX_SLICES - 1)][0] + (MB_MBAFF(h) ? 20 : 2);
3821                 AV_COPY32(mv_dst - 1 +  0, h->cur_pic.motion_val[list][b_xy + b_stride * 0]);
3822                 AV_COPY32(mv_dst - 1 +  8, h->cur_pic.motion_val[list][b_xy + b_stride * 1]);
3823                 AV_COPY32(mv_dst - 1 + 16, h->cur_pic.motion_val[list][b_xy + b_stride * 2]);
3824                 AV_COPY32(mv_dst - 1 + 24, h->cur_pic.motion_val[list][b_xy + b_stride * 3]);
3825                 ref_cache[-1 +  0] =
3826                 ref_cache[-1 +  8] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 2 * 0]];
3827                 ref_cache[-1 + 16] =
3828                 ref_cache[-1 + 24] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 2 * 1]];
3829             } else {
3830                 AV_ZERO32(mv_dst - 1 +  0);
3831                 AV_ZERO32(mv_dst - 1 +  8);
3832                 AV_ZERO32(mv_dst - 1 + 16);
3833                 AV_ZERO32(mv_dst - 1 + 24);
3834                 ref_cache[-1 +  0] =
3835                 ref_cache[-1 +  8] =
3836                 ref_cache[-1 + 16] =
3837                 ref_cache[-1 + 24] = LIST_NOT_USED;
3838             }
3839         }
3840     }
3841
3842     if (!USES_LIST(mb_type, list)) {
3843         fill_rectangle(mv_dst, 4, 4, 8, pack16to32(0, 0), 4);
3844         AV_WN32A(&ref_cache[0 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
3845         AV_WN32A(&ref_cache[1 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
3846         AV_WN32A(&ref_cache[2 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
3847         AV_WN32A(&ref_cache[3 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
3848         return;
3849     }
3850
3851     {
3852         int8_t *ref = &h->cur_pic.ref_index[list][4 * mb_xy];
3853         int (*ref2frm)[64] = h->ref2frm[h->slice_num & (MAX_SLICES - 1)][0] + (MB_MBAFF(h) ? 20 : 2);
3854         uint32_t ref01 = (pack16to32(ref2frm[list][ref[0]], ref2frm[list][ref[1]]) & 0x00FF00FF) * 0x0101;
3855         uint32_t ref23 = (pack16to32(ref2frm[list][ref[2]], ref2frm[list][ref[3]]) & 0x00FF00FF) * 0x0101;
3856         AV_WN32A(&ref_cache[0 * 8], ref01);
3857         AV_WN32A(&ref_cache[1 * 8], ref01);
3858         AV_WN32A(&ref_cache[2 * 8], ref23);
3859         AV_WN32A(&ref_cache[3 * 8], ref23);
3860     }
3861
3862     {
3863         int16_t(*mv_src)[2] = &h->cur_pic.motion_val[list][4 * h->mb_x + 4 * h->mb_y * b_stride];
3864         AV_COPY128(mv_dst + 8 * 0, mv_src + 0 * b_stride);
3865         AV_COPY128(mv_dst + 8 * 1, mv_src + 1 * b_stride);
3866         AV_COPY128(mv_dst + 8 * 2, mv_src + 2 * b_stride);
3867         AV_COPY128(mv_dst + 8 * 3, mv_src + 3 * b_stride);
3868     }
3869 }
3870
3871 /**
3872  *
3873  * @return non zero if the loop filter can be skipped
3874  */
3875 static int fill_filter_caches(H264Context *h, int mb_type)
3876 {
3877     const int mb_xy = h->mb_xy;
3878     int top_xy, left_xy[LEFT_MBS];
3879     int top_type, left_type[LEFT_MBS];
3880     uint8_t *nnz;
3881     uint8_t *nnz_cache;
3882
3883     top_xy = mb_xy - (h->mb_stride << MB_FIELD(h));
3884
3885     /* Wow, what a mess, why didn't they simplify the interlacing & intra
3886      * stuff, I can't imagine that these complex rules are worth it. */
3887
3888     left_xy[LBOT] = left_xy[LTOP] = mb_xy - 1;
3889     if (FRAME_MBAFF(h)) {
3890         const int left_mb_field_flag = IS_INTERLACED(h->cur_pic.mb_type[mb_xy - 1]);
3891         const int curr_mb_field_flag = IS_INTERLACED(mb_type);
3892         if (h->mb_y & 1) {
3893             if (left_mb_field_flag != curr_mb_field_flag)
3894                 left_xy[LTOP] -= h->mb_stride;
3895         } else {
3896             if (curr_mb_field_flag)
3897                 top_xy += h->mb_stride &
3898                           (((h->cur_pic.mb_type[top_xy] >> 7) & 1) - 1);
3899             if (left_mb_field_flag != curr_mb_field_flag)
3900                 left_xy[LBOT] += h->mb_stride;
3901         }
3902     }
3903
3904     h->top_mb_xy        = top_xy;
3905     h->left_mb_xy[LTOP] = left_xy[LTOP];
3906     h->left_mb_xy[LBOT] = left_xy[LBOT];
3907     {
3908         /* For sufficiently low qp, filtering wouldn't do anything.
3909          * This is a conservative estimate: could also check beta_offset
3910          * and more accurate chroma_qp. */
3911         int qp_thresh = h->qp_thresh; // FIXME strictly we should store qp_thresh for each mb of a slice
3912         int qp        = h->cur_pic.qscale_table[mb_xy];
3913         if (qp <= qp_thresh &&
3914             (left_xy[LTOP] < 0 ||
3915              ((qp + h->cur_pic.qscale_table[left_xy[LTOP]] + 1) >> 1) <= qp_thresh) &&
3916             (top_xy < 0 ||
3917              ((qp + h->cur_pic.qscale_table[top_xy] + 1) >> 1) <= qp_thresh)) {
3918             if (!FRAME_MBAFF(h))
3919                 return 1;
3920             if ((left_xy[LTOP] < 0 ||
3921                  ((qp + h->cur_pic.qscale_table[left_xy[LBOT]] + 1) >> 1) <= qp_thresh) &&
3922                 (top_xy < h->mb_stride ||
3923                  ((qp + h->cur_pic.qscale_table[top_xy - h->mb_stride] + 1) >> 1) <= qp_thresh))
3924                 return 1;
3925         }
3926     }
3927
3928     top_type        = h->cur_pic.mb_type[top_xy];
3929     left_type[LTOP] = h->cur_pic.mb_type[left_xy[LTOP]];
3930     left_type[LBOT] = h->cur_pic.mb_type[left_xy[LBOT]];
3931     if (h->deblocking_filter == 2) {
3932         if (h->slice_table[top_xy] != h->slice_num)
3933             top_type = 0;
3934         if (h->slice_table[left_xy[LBOT]] != h->slice_num)
3935             left_type[LTOP] = left_type[LBOT] = 0;
3936     } else {
3937         if (h->slice_table[top_xy] == 0xFFFF)
3938             top_type = 0;
3939         if (h->slice_table[left_xy[LBOT]] == 0xFFFF)
3940             left_type[LTOP] = left_type[LBOT] = 0;
3941     }
3942     h->top_type        = top_type;
3943     h->left_type[LTOP] = left_type[LTOP];
3944     h->left_type[LBOT] = left_type[LBOT];
3945
3946     if (IS_INTRA(mb_type))
3947         return 0;
3948
3949     fill_filter_caches_inter(h, mb_type, top_xy, left_xy,
3950                              top_type, left_type, mb_xy, 0);
3951     if (h->list_count == 2)
3952         fill_filter_caches_inter(h, mb_type, top_xy, left_xy,
3953                                  top_type, left_type, mb_xy, 1);
3954
3955     nnz       = h->non_zero_count[mb_xy];
3956     nnz_cache = h->non_zero_count_cache;
3957     AV_COPY32(&nnz_cache[4 + 8 * 1], &nnz[0]);
3958     AV_COPY32(&nnz_cache[4 + 8 * 2], &nnz[4]);
3959     AV_COPY32(&nnz_cache[4 + 8 * 3], &nnz[8]);
3960     AV_COPY32(&nnz_cache[4 + 8 * 4], &nnz[12]);
3961     h->cbp = h->cbp_table[mb_xy];
3962
3963     if (top_type) {
3964         nnz = h->non_zero_count[top_xy];
3965         AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[3 * 4]);
3966     }
3967
3968     if (left_type[LTOP]) {
3969         nnz = h->non_zero_count[left_xy[LTOP]];
3970         nnz_cache[3 + 8 * 1] = nnz[3 + 0 * 4];
3971         nnz_cache[3 + 8 * 2] = nnz[3 + 1 * 4];
3972         nnz_cache[3 + 8 * 3] = nnz[3 + 2 * 4];
3973         nnz_cache[3 + 8 * 4] = nnz[3 + 3 * 4];