2 * H.26L/H.264/AVC/JVT/14496-10/... decoder
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of Libav.
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.
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.
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
24 * H.264 / AVC / MPEG4 part10 codec.
25 * @author Michael Niedermayer <michaelni@gmx.at>
28 #include "libavutil/avassert.h"
29 #include "libavutil/imgutils.h"
30 #include "libavutil/timer.h"
33 #include "cabac_functions.h"
34 #include "error_resilience.h"
38 #include "h264chroma.h"
39 #include "h264_mvpred.h"
42 #include "mpegutils.h"
43 #include "rectangle.h"
47 static const uint8_t rem6
[QP_MAX_NUM
+ 1] = {
48 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
49 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
50 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
53 static const uint8_t div6
[QP_MAX_NUM
+ 1] = {
54 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
55 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
56 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
59 static const uint8_t field_scan
[16] = {
60 0 + 0 * 4, 0 + 1 * 4, 1 + 0 * 4, 0 + 2 * 4,
61 0 + 3 * 4, 1 + 1 * 4, 1 + 2 * 4, 1 + 3 * 4,
62 2 + 0 * 4, 2 + 1 * 4, 2 + 2 * 4, 2 + 3 * 4,
63 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4, 3 + 3 * 4,
66 static const uint8_t field_scan8x8
[64] = {
67 0 + 0 * 8, 0 + 1 * 8, 0 + 2 * 8, 1 + 0 * 8,
68 1 + 1 * 8, 0 + 3 * 8, 0 + 4 * 8, 1 + 2 * 8,
69 2 + 0 * 8, 1 + 3 * 8, 0 + 5 * 8, 0 + 6 * 8,
70 0 + 7 * 8, 1 + 4 * 8, 2 + 1 * 8, 3 + 0 * 8,
71 2 + 2 * 8, 1 + 5 * 8, 1 + 6 * 8, 1 + 7 * 8,
72 2 + 3 * 8, 3 + 1 * 8, 4 + 0 * 8, 3 + 2 * 8,
73 2 + 4 * 8, 2 + 5 * 8, 2 + 6 * 8, 2 + 7 * 8,
74 3 + 3 * 8, 4 + 1 * 8, 5 + 0 * 8, 4 + 2 * 8,
75 3 + 4 * 8, 3 + 5 * 8, 3 + 6 * 8, 3 + 7 * 8,
76 4 + 3 * 8, 5 + 1 * 8, 6 + 0 * 8, 5 + 2 * 8,
77 4 + 4 * 8, 4 + 5 * 8, 4 + 6 * 8, 4 + 7 * 8,
78 5 + 3 * 8, 6 + 1 * 8, 6 + 2 * 8, 5 + 4 * 8,
79 5 + 5 * 8, 5 + 6 * 8, 5 + 7 * 8, 6 + 3 * 8,
80 7 + 0 * 8, 7 + 1 * 8, 6 + 4 * 8, 6 + 5 * 8,
81 6 + 6 * 8, 6 + 7 * 8, 7 + 2 * 8, 7 + 3 * 8,
82 7 + 4 * 8, 7 + 5 * 8, 7 + 6 * 8, 7 + 7 * 8,
85 static const uint8_t field_scan8x8_cavlc
[64] = {
86 0 + 0 * 8, 1 + 1 * 8, 2 + 0 * 8, 0 + 7 * 8,
87 2 + 2 * 8, 2 + 3 * 8, 2 + 4 * 8, 3 + 3 * 8,
88 3 + 4 * 8, 4 + 3 * 8, 4 + 4 * 8, 5 + 3 * 8,
89 5 + 5 * 8, 7 + 0 * 8, 6 + 6 * 8, 7 + 4 * 8,
90 0 + 1 * 8, 0 + 3 * 8, 1 + 3 * 8, 1 + 4 * 8,
91 1 + 5 * 8, 3 + 1 * 8, 2 + 5 * 8, 4 + 1 * 8,
92 3 + 5 * 8, 5 + 1 * 8, 4 + 5 * 8, 6 + 1 * 8,
93 5 + 6 * 8, 7 + 1 * 8, 6 + 7 * 8, 7 + 5 * 8,
94 0 + 2 * 8, 0 + 4 * 8, 0 + 5 * 8, 2 + 1 * 8,
95 1 + 6 * 8, 4 + 0 * 8, 2 + 6 * 8, 5 + 0 * 8,
96 3 + 6 * 8, 6 + 0 * 8, 4 + 6 * 8, 6 + 2 * 8,
97 5 + 7 * 8, 6 + 4 * 8, 7 + 2 * 8, 7 + 6 * 8,
98 1 + 0 * 8, 1 + 2 * 8, 0 + 6 * 8, 3 + 0 * 8,
99 1 + 7 * 8, 3 + 2 * 8, 2 + 7 * 8, 4 + 2 * 8,
100 3 + 7 * 8, 5 + 2 * 8, 4 + 7 * 8, 5 + 4 * 8,
101 6 + 3 * 8, 6 + 5 * 8, 7 + 3 * 8, 7 + 7 * 8,
104 // zigzag_scan8x8_cavlc[i] = zigzag_scan8x8[(i/4) + 16*(i%4)]
105 static const uint8_t zigzag_scan8x8_cavlc
[64] = {
106 0 + 0 * 8, 1 + 1 * 8, 1 + 2 * 8, 2 + 2 * 8,
107 4 + 1 * 8, 0 + 5 * 8, 3 + 3 * 8, 7 + 0 * 8,
108 3 + 4 * 8, 1 + 7 * 8, 5 + 3 * 8, 6 + 3 * 8,
109 2 + 7 * 8, 6 + 4 * 8, 5 + 6 * 8, 7 + 5 * 8,
110 1 + 0 * 8, 2 + 0 * 8, 0 + 3 * 8, 3 + 1 * 8,
111 3 + 2 * 8, 0 + 6 * 8, 4 + 2 * 8, 6 + 1 * 8,
112 2 + 5 * 8, 2 + 6 * 8, 6 + 2 * 8, 5 + 4 * 8,
113 3 + 7 * 8, 7 + 3 * 8, 4 + 7 * 8, 7 + 6 * 8,
114 0 + 1 * 8, 3 + 0 * 8, 0 + 4 * 8, 4 + 0 * 8,
115 2 + 3 * 8, 1 + 5 * 8, 5 + 1 * 8, 5 + 2 * 8,
116 1 + 6 * 8, 3 + 5 * 8, 7 + 1 * 8, 4 + 5 * 8,
117 4 + 6 * 8, 7 + 4 * 8, 5 + 7 * 8, 6 + 7 * 8,
118 0 + 2 * 8, 2 + 1 * 8, 1 + 3 * 8, 5 + 0 * 8,
119 1 + 4 * 8, 2 + 4 * 8, 6 + 0 * 8, 4 + 3 * 8,
120 0 + 7 * 8, 4 + 4 * 8, 7 + 2 * 8, 3 + 6 * 8,
121 5 + 5 * 8, 6 + 5 * 8, 6 + 6 * 8, 7 + 7 * 8,
124 static const uint8_t dequant4_coeff_init
[6][3] = {
133 static const uint8_t dequant8_coeff_init_scan
[16] = {
134 0, 3, 4, 3, 3, 1, 5, 1, 4, 5, 2, 5, 3, 1, 5, 1
137 static const uint8_t dequant8_coeff_init
[6][6] = {
138 { 20, 18, 32, 19, 25, 24 },
139 { 22, 19, 35, 21, 28, 26 },
140 { 26, 23, 42, 24, 33, 31 },
141 { 28, 25, 45, 26, 35, 33 },
142 { 32, 28, 51, 30, 40, 38 },
143 { 36, 32, 58, 34, 46, 43 },
147 static void release_unused_pictures(H264Context
*h
, int remove_current
)
151 /* release non reference frames */
152 for (i
= 0; i
< H264_MAX_PICTURE_COUNT
; i
++) {
153 if (h
->DPB
[i
].f
->buf
[0] && !h
->DPB
[i
].reference
&&
154 (remove_current
|| &h
->DPB
[i
] != h
->cur_pic_ptr
)) {
155 ff_h264_unref_picture(h
, &h
->DPB
[i
]);
160 static int alloc_scratch_buffers(H264SliceContext
*sl
, int linesize
)
162 const H264Context
*h
= sl
->h264
;
163 int alloc_size
= FFALIGN(FFABS(linesize
) + 32, 32);
165 av_fast_malloc(&sl
->bipred_scratchpad
, &sl
->bipred_scratchpad_allocated
, 16 * 6 * alloc_size
);
166 // edge emu needs blocksize + filter length - 1
167 // (= 21x21 for h264)
168 av_fast_malloc(&sl
->edge_emu_buffer
, &sl
->edge_emu_buffer_allocated
, alloc_size
* 2 * 21);
170 av_fast_malloc(&sl
->top_borders
[0], &sl
->top_borders_allocated
[0],
171 h
->mb_width
* 16 * 3 * sizeof(uint8_t) * 2);
172 av_fast_malloc(&sl
->top_borders
[1], &sl
->top_borders_allocated
[1],
173 h
->mb_width
* 16 * 3 * sizeof(uint8_t) * 2);
175 if (!sl
->bipred_scratchpad
|| !sl
->edge_emu_buffer
||
176 !sl
->top_borders
[0] || !sl
->top_borders
[1]) {
177 av_freep(&sl
->bipred_scratchpad
);
178 av_freep(&sl
->edge_emu_buffer
);
179 av_freep(&sl
->top_borders
[0]);
180 av_freep(&sl
->top_borders
[1]);
182 sl
->bipred_scratchpad_allocated
= 0;
183 sl
->edge_emu_buffer_allocated
= 0;
184 sl
->top_borders_allocated
[0] = 0;
185 sl
->top_borders_allocated
[1] = 0;
186 return AVERROR(ENOMEM
);
192 static int init_table_pools(H264Context
*h
)
194 const int big_mb_num
= h
->mb_stride
* (h
->mb_height
+ 1) + 1;
195 const int mb_array_size
= h
->mb_stride
* h
->mb_height
;
196 const int b4_stride
= h
->mb_width
* 4 + 1;
197 const int b4_array_size
= b4_stride
* h
->mb_height
* 4;
199 h
->qscale_table_pool
= av_buffer_pool_init(big_mb_num
+ h
->mb_stride
,
201 h
->mb_type_pool
= av_buffer_pool_init((big_mb_num
+ h
->mb_stride
) *
202 sizeof(uint32_t), av_buffer_allocz
);
203 h
->motion_val_pool
= av_buffer_pool_init(2 * (b4_array_size
+ 4) *
204 sizeof(int16_t), av_buffer_allocz
);
205 h
->ref_index_pool
= av_buffer_pool_init(4 * mb_array_size
, av_buffer_allocz
);
207 if (!h
->qscale_table_pool
|| !h
->mb_type_pool
|| !h
->motion_val_pool
||
208 !h
->ref_index_pool
) {
209 av_buffer_pool_uninit(&h
->qscale_table_pool
);
210 av_buffer_pool_uninit(&h
->mb_type_pool
);
211 av_buffer_pool_uninit(&h
->motion_val_pool
);
212 av_buffer_pool_uninit(&h
->ref_index_pool
);
213 return AVERROR(ENOMEM
);
219 static int alloc_picture(H264Context
*h
, H264Picture
*pic
)
223 av_assert0(!pic
->f
->data
[0]);
226 ret
= ff_thread_get_buffer(h
->avctx
, &pic
->tf
, pic
->reference ?
227 AV_GET_BUFFER_FLAG_REF
: 0);
231 if (h
->avctx
->hwaccel
) {
232 const AVHWAccel
*hwaccel
= h
->avctx
->hwaccel
;
233 av_assert0(!pic
->hwaccel_picture_private
);
234 if (hwaccel
->frame_priv_data_size
) {
235 pic
->hwaccel_priv_buf
= av_buffer_allocz(hwaccel
->frame_priv_data_size
);
236 if (!pic
->hwaccel_priv_buf
)
237 return AVERROR(ENOMEM
);
238 pic
->hwaccel_picture_private
= pic
->hwaccel_priv_buf
->data
;
242 if (!h
->qscale_table_pool
) {
243 ret
= init_table_pools(h
);
248 pic
->qscale_table_buf
= av_buffer_pool_get(h
->qscale_table_pool
);
249 pic
->mb_type_buf
= av_buffer_pool_get(h
->mb_type_pool
);
250 if (!pic
->qscale_table_buf
|| !pic
->mb_type_buf
)
253 pic
->mb_type
= (uint32_t*)pic
->mb_type_buf
->data
+ 2 * h
->mb_stride
+ 1;
254 pic
->qscale_table
= pic
->qscale_table_buf
->data
+ 2 * h
->mb_stride
+ 1;
256 for (i
= 0; i
< 2; i
++) {
257 pic
->motion_val_buf
[i
] = av_buffer_pool_get(h
->motion_val_pool
);
258 pic
->ref_index_buf
[i
] = av_buffer_pool_get(h
->ref_index_pool
);
259 if (!pic
->motion_val_buf
[i
] || !pic
->ref_index_buf
[i
])
262 pic
->motion_val
[i
] = (int16_t (*)[2])pic
->motion_val_buf
[i
]->data
+ 4;
263 pic
->ref_index
[i
] = pic
->ref_index_buf
[i
]->data
;
268 ff_h264_unref_picture(h
, pic
);
269 return (ret
< 0) ? ret
: AVERROR(ENOMEM
);
272 static inline int pic_is_unused(H264Context
*h
, H264Picture
*pic
)
279 static int find_unused_picture(H264Context
*h
)
283 for (i
= 0; i
< H264_MAX_PICTURE_COUNT
; i
++) {
284 if (pic_is_unused(h
, &h
->DPB
[i
]))
287 if (i
== H264_MAX_PICTURE_COUNT
)
288 return AVERROR_INVALIDDATA
;
294 static void init_dequant8_coeff_table(H264Context
*h
)
297 const int max_qp
= 51 + 6 * (h
->sps
.bit_depth_luma
- 8);
299 for (i
= 0; i
< 6; i
++) {
300 h
->dequant8_coeff
[i
] = h
->dequant8_buffer
[i
];
301 for (j
= 0; j
< i
; j
++)
302 if (!memcmp(h
->pps
.scaling_matrix8
[j
], h
->pps
.scaling_matrix8
[i
],
303 64 * sizeof(uint8_t))) {
304 h
->dequant8_coeff
[i
] = h
->dequant8_buffer
[j
];
310 for (q
= 0; q
< max_qp
+ 1; q
++) {
313 for (x
= 0; x
< 64; x
++)
314 h
->dequant8_coeff
[i
][q
][(x
>> 3) | ((x
& 7) << 3)] =
315 ((uint32_t)dequant8_coeff_init
[idx
][dequant8_coeff_init_scan
[((x
>> 1) & 12) | (x
& 3)]] *
316 h
->pps
.scaling_matrix8
[i
][x
]) << shift
;
321 static void init_dequant4_coeff_table(H264Context
*h
)
324 const int max_qp
= 51 + 6 * (h
->sps
.bit_depth_luma
- 8);
325 for (i
= 0; i
< 6; i
++) {
326 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[i
];
327 for (j
= 0; j
< i
; j
++)
328 if (!memcmp(h
->pps
.scaling_matrix4
[j
], h
->pps
.scaling_matrix4
[i
],
329 16 * sizeof(uint8_t))) {
330 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[j
];
336 for (q
= 0; q
< max_qp
+ 1; q
++) {
337 int shift
= div6
[q
] + 2;
339 for (x
= 0; x
< 16; x
++)
340 h
->dequant4_coeff
[i
][q
][(x
>> 2) | ((x
<< 2) & 0xF)] =
341 ((uint32_t)dequant4_coeff_init
[idx
][(x
& 1) + ((x
>> 2) & 1)] *
342 h
->pps
.scaling_matrix4
[i
][x
]) << shift
;
347 void h264_init_dequant_tables(H264Context
*h
)
350 init_dequant4_coeff_table(h
);
351 if (h
->pps
.transform_8x8_mode
)
352 init_dequant8_coeff_table(h
);
353 if (h
->sps
.transform_bypass
) {
354 for (i
= 0; i
< 6; i
++)
355 for (x
= 0; x
< 16; x
++)
356 h
->dequant4_coeff
[i
][0][x
] = 1 << 6;
357 if (h
->pps
.transform_8x8_mode
)
358 for (i
= 0; i
< 6; i
++)
359 for (x
= 0; x
< 64; x
++)
360 h
->dequant8_coeff
[i
][0][x
] = 1 << 6;
364 #define IN_RANGE(a, b, size) (((a) >= (b)) && ((a) < ((b) + (size))))
366 #define REBASE_PICTURE(pic, new_ctx, old_ctx) \
367 ((pic && pic >= old_ctx->DPB && \
368 pic < old_ctx->DPB + H264_MAX_PICTURE_COUNT) ? \
369 &new_ctx->DPB[pic - old_ctx->DPB] : NULL)
371 static void copy_picture_range(H264Picture
**to
, H264Picture
**from
, int count
,
372 H264Context
*new_base
,
373 H264Context
*old_base
)
377 for (i
= 0; i
< count
; i
++) {
378 assert((IN_RANGE(from
[i
], old_base
, sizeof(*old_base
)) ||
379 IN_RANGE(from
[i
], old_base
->DPB
,
380 sizeof(H264Picture
) * H264_MAX_PICTURE_COUNT
) ||
382 to
[i
] = REBASE_PICTURE(from
[i
], new_base
, old_base
);
386 static int copy_parameter_set(void **to
, void **from
, int count
, int size
)
390 for (i
= 0; i
< count
; i
++) {
391 if (to
[i
] && !from
[i
]) {
393 } else if (from
[i
] && !to
[i
]) {
394 to
[i
] = av_malloc(size
);
396 return AVERROR(ENOMEM
);
400 memcpy(to
[i
], from
[i
], size
);
406 #define copy_fields(to, from, start_field, end_field) \
407 memcpy(&to->start_field, &from->start_field, \
408 (char *)&to->end_field - (char *)&to->start_field)
410 static int h264_slice_header_init(H264Context
*h
);
412 int ff_h264_update_thread_context(AVCodecContext
*dst
,
413 const AVCodecContext
*src
)
415 H264Context
*h
= dst
->priv_data
, *h1
= src
->priv_data
;
416 int inited
= h
->context_initialized
, err
= 0;
420 if (dst
== src
|| !h1
->context_initialized
)
424 (h
->width
!= h1
->width
||
425 h
->height
!= h1
->height
||
426 h
->mb_width
!= h1
->mb_width
||
427 h
->mb_height
!= h1
->mb_height
||
428 h
->sps
.bit_depth_luma
!= h1
->sps
.bit_depth_luma
||
429 h
->sps
.chroma_format_idc
!= h1
->sps
.chroma_format_idc
||
430 h
->sps
.colorspace
!= h1
->sps
.colorspace
)) {
435 if ((ret
= copy_parameter_set((void **)h
->sps_buffers
,
436 (void **)h1
->sps_buffers
,
437 MAX_SPS_COUNT
, sizeof(SPS
))) < 0)
440 if ((ret
= copy_parameter_set((void **)h
->pps_buffers
,
441 (void **)h1
->pps_buffers
,
442 MAX_PPS_COUNT
, sizeof(PPS
))) < 0)
446 if (need_reinit
|| !inited
) {
447 h
->width
= h1
->width
;
448 h
->height
= h1
->height
;
449 h
->mb_height
= h1
->mb_height
;
450 h
->mb_width
= h1
->mb_width
;
451 h
->mb_num
= h1
->mb_num
;
452 h
->mb_stride
= h1
->mb_stride
;
453 h
->b_stride
= h1
->b_stride
;
455 if ((err
= h264_slice_header_init(h
)) < 0) {
456 av_log(h
->avctx
, AV_LOG_ERROR
, "h264_slice_header_init() failed");
460 /* copy block_offset since frame_start may not be called */
461 memcpy(h
->block_offset
, h1
->block_offset
, sizeof(h
->block_offset
));
464 h
->avctx
->coded_height
= h1
->avctx
->coded_height
;
465 h
->avctx
->coded_width
= h1
->avctx
->coded_width
;
466 h
->avctx
->width
= h1
->avctx
->width
;
467 h
->avctx
->height
= h1
->avctx
->height
;
468 h
->coded_picture_number
= h1
->coded_picture_number
;
469 h
->first_field
= h1
->first_field
;
470 h
->picture_structure
= h1
->picture_structure
;
471 h
->droppable
= h1
->droppable
;
472 h
->low_delay
= h1
->low_delay
;
474 for (i
= 0; i
< H264_MAX_PICTURE_COUNT
; i
++) {
475 ff_h264_unref_picture(h
, &h
->DPB
[i
]);
476 if (h1
->DPB
[i
].f
->buf
[0] &&
477 (ret
= ff_h264_ref_picture(h
, &h
->DPB
[i
], &h1
->DPB
[i
])) < 0)
481 h
->cur_pic_ptr
= REBASE_PICTURE(h1
->cur_pic_ptr
, h
, h1
);
482 ff_h264_unref_picture(h
, &h
->cur_pic
);
483 if (h1
->cur_pic
.f
->buf
[0]) {
484 ret
= ff_h264_ref_picture(h
, &h
->cur_pic
, &h1
->cur_pic
);
489 h
->enable_er
= h1
->enable_er
;
490 h
->workaround_bugs
= h1
->workaround_bugs
;
491 h
->low_delay
= h1
->low_delay
;
492 h
->droppable
= h1
->droppable
;
494 // extradata/NAL handling
495 h
->is_avc
= h1
->is_avc
;
496 h
->nal_length_size
= h1
->nal_length_size
;
498 // Dequantization matrices
499 // FIXME these are big - can they be only copied when PPS changes?
500 copy_fields(h
, h1
, dequant4_buffer
, dequant4_coeff
);
502 for (i
= 0; i
< 6; i
++)
503 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[0] +
504 (h1
->dequant4_coeff
[i
] - h1
->dequant4_buffer
[0]);
506 for (i
= 0; i
< 6; i
++)
507 h
->dequant8_coeff
[i
] = h
->dequant8_buffer
[0] +
508 (h1
->dequant8_coeff
[i
] - h1
->dequant8_buffer
[0]);
510 h
->dequant_coeff_pps
= h1
->dequant_coeff_pps
;
513 copy_fields(h
, h1
, poc_lsb
, default_ref_list
);
516 copy_fields(h
, h1
, short_ref
, current_slice
);
518 copy_picture_range(h
->short_ref
, h1
->short_ref
, 32, h
, h1
);
519 copy_picture_range(h
->long_ref
, h1
->long_ref
, 32, h
, h1
);
520 copy_picture_range(h
->delayed_pic
, h1
->delayed_pic
,
521 MAX_DELAYED_PIC_COUNT
+ 2, h
, h1
);
523 h
->last_slice_type
= h1
->last_slice_type
;
529 err
= ff_h264_execute_ref_pic_marking(h
, h
->mmco
, h
->mmco_index
);
530 h
->prev_poc_msb
= h
->poc_msb
;
531 h
->prev_poc_lsb
= h
->poc_lsb
;
533 h
->prev_frame_num_offset
= h
->frame_num_offset
;
534 h
->prev_frame_num
= h
->frame_num
;
536 h
->recovery_frame
= h1
->recovery_frame
;
537 h
->frame_recovered
= h1
->frame_recovered
;
542 static int h264_frame_start(H264Context
*h
)
546 const int pixel_shift
= h
->pixel_shift
;
548 release_unused_pictures(h
, 1);
549 h
->cur_pic_ptr
= NULL
;
551 i
= find_unused_picture(h
);
553 av_log(h
->avctx
, AV_LOG_ERROR
, "no frame buffer available\n");
558 pic
->reference
= h
->droppable ?
0 : h
->picture_structure
;
559 pic
->f
->coded_picture_number
= h
->coded_picture_number
++;
560 pic
->field_picture
= h
->picture_structure
!= PICT_FRAME
;
562 * Zero key_frame here; IDR markings per slice in frame or fields are ORed
564 * See decode_nal_units().
566 pic
->f
->key_frame
= 0;
570 if ((ret
= alloc_picture(h
, pic
)) < 0)
573 h
->cur_pic_ptr
= pic
;
574 ff_h264_unref_picture(h
, &h
->cur_pic
);
575 if ((ret
= ff_h264_ref_picture(h
, &h
->cur_pic
, h
->cur_pic_ptr
)) < 0)
578 if (CONFIG_ERROR_RESILIENCE
&& h
->enable_er
)
579 ff_er_frame_start(&h
->slice_ctx
[0].er
);
581 for (i
= 0; i
< 16; i
++) {
582 h
->block_offset
[i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7) << pixel_shift
) + 4 * pic
->f
->linesize
[0] * ((scan8
[i
] - scan8
[0]) >> 3);
583 h
->block_offset
[48 + i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7) << pixel_shift
) + 8 * pic
->f
->linesize
[0] * ((scan8
[i
] - scan8
[0]) >> 3);
585 for (i
= 0; i
< 16; i
++) {
586 h
->block_offset
[16 + i
] =
587 h
->block_offset
[32 + i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7) << pixel_shift
) + 4 * pic
->f
->linesize
[1] * ((scan8
[i
] - scan8
[0]) >> 3);
588 h
->block_offset
[48 + 16 + i
] =
589 h
->block_offset
[48 + 32 + i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7) << pixel_shift
) + 8 * pic
->f
->linesize
[1] * ((scan8
[i
] - scan8
[0]) >> 3);
592 /* Some macroblocks can be accessed before they're available in case
593 * of lost slices, MBAFF or threading. */
594 memset(h
->slice_table
, -1,
595 (h
->mb_height
* h
->mb_stride
- 1) * sizeof(*h
->slice_table
));
597 /* We mark the current picture as non-reference after allocating it, so
598 * that if we break out due to an error it can be released automatically
599 * in the next ff_mpv_frame_start().
601 h
->cur_pic_ptr
->reference
= 0;
603 h
->cur_pic_ptr
->field_poc
[0] = h
->cur_pic_ptr
->field_poc
[1] = INT_MAX
;
605 h
->next_output_pic
= NULL
;
607 assert(h
->cur_pic_ptr
->long_ref
== 0);
612 static av_always_inline
void backup_mb_border(const H264Context
*h
, H264SliceContext
*sl
,
614 uint8_t *src_cb
, uint8_t *src_cr
,
615 int linesize
, int uvlinesize
,
620 const int pixel_shift
= h
->pixel_shift
;
621 int chroma444
= CHROMA444(h
);
622 int chroma422
= CHROMA422(h
);
625 src_cb
-= uvlinesize
;
626 src_cr
-= uvlinesize
;
628 if (!simple
&& FRAME_MBAFF(h
)) {
631 top_border
= sl
->top_borders
[0][sl
->mb_x
];
632 AV_COPY128(top_border
, src_y
+ 15 * linesize
);
634 AV_COPY128(top_border
+ 16, src_y
+ 15 * linesize
+ 16);
635 if (simple
|| !CONFIG_GRAY
|| !(h
->flags
& CODEC_FLAG_GRAY
)) {
638 AV_COPY128(top_border
+ 32, src_cb
+ 15 * uvlinesize
);
639 AV_COPY128(top_border
+ 48, src_cb
+ 15 * uvlinesize
+ 16);
640 AV_COPY128(top_border
+ 64, src_cr
+ 15 * uvlinesize
);
641 AV_COPY128(top_border
+ 80, src_cr
+ 15 * uvlinesize
+ 16);
643 AV_COPY128(top_border
+ 16, src_cb
+ 15 * uvlinesize
);
644 AV_COPY128(top_border
+ 32, src_cr
+ 15 * uvlinesize
);
646 } else if (chroma422
) {
648 AV_COPY128(top_border
+ 32, src_cb
+ 15 * uvlinesize
);
649 AV_COPY128(top_border
+ 48, src_cr
+ 15 * uvlinesize
);
651 AV_COPY64(top_border
+ 16, src_cb
+ 15 * uvlinesize
);
652 AV_COPY64(top_border
+ 24, src_cr
+ 15 * uvlinesize
);
656 AV_COPY128(top_border
+ 32, src_cb
+ 7 * uvlinesize
);
657 AV_COPY128(top_border
+ 48, src_cr
+ 7 * uvlinesize
);
659 AV_COPY64(top_border
+ 16, src_cb
+ 7 * uvlinesize
);
660 AV_COPY64(top_border
+ 24, src_cr
+ 7 * uvlinesize
);
665 } else if (MB_MBAFF(sl
)) {
671 top_border
= sl
->top_borders
[top_idx
][sl
->mb_x
];
672 /* There are two lines saved, the line above the top macroblock
673 * of a pair, and the line above the bottom macroblock. */
674 AV_COPY128(top_border
, src_y
+ 16 * linesize
);
676 AV_COPY128(top_border
+ 16, src_y
+ 16 * linesize
+ 16);
678 if (simple
|| !CONFIG_GRAY
|| !(h
->flags
& CODEC_FLAG_GRAY
)) {
681 AV_COPY128(top_border
+ 32, src_cb
+ 16 * linesize
);
682 AV_COPY128(top_border
+ 48, src_cb
+ 16 * linesize
+ 16);
683 AV_COPY128(top_border
+ 64, src_cr
+ 16 * linesize
);
684 AV_COPY128(top_border
+ 80, src_cr
+ 16 * linesize
+ 16);
686 AV_COPY128(top_border
+ 16, src_cb
+ 16 * linesize
);
687 AV_COPY128(top_border
+ 32, src_cr
+ 16 * linesize
);
689 } else if (chroma422
) {
691 AV_COPY128(top_border
+ 32, src_cb
+ 16 * uvlinesize
);
692 AV_COPY128(top_border
+ 48, src_cr
+ 16 * uvlinesize
);
694 AV_COPY64(top_border
+ 16, src_cb
+ 16 * uvlinesize
);
695 AV_COPY64(top_border
+ 24, src_cr
+ 16 * uvlinesize
);
699 AV_COPY128(top_border
+ 32, src_cb
+ 8 * uvlinesize
);
700 AV_COPY128(top_border
+ 48, src_cr
+ 8 * uvlinesize
);
702 AV_COPY64(top_border
+ 16, src_cb
+ 8 * uvlinesize
);
703 AV_COPY64(top_border
+ 24, src_cr
+ 8 * uvlinesize
);
710 * Initialize implicit_weight table.
711 * @param field 0/1 initialize the weight for interlaced MBAFF
712 * -1 initializes the rest
714 static void implicit_weight_table(const H264Context
*h
, H264SliceContext
*sl
, int field
)
716 int ref0
, ref1
, i
, cur_poc
, ref_start
, ref_count0
, ref_count1
;
718 for (i
= 0; i
< 2; i
++) {
719 sl
->luma_weight_flag
[i
] = 0;
720 sl
->chroma_weight_flag
[i
] = 0;
724 if (h
->picture_structure
== PICT_FRAME
) {
725 cur_poc
= h
->cur_pic_ptr
->poc
;
727 cur_poc
= h
->cur_pic_ptr
->field_poc
[h
->picture_structure
- 1];
729 if (sl
->ref_count
[0] == 1 && sl
->ref_count
[1] == 1 && !FRAME_MBAFF(h
) &&
730 sl
->ref_list
[0][0].poc
+ sl
->ref_list
[1][0].poc
== 2 * cur_poc
) {
732 sl
->use_weight_chroma
= 0;
736 ref_count0
= sl
->ref_count
[0];
737 ref_count1
= sl
->ref_count
[1];
739 cur_poc
= h
->cur_pic_ptr
->field_poc
[field
];
741 ref_count0
= 16 + 2 * sl
->ref_count
[0];
742 ref_count1
= 16 + 2 * sl
->ref_count
[1];
746 sl
->use_weight_chroma
= 2;
747 sl
->luma_log2_weight_denom
= 5;
748 sl
->chroma_log2_weight_denom
= 5;
750 for (ref0
= ref_start
; ref0
< ref_count0
; ref0
++) {
751 int poc0
= sl
->ref_list
[0][ref0
].poc
;
752 for (ref1
= ref_start
; ref1
< ref_count1
; ref1
++) {
754 if (!sl
->ref_list
[0][ref0
].parent
->long_ref
&& !sl
->ref_list
[1][ref1
].parent
->long_ref
) {
755 int poc1
= sl
->ref_list
[1][ref1
].poc
;
756 int td
= av_clip_int8(poc1
- poc0
);
758 int tb
= av_clip_int8(cur_poc
- poc0
);
759 int tx
= (16384 + (FFABS(td
) >> 1)) / td
;
760 int dist_scale_factor
= (tb
* tx
+ 32) >> 8;
761 if (dist_scale_factor
>= -64 && dist_scale_factor
<= 128)
762 w
= 64 - dist_scale_factor
;
766 sl
->implicit_weight
[ref0
][ref1
][0] =
767 sl
->implicit_weight
[ref0
][ref1
][1] = w
;
769 sl
->implicit_weight
[ref0
][ref1
][field
] = w
;
776 * initialize scan tables
778 static void init_scan_tables(H264Context
*h
)
781 for (i
= 0; i
< 16; i
++) {
782 #define TRANSPOSE(x) (x >> 2) | ((x << 2) & 0xF)
783 h
->zigzag_scan
[i
] = TRANSPOSE(zigzag_scan
[i
]);
784 h
->field_scan
[i
] = TRANSPOSE(field_scan
[i
]);
787 for (i
= 0; i
< 64; i
++) {
788 #define TRANSPOSE(x) (x >> 3) | ((x & 7) << 3)
789 h
->zigzag_scan8x8
[i
] = TRANSPOSE(ff_zigzag_direct
[i
]);
790 h
->zigzag_scan8x8_cavlc
[i
] = TRANSPOSE(zigzag_scan8x8_cavlc
[i
]);
791 h
->field_scan8x8
[i
] = TRANSPOSE(field_scan8x8
[i
]);
792 h
->field_scan8x8_cavlc
[i
] = TRANSPOSE(field_scan8x8_cavlc
[i
]);
795 if (h
->sps
.transform_bypass
) { // FIXME same ugly
796 h
->zigzag_scan_q0
= zigzag_scan
;
797 h
->zigzag_scan8x8_q0
= ff_zigzag_direct
;
798 h
->zigzag_scan8x8_cavlc_q0
= zigzag_scan8x8_cavlc
;
799 h
->field_scan_q0
= field_scan
;
800 h
->field_scan8x8_q0
= field_scan8x8
;
801 h
->field_scan8x8_cavlc_q0
= field_scan8x8_cavlc
;
803 h
->zigzag_scan_q0
= h
->zigzag_scan
;
804 h
->zigzag_scan8x8_q0
= h
->zigzag_scan8x8
;
805 h
->zigzag_scan8x8_cavlc_q0
= h
->zigzag_scan8x8_cavlc
;
806 h
->field_scan_q0
= h
->field_scan
;
807 h
->field_scan8x8_q0
= h
->field_scan8x8
;
808 h
->field_scan8x8_cavlc_q0
= h
->field_scan8x8_cavlc
;
812 static enum AVPixelFormat
get_pixel_format(H264Context
*h
)
814 #define HWACCEL_MAX (CONFIG_H264_DXVA2_HWACCEL + \
815 CONFIG_H264_D3D11VA_HWACCEL + \
816 CONFIG_H264_VAAPI_HWACCEL + \
817 (CONFIG_H264_VDA_HWACCEL * 2) + \
818 CONFIG_H264_VDPAU_HWACCEL)
819 enum AVPixelFormat pix_fmts
[HWACCEL_MAX
+ 2], *fmt
= pix_fmts
;
820 const enum AVPixelFormat
*choices
= pix_fmts
;
822 switch (h
->sps
.bit_depth_luma
) {
825 if (h
->avctx
->colorspace
== AVCOL_SPC_RGB
) {
826 *fmt
++ = AV_PIX_FMT_GBRP9
;
828 *fmt
++ = AV_PIX_FMT_YUV444P9
;
829 } else if (CHROMA422(h
))
830 *fmt
++ = AV_PIX_FMT_YUV422P9
;
832 *fmt
++ = AV_PIX_FMT_YUV420P9
;
836 if (h
->avctx
->colorspace
== AVCOL_SPC_RGB
) {
837 *fmt
++ = AV_PIX_FMT_GBRP10
;
839 *fmt
++ = AV_PIX_FMT_YUV444P10
;
840 } else if (CHROMA422(h
))
841 *fmt
++ = AV_PIX_FMT_YUV422P10
;
843 *fmt
++ = AV_PIX_FMT_YUV420P10
;
846 #if CONFIG_H264_VDPAU_HWACCEL
847 *fmt
++ = AV_PIX_FMT_VDPAU
;
850 if (h
->avctx
->colorspace
== AVCOL_SPC_RGB
)
851 *fmt
++ = AV_PIX_FMT_GBRP
;
852 else if (h
->avctx
->color_range
== AVCOL_RANGE_JPEG
)
853 *fmt
++ = AV_PIX_FMT_YUVJ444P
;
855 *fmt
++ = AV_PIX_FMT_YUV444P
;
856 } else if (CHROMA422(h
)) {
857 if (h
->avctx
->color_range
== AVCOL_RANGE_JPEG
)
858 *fmt
++ = AV_PIX_FMT_YUVJ422P
;
860 *fmt
++ = AV_PIX_FMT_YUV422P
;
862 #if CONFIG_H264_DXVA2_HWACCEL
863 *fmt
++ = AV_PIX_FMT_DXVA2_VLD
;
865 #if CONFIG_H264_D3D11VA_HWACCEL
866 *fmt
++ = AV_PIX_FMT_D3D11VA_VLD
;
868 #if CONFIG_H264_VAAPI_HWACCEL
869 *fmt
++ = AV_PIX_FMT_VAAPI_VLD
;
871 #if CONFIG_H264_VDA_HWACCEL
872 *fmt
++ = AV_PIX_FMT_VDA_VLD
;
873 *fmt
++ = AV_PIX_FMT_VDA
;
875 if (h
->avctx
->codec
->pix_fmts
)
876 choices
= h
->avctx
->codec
->pix_fmts
;
877 else if (h
->avctx
->color_range
== AVCOL_RANGE_JPEG
)
878 *fmt
++ = AV_PIX_FMT_YUVJ420P
;
880 *fmt
++ = AV_PIX_FMT_YUV420P
;
884 av_log(h
->avctx
, AV_LOG_ERROR
,
885 "Unsupported bit depth %d\n", h
->sps
.bit_depth_luma
);
886 return AVERROR_INVALIDDATA
;
889 *fmt
= AV_PIX_FMT_NONE
;
891 return ff_get_format(h
->avctx
, choices
);
894 /* export coded and cropped frame dimensions to AVCodecContext */
895 static int init_dimensions(H264Context
*h
)
897 int width
= h
->width
- (h
->sps
.crop_right
+ h
->sps
.crop_left
);
898 int height
= h
->height
- (h
->sps
.crop_top
+ h
->sps
.crop_bottom
);
899 int crop_present
= h
->sps
.crop_left
|| h
->sps
.crop_top
||
900 h
->sps
.crop_right
|| h
->sps
.crop_bottom
;
902 /* handle container cropping */
904 FFALIGN(h
->avctx
->width
, 16) == h
->width
&&
905 FFALIGN(h
->avctx
->height
, 16) == h
->height
) {
906 width
= h
->avctx
->width
;
907 height
= h
->avctx
->height
;
910 if (width
<= 0 || height
<= 0) {
911 av_log(h
->avctx
, AV_LOG_ERROR
, "Invalid cropped dimensions: %dx%d.\n",
913 if (h
->avctx
->err_recognition
& AV_EF_EXPLODE
)
914 return AVERROR_INVALIDDATA
;
916 av_log(h
->avctx
, AV_LOG_WARNING
, "Ignoring cropping information.\n");
927 h
->avctx
->coded_width
= h
->width
;
928 h
->avctx
->coded_height
= h
->height
;
929 h
->avctx
->width
= width
;
930 h
->avctx
->height
= height
;
935 static int h264_slice_header_init(H264Context
*h
)
937 int nb_slices
= (HAVE_THREADS
&&
938 h
->avctx
->active_thread_type
& FF_THREAD_SLICE
) ?
939 h
->avctx
->thread_count
: 1;
942 ff_set_sar(h
->avctx
, h
->sps
.sar
);
943 av_pix_fmt_get_chroma_sub_sample(h
->avctx
->pix_fmt
,
944 &h
->chroma_x_shift
, &h
->chroma_y_shift
);
946 if (h
->sps
.timing_info_present_flag
) {
947 int64_t den
= h
->sps
.time_scale
;
948 if (h
->x264_build
< 44U)
950 av_reduce(&h
->avctx
->framerate
.den
, &h
->avctx
->framerate
.num
,
951 h
->sps
.num_units_in_tick
, den
, 1 << 30);
954 ff_h264_free_tables(h
);
957 h
->prev_interlaced_frame
= 1;
960 ret
= ff_h264_alloc_tables(h
);
962 av_log(h
->avctx
, AV_LOG_ERROR
, "Could not allocate memory\n");
966 if (h
->sps
.bit_depth_luma
< 8 || h
->sps
.bit_depth_luma
> 10) {
967 av_log(h
->avctx
, AV_LOG_ERROR
, "Unsupported bit depth %d\n",
968 h
->sps
.bit_depth_luma
);
969 return AVERROR_INVALIDDATA
;
972 h
->avctx
->bits_per_raw_sample
= h
->sps
.bit_depth_luma
;
973 h
->pixel_shift
= h
->sps
.bit_depth_luma
> 8;
974 h
->chroma_format_idc
= h
->sps
.chroma_format_idc
;
975 h
->bit_depth_luma
= h
->sps
.bit_depth_luma
;
977 ff_h264dsp_init(&h
->h264dsp
, h
->sps
.bit_depth_luma
,
978 h
->sps
.chroma_format_idc
);
979 ff_h264chroma_init(&h
->h264chroma
, h
->sps
.bit_depth_chroma
);
980 ff_h264qpel_init(&h
->h264qpel
, h
->sps
.bit_depth_luma
);
981 ff_h264_pred_init(&h
->hpc
, h
->avctx
->codec_id
, h
->sps
.bit_depth_luma
,
982 h
->sps
.chroma_format_idc
);
983 ff_videodsp_init(&h
->vdsp
, h
->sps
.bit_depth_luma
);
985 if (nb_slices
> H264_MAX_THREADS
|| (nb_slices
> h
->mb_height
&& h
->mb_height
)) {
988 max_slices
= FFMIN(H264_MAX_THREADS
, h
->mb_height
);
990 max_slices
= H264_MAX_THREADS
;
991 av_log(h
->avctx
, AV_LOG_WARNING
, "too many threads/slices %d,"
992 " reducing to %d\n", nb_slices
, max_slices
);
993 nb_slices
= max_slices
;
995 h
->slice_context_count
= nb_slices
;
997 if (!HAVE_THREADS
|| !(h
->avctx
->active_thread_type
& FF_THREAD_SLICE
)) {
998 ret
= ff_h264_slice_context_init(h
, &h
->slice_ctx
[0]);
1000 av_log(h
->avctx
, AV_LOG_ERROR
, "context_init() failed.\n");
1004 for (i
= 0; i
< h
->slice_context_count
; i
++) {
1005 H264SliceContext
*sl
= &h
->slice_ctx
[i
];
1008 sl
->intra4x4_pred_mode
= h
->intra4x4_pred_mode
+ i
* 8 * 2 * h
->mb_stride
;
1009 sl
->mvd_table
[0] = h
->mvd_table
[0] + i
* 8 * 2 * h
->mb_stride
;
1010 sl
->mvd_table
[1] = h
->mvd_table
[1] + i
* 8 * 2 * h
->mb_stride
;
1012 if ((ret
= ff_h264_slice_context_init(h
, sl
)) < 0) {
1013 av_log(h
->avctx
, AV_LOG_ERROR
, "context_init() failed.\n");
1019 h
->context_initialized
= 1;
1025 * Decode a slice header.
1026 * This will (re)intialize the decoder and call h264_frame_start() as needed.
1028 * @param h h264context
1030 * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded
1032 int ff_h264_decode_slice_header(H264Context
*h
, H264SliceContext
*sl
)
1034 unsigned int first_mb_in_slice
;
1035 unsigned int pps_id
;
1037 unsigned int slice_type
, tmp
, i
, j
;
1038 int default_ref_list_done
= 0;
1039 int last_pic_structure
, last_pic_droppable
;
1040 int needs_reinit
= 0;
1041 int field_pic_flag
, bottom_field_flag
;
1043 h
->qpel_put
= h
->h264qpel
.put_h264_qpel_pixels_tab
;
1044 h
->qpel_avg
= h
->h264qpel
.avg_h264_qpel_pixels_tab
;
1046 first_mb_in_slice
= get_ue_golomb(&sl
->gb
);
1048 if (first_mb_in_slice
== 0) { // FIXME better field boundary detection
1049 if (h
->current_slice
&& h
->cur_pic_ptr
&& FIELD_PICTURE(h
)) {
1050 ff_h264_field_end(h
, sl
, 1);
1053 h
->current_slice
= 0;
1054 if (!h
->first_field
) {
1055 if (h
->cur_pic_ptr
&& !h
->droppable
) {
1056 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, INT_MAX
,
1057 h
->picture_structure
== PICT_BOTTOM_FIELD
);
1059 h
->cur_pic_ptr
= NULL
;
1063 slice_type
= get_ue_golomb_31(&sl
->gb
);
1064 if (slice_type
> 9) {
1065 av_log(h
->avctx
, AV_LOG_ERROR
,
1066 "slice type %d too large at %d\n",
1067 slice_type
, first_mb_in_slice
);
1068 return AVERROR_INVALIDDATA
;
1070 if (slice_type
> 4) {
1072 sl
->slice_type_fixed
= 1;
1074 sl
->slice_type_fixed
= 0;
1076 slice_type
= golomb_to_pict_type
[slice_type
];
1077 if (slice_type
== AV_PICTURE_TYPE_I
||
1078 (h
->current_slice
!= 0 && slice_type
== h
->last_slice_type
)) {
1079 default_ref_list_done
= 1;
1081 sl
->slice_type
= slice_type
;
1082 sl
->slice_type_nos
= slice_type
& 3;
1084 if (h
->nal_unit_type
== NAL_IDR_SLICE
&&
1085 sl
->slice_type_nos
!= AV_PICTURE_TYPE_I
) {
1086 av_log(h
->avctx
, AV_LOG_ERROR
, "A non-intra slice in an IDR NAL unit.\n");
1087 return AVERROR_INVALIDDATA
;
1090 // to make a few old functions happy, it's wrong though
1091 h
->pict_type
= sl
->slice_type
;
1093 pps_id
= get_ue_golomb(&sl
->gb
);
1094 if (pps_id
>= MAX_PPS_COUNT
) {
1095 av_log(h
->avctx
, AV_LOG_ERROR
, "pps_id %u out of range\n", pps_id
);
1096 return AVERROR_INVALIDDATA
;
1098 if (!h
->pps_buffers
[pps_id
]) {
1099 av_log(h
->avctx
, AV_LOG_ERROR
,
1100 "non-existing PPS %u referenced\n",
1102 return AVERROR_INVALIDDATA
;
1104 h
->pps
= *h
->pps_buffers
[pps_id
];
1106 if (!h
->sps_buffers
[h
->pps
.sps_id
]) {
1107 av_log(h
->avctx
, AV_LOG_ERROR
,
1108 "non-existing SPS %u referenced\n",
1110 return AVERROR_INVALIDDATA
;
1113 if (h
->pps
.sps_id
!= h
->sps
.sps_id
||
1114 h
->sps_buffers
[h
->pps
.sps_id
]->new) {
1115 h
->sps_buffers
[h
->pps
.sps_id
]->new = 0;
1117 h
->sps
= *h
->sps_buffers
[h
->pps
.sps_id
];
1119 if (h
->bit_depth_luma
!= h
->sps
.bit_depth_luma
||
1120 h
->chroma_format_idc
!= h
->sps
.chroma_format_idc
)
1123 if (h
->flags
& CODEC_FLAG_LOW_DELAY
||
1124 (h
->sps
.bitstream_restriction_flag
&&
1125 !h
->sps
.num_reorder_frames
)) {
1126 if (h
->avctx
->has_b_frames
> 1 || h
->delayed_pic
[0])
1127 av_log(h
->avctx
, AV_LOG_WARNING
, "Delayed frames seen. "
1128 "Reenabling low delay requires a codec flush.\n");
1133 if (h
->avctx
->has_b_frames
< 2)
1134 h
->avctx
->has_b_frames
= !h
->low_delay
;
1138 h
->avctx
->profile
= ff_h264_get_profile(&h
->sps
);
1139 h
->avctx
->level
= h
->sps
.level_idc
;
1140 h
->avctx
->refs
= h
->sps
.ref_frame_count
;
1142 if (h
->mb_width
!= h
->sps
.mb_width
||
1143 h
->mb_height
!= h
->sps
.mb_height
* (2 - h
->sps
.frame_mbs_only_flag
))
1146 h
->mb_width
= h
->sps
.mb_width
;
1147 h
->mb_height
= h
->sps
.mb_height
* (2 - h
->sps
.frame_mbs_only_flag
);
1148 h
->mb_num
= h
->mb_width
* h
->mb_height
;
1149 h
->mb_stride
= h
->mb_width
+ 1;
1151 h
->b_stride
= h
->mb_width
* 4;
1153 h
->chroma_y_shift
= h
->sps
.chroma_format_idc
<= 1; // 400 uses yuv420p
1155 h
->width
= 16 * h
->mb_width
;
1156 h
->height
= 16 * h
->mb_height
;
1158 ret
= init_dimensions(h
);
1162 if (h
->sps
.video_signal_type_present_flag
) {
1163 h
->avctx
->color_range
= h
->sps
.full_range ? AVCOL_RANGE_JPEG
1165 if (h
->sps
.colour_description_present_flag
) {
1166 if (h
->avctx
->colorspace
!= h
->sps
.colorspace
)
1168 h
->avctx
->color_primaries
= h
->sps
.color_primaries
;
1169 h
->avctx
->color_trc
= h
->sps
.color_trc
;
1170 h
->avctx
->colorspace
= h
->sps
.colorspace
;
1174 if (h
->context_initialized
&& needs_reinit
) {
1175 h
->context_initialized
= 0;
1176 if (sl
!= h
->slice_ctx
) {
1177 av_log(h
->avctx
, AV_LOG_ERROR
,
1178 "changing width %d -> %d / height %d -> %d on "
1180 h
->width
, h
->avctx
->coded_width
,
1181 h
->height
, h
->avctx
->coded_height
,
1182 h
->current_slice
+ 1);
1183 return AVERROR_INVALIDDATA
;
1186 ff_h264_flush_change(h
);
1188 if ((ret
= get_pixel_format(h
)) < 0)
1190 h
->avctx
->pix_fmt
= ret
;
1192 av_log(h
->avctx
, AV_LOG_INFO
, "Reinit context to %dx%d, "
1193 "pix_fmt: %d\n", h
->width
, h
->height
, h
->avctx
->pix_fmt
);
1195 if ((ret
= h264_slice_header_init(h
)) < 0) {
1196 av_log(h
->avctx
, AV_LOG_ERROR
,
1197 "h264_slice_header_init() failed\n");
1201 if (!h
->context_initialized
) {
1202 if (sl
!= h
->slice_ctx
) {
1203 av_log(h
->avctx
, AV_LOG_ERROR
,
1204 "Cannot (re-)initialize context during parallel decoding.\n");
1205 return AVERROR_PATCHWELCOME
;
1208 if ((ret
= get_pixel_format(h
)) < 0)
1210 h
->avctx
->pix_fmt
= ret
;
1212 if ((ret
= h264_slice_header_init(h
)) < 0) {
1213 av_log(h
->avctx
, AV_LOG_ERROR
,
1214 "h264_slice_header_init() failed\n");
1219 if (sl
== h
->slice_ctx
&& h
->dequant_coeff_pps
!= pps_id
) {
1220 h
->dequant_coeff_pps
= pps_id
;
1221 h264_init_dequant_tables(h
);
1224 h
->frame_num
= get_bits(&sl
->gb
, h
->sps
.log2_max_frame_num
);
1227 h
->mb_aff_frame
= 0;
1228 last_pic_structure
= h
->picture_structure
;
1229 last_pic_droppable
= h
->droppable
;
1230 h
->droppable
= h
->nal_ref_idc
== 0;
1231 if (h
->sps
.frame_mbs_only_flag
) {
1232 h
->picture_structure
= PICT_FRAME
;
1234 field_pic_flag
= get_bits1(&sl
->gb
);
1235 if (field_pic_flag
) {
1236 bottom_field_flag
= get_bits1(&sl
->gb
);
1237 h
->picture_structure
= PICT_TOP_FIELD
+ bottom_field_flag
;
1239 h
->picture_structure
= PICT_FRAME
;
1240 h
->mb_aff_frame
= h
->sps
.mb_aff
;
1243 sl
->mb_field_decoding_flag
= h
->picture_structure
!= PICT_FRAME
;
1245 if (h
->current_slice
!= 0) {
1246 if (last_pic_structure
!= h
->picture_structure
||
1247 last_pic_droppable
!= h
->droppable
) {
1248 av_log(h
->avctx
, AV_LOG_ERROR
,
1249 "Changing field mode (%d -> %d) between slices is not allowed\n",
1250 last_pic_structure
, h
->picture_structure
);
1251 h
->picture_structure
= last_pic_structure
;
1252 h
->droppable
= last_pic_droppable
;
1253 return AVERROR_INVALIDDATA
;
1254 } else if (!h
->cur_pic_ptr
) {
1255 av_log(h
->avctx
, AV_LOG_ERROR
,
1256 "unset cur_pic_ptr on slice %d\n",
1257 h
->current_slice
+ 1);
1258 return AVERROR_INVALIDDATA
;
1261 /* Shorten frame num gaps so we don't have to allocate reference
1262 * frames just to throw them away */
1263 if (h
->frame_num
!= h
->prev_frame_num
) {
1264 int unwrap_prev_frame_num
= h
->prev_frame_num
;
1265 int max_frame_num
= 1 << h
->sps
.log2_max_frame_num
;
1267 if (unwrap_prev_frame_num
> h
->frame_num
)
1268 unwrap_prev_frame_num
-= max_frame_num
;
1270 if ((h
->frame_num
- unwrap_prev_frame_num
) > h
->sps
.ref_frame_count
) {
1271 unwrap_prev_frame_num
= (h
->frame_num
- h
->sps
.ref_frame_count
) - 1;
1272 if (unwrap_prev_frame_num
< 0)
1273 unwrap_prev_frame_num
+= max_frame_num
;
1275 h
->prev_frame_num
= unwrap_prev_frame_num
;
1279 /* See if we have a decoded first field looking for a pair...
1280 * Here, we're using that to see if we should mark previously
1281 * decode frames as "finished".
1282 * We have to do that before the "dummy" in-between frame allocation,
1283 * since that can modify s->current_picture_ptr. */
1284 if (h
->first_field
) {
1285 assert(h
->cur_pic_ptr
);
1286 assert(h
->cur_pic_ptr
->f
->buf
[0]);
1287 assert(h
->cur_pic_ptr
->reference
!= DELAYED_PIC_REF
);
1289 /* figure out if we have a complementary field pair */
1290 if (!FIELD_PICTURE(h
) || h
->picture_structure
== last_pic_structure
) {
1291 /* Previous field is unmatched. Don't display it, but let it
1292 * remain for reference if marked as such. */
1293 if (!last_pic_droppable
&& last_pic_structure
!= PICT_FRAME
) {
1294 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, INT_MAX
,
1295 last_pic_structure
== PICT_TOP_FIELD
);
1298 if (h
->cur_pic_ptr
->frame_num
!= h
->frame_num
) {
1299 /* This and previous field were reference, but had
1300 * different frame_nums. Consider this field first in
1301 * pair. Throw away previous field except for reference
1303 if (!last_pic_droppable
&& last_pic_structure
!= PICT_FRAME
) {
1304 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, INT_MAX
,
1305 last_pic_structure
== PICT_TOP_FIELD
);
1308 /* Second field in complementary pair */
1309 if (!((last_pic_structure
== PICT_TOP_FIELD
&&
1310 h
->picture_structure
== PICT_BOTTOM_FIELD
) ||
1311 (last_pic_structure
== PICT_BOTTOM_FIELD
&&
1312 h
->picture_structure
== PICT_TOP_FIELD
))) {
1313 av_log(h
->avctx
, AV_LOG_ERROR
,
1314 "Invalid field mode combination %d/%d\n",
1315 last_pic_structure
, h
->picture_structure
);
1316 h
->picture_structure
= last_pic_structure
;
1317 h
->droppable
= last_pic_droppable
;
1318 return AVERROR_INVALIDDATA
;
1319 } else if (last_pic_droppable
!= h
->droppable
) {
1320 avpriv_request_sample(h
->avctx
,
1321 "Found reference and non-reference fields in the same frame, which");
1322 h
->picture_structure
= last_pic_structure
;
1323 h
->droppable
= last_pic_droppable
;
1324 return AVERROR_PATCHWELCOME
;
1330 while (h
->frame_num
!= h
->prev_frame_num
&&
1331 h
->frame_num
!= (h
->prev_frame_num
+ 1) % (1 << h
->sps
.log2_max_frame_num
)) {
1332 H264Picture
*prev
= h
->short_ref_count ? h
->short_ref
[0] : NULL
;
1333 av_log(h
->avctx
, AV_LOG_DEBUG
, "Frame num gap %d %d\n",
1334 h
->frame_num
, h
->prev_frame_num
);
1335 ret
= h264_frame_start(h
);
1341 h
->prev_frame_num
++;
1342 h
->prev_frame_num
%= 1 << h
->sps
.log2_max_frame_num
;
1343 h
->cur_pic_ptr
->frame_num
= h
->prev_frame_num
;
1344 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, INT_MAX
, 0);
1345 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, INT_MAX
, 1);
1346 ret
= ff_generate_sliding_window_mmcos(h
, 1);
1347 if (ret
< 0 && (h
->avctx
->err_recognition
& AV_EF_EXPLODE
))
1349 ret
= ff_h264_execute_ref_pic_marking(h
, h
->mmco
, h
->mmco_index
);
1350 if (ret
< 0 && (h
->avctx
->err_recognition
& AV_EF_EXPLODE
))
1352 /* Error concealment: If a ref is missing, copy the previous ref
1354 * FIXME: Avoiding a memcpy would be nice, but ref handling makes
1355 * many assumptions about there being no actual duplicates.
1356 * FIXME: This does not copy padding for out-of-frame motion
1357 * vectors. Given we are concealing a lost frame, this probably
1358 * is not noticeable by comparison, but it should be fixed. */
1359 if (h
->short_ref_count
) {
1361 h
->short_ref
[0]->f
->width
== prev
->f
->width
&&
1362 h
->short_ref
[0]->f
->height
== prev
->f
->height
&&
1363 h
->short_ref
[0]->f
->format
== prev
->f
->format
) {
1364 av_image_copy(h
->short_ref
[0]->f
->data
,
1365 h
->short_ref
[0]->f
->linesize
,
1366 (const uint8_t **)prev
->f
->data
,
1371 h
->short_ref
[0]->poc
= prev
->poc
+ 2;
1373 h
->short_ref
[0]->frame_num
= h
->prev_frame_num
;
1377 /* See if we have a decoded first field looking for a pair...
1378 * We're using that to see whether to continue decoding in that
1379 * frame, or to allocate a new one. */
1380 if (h
->first_field
) {
1381 assert(h
->cur_pic_ptr
);
1382 assert(h
->cur_pic_ptr
->f
->buf
[0]);
1383 assert(h
->cur_pic_ptr
->reference
!= DELAYED_PIC_REF
);
1385 /* figure out if we have a complementary field pair */
1386 if (!FIELD_PICTURE(h
) || h
->picture_structure
== last_pic_structure
) {
1387 /* Previous field is unmatched. Don't display it, but let it
1388 * remain for reference if marked as such. */
1389 h
->cur_pic_ptr
= NULL
;
1390 h
->first_field
= FIELD_PICTURE(h
);
1392 if (h
->cur_pic_ptr
->frame_num
!= h
->frame_num
) {
1393 /* This and the previous field had different frame_nums.
1394 * Consider this field first in pair. Throw away previous
1395 * one except for reference purposes. */
1397 h
->cur_pic_ptr
= NULL
;
1399 /* Second field in complementary pair */
1404 /* Frame or first field in a potentially complementary pair */
1405 h
->first_field
= FIELD_PICTURE(h
);
1408 if (!FIELD_PICTURE(h
) || h
->first_field
) {
1409 if (h264_frame_start(h
) < 0) {
1411 return AVERROR_INVALIDDATA
;
1414 release_unused_pictures(h
, 0);
1418 h
->cur_pic_ptr
->frame_num
= h
->frame_num
; // FIXME frame_num cleanup
1420 assert(h
->mb_num
== h
->mb_width
* h
->mb_height
);
1421 if (first_mb_in_slice
<< FIELD_OR_MBAFF_PICTURE(h
) >= h
->mb_num
||
1422 first_mb_in_slice
>= h
->mb_num
) {
1423 av_log(h
->avctx
, AV_LOG_ERROR
, "first_mb_in_slice overflow\n");
1424 return AVERROR_INVALIDDATA
;
1426 sl
->resync_mb_x
= sl
->mb_x
= first_mb_in_slice
% h
->mb_width
;
1427 sl
->resync_mb_y
= sl
->mb_y
= (first_mb_in_slice
/ h
->mb_width
) <<
1428 FIELD_OR_MBAFF_PICTURE(h
);
1429 if (h
->picture_structure
== PICT_BOTTOM_FIELD
)
1430 sl
->resync_mb_y
= sl
->mb_y
= sl
->mb_y
+ 1;
1431 assert(sl
->mb_y
< h
->mb_height
);
1433 if (h
->picture_structure
== PICT_FRAME
) {
1434 h
->curr_pic_num
= h
->frame_num
;
1435 h
->max_pic_num
= 1 << h
->sps
.log2_max_frame_num
;
1437 h
->curr_pic_num
= 2 * h
->frame_num
+ 1;
1438 h
->max_pic_num
= 1 << (h
->sps
.log2_max_frame_num
+ 1);
1441 if (h
->nal_unit_type
== NAL_IDR_SLICE
)
1442 get_ue_golomb(&sl
->gb
); /* idr_pic_id */
1444 if (h
->sps
.poc_type
== 0) {
1445 h
->poc_lsb
= get_bits(&sl
->gb
, h
->sps
.log2_max_poc_lsb
);
1447 if (h
->pps
.pic_order_present
== 1 && h
->picture_structure
== PICT_FRAME
)
1448 h
->delta_poc_bottom
= get_se_golomb(&sl
->gb
);
1451 if (h
->sps
.poc_type
== 1 && !h
->sps
.delta_pic_order_always_zero_flag
) {
1452 h
->delta_poc
[0] = get_se_golomb(&sl
->gb
);
1454 if (h
->pps
.pic_order_present
== 1 && h
->picture_structure
== PICT_FRAME
)
1455 h
->delta_poc
[1] = get_se_golomb(&sl
->gb
);
1458 ff_init_poc(h
, h
->cur_pic_ptr
->field_poc
, &h
->cur_pic_ptr
->poc
);
1460 if (h
->pps
.redundant_pic_cnt_present
)
1461 sl
->redundant_pic_count
= get_ue_golomb(&sl
->gb
);
1463 ret
= ff_set_ref_count(h
, sl
);
1467 default_ref_list_done
= 0;
1469 if (!default_ref_list_done
)
1470 ff_h264_fill_default_ref_list(h
, sl
);
1472 if (sl
->slice_type_nos
!= AV_PICTURE_TYPE_I
) {
1473 ret
= ff_h264_decode_ref_pic_list_reordering(h
, sl
);
1475 sl
->ref_count
[1] = sl
->ref_count
[0] = 0;
1480 if ((h
->pps
.weighted_pred
&& sl
->slice_type_nos
== AV_PICTURE_TYPE_P
) ||
1481 (h
->pps
.weighted_bipred_idc
== 1 &&
1482 sl
->slice_type_nos
== AV_PICTURE_TYPE_B
))
1483 ff_pred_weight_table(h
, sl
);
1484 else if (h
->pps
.weighted_bipred_idc
== 2 &&
1485 sl
->slice_type_nos
== AV_PICTURE_TYPE_B
) {
1486 implicit_weight_table(h
, sl
, -1);
1489 for (i
= 0; i
< 2; i
++) {
1490 sl
->luma_weight_flag
[i
] = 0;
1491 sl
->chroma_weight_flag
[i
] = 0;
1495 // If frame-mt is enabled, only update mmco tables for the first slice
1496 // in a field. Subsequent slices can temporarily clobber h->mmco_index
1497 // or h->mmco, which will cause ref list mix-ups and decoding errors
1498 // further down the line. This may break decoding if the first slice is
1499 // corrupt, thus we only do this if frame-mt is enabled.
1500 if (h
->nal_ref_idc
) {
1501 ret
= ff_h264_decode_ref_pic_marking(h
, &sl
->gb
,
1502 !(h
->avctx
->active_thread_type
& FF_THREAD_FRAME
) ||
1503 h
->current_slice
== 0);
1504 if (ret
< 0 && (h
->avctx
->err_recognition
& AV_EF_EXPLODE
))
1505 return AVERROR_INVALIDDATA
;
1508 if (FRAME_MBAFF(h
)) {
1509 ff_h264_fill_mbaff_ref_list(h
, sl
);
1511 if (h
->pps
.weighted_bipred_idc
== 2 && sl
->slice_type_nos
== AV_PICTURE_TYPE_B
) {
1512 implicit_weight_table(h
, sl
, 0);
1513 implicit_weight_table(h
, sl
, 1);
1517 if (sl
->slice_type_nos
== AV_PICTURE_TYPE_B
&& !sl
->direct_spatial_mv_pred
)
1518 ff_h264_direct_dist_scale_factor(h
, sl
);
1519 ff_h264_direct_ref_list_init(h
, sl
);
1521 if (sl
->slice_type_nos
!= AV_PICTURE_TYPE_I
&& h
->pps
.cabac
) {
1522 tmp
= get_ue_golomb_31(&sl
->gb
);
1524 av_log(h
->avctx
, AV_LOG_ERROR
, "cabac_init_idc %u overflow\n", tmp
);
1525 return AVERROR_INVALIDDATA
;
1527 sl
->cabac_init_idc
= tmp
;
1530 sl
->last_qscale_diff
= 0;
1531 tmp
= h
->pps
.init_qp
+ get_se_golomb(&sl
->gb
);
1532 if (tmp
> 51 + 6 * (h
->sps
.bit_depth_luma
- 8)) {
1533 av_log(h
->avctx
, AV_LOG_ERROR
, "QP %u out of range\n", tmp
);
1534 return AVERROR_INVALIDDATA
;
1537 sl
->chroma_qp
[0] = get_chroma_qp(h
, 0, sl
->qscale
);
1538 sl
->chroma_qp
[1] = get_chroma_qp(h
, 1, sl
->qscale
);
1539 // FIXME qscale / qp ... stuff
1540 if (sl
->slice_type
== AV_PICTURE_TYPE_SP
)
1541 get_bits1(&sl
->gb
); /* sp_for_switch_flag */
1542 if (sl
->slice_type
== AV_PICTURE_TYPE_SP
||
1543 sl
->slice_type
== AV_PICTURE_TYPE_SI
)
1544 get_se_golomb(&sl
->gb
); /* slice_qs_delta */
1546 sl
->deblocking_filter
= 1;
1547 sl
->slice_alpha_c0_offset
= 0;
1548 sl
->slice_beta_offset
= 0;
1549 if (h
->pps
.deblocking_filter_parameters_present
) {
1550 tmp
= get_ue_golomb_31(&sl
->gb
);
1552 av_log(h
->avctx
, AV_LOG_ERROR
,
1553 "deblocking_filter_idc %u out of range\n", tmp
);
1554 return AVERROR_INVALIDDATA
;
1556 sl
->deblocking_filter
= tmp
;
1557 if (sl
->deblocking_filter
< 2)
1558 sl
->deblocking_filter
^= 1; // 1<->0
1560 if (sl
->deblocking_filter
) {
1561 sl
->slice_alpha_c0_offset
= get_se_golomb(&sl
->gb
) * 2;
1562 sl
->slice_beta_offset
= get_se_golomb(&sl
->gb
) * 2;
1563 if (sl
->slice_alpha_c0_offset
> 12 ||
1564 sl
->slice_alpha_c0_offset
< -12 ||
1565 sl
->slice_beta_offset
> 12 ||
1566 sl
->slice_beta_offset
< -12) {
1567 av_log(h
->avctx
, AV_LOG_ERROR
,
1568 "deblocking filter parameters %d %d out of range\n",
1569 sl
->slice_alpha_c0_offset
, sl
->slice_beta_offset
);
1570 return AVERROR_INVALIDDATA
;
1575 if (h
->avctx
->skip_loop_filter
>= AVDISCARD_ALL
||
1576 (h
->avctx
->skip_loop_filter
>= AVDISCARD_NONKEY
&&
1577 sl
->slice_type_nos
!= AV_PICTURE_TYPE_I
) ||
1578 (h
->avctx
->skip_loop_filter
>= AVDISCARD_BIDIR
&&
1579 sl
->slice_type_nos
== AV_PICTURE_TYPE_B
) ||
1580 (h
->avctx
->skip_loop_filter
>= AVDISCARD_NONREF
&&
1581 h
->nal_ref_idc
== 0))
1582 sl
->deblocking_filter
= 0;
1584 if (sl
->deblocking_filter
== 1 && h
->max_contexts
> 1) {
1585 if (h
->avctx
->flags2
& CODEC_FLAG2_FAST
) {
1586 /* Cheat slightly for speed:
1587 * Do not bother to deblock across slices. */
1588 sl
->deblocking_filter
= 2;
1590 h
->max_contexts
= 1;
1591 if (!h
->single_decode_warning
) {
1592 av_log(h
->avctx
, AV_LOG_INFO
,
1593 "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n");
1594 h
->single_decode_warning
= 1;
1596 if (sl
!= h
->slice_ctx
) {
1597 av_log(h
->avctx
, AV_LOG_ERROR
,
1598 "Deblocking switched inside frame.\n");
1603 sl
->qp_thresh
= 15 -
1604 FFMIN(sl
->slice_alpha_c0_offset
, sl
->slice_beta_offset
) -
1606 h
->pps
.chroma_qp_index_offset
[0],
1607 h
->pps
.chroma_qp_index_offset
[1]) +
1608 6 * (h
->sps
.bit_depth_luma
- 8);
1610 h
->last_slice_type
= slice_type
;
1611 sl
->slice_num
= ++h
->current_slice
;
1612 if (sl
->slice_num
>= MAX_SLICES
) {
1613 av_log(h
->avctx
, AV_LOG_ERROR
,
1614 "Too many slices, increase MAX_SLICES and recompile\n");
1617 for (j
= 0; j
< 2; j
++) {
1619 int *ref2frm
= sl
->ref2frm
[sl
->slice_num
& (MAX_SLICES
- 1)][j
];
1620 for (i
= 0; i
< 16; i
++) {
1622 if (j
< sl
->list_count
&& i
< sl
->ref_count
[j
] &&
1623 sl
->ref_list
[j
][i
].parent
->f
->buf
[0]) {
1625 AVBuffer
*buf
= sl
->ref_list
[j
][i
].parent
->f
->buf
[0]->buffer
;
1626 for (k
= 0; k
< h
->short_ref_count
; k
++)
1627 if (h
->short_ref
[k
]->f
->buf
[0]->buffer
== buf
) {
1631 for (k
= 0; k
< h
->long_ref_count
; k
++)
1632 if (h
->long_ref
[k
] && h
->long_ref
[k
]->f
->buf
[0]->buffer
== buf
) {
1633 id_list
[i
] = h
->short_ref_count
+ k
;
1641 for (i
= 0; i
< 16; i
++)
1642 ref2frm
[i
+ 2] = 4 * id_list
[i
] + (sl
->ref_list
[j
][i
].reference
& 3);
1644 ref2frm
[18 + 1] = -1;
1645 for (i
= 16; i
< 48; i
++)
1646 ref2frm
[i
+ 4] = 4 * id_list
[(i
- 16) >> 1] +
1647 (sl
->ref_list
[j
][i
].reference
& 3);
1650 if (h
->avctx
->debug
& FF_DEBUG_PICT_INFO
) {
1651 av_log(h
->avctx
, AV_LOG_DEBUG
,
1652 "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",
1654 (h
->picture_structure
== PICT_FRAME ?
"F" : h
->picture_structure
== PICT_TOP_FIELD ?
"T" : "B"),
1656 av_get_picture_type_char(sl
->slice_type
),
1657 sl
->slice_type_fixed ?
" fix" : "",
1658 h
->nal_unit_type
== NAL_IDR_SLICE ?
" IDR" : "",
1659 pps_id
, h
->frame_num
,
1660 h
->cur_pic_ptr
->field_poc
[0],
1661 h
->cur_pic_ptr
->field_poc
[1],
1662 sl
->ref_count
[0], sl
->ref_count
[1],
1664 sl
->deblocking_filter
,
1665 sl
->slice_alpha_c0_offset
, sl
->slice_beta_offset
,
1667 sl
->use_weight
== 1 && sl
->use_weight_chroma ?
"c" : "",
1668 sl
->slice_type
== AV_PICTURE_TYPE_B ?
(sl
->direct_spatial_mv_pred ?
"SPAT" : "TEMP") : "");
1674 int ff_h264_get_slice_type(const H264SliceContext
*sl
)
1676 switch (sl
->slice_type
) {
1677 case AV_PICTURE_TYPE_P
:
1679 case AV_PICTURE_TYPE_B
:
1681 case AV_PICTURE_TYPE_I
:
1683 case AV_PICTURE_TYPE_SP
:
1685 case AV_PICTURE_TYPE_SI
:
1688 return AVERROR_INVALIDDATA
;
1692 static av_always_inline
void fill_filter_caches_inter(const H264Context
*h
,
1693 H264SliceContext
*sl
,
1694 int mb_type
, int top_xy
,
1695 int left_xy
[LEFT_MBS
],
1697 int left_type
[LEFT_MBS
],
1698 int mb_xy
, int list
)
1700 int b_stride
= h
->b_stride
;
1701 int16_t(*mv_dst
)[2] = &sl
->mv_cache
[list
][scan8
[0]];
1702 int8_t *ref_cache
= &sl
->ref_cache
[list
][scan8
[0]];
1703 if (IS_INTER(mb_type
) || IS_DIRECT(mb_type
)) {
1704 if (USES_LIST(top_type
, list
)) {
1705 const int b_xy
= h
->mb2b_xy
[top_xy
] + 3 * b_stride
;
1706 const int b8_xy
= 4 * top_xy
+ 2;
1707 int (*ref2frm
)[64] = sl
->ref2frm
[h
->slice_table
[top_xy
] & (MAX_SLICES
- 1)][0] + (MB_MBAFF(sl
) ?
20 : 2);
1708 AV_COPY128(mv_dst
- 1 * 8, h
->cur_pic
.motion_val
[list
][b_xy
+ 0]);
1709 ref_cache
[0 - 1 * 8] =
1710 ref_cache
[1 - 1 * 8] = ref2frm
[list
][h
->cur_pic
.ref_index
[list
][b8_xy
+ 0]];
1711 ref_cache
[2 - 1 * 8] =
1712 ref_cache
[3 - 1 * 8] = ref2frm
[list
][h
->cur_pic
.ref_index
[list
][b8_xy
+ 1]];
1714 AV_ZERO128(mv_dst
- 1 * 8);
1715 AV_WN32A(&ref_cache
[0 - 1 * 8], ((LIST_NOT_USED
) & 0xFF) * 0x01010101u
);
1718 if (!IS_INTERLACED(mb_type
^ left_type
[LTOP
])) {
1719 if (USES_LIST(left_type
[LTOP
], list
)) {
1720 const int b_xy
= h
->mb2b_xy
[left_xy
[LTOP
]] + 3;
1721 const int b8_xy
= 4 * left_xy
[LTOP
] + 1;
1722 int (*ref2frm
)[64] = sl
->ref2frm
[h
->slice_table
[left_xy
[LTOP
]] & (MAX_SLICES
- 1)][0] + (MB_MBAFF(sl
) ?
20 : 2);
1723 AV_COPY32(mv_dst
- 1 + 0, h
->cur_pic
.motion_val
[list
][b_xy
+ b_stride
* 0]);
1724 AV_COPY32(mv_dst
- 1 + 8, h
->cur_pic
.motion_val
[list
][b_xy
+ b_stride
* 1]);
1725 AV_COPY32(mv_dst
- 1 + 16, h
->cur_pic
.motion_val
[list
][b_xy
+ b_stride
* 2]);
1726 AV_COPY32(mv_dst
- 1 + 24, h
->cur_pic
.motion_val
[list
][b_xy
+ b_stride
* 3]);
1728 ref_cache
[-1 + 8] = ref2frm
[list
][h
->cur_pic
.ref_index
[list
][b8_xy
+ 2 * 0]];
1729 ref_cache
[-1 + 16] =
1730 ref_cache
[-1 + 24] = ref2frm
[list
][h
->cur_pic
.ref_index
[list
][b8_xy
+ 2 * 1]];
1732 AV_ZERO32(mv_dst
- 1 + 0);
1733 AV_ZERO32(mv_dst
- 1 + 8);
1734 AV_ZERO32(mv_dst
- 1 + 16);
1735 AV_ZERO32(mv_dst
- 1 + 24);
1738 ref_cache
[-1 + 16] =
1739 ref_cache
[-1 + 24] = LIST_NOT_USED
;
1744 if (!USES_LIST(mb_type
, list
)) {
1745 fill_rectangle(mv_dst
, 4, 4, 8, pack16to32(0, 0), 4);
1746 AV_WN32A(&ref_cache
[0 * 8], ((LIST_NOT_USED
) & 0xFF) * 0x01010101u
);
1747 AV_WN32A(&ref_cache
[1 * 8], ((LIST_NOT_USED
) & 0xFF) * 0x01010101u
);
1748 AV_WN32A(&ref_cache
[2 * 8], ((LIST_NOT_USED
) & 0xFF) * 0x01010101u
);
1749 AV_WN32A(&ref_cache
[3 * 8], ((LIST_NOT_USED
) & 0xFF) * 0x01010101u
);
1754 int8_t *ref
= &h
->cur_pic
.ref_index
[list
][4 * mb_xy
];
1755 int (*ref2frm
)[64] = sl
->ref2frm
[sl
->slice_num
& (MAX_SLICES
- 1)][0] + (MB_MBAFF(sl
) ?
20 : 2);
1756 uint32_t ref01
= (pack16to32(ref2frm
[list
][ref
[0]], ref2frm
[list
][ref
[1]]) & 0x00FF00FF) * 0x0101;
1757 uint32_t ref23
= (pack16to32(ref2frm
[list
][ref
[2]], ref2frm
[list
][ref
[3]]) & 0x00FF00FF) * 0x0101;
1758 AV_WN32A(&ref_cache
[0 * 8], ref01
);
1759 AV_WN32A(&ref_cache
[1 * 8], ref01
);
1760 AV_WN32A(&ref_cache
[2 * 8], ref23
);
1761 AV_WN32A(&ref_cache
[3 * 8], ref23
);
1765 int16_t(*mv_src
)[2] = &h
->cur_pic
.motion_val
[list
][4 * sl
->mb_x
+ 4 * sl
->mb_y
* b_stride
];
1766 AV_COPY128(mv_dst
+ 8 * 0, mv_src
+ 0 * b_stride
);
1767 AV_COPY128(mv_dst
+ 8 * 1, mv_src
+ 1 * b_stride
);
1768 AV_COPY128(mv_dst
+ 8 * 2, mv_src
+ 2 * b_stride
);
1769 AV_COPY128(mv_dst
+ 8 * 3, mv_src
+ 3 * b_stride
);
1775 * @return non zero if the loop filter can be skipped
1777 static int fill_filter_caches(const H264Context
*h
, H264SliceContext
*sl
, int mb_type
)
1779 const int mb_xy
= sl
->mb_xy
;
1780 int top_xy
, left_xy
[LEFT_MBS
];
1781 int top_type
, left_type
[LEFT_MBS
];
1785 top_xy
= mb_xy
- (h
->mb_stride
<< MB_FIELD(sl
));
1787 /* Wow, what a mess, why didn't they simplify the interlacing & intra
1788 * stuff, I can't imagine that these complex rules are worth it. */
1790 left_xy
[LBOT
] = left_xy
[LTOP
] = mb_xy
- 1;
1791 if (FRAME_MBAFF(h
)) {
1792 const int left_mb_field_flag
= IS_INTERLACED(h
->cur_pic
.mb_type
[mb_xy
- 1]);
1793 const int curr_mb_field_flag
= IS_INTERLACED(mb_type
);
1795 if (left_mb_field_flag
!= curr_mb_field_flag
)
1796 left_xy
[LTOP
] -= h
->mb_stride
;
1798 if (curr_mb_field_flag
)
1799 top_xy
+= h
->mb_stride
&
1800 (((h
->cur_pic
.mb_type
[top_xy
] >> 7) & 1) - 1);
1801 if (left_mb_field_flag
!= curr_mb_field_flag
)
1802 left_xy
[LBOT
] += h
->mb_stride
;
1806 sl
->top_mb_xy
= top_xy
;
1807 sl
->left_mb_xy
[LTOP
] = left_xy
[LTOP
];
1808 sl
->left_mb_xy
[LBOT
] = left_xy
[LBOT
];
1810 /* For sufficiently low qp, filtering wouldn't do anything.
1811 * This is a conservative estimate: could also check beta_offset
1812 * and more accurate chroma_qp. */
1813 int qp_thresh
= sl
->qp_thresh
; // FIXME strictly we should store qp_thresh for each mb of a slice
1814 int qp
= h
->cur_pic
.qscale_table
[mb_xy
];
1815 if (qp
<= qp_thresh
&&
1816 (left_xy
[LTOP
] < 0 ||
1817 ((qp
+ h
->cur_pic
.qscale_table
[left_xy
[LTOP
]] + 1) >> 1) <= qp_thresh
) &&
1819 ((qp
+ h
->cur_pic
.qscale_table
[top_xy
] + 1) >> 1) <= qp_thresh
)) {
1820 if (!FRAME_MBAFF(h
))
1822 if ((left_xy
[LTOP
] < 0 ||
1823 ((qp
+ h
->cur_pic
.qscale_table
[left_xy
[LBOT
]] + 1) >> 1) <= qp_thresh
) &&
1824 (top_xy
< h
->mb_stride
||
1825 ((qp
+ h
->cur_pic
.qscale_table
[top_xy
- h
->mb_stride
] + 1) >> 1) <= qp_thresh
))
1830 top_type
= h
->cur_pic
.mb_type
[top_xy
];
1831 left_type
[LTOP
] = h
->cur_pic
.mb_type
[left_xy
[LTOP
]];
1832 left_type
[LBOT
] = h
->cur_pic
.mb_type
[left_xy
[LBOT
]];
1833 if (sl
->deblocking_filter
== 2) {
1834 if (h
->slice_table
[top_xy
] != sl
->slice_num
)
1836 if (h
->slice_table
[left_xy
[LBOT
]] != sl
->slice_num
)
1837 left_type
[LTOP
] = left_type
[LBOT
] = 0;
1839 if (h
->slice_table
[top_xy
] == 0xFFFF)
1841 if (h
->slice_table
[left_xy
[LBOT
]] == 0xFFFF)
1842 left_type
[LTOP
] = left_type
[LBOT
] = 0;
1844 sl
->top_type
= top_type
;
1845 sl
->left_type
[LTOP
] = left_type
[LTOP
];
1846 sl
->left_type
[LBOT
] = left_type
[LBOT
];
1848 if (IS_INTRA(mb_type
))
1851 fill_filter_caches_inter(h
, sl
, mb_type
, top_xy
, left_xy
,
1852 top_type
, left_type
, mb_xy
, 0);
1853 if (sl
->list_count
== 2)
1854 fill_filter_caches_inter(h
, sl
, mb_type
, top_xy
, left_xy
,
1855 top_type
, left_type
, mb_xy
, 1);
1857 nnz
= h
->non_zero_count
[mb_xy
];
1858 nnz_cache
= sl
->non_zero_count_cache
;
1859 AV_COPY32(&nnz_cache
[4 + 8 * 1], &nnz
[0]);
1860 AV_COPY32(&nnz_cache
[4 + 8 * 2], &nnz
[4]);
1861 AV_COPY32(&nnz_cache
[4 + 8 * 3], &nnz
[8]);
1862 AV_COPY32(&nnz_cache
[4 + 8 * 4], &nnz
[12]);
1863 sl
->cbp
= h
->cbp_table
[mb_xy
];
1866 nnz
= h
->non_zero_count
[top_xy
];
1867 AV_COPY32(&nnz_cache
[4 + 8 * 0], &nnz
[3 * 4]);
1870 if (left_type
[LTOP
]) {
1871 nnz
= h
->non_zero_count
[left_xy
[LTOP
]];
1872 nnz_cache
[3 + 8 * 1] = nnz
[3 + 0 * 4];
1873 nnz_cache
[3 + 8 * 2] = nnz
[3 + 1 * 4];
1874 nnz_cache
[3 + 8 * 3] = nnz
[3 + 2 * 4];
1875 nnz_cache
[3 + 8 * 4] = nnz
[3 + 3 * 4];
1878 /* CAVLC 8x8dct requires NNZ values for residual decoding that differ
1879 * from what the loop filter needs */
1880 if (!CABAC(h
) && h
->pps
.transform_8x8_mode
) {
1881 if (IS_8x8DCT(top_type
)) {
1882 nnz_cache
[4 + 8 * 0] =
1883 nnz_cache
[5 + 8 * 0] = (h
->cbp_table
[top_xy
] & 0x4000) >> 12;
1884 nnz_cache
[6 + 8 * 0] =
1885 nnz_cache
[7 + 8 * 0] = (h
->cbp_table
[top_xy
] & 0x8000) >> 12;
1887 if (IS_8x8DCT(left_type
[LTOP
])) {
1888 nnz_cache
[3 + 8 * 1] =
1889 nnz_cache
[3 + 8 * 2] = (h
->cbp_table
[left_xy
[LTOP
]] & 0x2000) >> 12; // FIXME check MBAFF
1891 if (IS_8x8DCT(left_type
[LBOT
])) {
1892 nnz_cache
[3 + 8 * 3] =
1893 nnz_cache
[3 + 8 * 4] = (h
->cbp_table
[left_xy
[LBOT
]] & 0x8000) >> 12; // FIXME check MBAFF
1896 if (IS_8x8DCT(mb_type
)) {
1897 nnz_cache
[scan8
[0]] =
1898 nnz_cache
[scan8
[1]] =
1899 nnz_cache
[scan8
[2]] =
1900 nnz_cache
[scan8
[3]] = (sl
->cbp
& 0x1000) >> 12;
1902 nnz_cache
[scan8
[0 + 4]] =
1903 nnz_cache
[scan8
[1 + 4]] =
1904 nnz_cache
[scan8
[2 + 4]] =
1905 nnz_cache
[scan8
[3 + 4]] = (sl
->cbp
& 0x2000) >> 12;
1907 nnz_cache
[scan8
[0 + 8]] =
1908 nnz_cache
[scan8
[1 + 8]] =
1909 nnz_cache
[scan8
[2 + 8]] =
1910 nnz_cache
[scan8
[3 + 8]] = (sl
->cbp
& 0x4000) >> 12;
1912 nnz_cache
[scan8
[0 + 12]] =
1913 nnz_cache
[scan8
[1 + 12]] =
1914 nnz_cache
[scan8
[2 + 12]] =
1915 nnz_cache
[scan8
[3 + 12]] = (sl
->cbp
& 0x8000) >> 12;
1922 static void loop_filter(const H264Context
*h
, H264SliceContext
*sl
, int start_x
, int end_x
)
1924 uint8_t *dest_y
, *dest_cb
, *dest_cr
;
1925 int linesize
, uvlinesize
, mb_x
, mb_y
;
1926 const int end_mb_y
= sl
->mb_y
+ FRAME_MBAFF(h
);
1927 const int old_slice_type
= sl
->slice_type
;
1928 const int pixel_shift
= h
->pixel_shift
;
1929 const int block_h
= 16 >> h
->chroma_y_shift
;
1931 if (sl
->deblocking_filter
) {
1932 for (mb_x
= start_x
; mb_x
< end_x
; mb_x
++)
1933 for (mb_y
= end_mb_y
- FRAME_MBAFF(h
); mb_y
<= end_mb_y
; mb_y
++) {
1935 mb_xy
= sl
->mb_xy
= mb_x
+ mb_y
* h
->mb_stride
;
1936 sl
->slice_num
= h
->slice_table
[mb_xy
];
1937 mb_type
= h
->cur_pic
.mb_type
[mb_xy
];
1938 sl
->list_count
= h
->list_counts
[mb_xy
];
1942 sl
->mb_field_decoding_flag
= !!IS_INTERLACED(mb_type
);
1946 dest_y
= h
->cur_pic
.f
->data
[0] +
1947 ((mb_x
<< pixel_shift
) + mb_y
* sl
->linesize
) * 16;
1948 dest_cb
= h
->cur_pic
.f
->data
[1] +
1949 (mb_x
<< pixel_shift
) * (8 << CHROMA444(h
)) +
1950 mb_y
* sl
->uvlinesize
* block_h
;
1951 dest_cr
= h
->cur_pic
.f
->data
[2] +
1952 (mb_x
<< pixel_shift
) * (8 << CHROMA444(h
)) +
1953 mb_y
* sl
->uvlinesize
* block_h
;
1954 // FIXME simplify above
1957 linesize
= sl
->mb_linesize
= sl
->linesize
* 2;
1958 uvlinesize
= sl
->mb_uvlinesize
= sl
->uvlinesize
* 2;
1959 if (mb_y
& 1) { // FIXME move out of this function?
1960 dest_y
-= sl
->linesize
* 15;
1961 dest_cb
-= sl
->uvlinesize
* (block_h
- 1);
1962 dest_cr
-= sl
->uvlinesize
* (block_h
- 1);
1965 linesize
= sl
->mb_linesize
= sl
->linesize
;
1966 uvlinesize
= sl
->mb_uvlinesize
= sl
->uvlinesize
;
1968 backup_mb_border(h
, sl
, dest_y
, dest_cb
, dest_cr
, linesize
,
1970 if (fill_filter_caches(h
, sl
, mb_type
))
1972 sl
->chroma_qp
[0] = get_chroma_qp(h
, 0, h
->cur_pic
.qscale_table
[mb_xy
]);
1973 sl
->chroma_qp
[1] = get_chroma_qp(h
, 1, h
->cur_pic
.qscale_table
[mb_xy
]);
1975 if (FRAME_MBAFF(h
)) {
1976 ff_h264_filter_mb(h
, sl
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
,
1977 linesize
, uvlinesize
);
1979 ff_h264_filter_mb_fast(h
, sl
, mb_x
, mb_y
, dest_y
, dest_cb
,
1980 dest_cr
, linesize
, uvlinesize
);
1984 sl
->slice_type
= old_slice_type
;
1986 sl
->mb_y
= end_mb_y
- FRAME_MBAFF(h
);
1987 sl
->chroma_qp
[0] = get_chroma_qp(h
, 0, sl
->qscale
);
1988 sl
->chroma_qp
[1] = get_chroma_qp(h
, 1, sl
->qscale
);
1991 static void predict_field_decoding_flag(const H264Context
*h
, H264SliceContext
*sl
)
1993 const int mb_xy
= sl
->mb_x
+ sl
->mb_y
* h
->mb_stride
;
1994 int mb_type
= (h
->slice_table
[mb_xy
- 1] == sl
->slice_num
) ?
1995 h
->cur_pic
.mb_type
[mb_xy
- 1] :
1996 (h
->slice_table
[mb_xy
- h
->mb_stride
] == sl
->slice_num
) ?
1997 h
->cur_pic
.mb_type
[mb_xy
- h
->mb_stride
] : 0;
1998 sl
->mb_mbaff
= sl
->mb_field_decoding_flag
= IS_INTERLACED(mb_type
) ?
1 : 0;
2002 * Draw edges and report progress for the last MB row.
2004 static void decode_finish_row(const H264Context
*h
, H264SliceContext
*sl
)
2006 int top
= 16 * (sl
->mb_y
>> FIELD_PICTURE(h
));
2007 int pic_height
= 16 * h
->mb_height
>> FIELD_PICTURE(h
);
2008 int height
= 16 << FRAME_MBAFF(h
);
2009 int deblock_border
= (16 + 4) << FRAME_MBAFF(h
);
2011 if (sl
->deblocking_filter
) {
2012 if ((top
+ height
) >= pic_height
)
2013 height
+= deblock_border
;
2014 top
-= deblock_border
;
2017 if (top
>= pic_height
|| (top
+ height
) < 0)
2020 height
= FFMIN(height
, pic_height
- top
);
2022 height
= top
+ height
;
2026 ff_h264_draw_horiz_band(h
, sl
, top
, height
);
2031 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, top
+ height
- 1,
2032 h
->picture_structure
== PICT_BOTTOM_FIELD
);
2035 static void er_add_slice(H264SliceContext
*sl
,
2036 int startx
, int starty
,
2037 int endx
, int endy
, int status
)
2039 #if CONFIG_ERROR_RESILIENCE
2040 ERContext
*er
= &sl
->er
;
2042 if (!sl
->h264
->enable_er
)
2045 er
->ref_count
= sl
->ref_count
[0];
2046 ff_er_add_slice(er
, startx
, starty
, endx
, endy
, status
);
2050 static int decode_slice(struct AVCodecContext
*avctx
, void *arg
)
2052 H264SliceContext
*sl
= arg
;
2053 const H264Context
*h
= sl
->h264
;
2054 int lf_x_start
= sl
->mb_x
;
2057 sl
->linesize
= h
->cur_pic_ptr
->f
->linesize
[0];
2058 sl
->uvlinesize
= h
->cur_pic_ptr
->f
->linesize
[1];
2060 ret
= alloc_scratch_buffers(sl
, sl
->linesize
);
2064 sl
->mb_skip_run
= -1;
2066 sl
->is_complex
= FRAME_MBAFF(h
) || h
->picture_structure
!= PICT_FRAME
||
2067 avctx
->codec_id
!= AV_CODEC_ID_H264
||
2068 (CONFIG_GRAY
&& (h
->flags
& CODEC_FLAG_GRAY
));
2072 align_get_bits(&sl
->gb
);
2075 ff_init_cabac_decoder(&sl
->cabac
,
2076 sl
->gb
.buffer
+ get_bits_count(&sl
->gb
) / 8,
2077 (get_bits_left(&sl
->gb
) + 7) / 8);
2079 ff_h264_init_cabac_states(h
, sl
);
2083 int ret
= ff_h264_decode_mb_cabac(h
, sl
);
2085 // STOP_TIMER("decode_mb_cabac")
2088 ff_h264_hl_decode_mb(h
, sl
);
2090 // FIXME optimal? or let mb_decode decode 16x32 ?
2091 if (ret
>= 0 && FRAME_MBAFF(h
)) {
2094 ret
= ff_h264_decode_mb_cabac(h
, sl
);
2097 ff_h264_hl_decode_mb(h
, sl
);
2100 eos
= get_cabac_terminate(&sl
->cabac
);
2102 if ((h
->workaround_bugs
& FF_BUG_TRUNCATED
) &&
2103 sl
->cabac
.bytestream
> sl
->cabac
.bytestream_end
+ 2) {
2104 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
, sl
->mb_x
- 1,
2105 sl
->mb_y
, ER_MB_END
);
2106 if (sl
->mb_x
>= lf_x_start
)
2107 loop_filter(h
, sl
, lf_x_start
, sl
->mb_x
+ 1);
2110 if (ret
< 0 || sl
->cabac
.bytestream
> sl
->cabac
.bytestream_end
+ 2) {
2111 av_log(h
->avctx
, AV_LOG_ERROR
,
2112 "error while decoding MB %d %d, bytestream %td\n",
2114 sl
->cabac
.bytestream_end
- sl
->cabac
.bytestream
);
2115 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
, sl
->mb_x
,
2116 sl
->mb_y
, ER_MB_ERROR
);
2117 return AVERROR_INVALIDDATA
;
2120 if (++sl
->mb_x
>= h
->mb_width
) {
2121 loop_filter(h
, sl
, lf_x_start
, sl
->mb_x
);
2122 sl
->mb_x
= lf_x_start
= 0;
2123 decode_finish_row(h
, sl
);
2125 if (FIELD_OR_MBAFF_PICTURE(h
)) {
2127 if (FRAME_MBAFF(h
) && sl
->mb_y
< h
->mb_height
)
2128 predict_field_decoding_flag(h
, sl
);
2132 if (eos
|| sl
->mb_y
>= h
->mb_height
) {
2133 ff_tlog(h
->avctx
, "slice end %d %d\n",
2134 get_bits_count(&sl
->gb
), sl
->gb
.size_in_bits
);
2135 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
, sl
->mb_x
- 1,
2136 sl
->mb_y
, ER_MB_END
);
2137 if (sl
->mb_x
> lf_x_start
)
2138 loop_filter(h
, sl
, lf_x_start
, sl
->mb_x
);
2144 int ret
= ff_h264_decode_mb_cavlc(h
, sl
);
2147 ff_h264_hl_decode_mb(h
, sl
);
2149 // FIXME optimal? or let mb_decode decode 16x32 ?
2150 if (ret
>= 0 && FRAME_MBAFF(h
)) {
2152 ret
= ff_h264_decode_mb_cavlc(h
, sl
);
2155 ff_h264_hl_decode_mb(h
, sl
);
2160 av_log(h
->avctx
, AV_LOG_ERROR
,
2161 "error while decoding MB %d %d\n", sl
->mb_x
, sl
->mb_y
);
2162 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
, sl
->mb_x
,
2163 sl
->mb_y
, ER_MB_ERROR
);
2167 if (++sl
->mb_x
>= h
->mb_width
) {
2168 loop_filter(h
, sl
, lf_x_start
, sl
->mb_x
);
2169 sl
->mb_x
= lf_x_start
= 0;
2170 decode_finish_row(h
, sl
);
2172 if (FIELD_OR_MBAFF_PICTURE(h
)) {
2174 if (FRAME_MBAFF(h
) && sl
->mb_y
< h
->mb_height
)
2175 predict_field_decoding_flag(h
, sl
);
2177 if (sl
->mb_y
>= h
->mb_height
) {
2178 ff_tlog(h
->avctx
, "slice end %d %d\n",
2179 get_bits_count(&sl
->gb
), sl
->gb
.size_in_bits
);
2181 if (get_bits_left(&sl
->gb
) == 0) {
2182 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
,
2183 sl
->mb_x
- 1, sl
->mb_y
, ER_MB_END
);
2187 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
,
2188 sl
->mb_x
- 1, sl
->mb_y
, ER_MB_END
);
2190 return AVERROR_INVALIDDATA
;
2195 if (get_bits_left(&sl
->gb
) <= 0 && sl
->mb_skip_run
<= 0) {
2196 ff_tlog(h
->avctx
, "slice end %d %d\n",
2197 get_bits_count(&sl
->gb
), sl
->gb
.size_in_bits
);
2199 if (get_bits_left(&sl
->gb
) == 0) {
2200 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
,
2201 sl
->mb_x
- 1, sl
->mb_y
, ER_MB_END
);
2202 if (sl
->mb_x
> lf_x_start
)
2203 loop_filter(h
, sl
, lf_x_start
, sl
->mb_x
);
2207 er_add_slice(sl
, sl
->resync_mb_x
, sl
->resync_mb_y
, sl
->mb_x
,
2208 sl
->mb_y
, ER_MB_ERROR
);
2210 return AVERROR_INVALIDDATA
;
2218 * Call decode_slice() for each context.
2220 * @param h h264 master context
2221 * @param context_count number of contexts to execute
2223 int ff_h264_execute_decode_slices(H264Context
*h
, unsigned context_count
)
2225 AVCodecContext
*const avctx
= h
->avctx
;
2226 H264SliceContext
*sl
;
2229 if (h
->avctx
->hwaccel
)
2231 if (context_count
== 1) {
2232 int ret
= decode_slice(avctx
, &h
->slice_ctx
[0]);
2233 h
->mb_y
= h
->slice_ctx
[0].mb_y
;
2236 for (i
= 1; i
< context_count
; i
++) {
2237 sl
= &h
->slice_ctx
[i
];
2238 sl
->er
.error_count
= 0;
2241 avctx
->execute(avctx
, decode_slice
, h
->slice_ctx
,
2242 NULL
, context_count
, sizeof(h
->slice_ctx
[0]));
2244 /* pull back stuff from slices to master context */
2245 sl
= &h
->slice_ctx
[context_count
- 1];
2247 for (i
= 1; i
< context_count
; i
++)
2248 h
->slice_ctx
[0].er
.error_count
+= h
->slice_ctx
[i
].er
.error_count
;