annotate ffmpeg/libavcodec/h264.c @ 10:6840f77b83aa

commit
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Sun, 21 Apr 2013 10:55:35 +0200
parents
children
rev   line source
yading@10 1 /*
yading@10 2 * H.26L/H.264/AVC/JVT/14496-10/... decoder
yading@10 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 /**
yading@10 23 * @file
yading@10 24 * H.264 / AVC / MPEG4 part10 codec.
yading@10 25 * @author Michael Niedermayer <michaelni@gmx.at>
yading@10 26 */
yading@10 27
yading@10 28 #define UNCHECKED_BITSTREAM_READER 1
yading@10 29
yading@10 30 #include "libavutil/imgutils.h"
yading@10 31 #include "libavutil/opt.h"
yading@10 32 #include "internal.h"
yading@10 33 #include "cabac.h"
yading@10 34 #include "cabac_functions.h"
yading@10 35 #include "dsputil.h"
yading@10 36 #include "error_resilience.h"
yading@10 37 #include "avcodec.h"
yading@10 38 #include "mpegvideo.h"
yading@10 39 #include "h264.h"
yading@10 40 #include "h264data.h"
yading@10 41 #include "h264chroma.h"
yading@10 42 #include "h264_mvpred.h"
yading@10 43 #include "golomb.h"
yading@10 44 #include "mathops.h"
yading@10 45 #include "rectangle.h"
yading@10 46 #include "svq3.h"
yading@10 47 #include "thread.h"
yading@10 48 #include "vdpau_internal.h"
yading@10 49 #include "libavutil/avassert.h"
yading@10 50
yading@10 51 // #undef NDEBUG
yading@10 52 #include <assert.h>
yading@10 53
yading@10 54 const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 };
yading@10 55
yading@10 56 static const uint8_t rem6[QP_MAX_NUM + 1] = {
yading@10 57 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
yading@10 58 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
yading@10 59 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
yading@10 60 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
yading@10 61 0, 1, 2, 3,
yading@10 62 };
yading@10 63
yading@10 64 static const uint8_t div6[QP_MAX_NUM + 1] = {
yading@10 65 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
yading@10 66 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
yading@10 67 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10,
yading@10 68 10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13, 13, 13, 13,
yading@10 69 14,14,14,14,
yading@10 70 };
yading@10 71
yading@10 72 static const enum AVPixelFormat h264_hwaccel_pixfmt_list_420[] = {
yading@10 73 #if CONFIG_H264_DXVA2_HWACCEL
yading@10 74 AV_PIX_FMT_DXVA2_VLD,
yading@10 75 #endif
yading@10 76 #if CONFIG_H264_VAAPI_HWACCEL
yading@10 77 AV_PIX_FMT_VAAPI_VLD,
yading@10 78 #endif
yading@10 79 #if CONFIG_H264_VDA_HWACCEL
yading@10 80 AV_PIX_FMT_VDA_VLD,
yading@10 81 #endif
yading@10 82 #if CONFIG_H264_VDPAU_HWACCEL
yading@10 83 AV_PIX_FMT_VDPAU,
yading@10 84 #endif
yading@10 85 AV_PIX_FMT_YUV420P,
yading@10 86 AV_PIX_FMT_NONE
yading@10 87 };
yading@10 88
yading@10 89 static const enum AVPixelFormat h264_hwaccel_pixfmt_list_jpeg_420[] = {
yading@10 90 #if CONFIG_H264_DXVA2_HWACCEL
yading@10 91 AV_PIX_FMT_DXVA2_VLD,
yading@10 92 #endif
yading@10 93 #if CONFIG_H264_VAAPI_HWACCEL
yading@10 94 AV_PIX_FMT_VAAPI_VLD,
yading@10 95 #endif
yading@10 96 #if CONFIG_H264_VDA_HWACCEL
yading@10 97 AV_PIX_FMT_VDA_VLD,
yading@10 98 #endif
yading@10 99 #if CONFIG_H264_VDPAU_HWACCEL
yading@10 100 AV_PIX_FMT_VDPAU,
yading@10 101 #endif
yading@10 102 AV_PIX_FMT_YUVJ420P,
yading@10 103 AV_PIX_FMT_NONE
yading@10 104 };
yading@10 105
yading@10 106 int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx)
yading@10 107 {
yading@10 108 H264Context *h = avctx->priv_data;
yading@10 109 return h ? h->sps.num_reorder_frames : 0;
yading@10 110 }
yading@10 111
yading@10 112 static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
yading@10 113 int (*mv)[2][4][2],
yading@10 114 int mb_x, int mb_y, int mb_intra, int mb_skipped)
yading@10 115 {
yading@10 116 H264Context *h = opaque;
yading@10 117
yading@10 118 h->mb_x = mb_x;
yading@10 119 h->mb_y = mb_y;
yading@10 120 h->mb_xy = mb_x + mb_y * h->mb_stride;
yading@10 121 memset(h->non_zero_count_cache, 0, sizeof(h->non_zero_count_cache));
yading@10 122 av_assert1(ref >= 0);
yading@10 123 /* FIXME: It is possible albeit uncommon that slice references
yading@10 124 * differ between slices. We take the easy approach and ignore
yading@10 125 * it for now. If this turns out to have any relevance in
yading@10 126 * practice then correct remapping should be added. */
yading@10 127 if (ref >= h->ref_count[0])
yading@10 128 ref = 0;
yading@10 129 if (!h->ref_list[0][ref].f.data[0]) {
yading@10 130 av_log(h->avctx, AV_LOG_DEBUG, "Reference not available for error concealing\n");
yading@10 131 ref = 0;
yading@10 132 }
yading@10 133 if ((h->ref_list[0][ref].reference&3) != 3) {
yading@10 134 av_log(h->avctx, AV_LOG_DEBUG, "Reference invalid\n");
yading@10 135 return;
yading@10 136 }
yading@10 137 fill_rectangle(&h->cur_pic.ref_index[0][4 * h->mb_xy],
yading@10 138 2, 2, 2, ref, 1);
yading@10 139 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1);
yading@10 140 fill_rectangle(h->mv_cache[0][scan8[0]], 4, 4, 8,
yading@10 141 pack16to32((*mv)[0][0][0], (*mv)[0][0][1]), 4);
yading@10 142 h->mb_mbaff =
yading@10 143 h->mb_field_decoding_flag = 0;
yading@10 144 ff_h264_hl_decode_mb(h);
yading@10 145 }
yading@10 146
yading@10 147 void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
yading@10 148 {
yading@10 149 AVCodecContext *avctx = h->avctx;
yading@10 150 Picture *cur = &h->cur_pic;
yading@10 151 Picture *last = h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL;
yading@10 152 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
yading@10 153 int vshift = desc->log2_chroma_h;
yading@10 154 const int field_pic = h->picture_structure != PICT_FRAME;
yading@10 155 if (field_pic) {
yading@10 156 height <<= 1;
yading@10 157 y <<= 1;
yading@10 158 }
yading@10 159
yading@10 160 height = FFMIN(height, avctx->height - y);
yading@10 161
yading@10 162 if (field_pic && h->first_field && !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD))
yading@10 163 return;
yading@10 164
yading@10 165 if (avctx->draw_horiz_band) {
yading@10 166 AVFrame *src;
yading@10 167 int offset[AV_NUM_DATA_POINTERS];
yading@10 168 int i;
yading@10 169
yading@10 170 if (cur->f.pict_type == AV_PICTURE_TYPE_B || h->low_delay ||
yading@10 171 (avctx->slice_flags & SLICE_FLAG_CODED_ORDER))
yading@10 172 src = &cur->f;
yading@10 173 else if (last)
yading@10 174 src = &last->f;
yading@10 175 else
yading@10 176 return;
yading@10 177
yading@10 178 offset[0] = y * src->linesize[0];
yading@10 179 offset[1] =
yading@10 180 offset[2] = (y >> vshift) * src->linesize[1];
yading@10 181 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
yading@10 182 offset[i] = 0;
yading@10 183
yading@10 184 emms_c();
yading@10 185
yading@10 186 avctx->draw_horiz_band(avctx, src, offset,
yading@10 187 y, h->picture_structure, height);
yading@10 188 }
yading@10 189 }
yading@10 190
yading@10 191 static void unref_picture(H264Context *h, Picture *pic)
yading@10 192 {
yading@10 193 int off = offsetof(Picture, tf) + sizeof(pic->tf);
yading@10 194 int i;
yading@10 195
yading@10 196 if (!pic->f.data[0])
yading@10 197 return;
yading@10 198
yading@10 199 ff_thread_release_buffer(h->avctx, &pic->tf);
yading@10 200 av_buffer_unref(&pic->hwaccel_priv_buf);
yading@10 201
yading@10 202 av_buffer_unref(&pic->qscale_table_buf);
yading@10 203 av_buffer_unref(&pic->mb_type_buf);
yading@10 204 for (i = 0; i < 2; i++) {
yading@10 205 av_buffer_unref(&pic->motion_val_buf[i]);
yading@10 206 av_buffer_unref(&pic->ref_index_buf[i]);
yading@10 207 }
yading@10 208
yading@10 209 memset((uint8_t*)pic + off, 0, sizeof(*pic) - off);
yading@10 210 }
yading@10 211
yading@10 212 static void release_unused_pictures(H264Context *h, int remove_current)
yading@10 213 {
yading@10 214 int i;
yading@10 215
yading@10 216 /* release non reference frames */
yading@10 217 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
yading@10 218 if (h->DPB[i].f.data[0] && !h->DPB[i].reference &&
yading@10 219 (remove_current || &h->DPB[i] != h->cur_pic_ptr)) {
yading@10 220 unref_picture(h, &h->DPB[i]);
yading@10 221 }
yading@10 222 }
yading@10 223 }
yading@10 224
yading@10 225 static int ref_picture(H264Context *h, Picture *dst, Picture *src)
yading@10 226 {
yading@10 227 int ret, i;
yading@10 228
yading@10 229 av_assert0(!dst->f.buf[0]);
yading@10 230 av_assert0(src->f.buf[0]);
yading@10 231
yading@10 232 src->tf.f = &src->f;
yading@10 233 dst->tf.f = &dst->f;
yading@10 234 ret = ff_thread_ref_frame(&dst->tf, &src->tf);
yading@10 235 if (ret < 0)
yading@10 236 goto fail;
yading@10 237
yading@10 238
yading@10 239 dst->qscale_table_buf = av_buffer_ref(src->qscale_table_buf);
yading@10 240 dst->mb_type_buf = av_buffer_ref(src->mb_type_buf);
yading@10 241 if (!dst->qscale_table_buf || !dst->mb_type_buf)
yading@10 242 goto fail;
yading@10 243 dst->qscale_table = src->qscale_table;
yading@10 244 dst->mb_type = src->mb_type;
yading@10 245
yading@10 246 for (i = 0; i < 2; i ++) {
yading@10 247 dst->motion_val_buf[i] = av_buffer_ref(src->motion_val_buf[i]);
yading@10 248 dst->ref_index_buf[i] = av_buffer_ref(src->ref_index_buf[i]);
yading@10 249 if (!dst->motion_val_buf[i] || !dst->ref_index_buf[i])
yading@10 250 goto fail;
yading@10 251 dst->motion_val[i] = src->motion_val[i];
yading@10 252 dst->ref_index[i] = src->ref_index[i];
yading@10 253 }
yading@10 254
yading@10 255 if (src->hwaccel_picture_private) {
yading@10 256 dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf);
yading@10 257 if (!dst->hwaccel_priv_buf)
yading@10 258 goto fail;
yading@10 259 dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data;
yading@10 260 }
yading@10 261
yading@10 262 for (i = 0; i < 2; i++)
yading@10 263 dst->field_poc[i] = src->field_poc[i];
yading@10 264
yading@10 265 memcpy(dst->ref_poc, src->ref_poc, sizeof(src->ref_poc));
yading@10 266 memcpy(dst->ref_count, src->ref_count, sizeof(src->ref_count));
yading@10 267
yading@10 268 dst->poc = src->poc;
yading@10 269 dst->frame_num = src->frame_num;
yading@10 270 dst->mmco_reset = src->mmco_reset;
yading@10 271 dst->pic_id = src->pic_id;
yading@10 272 dst->long_ref = src->long_ref;
yading@10 273 dst->mbaff = src->mbaff;
yading@10 274 dst->field_picture = src->field_picture;
yading@10 275 dst->needs_realloc = src->needs_realloc;
yading@10 276 dst->reference = src->reference;
yading@10 277 dst->sync = src->sync;
yading@10 278
yading@10 279 return 0;
yading@10 280 fail:
yading@10 281 unref_picture(h, dst);
yading@10 282 return ret;
yading@10 283 }
yading@10 284
yading@10 285
yading@10 286 static int alloc_scratch_buffers(H264Context *h, int linesize)
yading@10 287 {
yading@10 288 int alloc_size = FFALIGN(FFABS(linesize) + 32, 32);
yading@10 289
yading@10 290 if (h->bipred_scratchpad)
yading@10 291 return 0;
yading@10 292
yading@10 293 h->bipred_scratchpad = av_malloc(16 * 6 * alloc_size);
yading@10 294 // edge emu needs blocksize + filter length - 1
yading@10 295 // (= 21x21 for h264)
yading@10 296 h->edge_emu_buffer = av_mallocz(alloc_size * 2 * 21);
yading@10 297 h->me.scratchpad = av_mallocz(alloc_size * 2 * 16 * 2);
yading@10 298
yading@10 299 if (!h->bipred_scratchpad || !h->edge_emu_buffer || !h->me.scratchpad) {
yading@10 300 av_freep(&h->bipred_scratchpad);
yading@10 301 av_freep(&h->edge_emu_buffer);
yading@10 302 av_freep(&h->me.scratchpad);
yading@10 303 return AVERROR(ENOMEM);
yading@10 304 }
yading@10 305
yading@10 306 h->me.temp = h->me.scratchpad;
yading@10 307
yading@10 308 return 0;
yading@10 309 }
yading@10 310
yading@10 311 static int init_table_pools(H264Context *h)
yading@10 312 {
yading@10 313 const int big_mb_num = h->mb_stride * (h->mb_height + 1) + 1;
yading@10 314 const int mb_array_size = h->mb_stride * h->mb_height;
yading@10 315 const int b4_stride = h->mb_width * 4 + 1;
yading@10 316 const int b4_array_size = b4_stride * h->mb_height * 4;
yading@10 317
yading@10 318 h->qscale_table_pool = av_buffer_pool_init(big_mb_num + h->mb_stride,
yading@10 319 av_buffer_allocz);
yading@10 320 h->mb_type_pool = av_buffer_pool_init((big_mb_num + h->mb_stride) *
yading@10 321 sizeof(uint32_t), av_buffer_allocz);
yading@10 322 h->motion_val_pool = av_buffer_pool_init(2 * (b4_array_size + 4) *
yading@10 323 sizeof(int16_t), av_buffer_allocz);
yading@10 324 h->ref_index_pool = av_buffer_pool_init(4 * mb_array_size, av_buffer_allocz);
yading@10 325
yading@10 326 if (!h->qscale_table_pool || !h->mb_type_pool || !h->motion_val_pool ||
yading@10 327 !h->ref_index_pool) {
yading@10 328 av_buffer_pool_uninit(&h->qscale_table_pool);
yading@10 329 av_buffer_pool_uninit(&h->mb_type_pool);
yading@10 330 av_buffer_pool_uninit(&h->motion_val_pool);
yading@10 331 av_buffer_pool_uninit(&h->ref_index_pool);
yading@10 332 return AVERROR(ENOMEM);
yading@10 333 }
yading@10 334
yading@10 335 return 0;
yading@10 336 }
yading@10 337
yading@10 338 static int alloc_picture(H264Context *h, Picture *pic)
yading@10 339 {
yading@10 340 int i, ret = 0;
yading@10 341
yading@10 342 av_assert0(!pic->f.data[0]);
yading@10 343
yading@10 344 pic->tf.f = &pic->f;
yading@10 345 ret = ff_thread_get_buffer(h->avctx, &pic->tf, pic->reference ?
yading@10 346 AV_GET_BUFFER_FLAG_REF : 0);
yading@10 347 if (ret < 0)
yading@10 348 goto fail;
yading@10 349
yading@10 350 h->linesize = pic->f.linesize[0];
yading@10 351 h->uvlinesize = pic->f.linesize[1];
yading@10 352
yading@10 353 if (h->avctx->hwaccel) {
yading@10 354 const AVHWAccel *hwaccel = h->avctx->hwaccel;
yading@10 355 av_assert0(!pic->hwaccel_picture_private);
yading@10 356 if (hwaccel->priv_data_size) {
yading@10 357 pic->hwaccel_priv_buf = av_buffer_allocz(hwaccel->priv_data_size);
yading@10 358 if (!pic->hwaccel_priv_buf)
yading@10 359 return AVERROR(ENOMEM);
yading@10 360 pic->hwaccel_picture_private = pic->hwaccel_priv_buf->data;
yading@10 361 }
yading@10 362 }
yading@10 363
yading@10 364 if (!h->qscale_table_pool) {
yading@10 365 ret = init_table_pools(h);
yading@10 366 if (ret < 0)
yading@10 367 goto fail;
yading@10 368 }
yading@10 369
yading@10 370 pic->qscale_table_buf = av_buffer_pool_get(h->qscale_table_pool);
yading@10 371 pic->mb_type_buf = av_buffer_pool_get(h->mb_type_pool);
yading@10 372 if (!pic->qscale_table_buf || !pic->mb_type_buf)
yading@10 373 goto fail;
yading@10 374
yading@10 375 pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * h->mb_stride + 1;
yading@10 376 pic->qscale_table = pic->qscale_table_buf->data + 2 * h->mb_stride + 1;
yading@10 377
yading@10 378 for (i = 0; i < 2; i++) {
yading@10 379 pic->motion_val_buf[i] = av_buffer_pool_get(h->motion_val_pool);
yading@10 380 pic->ref_index_buf[i] = av_buffer_pool_get(h->ref_index_pool);
yading@10 381 if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i])
yading@10 382 goto fail;
yading@10 383
yading@10 384 pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
yading@10 385 pic->ref_index[i] = pic->ref_index_buf[i]->data;
yading@10 386 }
yading@10 387
yading@10 388 return 0;
yading@10 389 fail:
yading@10 390 unref_picture(h, pic);
yading@10 391 return (ret < 0) ? ret : AVERROR(ENOMEM);
yading@10 392 }
yading@10 393
yading@10 394 static inline int pic_is_unused(H264Context *h, Picture *pic)
yading@10 395 {
yading@10 396 if (pic->f.data[0] == NULL)
yading@10 397 return 1;
yading@10 398 if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF))
yading@10 399 return 1;
yading@10 400 return 0;
yading@10 401 }
yading@10 402
yading@10 403 static int find_unused_picture(H264Context *h)
yading@10 404 {
yading@10 405 int i;
yading@10 406
yading@10 407 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
yading@10 408 if (pic_is_unused(h, &h->DPB[i]))
yading@10 409 break;
yading@10 410 }
yading@10 411 if (i == MAX_PICTURE_COUNT)
yading@10 412 return AVERROR_INVALIDDATA;
yading@10 413
yading@10 414 if (h->DPB[i].needs_realloc) {
yading@10 415 h->DPB[i].needs_realloc = 0;
yading@10 416 unref_picture(h, &h->DPB[i]);
yading@10 417 }
yading@10 418
yading@10 419 return i;
yading@10 420 }
yading@10 421
yading@10 422 /**
yading@10 423 * Check if the top & left blocks are available if needed and
yading@10 424 * change the dc mode so it only uses the available blocks.
yading@10 425 */
yading@10 426 int ff_h264_check_intra4x4_pred_mode(H264Context *h)
yading@10 427 {
yading@10 428 static const int8_t top[12] = {
yading@10 429 -1, 0, LEFT_DC_PRED, -1, -1, -1, -1, -1, 0
yading@10 430 };
yading@10 431 static const int8_t left[12] = {
yading@10 432 0, -1, TOP_DC_PRED, 0, -1, -1, -1, 0, -1, DC_128_PRED
yading@10 433 };
yading@10 434 int i;
yading@10 435
yading@10 436 if (!(h->top_samples_available & 0x8000)) {
yading@10 437 for (i = 0; i < 4; i++) {
yading@10 438 int status = top[h->intra4x4_pred_mode_cache[scan8[0] + i]];
yading@10 439 if (status < 0) {
yading@10 440 av_log(h->avctx, AV_LOG_ERROR,
yading@10 441 "top block unavailable for requested intra4x4 mode %d at %d %d\n",
yading@10 442 status, h->mb_x, h->mb_y);
yading@10 443 return -1;
yading@10 444 } else if (status) {
yading@10 445 h->intra4x4_pred_mode_cache[scan8[0] + i] = status;
yading@10 446 }
yading@10 447 }
yading@10 448 }
yading@10 449
yading@10 450 if ((h->left_samples_available & 0x8888) != 0x8888) {
yading@10 451 static const int mask[4] = { 0x8000, 0x2000, 0x80, 0x20 };
yading@10 452 for (i = 0; i < 4; i++)
yading@10 453 if (!(h->left_samples_available & mask[i])) {
yading@10 454 int status = left[h->intra4x4_pred_mode_cache[scan8[0] + 8 * i]];
yading@10 455 if (status < 0) {
yading@10 456 av_log(h->avctx, AV_LOG_ERROR,
yading@10 457 "left block unavailable for requested intra4x4 mode %d at %d %d\n",
yading@10 458 status, h->mb_x, h->mb_y);
yading@10 459 return -1;
yading@10 460 } else if (status) {
yading@10 461 h->intra4x4_pred_mode_cache[scan8[0] + 8 * i] = status;
yading@10 462 }
yading@10 463 }
yading@10 464 }
yading@10 465
yading@10 466 return 0;
yading@10 467 } // FIXME cleanup like ff_h264_check_intra_pred_mode
yading@10 468
yading@10 469 /**
yading@10 470 * Check if the top & left blocks are available if needed and
yading@10 471 * change the dc mode so it only uses the available blocks.
yading@10 472 */
yading@10 473 int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma)
yading@10 474 {
yading@10 475 static const int8_t top[7] = { LEFT_DC_PRED8x8, 1, -1, -1 };
yading@10 476 static const int8_t left[7] = { TOP_DC_PRED8x8, -1, 2, -1, DC_128_PRED8x8 };
yading@10 477
yading@10 478 if (mode > 6U) {
yading@10 479 av_log(h->avctx, AV_LOG_ERROR,
yading@10 480 "out of range intra chroma pred mode at %d %d\n",
yading@10 481 h->mb_x, h->mb_y);
yading@10 482 return -1;
yading@10 483 }
yading@10 484
yading@10 485 if (!(h->top_samples_available & 0x8000)) {
yading@10 486 mode = top[mode];
yading@10 487 if (mode < 0) {
yading@10 488 av_log(h->avctx, AV_LOG_ERROR,
yading@10 489 "top block unavailable for requested intra mode at %d %d\n",
yading@10 490 h->mb_x, h->mb_y);
yading@10 491 return -1;
yading@10 492 }
yading@10 493 }
yading@10 494
yading@10 495 if ((h->left_samples_available & 0x8080) != 0x8080) {
yading@10 496 mode = left[mode];
yading@10 497 if (is_chroma && (h->left_samples_available & 0x8080)) {
yading@10 498 // mad cow disease mode, aka MBAFF + constrained_intra_pred
yading@10 499 mode = ALZHEIMER_DC_L0T_PRED8x8 +
yading@10 500 (!(h->left_samples_available & 0x8000)) +
yading@10 501 2 * (mode == DC_128_PRED8x8);
yading@10 502 }
yading@10 503 if (mode < 0) {
yading@10 504 av_log(h->avctx, AV_LOG_ERROR,
yading@10 505 "left block unavailable for requested intra mode at %d %d\n",
yading@10 506 h->mb_x, h->mb_y);
yading@10 507 return -1;
yading@10 508 }
yading@10 509 }
yading@10 510
yading@10 511 return mode;
yading@10 512 }
yading@10 513
yading@10 514 const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
yading@10 515 int *dst_length, int *consumed, int length)
yading@10 516 {
yading@10 517 int i, si, di;
yading@10 518 uint8_t *dst;
yading@10 519 int bufidx;
yading@10 520
yading@10 521 // src[0]&0x80; // forbidden bit
yading@10 522 h->nal_ref_idc = src[0] >> 5;
yading@10 523 h->nal_unit_type = src[0] & 0x1F;
yading@10 524
yading@10 525 src++;
yading@10 526 length--;
yading@10 527
yading@10 528 #define STARTCODE_TEST \
yading@10 529 if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
yading@10 530 if (src[i + 2] != 3) { \
yading@10 531 /* startcode, so we must be past the end */ \
yading@10 532 length = i; \
yading@10 533 } \
yading@10 534 break; \
yading@10 535 }
yading@10 536 #if HAVE_FAST_UNALIGNED
yading@10 537 #define FIND_FIRST_ZERO \
yading@10 538 if (i > 0 && !src[i]) \
yading@10 539 i--; \
yading@10 540 while (src[i]) \
yading@10 541 i++
yading@10 542 #if HAVE_FAST_64BIT
yading@10 543 for (i = 0; i + 1 < length; i += 9) {
yading@10 544 if (!((~AV_RN64A(src + i) &
yading@10 545 (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
yading@10 546 0x8000800080008080ULL))
yading@10 547 continue;
yading@10 548 FIND_FIRST_ZERO;
yading@10 549 STARTCODE_TEST;
yading@10 550 i -= 7;
yading@10 551 }
yading@10 552 #else
yading@10 553 for (i = 0; i + 1 < length; i += 5) {
yading@10 554 if (!((~AV_RN32A(src + i) &
yading@10 555 (AV_RN32A(src + i) - 0x01000101U)) &
yading@10 556 0x80008080U))
yading@10 557 continue;
yading@10 558 FIND_FIRST_ZERO;
yading@10 559 STARTCODE_TEST;
yading@10 560 i -= 3;
yading@10 561 }
yading@10 562 #endif
yading@10 563 #else
yading@10 564 for (i = 0; i + 1 < length; i += 2) {
yading@10 565 if (src[i])
yading@10 566 continue;
yading@10 567 if (i > 0 && src[i - 1] == 0)
yading@10 568 i--;
yading@10 569 STARTCODE_TEST;
yading@10 570 }
yading@10 571 #endif
yading@10 572
yading@10 573 // use second escape buffer for inter data
yading@10 574 bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0;
yading@10 575
yading@10 576 si = h->rbsp_buffer_size[bufidx];
yading@10 577 av_fast_padded_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+MAX_MBPAIR_SIZE);
yading@10 578 dst = h->rbsp_buffer[bufidx];
yading@10 579
yading@10 580 if (dst == NULL)
yading@10 581 return NULL;
yading@10 582
yading@10 583 if(i>=length-1){ //no escaped 0
yading@10 584 *dst_length= length;
yading@10 585 *consumed= length+1; //+1 for the header
yading@10 586 if(h->avctx->flags2 & CODEC_FLAG2_FAST){
yading@10 587 return src;
yading@10 588 }else{
yading@10 589 memcpy(dst, src, length);
yading@10 590 return dst;
yading@10 591 }
yading@10 592 }
yading@10 593
yading@10 594 memcpy(dst, src, i);
yading@10 595 si = di = i;
yading@10 596 while (si + 2 < length) {
yading@10 597 // remove escapes (very rare 1:2^22)
yading@10 598 if (src[si + 2] > 3) {
yading@10 599 dst[di++] = src[si++];
yading@10 600 dst[di++] = src[si++];
yading@10 601 } else if (src[si] == 0 && src[si + 1] == 0) {
yading@10 602 if (src[si + 2] == 3) { // escape
yading@10 603 dst[di++] = 0;
yading@10 604 dst[di++] = 0;
yading@10 605 si += 3;
yading@10 606 continue;
yading@10 607 } else // next start code
yading@10 608 goto nsc;
yading@10 609 }
yading@10 610
yading@10 611 dst[di++] = src[si++];
yading@10 612 }
yading@10 613 while (si < length)
yading@10 614 dst[di++] = src[si++];
yading@10 615 nsc:
yading@10 616
yading@10 617 memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
yading@10 618
yading@10 619 *dst_length = di;
yading@10 620 *consumed = si + 1; // +1 for the header
yading@10 621 /* FIXME store exact number of bits in the getbitcontext
yading@10 622 * (it is needed for decoding) */
yading@10 623 return dst;
yading@10 624 }
yading@10 625
yading@10 626 /**
yading@10 627 * Identify the exact end of the bitstream
yading@10 628 * @return the length of the trailing, or 0 if damaged
yading@10 629 */
yading@10 630 static int decode_rbsp_trailing(H264Context *h, const uint8_t *src)
yading@10 631 {
yading@10 632 int v = *src;
yading@10 633 int r;
yading@10 634
yading@10 635 tprintf(h->avctx, "rbsp trailing %X\n", v);
yading@10 636
yading@10 637 for (r = 1; r < 9; r++) {
yading@10 638 if (v & 1)
yading@10 639 return r;
yading@10 640 v >>= 1;
yading@10 641 }
yading@10 642 return 0;
yading@10 643 }
yading@10 644
yading@10 645 static inline int get_lowest_part_list_y(H264Context *h, Picture *pic, int n,
yading@10 646 int height, int y_offset, int list)
yading@10 647 {
yading@10 648 int raw_my = h->mv_cache[list][scan8[n]][1];
yading@10 649 int filter_height_down = (raw_my & 3) ? 3 : 0;
yading@10 650 int full_my = (raw_my >> 2) + y_offset;
yading@10 651 int bottom = full_my + filter_height_down + height;
yading@10 652
yading@10 653 av_assert2(height >= 0);
yading@10 654
yading@10 655 return FFMAX(0, bottom);
yading@10 656 }
yading@10 657
yading@10 658 static inline void get_lowest_part_y(H264Context *h, int refs[2][48], int n,
yading@10 659 int height, int y_offset, int list0,
yading@10 660 int list1, int *nrefs)
yading@10 661 {
yading@10 662 int my;
yading@10 663
yading@10 664 y_offset += 16 * (h->mb_y >> MB_FIELD(h));
yading@10 665
yading@10 666 if (list0) {
yading@10 667 int ref_n = h->ref_cache[0][scan8[n]];
yading@10 668 Picture *ref = &h->ref_list[0][ref_n];
yading@10 669
yading@10 670 // Error resilience puts the current picture in the ref list.
yading@10 671 // Don't try to wait on these as it will cause a deadlock.
yading@10 672 // Fields can wait on each other, though.
yading@10 673 if (ref->tf.progress->data != h->cur_pic.tf.progress->data ||
yading@10 674 (ref->reference & 3) != h->picture_structure) {
yading@10 675 my = get_lowest_part_list_y(h, ref, n, height, y_offset, 0);
yading@10 676 if (refs[0][ref_n] < 0)
yading@10 677 nrefs[0] += 1;
yading@10 678 refs[0][ref_n] = FFMAX(refs[0][ref_n], my);
yading@10 679 }
yading@10 680 }
yading@10 681
yading@10 682 if (list1) {
yading@10 683 int ref_n = h->ref_cache[1][scan8[n]];
yading@10 684 Picture *ref = &h->ref_list[1][ref_n];
yading@10 685
yading@10 686 if (ref->tf.progress->data != h->cur_pic.tf.progress->data ||
yading@10 687 (ref->reference & 3) != h->picture_structure) {
yading@10 688 my = get_lowest_part_list_y(h, ref, n, height, y_offset, 1);
yading@10 689 if (refs[1][ref_n] < 0)
yading@10 690 nrefs[1] += 1;
yading@10 691 refs[1][ref_n] = FFMAX(refs[1][ref_n], my);
yading@10 692 }
yading@10 693 }
yading@10 694 }
yading@10 695
yading@10 696 /**
yading@10 697 * Wait until all reference frames are available for MC operations.
yading@10 698 *
yading@10 699 * @param h the H264 context
yading@10 700 */
yading@10 701 static void await_references(H264Context *h)
yading@10 702 {
yading@10 703 const int mb_xy = h->mb_xy;
yading@10 704 const int mb_type = h->cur_pic.mb_type[mb_xy];
yading@10 705 int refs[2][48];
yading@10 706 int nrefs[2] = { 0 };
yading@10 707 int ref, list;
yading@10 708
yading@10 709 memset(refs, -1, sizeof(refs));
yading@10 710
yading@10 711 if (IS_16X16(mb_type)) {
yading@10 712 get_lowest_part_y(h, refs, 0, 16, 0,
yading@10 713 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), nrefs);
yading@10 714 } else if (IS_16X8(mb_type)) {
yading@10 715 get_lowest_part_y(h, refs, 0, 8, 0,
yading@10 716 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), nrefs);
yading@10 717 get_lowest_part_y(h, refs, 8, 8, 8,
yading@10 718 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1), nrefs);
yading@10 719 } else if (IS_8X16(mb_type)) {
yading@10 720 get_lowest_part_y(h, refs, 0, 16, 0,
yading@10 721 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), nrefs);
yading@10 722 get_lowest_part_y(h, refs, 4, 16, 0,
yading@10 723 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1), nrefs);
yading@10 724 } else {
yading@10 725 int i;
yading@10 726
yading@10 727 av_assert2(IS_8X8(mb_type));
yading@10 728
yading@10 729 for (i = 0; i < 4; i++) {
yading@10 730 const int sub_mb_type = h->sub_mb_type[i];
yading@10 731 const int n = 4 * i;
yading@10 732 int y_offset = (i & 2) << 2;
yading@10 733
yading@10 734 if (IS_SUB_8X8(sub_mb_type)) {
yading@10 735 get_lowest_part_y(h, refs, n, 8, y_offset,
yading@10 736 IS_DIR(sub_mb_type, 0, 0),
yading@10 737 IS_DIR(sub_mb_type, 0, 1),
yading@10 738 nrefs);
yading@10 739 } else if (IS_SUB_8X4(sub_mb_type)) {
yading@10 740 get_lowest_part_y(h, refs, n, 4, y_offset,
yading@10 741 IS_DIR(sub_mb_type, 0, 0),
yading@10 742 IS_DIR(sub_mb_type, 0, 1),
yading@10 743 nrefs);
yading@10 744 get_lowest_part_y(h, refs, n + 2, 4, y_offset + 4,
yading@10 745 IS_DIR(sub_mb_type, 0, 0),
yading@10 746 IS_DIR(sub_mb_type, 0, 1),
yading@10 747 nrefs);
yading@10 748 } else if (IS_SUB_4X8(sub_mb_type)) {
yading@10 749 get_lowest_part_y(h, refs, n, 8, y_offset,
yading@10 750 IS_DIR(sub_mb_type, 0, 0),
yading@10 751 IS_DIR(sub_mb_type, 0, 1),
yading@10 752 nrefs);
yading@10 753 get_lowest_part_y(h, refs, n + 1, 8, y_offset,
yading@10 754 IS_DIR(sub_mb_type, 0, 0),
yading@10 755 IS_DIR(sub_mb_type, 0, 1),
yading@10 756 nrefs);
yading@10 757 } else {
yading@10 758 int j;
yading@10 759 av_assert2(IS_SUB_4X4(sub_mb_type));
yading@10 760 for (j = 0; j < 4; j++) {
yading@10 761 int sub_y_offset = y_offset + 2 * (j & 2);
yading@10 762 get_lowest_part_y(h, refs, n + j, 4, sub_y_offset,
yading@10 763 IS_DIR(sub_mb_type, 0, 0),
yading@10 764 IS_DIR(sub_mb_type, 0, 1),
yading@10 765 nrefs);
yading@10 766 }
yading@10 767 }
yading@10 768 }
yading@10 769 }
yading@10 770
yading@10 771 for (list = h->list_count - 1; list >= 0; list--)
yading@10 772 for (ref = 0; ref < 48 && nrefs[list]; ref++) {
yading@10 773 int row = refs[list][ref];
yading@10 774 if (row >= 0) {
yading@10 775 Picture *ref_pic = &h->ref_list[list][ref];
yading@10 776 int ref_field = ref_pic->reference - 1;
yading@10 777 int ref_field_picture = ref_pic->field_picture;
yading@10 778 int pic_height = 16 * h->mb_height >> ref_field_picture;
yading@10 779
yading@10 780 row <<= MB_MBAFF(h);
yading@10 781 nrefs[list]--;
yading@10 782
yading@10 783 if (!FIELD_PICTURE(h) && ref_field_picture) { // frame referencing two fields
yading@10 784 ff_thread_await_progress(&ref_pic->tf,
yading@10 785 FFMIN((row >> 1) - !(row & 1),
yading@10 786 pic_height - 1),
yading@10 787 1);
yading@10 788 ff_thread_await_progress(&ref_pic->tf,
yading@10 789 FFMIN((row >> 1), pic_height - 1),
yading@10 790 0);
yading@10 791 } else if (FIELD_PICTURE(h) && !ref_field_picture) { // field referencing one field of a frame
yading@10 792 ff_thread_await_progress(&ref_pic->tf,
yading@10 793 FFMIN(row * 2 + ref_field,
yading@10 794 pic_height - 1),
yading@10 795 0);
yading@10 796 } else if (FIELD_PICTURE(h)) {
yading@10 797 ff_thread_await_progress(&ref_pic->tf,
yading@10 798 FFMIN(row, pic_height - 1),
yading@10 799 ref_field);
yading@10 800 } else {
yading@10 801 ff_thread_await_progress(&ref_pic->tf,
yading@10 802 FFMIN(row, pic_height - 1),
yading@10 803 0);
yading@10 804 }
yading@10 805 }
yading@10 806 }
yading@10 807 }
yading@10 808
yading@10 809 static av_always_inline void mc_dir_part(H264Context *h, Picture *pic,
yading@10 810 int n, int square, int height,
yading@10 811 int delta, int list,
yading@10 812 uint8_t *dest_y, uint8_t *dest_cb,
yading@10 813 uint8_t *dest_cr,
yading@10 814 int src_x_offset, int src_y_offset,
yading@10 815 qpel_mc_func *qpix_op,
yading@10 816 h264_chroma_mc_func chroma_op,
yading@10 817 int pixel_shift, int chroma_idc)
yading@10 818 {
yading@10 819 const int mx = h->mv_cache[list][scan8[n]][0] + src_x_offset * 8;
yading@10 820 int my = h->mv_cache[list][scan8[n]][1] + src_y_offset * 8;
yading@10 821 const int luma_xy = (mx & 3) + ((my & 3) << 2);
yading@10 822 int offset = ((mx >> 2) << pixel_shift) + (my >> 2) * h->mb_linesize;
yading@10 823 uint8_t *src_y = pic->f.data[0] + offset;
yading@10 824 uint8_t *src_cb, *src_cr;
yading@10 825 int extra_width = 0;
yading@10 826 int extra_height = 0;
yading@10 827 int emu = 0;
yading@10 828 const int full_mx = mx >> 2;
yading@10 829 const int full_my = my >> 2;
yading@10 830 const int pic_width = 16 * h->mb_width;
yading@10 831 const int pic_height = 16 * h->mb_height >> MB_FIELD(h);
yading@10 832 int ysh;
yading@10 833
yading@10 834 if (mx & 7)
yading@10 835 extra_width -= 3;
yading@10 836 if (my & 7)
yading@10 837 extra_height -= 3;
yading@10 838
yading@10 839 if (full_mx < 0 - extra_width ||
yading@10 840 full_my < 0 - extra_height ||
yading@10 841 full_mx + 16 /*FIXME*/ > pic_width + extra_width ||
yading@10 842 full_my + 16 /*FIXME*/ > pic_height + extra_height) {
yading@10 843 h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
yading@10 844 src_y - (2 << pixel_shift) - 2 * h->mb_linesize,
yading@10 845 h->mb_linesize,
yading@10 846 16 + 5, 16 + 5 /*FIXME*/, full_mx - 2,
yading@10 847 full_my - 2, pic_width, pic_height);
yading@10 848 src_y = h->edge_emu_buffer + (2 << pixel_shift) + 2 * h->mb_linesize;
yading@10 849 emu = 1;
yading@10 850 }
yading@10 851
yading@10 852 qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); // FIXME try variable height perhaps?
yading@10 853 if (!square)
yading@10 854 qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize);
yading@10 855
yading@10 856 if (CONFIG_GRAY && h->flags & CODEC_FLAG_GRAY)
yading@10 857 return;
yading@10 858
yading@10 859 if (chroma_idc == 3 /* yuv444 */) {
yading@10 860 src_cb = pic->f.data[1] + offset;
yading@10 861 if (emu) {
yading@10 862 h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
yading@10 863 src_cb - (2 << pixel_shift) - 2 * h->mb_linesize,
yading@10 864 h->mb_linesize,
yading@10 865 16 + 5, 16 + 5 /*FIXME*/,
yading@10 866 full_mx - 2, full_my - 2,
yading@10 867 pic_width, pic_height);
yading@10 868 src_cb = h->edge_emu_buffer + (2 << pixel_shift) + 2 * h->mb_linesize;
yading@10 869 }
yading@10 870 qpix_op[luma_xy](dest_cb, src_cb, h->mb_linesize); // FIXME try variable height perhaps?
yading@10 871 if (!square)
yading@10 872 qpix_op[luma_xy](dest_cb + delta, src_cb + delta, h->mb_linesize);
yading@10 873
yading@10 874 src_cr = pic->f.data[2] + offset;
yading@10 875 if (emu) {
yading@10 876 h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
yading@10 877 src_cr - (2 << pixel_shift) - 2 * h->mb_linesize,
yading@10 878 h->mb_linesize,
yading@10 879 16 + 5, 16 + 5 /*FIXME*/,
yading@10 880 full_mx - 2, full_my - 2,
yading@10 881 pic_width, pic_height);
yading@10 882 src_cr = h->edge_emu_buffer + (2 << pixel_shift) + 2 * h->mb_linesize;
yading@10 883 }
yading@10 884 qpix_op[luma_xy](dest_cr, src_cr, h->mb_linesize); // FIXME try variable height perhaps?
yading@10 885 if (!square)
yading@10 886 qpix_op[luma_xy](dest_cr + delta, src_cr + delta, h->mb_linesize);
yading@10 887 return;
yading@10 888 }
yading@10 889
yading@10 890 ysh = 3 - (chroma_idc == 2 /* yuv422 */);
yading@10 891 if (chroma_idc == 1 /* yuv420 */ && MB_FIELD(h)) {
yading@10 892 // chroma offset when predicting from a field of opposite parity
yading@10 893 my += 2 * ((h->mb_y & 1) - (pic->reference - 1));
yading@10 894 emu |= (my >> 3) < 0 || (my >> 3) + 8 >= (pic_height >> 1);
yading@10 895 }
yading@10 896
yading@10 897 src_cb = pic->f.data[1] + ((mx >> 3) << pixel_shift) +
yading@10 898 (my >> ysh) * h->mb_uvlinesize;
yading@10 899 src_cr = pic->f.data[2] + ((mx >> 3) << pixel_shift) +
yading@10 900 (my >> ysh) * h->mb_uvlinesize;
yading@10 901
yading@10 902 if (emu) {
yading@10 903 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cb, h->mb_uvlinesize,
yading@10 904 9, 8 * chroma_idc + 1, (mx >> 3), (my >> ysh),
yading@10 905 pic_width >> 1, pic_height >> (chroma_idc == 1 /* yuv420 */));
yading@10 906 src_cb = h->edge_emu_buffer;
yading@10 907 }
yading@10 908 chroma_op(dest_cb, src_cb, h->mb_uvlinesize,
yading@10 909 height >> (chroma_idc == 1 /* yuv420 */),
yading@10 910 mx & 7, (my << (chroma_idc == 2 /* yuv422 */)) & 7);
yading@10 911
yading@10 912 if (emu) {
yading@10 913 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cr, h->mb_uvlinesize,
yading@10 914 9, 8 * chroma_idc + 1, (mx >> 3), (my >> ysh),
yading@10 915 pic_width >> 1, pic_height >> (chroma_idc == 1 /* yuv420 */));
yading@10 916 src_cr = h->edge_emu_buffer;
yading@10 917 }
yading@10 918 chroma_op(dest_cr, src_cr, h->mb_uvlinesize, height >> (chroma_idc == 1 /* yuv420 */),
yading@10 919 mx & 7, (my << (chroma_idc == 2 /* yuv422 */)) & 7);
yading@10 920 }
yading@10 921
yading@10 922 static av_always_inline void mc_part_std(H264Context *h, int n, int square,
yading@10 923 int height, int delta,
yading@10 924 uint8_t *dest_y, uint8_t *dest_cb,
yading@10 925 uint8_t *dest_cr,
yading@10 926 int x_offset, int y_offset,
yading@10 927 qpel_mc_func *qpix_put,
yading@10 928 h264_chroma_mc_func chroma_put,
yading@10 929 qpel_mc_func *qpix_avg,
yading@10 930 h264_chroma_mc_func chroma_avg,
yading@10 931 int list0, int list1,
yading@10 932 int pixel_shift, int chroma_idc)
yading@10 933 {
yading@10 934 qpel_mc_func *qpix_op = qpix_put;
yading@10 935 h264_chroma_mc_func chroma_op = chroma_put;
yading@10 936
yading@10 937 dest_y += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
yading@10 938 if (chroma_idc == 3 /* yuv444 */) {
yading@10 939 dest_cb += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
yading@10 940 dest_cr += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
yading@10 941 } else if (chroma_idc == 2 /* yuv422 */) {
yading@10 942 dest_cb += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
yading@10 943 dest_cr += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
yading@10 944 } else { /* yuv420 */
yading@10 945 dest_cb += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
yading@10 946 dest_cr += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
yading@10 947 }
yading@10 948 x_offset += 8 * h->mb_x;
yading@10 949 y_offset += 8 * (h->mb_y >> MB_FIELD(h));
yading@10 950
yading@10 951 if (list0) {
yading@10 952 Picture *ref = &h->ref_list[0][h->ref_cache[0][scan8[n]]];
yading@10 953 mc_dir_part(h, ref, n, square, height, delta, 0,
yading@10 954 dest_y, dest_cb, dest_cr, x_offset, y_offset,
yading@10 955 qpix_op, chroma_op, pixel_shift, chroma_idc);
yading@10 956
yading@10 957 qpix_op = qpix_avg;
yading@10 958 chroma_op = chroma_avg;
yading@10 959 }
yading@10 960
yading@10 961 if (list1) {
yading@10 962 Picture *ref = &h->ref_list[1][h->ref_cache[1][scan8[n]]];
yading@10 963 mc_dir_part(h, ref, n, square, height, delta, 1,
yading@10 964 dest_y, dest_cb, dest_cr, x_offset, y_offset,
yading@10 965 qpix_op, chroma_op, pixel_shift, chroma_idc);
yading@10 966 }
yading@10 967 }
yading@10 968
yading@10 969 static av_always_inline void mc_part_weighted(H264Context *h, int n, int square,
yading@10 970 int height, int delta,
yading@10 971 uint8_t *dest_y, uint8_t *dest_cb,
yading@10 972 uint8_t *dest_cr,
yading@10 973 int x_offset, int y_offset,
yading@10 974 qpel_mc_func *qpix_put,
yading@10 975 h264_chroma_mc_func chroma_put,
yading@10 976 h264_weight_func luma_weight_op,
yading@10 977 h264_weight_func chroma_weight_op,
yading@10 978 h264_biweight_func luma_weight_avg,
yading@10 979 h264_biweight_func chroma_weight_avg,
yading@10 980 int list0, int list1,
yading@10 981 int pixel_shift, int chroma_idc)
yading@10 982 {
yading@10 983 int chroma_height;
yading@10 984
yading@10 985 dest_y += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
yading@10 986 if (chroma_idc == 3 /* yuv444 */) {
yading@10 987 chroma_height = height;
yading@10 988 chroma_weight_avg = luma_weight_avg;
yading@10 989 chroma_weight_op = luma_weight_op;
yading@10 990 dest_cb += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
yading@10 991 dest_cr += (2 * x_offset << pixel_shift) + 2 * y_offset * h->mb_linesize;
yading@10 992 } else if (chroma_idc == 2 /* yuv422 */) {
yading@10 993 chroma_height = height;
yading@10 994 dest_cb += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
yading@10 995 dest_cr += (x_offset << pixel_shift) + 2 * y_offset * h->mb_uvlinesize;
yading@10 996 } else { /* yuv420 */
yading@10 997 chroma_height = height >> 1;
yading@10 998 dest_cb += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
yading@10 999 dest_cr += (x_offset << pixel_shift) + y_offset * h->mb_uvlinesize;
yading@10 1000 }
yading@10 1001 x_offset += 8 * h->mb_x;
yading@10 1002 y_offset += 8 * (h->mb_y >> MB_FIELD(h));
yading@10 1003
yading@10 1004 if (list0 && list1) {
yading@10 1005 /* don't optimize for luma-only case, since B-frames usually
yading@10 1006 * use implicit weights => chroma too. */
yading@10 1007 uint8_t *tmp_cb = h->bipred_scratchpad;
yading@10 1008 uint8_t *tmp_cr = h->bipred_scratchpad + (16 << pixel_shift);
yading@10 1009 uint8_t *tmp_y = h->bipred_scratchpad + 16 * h->mb_uvlinesize;
yading@10 1010 int refn0 = h->ref_cache[0][scan8[n]];
yading@10 1011 int refn1 = h->ref_cache[1][scan8[n]];
yading@10 1012
yading@10 1013 mc_dir_part(h, &h->ref_list[0][refn0], n, square, height, delta, 0,
yading@10 1014 dest_y, dest_cb, dest_cr,
yading@10 1015 x_offset, y_offset, qpix_put, chroma_put,
yading@10 1016 pixel_shift, chroma_idc);
yading@10 1017 mc_dir_part(h, &h->ref_list[1][refn1], n, square, height, delta, 1,
yading@10 1018 tmp_y, tmp_cb, tmp_cr,
yading@10 1019 x_offset, y_offset, qpix_put, chroma_put,
yading@10 1020 pixel_shift, chroma_idc);
yading@10 1021
yading@10 1022 if (h->use_weight == 2) {
yading@10 1023 int weight0 = h->implicit_weight[refn0][refn1][h->mb_y & 1];
yading@10 1024 int weight1 = 64 - weight0;
yading@10 1025 luma_weight_avg(dest_y, tmp_y, h->mb_linesize,
yading@10 1026 height, 5, weight0, weight1, 0);
yading@10 1027 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize,
yading@10 1028 chroma_height, 5, weight0, weight1, 0);
yading@10 1029 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize,
yading@10 1030 chroma_height, 5, weight0, weight1, 0);
yading@10 1031 } else {
yading@10 1032 luma_weight_avg(dest_y, tmp_y, h->mb_linesize, height,
yading@10 1033 h->luma_log2_weight_denom,
yading@10 1034 h->luma_weight[refn0][0][0],
yading@10 1035 h->luma_weight[refn1][1][0],
yading@10 1036 h->luma_weight[refn0][0][1] +
yading@10 1037 h->luma_weight[refn1][1][1]);
yading@10 1038 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, chroma_height,
yading@10 1039 h->chroma_log2_weight_denom,
yading@10 1040 h->chroma_weight[refn0][0][0][0],
yading@10 1041 h->chroma_weight[refn1][1][0][0],
yading@10 1042 h->chroma_weight[refn0][0][0][1] +
yading@10 1043 h->chroma_weight[refn1][1][0][1]);
yading@10 1044 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, chroma_height,
yading@10 1045 h->chroma_log2_weight_denom,
yading@10 1046 h->chroma_weight[refn0][0][1][0],
yading@10 1047 h->chroma_weight[refn1][1][1][0],
yading@10 1048 h->chroma_weight[refn0][0][1][1] +
yading@10 1049 h->chroma_weight[refn1][1][1][1]);
yading@10 1050 }
yading@10 1051 } else {
yading@10 1052 int list = list1 ? 1 : 0;
yading@10 1053 int refn = h->ref_cache[list][scan8[n]];
yading@10 1054 Picture *ref = &h->ref_list[list][refn];
yading@10 1055 mc_dir_part(h, ref, n, square, height, delta, list,
yading@10 1056 dest_y, dest_cb, dest_cr, x_offset, y_offset,
yading@10 1057 qpix_put, chroma_put, pixel_shift, chroma_idc);
yading@10 1058
yading@10 1059 luma_weight_op(dest_y, h->mb_linesize, height,
yading@10 1060 h->luma_log2_weight_denom,
yading@10 1061 h->luma_weight[refn][list][0],
yading@10 1062 h->luma_weight[refn][list][1]);
yading@10 1063 if (h->use_weight_chroma) {
yading@10 1064 chroma_weight_op(dest_cb, h->mb_uvlinesize, chroma_height,
yading@10 1065 h->chroma_log2_weight_denom,
yading@10 1066 h->chroma_weight[refn][list][0][0],
yading@10 1067 h->chroma_weight[refn][list][0][1]);
yading@10 1068 chroma_weight_op(dest_cr, h->mb_uvlinesize, chroma_height,
yading@10 1069 h->chroma_log2_weight_denom,
yading@10 1070 h->chroma_weight[refn][list][1][0],
yading@10 1071 h->chroma_weight[refn][list][1][1]);
yading@10 1072 }
yading@10 1073 }
yading@10 1074 }
yading@10 1075
yading@10 1076 static av_always_inline void prefetch_motion(H264Context *h, int list,
yading@10 1077 int pixel_shift, int chroma_idc)
yading@10 1078 {
yading@10 1079 /* fetch pixels for estimated mv 4 macroblocks ahead
yading@10 1080 * optimized for 64byte cache lines */
yading@10 1081 const int refn = h->ref_cache[list][scan8[0]];
yading@10 1082 if (refn >= 0) {
yading@10 1083 const int mx = (h->mv_cache[list][scan8[0]][0] >> 2) + 16 * h->mb_x + 8;
yading@10 1084 const int my = (h->mv_cache[list][scan8[0]][1] >> 2) + 16 * h->mb_y;
yading@10 1085 uint8_t **src = h->ref_list[list][refn].f.data;
yading@10 1086 int off = (mx << pixel_shift) +
yading@10 1087 (my + (h->mb_x & 3) * 4) * h->mb_linesize +
yading@10 1088 (64 << pixel_shift);
yading@10 1089 h->vdsp.prefetch(src[0] + off, h->linesize, 4);
yading@10 1090 if (chroma_idc == 3 /* yuv444 */) {
yading@10 1091 h->vdsp.prefetch(src[1] + off, h->linesize, 4);
yading@10 1092 h->vdsp.prefetch(src[2] + off, h->linesize, 4);
yading@10 1093 } else {
yading@10 1094 off= (((mx>>1)+64)<<pixel_shift) + ((my>>1) + (h->mb_x&7))*h->uvlinesize;
yading@10 1095 h->vdsp.prefetch(src[1] + off, src[2] - src[1], 2);
yading@10 1096 }
yading@10 1097 }
yading@10 1098 }
yading@10 1099
yading@10 1100 static void free_tables(H264Context *h, int free_rbsp)
yading@10 1101 {
yading@10 1102 int i;
yading@10 1103 H264Context *hx;
yading@10 1104
yading@10 1105 av_freep(&h->intra4x4_pred_mode);
yading@10 1106 av_freep(&h->chroma_pred_mode_table);
yading@10 1107 av_freep(&h->cbp_table);
yading@10 1108 av_freep(&h->mvd_table[0]);
yading@10 1109 av_freep(&h->mvd_table[1]);
yading@10 1110 av_freep(&h->direct_table);
yading@10 1111 av_freep(&h->non_zero_count);
yading@10 1112 av_freep(&h->slice_table_base);
yading@10 1113 h->slice_table = NULL;
yading@10 1114 av_freep(&h->list_counts);
yading@10 1115
yading@10 1116 av_freep(&h->mb2b_xy);
yading@10 1117 av_freep(&h->mb2br_xy);
yading@10 1118
yading@10 1119 for (i = 0; i < 3; i++)
yading@10 1120 av_freep(&h->visualization_buffer[i]);
yading@10 1121
yading@10 1122 av_buffer_pool_uninit(&h->qscale_table_pool);
yading@10 1123 av_buffer_pool_uninit(&h->mb_type_pool);
yading@10 1124 av_buffer_pool_uninit(&h->motion_val_pool);
yading@10 1125 av_buffer_pool_uninit(&h->ref_index_pool);
yading@10 1126
yading@10 1127 if (free_rbsp && h->DPB) {
yading@10 1128 for (i = 0; i < MAX_PICTURE_COUNT; i++)
yading@10 1129 unref_picture(h, &h->DPB[i]);
yading@10 1130 av_freep(&h->DPB);
yading@10 1131 } else if (h->DPB) {
yading@10 1132 for (i = 0; i < MAX_PICTURE_COUNT; i++)
yading@10 1133 h->DPB[i].needs_realloc = 1;
yading@10 1134 }
yading@10 1135
yading@10 1136 h->cur_pic_ptr = NULL;
yading@10 1137
yading@10 1138 for (i = 0; i < MAX_THREADS; i++) {
yading@10 1139 hx = h->thread_context[i];
yading@10 1140 if (!hx)
yading@10 1141 continue;
yading@10 1142 av_freep(&hx->top_borders[1]);
yading@10 1143 av_freep(&hx->top_borders[0]);
yading@10 1144 av_freep(&hx->bipred_scratchpad);
yading@10 1145 av_freep(&hx->edge_emu_buffer);
yading@10 1146 av_freep(&hx->dc_val_base);
yading@10 1147 av_freep(&hx->me.scratchpad);
yading@10 1148 av_freep(&hx->er.mb_index2xy);
yading@10 1149 av_freep(&hx->er.error_status_table);
yading@10 1150 av_freep(&hx->er.er_temp_buffer);
yading@10 1151 av_freep(&hx->er.mbintra_table);
yading@10 1152 av_freep(&hx->er.mbskip_table);
yading@10 1153
yading@10 1154 if (free_rbsp) {
yading@10 1155 av_freep(&hx->rbsp_buffer[1]);
yading@10 1156 av_freep(&hx->rbsp_buffer[0]);
yading@10 1157 hx->rbsp_buffer_size[0] = 0;
yading@10 1158 hx->rbsp_buffer_size[1] = 0;
yading@10 1159 }
yading@10 1160 if (i)
yading@10 1161 av_freep(&h->thread_context[i]);
yading@10 1162 }
yading@10 1163 }
yading@10 1164
yading@10 1165 static void init_dequant8_coeff_table(H264Context *h)
yading@10 1166 {
yading@10 1167 int i, j, q, x;
yading@10 1168 const int max_qp = 51 + 6 * (h->sps.bit_depth_luma - 8);
yading@10 1169
yading@10 1170 for (i = 0; i < 6; i++) {
yading@10 1171 h->dequant8_coeff[i] = h->dequant8_buffer[i];
yading@10 1172 for (j = 0; j < i; j++)
yading@10 1173 if (!memcmp(h->pps.scaling_matrix8[j], h->pps.scaling_matrix8[i],
yading@10 1174 64 * sizeof(uint8_t))) {
yading@10 1175 h->dequant8_coeff[i] = h->dequant8_buffer[j];
yading@10 1176 break;
yading@10 1177 }
yading@10 1178 if (j < i)
yading@10 1179 continue;
yading@10 1180
yading@10 1181 for (q = 0; q < max_qp + 1; q++) {
yading@10 1182 int shift = div6[q];
yading@10 1183 int idx = rem6[q];
yading@10 1184 for (x = 0; x < 64; x++)
yading@10 1185 h->dequant8_coeff[i][q][(x >> 3) | ((x & 7) << 3)] =
yading@10 1186 ((uint32_t)dequant8_coeff_init[idx][dequant8_coeff_init_scan[((x >> 1) & 12) | (x & 3)]] *
yading@10 1187 h->pps.scaling_matrix8[i][x]) << shift;
yading@10 1188 }
yading@10 1189 }
yading@10 1190 }
yading@10 1191
yading@10 1192 static void init_dequant4_coeff_table(H264Context *h)
yading@10 1193 {
yading@10 1194 int i, j, q, x;
yading@10 1195 const int max_qp = 51 + 6 * (h->sps.bit_depth_luma - 8);
yading@10 1196 for (i = 0; i < 6; i++) {
yading@10 1197 h->dequant4_coeff[i] = h->dequant4_buffer[i];
yading@10 1198 for (j = 0; j < i; j++)
yading@10 1199 if (!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i],
yading@10 1200 16 * sizeof(uint8_t))) {
yading@10 1201 h->dequant4_coeff[i] = h->dequant4_buffer[j];
yading@10 1202 break;
yading@10 1203 }
yading@10 1204 if (j < i)
yading@10 1205 continue;
yading@10 1206
yading@10 1207 for (q = 0; q < max_qp + 1; q++) {
yading@10 1208 int shift = div6[q] + 2;
yading@10 1209 int idx = rem6[q];
yading@10 1210 for (x = 0; x < 16; x++)
yading@10 1211 h->dequant4_coeff[i][q][(x >> 2) | ((x << 2) & 0xF)] =
yading@10 1212 ((uint32_t)dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] *
yading@10 1213 h->pps.scaling_matrix4[i][x]) << shift;
yading@10 1214 }
yading@10 1215 }
yading@10 1216 }
yading@10 1217
yading@10 1218 static void init_dequant_tables(H264Context *h)
yading@10 1219 {
yading@10 1220 int i, x;
yading@10 1221 init_dequant4_coeff_table(h);
yading@10 1222 if (h->pps.transform_8x8_mode)
yading@10 1223 init_dequant8_coeff_table(h);
yading@10 1224 if (h->sps.transform_bypass) {
yading@10 1225 for (i = 0; i < 6; i++)
yading@10 1226 for (x = 0; x < 16; x++)
yading@10 1227 h->dequant4_coeff[i][0][x] = 1 << 6;
yading@10 1228 if (h->pps.transform_8x8_mode)
yading@10 1229 for (i = 0; i < 6; i++)
yading@10 1230 for (x = 0; x < 64; x++)
yading@10 1231 h->dequant8_coeff[i][0][x] = 1 << 6;
yading@10 1232 }
yading@10 1233 }
yading@10 1234
yading@10 1235 int ff_h264_alloc_tables(H264Context *h)
yading@10 1236 {
yading@10 1237 const int big_mb_num = h->mb_stride * (h->mb_height + 1);
yading@10 1238 const int row_mb_num = 2*h->mb_stride*FFMAX(h->avctx->thread_count, 1);
yading@10 1239 int x, y, i;
yading@10 1240
yading@10 1241 FF_ALLOCZ_OR_GOTO(h->avctx, h->intra4x4_pred_mode,
yading@10 1242 row_mb_num * 8 * sizeof(uint8_t), fail)
yading@10 1243 FF_ALLOCZ_OR_GOTO(h->avctx, h->non_zero_count,
yading@10 1244 big_mb_num * 48 * sizeof(uint8_t), fail)
yading@10 1245 FF_ALLOCZ_OR_GOTO(h->avctx, h->slice_table_base,
yading@10 1246 (big_mb_num + h->mb_stride) * sizeof(*h->slice_table_base), fail)
yading@10 1247 FF_ALLOCZ_OR_GOTO(h->avctx, h->cbp_table,
yading@10 1248 big_mb_num * sizeof(uint16_t), fail)
yading@10 1249 FF_ALLOCZ_OR_GOTO(h->avctx, h->chroma_pred_mode_table,
yading@10 1250 big_mb_num * sizeof(uint8_t), fail)
yading@10 1251 FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[0],
yading@10 1252 16 * row_mb_num * sizeof(uint8_t), fail);
yading@10 1253 FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[1],
yading@10 1254 16 * row_mb_num * sizeof(uint8_t), fail);
yading@10 1255 FF_ALLOCZ_OR_GOTO(h->avctx, h->direct_table,
yading@10 1256 4 * big_mb_num * sizeof(uint8_t), fail);
yading@10 1257 FF_ALLOCZ_OR_GOTO(h->avctx, h->list_counts,
yading@10 1258 big_mb_num * sizeof(uint8_t), fail)
yading@10 1259
yading@10 1260 memset(h->slice_table_base, -1,
yading@10 1261 (big_mb_num + h->mb_stride) * sizeof(*h->slice_table_base));
yading@10 1262 h->slice_table = h->slice_table_base + h->mb_stride * 2 + 1;
yading@10 1263
yading@10 1264 FF_ALLOCZ_OR_GOTO(h->avctx, h->mb2b_xy,
yading@10 1265 big_mb_num * sizeof(uint32_t), fail);
yading@10 1266 FF_ALLOCZ_OR_GOTO(h->avctx, h->mb2br_xy,
yading@10 1267 big_mb_num * sizeof(uint32_t), fail);
yading@10 1268 for (y = 0; y < h->mb_height; y++)
yading@10 1269 for (x = 0; x < h->mb_width; x++) {
yading@10 1270 const int mb_xy = x + y * h->mb_stride;
yading@10 1271 const int b_xy = 4 * x + 4 * y * h->b_stride;
yading@10 1272
yading@10 1273 h->mb2b_xy[mb_xy] = b_xy;
yading@10 1274 h->mb2br_xy[mb_xy] = 8 * (FMO ? mb_xy : (mb_xy % (2 * h->mb_stride)));
yading@10 1275 }
yading@10 1276
yading@10 1277 if (!h->dequant4_coeff[0])
yading@10 1278 init_dequant_tables(h);
yading@10 1279
yading@10 1280 if (!h->DPB) {
yading@10 1281 h->DPB = av_mallocz_array(MAX_PICTURE_COUNT, sizeof(*h->DPB));
yading@10 1282 if (!h->DPB)
yading@10 1283 return AVERROR(ENOMEM);
yading@10 1284 for (i = 0; i < MAX_PICTURE_COUNT; i++)
yading@10 1285 avcodec_get_frame_defaults(&h->DPB[i].f);
yading@10 1286 avcodec_get_frame_defaults(&h->cur_pic.f);
yading@10 1287 }
yading@10 1288
yading@10 1289 return 0;
yading@10 1290
yading@10 1291 fail:
yading@10 1292 free_tables(h, 1);
yading@10 1293 return -1;
yading@10 1294 }
yading@10 1295
yading@10 1296 /**
yading@10 1297 * Mimic alloc_tables(), but for every context thread.
yading@10 1298 */
yading@10 1299 static void clone_tables(H264Context *dst, H264Context *src, int i)
yading@10 1300 {
yading@10 1301 dst->intra4x4_pred_mode = src->intra4x4_pred_mode + i * 8 * 2 * src->mb_stride;
yading@10 1302 dst->non_zero_count = src->non_zero_count;
yading@10 1303 dst->slice_table = src->slice_table;
yading@10 1304 dst->cbp_table = src->cbp_table;
yading@10 1305 dst->mb2b_xy = src->mb2b_xy;
yading@10 1306 dst->mb2br_xy = src->mb2br_xy;
yading@10 1307 dst->chroma_pred_mode_table = src->chroma_pred_mode_table;
yading@10 1308 dst->mvd_table[0] = src->mvd_table[0] + i * 8 * 2 * src->mb_stride;
yading@10 1309 dst->mvd_table[1] = src->mvd_table[1] + i * 8 * 2 * src->mb_stride;
yading@10 1310 dst->direct_table = src->direct_table;
yading@10 1311 dst->list_counts = src->list_counts;
yading@10 1312 dst->DPB = src->DPB;
yading@10 1313 dst->cur_pic_ptr = src->cur_pic_ptr;
yading@10 1314 dst->cur_pic = src->cur_pic;
yading@10 1315 dst->bipred_scratchpad = NULL;
yading@10 1316 dst->edge_emu_buffer = NULL;
yading@10 1317 dst->me.scratchpad = NULL;
yading@10 1318 ff_h264_pred_init(&dst->hpc, src->avctx->codec_id, src->sps.bit_depth_luma,
yading@10 1319 src->sps.chroma_format_idc);
yading@10 1320 }
yading@10 1321
yading@10 1322 /**
yading@10 1323 * Init context
yading@10 1324 * Allocate buffers which are not shared amongst multiple threads.
yading@10 1325 */
yading@10 1326 static int context_init(H264Context *h)
yading@10 1327 {
yading@10 1328 ERContext *er = &h->er;
yading@10 1329 int mb_array_size = h->mb_height * h->mb_stride;
yading@10 1330 int y_size = (2 * h->mb_width + 1) * (2 * h->mb_height + 1);
yading@10 1331 int c_size = h->mb_stride * (h->mb_height + 1);
yading@10 1332 int yc_size = y_size + 2 * c_size;
yading@10 1333 int x, y, i;
yading@10 1334
yading@10 1335 FF_ALLOCZ_OR_GOTO(h->avctx, h->top_borders[0],
yading@10 1336 h->mb_width * 16 * 3 * sizeof(uint8_t) * 2, fail)
yading@10 1337 FF_ALLOCZ_OR_GOTO(h->avctx, h->top_borders[1],
yading@10 1338 h->mb_width * 16 * 3 * sizeof(uint8_t) * 2, fail)
yading@10 1339
yading@10 1340 h->ref_cache[0][scan8[5] + 1] =
yading@10 1341 h->ref_cache[0][scan8[7] + 1] =
yading@10 1342 h->ref_cache[0][scan8[13] + 1] =
yading@10 1343 h->ref_cache[1][scan8[5] + 1] =
yading@10 1344 h->ref_cache[1][scan8[7] + 1] =
yading@10 1345 h->ref_cache[1][scan8[13] + 1] = PART_NOT_AVAILABLE;
yading@10 1346
yading@10 1347 if (CONFIG_ERROR_RESILIENCE) {
yading@10 1348 /* init ER */
yading@10 1349 er->avctx = h->avctx;
yading@10 1350 er->dsp = &h->dsp;
yading@10 1351 er->decode_mb = h264_er_decode_mb;
yading@10 1352 er->opaque = h;
yading@10 1353 er->quarter_sample = 1;
yading@10 1354
yading@10 1355 er->mb_num = h->mb_num;
yading@10 1356 er->mb_width = h->mb_width;
yading@10 1357 er->mb_height = h->mb_height;
yading@10 1358 er->mb_stride = h->mb_stride;
yading@10 1359 er->b8_stride = h->mb_width * 2 + 1;
yading@10 1360
yading@10 1361 FF_ALLOCZ_OR_GOTO(h->avctx, er->mb_index2xy, (h->mb_num + 1) * sizeof(int),
yading@10 1362 fail); // error ressilience code looks cleaner with this
yading@10 1363 for (y = 0; y < h->mb_height; y++)
yading@10 1364 for (x = 0; x < h->mb_width; x++)
yading@10 1365 er->mb_index2xy[x + y * h->mb_width] = x + y * h->mb_stride;
yading@10 1366
yading@10 1367 er->mb_index2xy[h->mb_height * h->mb_width] = (h->mb_height - 1) *
yading@10 1368 h->mb_stride + h->mb_width;
yading@10 1369
yading@10 1370 FF_ALLOCZ_OR_GOTO(h->avctx, er->error_status_table,
yading@10 1371 mb_array_size * sizeof(uint8_t), fail);
yading@10 1372
yading@10 1373 FF_ALLOC_OR_GOTO(h->avctx, er->mbintra_table, mb_array_size, fail);
yading@10 1374 memset(er->mbintra_table, 1, mb_array_size);
yading@10 1375
yading@10 1376 FF_ALLOCZ_OR_GOTO(h->avctx, er->mbskip_table, mb_array_size + 2, fail);
yading@10 1377
yading@10 1378 FF_ALLOC_OR_GOTO(h->avctx, er->er_temp_buffer, h->mb_height * h->mb_stride,
yading@10 1379 fail);
yading@10 1380
yading@10 1381 FF_ALLOCZ_OR_GOTO(h->avctx, h->dc_val_base, yc_size * sizeof(int16_t), fail);
yading@10 1382 er->dc_val[0] = h->dc_val_base + h->mb_width * 2 + 2;
yading@10 1383 er->dc_val[1] = h->dc_val_base + y_size + h->mb_stride + 1;
yading@10 1384 er->dc_val[2] = er->dc_val[1] + c_size;
yading@10 1385 for (i = 0; i < yc_size; i++)
yading@10 1386 h->dc_val_base[i] = 1024;
yading@10 1387 }
yading@10 1388
yading@10 1389 return 0;
yading@10 1390
yading@10 1391 fail:
yading@10 1392 return -1; // free_tables will clean up for us
yading@10 1393 }
yading@10 1394
yading@10 1395 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
yading@10 1396 int parse_extradata);
yading@10 1397
yading@10 1398 int ff_h264_decode_extradata(H264Context *h, const uint8_t *buf, int size)
yading@10 1399 {
yading@10 1400 AVCodecContext *avctx = h->avctx;
yading@10 1401
yading@10 1402 if (!buf || size <= 0)
yading@10 1403 return -1;
yading@10 1404
yading@10 1405 if (buf[0] == 1) {
yading@10 1406 int i, cnt, nalsize;
yading@10 1407 const unsigned char *p = buf;
yading@10 1408
yading@10 1409 h->is_avc = 1;
yading@10 1410
yading@10 1411 if (size < 7) {
yading@10 1412 av_log(avctx, AV_LOG_ERROR, "avcC too short\n");
yading@10 1413 return -1;
yading@10 1414 }
yading@10 1415 /* sps and pps in the avcC always have length coded with 2 bytes,
yading@10 1416 * so put a fake nal_length_size = 2 while parsing them */
yading@10 1417 h->nal_length_size = 2;
yading@10 1418 // Decode sps from avcC
yading@10 1419 cnt = *(p + 5) & 0x1f; // Number of sps
yading@10 1420 p += 6;
yading@10 1421 for (i = 0; i < cnt; i++) {
yading@10 1422 nalsize = AV_RB16(p) + 2;
yading@10 1423 if(nalsize > size - (p-buf))
yading@10 1424 return -1;
yading@10 1425 if (decode_nal_units(h, p, nalsize, 1) < 0) {
yading@10 1426 av_log(avctx, AV_LOG_ERROR,
yading@10 1427 "Decoding sps %d from avcC failed\n", i);
yading@10 1428 return -1;
yading@10 1429 }
yading@10 1430 p += nalsize;
yading@10 1431 }
yading@10 1432 // Decode pps from avcC
yading@10 1433 cnt = *(p++); // Number of pps
yading@10 1434 for (i = 0; i < cnt; i++) {
yading@10 1435 nalsize = AV_RB16(p) + 2;
yading@10 1436 if(nalsize > size - (p-buf))
yading@10 1437 return -1;
yading@10 1438 if (decode_nal_units(h, p, nalsize, 1) < 0) {
yading@10 1439 av_log(avctx, AV_LOG_ERROR,
yading@10 1440 "Decoding pps %d from avcC failed\n", i);
yading@10 1441 return -1;
yading@10 1442 }
yading@10 1443 p += nalsize;
yading@10 1444 }
yading@10 1445 // Now store right nal length size, that will be used to parse all other nals
yading@10 1446 h->nal_length_size = (buf[4] & 0x03) + 1;
yading@10 1447 } else {
yading@10 1448 h->is_avc = 0;
yading@10 1449 if (decode_nal_units(h, buf, size, 1) < 0)
yading@10 1450 return -1;
yading@10 1451 }
yading@10 1452 return size;
yading@10 1453 }
yading@10 1454
yading@10 1455 av_cold int ff_h264_decode_init(AVCodecContext *avctx)
yading@10 1456 {
yading@10 1457 H264Context *h = avctx->priv_data;
yading@10 1458 int i;
yading@10 1459
yading@10 1460 h->avctx = avctx;
yading@10 1461
yading@10 1462 h->bit_depth_luma = 8;
yading@10 1463 h->chroma_format_idc = 1;
yading@10 1464
yading@10 1465 h->avctx->bits_per_raw_sample = 8;
yading@10 1466 h->cur_chroma_format_idc = 1;
yading@10 1467
yading@10 1468 ff_h264dsp_init(&h->h264dsp, 8, 1);
yading@10 1469 av_assert0(h->sps.bit_depth_chroma == 0);
yading@10 1470 ff_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma);
yading@10 1471 ff_h264qpel_init(&h->h264qpel, 8);
yading@10 1472 ff_h264_pred_init(&h->hpc, h->avctx->codec_id, 8, 1);
yading@10 1473
yading@10 1474 h->dequant_coeff_pps = -1;
yading@10 1475
yading@10 1476 /* needed so that IDCT permutation is known early */
yading@10 1477 if (CONFIG_ERROR_RESILIENCE)
yading@10 1478 ff_dsputil_init(&h->dsp, h->avctx);
yading@10 1479 ff_videodsp_init(&h->vdsp, 8);
yading@10 1480
yading@10 1481 memset(h->pps.scaling_matrix4, 16, 6 * 16 * sizeof(uint8_t));
yading@10 1482 memset(h->pps.scaling_matrix8, 16, 2 * 64 * sizeof(uint8_t));
yading@10 1483
yading@10 1484 h->picture_structure = PICT_FRAME;
yading@10 1485 h->slice_context_count = 1;
yading@10 1486 h->workaround_bugs = avctx->workaround_bugs;
yading@10 1487 h->flags = avctx->flags;
yading@10 1488
yading@10 1489 /* set defaults */
yading@10 1490 // s->decode_mb = ff_h263_decode_mb;
yading@10 1491 if (!avctx->has_b_frames)
yading@10 1492 h->low_delay = 1;
yading@10 1493
yading@10 1494 avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
yading@10 1495
yading@10 1496 ff_h264_decode_init_vlc();
yading@10 1497
yading@10 1498 h->pixel_shift = 0;
yading@10 1499 h->sps.bit_depth_luma = avctx->bits_per_raw_sample = 8;
yading@10 1500
yading@10 1501 h->thread_context[0] = h;
yading@10 1502 h->outputed_poc = h->next_outputed_poc = INT_MIN;
yading@10 1503 for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
yading@10 1504 h->last_pocs[i] = INT_MIN;
yading@10 1505 h->prev_poc_msb = 1 << 16;
yading@10 1506 h->prev_frame_num = -1;
yading@10 1507 h->x264_build = -1;
yading@10 1508 ff_h264_reset_sei(h);
yading@10 1509 if (avctx->codec_id == AV_CODEC_ID_H264) {
yading@10 1510 if (avctx->ticks_per_frame == 1) {
yading@10 1511 if(h->avctx->time_base.den < INT_MAX/2) {
yading@10 1512 h->avctx->time_base.den *= 2;
yading@10 1513 } else
yading@10 1514 h->avctx->time_base.num /= 2;
yading@10 1515 }
yading@10 1516 avctx->ticks_per_frame = 2;
yading@10 1517 }
yading@10 1518
yading@10 1519 if (avctx->extradata_size > 0 && avctx->extradata &&
yading@10 1520 ff_h264_decode_extradata(h, avctx->extradata, avctx->extradata_size) < 0) {
yading@10 1521 ff_h264_free_context(h);
yading@10 1522 return -1;
yading@10 1523 }
yading@10 1524
yading@10 1525 if (h->sps.bitstream_restriction_flag &&
yading@10 1526 h->avctx->has_b_frames < h->sps.num_reorder_frames) {
yading@10 1527 h->avctx->has_b_frames = h->sps.num_reorder_frames;
yading@10 1528 h->low_delay = 0;
yading@10 1529 }
yading@10 1530
yading@10 1531 ff_init_cabac_states();
yading@10 1532 avctx->internal->allocate_progress = 1;
yading@10 1533
yading@10 1534 return 0;
yading@10 1535 }
yading@10 1536
yading@10 1537 #define IN_RANGE(a, b, size) (((a) >= (b)) && ((a) < ((b) + (size))))
yading@10 1538 #undef REBASE_PICTURE
yading@10 1539 #define REBASE_PICTURE(pic, new_ctx, old_ctx) \
yading@10 1540 ((pic && pic >= old_ctx->DPB && \
yading@10 1541 pic < old_ctx->DPB + MAX_PICTURE_COUNT) ? \
yading@10 1542 &new_ctx->DPB[pic - old_ctx->DPB] : NULL)
yading@10 1543
yading@10 1544 static void copy_picture_range(Picture **to, Picture **from, int count,
yading@10 1545 H264Context *new_base,
yading@10 1546 H264Context *old_base)
yading@10 1547 {
yading@10 1548 int i;
yading@10 1549
yading@10 1550 for (i = 0; i < count; i++) {
yading@10 1551 assert((IN_RANGE(from[i], old_base, sizeof(*old_base)) ||
yading@10 1552 IN_RANGE(from[i], old_base->DPB,
yading@10 1553 sizeof(Picture) * MAX_PICTURE_COUNT) ||
yading@10 1554 !from[i]));
yading@10 1555 to[i] = REBASE_PICTURE(from[i], new_base, old_base);
yading@10 1556 }
yading@10 1557 }
yading@10 1558
yading@10 1559 static void copy_parameter_set(void **to, void **from, int count, int size)
yading@10 1560 {
yading@10 1561 int i;
yading@10 1562
yading@10 1563 for (i = 0; i < count; i++) {
yading@10 1564 if (to[i] && !from[i])
yading@10 1565 av_freep(&to[i]);
yading@10 1566 else if (from[i] && !to[i])
yading@10 1567 to[i] = av_malloc(size);
yading@10 1568
yading@10 1569 if (from[i])
yading@10 1570 memcpy(to[i], from[i], size);
yading@10 1571 }
yading@10 1572 }
yading@10 1573
yading@10 1574 static int decode_init_thread_copy(AVCodecContext *avctx)
yading@10 1575 {
yading@10 1576 H264Context *h = avctx->priv_data;
yading@10 1577
yading@10 1578 if (!avctx->internal->is_copy)
yading@10 1579 return 0;
yading@10 1580 memset(h->sps_buffers, 0, sizeof(h->sps_buffers));
yading@10 1581 memset(h->pps_buffers, 0, sizeof(h->pps_buffers));
yading@10 1582
yading@10 1583 h->context_initialized = 0;
yading@10 1584
yading@10 1585 return 0;
yading@10 1586 }
yading@10 1587
yading@10 1588 #define copy_fields(to, from, start_field, end_field) \
yading@10 1589 memcpy(&to->start_field, &from->start_field, \
yading@10 1590 (char *)&to->end_field - (char *)&to->start_field)
yading@10 1591
yading@10 1592 static int h264_slice_header_init(H264Context *, int);
yading@10 1593
yading@10 1594 static int h264_set_parameter_from_sps(H264Context *h);
yading@10 1595
yading@10 1596 static int decode_update_thread_context(AVCodecContext *dst,
yading@10 1597 const AVCodecContext *src)
yading@10 1598 {
yading@10 1599 H264Context *h = dst->priv_data, *h1 = src->priv_data;
yading@10 1600 int inited = h->context_initialized, err = 0;
yading@10 1601 int context_reinitialized = 0;
yading@10 1602 int i, ret;
yading@10 1603
yading@10 1604 if (dst == src)
yading@10 1605 return 0;
yading@10 1606
yading@10 1607 if (inited &&
yading@10 1608 (h->width != h1->width ||
yading@10 1609 h->height != h1->height ||
yading@10 1610 h->mb_width != h1->mb_width ||
yading@10 1611 h->mb_height != h1->mb_height ||
yading@10 1612 h->sps.bit_depth_luma != h1->sps.bit_depth_luma ||
yading@10 1613 h->sps.chroma_format_idc != h1->sps.chroma_format_idc ||
yading@10 1614 h->sps.colorspace != h1->sps.colorspace)) {
yading@10 1615
yading@10 1616 /* set bits_per_raw_sample to the previous value. the check for changed
yading@10 1617 * bit depth in h264_set_parameter_from_sps() uses it and sets it to
yading@10 1618 * the current value */
yading@10 1619 h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma;
yading@10 1620
yading@10 1621 av_freep(&h->bipred_scratchpad);
yading@10 1622
yading@10 1623 h->width = h1->width;
yading@10 1624 h->height = h1->height;
yading@10 1625 h->mb_height = h1->mb_height;
yading@10 1626 h->mb_width = h1->mb_width;
yading@10 1627 h->mb_num = h1->mb_num;
yading@10 1628 h->mb_stride = h1->mb_stride;
yading@10 1629 h->b_stride = h1->b_stride;
yading@10 1630 // SPS/PPS
yading@10 1631 copy_parameter_set((void **)h->sps_buffers, (void **)h1->sps_buffers,
yading@10 1632 MAX_SPS_COUNT, sizeof(SPS));
yading@10 1633 h->sps = h1->sps;
yading@10 1634 copy_parameter_set((void **)h->pps_buffers, (void **)h1->pps_buffers,
yading@10 1635 MAX_PPS_COUNT, sizeof(PPS));
yading@10 1636 h->pps = h1->pps;
yading@10 1637
yading@10 1638 if ((err = h264_slice_header_init(h, 1)) < 0) {
yading@10 1639 av_log(h->avctx, AV_LOG_ERROR, "h264_slice_header_init() failed");
yading@10 1640 return err;
yading@10 1641 }
yading@10 1642 context_reinitialized = 1;
yading@10 1643
yading@10 1644 #if 0
yading@10 1645 h264_set_parameter_from_sps(h);
yading@10 1646 //Note we set context_reinitialized which will cause h264_set_parameter_from_sps to be reexecuted
yading@10 1647 h->cur_chroma_format_idc = h1->cur_chroma_format_idc;
yading@10 1648 #endif
yading@10 1649 }
yading@10 1650 /* update linesize on resize for h264. The h264 decoder doesn't
yading@10 1651 * necessarily call ff_MPV_frame_start in the new thread */
yading@10 1652 h->linesize = h1->linesize;
yading@10 1653 h->uvlinesize = h1->uvlinesize;
yading@10 1654
yading@10 1655 /* copy block_offset since frame_start may not be called */
yading@10 1656 memcpy(h->block_offset, h1->block_offset, sizeof(h->block_offset));
yading@10 1657
yading@10 1658 if (!inited) {
yading@10 1659 for (i = 0; i < MAX_SPS_COUNT; i++)
yading@10 1660 av_freep(h->sps_buffers + i);
yading@10 1661
yading@10 1662 for (i = 0; i < MAX_PPS_COUNT; i++)
yading@10 1663 av_freep(h->pps_buffers + i);
yading@10 1664
yading@10 1665 memcpy(h, h1, offsetof(H264Context, intra_pcm_ptr));
yading@10 1666 memcpy(&h->cabac, &h1->cabac,
yading@10 1667 sizeof(H264Context) - offsetof(H264Context, cabac));
yading@10 1668 av_assert0((void*)&h->cabac == &h->mb_padding + 1);
yading@10 1669
yading@10 1670 memset(h->sps_buffers, 0, sizeof(h->sps_buffers));
yading@10 1671 memset(h->pps_buffers, 0, sizeof(h->pps_buffers));
yading@10 1672
yading@10 1673 memset(&h->er, 0, sizeof(h->er));
yading@10 1674 memset(&h->me, 0, sizeof(h->me));
yading@10 1675 memset(&h->mb, 0, sizeof(h->mb));
yading@10 1676 memset(&h->mb_luma_dc, 0, sizeof(h->mb_luma_dc));
yading@10 1677 memset(&h->mb_padding, 0, sizeof(h->mb_padding));
yading@10 1678
yading@10 1679 h->avctx = dst;
yading@10 1680 h->DPB = NULL;
yading@10 1681 h->qscale_table_pool = NULL;
yading@10 1682 h->mb_type_pool = NULL;
yading@10 1683 h->ref_index_pool = NULL;
yading@10 1684 h->motion_val_pool = NULL;
yading@10 1685
yading@10 1686 if (h1->context_initialized) {
yading@10 1687 h->context_initialized = 0;
yading@10 1688
yading@10 1689 memset(&h->cur_pic, 0, sizeof(h->cur_pic));
yading@10 1690 avcodec_get_frame_defaults(&h->cur_pic.f);
yading@10 1691 h->cur_pic.tf.f = &h->cur_pic.f;
yading@10 1692
yading@10 1693 if (ff_h264_alloc_tables(h) < 0) {
yading@10 1694 av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n");
yading@10 1695 return AVERROR(ENOMEM);
yading@10 1696 }
yading@10 1697 context_init(h);
yading@10 1698 }
yading@10 1699
yading@10 1700 for (i = 0; i < 2; i++) {
yading@10 1701 h->rbsp_buffer[i] = NULL;
yading@10 1702 h->rbsp_buffer_size[i] = 0;
yading@10 1703 }
yading@10 1704 h->bipred_scratchpad = NULL;
yading@10 1705 h->edge_emu_buffer = NULL;
yading@10 1706
yading@10 1707 h->thread_context[0] = h;
yading@10 1708 h->context_initialized = h1->context_initialized;
yading@10 1709 }
yading@10 1710
yading@10 1711 h->avctx->coded_height = h1->avctx->coded_height;
yading@10 1712 h->avctx->coded_width = h1->avctx->coded_width;
yading@10 1713 h->avctx->width = h1->avctx->width;
yading@10 1714 h->avctx->height = h1->avctx->height;
yading@10 1715 h->coded_picture_number = h1->coded_picture_number;
yading@10 1716 h->first_field = h1->first_field;
yading@10 1717 h->picture_structure = h1->picture_structure;
yading@10 1718 h->qscale = h1->qscale;
yading@10 1719 h->droppable = h1->droppable;
yading@10 1720 h->data_partitioning = h1->data_partitioning;
yading@10 1721 h->low_delay = h1->low_delay;
yading@10 1722
yading@10 1723 for (i = 0; h->DPB && i < MAX_PICTURE_COUNT; i++) {
yading@10 1724 unref_picture(h, &h->DPB[i]);
yading@10 1725 if (h1->DPB[i].f.data[0] &&
yading@10 1726 (ret = ref_picture(h, &h->DPB[i], &h1->DPB[i])) < 0)
yading@10 1727 return ret;
yading@10 1728 }
yading@10 1729
yading@10 1730 h->cur_pic_ptr = REBASE_PICTURE(h1->cur_pic_ptr, h, h1);
yading@10 1731 unref_picture(h, &h->cur_pic);
yading@10 1732 if (h1->cur_pic.f.buf[0] && (ret = ref_picture(h, &h->cur_pic, &h1->cur_pic)) < 0)
yading@10 1733 return ret;
yading@10 1734
yading@10 1735 h->workaround_bugs = h1->workaround_bugs;
yading@10 1736 h->low_delay = h1->low_delay;
yading@10 1737 h->droppable = h1->droppable;
yading@10 1738
yading@10 1739 // extradata/NAL handling
yading@10 1740 h->is_avc = h1->is_avc;
yading@10 1741
yading@10 1742 // SPS/PPS
yading@10 1743 copy_parameter_set((void **)h->sps_buffers, (void **)h1->sps_buffers,
yading@10 1744 MAX_SPS_COUNT, sizeof(SPS));
yading@10 1745 h->sps = h1->sps;
yading@10 1746 copy_parameter_set((void **)h->pps_buffers, (void **)h1->pps_buffers,
yading@10 1747 MAX_PPS_COUNT, sizeof(PPS));
yading@10 1748 h->pps = h1->pps;
yading@10 1749
yading@10 1750 // Dequantization matrices
yading@10 1751 // FIXME these are big - can they be only copied when PPS changes?
yading@10 1752 copy_fields(h, h1, dequant4_buffer, dequant4_coeff);
yading@10 1753
yading@10 1754 for (i = 0; i < 6; i++)
yading@10 1755 h->dequant4_coeff[i] = h->dequant4_buffer[0] +
yading@10 1756 (h1->dequant4_coeff[i] - h1->dequant4_buffer[0]);
yading@10 1757
yading@10 1758 for (i = 0; i < 6; i++)
yading@10 1759 h->dequant8_coeff[i] = h->dequant8_buffer[0] +
yading@10 1760 (h1->dequant8_coeff[i] - h1->dequant8_buffer[0]);
yading@10 1761
yading@10 1762 h->dequant_coeff_pps = h1->dequant_coeff_pps;
yading@10 1763
yading@10 1764 // POC timing
yading@10 1765 copy_fields(h, h1, poc_lsb, redundant_pic_count);
yading@10 1766
yading@10 1767 // reference lists
yading@10 1768 copy_fields(h, h1, short_ref, cabac_init_idc);
yading@10 1769
yading@10 1770 copy_picture_range(h->short_ref, h1->short_ref, 32, h, h1);
yading@10 1771 copy_picture_range(h->long_ref, h1->long_ref, 32, h, h1);
yading@10 1772 copy_picture_range(h->delayed_pic, h1->delayed_pic,
yading@10 1773 MAX_DELAYED_PIC_COUNT + 2, h, h1);
yading@10 1774
yading@10 1775 h->sync = h1->sync;
yading@10 1776
yading@10 1777 if (context_reinitialized)
yading@10 1778 h264_set_parameter_from_sps(h);
yading@10 1779
yading@10 1780 if (!h->cur_pic_ptr)
yading@10 1781 return 0;
yading@10 1782
yading@10 1783 if (!h->droppable) {
yading@10 1784 err = ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
yading@10 1785 h->prev_poc_msb = h->poc_msb;
yading@10 1786 h->prev_poc_lsb = h->poc_lsb;
yading@10 1787 }
yading@10 1788 h->prev_frame_num_offset = h->frame_num_offset;
yading@10 1789 h->prev_frame_num = h->frame_num;
yading@10 1790 h->outputed_poc = h->next_outputed_poc;
yading@10 1791
yading@10 1792 return err;
yading@10 1793 }
yading@10 1794
yading@10 1795 static int h264_frame_start(H264Context *h)
yading@10 1796 {
yading@10 1797 Picture *pic;
yading@10 1798 int i, ret;
yading@10 1799 const int pixel_shift = h->pixel_shift;
yading@10 1800 int c[4] = {
yading@10 1801 1<<(h->sps.bit_depth_luma-1),
yading@10 1802 1<<(h->sps.bit_depth_chroma-1),
yading@10 1803 1<<(h->sps.bit_depth_chroma-1),
yading@10 1804 -1
yading@10 1805 };
yading@10 1806
yading@10 1807 if (!ff_thread_can_start_frame(h->avctx)) {
yading@10 1808 av_log(h->avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
yading@10 1809 return -1;
yading@10 1810 }
yading@10 1811
yading@10 1812 release_unused_pictures(h, 1);
yading@10 1813 h->cur_pic_ptr = NULL;
yading@10 1814
yading@10 1815 i = find_unused_picture(h);
yading@10 1816 if (i < 0) {
yading@10 1817 av_log(h->avctx, AV_LOG_ERROR, "no frame buffer available\n");
yading@10 1818 return i;
yading@10 1819 }
yading@10 1820 pic = &h->DPB[i];
yading@10 1821
yading@10 1822 pic->reference = h->droppable ? 0 : h->picture_structure;
yading@10 1823 pic->f.coded_picture_number = h->coded_picture_number++;
yading@10 1824 pic->field_picture = h->picture_structure != PICT_FRAME;
yading@10 1825
yading@10 1826 /*
yading@10 1827 * Zero key_frame here; IDR markings per slice in frame or fields are ORed
yading@10 1828 * in later.
yading@10 1829 * See decode_nal_units().
yading@10 1830 */
yading@10 1831 pic->f.key_frame = 0;
yading@10 1832 pic->sync = 0;
yading@10 1833 pic->mmco_reset = 0;
yading@10 1834
yading@10 1835 if ((ret = alloc_picture(h, pic)) < 0)
yading@10 1836 return ret;
yading@10 1837 if(!h->sync && !h->avctx->hwaccel &&
yading@10 1838 !(h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU))
yading@10 1839 avpriv_color_frame(&pic->f, c);
yading@10 1840
yading@10 1841 h->cur_pic_ptr = pic;
yading@10 1842 unref_picture(h, &h->cur_pic);
yading@10 1843 if ((ret = ref_picture(h, &h->cur_pic, h->cur_pic_ptr)) < 0)
yading@10 1844 return ret;
yading@10 1845
yading@10 1846 if (CONFIG_ERROR_RESILIENCE) {
yading@10 1847 ff_er_frame_start(&h->er);
yading@10 1848 h->er.last_pic =
yading@10 1849 h->er.next_pic = NULL;
yading@10 1850 }
yading@10 1851
yading@10 1852 assert(h->linesize && h->uvlinesize);
yading@10 1853
yading@10 1854 for (i = 0; i < 16; i++) {
yading@10 1855 h->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 4 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1856 h->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 8 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1857 }
yading@10 1858 for (i = 0; i < 16; i++) {
yading@10 1859 h->block_offset[16 + i] =
yading@10 1860 h->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 4 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1861 h->block_offset[48 + 16 + i] =
yading@10 1862 h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 8 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1863 }
yading@10 1864
yading@10 1865 // s->decode = (h->flags & CODEC_FLAG_PSNR) || !s->encoding ||
yading@10 1866 // h->cur_pic.reference /* || h->contains_intra */ || 1;
yading@10 1867
yading@10 1868 /* We mark the current picture as non-reference after allocating it, so
yading@10 1869 * that if we break out due to an error it can be released automatically
yading@10 1870 * in the next ff_MPV_frame_start().
yading@10 1871 */
yading@10 1872 h->cur_pic_ptr->reference = 0;
yading@10 1873
yading@10 1874 h->cur_pic_ptr->field_poc[0] = h->cur_pic_ptr->field_poc[1] = INT_MAX;
yading@10 1875
yading@10 1876 h->next_output_pic = NULL;
yading@10 1877
yading@10 1878 assert(h->cur_pic_ptr->long_ref == 0);
yading@10 1879
yading@10 1880 return 0;
yading@10 1881 }
yading@10 1882
yading@10 1883 /**
yading@10 1884 * Run setup operations that must be run after slice header decoding.
yading@10 1885 * This includes finding the next displayed frame.
yading@10 1886 *
yading@10 1887 * @param h h264 master context
yading@10 1888 * @param setup_finished enough NALs have been read that we can call
yading@10 1889 * ff_thread_finish_setup()
yading@10 1890 */
yading@10 1891 static void decode_postinit(H264Context *h, int setup_finished)
yading@10 1892 {
yading@10 1893 Picture *out = h->cur_pic_ptr;
yading@10 1894 Picture *cur = h->cur_pic_ptr;
yading@10 1895 int i, pics, out_of_order, out_idx;
yading@10 1896
yading@10 1897 h->cur_pic_ptr->f.pict_type = h->pict_type;
yading@10 1898
yading@10 1899 if (h->next_output_pic)
yading@10 1900 return;
yading@10 1901
yading@10 1902 if (cur->field_poc[0] == INT_MAX || cur->field_poc[1] == INT_MAX) {
yading@10 1903 /* FIXME: if we have two PAFF fields in one packet, we can't start
yading@10 1904 * the next thread here. If we have one field per packet, we can.
yading@10 1905 * The check in decode_nal_units() is not good enough to find this
yading@10 1906 * yet, so we assume the worst for now. */
yading@10 1907 // if (setup_finished)
yading@10 1908 // ff_thread_finish_setup(h->avctx);
yading@10 1909 return;
yading@10 1910 }
yading@10 1911
yading@10 1912 cur->f.interlaced_frame = 0;
yading@10 1913 cur->f.repeat_pict = 0;
yading@10 1914
yading@10 1915 /* Signal interlacing information externally. */
yading@10 1916 /* Prioritize picture timing SEI information over used
yading@10 1917 * decoding process if it exists. */
yading@10 1918
yading@10 1919 if (h->sps.pic_struct_present_flag) {
yading@10 1920 switch (h->sei_pic_struct) {
yading@10 1921 case SEI_PIC_STRUCT_FRAME:
yading@10 1922 break;
yading@10 1923 case SEI_PIC_STRUCT_TOP_FIELD:
yading@10 1924 case SEI_PIC_STRUCT_BOTTOM_FIELD:
yading@10 1925 cur->f.interlaced_frame = 1;
yading@10 1926 break;
yading@10 1927 case SEI_PIC_STRUCT_TOP_BOTTOM:
yading@10 1928 case SEI_PIC_STRUCT_BOTTOM_TOP:
yading@10 1929 if (FIELD_OR_MBAFF_PICTURE(h))
yading@10 1930 cur->f.interlaced_frame = 1;
yading@10 1931 else
yading@10 1932 // try to flag soft telecine progressive
yading@10 1933 cur->f.interlaced_frame = h->prev_interlaced_frame;
yading@10 1934 break;
yading@10 1935 case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
yading@10 1936 case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM:
yading@10 1937 /* Signal the possibility of telecined film externally
yading@10 1938 * (pic_struct 5,6). From these hints, let the applications
yading@10 1939 * decide if they apply deinterlacing. */
yading@10 1940 cur->f.repeat_pict = 1;
yading@10 1941 break;
yading@10 1942 case SEI_PIC_STRUCT_FRAME_DOUBLING:
yading@10 1943 cur->f.repeat_pict = 2;
yading@10 1944 break;
yading@10 1945 case SEI_PIC_STRUCT_FRAME_TRIPLING:
yading@10 1946 cur->f.repeat_pict = 4;
yading@10 1947 break;
yading@10 1948 }
yading@10 1949
yading@10 1950 if ((h->sei_ct_type & 3) &&
yading@10 1951 h->sei_pic_struct <= SEI_PIC_STRUCT_BOTTOM_TOP)
yading@10 1952 cur->f.interlaced_frame = (h->sei_ct_type & (1 << 1)) != 0;
yading@10 1953 } else {
yading@10 1954 /* Derive interlacing flag from used decoding process. */
yading@10 1955 cur->f.interlaced_frame = FIELD_OR_MBAFF_PICTURE(h);
yading@10 1956 }
yading@10 1957 h->prev_interlaced_frame = cur->f.interlaced_frame;
yading@10 1958
yading@10 1959 if (cur->field_poc[0] != cur->field_poc[1]) {
yading@10 1960 /* Derive top_field_first from field pocs. */
yading@10 1961 cur->f.top_field_first = cur->field_poc[0] < cur->field_poc[1];
yading@10 1962 } else {
yading@10 1963 if (cur->f.interlaced_frame || h->sps.pic_struct_present_flag) {
yading@10 1964 /* Use picture timing SEI information. Even if it is a
yading@10 1965 * information of a past frame, better than nothing. */
yading@10 1966 if (h->sei_pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM ||
yading@10 1967 h->sei_pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM_TOP)
yading@10 1968 cur->f.top_field_first = 1;
yading@10 1969 else
yading@10 1970 cur->f.top_field_first = 0;
yading@10 1971 } else {
yading@10 1972 /* Most likely progressive */
yading@10 1973 cur->f.top_field_first = 0;
yading@10 1974 }
yading@10 1975 }
yading@10 1976
yading@10 1977 cur->mmco_reset = h->mmco_reset;
yading@10 1978 h->mmco_reset = 0;
yading@10 1979 // FIXME do something with unavailable reference frames
yading@10 1980
yading@10 1981 /* Sort B-frames into display order */
yading@10 1982
yading@10 1983 if (h->sps.bitstream_restriction_flag &&
yading@10 1984 h->avctx->has_b_frames < h->sps.num_reorder_frames) {
yading@10 1985 h->avctx->has_b_frames = h->sps.num_reorder_frames;
yading@10 1986 h->low_delay = 0;
yading@10 1987 }
yading@10 1988
yading@10 1989 if (h->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT &&
yading@10 1990 !h->sps.bitstream_restriction_flag) {
yading@10 1991 h->avctx->has_b_frames = MAX_DELAYED_PIC_COUNT - 1;
yading@10 1992 h->low_delay = 0;
yading@10 1993 }
yading@10 1994
yading@10 1995 for (i = 0; 1; i++) {
yading@10 1996 if(i == MAX_DELAYED_PIC_COUNT || cur->poc < h->last_pocs[i]){
yading@10 1997 if(i)
yading@10 1998 h->last_pocs[i-1] = cur->poc;
yading@10 1999 break;
yading@10 2000 } else if(i) {
yading@10 2001 h->last_pocs[i-1]= h->last_pocs[i];
yading@10 2002 }
yading@10 2003 }
yading@10 2004 out_of_order = MAX_DELAYED_PIC_COUNT - i;
yading@10 2005 if( cur->f.pict_type == AV_PICTURE_TYPE_B
yading@10 2006 || (h->last_pocs[MAX_DELAYED_PIC_COUNT-2] > INT_MIN && h->last_pocs[MAX_DELAYED_PIC_COUNT-1] - h->last_pocs[MAX_DELAYED_PIC_COUNT-2] > 2))
yading@10 2007 out_of_order = FFMAX(out_of_order, 1);
yading@10 2008 if (out_of_order == MAX_DELAYED_PIC_COUNT) {
yading@10 2009 av_log(h->avctx, AV_LOG_VERBOSE, "Invalid POC %d<%d\n", cur->poc, h->last_pocs[0]);
yading@10 2010 for (i = 1; i < MAX_DELAYED_PIC_COUNT; i++)
yading@10 2011 h->last_pocs[i] = INT_MIN;
yading@10 2012 h->last_pocs[0] = cur->poc;
yading@10 2013 cur->mmco_reset = 1;
yading@10 2014 } else if(h->avctx->has_b_frames < out_of_order && !h->sps.bitstream_restriction_flag){
yading@10 2015 av_log(h->avctx, AV_LOG_VERBOSE, "Increasing reorder buffer to %d\n", out_of_order);
yading@10 2016 h->avctx->has_b_frames = out_of_order;
yading@10 2017 h->low_delay = 0;
yading@10 2018 }
yading@10 2019
yading@10 2020 pics = 0;
yading@10 2021 while (h->delayed_pic[pics])
yading@10 2022 pics++;
yading@10 2023
yading@10 2024 av_assert0(pics <= MAX_DELAYED_PIC_COUNT);
yading@10 2025
yading@10 2026 h->delayed_pic[pics++] = cur;
yading@10 2027 if (cur->reference == 0)
yading@10 2028 cur->reference = DELAYED_PIC_REF;
yading@10 2029
yading@10 2030 out = h->delayed_pic[0];
yading@10 2031 out_idx = 0;
yading@10 2032 for (i = 1; h->delayed_pic[i] &&
yading@10 2033 !h->delayed_pic[i]->f.key_frame &&
yading@10 2034 !h->delayed_pic[i]->mmco_reset;
yading@10 2035 i++)
yading@10 2036 if (h->delayed_pic[i]->poc < out->poc) {
yading@10 2037 out = h->delayed_pic[i];
yading@10 2038 out_idx = i;
yading@10 2039 }
yading@10 2040 if (h->avctx->has_b_frames == 0 &&
yading@10 2041 (h->delayed_pic[0]->f.key_frame || h->delayed_pic[0]->mmco_reset))
yading@10 2042 h->next_outputed_poc = INT_MIN;
yading@10 2043 out_of_order = out->poc < h->next_outputed_poc;
yading@10 2044
yading@10 2045 if (out_of_order || pics > h->avctx->has_b_frames) {
yading@10 2046 out->reference &= ~DELAYED_PIC_REF;
yading@10 2047 // for frame threading, the owner must be the second field's thread or
yading@10 2048 // else the first thread can release the picture and reuse it unsafely
yading@10 2049 for (i = out_idx; h->delayed_pic[i]; i++)
yading@10 2050 h->delayed_pic[i] = h->delayed_pic[i + 1];
yading@10 2051 }
yading@10 2052 if (!out_of_order && pics > h->avctx->has_b_frames) {
yading@10 2053 h->next_output_pic = out;
yading@10 2054 if (out_idx == 0 && h->delayed_pic[0] && (h->delayed_pic[0]->f.key_frame || h->delayed_pic[0]->mmco_reset)) {
yading@10 2055 h->next_outputed_poc = INT_MIN;
yading@10 2056 } else
yading@10 2057 h->next_outputed_poc = out->poc;
yading@10 2058 } else {
yading@10 2059 av_log(h->avctx, AV_LOG_DEBUG, "no picture %s\n", out_of_order ? "ooo" : "");
yading@10 2060 }
yading@10 2061
yading@10 2062 if (h->next_output_pic && h->next_output_pic->sync) {
yading@10 2063 h->sync |= 2;
yading@10 2064 }
yading@10 2065
yading@10 2066 if (setup_finished && !h->avctx->hwaccel)
yading@10 2067 ff_thread_finish_setup(h->avctx);
yading@10 2068 }
yading@10 2069
yading@10 2070 static av_always_inline void backup_mb_border(H264Context *h, uint8_t *src_y,
yading@10 2071 uint8_t *src_cb, uint8_t *src_cr,
yading@10 2072 int linesize, int uvlinesize,
yading@10 2073 int simple)
yading@10 2074 {
yading@10 2075 uint8_t *top_border;
yading@10 2076 int top_idx = 1;
yading@10 2077 const int pixel_shift = h->pixel_shift;
yading@10 2078 int chroma444 = CHROMA444(h);
yading@10 2079 int chroma422 = CHROMA422(h);
yading@10 2080
yading@10 2081 src_y -= linesize;
yading@10 2082 src_cb -= uvlinesize;
yading@10 2083 src_cr -= uvlinesize;
yading@10 2084
yading@10 2085 if (!simple && FRAME_MBAFF(h)) {
yading@10 2086 if (h->mb_y & 1) {
yading@10 2087 if (!MB_MBAFF(h)) {
yading@10 2088 top_border = h->top_borders[0][h->mb_x];
yading@10 2089 AV_COPY128(top_border, src_y + 15 * linesize);
yading@10 2090 if (pixel_shift)
yading@10 2091 AV_COPY128(top_border + 16, src_y + 15 * linesize + 16);
yading@10 2092 if (simple || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
yading@10 2093 if (chroma444) {
yading@10 2094 if (pixel_shift) {
yading@10 2095 AV_COPY128(top_border + 32, src_cb + 15 * uvlinesize);
yading@10 2096 AV_COPY128(top_border + 48, src_cb + 15 * uvlinesize + 16);
yading@10 2097 AV_COPY128(top_border + 64, src_cr + 15 * uvlinesize);
yading@10 2098 AV_COPY128(top_border + 80, src_cr + 15 * uvlinesize + 16);
yading@10 2099 } else {
yading@10 2100 AV_COPY128(top_border + 16, src_cb + 15 * uvlinesize);
yading@10 2101 AV_COPY128(top_border + 32, src_cr + 15 * uvlinesize);
yading@10 2102 }
yading@10 2103 } else if (chroma422) {
yading@10 2104 if (pixel_shift) {
yading@10 2105 AV_COPY128(top_border + 32, src_cb + 15 * uvlinesize);
yading@10 2106 AV_COPY128(top_border + 48, src_cr + 15 * uvlinesize);
yading@10 2107 } else {
yading@10 2108 AV_COPY64(top_border + 16, src_cb + 15 * uvlinesize);
yading@10 2109 AV_COPY64(top_border + 24, src_cr + 15 * uvlinesize);
yading@10 2110 }
yading@10 2111 } else {
yading@10 2112 if (pixel_shift) {
yading@10 2113 AV_COPY128(top_border + 32, src_cb + 7 * uvlinesize);
yading@10 2114 AV_COPY128(top_border + 48, src_cr + 7 * uvlinesize);
yading@10 2115 } else {
yading@10 2116 AV_COPY64(top_border + 16, src_cb + 7 * uvlinesize);
yading@10 2117 AV_COPY64(top_border + 24, src_cr + 7 * uvlinesize);
yading@10 2118 }
yading@10 2119 }
yading@10 2120 }
yading@10 2121 }
yading@10 2122 } else if (MB_MBAFF(h)) {
yading@10 2123 top_idx = 0;
yading@10 2124 } else
yading@10 2125 return;
yading@10 2126 }
yading@10 2127
yading@10 2128 top_border = h->top_borders[top_idx][h->mb_x];
yading@10 2129 /* There are two lines saved, the line above the top macroblock
yading@10 2130 * of a pair, and the line above the bottom macroblock. */
yading@10 2131 AV_COPY128(top_border, src_y + 16 * linesize);
yading@10 2132 if (pixel_shift)
yading@10 2133 AV_COPY128(top_border + 16, src_y + 16 * linesize + 16);
yading@10 2134
yading@10 2135 if (simple || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
yading@10 2136 if (chroma444) {
yading@10 2137 if (pixel_shift) {
yading@10 2138 AV_COPY128(top_border + 32, src_cb + 16 * linesize);
yading@10 2139 AV_COPY128(top_border + 48, src_cb + 16 * linesize + 16);
yading@10 2140 AV_COPY128(top_border + 64, src_cr + 16 * linesize);
yading@10 2141 AV_COPY128(top_border + 80, src_cr + 16 * linesize + 16);
yading@10 2142 } else {
yading@10 2143 AV_COPY128(top_border + 16, src_cb + 16 * linesize);
yading@10 2144 AV_COPY128(top_border + 32, src_cr + 16 * linesize);
yading@10 2145 }
yading@10 2146 } else if (chroma422) {
yading@10 2147 if (pixel_shift) {
yading@10 2148 AV_COPY128(top_border + 32, src_cb + 16 * uvlinesize);
yading@10 2149 AV_COPY128(top_border + 48, src_cr + 16 * uvlinesize);
yading@10 2150 } else {
yading@10 2151 AV_COPY64(top_border + 16, src_cb + 16 * uvlinesize);
yading@10 2152 AV_COPY64(top_border + 24, src_cr + 16 * uvlinesize);
yading@10 2153 }
yading@10 2154 } else {
yading@10 2155 if (pixel_shift) {
yading@10 2156 AV_COPY128(top_border + 32, src_cb + 8 * uvlinesize);
yading@10 2157 AV_COPY128(top_border + 48, src_cr + 8 * uvlinesize);
yading@10 2158 } else {
yading@10 2159 AV_COPY64(top_border + 16, src_cb + 8 * uvlinesize);
yading@10 2160 AV_COPY64(top_border + 24, src_cr + 8 * uvlinesize);
yading@10 2161 }
yading@10 2162 }
yading@10 2163 }
yading@10 2164 }
yading@10 2165
yading@10 2166 static av_always_inline void xchg_mb_border(H264Context *h, uint8_t *src_y,
yading@10 2167 uint8_t *src_cb, uint8_t *src_cr,
yading@10 2168 int linesize, int uvlinesize,
yading@10 2169 int xchg, int chroma444,
yading@10 2170 int simple, int pixel_shift)
yading@10 2171 {
yading@10 2172 int deblock_topleft;
yading@10 2173 int deblock_top;
yading@10 2174 int top_idx = 1;
yading@10 2175 uint8_t *top_border_m1;
yading@10 2176 uint8_t *top_border;
yading@10 2177
yading@10 2178 if (!simple && FRAME_MBAFF(h)) {
yading@10 2179 if (h->mb_y & 1) {
yading@10 2180 if (!MB_MBAFF(h))
yading@10 2181 return;
yading@10 2182 } else {
yading@10 2183 top_idx = MB_MBAFF(h) ? 0 : 1;
yading@10 2184 }
yading@10 2185 }
yading@10 2186
yading@10 2187 if (h->deblocking_filter == 2) {
yading@10 2188 deblock_topleft = h->slice_table[h->mb_xy - 1 - h->mb_stride] == h->slice_num;
yading@10 2189 deblock_top = h->top_type;
yading@10 2190 } else {
yading@10 2191 deblock_topleft = (h->mb_x > 0);
yading@10 2192 deblock_top = (h->mb_y > !!MB_FIELD(h));
yading@10 2193 }
yading@10 2194
yading@10 2195 src_y -= linesize + 1 + pixel_shift;
yading@10 2196 src_cb -= uvlinesize + 1 + pixel_shift;
yading@10 2197 src_cr -= uvlinesize + 1 + pixel_shift;
yading@10 2198
yading@10 2199 top_border_m1 = h->top_borders[top_idx][h->mb_x - 1];
yading@10 2200 top_border = h->top_borders[top_idx][h->mb_x];
yading@10 2201
yading@10 2202 #define XCHG(a, b, xchg) \
yading@10 2203 if (pixel_shift) { \
yading@10 2204 if (xchg) { \
yading@10 2205 AV_SWAP64(b + 0, a + 0); \
yading@10 2206 AV_SWAP64(b + 8, a + 8); \
yading@10 2207 } else { \
yading@10 2208 AV_COPY128(b, a); \
yading@10 2209 } \
yading@10 2210 } else if (xchg) \
yading@10 2211 AV_SWAP64(b, a); \
yading@10 2212 else \
yading@10 2213 AV_COPY64(b, a);
yading@10 2214
yading@10 2215 if (deblock_top) {
yading@10 2216 if (deblock_topleft) {
yading@10 2217 XCHG(top_border_m1 + (8 << pixel_shift),
yading@10 2218 src_y - (7 << pixel_shift), 1);
yading@10 2219 }
yading@10 2220 XCHG(top_border + (0 << pixel_shift), src_y + (1 << pixel_shift), xchg);
yading@10 2221 XCHG(top_border + (8 << pixel_shift), src_y + (9 << pixel_shift), 1);
yading@10 2222 if (h->mb_x + 1 < h->mb_width) {
yading@10 2223 XCHG(h->top_borders[top_idx][h->mb_x + 1],
yading@10 2224 src_y + (17 << pixel_shift), 1);
yading@10 2225 }
yading@10 2226 }
yading@10 2227 if (simple || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
yading@10 2228 if (chroma444) {
yading@10 2229 if (deblock_topleft) {
yading@10 2230 XCHG(top_border_m1 + (24 << pixel_shift), src_cb - (7 << pixel_shift), 1);
yading@10 2231 XCHG(top_border_m1 + (40 << pixel_shift), src_cr - (7 << pixel_shift), 1);
yading@10 2232 }
yading@10 2233 XCHG(top_border + (16 << pixel_shift), src_cb + (1 << pixel_shift), xchg);
yading@10 2234 XCHG(top_border + (24 << pixel_shift), src_cb + (9 << pixel_shift), 1);
yading@10 2235 XCHG(top_border + (32 << pixel_shift), src_cr + (1 << pixel_shift), xchg);
yading@10 2236 XCHG(top_border + (40 << pixel_shift), src_cr + (9 << pixel_shift), 1);
yading@10 2237 if (h->mb_x + 1 < h->mb_width) {
yading@10 2238 XCHG(h->top_borders[top_idx][h->mb_x + 1] + (16 << pixel_shift), src_cb + (17 << pixel_shift), 1);
yading@10 2239 XCHG(h->top_borders[top_idx][h->mb_x + 1] + (32 << pixel_shift), src_cr + (17 << pixel_shift), 1);
yading@10 2240 }
yading@10 2241 } else {
yading@10 2242 if (deblock_top) {
yading@10 2243 if (deblock_topleft) {
yading@10 2244 XCHG(top_border_m1 + (16 << pixel_shift), src_cb - (7 << pixel_shift), 1);
yading@10 2245 XCHG(top_border_m1 + (24 << pixel_shift), src_cr - (7 << pixel_shift), 1);
yading@10 2246 }
yading@10 2247 XCHG(top_border + (16 << pixel_shift), src_cb + 1 + pixel_shift, 1);
yading@10 2248 XCHG(top_border + (24 << pixel_shift), src_cr + 1 + pixel_shift, 1);
yading@10 2249 }
yading@10 2250 }
yading@10 2251 }
yading@10 2252 }
yading@10 2253
yading@10 2254 static av_always_inline int dctcoef_get(int16_t *mb, int high_bit_depth,
yading@10 2255 int index)
yading@10 2256 {
yading@10 2257 if (high_bit_depth) {
yading@10 2258 return AV_RN32A(((int32_t *)mb) + index);
yading@10 2259 } else
yading@10 2260 return AV_RN16A(mb + index);
yading@10 2261 }
yading@10 2262
yading@10 2263 static av_always_inline void dctcoef_set(int16_t *mb, int high_bit_depth,
yading@10 2264 int index, int value)
yading@10 2265 {
yading@10 2266 if (high_bit_depth) {
yading@10 2267 AV_WN32A(((int32_t *)mb) + index, value);
yading@10 2268 } else
yading@10 2269 AV_WN16A(mb + index, value);
yading@10 2270 }
yading@10 2271
yading@10 2272 static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
yading@10 2273 int mb_type, int is_h264,
yading@10 2274 int simple,
yading@10 2275 int transform_bypass,
yading@10 2276 int pixel_shift,
yading@10 2277 int *block_offset,
yading@10 2278 int linesize,
yading@10 2279 uint8_t *dest_y, int p)
yading@10 2280 {
yading@10 2281 void (*idct_add)(uint8_t *dst, int16_t *block, int stride);
yading@10 2282 void (*idct_dc_add)(uint8_t *dst, int16_t *block, int stride);
yading@10 2283 int i;
yading@10 2284 int qscale = p == 0 ? h->qscale : h->chroma_qp[p - 1];
yading@10 2285 block_offset += 16 * p;
yading@10 2286 if (IS_INTRA4x4(mb_type)) {
yading@10 2287 if (IS_8x8DCT(mb_type)) {
yading@10 2288 if (transform_bypass) {
yading@10 2289 idct_dc_add =
yading@10 2290 idct_add = h->h264dsp.h264_add_pixels8_clear;
yading@10 2291 } else {
yading@10 2292 idct_dc_add = h->h264dsp.h264_idct8_dc_add;
yading@10 2293 idct_add = h->h264dsp.h264_idct8_add;
yading@10 2294 }
yading@10 2295 for (i = 0; i < 16; i += 4) {
yading@10 2296 uint8_t *const ptr = dest_y + block_offset[i];
yading@10 2297 const int dir = h->intra4x4_pred_mode_cache[scan8[i]];
yading@10 2298 if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) {
yading@10 2299 h->hpc.pred8x8l_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
yading@10 2300 } else {
yading@10 2301 const int nnz = h->non_zero_count_cache[scan8[i + p * 16]];
yading@10 2302 h->hpc.pred8x8l[dir](ptr, (h->topleft_samples_available << i) & 0x8000,
yading@10 2303 (h->topright_samples_available << i) & 0x4000, linesize);
yading@10 2304 if (nnz) {
yading@10 2305 if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256))
yading@10 2306 idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
yading@10 2307 else
yading@10 2308 idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
yading@10 2309 }
yading@10 2310 }
yading@10 2311 }
yading@10 2312 } else {
yading@10 2313 if (transform_bypass) {
yading@10 2314 idct_dc_add =
yading@10 2315 idct_add = h->h264dsp.h264_add_pixels4_clear;
yading@10 2316 } else {
yading@10 2317 idct_dc_add = h->h264dsp.h264_idct_dc_add;
yading@10 2318 idct_add = h->h264dsp.h264_idct_add;
yading@10 2319 }
yading@10 2320 for (i = 0; i < 16; i++) {
yading@10 2321 uint8_t *const ptr = dest_y + block_offset[i];
yading@10 2322 const int dir = h->intra4x4_pred_mode_cache[scan8[i]];
yading@10 2323
yading@10 2324 if (transform_bypass && h->sps.profile_idc == 244 && dir <= 1) {
yading@10 2325 h->hpc.pred4x4_add[dir](ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
yading@10 2326 } else {
yading@10 2327 uint8_t *topright;
yading@10 2328 int nnz, tr;
yading@10 2329 uint64_t tr_high;
yading@10 2330 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
yading@10 2331 const int topright_avail = (h->topright_samples_available << i) & 0x8000;
yading@10 2332 av_assert2(h->mb_y || linesize <= block_offset[i]);
yading@10 2333 if (!topright_avail) {
yading@10 2334 if (pixel_shift) {
yading@10 2335 tr_high = ((uint16_t *)ptr)[3 - linesize / 2] * 0x0001000100010001ULL;
yading@10 2336 topright = (uint8_t *)&tr_high;
yading@10 2337 } else {
yading@10 2338 tr = ptr[3 - linesize] * 0x01010101u;
yading@10 2339 topright = (uint8_t *)&tr;
yading@10 2340 }
yading@10 2341 } else
yading@10 2342 topright = ptr + (4 << pixel_shift) - linesize;
yading@10 2343 } else
yading@10 2344 topright = NULL;
yading@10 2345
yading@10 2346 h->hpc.pred4x4[dir](ptr, topright, linesize);
yading@10 2347 nnz = h->non_zero_count_cache[scan8[i + p * 16]];
yading@10 2348 if (nnz) {
yading@10 2349 if (is_h264) {
yading@10 2350 if (nnz == 1 && dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256))
yading@10 2351 idct_dc_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
yading@10 2352 else
yading@10 2353 idct_add(ptr, h->mb + (i * 16 + p * 256 << pixel_shift), linesize);
yading@10 2354 } else if (CONFIG_SVQ3_DECODER)
yading@10 2355 ff_svq3_add_idct_c(ptr, h->mb + i * 16 + p * 256, linesize, qscale, 0);
yading@10 2356 }
yading@10 2357 }
yading@10 2358 }
yading@10 2359 }
yading@10 2360 } else {
yading@10 2361 h->hpc.pred16x16[h->intra16x16_pred_mode](dest_y, linesize);
yading@10 2362 if (is_h264) {
yading@10 2363 if (h->non_zero_count_cache[scan8[LUMA_DC_BLOCK_INDEX + p]]) {
yading@10 2364 if (!transform_bypass)
yading@10 2365 h->h264dsp.h264_luma_dc_dequant_idct(h->mb + (p * 256 << pixel_shift),
yading@10 2366 h->mb_luma_dc[p],
yading@10 2367 h->dequant4_coeff[p][qscale][0]);
yading@10 2368 else {
yading@10 2369 static const uint8_t dc_mapping[16] = {
yading@10 2370 0 * 16, 1 * 16, 4 * 16, 5 * 16,
yading@10 2371 2 * 16, 3 * 16, 6 * 16, 7 * 16,
yading@10 2372 8 * 16, 9 * 16, 12 * 16, 13 * 16,
yading@10 2373 10 * 16, 11 * 16, 14 * 16, 15 * 16 };
yading@10 2374 for (i = 0; i < 16; i++)
yading@10 2375 dctcoef_set(h->mb + (p * 256 << pixel_shift),
yading@10 2376 pixel_shift, dc_mapping[i],
yading@10 2377 dctcoef_get(h->mb_luma_dc[p],
yading@10 2378 pixel_shift, i));
yading@10 2379 }
yading@10 2380 }
yading@10 2381 } else if (CONFIG_SVQ3_DECODER)
yading@10 2382 ff_svq3_luma_dc_dequant_idct_c(h->mb + p * 256,
yading@10 2383 h->mb_luma_dc[p], qscale);
yading@10 2384 }
yading@10 2385 }
yading@10 2386
yading@10 2387 static av_always_inline void hl_decode_mb_idct_luma(H264Context *h, int mb_type,
yading@10 2388 int is_h264, int simple,
yading@10 2389 int transform_bypass,
yading@10 2390 int pixel_shift,
yading@10 2391 int *block_offset,
yading@10 2392 int linesize,
yading@10 2393 uint8_t *dest_y, int p)
yading@10 2394 {
yading@10 2395 void (*idct_add)(uint8_t *dst, int16_t *block, int stride);
yading@10 2396 int i;
yading@10 2397 block_offset += 16 * p;
yading@10 2398 if (!IS_INTRA4x4(mb_type)) {
yading@10 2399 if (is_h264) {
yading@10 2400 if (IS_INTRA16x16(mb_type)) {
yading@10 2401 if (transform_bypass) {
yading@10 2402 if (h->sps.profile_idc == 244 &&
yading@10 2403 (h->intra16x16_pred_mode == VERT_PRED8x8 ||
yading@10 2404 h->intra16x16_pred_mode == HOR_PRED8x8)) {
yading@10 2405 h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset,
yading@10 2406 h->mb + (p * 256 << pixel_shift),
yading@10 2407 linesize);
yading@10 2408 } else {
yading@10 2409 for (i = 0; i < 16; i++)
yading@10 2410 if (h->non_zero_count_cache[scan8[i + p * 16]] ||
yading@10 2411 dctcoef_get(h->mb, pixel_shift, i * 16 + p * 256))
yading@10 2412 h->h264dsp.h264_add_pixels4_clear(dest_y + block_offset[i],
yading@10 2413 h->mb + (i * 16 + p * 256 << pixel_shift),
yading@10 2414 linesize);
yading@10 2415 }
yading@10 2416 } else {
yading@10 2417 h->h264dsp.h264_idct_add16intra(dest_y, block_offset,
yading@10 2418 h->mb + (p * 256 << pixel_shift),
yading@10 2419 linesize,
yading@10 2420 h->non_zero_count_cache + p * 5 * 8);
yading@10 2421 }
yading@10 2422 } else if (h->cbp & 15) {
yading@10 2423 if (transform_bypass) {
yading@10 2424 const int di = IS_8x8DCT(mb_type) ? 4 : 1;
yading@10 2425 idct_add = IS_8x8DCT(mb_type) ? h->h264dsp.h264_add_pixels8_clear
yading@10 2426 : h->h264dsp.h264_add_pixels4_clear;
yading@10 2427 for (i = 0; i < 16; i += di)
yading@10 2428 if (h->non_zero_count_cache[scan8[i + p * 16]])
yading@10 2429 idct_add(dest_y + block_offset[i],
yading@10 2430 h->mb + (i * 16 + p * 256 << pixel_shift),
yading@10 2431 linesize);
yading@10 2432 } else {
yading@10 2433 if (IS_8x8DCT(mb_type))
yading@10 2434 h->h264dsp.h264_idct8_add4(dest_y, block_offset,
yading@10 2435 h->mb + (p * 256 << pixel_shift),
yading@10 2436 linesize,
yading@10 2437 h->non_zero_count_cache + p * 5 * 8);
yading@10 2438 else
yading@10 2439 h->h264dsp.h264_idct_add16(dest_y, block_offset,
yading@10 2440 h->mb + (p * 256 << pixel_shift),
yading@10 2441 linesize,
yading@10 2442 h->non_zero_count_cache + p * 5 * 8);
yading@10 2443 }
yading@10 2444 }
yading@10 2445 } else if (CONFIG_SVQ3_DECODER) {
yading@10 2446 for (i = 0; i < 16; i++)
yading@10 2447 if (h->non_zero_count_cache[scan8[i + p * 16]] || h->mb[i * 16 + p * 256]) {
yading@10 2448 // FIXME benchmark weird rule, & below
yading@10 2449 uint8_t *const ptr = dest_y + block_offset[i];
yading@10 2450 ff_svq3_add_idct_c(ptr, h->mb + i * 16 + p * 256, linesize,
yading@10 2451 h->qscale, IS_INTRA(mb_type) ? 1 : 0);
yading@10 2452 }
yading@10 2453 }
yading@10 2454 }
yading@10 2455 }
yading@10 2456
yading@10 2457 #define BITS 8
yading@10 2458 #define SIMPLE 1
yading@10 2459 #include "h264_mb_template.c"
yading@10 2460
yading@10 2461 #undef BITS
yading@10 2462 #define BITS 16
yading@10 2463 #include "h264_mb_template.c"
yading@10 2464
yading@10 2465 #undef SIMPLE
yading@10 2466 #define SIMPLE 0
yading@10 2467 #include "h264_mb_template.c"
yading@10 2468
yading@10 2469 void ff_h264_hl_decode_mb(H264Context *h)
yading@10 2470 {
yading@10 2471 const int mb_xy = h->mb_xy;
yading@10 2472 const int mb_type = h->cur_pic.mb_type[mb_xy];
yading@10 2473 int is_complex = CONFIG_SMALL || h->is_complex || IS_INTRA_PCM(mb_type) || h->qscale == 0;
yading@10 2474
yading@10 2475 if (CHROMA444(h)) {
yading@10 2476 if (is_complex || h->pixel_shift)
yading@10 2477 hl_decode_mb_444_complex(h);
yading@10 2478 else
yading@10 2479 hl_decode_mb_444_simple_8(h);
yading@10 2480 } else if (is_complex) {
yading@10 2481 hl_decode_mb_complex(h);
yading@10 2482 } else if (h->pixel_shift) {
yading@10 2483 hl_decode_mb_simple_16(h);
yading@10 2484 } else
yading@10 2485 hl_decode_mb_simple_8(h);
yading@10 2486 }
yading@10 2487
yading@10 2488 static int pred_weight_table(H264Context *h)
yading@10 2489 {
yading@10 2490 int list, i;
yading@10 2491 int luma_def, chroma_def;
yading@10 2492
yading@10 2493 h->use_weight = 0;
yading@10 2494 h->use_weight_chroma = 0;
yading@10 2495 h->luma_log2_weight_denom = get_ue_golomb(&h->gb);
yading@10 2496 if (h->sps.chroma_format_idc)
yading@10 2497 h->chroma_log2_weight_denom = get_ue_golomb(&h->gb);
yading@10 2498 luma_def = 1 << h->luma_log2_weight_denom;
yading@10 2499 chroma_def = 1 << h->chroma_log2_weight_denom;
yading@10 2500
yading@10 2501 for (list = 0; list < 2; list++) {
yading@10 2502 h->luma_weight_flag[list] = 0;
yading@10 2503 h->chroma_weight_flag[list] = 0;
yading@10 2504 for (i = 0; i < h->ref_count[list]; i++) {
yading@10 2505 int luma_weight_flag, chroma_weight_flag;
yading@10 2506
yading@10 2507 luma_weight_flag = get_bits1(&h->gb);
yading@10 2508 if (luma_weight_flag) {
yading@10 2509 h->luma_weight[i][list][0] = get_se_golomb(&h->gb);
yading@10 2510 h->luma_weight[i][list][1] = get_se_golomb(&h->gb);
yading@10 2511 if (h->luma_weight[i][list][0] != luma_def ||
yading@10 2512 h->luma_weight[i][list][1] != 0) {
yading@10 2513 h->use_weight = 1;
yading@10 2514 h->luma_weight_flag[list] = 1;
yading@10 2515 }
yading@10 2516 } else {
yading@10 2517 h->luma_weight[i][list][0] = luma_def;
yading@10 2518 h->luma_weight[i][list][1] = 0;
yading@10 2519 }
yading@10 2520
yading@10 2521 if (h->sps.chroma_format_idc) {
yading@10 2522 chroma_weight_flag = get_bits1(&h->gb);
yading@10 2523 if (chroma_weight_flag) {
yading@10 2524 int j;
yading@10 2525 for (j = 0; j < 2; j++) {
yading@10 2526 h->chroma_weight[i][list][j][0] = get_se_golomb(&h->gb);
yading@10 2527 h->chroma_weight[i][list][j][1] = get_se_golomb(&h->gb);
yading@10 2528 if (h->chroma_weight[i][list][j][0] != chroma_def ||
yading@10 2529 h->chroma_weight[i][list][j][1] != 0) {
yading@10 2530 h->use_weight_chroma = 1;
yading@10 2531 h->chroma_weight_flag[list] = 1;
yading@10 2532 }
yading@10 2533 }
yading@10 2534 } else {
yading@10 2535 int j;
yading@10 2536 for (j = 0; j < 2; j++) {
yading@10 2537 h->chroma_weight[i][list][j][0] = chroma_def;
yading@10 2538 h->chroma_weight[i][list][j][1] = 0;
yading@10 2539 }
yading@10 2540 }
yading@10 2541 }
yading@10 2542 }
yading@10 2543 if (h->slice_type_nos != AV_PICTURE_TYPE_B)
yading@10 2544 break;
yading@10 2545 }
yading@10 2546 h->use_weight = h->use_weight || h->use_weight_chroma;
yading@10 2547 return 0;
yading@10 2548 }
yading@10 2549
yading@10 2550 /**
yading@10 2551 * Initialize implicit_weight table.
yading@10 2552 * @param field 0/1 initialize the weight for interlaced MBAFF
yading@10 2553 * -1 initializes the rest
yading@10 2554 */
yading@10 2555 static void implicit_weight_table(H264Context *h, int field)
yading@10 2556 {
yading@10 2557 int ref0, ref1, i, cur_poc, ref_start, ref_count0, ref_count1;
yading@10 2558
yading@10 2559 for (i = 0; i < 2; i++) {
yading@10 2560 h->luma_weight_flag[i] = 0;
yading@10 2561 h->chroma_weight_flag[i] = 0;
yading@10 2562 }
yading@10 2563
yading@10 2564 if (field < 0) {
yading@10 2565 if (h->picture_structure == PICT_FRAME) {
yading@10 2566 cur_poc = h->cur_pic_ptr->poc;
yading@10 2567 } else {
yading@10 2568 cur_poc = h->cur_pic_ptr->field_poc[h->picture_structure - 1];
yading@10 2569 }
yading@10 2570 if (h->ref_count[0] == 1 && h->ref_count[1] == 1 && !FRAME_MBAFF(h) &&
yading@10 2571 h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2 * cur_poc) {
yading@10 2572 h->use_weight = 0;
yading@10 2573 h->use_weight_chroma = 0;
yading@10 2574 return;
yading@10 2575 }
yading@10 2576 ref_start = 0;
yading@10 2577 ref_count0 = h->ref_count[0];
yading@10 2578 ref_count1 = h->ref_count[1];
yading@10 2579 } else {
yading@10 2580 cur_poc = h->cur_pic_ptr->field_poc[field];
yading@10 2581 ref_start = 16;
yading@10 2582 ref_count0 = 16 + 2 * h->ref_count[0];
yading@10 2583 ref_count1 = 16 + 2 * h->ref_count[1];
yading@10 2584 }
yading@10 2585
yading@10 2586 h->use_weight = 2;
yading@10 2587 h->use_weight_chroma = 2;
yading@10 2588 h->luma_log2_weight_denom = 5;
yading@10 2589 h->chroma_log2_weight_denom = 5;
yading@10 2590
yading@10 2591 for (ref0 = ref_start; ref0 < ref_count0; ref0++) {
yading@10 2592 int poc0 = h->ref_list[0][ref0].poc;
yading@10 2593 for (ref1 = ref_start; ref1 < ref_count1; ref1++) {
yading@10 2594 int w = 32;
yading@10 2595 if (!h->ref_list[0][ref0].long_ref && !h->ref_list[1][ref1].long_ref) {
yading@10 2596 int poc1 = h->ref_list[1][ref1].poc;
yading@10 2597 int td = av_clip(poc1 - poc0, -128, 127);
yading@10 2598 if (td) {
yading@10 2599 int tb = av_clip(cur_poc - poc0, -128, 127);
yading@10 2600 int tx = (16384 + (FFABS(td) >> 1)) / td;
yading@10 2601 int dist_scale_factor = (tb * tx + 32) >> 8;
yading@10 2602 if (dist_scale_factor >= -64 && dist_scale_factor <= 128)
yading@10 2603 w = 64 - dist_scale_factor;
yading@10 2604 }
yading@10 2605 }
yading@10 2606 if (field < 0) {
yading@10 2607 h->implicit_weight[ref0][ref1][0] =
yading@10 2608 h->implicit_weight[ref0][ref1][1] = w;
yading@10 2609 } else {
yading@10 2610 h->implicit_weight[ref0][ref1][field] = w;
yading@10 2611 }
yading@10 2612 }
yading@10 2613 }
yading@10 2614 }
yading@10 2615
yading@10 2616 /**
yading@10 2617 * instantaneous decoder refresh.
yading@10 2618 */
yading@10 2619 static void idr(H264Context *h)
yading@10 2620 {
yading@10 2621 int i;
yading@10 2622 ff_h264_remove_all_refs(h);
yading@10 2623 h->prev_frame_num = 0;
yading@10 2624 h->prev_frame_num_offset = 0;
yading@10 2625 h->prev_poc_msb = 1<<16;
yading@10 2626 h->prev_poc_lsb = 0;
yading@10 2627 for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
yading@10 2628 h->last_pocs[i] = INT_MIN;
yading@10 2629 }
yading@10 2630
yading@10 2631 /* forget old pics after a seek */
yading@10 2632 static void flush_change(H264Context *h)
yading@10 2633 {
yading@10 2634 int i, j;
yading@10 2635
yading@10 2636 h->outputed_poc = h->next_outputed_poc = INT_MIN;
yading@10 2637 h->prev_interlaced_frame = 1;
yading@10 2638 idr(h);
yading@10 2639
yading@10 2640 h->prev_frame_num = -1;
yading@10 2641 if (h->cur_pic_ptr) {
yading@10 2642 h->cur_pic_ptr->reference = 0;
yading@10 2643 for (j=i=0; h->delayed_pic[i]; i++)
yading@10 2644 if (h->delayed_pic[i] != h->cur_pic_ptr)
yading@10 2645 h->delayed_pic[j++] = h->delayed_pic[i];
yading@10 2646 h->delayed_pic[j] = NULL;
yading@10 2647 }
yading@10 2648 h->first_field = 0;
yading@10 2649 memset(h->ref_list[0], 0, sizeof(h->ref_list[0]));
yading@10 2650 memset(h->ref_list[1], 0, sizeof(h->ref_list[1]));
yading@10 2651 memset(h->default_ref_list[0], 0, sizeof(h->default_ref_list[0]));
yading@10 2652 memset(h->default_ref_list[1], 0, sizeof(h->default_ref_list[1]));
yading@10 2653 ff_h264_reset_sei(h);
yading@10 2654 h->recovery_frame= -1;
yading@10 2655 h->sync= 0;
yading@10 2656 h->list_count = 0;
yading@10 2657 h->current_slice = 0;
yading@10 2658 }
yading@10 2659
yading@10 2660 /* forget old pics after a seek */
yading@10 2661 static void flush_dpb(AVCodecContext *avctx)
yading@10 2662 {
yading@10 2663 H264Context *h = avctx->priv_data;
yading@10 2664 int i;
yading@10 2665
yading@10 2666 for (i = 0; i <= MAX_DELAYED_PIC_COUNT; i++) {
yading@10 2667 if (h->delayed_pic[i])
yading@10 2668 h->delayed_pic[i]->reference = 0;
yading@10 2669 h->delayed_pic[i] = NULL;
yading@10 2670 }
yading@10 2671
yading@10 2672 flush_change(h);
yading@10 2673
yading@10 2674 if (h->DPB)
yading@10 2675 for (i = 0; i < MAX_PICTURE_COUNT; i++)
yading@10 2676 unref_picture(h, &h->DPB[i]);
yading@10 2677 h->cur_pic_ptr = NULL;
yading@10 2678 unref_picture(h, &h->cur_pic);
yading@10 2679
yading@10 2680 h->mb_x = h->mb_y = 0;
yading@10 2681
yading@10 2682 h->parse_context.state = -1;
yading@10 2683 h->parse_context.frame_start_found = 0;
yading@10 2684 h->parse_context.overread = 0;
yading@10 2685 h->parse_context.overread_index = 0;
yading@10 2686 h->parse_context.index = 0;
yading@10 2687 h->parse_context.last_index = 0;
yading@10 2688 }
yading@10 2689
yading@10 2690 static int init_poc(H264Context *h)
yading@10 2691 {
yading@10 2692 const int max_frame_num = 1 << h->sps.log2_max_frame_num;
yading@10 2693 int field_poc[2];
yading@10 2694 Picture *cur = h->cur_pic_ptr;
yading@10 2695
yading@10 2696 h->frame_num_offset = h->prev_frame_num_offset;
yading@10 2697 if (h->frame_num < h->prev_frame_num)
yading@10 2698 h->frame_num_offset += max_frame_num;
yading@10 2699
yading@10 2700 if (h->sps.poc_type == 0) {
yading@10 2701 const int max_poc_lsb = 1 << h->sps.log2_max_poc_lsb;
yading@10 2702
yading@10 2703 if (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb / 2)
yading@10 2704 h->poc_msb = h->prev_poc_msb + max_poc_lsb;
yading@10 2705 else if (h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb / 2)
yading@10 2706 h->poc_msb = h->prev_poc_msb - max_poc_lsb;
yading@10 2707 else
yading@10 2708 h->poc_msb = h->prev_poc_msb;
yading@10 2709 field_poc[0] =
yading@10 2710 field_poc[1] = h->poc_msb + h->poc_lsb;
yading@10 2711 if (h->picture_structure == PICT_FRAME)
yading@10 2712 field_poc[1] += h->delta_poc_bottom;
yading@10 2713 } else if (h->sps.poc_type == 1) {
yading@10 2714 int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
yading@10 2715 int i;
yading@10 2716
yading@10 2717 if (h->sps.poc_cycle_length != 0)
yading@10 2718 abs_frame_num = h->frame_num_offset + h->frame_num;
yading@10 2719 else
yading@10 2720 abs_frame_num = 0;
yading@10 2721
yading@10 2722 if (h->nal_ref_idc == 0 && abs_frame_num > 0)
yading@10 2723 abs_frame_num--;
yading@10 2724
yading@10 2725 expected_delta_per_poc_cycle = 0;
yading@10 2726 for (i = 0; i < h->sps.poc_cycle_length; i++)
yading@10 2727 // FIXME integrate during sps parse
yading@10 2728 expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[i];
yading@10 2729
yading@10 2730 if (abs_frame_num > 0) {
yading@10 2731 int poc_cycle_cnt = (abs_frame_num - 1) / h->sps.poc_cycle_length;
yading@10 2732 int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length;
yading@10 2733
yading@10 2734 expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle;
yading@10 2735 for (i = 0; i <= frame_num_in_poc_cycle; i++)
yading@10 2736 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[i];
yading@10 2737 } else
yading@10 2738 expectedpoc = 0;
yading@10 2739
yading@10 2740 if (h->nal_ref_idc == 0)
yading@10 2741 expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic;
yading@10 2742
yading@10 2743 field_poc[0] = expectedpoc + h->delta_poc[0];
yading@10 2744 field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field;
yading@10 2745
yading@10 2746 if (h->picture_structure == PICT_FRAME)
yading@10 2747 field_poc[1] += h->delta_poc[1];
yading@10 2748 } else {
yading@10 2749 int poc = 2 * (h->frame_num_offset + h->frame_num);
yading@10 2750
yading@10 2751 if (!h->nal_ref_idc)
yading@10 2752 poc--;
yading@10 2753
yading@10 2754 field_poc[0] = poc;
yading@10 2755 field_poc[1] = poc;
yading@10 2756 }
yading@10 2757
yading@10 2758 if (h->picture_structure != PICT_BOTTOM_FIELD)
yading@10 2759 h->cur_pic_ptr->field_poc[0] = field_poc[0];
yading@10 2760 if (h->picture_structure != PICT_TOP_FIELD)
yading@10 2761 h->cur_pic_ptr->field_poc[1] = field_poc[1];
yading@10 2762 cur->poc = FFMIN(cur->field_poc[0], cur->field_poc[1]);
yading@10 2763
yading@10 2764 return 0;
yading@10 2765 }
yading@10 2766
yading@10 2767 /**
yading@10 2768 * initialize scan tables
yading@10 2769 */
yading@10 2770 static void init_scan_tables(H264Context *h)
yading@10 2771 {
yading@10 2772 int i;
yading@10 2773 for (i = 0; i < 16; i++) {
yading@10 2774 #define T(x) (x >> 2) | ((x << 2) & 0xF)
yading@10 2775 h->zigzag_scan[i] = T(zigzag_scan[i]);
yading@10 2776 h->field_scan[i] = T(field_scan[i]);
yading@10 2777 #undef T
yading@10 2778 }
yading@10 2779 for (i = 0; i < 64; i++) {
yading@10 2780 #define T(x) (x >> 3) | ((x & 7) << 3)
yading@10 2781 h->zigzag_scan8x8[i] = T(ff_zigzag_direct[i]);
yading@10 2782 h->zigzag_scan8x8_cavlc[i] = T(zigzag_scan8x8_cavlc[i]);
yading@10 2783 h->field_scan8x8[i] = T(field_scan8x8[i]);
yading@10 2784 h->field_scan8x8_cavlc[i] = T(field_scan8x8_cavlc[i]);
yading@10 2785 #undef T
yading@10 2786 }
yading@10 2787 if (h->sps.transform_bypass) { // FIXME same ugly
yading@10 2788 memcpy(h->zigzag_scan_q0 , zigzag_scan , sizeof(h->zigzag_scan_q0 ));
yading@10 2789 memcpy(h->zigzag_scan8x8_q0 , ff_zigzag_direct , sizeof(h->zigzag_scan8x8_q0 ));
yading@10 2790 memcpy(h->zigzag_scan8x8_cavlc_q0 , zigzag_scan8x8_cavlc , sizeof(h->zigzag_scan8x8_cavlc_q0));
yading@10 2791 memcpy(h->field_scan_q0 , field_scan , sizeof(h->field_scan_q0 ));
yading@10 2792 memcpy(h->field_scan8x8_q0 , field_scan8x8 , sizeof(h->field_scan8x8_q0 ));
yading@10 2793 memcpy(h->field_scan8x8_cavlc_q0 , field_scan8x8_cavlc , sizeof(h->field_scan8x8_cavlc_q0 ));
yading@10 2794 } else {
yading@10 2795 memcpy(h->zigzag_scan_q0 , h->zigzag_scan , sizeof(h->zigzag_scan_q0 ));
yading@10 2796 memcpy(h->zigzag_scan8x8_q0 , h->zigzag_scan8x8 , sizeof(h->zigzag_scan8x8_q0 ));
yading@10 2797 memcpy(h->zigzag_scan8x8_cavlc_q0 , h->zigzag_scan8x8_cavlc , sizeof(h->zigzag_scan8x8_cavlc_q0));
yading@10 2798 memcpy(h->field_scan_q0 , h->field_scan , sizeof(h->field_scan_q0 ));
yading@10 2799 memcpy(h->field_scan8x8_q0 , h->field_scan8x8 , sizeof(h->field_scan8x8_q0 ));
yading@10 2800 memcpy(h->field_scan8x8_cavlc_q0 , h->field_scan8x8_cavlc , sizeof(h->field_scan8x8_cavlc_q0 ));
yading@10 2801 }
yading@10 2802 }
yading@10 2803
yading@10 2804 static int field_end(H264Context *h, int in_setup)
yading@10 2805 {
yading@10 2806 AVCodecContext *const avctx = h->avctx;
yading@10 2807 int err = 0;
yading@10 2808 h->mb_y = 0;
yading@10 2809
yading@10 2810 if (CONFIG_H264_VDPAU_DECODER &&
yading@10 2811 h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
yading@10 2812 ff_vdpau_h264_set_reference_frames(h);
yading@10 2813
yading@10 2814 if (in_setup || !(avctx->active_thread_type & FF_THREAD_FRAME)) {
yading@10 2815 if (!h->droppable) {
yading@10 2816 err = ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
yading@10 2817 h->prev_poc_msb = h->poc_msb;
yading@10 2818 h->prev_poc_lsb = h->poc_lsb;
yading@10 2819 }
yading@10 2820 h->prev_frame_num_offset = h->frame_num_offset;
yading@10 2821 h->prev_frame_num = h->frame_num;
yading@10 2822 h->outputed_poc = h->next_outputed_poc;
yading@10 2823 }
yading@10 2824
yading@10 2825 if (avctx->hwaccel) {
yading@10 2826 if (avctx->hwaccel->end_frame(avctx) < 0)
yading@10 2827 av_log(avctx, AV_LOG_ERROR,
yading@10 2828 "hardware accelerator failed to decode picture\n");
yading@10 2829 }
yading@10 2830
yading@10 2831 if (CONFIG_H264_VDPAU_DECODER &&
yading@10 2832 h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
yading@10 2833 ff_vdpau_h264_picture_complete(h);
yading@10 2834
yading@10 2835 /*
yading@10 2836 * FIXME: Error handling code does not seem to support interlaced
yading@10 2837 * when slices span multiple rows
yading@10 2838 * The ff_er_add_slice calls don't work right for bottom
yading@10 2839 * fields; they cause massive erroneous error concealing
yading@10 2840 * Error marking covers both fields (top and bottom).
yading@10 2841 * This causes a mismatched s->error_count
yading@10 2842 * and a bad error table. Further, the error count goes to
yading@10 2843 * INT_MAX when called for bottom field, because mb_y is
yading@10 2844 * past end by one (callers fault) and resync_mb_y != 0
yading@10 2845 * causes problems for the first MB line, too.
yading@10 2846 */
yading@10 2847 if (CONFIG_ERROR_RESILIENCE &&
yading@10 2848 !FIELD_PICTURE(h) && h->current_slice && !h->sps.new) {
yading@10 2849 h->er.cur_pic = h->cur_pic_ptr;
yading@10 2850 ff_er_frame_end(&h->er);
yading@10 2851 }
yading@10 2852 if (!in_setup && !h->droppable)
yading@10 2853 ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
yading@10 2854 h->picture_structure == PICT_BOTTOM_FIELD);
yading@10 2855 emms_c();
yading@10 2856
yading@10 2857 h->current_slice = 0;
yading@10 2858
yading@10 2859 return err;
yading@10 2860 }
yading@10 2861
yading@10 2862 /**
yading@10 2863 * Replicate H264 "master" context to thread contexts.
yading@10 2864 */
yading@10 2865 static int clone_slice(H264Context *dst, H264Context *src)
yading@10 2866 {
yading@10 2867 memcpy(dst->block_offset, src->block_offset, sizeof(dst->block_offset));
yading@10 2868 dst->cur_pic_ptr = src->cur_pic_ptr;
yading@10 2869 dst->cur_pic = src->cur_pic;
yading@10 2870 dst->linesize = src->linesize;
yading@10 2871 dst->uvlinesize = src->uvlinesize;
yading@10 2872 dst->first_field = src->first_field;
yading@10 2873
yading@10 2874 dst->prev_poc_msb = src->prev_poc_msb;
yading@10 2875 dst->prev_poc_lsb = src->prev_poc_lsb;
yading@10 2876 dst->prev_frame_num_offset = src->prev_frame_num_offset;
yading@10 2877 dst->prev_frame_num = src->prev_frame_num;
yading@10 2878 dst->short_ref_count = src->short_ref_count;
yading@10 2879
yading@10 2880 memcpy(dst->short_ref, src->short_ref, sizeof(dst->short_ref));
yading@10 2881 memcpy(dst->long_ref, src->long_ref, sizeof(dst->long_ref));
yading@10 2882 memcpy(dst->default_ref_list, src->default_ref_list, sizeof(dst->default_ref_list));
yading@10 2883
yading@10 2884 memcpy(dst->dequant4_coeff, src->dequant4_coeff, sizeof(src->dequant4_coeff));
yading@10 2885 memcpy(dst->dequant8_coeff, src->dequant8_coeff, sizeof(src->dequant8_coeff));
yading@10 2886
yading@10 2887 return 0;
yading@10 2888 }
yading@10 2889
yading@10 2890 /**
yading@10 2891 * Compute profile from profile_idc and constraint_set?_flags.
yading@10 2892 *
yading@10 2893 * @param sps SPS
yading@10 2894 *
yading@10 2895 * @return profile as defined by FF_PROFILE_H264_*
yading@10 2896 */
yading@10 2897 int ff_h264_get_profile(SPS *sps)
yading@10 2898 {
yading@10 2899 int profile = sps->profile_idc;
yading@10 2900
yading@10 2901 switch (sps->profile_idc) {
yading@10 2902 case FF_PROFILE_H264_BASELINE:
yading@10 2903 // constraint_set1_flag set to 1
yading@10 2904 profile |= (sps->constraint_set_flags & 1 << 1) ? FF_PROFILE_H264_CONSTRAINED : 0;
yading@10 2905 break;
yading@10 2906 case FF_PROFILE_H264_HIGH_10:
yading@10 2907 case FF_PROFILE_H264_HIGH_422:
yading@10 2908 case FF_PROFILE_H264_HIGH_444_PREDICTIVE:
yading@10 2909 // constraint_set3_flag set to 1
yading@10 2910 profile |= (sps->constraint_set_flags & 1 << 3) ? FF_PROFILE_H264_INTRA : 0;
yading@10 2911 break;
yading@10 2912 }
yading@10 2913
yading@10 2914 return profile;
yading@10 2915 }
yading@10 2916
yading@10 2917 static int h264_set_parameter_from_sps(H264Context *h)
yading@10 2918 {
yading@10 2919 if (h->flags & CODEC_FLAG_LOW_DELAY ||
yading@10 2920 (h->sps.bitstream_restriction_flag &&
yading@10 2921 !h->sps.num_reorder_frames)) {
yading@10 2922 if (h->avctx->has_b_frames > 1 || h->delayed_pic[0])
yading@10 2923 av_log(h->avctx, AV_LOG_WARNING, "Delayed frames seen. "
yading@10 2924 "Reenabling low delay requires a codec flush.\n");
yading@10 2925 else
yading@10 2926 h->low_delay = 1;
yading@10 2927 }
yading@10 2928
yading@10 2929 if (h->avctx->has_b_frames < 2)
yading@10 2930 h->avctx->has_b_frames = !h->low_delay;
yading@10 2931
yading@10 2932 if (h->sps.bit_depth_luma != h->sps.bit_depth_chroma) {
yading@10 2933 avpriv_request_sample(h->avctx,
yading@10 2934 "Different chroma and luma bit depth");
yading@10 2935 return AVERROR_PATCHWELCOME;
yading@10 2936 }
yading@10 2937
yading@10 2938 if (h->avctx->bits_per_raw_sample != h->sps.bit_depth_luma ||
yading@10 2939 h->cur_chroma_format_idc != h->sps.chroma_format_idc) {
yading@10 2940 if (h->avctx->codec &&
yading@10 2941 h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU &&
yading@10 2942 (h->sps.bit_depth_luma != 8 || h->sps.chroma_format_idc > 1)) {
yading@10 2943 av_log(h->avctx, AV_LOG_ERROR,
yading@10 2944 "VDPAU decoding does not support video colorspace.\n");
yading@10 2945 return AVERROR_INVALIDDATA;
yading@10 2946 }
yading@10 2947 if (h->sps.bit_depth_luma >= 8 && h->sps.bit_depth_luma <= 14 &&
yading@10 2948 h->sps.bit_depth_luma != 11 && h->sps.bit_depth_luma != 13) {
yading@10 2949 h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma;
yading@10 2950 h->cur_chroma_format_idc = h->sps.chroma_format_idc;
yading@10 2951 h->pixel_shift = h->sps.bit_depth_luma > 8;
yading@10 2952
yading@10 2953 ff_h264dsp_init(&h->h264dsp, h->sps.bit_depth_luma,
yading@10 2954 h->sps.chroma_format_idc);
yading@10 2955 ff_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma);
yading@10 2956 ff_h264qpel_init(&h->h264qpel, h->sps.bit_depth_luma);
yading@10 2957 ff_h264_pred_init(&h->hpc, h->avctx->codec_id, h->sps.bit_depth_luma,
yading@10 2958 h->sps.chroma_format_idc);
yading@10 2959
yading@10 2960 if (CONFIG_ERROR_RESILIENCE)
yading@10 2961 ff_dsputil_init(&h->dsp, h->avctx);
yading@10 2962 ff_videodsp_init(&h->vdsp, h->sps.bit_depth_luma);
yading@10 2963 } else {
yading@10 2964 av_log(h->avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n",
yading@10 2965 h->sps.bit_depth_luma);
yading@10 2966 return AVERROR_INVALIDDATA;
yading@10 2967 }
yading@10 2968 }
yading@10 2969 return 0;
yading@10 2970 }
yading@10 2971
yading@10 2972 static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
yading@10 2973 {
yading@10 2974 switch (h->sps.bit_depth_luma) {
yading@10 2975 case 9:
yading@10 2976 if (CHROMA444(h)) {
yading@10 2977 if (h->avctx->colorspace == AVCOL_SPC_RGB) {
yading@10 2978 return AV_PIX_FMT_GBRP9;
yading@10 2979 } else
yading@10 2980 return AV_PIX_FMT_YUV444P9;
yading@10 2981 } else if (CHROMA422(h))
yading@10 2982 return AV_PIX_FMT_YUV422P9;
yading@10 2983 else
yading@10 2984 return AV_PIX_FMT_YUV420P9;
yading@10 2985 break;
yading@10 2986 case 10:
yading@10 2987 if (CHROMA444(h)) {
yading@10 2988 if (h->avctx->colorspace == AVCOL_SPC_RGB) {
yading@10 2989 return AV_PIX_FMT_GBRP10;
yading@10 2990 } else
yading@10 2991 return AV_PIX_FMT_YUV444P10;
yading@10 2992 } else if (CHROMA422(h))
yading@10 2993 return AV_PIX_FMT_YUV422P10;
yading@10 2994 else
yading@10 2995 return AV_PIX_FMT_YUV420P10;
yading@10 2996 break;
yading@10 2997 case 12:
yading@10 2998 if (CHROMA444(h)) {
yading@10 2999 if (h->avctx->colorspace == AVCOL_SPC_RGB) {
yading@10 3000 return AV_PIX_FMT_GBRP12;
yading@10 3001 } else
yading@10 3002 return AV_PIX_FMT_YUV444P12;
yading@10 3003 } else if (CHROMA422(h))
yading@10 3004 return AV_PIX_FMT_YUV422P12;
yading@10 3005 else
yading@10 3006 return AV_PIX_FMT_YUV420P12;
yading@10 3007 break;
yading@10 3008 case 14:
yading@10 3009 if (CHROMA444(h)) {
yading@10 3010 if (h->avctx->colorspace == AVCOL_SPC_RGB) {
yading@10 3011 return AV_PIX_FMT_GBRP14;
yading@10 3012 } else
yading@10 3013 return AV_PIX_FMT_YUV444P14;
yading@10 3014 } else if (CHROMA422(h))
yading@10 3015 return AV_PIX_FMT_YUV422P14;
yading@10 3016 else
yading@10 3017 return AV_PIX_FMT_YUV420P14;
yading@10 3018 break;
yading@10 3019 case 8:
yading@10 3020 if (CHROMA444(h)) {
yading@10 3021 if (h->avctx->colorspace == AVCOL_SPC_RGB) {
yading@10 3022 av_log(h->avctx, AV_LOG_DEBUG, "Detected GBR colorspace.\n");
yading@10 3023 return AV_PIX_FMT_GBR24P;
yading@10 3024 } else if (h->avctx->colorspace == AVCOL_SPC_YCGCO) {
yading@10 3025 av_log(h->avctx, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
yading@10 3026 }
yading@10 3027 return h->avctx->color_range == AVCOL_RANGE_JPEG ? AV_PIX_FMT_YUVJ444P
yading@10 3028 : AV_PIX_FMT_YUV444P;
yading@10 3029 } else if (CHROMA422(h)) {
yading@10 3030 return h->avctx->color_range == AVCOL_RANGE_JPEG ? AV_PIX_FMT_YUVJ422P
yading@10 3031 : AV_PIX_FMT_YUV422P;
yading@10 3032 } else {
yading@10 3033 int i;
yading@10 3034 const enum AVPixelFormat * fmt = h->avctx->codec->pix_fmts ?
yading@10 3035 h->avctx->codec->pix_fmts :
yading@10 3036 h->avctx->color_range == AVCOL_RANGE_JPEG ?
yading@10 3037 h264_hwaccel_pixfmt_list_jpeg_420 :
yading@10 3038 h264_hwaccel_pixfmt_list_420;
yading@10 3039
yading@10 3040 for (i=0; fmt[i] != AV_PIX_FMT_NONE; i++)
yading@10 3041 if (fmt[i] == h->avctx->pix_fmt && !force_callback)
yading@10 3042 return fmt[i];
yading@10 3043 return ff_thread_get_format(h->avctx, fmt);
yading@10 3044 }
yading@10 3045 break;
yading@10 3046 default:
yading@10 3047 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3048 "Unsupported bit depth: %d\n", h->sps.bit_depth_luma);
yading@10 3049 return AVERROR_INVALIDDATA;
yading@10 3050 }
yading@10 3051 }
yading@10 3052
yading@10 3053 /* export coded and cropped frame dimensions to AVCodecContext */
yading@10 3054 static int init_dimensions(H264Context *h)
yading@10 3055 {
yading@10 3056 int width = h->width - (h->sps.crop_right + h->sps.crop_left);
yading@10 3057 int height = h->height - (h->sps.crop_top + h->sps.crop_bottom);
yading@10 3058
yading@10 3059 /* handle container cropping */
yading@10 3060 if (!h->sps.crop &&
yading@10 3061 FFALIGN(h->avctx->width, 16) == h->width &&
yading@10 3062 FFALIGN(h->avctx->height, 16) == h->height) {
yading@10 3063 width = h->avctx->width;
yading@10 3064 height = h->avctx->height;
yading@10 3065 }
yading@10 3066
yading@10 3067 if (width <= 0 || height <= 0) {
yading@10 3068 av_log(h->avctx, AV_LOG_ERROR, "Invalid cropped dimensions: %dx%d.\n",
yading@10 3069 width, height);
yading@10 3070 if (h->avctx->err_recognition & AV_EF_EXPLODE)
yading@10 3071 return AVERROR_INVALIDDATA;
yading@10 3072
yading@10 3073 av_log(h->avctx, AV_LOG_WARNING, "Ignoring cropping information.\n");
yading@10 3074 h->sps.crop_bottom = h->sps.crop_top = h->sps.crop_right = h->sps.crop_left = 0;
yading@10 3075 h->sps.crop = 0;
yading@10 3076
yading@10 3077 width = h->width;
yading@10 3078 height = h->height;
yading@10 3079 }
yading@10 3080
yading@10 3081 h->avctx->coded_width = h->width;
yading@10 3082 h->avctx->coded_height = h->height;
yading@10 3083 h->avctx->width = width;
yading@10 3084 h->avctx->height = height;
yading@10 3085
yading@10 3086 return 0;
yading@10 3087 }
yading@10 3088
yading@10 3089 static int h264_slice_header_init(H264Context *h, int reinit)
yading@10 3090 {
yading@10 3091 int nb_slices = (HAVE_THREADS &&
yading@10 3092 h->avctx->active_thread_type & FF_THREAD_SLICE) ?
yading@10 3093 h->avctx->thread_count : 1;
yading@10 3094 int i;
yading@10 3095
yading@10 3096 h->avctx->sample_aspect_ratio = h->sps.sar;
yading@10 3097 av_assert0(h->avctx->sample_aspect_ratio.den);
yading@10 3098 av_pix_fmt_get_chroma_sub_sample(h->avctx->pix_fmt,
yading@10 3099 &h->chroma_x_shift, &h->chroma_y_shift);
yading@10 3100
yading@10 3101 if (h->sps.timing_info_present_flag) {
yading@10 3102 int64_t den = h->sps.time_scale;
yading@10 3103 if (h->x264_build < 44U)
yading@10 3104 den *= 2;
yading@10 3105 av_reduce(&h->avctx->time_base.num, &h->avctx->time_base.den,
yading@10 3106 h->sps.num_units_in_tick, den, 1 << 30);
yading@10 3107 }
yading@10 3108
yading@10 3109 h->avctx->hwaccel = ff_find_hwaccel(h->avctx->codec->id, h->avctx->pix_fmt);
yading@10 3110
yading@10 3111 if (reinit)
yading@10 3112 free_tables(h, 0);
yading@10 3113 h->first_field = 0;
yading@10 3114 h->prev_interlaced_frame = 1;
yading@10 3115
yading@10 3116 init_scan_tables(h);
yading@10 3117 if (ff_h264_alloc_tables(h) < 0) {
yading@10 3118 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3119 "Could not allocate memory for h264\n");
yading@10 3120 return AVERROR(ENOMEM);
yading@10 3121 }
yading@10 3122
yading@10 3123 if (nb_slices > MAX_THREADS || (nb_slices > h->mb_height && h->mb_height)) {
yading@10 3124 int max_slices;
yading@10 3125 if (h->mb_height)
yading@10 3126 max_slices = FFMIN(MAX_THREADS, h->mb_height);
yading@10 3127 else
yading@10 3128 max_slices = MAX_THREADS;
yading@10 3129 av_log(h->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
yading@10 3130 " reducing to %d\n", nb_slices, max_slices);
yading@10 3131 nb_slices = max_slices;
yading@10 3132 }
yading@10 3133 h->slice_context_count = nb_slices;
yading@10 3134
yading@10 3135 if (!HAVE_THREADS || !(h->avctx->active_thread_type & FF_THREAD_SLICE)) {
yading@10 3136 if (context_init(h) < 0) {
yading@10 3137 av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
yading@10 3138 return -1;
yading@10 3139 }
yading@10 3140 } else {
yading@10 3141 for (i = 1; i < h->slice_context_count; i++) {
yading@10 3142 H264Context *c;
yading@10 3143 c = h->thread_context[i] = av_mallocz(sizeof(H264Context));
yading@10 3144 c->avctx = h->avctx;
yading@10 3145 if (CONFIG_ERROR_RESILIENCE) {
yading@10 3146 c->dsp = h->dsp;
yading@10 3147 }
yading@10 3148 c->vdsp = h->vdsp;
yading@10 3149 c->h264dsp = h->h264dsp;
yading@10 3150 c->h264qpel = h->h264qpel;
yading@10 3151 c->h264chroma = h->h264chroma;
yading@10 3152 c->sps = h->sps;
yading@10 3153 c->pps = h->pps;
yading@10 3154 c->pixel_shift = h->pixel_shift;
yading@10 3155 c->cur_chroma_format_idc = h->cur_chroma_format_idc;
yading@10 3156 c->width = h->width;
yading@10 3157 c->height = h->height;
yading@10 3158 c->linesize = h->linesize;
yading@10 3159 c->uvlinesize = h->uvlinesize;
yading@10 3160 c->chroma_x_shift = h->chroma_x_shift;
yading@10 3161 c->chroma_y_shift = h->chroma_y_shift;
yading@10 3162 c->qscale = h->qscale;
yading@10 3163 c->droppable = h->droppable;
yading@10 3164 c->data_partitioning = h->data_partitioning;
yading@10 3165 c->low_delay = h->low_delay;
yading@10 3166 c->mb_width = h->mb_width;
yading@10 3167 c->mb_height = h->mb_height;
yading@10 3168 c->mb_stride = h->mb_stride;
yading@10 3169 c->mb_num = h->mb_num;
yading@10 3170 c->flags = h->flags;
yading@10 3171 c->workaround_bugs = h->workaround_bugs;
yading@10 3172 c->pict_type = h->pict_type;
yading@10 3173
yading@10 3174 init_scan_tables(c);
yading@10 3175 clone_tables(c, h, i);
yading@10 3176 c->context_initialized = 1;
yading@10 3177 }
yading@10 3178
yading@10 3179 for (i = 0; i < h->slice_context_count; i++)
yading@10 3180 if (context_init(h->thread_context[i]) < 0) {
yading@10 3181 av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
yading@10 3182 return -1;
yading@10 3183 }
yading@10 3184 }
yading@10 3185
yading@10 3186 h->context_initialized = 1;
yading@10 3187
yading@10 3188 return 0;
yading@10 3189 }
yading@10 3190
yading@10 3191 /**
yading@10 3192 * Decode a slice header.
yading@10 3193 * This will also call ff_MPV_common_init() and frame_start() as needed.
yading@10 3194 *
yading@10 3195 * @param h h264context
yading@10 3196 * @param h0 h264 master context (differs from 'h' when doing sliced based
yading@10 3197 * parallel decoding)
yading@10 3198 *
yading@10 3199 * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded
yading@10 3200 */
yading@10 3201 static int decode_slice_header(H264Context *h, H264Context *h0)
yading@10 3202 {
yading@10 3203 unsigned int first_mb_in_slice;
yading@10 3204 unsigned int pps_id;
yading@10 3205 int num_ref_idx_active_override_flag, ret;
yading@10 3206 unsigned int slice_type, tmp, i, j;
yading@10 3207 int last_pic_structure, last_pic_droppable;
yading@10 3208 int must_reinit;
yading@10 3209 int needs_reinit = 0;
yading@10 3210
yading@10 3211 h->me.qpel_put = h->h264qpel.put_h264_qpel_pixels_tab;
yading@10 3212 h->me.qpel_avg = h->h264qpel.avg_h264_qpel_pixels_tab;
yading@10 3213
yading@10 3214 first_mb_in_slice = get_ue_golomb_long(&h->gb);
yading@10 3215
yading@10 3216 if (first_mb_in_slice == 0) { // FIXME better field boundary detection
yading@10 3217 if (h0->current_slice && FIELD_PICTURE(h)) {
yading@10 3218 field_end(h, 1);
yading@10 3219 }
yading@10 3220
yading@10 3221 h0->current_slice = 0;
yading@10 3222 if (!h0->first_field) {
yading@10 3223 if (h->cur_pic_ptr && !h->droppable) {
yading@10 3224 ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
yading@10 3225 h->picture_structure == PICT_BOTTOM_FIELD);
yading@10 3226 }
yading@10 3227 h->cur_pic_ptr = NULL;
yading@10 3228 }
yading@10 3229 }
yading@10 3230
yading@10 3231 slice_type = get_ue_golomb_31(&h->gb);
yading@10 3232 if (slice_type > 9) {
yading@10 3233 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3234 "slice type too large (%d) at %d %d\n",
yading@10 3235 slice_type, h->mb_x, h->mb_y);
yading@10 3236 return -1;
yading@10 3237 }
yading@10 3238 if (slice_type > 4) {
yading@10 3239 slice_type -= 5;
yading@10 3240 h->slice_type_fixed = 1;
yading@10 3241 } else
yading@10 3242 h->slice_type_fixed = 0;
yading@10 3243
yading@10 3244 slice_type = golomb_to_pict_type[slice_type];
yading@10 3245 h->slice_type = slice_type;
yading@10 3246 h->slice_type_nos = slice_type & 3;
yading@10 3247
yading@10 3248 // to make a few old functions happy, it's wrong though
yading@10 3249 h->pict_type = h->slice_type;
yading@10 3250
yading@10 3251 pps_id = get_ue_golomb(&h->gb);
yading@10 3252 if (pps_id >= MAX_PPS_COUNT) {
yading@10 3253 av_log(h->avctx, AV_LOG_ERROR, "pps_id %d out of range\n", pps_id);
yading@10 3254 return -1;
yading@10 3255 }
yading@10 3256 if (!h0->pps_buffers[pps_id]) {
yading@10 3257 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3258 "non-existing PPS %u referenced\n",
yading@10 3259 pps_id);
yading@10 3260 return -1;
yading@10 3261 }
yading@10 3262 h->pps = *h0->pps_buffers[pps_id];
yading@10 3263
yading@10 3264 if (!h0->sps_buffers[h->pps.sps_id]) {
yading@10 3265 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3266 "non-existing SPS %u referenced\n",
yading@10 3267 h->pps.sps_id);
yading@10 3268 return -1;
yading@10 3269 }
yading@10 3270
yading@10 3271 if (h->pps.sps_id != h->current_sps_id ||
yading@10 3272 h0->sps_buffers[h->pps.sps_id]->new) {
yading@10 3273 h0->sps_buffers[h->pps.sps_id]->new = 0;
yading@10 3274
yading@10 3275 h->current_sps_id = h->pps.sps_id;
yading@10 3276 h->sps = *h0->sps_buffers[h->pps.sps_id];
yading@10 3277
yading@10 3278 if (h->mb_width != h->sps.mb_width ||
yading@10 3279 h->mb_height != h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag) ||
yading@10 3280 h->avctx->bits_per_raw_sample != h->sps.bit_depth_luma ||
yading@10 3281 h->cur_chroma_format_idc != h->sps.chroma_format_idc
yading@10 3282 )
yading@10 3283 needs_reinit = 1;
yading@10 3284
yading@10 3285 if (h->bit_depth_luma != h->sps.bit_depth_luma ||
yading@10 3286 h->chroma_format_idc != h->sps.chroma_format_idc) {
yading@10 3287 h->bit_depth_luma = h->sps.bit_depth_luma;
yading@10 3288 h->chroma_format_idc = h->sps.chroma_format_idc;
yading@10 3289 needs_reinit = 1;
yading@10 3290 }
yading@10 3291 if ((ret = h264_set_parameter_from_sps(h)) < 0)
yading@10 3292 return ret;
yading@10 3293 }
yading@10 3294
yading@10 3295 h->avctx->profile = ff_h264_get_profile(&h->sps);
yading@10 3296 h->avctx->level = h->sps.level_idc;
yading@10 3297 h->avctx->refs = h->sps.ref_frame_count;
yading@10 3298
yading@10 3299 must_reinit = (h->context_initialized &&
yading@10 3300 ( 16*h->sps.mb_width != h->avctx->coded_width
yading@10 3301 || 16*h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag) != h->avctx->coded_height
yading@10 3302 || h->avctx->bits_per_raw_sample != h->sps.bit_depth_luma
yading@10 3303 || h->cur_chroma_format_idc != h->sps.chroma_format_idc
yading@10 3304 || av_cmp_q(h->sps.sar, h->avctx->sample_aspect_ratio)));
yading@10 3305 if (h0->avctx->pix_fmt != get_pixel_format(h0, 0))
yading@10 3306 must_reinit = 1;
yading@10 3307
yading@10 3308 h->mb_width = h->sps.mb_width;
yading@10 3309 h->mb_height = h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag);
yading@10 3310 h->mb_num = h->mb_width * h->mb_height;
yading@10 3311 h->mb_stride = h->mb_width + 1;
yading@10 3312
yading@10 3313 h->b_stride = h->mb_width * 4;
yading@10 3314
yading@10 3315 h->chroma_y_shift = h->sps.chroma_format_idc <= 1; // 400 uses yuv420p
yading@10 3316
yading@10 3317 h->width = 16 * h->mb_width;
yading@10 3318 h->height = 16 * h->mb_height;
yading@10 3319
yading@10 3320 ret = init_dimensions(h);
yading@10 3321 if (ret < 0)
yading@10 3322 return ret;
yading@10 3323
yading@10 3324 if (h->sps.video_signal_type_present_flag) {
yading@10 3325 h->avctx->color_range = h->sps.full_range>0 ? AVCOL_RANGE_JPEG
yading@10 3326 : AVCOL_RANGE_MPEG;
yading@10 3327 if (h->sps.colour_description_present_flag) {
yading@10 3328 if (h->avctx->colorspace != h->sps.colorspace)
yading@10 3329 needs_reinit = 1;
yading@10 3330 h->avctx->color_primaries = h->sps.color_primaries;
yading@10 3331 h->avctx->color_trc = h->sps.color_trc;
yading@10 3332 h->avctx->colorspace = h->sps.colorspace;
yading@10 3333 }
yading@10 3334 }
yading@10 3335
yading@10 3336 if (h->context_initialized &&
yading@10 3337 (h->width != h->avctx->coded_width ||
yading@10 3338 h->height != h->avctx->coded_height ||
yading@10 3339 must_reinit ||
yading@10 3340 needs_reinit)) {
yading@10 3341
yading@10 3342 if (h != h0) {
yading@10 3343 av_log(h->avctx, AV_LOG_ERROR, "changing width/height on "
yading@10 3344 "slice %d\n", h0->current_slice + 1);
yading@10 3345 return AVERROR_INVALIDDATA;
yading@10 3346 }
yading@10 3347
yading@10 3348 flush_change(h);
yading@10 3349
yading@10 3350 if ((ret = get_pixel_format(h, 1)) < 0)
yading@10 3351 return ret;
yading@10 3352 h->avctx->pix_fmt = ret;
yading@10 3353
yading@10 3354 av_log(h->avctx, AV_LOG_INFO, "Reinit context to %dx%d, "
yading@10 3355 "pix_fmt: %d\n", h->width, h->height, h->avctx->pix_fmt);
yading@10 3356
yading@10 3357 if ((ret = h264_slice_header_init(h, 1)) < 0) {
yading@10 3358 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3359 "h264_slice_header_init() failed\n");
yading@10 3360 return ret;
yading@10 3361 }
yading@10 3362 }
yading@10 3363 if (!h->context_initialized) {
yading@10 3364 if (h != h0) {
yading@10 3365 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3366 "Cannot (re-)initialize context during parallel decoding.\n");
yading@10 3367 return -1;
yading@10 3368 }
yading@10 3369
yading@10 3370 if ((ret = get_pixel_format(h, 1)) < 0)
yading@10 3371 return ret;
yading@10 3372 h->avctx->pix_fmt = ret;
yading@10 3373
yading@10 3374 if ((ret = h264_slice_header_init(h, 0)) < 0) {
yading@10 3375 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3376 "h264_slice_header_init() failed\n");
yading@10 3377 return ret;
yading@10 3378 }
yading@10 3379 }
yading@10 3380
yading@10 3381 if (h == h0 && h->dequant_coeff_pps != pps_id) {
yading@10 3382 h->dequant_coeff_pps = pps_id;
yading@10 3383 init_dequant_tables(h);
yading@10 3384 }
yading@10 3385
yading@10 3386 h->frame_num = get_bits(&h->gb, h->sps.log2_max_frame_num);
yading@10 3387
yading@10 3388 h->mb_mbaff = 0;
yading@10 3389 h->mb_aff_frame = 0;
yading@10 3390 last_pic_structure = h0->picture_structure;
yading@10 3391 last_pic_droppable = h0->droppable;
yading@10 3392 h->droppable = h->nal_ref_idc == 0;
yading@10 3393 if (h->sps.frame_mbs_only_flag) {
yading@10 3394 h->picture_structure = PICT_FRAME;
yading@10 3395 } else {
yading@10 3396 if (!h->sps.direct_8x8_inference_flag && slice_type == AV_PICTURE_TYPE_B) {
yading@10 3397 av_log(h->avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
yading@10 3398 return -1;
yading@10 3399 }
yading@10 3400 if (get_bits1(&h->gb)) { // field_pic_flag
yading@10 3401 h->picture_structure = PICT_TOP_FIELD + get_bits1(&h->gb); // bottom_field_flag
yading@10 3402 } else {
yading@10 3403 h->picture_structure = PICT_FRAME;
yading@10 3404 h->mb_aff_frame = h->sps.mb_aff;
yading@10 3405 }
yading@10 3406 }
yading@10 3407 h->mb_field_decoding_flag = h->picture_structure != PICT_FRAME;
yading@10 3408
yading@10 3409 if (h0->current_slice != 0) {
yading@10 3410 if (last_pic_structure != h->picture_structure ||
yading@10 3411 last_pic_droppable != h->droppable) {
yading@10 3412 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3413 "Changing field mode (%d -> %d) between slices is not allowed\n",
yading@10 3414 last_pic_structure, h->picture_structure);
yading@10 3415 h->picture_structure = last_pic_structure;
yading@10 3416 h->droppable = last_pic_droppable;
yading@10 3417 return AVERROR_INVALIDDATA;
yading@10 3418 } else if (!h0->cur_pic_ptr) {
yading@10 3419 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3420 "unset cur_pic_ptr on %d. slice\n",
yading@10 3421 h0->current_slice + 1);
yading@10 3422 return AVERROR_INVALIDDATA;
yading@10 3423 }
yading@10 3424 } else {
yading@10 3425 /* Shorten frame num gaps so we don't have to allocate reference
yading@10 3426 * frames just to throw them away */
yading@10 3427 if (h->frame_num != h->prev_frame_num && h->prev_frame_num >= 0) {
yading@10 3428 int unwrap_prev_frame_num = h->prev_frame_num;
yading@10 3429 int max_frame_num = 1 << h->sps.log2_max_frame_num;
yading@10 3430
yading@10 3431 if (unwrap_prev_frame_num > h->frame_num)
yading@10 3432 unwrap_prev_frame_num -= max_frame_num;
yading@10 3433
yading@10 3434 if ((h->frame_num - unwrap_prev_frame_num) > h->sps.ref_frame_count) {
yading@10 3435 unwrap_prev_frame_num = (h->frame_num - h->sps.ref_frame_count) - 1;
yading@10 3436 if (unwrap_prev_frame_num < 0)
yading@10 3437 unwrap_prev_frame_num += max_frame_num;
yading@10 3438
yading@10 3439 h->prev_frame_num = unwrap_prev_frame_num;
yading@10 3440 }
yading@10 3441 }
yading@10 3442
yading@10 3443 /* See if we have a decoded first field looking for a pair...
yading@10 3444 * Here, we're using that to see if we should mark previously
yading@10 3445 * decode frames as "finished".
yading@10 3446 * We have to do that before the "dummy" in-between frame allocation,
yading@10 3447 * since that can modify h->cur_pic_ptr. */
yading@10 3448 if (h0->first_field) {
yading@10 3449 assert(h0->cur_pic_ptr);
yading@10 3450 assert(h0->cur_pic_ptr->f.data[0]);
yading@10 3451 assert(h0->cur_pic_ptr->reference != DELAYED_PIC_REF);
yading@10 3452
yading@10 3453 /* Mark old field/frame as completed */
yading@10 3454 if (!last_pic_droppable && h0->cur_pic_ptr->tf.owner == h0->avctx) {
yading@10 3455 ff_thread_report_progress(&h0->cur_pic_ptr->tf, INT_MAX,
yading@10 3456 last_pic_structure == PICT_BOTTOM_FIELD);
yading@10 3457 }
yading@10 3458
yading@10 3459 /* figure out if we have a complementary field pair */
yading@10 3460 if (!FIELD_PICTURE(h) || h->picture_structure == last_pic_structure) {
yading@10 3461 /* Previous field is unmatched. Don't display it, but let it
yading@10 3462 * remain for reference if marked as such. */
yading@10 3463 if (!last_pic_droppable && last_pic_structure != PICT_FRAME) {
yading@10 3464 ff_thread_report_progress(&h0->cur_pic_ptr->tf, INT_MAX,
yading@10 3465 last_pic_structure == PICT_TOP_FIELD);
yading@10 3466 }
yading@10 3467 } else {
yading@10 3468 if (h0->cur_pic_ptr->frame_num != h->frame_num) {
yading@10 3469 /* This and previous field were reference, but had
yading@10 3470 * different frame_nums. Consider this field first in
yading@10 3471 * pair. Throw away previous field except for reference
yading@10 3472 * purposes. */
yading@10 3473 if (!last_pic_droppable && last_pic_structure != PICT_FRAME) {
yading@10 3474 ff_thread_report_progress(&h0->cur_pic_ptr->tf, INT_MAX,
yading@10 3475 last_pic_structure == PICT_TOP_FIELD);
yading@10 3476 }
yading@10 3477 } else {
yading@10 3478 /* Second field in complementary pair */
yading@10 3479 if (!((last_pic_structure == PICT_TOP_FIELD &&
yading@10 3480 h->picture_structure == PICT_BOTTOM_FIELD) ||
yading@10 3481 (last_pic_structure == PICT_BOTTOM_FIELD &&
yading@10 3482 h->picture_structure == PICT_TOP_FIELD))) {
yading@10 3483 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3484 "Invalid field mode combination %d/%d\n",
yading@10 3485 last_pic_structure, h->picture_structure);
yading@10 3486 h->picture_structure = last_pic_structure;
yading@10 3487 h->droppable = last_pic_droppable;
yading@10 3488 return AVERROR_INVALIDDATA;
yading@10 3489 } else if (last_pic_droppable != h->droppable) {
yading@10 3490 avpriv_request_sample(h->avctx,
yading@10 3491 "Found reference and non-reference fields in the same frame, which");
yading@10 3492 h->picture_structure = last_pic_structure;
yading@10 3493 h->droppable = last_pic_droppable;
yading@10 3494 return AVERROR_PATCHWELCOME;
yading@10 3495 }
yading@10 3496 }
yading@10 3497 }
yading@10 3498 }
yading@10 3499
yading@10 3500 while (h->frame_num != h->prev_frame_num && h->prev_frame_num >= 0 && !h0->first_field &&
yading@10 3501 h->frame_num != (h->prev_frame_num + 1) % (1 << h->sps.log2_max_frame_num)) {
yading@10 3502 Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
yading@10 3503 av_log(h->avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n",
yading@10 3504 h->frame_num, h->prev_frame_num);
yading@10 3505 if (!h->sps.gaps_in_frame_num_allowed_flag)
yading@10 3506 for(i=0; i<FF_ARRAY_ELEMS(h->last_pocs); i++)
yading@10 3507 h->last_pocs[i] = INT_MIN;
yading@10 3508 if (h264_frame_start(h) < 0)
yading@10 3509 return -1;
yading@10 3510 h->prev_frame_num++;
yading@10 3511 h->prev_frame_num %= 1 << h->sps.log2_max_frame_num;
yading@10 3512 h->cur_pic_ptr->frame_num = h->prev_frame_num;
yading@10 3513 ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 0);
yading@10 3514 ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 1);
yading@10 3515 if ((ret = ff_generate_sliding_window_mmcos(h, 1)) < 0 &&
yading@10 3516 h->avctx->err_recognition & AV_EF_EXPLODE)
yading@10 3517 return ret;
yading@10 3518 if (ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index) < 0 &&
yading@10 3519 (h->avctx->err_recognition & AV_EF_EXPLODE))
yading@10 3520 return AVERROR_INVALIDDATA;
yading@10 3521 /* Error concealment: if a ref is missing, copy the previous ref in its place.
yading@10 3522 * FIXME: avoiding a memcpy would be nice, but ref handling makes many assumptions
yading@10 3523 * about there being no actual duplicates.
yading@10 3524 * FIXME: this doesn't copy padding for out-of-frame motion vectors. Given we're
yading@10 3525 * concealing a lost frame, this probably isn't noticeable by comparison, but it should
yading@10 3526 * be fixed. */
yading@10 3527 if (h->short_ref_count) {
yading@10 3528 if (prev) {
yading@10 3529 av_image_copy(h->short_ref[0]->f.data, h->short_ref[0]->f.linesize,
yading@10 3530 (const uint8_t **)prev->f.data, prev->f.linesize,
yading@10 3531 h->avctx->pix_fmt, h->mb_width * 16, h->mb_height * 16);
yading@10 3532 h->short_ref[0]->poc = prev->poc + 2;
yading@10 3533 }
yading@10 3534 h->short_ref[0]->frame_num = h->prev_frame_num;
yading@10 3535 }
yading@10 3536 }
yading@10 3537
yading@10 3538 /* See if we have a decoded first field looking for a pair...
yading@10 3539 * We're using that to see whether to continue decoding in that
yading@10 3540 * frame, or to allocate a new one. */
yading@10 3541 if (h0->first_field) {
yading@10 3542 assert(h0->cur_pic_ptr);
yading@10 3543 assert(h0->cur_pic_ptr->f.data[0]);
yading@10 3544 assert(h0->cur_pic_ptr->reference != DELAYED_PIC_REF);
yading@10 3545
yading@10 3546 /* figure out if we have a complementary field pair */
yading@10 3547 if (!FIELD_PICTURE(h) || h->picture_structure == last_pic_structure) {
yading@10 3548 /* Previous field is unmatched. Don't display it, but let it
yading@10 3549 * remain for reference if marked as such. */
yading@10 3550 h0->cur_pic_ptr = NULL;
yading@10 3551 h0->first_field = FIELD_PICTURE(h);
yading@10 3552 } else {
yading@10 3553 if (h0->cur_pic_ptr->frame_num != h->frame_num) {
yading@10 3554 ff_thread_report_progress(&h0->cur_pic_ptr->tf, INT_MAX,
yading@10 3555 h0->picture_structure==PICT_BOTTOM_FIELD);
yading@10 3556 /* This and the previous field had different frame_nums.
yading@10 3557 * Consider this field first in pair. Throw away previous
yading@10 3558 * one except for reference purposes. */
yading@10 3559 h0->first_field = 1;
yading@10 3560 h0->cur_pic_ptr = NULL;
yading@10 3561 } else {
yading@10 3562 /* Second field in complementary pair */
yading@10 3563 h0->first_field = 0;
yading@10 3564 }
yading@10 3565 }
yading@10 3566 } else {
yading@10 3567 /* Frame or first field in a potentially complementary pair */
yading@10 3568 h0->first_field = FIELD_PICTURE(h);
yading@10 3569 }
yading@10 3570
yading@10 3571 if (!FIELD_PICTURE(h) || h0->first_field) {
yading@10 3572 if (h264_frame_start(h) < 0) {
yading@10 3573 h0->first_field = 0;
yading@10 3574 return -1;
yading@10 3575 }
yading@10 3576 } else {
yading@10 3577 release_unused_pictures(h, 0);
yading@10 3578 }
yading@10 3579 /* Some macroblocks can be accessed before they're available in case
yading@10 3580 * of lost slices, MBAFF or threading. */
yading@10 3581 if (FIELD_PICTURE(h)) {
yading@10 3582 for(i = (h->picture_structure == PICT_BOTTOM_FIELD); i<h->mb_height; i++)
yading@10 3583 memset(h->slice_table + i*h->mb_stride, -1, (h->mb_stride - (i+1==h->mb_height)) * sizeof(*h->slice_table));
yading@10 3584 } else {
yading@10 3585 memset(h->slice_table, -1,
yading@10 3586 (h->mb_height * h->mb_stride - 1) * sizeof(*h->slice_table));
yading@10 3587 }
yading@10 3588 h0->last_slice_type = -1;
yading@10 3589 }
yading@10 3590 if (h != h0 && (ret = clone_slice(h, h0)) < 0)
yading@10 3591 return ret;
yading@10 3592
yading@10 3593 /* can't be in alloc_tables because linesize isn't known there.
yading@10 3594 * FIXME: redo bipred weight to not require extra buffer? */
yading@10 3595 for (i = 0; i < h->slice_context_count; i++)
yading@10 3596 if (h->thread_context[i]) {
yading@10 3597 ret = alloc_scratch_buffers(h->thread_context[i], h->linesize);
yading@10 3598 if (ret < 0)
yading@10 3599 return ret;
yading@10 3600 }
yading@10 3601
yading@10 3602 h->cur_pic_ptr->frame_num = h->frame_num; // FIXME frame_num cleanup
yading@10 3603
yading@10 3604 av_assert1(h->mb_num == h->mb_width * h->mb_height);
yading@10 3605 if (first_mb_in_slice << FIELD_OR_MBAFF_PICTURE(h) >= h->mb_num ||
yading@10 3606 first_mb_in_slice >= h->mb_num) {
yading@10 3607 av_log(h->avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n");
yading@10 3608 return -1;
yading@10 3609 }
yading@10 3610 h->resync_mb_x = h->mb_x = first_mb_in_slice % h->mb_width;
yading@10 3611 h->resync_mb_y = h->mb_y = (first_mb_in_slice / h->mb_width) << FIELD_OR_MBAFF_PICTURE(h);
yading@10 3612 if (h->picture_structure == PICT_BOTTOM_FIELD)
yading@10 3613 h->resync_mb_y = h->mb_y = h->mb_y + 1;
yading@10 3614 av_assert1(h->mb_y < h->mb_height);
yading@10 3615
yading@10 3616 if (h->picture_structure == PICT_FRAME) {
yading@10 3617 h->curr_pic_num = h->frame_num;
yading@10 3618 h->max_pic_num = 1 << h->sps.log2_max_frame_num;
yading@10 3619 } else {
yading@10 3620 h->curr_pic_num = 2 * h->frame_num + 1;
yading@10 3621 h->max_pic_num = 1 << (h->sps.log2_max_frame_num + 1);
yading@10 3622 }
yading@10 3623
yading@10 3624 if (h->nal_unit_type == NAL_IDR_SLICE)
yading@10 3625 get_ue_golomb(&h->gb); /* idr_pic_id */
yading@10 3626
yading@10 3627 if (h->sps.poc_type == 0) {
yading@10 3628 h->poc_lsb = get_bits(&h->gb, h->sps.log2_max_poc_lsb);
yading@10 3629
yading@10 3630 if (h->pps.pic_order_present == 1 && h->picture_structure == PICT_FRAME)
yading@10 3631 h->delta_poc_bottom = get_se_golomb(&h->gb);
yading@10 3632 }
yading@10 3633
yading@10 3634 if (h->sps.poc_type == 1 && !h->sps.delta_pic_order_always_zero_flag) {
yading@10 3635 h->delta_poc[0] = get_se_golomb(&h->gb);
yading@10 3636
yading@10 3637 if (h->pps.pic_order_present == 1 && h->picture_structure == PICT_FRAME)
yading@10 3638 h->delta_poc[1] = get_se_golomb(&h->gb);
yading@10 3639 }
yading@10 3640
yading@10 3641 init_poc(h);
yading@10 3642
yading@10 3643 if (h->pps.redundant_pic_cnt_present)
yading@10 3644 h->redundant_pic_count = get_ue_golomb(&h->gb);
yading@10 3645
yading@10 3646 // set defaults, might be overridden a few lines later
yading@10 3647 h->ref_count[0] = h->pps.ref_count[0];
yading@10 3648 h->ref_count[1] = h->pps.ref_count[1];
yading@10 3649
yading@10 3650 if (h->slice_type_nos != AV_PICTURE_TYPE_I) {
yading@10 3651 unsigned max[2];
yading@10 3652 max[0] = max[1] = h->picture_structure == PICT_FRAME ? 15 : 31;
yading@10 3653
yading@10 3654 if (h->slice_type_nos == AV_PICTURE_TYPE_B)
yading@10 3655 h->direct_spatial_mv_pred = get_bits1(&h->gb);
yading@10 3656 num_ref_idx_active_override_flag = get_bits1(&h->gb);
yading@10 3657
yading@10 3658 if (num_ref_idx_active_override_flag) {
yading@10 3659 h->ref_count[0] = get_ue_golomb(&h->gb) + 1;
yading@10 3660 if (h->slice_type_nos == AV_PICTURE_TYPE_B) {
yading@10 3661 h->ref_count[1] = get_ue_golomb(&h->gb) + 1;
yading@10 3662 } else
yading@10 3663 // full range is spec-ok in this case, even for frames
yading@10 3664 h->ref_count[1] = 1;
yading@10 3665 }
yading@10 3666
yading@10 3667 if (h->ref_count[0]-1 > max[0] || h->ref_count[1]-1 > max[1]){
yading@10 3668 av_log(h->avctx, AV_LOG_ERROR, "reference overflow %u > %u or %u > %u\n", h->ref_count[0]-1, max[0], h->ref_count[1]-1, max[1]);
yading@10 3669 h->ref_count[0] = h->ref_count[1] = 0;
yading@10 3670 return AVERROR_INVALIDDATA;
yading@10 3671 }
yading@10 3672
yading@10 3673 if (h->slice_type_nos == AV_PICTURE_TYPE_B)
yading@10 3674 h->list_count = 2;
yading@10 3675 else
yading@10 3676 h->list_count = 1;
yading@10 3677 } else {
yading@10 3678 h->list_count = 0;
yading@10 3679 h->ref_count[0] = h->ref_count[1] = 0;
yading@10 3680 }
yading@10 3681 if (slice_type != AV_PICTURE_TYPE_I &&
yading@10 3682 (h0->current_slice == 0 ||
yading@10 3683 slice_type != h0->last_slice_type ||
yading@10 3684 memcmp(h0->last_ref_count, h0->ref_count, sizeof(h0->ref_count)))) {
yading@10 3685 ff_h264_fill_default_ref_list(h);
yading@10 3686 }
yading@10 3687
yading@10 3688 if (h->slice_type_nos != AV_PICTURE_TYPE_I &&
yading@10 3689 ff_h264_decode_ref_pic_list_reordering(h) < 0) {
yading@10 3690 h->ref_count[1] = h->ref_count[0] = 0;
yading@10 3691 return -1;
yading@10 3692 }
yading@10 3693
yading@10 3694 if ((h->pps.weighted_pred && h->slice_type_nos == AV_PICTURE_TYPE_P) ||
yading@10 3695 (h->pps.weighted_bipred_idc == 1 &&
yading@10 3696 h->slice_type_nos == AV_PICTURE_TYPE_B))
yading@10 3697 pred_weight_table(h);
yading@10 3698 else if (h->pps.weighted_bipred_idc == 2 &&
yading@10 3699 h->slice_type_nos == AV_PICTURE_TYPE_B) {
yading@10 3700 implicit_weight_table(h, -1);
yading@10 3701 } else {
yading@10 3702 h->use_weight = 0;
yading@10 3703 for (i = 0; i < 2; i++) {
yading@10 3704 h->luma_weight_flag[i] = 0;
yading@10 3705 h->chroma_weight_flag[i] = 0;
yading@10 3706 }
yading@10 3707 }
yading@10 3708
yading@10 3709 // If frame-mt is enabled, only update mmco tables for the first slice
yading@10 3710 // in a field. Subsequent slices can temporarily clobber h->mmco_index
yading@10 3711 // or h->mmco, which will cause ref list mix-ups and decoding errors
yading@10 3712 // further down the line. This may break decoding if the first slice is
yading@10 3713 // corrupt, thus we only do this if frame-mt is enabled.
yading@10 3714 if (h->nal_ref_idc &&
yading@10 3715 ff_h264_decode_ref_pic_marking(h0, &h->gb,
yading@10 3716 !(h->avctx->active_thread_type & FF_THREAD_FRAME) ||
yading@10 3717 h0->current_slice == 0) < 0 &&
yading@10 3718 (h->avctx->err_recognition & AV_EF_EXPLODE))
yading@10 3719 return AVERROR_INVALIDDATA;
yading@10 3720
yading@10 3721 if (FRAME_MBAFF(h)) {
yading@10 3722 ff_h264_fill_mbaff_ref_list(h);
yading@10 3723
yading@10 3724 if (h->pps.weighted_bipred_idc == 2 && h->slice_type_nos == AV_PICTURE_TYPE_B) {
yading@10 3725 implicit_weight_table(h, 0);
yading@10 3726 implicit_weight_table(h, 1);
yading@10 3727 }
yading@10 3728 }
yading@10 3729
yading@10 3730 if (h->slice_type_nos == AV_PICTURE_TYPE_B && !h->direct_spatial_mv_pred)
yading@10 3731 ff_h264_direct_dist_scale_factor(h);
yading@10 3732 ff_h264_direct_ref_list_init(h);
yading@10 3733
yading@10 3734 if (h->slice_type_nos != AV_PICTURE_TYPE_I && h->pps.cabac) {
yading@10 3735 tmp = get_ue_golomb_31(&h->gb);
yading@10 3736 if (tmp > 2) {
yading@10 3737 av_log(h->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n");
yading@10 3738 return -1;
yading@10 3739 }
yading@10 3740 h->cabac_init_idc = tmp;
yading@10 3741 }
yading@10 3742
yading@10 3743 h->last_qscale_diff = 0;
yading@10 3744 tmp = h->pps.init_qp + get_se_golomb(&h->gb);
yading@10 3745 if (tmp > 51 + 6 * (h->sps.bit_depth_luma - 8)) {
yading@10 3746 av_log(h->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp);
yading@10 3747 return -1;
yading@10 3748 }
yading@10 3749 h->qscale = tmp;
yading@10 3750 h->chroma_qp[0] = get_chroma_qp(h, 0, h->qscale);
yading@10 3751 h->chroma_qp[1] = get_chroma_qp(h, 1, h->qscale);
yading@10 3752 // FIXME qscale / qp ... stuff
yading@10 3753 if (h->slice_type == AV_PICTURE_TYPE_SP)
yading@10 3754 get_bits1(&h->gb); /* sp_for_switch_flag */
yading@10 3755 if (h->slice_type == AV_PICTURE_TYPE_SP ||
yading@10 3756 h->slice_type == AV_PICTURE_TYPE_SI)
yading@10 3757 get_se_golomb(&h->gb); /* slice_qs_delta */
yading@10 3758
yading@10 3759 h->deblocking_filter = 1;
yading@10 3760 h->slice_alpha_c0_offset = 52;
yading@10 3761 h->slice_beta_offset = 52;
yading@10 3762 if (h->pps.deblocking_filter_parameters_present) {
yading@10 3763 tmp = get_ue_golomb_31(&h->gb);
yading@10 3764 if (tmp > 2) {
yading@10 3765 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3766 "deblocking_filter_idc %u out of range\n", tmp);
yading@10 3767 return -1;
yading@10 3768 }
yading@10 3769 h->deblocking_filter = tmp;
yading@10 3770 if (h->deblocking_filter < 2)
yading@10 3771 h->deblocking_filter ^= 1; // 1<->0
yading@10 3772
yading@10 3773 if (h->deblocking_filter) {
yading@10 3774 h->slice_alpha_c0_offset += get_se_golomb(&h->gb) << 1;
yading@10 3775 h->slice_beta_offset += get_se_golomb(&h->gb) << 1;
yading@10 3776 if (h->slice_alpha_c0_offset > 104U ||
yading@10 3777 h->slice_beta_offset > 104U) {
yading@10 3778 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3779 "deblocking filter parameters %d %d out of range\n",
yading@10 3780 h->slice_alpha_c0_offset, h->slice_beta_offset);
yading@10 3781 return -1;
yading@10 3782 }
yading@10 3783 }
yading@10 3784 }
yading@10 3785
yading@10 3786 if (h->avctx->skip_loop_filter >= AVDISCARD_ALL ||
yading@10 3787 (h->avctx->skip_loop_filter >= AVDISCARD_NONKEY &&
yading@10 3788 h->slice_type_nos != AV_PICTURE_TYPE_I) ||
yading@10 3789 (h->avctx->skip_loop_filter >= AVDISCARD_BIDIR &&
yading@10 3790 h->slice_type_nos == AV_PICTURE_TYPE_B) ||
yading@10 3791 (h->avctx->skip_loop_filter >= AVDISCARD_NONREF &&
yading@10 3792 h->nal_ref_idc == 0))
yading@10 3793 h->deblocking_filter = 0;
yading@10 3794
yading@10 3795 if (h->deblocking_filter == 1 && h0->max_contexts > 1) {
yading@10 3796 if (h->avctx->flags2 & CODEC_FLAG2_FAST) {
yading@10 3797 /* Cheat slightly for speed:
yading@10 3798 * Do not bother to deblock across slices. */
yading@10 3799 h->deblocking_filter = 2;
yading@10 3800 } else {
yading@10 3801 h0->max_contexts = 1;
yading@10 3802 if (!h0->single_decode_warning) {
yading@10 3803 av_log(h->avctx, AV_LOG_INFO,
yading@10 3804 "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n");
yading@10 3805 h0->single_decode_warning = 1;
yading@10 3806 }
yading@10 3807 if (h != h0) {
yading@10 3808 av_log(h->avctx, AV_LOG_ERROR,
yading@10 3809 "Deblocking switched inside frame.\n");
yading@10 3810 return 1;
yading@10 3811 }
yading@10 3812 }
yading@10 3813 }
yading@10 3814 h->qp_thresh = 15 + 52 -
yading@10 3815 FFMIN(h->slice_alpha_c0_offset, h->slice_beta_offset) -
yading@10 3816 FFMAX3(0,
yading@10 3817 h->pps.chroma_qp_index_offset[0],
yading@10 3818 h->pps.chroma_qp_index_offset[1]) +
yading@10 3819 6 * (h->sps.bit_depth_luma - 8);
yading@10 3820
yading@10 3821 h0->last_slice_type = slice_type;
yading@10 3822 memcpy(h0->last_ref_count, h0->ref_count, sizeof(h0->last_ref_count));
yading@10 3823 h->slice_num = ++h0->current_slice;
yading@10 3824
yading@10 3825 if (h->slice_num)
yading@10 3826 h0->slice_row[(h->slice_num-1)&(MAX_SLICES-1)]= h->resync_mb_y;
yading@10 3827 if ( h0->slice_row[h->slice_num&(MAX_SLICES-1)] + 3 >= h->resync_mb_y
yading@10 3828 && h0->slice_row[h->slice_num&(MAX_SLICES-1)] <= h->resync_mb_y
yading@10 3829 && h->slice_num >= MAX_SLICES) {
yading@10 3830 //in case of ASO this check needs to be updated depending on how we decide to assign slice numbers in this case
yading@10 3831 av_log(h->avctx, AV_LOG_WARNING, "Possibly too many slices (%d >= %d), increase MAX_SLICES and recompile if there are artifacts\n", h->slice_num, MAX_SLICES);
yading@10 3832 }
yading@10 3833
yading@10 3834 for (j = 0; j < 2; j++) {
yading@10 3835 int id_list[16];
yading@10 3836 int *ref2frm = h->ref2frm[h->slice_num & (MAX_SLICES - 1)][j];
yading@10 3837 for (i = 0; i < 16; i++) {
yading@10 3838 id_list[i] = 60;
yading@10 3839 if (j < h->list_count && i < h->ref_count[j] && h->ref_list[j][i].f.buf[0]) {
yading@10 3840 int k;
yading@10 3841 AVBuffer *buf = h->ref_list[j][i].f.buf[0]->buffer;
yading@10 3842 for (k = 0; k < h->short_ref_count; k++)
yading@10 3843 if (h->short_ref[k]->f.buf[0]->buffer == buf) {
yading@10 3844 id_list[i] = k;
yading@10 3845 break;
yading@10 3846 }
yading@10 3847 for (k = 0; k < h->long_ref_count; k++)
yading@10 3848 if (h->long_ref[k] && h->long_ref[k]->f.buf[0]->buffer == buf) {
yading@10 3849 id_list[i] = h->short_ref_count + k;
yading@10 3850 break;
yading@10 3851 }
yading@10 3852 }
yading@10 3853 }
yading@10 3854
yading@10 3855 ref2frm[0] =
yading@10 3856 ref2frm[1] = -1;
yading@10 3857 for (i = 0; i < 16; i++)
yading@10 3858 ref2frm[i + 2] = 4 * id_list[i] +
yading@10 3859 (h->ref_list[j][i].reference & 3);
yading@10 3860 ref2frm[18 + 0] =
yading@10 3861 ref2frm[18 + 1] = -1;
yading@10 3862 for (i = 16; i < 48; i++)
yading@10 3863 ref2frm[i + 4] = 4 * id_list[(i - 16) >> 1] +
yading@10 3864 (h->ref_list[j][i].reference & 3);
yading@10 3865 }
yading@10 3866
yading@10 3867 if (h->ref_count[0]) h->er.last_pic = &h->ref_list[0][0];
yading@10 3868 if (h->ref_count[1]) h->er.next_pic = &h->ref_list[1][0];
yading@10 3869
yading@10 3870 if (h->avctx->debug & FF_DEBUG_PICT_INFO) {
yading@10 3871 av_log(h->avctx, AV_LOG_DEBUG,
yading@10 3872 "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",
yading@10 3873 h->slice_num,
yading@10 3874 (h->picture_structure == PICT_FRAME ? "F" : h->picture_structure == PICT_TOP_FIELD ? "T" : "B"),
yading@10 3875 first_mb_in_slice,
yading@10 3876 av_get_picture_type_char(h->slice_type),
yading@10 3877 h->slice_type_fixed ? " fix" : "",
yading@10 3878 h->nal_unit_type == NAL_IDR_SLICE ? " IDR" : "",
yading@10 3879 pps_id, h->frame_num,
yading@10 3880 h->cur_pic_ptr->field_poc[0],
yading@10 3881 h->cur_pic_ptr->field_poc[1],
yading@10 3882 h->ref_count[0], h->ref_count[1],
yading@10 3883 h->qscale,
yading@10 3884 h->deblocking_filter,
yading@10 3885 h->slice_alpha_c0_offset / 2 - 26, h->slice_beta_offset / 2 - 26,
yading@10 3886 h->use_weight,
yading@10 3887 h->use_weight == 1 && h->use_weight_chroma ? "c" : "",
yading@10 3888 h->slice_type == AV_PICTURE_TYPE_B ? (h->direct_spatial_mv_pred ? "SPAT" : "TEMP") : "");
yading@10 3889 }
yading@10 3890
yading@10 3891 return 0;
yading@10 3892 }
yading@10 3893
yading@10 3894 int ff_h264_get_slice_type(const H264Context *h)
yading@10 3895 {
yading@10 3896 switch (h->slice_type) {
yading@10 3897 case AV_PICTURE_TYPE_P:
yading@10 3898 return 0;
yading@10 3899 case AV_PICTURE_TYPE_B:
yading@10 3900 return 1;
yading@10 3901 case AV_PICTURE_TYPE_I:
yading@10 3902 return 2;
yading@10 3903 case AV_PICTURE_TYPE_SP:
yading@10 3904 return 3;
yading@10 3905 case AV_PICTURE_TYPE_SI:
yading@10 3906 return 4;
yading@10 3907 default:
yading@10 3908 return -1;
yading@10 3909 }
yading@10 3910 }
yading@10 3911
yading@10 3912 static av_always_inline void fill_filter_caches_inter(H264Context *h,
yading@10 3913 int mb_type, int top_xy,
yading@10 3914 int left_xy[LEFT_MBS],
yading@10 3915 int top_type,
yading@10 3916 int left_type[LEFT_MBS],
yading@10 3917 int mb_xy, int list)
yading@10 3918 {
yading@10 3919 int b_stride = h->b_stride;
yading@10 3920 int16_t(*mv_dst)[2] = &h->mv_cache[list][scan8[0]];
yading@10 3921 int8_t *ref_cache = &h->ref_cache[list][scan8[0]];
yading@10 3922 if (IS_INTER(mb_type) || IS_DIRECT(mb_type)) {
yading@10 3923 if (USES_LIST(top_type, list)) {
yading@10 3924 const int b_xy = h->mb2b_xy[top_xy] + 3 * b_stride;
yading@10 3925 const int b8_xy = 4 * top_xy + 2;
yading@10 3926 int (*ref2frm)[64] = (void*)(h->ref2frm[h->slice_table[top_xy] & (MAX_SLICES - 1)][0] + (MB_MBAFF(h) ? 20 : 2));
yading@10 3927 AV_COPY128(mv_dst - 1 * 8, h->cur_pic.motion_val[list][b_xy + 0]);
yading@10 3928 ref_cache[0 - 1 * 8] =
yading@10 3929 ref_cache[1 - 1 * 8] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 0]];
yading@10 3930 ref_cache[2 - 1 * 8] =
yading@10 3931 ref_cache[3 - 1 * 8] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 1]];
yading@10 3932 } else {
yading@10 3933 AV_ZERO128(mv_dst - 1 * 8);
yading@10 3934 AV_WN32A(&ref_cache[0 - 1 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
yading@10 3935 }
yading@10 3936
yading@10 3937 if (!IS_INTERLACED(mb_type ^ left_type[LTOP])) {
yading@10 3938 if (USES_LIST(left_type[LTOP], list)) {
yading@10 3939 const int b_xy = h->mb2b_xy[left_xy[LTOP]] + 3;
yading@10 3940 const int b8_xy = 4 * left_xy[LTOP] + 1;
yading@10 3941 int (*ref2frm)[64] =(void*)( h->ref2frm[h->slice_table[left_xy[LTOP]] & (MAX_SLICES - 1)][0] + (MB_MBAFF(h) ? 20 : 2));
yading@10 3942 AV_COPY32(mv_dst - 1 + 0, h->cur_pic.motion_val[list][b_xy + b_stride * 0]);
yading@10 3943 AV_COPY32(mv_dst - 1 + 8, h->cur_pic.motion_val[list][b_xy + b_stride * 1]);
yading@10 3944 AV_COPY32(mv_dst - 1 + 16, h->cur_pic.motion_val[list][b_xy + b_stride * 2]);
yading@10 3945 AV_COPY32(mv_dst - 1 + 24, h->cur_pic.motion_val[list][b_xy + b_stride * 3]);
yading@10 3946 ref_cache[-1 + 0] =
yading@10 3947 ref_cache[-1 + 8] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 2 * 0]];
yading@10 3948 ref_cache[-1 + 16] =
yading@10 3949 ref_cache[-1 + 24] = ref2frm[list][h->cur_pic.ref_index[list][b8_xy + 2 * 1]];
yading@10 3950 } else {
yading@10 3951 AV_ZERO32(mv_dst - 1 + 0);
yading@10 3952 AV_ZERO32(mv_dst - 1 + 8);
yading@10 3953 AV_ZERO32(mv_dst - 1 + 16);
yading@10 3954 AV_ZERO32(mv_dst - 1 + 24);
yading@10 3955 ref_cache[-1 + 0] =
yading@10 3956 ref_cache[-1 + 8] =
yading@10 3957 ref_cache[-1 + 16] =
yading@10 3958 ref_cache[-1 + 24] = LIST_NOT_USED;
yading@10 3959 }
yading@10 3960 }
yading@10 3961 }
yading@10 3962
yading@10 3963 if (!USES_LIST(mb_type, list)) {
yading@10 3964 fill_rectangle(mv_dst, 4, 4, 8, pack16to32(0, 0), 4);
yading@10 3965 AV_WN32A(&ref_cache[0 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
yading@10 3966 AV_WN32A(&ref_cache[1 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
yading@10 3967 AV_WN32A(&ref_cache[2 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
yading@10 3968 AV_WN32A(&ref_cache[3 * 8], ((LIST_NOT_USED) & 0xFF) * 0x01010101u);
yading@10 3969 return;
yading@10 3970 }
yading@10 3971
yading@10 3972 {
yading@10 3973 int8_t *ref = &h->cur_pic.ref_index[list][4 * mb_xy];
yading@10 3974 int (*ref2frm)[64] = (void*)(h->ref2frm[h->slice_num & (MAX_SLICES - 1)][0] + (MB_MBAFF(h) ? 20 : 2));
yading@10 3975 uint32_t ref01 = (pack16to32(ref2frm[list][ref[0]], ref2frm[list][ref[1]]) & 0x00FF00FF) * 0x0101;
yading@10 3976 uint32_t ref23 = (pack16to32(ref2frm[list][ref[2]], ref2frm[list][ref[3]]) & 0x00FF00FF) * 0x0101;
yading@10 3977 AV_WN32A(&ref_cache[0 * 8], ref01);
yading@10 3978 AV_WN32A(&ref_cache[1 * 8], ref01);
yading@10 3979 AV_WN32A(&ref_cache[2 * 8], ref23);
yading@10 3980 AV_WN32A(&ref_cache[3 * 8], ref23);
yading@10 3981 }
yading@10 3982
yading@10 3983 {
yading@10 3984 int16_t(*mv_src)[2] = &h->cur_pic.motion_val[list][4 * h->mb_x + 4 * h->mb_y * b_stride];
yading@10 3985 AV_COPY128(mv_dst + 8 * 0, mv_src + 0 * b_stride);
yading@10 3986 AV_COPY128(mv_dst + 8 * 1, mv_src + 1 * b_stride);
yading@10 3987 AV_COPY128(mv_dst + 8 * 2, mv_src + 2 * b_stride);
yading@10 3988 AV_COPY128(mv_dst + 8 * 3, mv_src + 3 * b_stride);
yading@10 3989 }
yading@10 3990 }
yading@10 3991
yading@10 3992 /**
yading@10 3993 *
yading@10 3994 * @return non zero if the loop filter can be skipped
yading@10 3995 */
yading@10 3996 static int fill_filter_caches(H264Context *h, int mb_type)
yading@10 3997 {
yading@10 3998 const int mb_xy = h->mb_xy;
yading@10 3999 int top_xy, left_xy[LEFT_MBS];
yading@10 4000 int top_type, left_type[LEFT_MBS];
yading@10 4001 uint8_t *nnz;
yading@10 4002 uint8_t *nnz_cache;
yading@10 4003
yading@10 4004 top_xy = mb_xy - (h->mb_stride << MB_FIELD(h));
yading@10 4005
yading@10 4006 /* Wow, what a mess, why didn't they simplify the interlacing & intra
yading@10 4007 * stuff, I can't imagine that these complex rules are worth it. */
yading@10 4008
yading@10 4009 left_xy[LBOT] = left_xy[LTOP] = mb_xy - 1;
yading@10 4010 if (FRAME_MBAFF(h)) {
yading@10 4011 const int left_mb_field_flag = IS_INTERLACED(h->cur_pic.mb_type[mb_xy - 1]);
yading@10 4012 const int curr_mb_field_flag = IS_INTERLACED(mb_type);
yading@10 4013 if (h->mb_y & 1) {
yading@10 4014 if (left_mb_field_flag != curr_mb_field_flag)
yading@10 4015 left_xy[LTOP] -= h->mb_stride;
yading@10 4016 } else {
yading@10 4017 if (curr_mb_field_flag)
yading@10 4018 top_xy += h->mb_stride &
yading@10 4019 (((h->cur_pic.mb_type[top_xy] >> 7) & 1) - 1);
yading@10 4020 if (left_mb_field_flag != curr_mb_field_flag)
yading@10 4021 left_xy[LBOT] += h->mb_stride;
yading@10 4022 }
yading@10 4023 }
yading@10 4024
yading@10 4025 h->top_mb_xy = top_xy;
yading@10 4026 h->left_mb_xy[LTOP] = left_xy[LTOP];
yading@10 4027 h->left_mb_xy[LBOT] = left_xy[LBOT];
yading@10 4028 {
yading@10 4029 /* For sufficiently low qp, filtering wouldn't do anything.
yading@10 4030 * This is a conservative estimate: could also check beta_offset
yading@10 4031 * and more accurate chroma_qp. */
yading@10 4032 int qp_thresh = h->qp_thresh; // FIXME strictly we should store qp_thresh for each mb of a slice
yading@10 4033 int qp = h->cur_pic.qscale_table[mb_xy];
yading@10 4034 if (qp <= qp_thresh &&
yading@10 4035 (left_xy[LTOP] < 0 ||
yading@10 4036 ((qp + h->cur_pic.qscale_table[left_xy[LTOP]] + 1) >> 1) <= qp_thresh) &&
yading@10 4037 (top_xy < 0 ||
yading@10 4038 ((qp + h->cur_pic.qscale_table[top_xy] + 1) >> 1) <= qp_thresh)) {
yading@10 4039 if (!FRAME_MBAFF(h))
yading@10 4040 return 1;
yading@10 4041 if ((left_xy[LTOP] < 0 ||
yading@10 4042 ((qp + h->cur_pic.qscale_table[left_xy[LBOT]] + 1) >> 1) <= qp_thresh) &&
yading@10 4043 (top_xy < h->mb_stride ||
yading@10 4044 ((qp + h->cur_pic.qscale_table[top_xy - h->mb_stride] + 1) >> 1) <= qp_thresh))
yading@10 4045 return 1;
yading@10 4046 }
yading@10 4047 }
yading@10 4048
yading@10 4049 top_type = h->cur_pic.mb_type[top_xy];
yading@10 4050 left_type[LTOP] = h->cur_pic.mb_type[left_xy[LTOP]];
yading@10 4051 left_type[LBOT] = h->cur_pic.mb_type[left_xy[LBOT]];
yading@10 4052 if (h->deblocking_filter == 2) {
yading@10 4053 if (h->slice_table[top_xy] != h->slice_num)
yading@10 4054 top_type = 0;
yading@10 4055 if (h->slice_table[left_xy[LBOT]] != h->slice_num)
yading@10 4056 left_type[LTOP] = left_type[LBOT] = 0;
yading@10 4057 } else {
yading@10 4058 if (h->slice_table[top_xy] == 0xFFFF)
yading@10 4059 top_type = 0;
yading@10 4060 if (h->slice_table[left_xy[LBOT]] == 0xFFFF)
yading@10 4061 left_type[LTOP] = left_type[LBOT] = 0;
yading@10 4062 }
yading@10 4063 h->top_type = top_type;
yading@10 4064 h->left_type[LTOP] = left_type[LTOP];
yading@10 4065 h->left_type[LBOT] = left_type[LBOT];
yading@10 4066
yading@10 4067 if (IS_INTRA(mb_type))
yading@10 4068 return 0;
yading@10 4069
yading@10 4070 fill_filter_caches_inter(h, mb_type, top_xy, left_xy,
yading@10 4071 top_type, left_type, mb_xy, 0);
yading@10 4072 if (h->list_count == 2)
yading@10 4073 fill_filter_caches_inter(h, mb_type, top_xy, left_xy,
yading@10 4074 top_type, left_type, mb_xy, 1);
yading@10 4075
yading@10 4076 nnz = h->non_zero_count[mb_xy];
yading@10 4077 nnz_cache = h->non_zero_count_cache;
yading@10 4078 AV_COPY32(&nnz_cache[4 + 8 * 1], &nnz[0]);
yading@10 4079 AV_COPY32(&nnz_cache[4 + 8 * 2], &nnz[4]);
yading@10 4080 AV_COPY32(&nnz_cache[4 + 8 * 3], &nnz[8]);
yading@10 4081 AV_COPY32(&nnz_cache[4 + 8 * 4], &nnz[12]);
yading@10 4082 h->cbp = h->cbp_table[mb_xy];
yading@10 4083
yading@10 4084 if (top_type) {
yading@10 4085 nnz = h->non_zero_count[top_xy];
yading@10 4086 AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[3 * 4]);
yading@10 4087 }
yading@10 4088
yading@10 4089 if (left_type[LTOP]) {
yading@10 4090 nnz = h->non_zero_count[left_xy[LTOP]];
yading@10 4091 nnz_cache[3 + 8 * 1] = nnz[3 + 0 * 4];
yading@10 4092 nnz_cache[3 + 8 * 2] = nnz[3 + 1 * 4];
yading@10 4093 nnz_cache[3 + 8 * 3] = nnz[3 + 2 * 4];
yading@10 4094 nnz_cache[3 + 8 * 4] = nnz[3 + 3 * 4];
yading@10 4095 }
yading@10 4096
yading@10 4097 /* CAVLC 8x8dct requires NNZ values for residual decoding that differ
yading@10 4098 * from what the loop filter needs */
yading@10 4099 if (!CABAC(h) && h->pps.transform_8x8_mode) {
yading@10 4100 if (IS_8x8DCT(top_type)) {
yading@10 4101 nnz_cache[4 + 8 * 0] =
yading@10 4102 nnz_cache[5 + 8 * 0] = (h->cbp_table[top_xy] & 0x4000) >> 12;
yading@10 4103 nnz_cache[6 + 8 * 0] =
yading@10 4104 nnz_cache[7 + 8 * 0] = (h->cbp_table[top_xy] & 0x8000) >> 12;
yading@10 4105 }
yading@10 4106 if (IS_8x8DCT(left_type[LTOP])) {
yading@10 4107 nnz_cache[3 + 8 * 1] =
yading@10 4108 nnz_cache[3 + 8 * 2] = (h->cbp_table[left_xy[LTOP]] & 0x2000) >> 12; // FIXME check MBAFF
yading@10 4109 }
yading@10 4110 if (IS_8x8DCT(left_type[LBOT])) {
yading@10 4111 nnz_cache[3 + 8 * 3] =
yading@10 4112 nnz_cache[3 + 8 * 4] = (h->cbp_table[left_xy[LBOT]] & 0x8000) >> 12; // FIXME check MBAFF
yading@10 4113 }
yading@10 4114
yading@10 4115 if (IS_8x8DCT(mb_type)) {
yading@10 4116 nnz_cache[scan8[0]] =
yading@10 4117 nnz_cache[scan8[1]] =
yading@10 4118 nnz_cache[scan8[2]] =
yading@10 4119 nnz_cache[scan8[3]] = (h->cbp & 0x1000) >> 12;
yading@10 4120
yading@10 4121 nnz_cache[scan8[0 + 4]] =
yading@10 4122 nnz_cache[scan8[1 + 4]] =
yading@10 4123 nnz_cache[scan8[2 + 4]] =
yading@10 4124 nnz_cache[scan8[3 + 4]] = (h->cbp & 0x2000) >> 12;
yading@10 4125
yading@10 4126 nnz_cache[scan8[0 + 8]] =
yading@10 4127 nnz_cache[scan8[1 + 8]] =
yading@10 4128 nnz_cache[scan8[2 + 8]] =
yading@10 4129 nnz_cache[scan8[3 + 8]] = (h->cbp & 0x4000) >> 12;
yading@10 4130
yading@10 4131 nnz_cache[scan8[0 + 12]] =
yading@10 4132 nnz_cache[scan8[1 + 12]] =
yading@10 4133 nnz_cache[scan8[2 + 12]] =
yading@10 4134 nnz_cache[scan8[3 + 12]] = (h->cbp & 0x8000) >> 12;
yading@10 4135 }
yading@10 4136 }
yading@10 4137
yading@10 4138 return 0;
yading@10 4139 }
yading@10 4140
yading@10 4141 static void loop_filter(H264Context *h, int start_x, int end_x)
yading@10 4142 {
yading@10 4143 uint8_t *dest_y, *dest_cb, *dest_cr;
yading@10 4144 int linesize, uvlinesize, mb_x, mb_y;
yading@10 4145 const int end_mb_y = h->mb_y + FRAME_MBAFF(h);
yading@10 4146 const int old_slice_type = h->slice_type;
yading@10 4147 const int pixel_shift = h->pixel_shift;
yading@10 4148 const int block_h = 16 >> h->chroma_y_shift;
yading@10 4149
yading@10 4150 if (h->deblocking_filter) {
yading@10 4151 for (mb_x = start_x; mb_x < end_x; mb_x++)
yading@10 4152 for (mb_y = end_mb_y - FRAME_MBAFF(h); mb_y <= end_mb_y; mb_y++) {
yading@10 4153 int mb_xy, mb_type;
yading@10 4154 mb_xy = h->mb_xy = mb_x + mb_y * h->mb_stride;
yading@10 4155 h->slice_num = h->slice_table[mb_xy];
yading@10 4156 mb_type = h->cur_pic.mb_type[mb_xy];
yading@10 4157 h->list_count = h->list_counts[mb_xy];
yading@10 4158
yading@10 4159 if (FRAME_MBAFF(h))
yading@10 4160 h->mb_mbaff =
yading@10 4161 h->mb_field_decoding_flag = !!IS_INTERLACED(mb_type);
yading@10 4162
yading@10 4163 h->mb_x = mb_x;
yading@10 4164 h->mb_y = mb_y;
yading@10 4165 dest_y = h->cur_pic.f.data[0] +
yading@10 4166 ((mb_x << pixel_shift) + mb_y * h->linesize) * 16;
yading@10 4167 dest_cb = h->cur_pic.f.data[1] +
yading@10 4168 (mb_x << pixel_shift) * (8 << CHROMA444(h)) +
yading@10 4169 mb_y * h->uvlinesize * block_h;
yading@10 4170 dest_cr = h->cur_pic.f.data[2] +
yading@10 4171 (mb_x << pixel_shift) * (8 << CHROMA444(h)) +
yading@10 4172 mb_y * h->uvlinesize * block_h;
yading@10 4173 // FIXME simplify above
yading@10 4174
yading@10 4175 if (MB_FIELD(h)) {
yading@10 4176 linesize = h->mb_linesize = h->linesize * 2;
yading@10 4177 uvlinesize = h->mb_uvlinesize = h->uvlinesize * 2;
yading@10 4178 if (mb_y & 1) { // FIXME move out of this function?
yading@10 4179 dest_y -= h->linesize * 15;
yading@10 4180 dest_cb -= h->uvlinesize * (block_h - 1);
yading@10 4181 dest_cr -= h->uvlinesize * (block_h - 1);
yading@10 4182 }
yading@10 4183 } else {
yading@10 4184 linesize = h->mb_linesize = h->linesize;
yading@10 4185 uvlinesize = h->mb_uvlinesize = h->uvlinesize;
yading@10 4186 }
yading@10 4187 backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize,
yading@10 4188 uvlinesize, 0);
yading@10 4189 if (fill_filter_caches(h, mb_type))
yading@10 4190 continue;
yading@10 4191 h->chroma_qp[0] = get_chroma_qp(h, 0, h->cur_pic.qscale_table[mb_xy]);
yading@10 4192 h->chroma_qp[1] = get_chroma_qp(h, 1, h->cur_pic.qscale_table[mb_xy]);
yading@10 4193
yading@10 4194 if (FRAME_MBAFF(h)) {
yading@10 4195 ff_h264_filter_mb(h, mb_x, mb_y, dest_y, dest_cb, dest_cr,
yading@10 4196 linesize, uvlinesize);
yading@10 4197 } else {
yading@10 4198 ff_h264_filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb,
yading@10 4199 dest_cr, linesize, uvlinesize);
yading@10 4200 }
yading@10 4201 }
yading@10 4202 }
yading@10 4203 h->slice_type = old_slice_type;
yading@10 4204 h->mb_x = end_x;
yading@10 4205 h->mb_y = end_mb_y - FRAME_MBAFF(h);
yading@10 4206 h->chroma_qp[0] = get_chroma_qp(h, 0, h->qscale);
yading@10 4207 h->chroma_qp[1] = get_chroma_qp(h, 1, h->qscale);
yading@10 4208 }
yading@10 4209
yading@10 4210 static void predict_field_decoding_flag(H264Context *h)
yading@10 4211 {
yading@10 4212 const int mb_xy = h->mb_x + h->mb_y * h->mb_stride;
yading@10 4213 int mb_type = (h->slice_table[mb_xy - 1] == h->slice_num) ?
yading@10 4214 h->cur_pic.mb_type[mb_xy - 1] :
yading@10 4215 (h->slice_table[mb_xy - h->mb_stride] == h->slice_num) ?
yading@10 4216 h->cur_pic.mb_type[mb_xy - h->mb_stride] : 0;
yading@10 4217 h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0;
yading@10 4218 }
yading@10 4219
yading@10 4220 /**
yading@10 4221 * Draw edges and report progress for the last MB row.
yading@10 4222 */
yading@10 4223 static void decode_finish_row(H264Context *h)
yading@10 4224 {
yading@10 4225 int top = 16 * (h->mb_y >> FIELD_PICTURE(h));
yading@10 4226 int pic_height = 16 * h->mb_height >> FIELD_PICTURE(h);
yading@10 4227 int height = 16 << FRAME_MBAFF(h);
yading@10 4228 int deblock_border = (16 + 4) << FRAME_MBAFF(h);
yading@10 4229
yading@10 4230 if (h->deblocking_filter) {
yading@10 4231 if ((top + height) >= pic_height)
yading@10 4232 height += deblock_border;
yading@10 4233 top -= deblock_border;
yading@10 4234 }
yading@10 4235
yading@10 4236 if (top >= pic_height || (top + height) < 0)
yading@10 4237 return;
yading@10 4238
yading@10 4239 height = FFMIN(height, pic_height - top);
yading@10 4240 if (top < 0) {
yading@10 4241 height = top + height;
yading@10 4242 top = 0;
yading@10 4243 }
yading@10 4244
yading@10 4245 ff_h264_draw_horiz_band(h, top, height);
yading@10 4246
yading@10 4247 if (h->droppable || h->er.error_occurred)
yading@10 4248 return;
yading@10 4249
yading@10 4250 ff_thread_report_progress(&h->cur_pic_ptr->tf, top + height - 1,
yading@10 4251 h->picture_structure == PICT_BOTTOM_FIELD);
yading@10 4252 }
yading@10 4253
yading@10 4254 static void er_add_slice(H264Context *h, int startx, int starty,
yading@10 4255 int endx, int endy, int status)
yading@10 4256 {
yading@10 4257 if (CONFIG_ERROR_RESILIENCE) {
yading@10 4258 ERContext *er = &h->er;
yading@10 4259
yading@10 4260 er->ref_count = h->ref_count[0];
yading@10 4261 ff_er_add_slice(er, startx, starty, endx, endy, status);
yading@10 4262 }
yading@10 4263 }
yading@10 4264
yading@10 4265 static int decode_slice(struct AVCodecContext *avctx, void *arg)
yading@10 4266 {
yading@10 4267 H264Context *h = *(void **)arg;
yading@10 4268 int lf_x_start = h->mb_x;
yading@10 4269
yading@10 4270 h->mb_skip_run = -1;
yading@10 4271
yading@10 4272 av_assert0(h->block_offset[15] == (4 * ((scan8[15] - scan8[0]) & 7) << h->pixel_shift) + 4 * h->linesize * ((scan8[15] - scan8[0]) >> 3));
yading@10 4273
yading@10 4274 h->is_complex = FRAME_MBAFF(h) || h->picture_structure != PICT_FRAME ||
yading@10 4275 avctx->codec_id != AV_CODEC_ID_H264 ||
yading@10 4276 (CONFIG_GRAY && (h->flags & CODEC_FLAG_GRAY));
yading@10 4277
yading@10 4278 if (!(h->avctx->active_thread_type & FF_THREAD_SLICE) && h->picture_structure == PICT_FRAME) {
yading@10 4279 const int start_i = av_clip(h->resync_mb_x + h->resync_mb_y * h->mb_width, 0, h->mb_num - 1);
yading@10 4280 if (start_i) {
yading@10 4281 int prev_status = h->er.error_status_table[h->er.mb_index2xy[start_i - 1]];
yading@10 4282 prev_status &= ~ VP_START;
yading@10 4283 if (prev_status != (ER_MV_END | ER_DC_END | ER_AC_END))
yading@10 4284 h->er.error_occurred = 1;
yading@10 4285 }
yading@10 4286 }
yading@10 4287
yading@10 4288 if (h->pps.cabac) {
yading@10 4289 /* realign */
yading@10 4290 align_get_bits(&h->gb);
yading@10 4291
yading@10 4292 /* init cabac */
yading@10 4293 ff_init_cabac_decoder(&h->cabac,
yading@10 4294 h->gb.buffer + get_bits_count(&h->gb) / 8,
yading@10 4295 (get_bits_left(&h->gb) + 7) / 8);
yading@10 4296
yading@10 4297 ff_h264_init_cabac_states(h);
yading@10 4298
yading@10 4299 for (;;) {
yading@10 4300 // START_TIMER
yading@10 4301 int ret = ff_h264_decode_mb_cabac(h);
yading@10 4302 int eos;
yading@10 4303 // STOP_TIMER("decode_mb_cabac")
yading@10 4304
yading@10 4305 if (ret >= 0)
yading@10 4306 ff_h264_hl_decode_mb(h);
yading@10 4307
yading@10 4308 // FIXME optimal? or let mb_decode decode 16x32 ?
yading@10 4309 if (ret >= 0 && FRAME_MBAFF(h)) {
yading@10 4310 h->mb_y++;
yading@10 4311
yading@10 4312 ret = ff_h264_decode_mb_cabac(h);
yading@10 4313
yading@10 4314 if (ret >= 0)
yading@10 4315 ff_h264_hl_decode_mb(h);
yading@10 4316 h->mb_y--;
yading@10 4317 }
yading@10 4318 eos = get_cabac_terminate(&h->cabac);
yading@10 4319
yading@10 4320 if ((h->workaround_bugs & FF_BUG_TRUNCATED) &&
yading@10 4321 h->cabac.bytestream > h->cabac.bytestream_end + 2) {
yading@10 4322 er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x - 1,
yading@10 4323 h->mb_y, ER_MB_END);
yading@10 4324 if (h->mb_x >= lf_x_start)
yading@10 4325 loop_filter(h, lf_x_start, h->mb_x + 1);
yading@10 4326 return 0;
yading@10 4327 }
yading@10 4328 if (h->cabac.bytestream > h->cabac.bytestream_end + 2 )
yading@10 4329 av_log(h->avctx, AV_LOG_DEBUG, "bytestream overread %td\n", h->cabac.bytestream_end - h->cabac.bytestream);
yading@10 4330 if (ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 4) {
yading@10 4331 av_log(h->avctx, AV_LOG_ERROR,
yading@10 4332 "error while decoding MB %d %d, bytestream (%td)\n",
yading@10 4333 h->mb_x, h->mb_y,
yading@10 4334 h->cabac.bytestream_end - h->cabac.bytestream);
yading@10 4335 er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x,
yading@10 4336 h->mb_y, ER_MB_ERROR);
yading@10 4337 return -1;
yading@10 4338 }
yading@10 4339
yading@10 4340 if (++h->mb_x >= h->mb_width) {
yading@10 4341 loop_filter(h, lf_x_start, h->mb_x);
yading@10 4342 h->mb_x = lf_x_start = 0;
yading@10 4343 decode_finish_row(h);
yading@10 4344 ++h->mb_y;
yading@10 4345 if (FIELD_OR_MBAFF_PICTURE(h)) {
yading@10 4346 ++h->mb_y;
yading@10 4347 if (FRAME_MBAFF(h) && h->mb_y < h->mb_height)
yading@10 4348 predict_field_decoding_flag(h);
yading@10 4349 }
yading@10 4350 }
yading@10 4351
yading@10 4352 if (eos || h->mb_y >= h->mb_height) {
yading@10 4353 tprintf(h->avctx, "slice end %d %d\n",
yading@10 4354 get_bits_count(&h->gb), h->gb.size_in_bits);
yading@10 4355 er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x - 1,
yading@10 4356 h->mb_y, ER_MB_END);
yading@10 4357 if (h->mb_x > lf_x_start)
yading@10 4358 loop_filter(h, lf_x_start, h->mb_x);
yading@10 4359 return 0;
yading@10 4360 }
yading@10 4361 }
yading@10 4362 } else {
yading@10 4363 for (;;) {
yading@10 4364 int ret = ff_h264_decode_mb_cavlc(h);
yading@10 4365
yading@10 4366 if (ret >= 0)
yading@10 4367 ff_h264_hl_decode_mb(h);
yading@10 4368
yading@10 4369 // FIXME optimal? or let mb_decode decode 16x32 ?
yading@10 4370 if (ret >= 0 && FRAME_MBAFF(h)) {
yading@10 4371 h->mb_y++;
yading@10 4372 ret = ff_h264_decode_mb_cavlc(h);
yading@10 4373
yading@10 4374 if (ret >= 0)
yading@10 4375 ff_h264_hl_decode_mb(h);
yading@10 4376 h->mb_y--;
yading@10 4377 }
yading@10 4378
yading@10 4379 if (ret < 0) {
yading@10 4380 av_log(h->avctx, AV_LOG_ERROR,
yading@10 4381 "error while decoding MB %d %d\n", h->mb_x, h->mb_y);
yading@10 4382 er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x,
yading@10 4383 h->mb_y, ER_MB_ERROR);
yading@10 4384 return -1;
yading@10 4385 }
yading@10 4386
yading@10 4387 if (++h->mb_x >= h->mb_width) {
yading@10 4388 loop_filter(h, lf_x_start, h->mb_x);
yading@10 4389 h->mb_x = lf_x_start = 0;
yading@10 4390 decode_finish_row(h);
yading@10 4391 ++h->mb_y;
yading@10 4392 if (FIELD_OR_MBAFF_PICTURE(h)) {
yading@10 4393 ++h->mb_y;
yading@10 4394 if (FRAME_MBAFF(h) && h->mb_y < h->mb_height)
yading@10 4395 predict_field_decoding_flag(h);
yading@10 4396 }
yading@10 4397 if (h->mb_y >= h->mb_height) {
yading@10 4398 tprintf(h->avctx, "slice end %d %d\n",
yading@10 4399 get_bits_count(&h->gb), h->gb.size_in_bits);
yading@10 4400
yading@10 4401 if ( get_bits_left(&h->gb) == 0
yading@10 4402 || get_bits_left(&h->gb) > 0 && !(h->avctx->err_recognition & AV_EF_AGGRESSIVE)) {
yading@10 4403 er_add_slice(h, h->resync_mb_x, h->resync_mb_y,
yading@10 4404 h->mb_x - 1, h->mb_y,
yading@10 4405 ER_MB_END);
yading@10 4406
yading@10 4407 return 0;
yading@10 4408 } else {
yading@10 4409 er_add_slice(h, h->resync_mb_x, h->resync_mb_y,
yading@10 4410 h->mb_x, h->mb_y,
yading@10 4411 ER_MB_END);
yading@10 4412
yading@10 4413 return -1;
yading@10 4414 }
yading@10 4415 }
yading@10 4416 }
yading@10 4417
yading@10 4418 if (get_bits_left(&h->gb) <= 0 && h->mb_skip_run <= 0) {
yading@10 4419 tprintf(h->avctx, "slice end %d %d\n",
yading@10 4420 get_bits_count(&h->gb), h->gb.size_in_bits);
yading@10 4421 if (get_bits_left(&h->gb) == 0) {
yading@10 4422 er_add_slice(h, h->resync_mb_x, h->resync_mb_y,
yading@10 4423 h->mb_x - 1, h->mb_y,
yading@10 4424 ER_MB_END);
yading@10 4425 if (h->mb_x > lf_x_start)
yading@10 4426 loop_filter(h, lf_x_start, h->mb_x);
yading@10 4427
yading@10 4428 return 0;
yading@10 4429 } else {
yading@10 4430 er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x,
yading@10 4431 h->mb_y, ER_MB_ERROR);
yading@10 4432
yading@10 4433 return -1;
yading@10 4434 }
yading@10 4435 }
yading@10 4436 }
yading@10 4437 }
yading@10 4438 }
yading@10 4439
yading@10 4440 /**
yading@10 4441 * Call decode_slice() for each context.
yading@10 4442 *
yading@10 4443 * @param h h264 master context
yading@10 4444 * @param context_count number of contexts to execute
yading@10 4445 */
yading@10 4446 static int execute_decode_slices(H264Context *h, int context_count)
yading@10 4447 {
yading@10 4448 AVCodecContext *const avctx = h->avctx;
yading@10 4449 H264Context *hx;
yading@10 4450 int i;
yading@10 4451
yading@10 4452 if (h->avctx->hwaccel ||
yading@10 4453 h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
yading@10 4454 return 0;
yading@10 4455 if (context_count == 1) {
yading@10 4456 return decode_slice(avctx, &h);
yading@10 4457 } else {
yading@10 4458 av_assert0(context_count > 0);
yading@10 4459 for (i = 1; i < context_count; i++) {
yading@10 4460 hx = h->thread_context[i];
yading@10 4461 if (CONFIG_ERROR_RESILIENCE) {
yading@10 4462 hx->er.error_count = 0;
yading@10 4463 }
yading@10 4464 hx->x264_build = h->x264_build;
yading@10 4465 }
yading@10 4466
yading@10 4467 avctx->execute(avctx, decode_slice, h->thread_context,
yading@10 4468 NULL, context_count, sizeof(void *));
yading@10 4469
yading@10 4470 /* pull back stuff from slices to master context */
yading@10 4471 hx = h->thread_context[context_count - 1];
yading@10 4472 h->mb_x = hx->mb_x;
yading@10 4473 h->mb_y = hx->mb_y;
yading@10 4474 h->droppable = hx->droppable;
yading@10 4475 h->picture_structure = hx->picture_structure;
yading@10 4476 if (CONFIG_ERROR_RESILIENCE) {
yading@10 4477 for (i = 1; i < context_count; i++)
yading@10 4478 h->er.error_count += h->thread_context[i]->er.error_count;
yading@10 4479 }
yading@10 4480 }
yading@10 4481
yading@10 4482 return 0;
yading@10 4483 }
yading@10 4484
yading@10 4485 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
yading@10 4486 int parse_extradata)
yading@10 4487 {
yading@10 4488 AVCodecContext *const avctx = h->avctx;
yading@10 4489 H264Context *hx; ///< thread context
yading@10 4490 int buf_index;
yading@10 4491 int context_count;
yading@10 4492 int next_avc;
yading@10 4493 int pass = !(avctx->active_thread_type & FF_THREAD_FRAME);
yading@10 4494 int nals_needed = 0; ///< number of NALs that need decoding before the next frame thread starts
yading@10 4495 int nal_index;
yading@10 4496 int idr_cleared=0;
yading@10 4497 int first_slice = 0;
yading@10 4498
yading@10 4499 h->nal_unit_type= 0;
yading@10 4500
yading@10 4501 if(!h->slice_context_count)
yading@10 4502 h->slice_context_count= 1;
yading@10 4503 h->max_contexts = h->slice_context_count;
yading@10 4504 if (!(avctx->flags2 & CODEC_FLAG2_CHUNKS)) {
yading@10 4505 h->current_slice = 0;
yading@10 4506 if (!h->first_field)
yading@10 4507 h->cur_pic_ptr = NULL;
yading@10 4508 ff_h264_reset_sei(h);
yading@10 4509 }
yading@10 4510
yading@10 4511 if (h->nal_length_size == 4) {
yading@10 4512 if (buf_size > 8 && AV_RB32(buf) == 1 && AV_RB32(buf+5) > (unsigned)buf_size) {
yading@10 4513 h->is_avc = 0;
yading@10 4514 }else if(buf_size > 3 && AV_RB32(buf) > 1 && AV_RB32(buf) <= (unsigned)buf_size)
yading@10 4515 h->is_avc = 1;
yading@10 4516 }
yading@10 4517
yading@10 4518 for (; pass <= 1; pass++) {
yading@10 4519 buf_index = 0;
yading@10 4520 context_count = 0;
yading@10 4521 next_avc = h->is_avc ? 0 : buf_size;
yading@10 4522 nal_index = 0;
yading@10 4523 for (;;) {
yading@10 4524 int consumed;
yading@10 4525 int dst_length;
yading@10 4526 int bit_length;
yading@10 4527 const uint8_t *ptr;
yading@10 4528 int i, nalsize = 0;
yading@10 4529 int err;
yading@10 4530
yading@10 4531 if (buf_index >= next_avc) {
yading@10 4532 if (buf_index >= buf_size - h->nal_length_size)
yading@10 4533 break;
yading@10 4534 nalsize = 0;
yading@10 4535 for (i = 0; i < h->nal_length_size; i++)
yading@10 4536 nalsize = (nalsize << 8) | buf[buf_index++];
yading@10 4537 if (nalsize <= 0 || nalsize > buf_size - buf_index) {
yading@10 4538 av_log(h->avctx, AV_LOG_ERROR,
yading@10 4539 "AVC: nal size %d\n", nalsize);
yading@10 4540 break;
yading@10 4541 }
yading@10 4542 next_avc = buf_index + nalsize;
yading@10 4543 } else {
yading@10 4544 // start code prefix search
yading@10 4545 for (; buf_index + 3 < next_avc; buf_index++)
yading@10 4546 // This should always succeed in the first iteration.
yading@10 4547 if (buf[buf_index] == 0 &&
yading@10 4548 buf[buf_index + 1] == 0 &&
yading@10 4549 buf[buf_index + 2] == 1)
yading@10 4550 break;
yading@10 4551
yading@10 4552 if (buf_index + 3 >= buf_size) {
yading@10 4553 buf_index = buf_size;
yading@10 4554 break;
yading@10 4555 }
yading@10 4556
yading@10 4557 buf_index += 3;
yading@10 4558 if (buf_index >= next_avc)
yading@10 4559 continue;
yading@10 4560 }
yading@10 4561
yading@10 4562 hx = h->thread_context[context_count];
yading@10 4563
yading@10 4564 ptr = ff_h264_decode_nal(hx, buf + buf_index, &dst_length,
yading@10 4565 &consumed, next_avc - buf_index);
yading@10 4566 if (ptr == NULL || dst_length < 0) {
yading@10 4567 buf_index = -1;
yading@10 4568 goto end;
yading@10 4569 }
yading@10 4570 i = buf_index + consumed;
yading@10 4571 if ((h->workaround_bugs & FF_BUG_AUTODETECT) && i + 3 < next_avc &&
yading@10 4572 buf[i] == 0x00 && buf[i + 1] == 0x00 &&
yading@10 4573 buf[i + 2] == 0x01 && buf[i + 3] == 0xE0)
yading@10 4574 h->workaround_bugs |= FF_BUG_TRUNCATED;
yading@10 4575
yading@10 4576 if (!(h->workaround_bugs & FF_BUG_TRUNCATED))
yading@10 4577 while(dst_length > 0 && ptr[dst_length - 1] == 0)
yading@10 4578 dst_length--;
yading@10 4579 bit_length = !dst_length ? 0
yading@10 4580 : (8 * dst_length -
yading@10 4581 decode_rbsp_trailing(h, ptr + dst_length - 1));
yading@10 4582
yading@10 4583 if (h->avctx->debug & FF_DEBUG_STARTCODE)
yading@10 4584 av_log(h->avctx, AV_LOG_DEBUG, "NAL %d/%d at %d/%d length %d pass %d\n", hx->nal_unit_type, hx->nal_ref_idc, buf_index, buf_size, dst_length, pass);
yading@10 4585
yading@10 4586 if (h->is_avc && (nalsize != consumed) && nalsize)
yading@10 4587 av_log(h->avctx, AV_LOG_DEBUG,
yading@10 4588 "AVC: Consumed only %d bytes instead of %d\n",
yading@10 4589 consumed, nalsize);
yading@10 4590
yading@10 4591 buf_index += consumed;
yading@10 4592 nal_index++;
yading@10 4593
yading@10 4594 if (pass == 0) {
yading@10 4595 /* packets can sometimes contain multiple PPS/SPS,
yading@10 4596 * e.g. two PAFF field pictures in one packet, or a demuxer
yading@10 4597 * which splits NALs strangely if so, when frame threading we
yading@10 4598 * can't start the next thread until we've read all of them */
yading@10 4599 switch (hx->nal_unit_type) {
yading@10 4600 case NAL_SPS:
yading@10 4601 case NAL_PPS:
yading@10 4602 nals_needed = nal_index;
yading@10 4603 break;
yading@10 4604 case NAL_DPA:
yading@10 4605 case NAL_IDR_SLICE:
yading@10 4606 case NAL_SLICE:
yading@10 4607 init_get_bits(&hx->gb, ptr, bit_length);
yading@10 4608 if (!get_ue_golomb(&hx->gb) || !first_slice)
yading@10 4609 nals_needed = nal_index;
yading@10 4610 if (!first_slice)
yading@10 4611 first_slice = hx->nal_unit_type;
yading@10 4612 }
yading@10 4613 continue;
yading@10 4614 }
yading@10 4615
yading@10 4616 if (!first_slice)
yading@10 4617 switch (hx->nal_unit_type) {
yading@10 4618 case NAL_DPA:
yading@10 4619 case NAL_IDR_SLICE:
yading@10 4620 case NAL_SLICE:
yading@10 4621 first_slice = hx->nal_unit_type;
yading@10 4622 }
yading@10 4623
yading@10 4624 // FIXME do not discard SEI id
yading@10 4625 if (avctx->skip_frame >= AVDISCARD_NONREF && h->nal_ref_idc == 0)
yading@10 4626 continue;
yading@10 4627
yading@10 4628 again:
yading@10 4629 /* Ignore per frame NAL unit type during extradata
yading@10 4630 * parsing. Decoding slices is not possible in codec init
yading@10 4631 * with frame-mt */
yading@10 4632 if (parse_extradata) {
yading@10 4633 switch (hx->nal_unit_type) {
yading@10 4634 case NAL_IDR_SLICE:
yading@10 4635 case NAL_SLICE:
yading@10 4636 case NAL_DPA:
yading@10 4637 case NAL_DPB:
yading@10 4638 case NAL_DPC:
yading@10 4639 case NAL_AUXILIARY_SLICE:
yading@10 4640 av_log(h->avctx, AV_LOG_WARNING, "Ignoring NAL %d in global header/extradata\n", hx->nal_unit_type);
yading@10 4641 hx->nal_unit_type = NAL_FF_IGNORE;
yading@10 4642 }
yading@10 4643 }
yading@10 4644
yading@10 4645 err = 0;
yading@10 4646
yading@10 4647 switch (hx->nal_unit_type) {
yading@10 4648 case NAL_IDR_SLICE:
yading@10 4649 if (first_slice != NAL_IDR_SLICE) {
yading@10 4650 av_log(h->avctx, AV_LOG_ERROR,
yading@10 4651 "Invalid mix of idr and non-idr slices\n");
yading@10 4652 buf_index = -1;
yading@10 4653 goto end;
yading@10 4654 }
yading@10 4655 if(!idr_cleared)
yading@10 4656 idr(h); // FIXME ensure we don't lose some frames if there is reordering
yading@10 4657 idr_cleared = 1;
yading@10 4658 case NAL_SLICE:
yading@10 4659 init_get_bits(&hx->gb, ptr, bit_length);
yading@10 4660 hx->intra_gb_ptr =
yading@10 4661 hx->inter_gb_ptr = &hx->gb;
yading@10 4662 hx->data_partitioning = 0;
yading@10 4663
yading@10 4664 if ((err = decode_slice_header(hx, h)))
yading@10 4665 break;
yading@10 4666
yading@10 4667 if (h->sei_recovery_frame_cnt >= 0 && (h->frame_num != h->sei_recovery_frame_cnt || hx->slice_type_nos != AV_PICTURE_TYPE_I))
yading@10 4668 h->valid_recovery_point = 1;
yading@10 4669
yading@10 4670 if ( h->sei_recovery_frame_cnt >= 0
yading@10 4671 && ( h->recovery_frame<0
yading@10 4672 || ((h->recovery_frame - h->frame_num) & ((1 << h->sps.log2_max_frame_num)-1)) > h->sei_recovery_frame_cnt)) {
yading@10 4673 h->recovery_frame = (h->frame_num + h->sei_recovery_frame_cnt) %
yading@10 4674 (1 << h->sps.log2_max_frame_num);
yading@10 4675
yading@10 4676 if (!h->valid_recovery_point)
yading@10 4677 h->recovery_frame = h->frame_num;
yading@10 4678 }
yading@10 4679
yading@10 4680 h->cur_pic_ptr->f.key_frame |=
yading@10 4681 (hx->nal_unit_type == NAL_IDR_SLICE);
yading@10 4682
yading@10 4683 if (h->recovery_frame == h->frame_num) {
yading@10 4684 h->cur_pic_ptr->sync |= 1;
yading@10 4685 h->recovery_frame = -1;
yading@10 4686 }
yading@10 4687
yading@10 4688 h->sync |= !!h->cur_pic_ptr->f.key_frame;
yading@10 4689 h->sync |= 3*!!(avctx->flags2 & CODEC_FLAG2_SHOW_ALL);
yading@10 4690 h->cur_pic_ptr->sync |= h->sync;
yading@10 4691
yading@10 4692 if (h->current_slice == 1) {
yading@10 4693 if (!(avctx->flags2 & CODEC_FLAG2_CHUNKS))
yading@10 4694 decode_postinit(h, nal_index >= nals_needed);
yading@10 4695
yading@10 4696 if (h->avctx->hwaccel &&
yading@10 4697 h->avctx->hwaccel->start_frame(h->avctx, NULL, 0) < 0)
yading@10 4698 return -1;
yading@10 4699 if (CONFIG_H264_VDPAU_DECODER &&
yading@10 4700 h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
yading@10 4701 ff_vdpau_h264_picture_start(h);
yading@10 4702 }
yading@10 4703
yading@10 4704 if (hx->redundant_pic_count == 0 &&
yading@10 4705 (avctx->skip_frame < AVDISCARD_NONREF ||
yading@10 4706 hx->nal_ref_idc) &&
yading@10 4707 (avctx->skip_frame < AVDISCARD_BIDIR ||
yading@10 4708 hx->slice_type_nos != AV_PICTURE_TYPE_B) &&
yading@10 4709 (avctx->skip_frame < AVDISCARD_NONKEY ||
yading@10 4710 hx->slice_type_nos == AV_PICTURE_TYPE_I) &&
yading@10 4711 avctx->skip_frame < AVDISCARD_ALL) {
yading@10 4712 if (avctx->hwaccel) {
yading@10 4713 if (avctx->hwaccel->decode_slice(avctx,
yading@10 4714 &buf[buf_index - consumed],
yading@10 4715 consumed) < 0)
yading@10 4716 return -1;
yading@10 4717 } else if (CONFIG_H264_VDPAU_DECODER &&
yading@10 4718 h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) {
yading@10 4719 static const uint8_t start_code[] = {
yading@10 4720 0x00, 0x00, 0x01 };
yading@10 4721 ff_vdpau_add_data_chunk(h->cur_pic_ptr->f.data[0], start_code,
yading@10 4722 sizeof(start_code));
yading@10 4723 ff_vdpau_add_data_chunk(h->cur_pic_ptr->f.data[0], &buf[buf_index - consumed],
yading@10 4724 consumed);
yading@10 4725 } else
yading@10 4726 context_count++;
yading@10 4727 }
yading@10 4728 break;
yading@10 4729 case NAL_DPA:
yading@10 4730 init_get_bits(&hx->gb, ptr, bit_length);
yading@10 4731 hx->intra_gb_ptr =
yading@10 4732 hx->inter_gb_ptr = NULL;
yading@10 4733
yading@10 4734 if ((err = decode_slice_header(hx, h)) < 0)
yading@10 4735 break;
yading@10 4736
yading@10 4737 hx->data_partitioning = 1;
yading@10 4738 break;
yading@10 4739 case NAL_DPB:
yading@10 4740 init_get_bits(&hx->intra_gb, ptr, bit_length);
yading@10 4741 hx->intra_gb_ptr = &hx->intra_gb;
yading@10 4742 break;
yading@10 4743 case NAL_DPC:
yading@10 4744 init_get_bits(&hx->inter_gb, ptr, bit_length);
yading@10 4745 hx->inter_gb_ptr = &hx->inter_gb;
yading@10 4746
yading@10 4747 av_log(h->avctx, AV_LOG_ERROR, "Partitioned H.264 support is incomplete\n");
yading@10 4748 break;
yading@10 4749
yading@10 4750 if (hx->redundant_pic_count == 0 &&
yading@10 4751 hx->intra_gb_ptr &&
yading@10 4752 hx->data_partitioning &&
yading@10 4753 h->cur_pic_ptr && h->context_initialized &&
yading@10 4754 (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) &&
yading@10 4755 (avctx->skip_frame < AVDISCARD_BIDIR ||
yading@10 4756 hx->slice_type_nos != AV_PICTURE_TYPE_B) &&
yading@10 4757 (avctx->skip_frame < AVDISCARD_NONKEY ||
yading@10 4758 hx->slice_type_nos == AV_PICTURE_TYPE_I) &&
yading@10 4759 avctx->skip_frame < AVDISCARD_ALL)
yading@10 4760 context_count++;
yading@10 4761 break;
yading@10 4762 case NAL_SEI:
yading@10 4763 init_get_bits(&h->gb, ptr, bit_length);
yading@10 4764 ff_h264_decode_sei(h);
yading@10 4765 break;
yading@10 4766 case NAL_SPS:
yading@10 4767 init_get_bits(&h->gb, ptr, bit_length);
yading@10 4768 if (ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? (nalsize != consumed) && nalsize : 1)) {
yading@10 4769 av_log(h->avctx, AV_LOG_DEBUG,
yading@10 4770 "SPS decoding failure, trying again with the complete NAL\n");
yading@10 4771 if (h->is_avc)
yading@10 4772 av_assert0(next_avc - buf_index + consumed == nalsize);
yading@10 4773 if ((next_avc - buf_index + consumed - 1) >= INT_MAX/8)
yading@10 4774 break;
yading@10 4775 init_get_bits(&h->gb, &buf[buf_index + 1 - consumed],
yading@10 4776 8*(next_avc - buf_index + consumed - 1));
yading@10 4777 ff_h264_decode_seq_parameter_set(h);
yading@10 4778 }
yading@10 4779
yading@10 4780 break;
yading@10 4781 case NAL_PPS:
yading@10 4782 init_get_bits(&h->gb, ptr, bit_length);
yading@10 4783 ff_h264_decode_picture_parameter_set(h, bit_length);
yading@10 4784 break;
yading@10 4785 case NAL_AUD:
yading@10 4786 case NAL_END_SEQUENCE:
yading@10 4787 case NAL_END_STREAM:
yading@10 4788 case NAL_FILLER_DATA:
yading@10 4789 case NAL_SPS_EXT:
yading@10 4790 case NAL_AUXILIARY_SLICE:
yading@10 4791 break;
yading@10 4792 case NAL_FF_IGNORE:
yading@10 4793 break;
yading@10 4794 default:
yading@10 4795 av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n",
yading@10 4796 hx->nal_unit_type, bit_length);
yading@10 4797 }
yading@10 4798
yading@10 4799 if (context_count == h->max_contexts) {
yading@10 4800 execute_decode_slices(h, context_count);
yading@10 4801 context_count = 0;
yading@10 4802 }
yading@10 4803
yading@10 4804 if (err < 0)
yading@10 4805 av_log(h->avctx, AV_LOG_ERROR, "decode_slice_header error\n");
yading@10 4806 else if (err == 1) {
yading@10 4807 /* Slice could not be decoded in parallel mode, copy down
yading@10 4808 * NAL unit stuff to context 0 and restart. Note that
yading@10 4809 * rbsp_buffer is not transferred, but since we no longer
yading@10 4810 * run in parallel mode this should not be an issue. */
yading@10 4811 h->nal_unit_type = hx->nal_unit_type;
yading@10 4812 h->nal_ref_idc = hx->nal_ref_idc;
yading@10 4813 hx = h;
yading@10 4814 goto again;
yading@10 4815 }
yading@10 4816 }
yading@10 4817 }
yading@10 4818 if (context_count)
yading@10 4819 execute_decode_slices(h, context_count);
yading@10 4820
yading@10 4821 end:
yading@10 4822 /* clean up */
yading@10 4823 if (h->cur_pic_ptr && !h->droppable) {
yading@10 4824 ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
yading@10 4825 h->picture_structure == PICT_BOTTOM_FIELD);
yading@10 4826 }
yading@10 4827
yading@10 4828 return buf_index;
yading@10 4829 }
yading@10 4830
yading@10 4831 /**
yading@10 4832 * Return the number of bytes consumed for building the current frame.
yading@10 4833 */
yading@10 4834 static int get_consumed_bytes(int pos, int buf_size)
yading@10 4835 {
yading@10 4836 if (pos == 0)
yading@10 4837 pos = 1; // avoid infinite loops (i doubt that is needed but ...)
yading@10 4838 if (pos + 10 > buf_size)
yading@10 4839 pos = buf_size; // oops ;)
yading@10 4840
yading@10 4841 return pos;
yading@10 4842 }
yading@10 4843
yading@10 4844 static int output_frame(H264Context *h, AVFrame *dst, AVFrame *src)
yading@10 4845 {
yading@10 4846 int i;
yading@10 4847 int ret = av_frame_ref(dst, src);
yading@10 4848 if (ret < 0)
yading@10 4849 return ret;
yading@10 4850
yading@10 4851 if (!h->sps.crop)
yading@10 4852 return 0;
yading@10 4853
yading@10 4854 for (i = 0; i < 3; i++) {
yading@10 4855 int hshift = (i > 0) ? h->chroma_x_shift : 0;
yading@10 4856 int vshift = (i > 0) ? h->chroma_y_shift : 0;
yading@10 4857 int off = ((h->sps.crop_left >> hshift) << h->pixel_shift) +
yading@10 4858 (h->sps.crop_top >> vshift) * dst->linesize[i];
yading@10 4859 dst->data[i] += off;
yading@10 4860 }
yading@10 4861 return 0;
yading@10 4862 }
yading@10 4863
yading@10 4864 static int decode_frame(AVCodecContext *avctx, void *data,
yading@10 4865 int *got_frame, AVPacket *avpkt)
yading@10 4866 {
yading@10 4867 const uint8_t *buf = avpkt->data;
yading@10 4868 int buf_size = avpkt->size;
yading@10 4869 H264Context *h = avctx->priv_data;
yading@10 4870 AVFrame *pict = data;
yading@10 4871 int buf_index = 0;
yading@10 4872 Picture *out;
yading@10 4873 int i, out_idx;
yading@10 4874 int ret;
yading@10 4875
yading@10 4876 h->flags = avctx->flags;
yading@10 4877
yading@10 4878 /* end of stream, output what is still in the buffers */
yading@10 4879 if (buf_size == 0) {
yading@10 4880 out:
yading@10 4881
yading@10 4882 h->cur_pic_ptr = NULL;
yading@10 4883 h->first_field = 0;
yading@10 4884
yading@10 4885 // FIXME factorize this with the output code below
yading@10 4886 out = h->delayed_pic[0];
yading@10 4887 out_idx = 0;
yading@10 4888 for (i = 1;
yading@10 4889 h->delayed_pic[i] &&
yading@10 4890 !h->delayed_pic[i]->f.key_frame &&
yading@10 4891 !h->delayed_pic[i]->mmco_reset;
yading@10 4892 i++)
yading@10 4893 if (h->delayed_pic[i]->poc < out->poc) {
yading@10 4894 out = h->delayed_pic[i];
yading@10 4895 out_idx = i;
yading@10 4896 }
yading@10 4897
yading@10 4898 for (i = out_idx; h->delayed_pic[i]; i++)
yading@10 4899 h->delayed_pic[i] = h->delayed_pic[i + 1];
yading@10 4900
yading@10 4901 if (out) {
yading@10 4902 out->reference &= ~DELAYED_PIC_REF;
yading@10 4903 ret = output_frame(h, pict, &out->f);
yading@10 4904 if (ret < 0)
yading@10 4905 return ret;
yading@10 4906 *got_frame = 1;
yading@10 4907 }
yading@10 4908
yading@10 4909 return buf_index;
yading@10 4910 }
yading@10 4911 if(h->is_avc && buf_size >= 9 && buf[0]==1 && buf[2]==0 && (buf[4]&0xFC)==0xFC && (buf[5]&0x1F) && buf[8]==0x67){
yading@10 4912 int cnt= buf[5]&0x1f;
yading@10 4913 const uint8_t *p= buf+6;
yading@10 4914 while(cnt--){
yading@10 4915 int nalsize= AV_RB16(p) + 2;
yading@10 4916 if(nalsize > buf_size - (p-buf) || p[2]!=0x67)
yading@10 4917 goto not_extra;
yading@10 4918 p += nalsize;
yading@10 4919 }
yading@10 4920 cnt = *(p++);
yading@10 4921 if(!cnt)
yading@10 4922 goto not_extra;
yading@10 4923 while(cnt--){
yading@10 4924 int nalsize= AV_RB16(p) + 2;
yading@10 4925 if(nalsize > buf_size - (p-buf) || p[2]!=0x68)
yading@10 4926 goto not_extra;
yading@10 4927 p += nalsize;
yading@10 4928 }
yading@10 4929
yading@10 4930 return ff_h264_decode_extradata(h, buf, buf_size);
yading@10 4931 }
yading@10 4932 not_extra:
yading@10 4933
yading@10 4934 buf_index = decode_nal_units(h, buf, buf_size, 0);
yading@10 4935 if (buf_index < 0)
yading@10 4936 return -1;
yading@10 4937
yading@10 4938 if (!h->cur_pic_ptr && h->nal_unit_type == NAL_END_SEQUENCE) {
yading@10 4939 av_assert0(buf_index <= buf_size);
yading@10 4940 goto out;
yading@10 4941 }
yading@10 4942
yading@10 4943 if (!(avctx->flags2 & CODEC_FLAG2_CHUNKS) && !h->cur_pic_ptr) {
yading@10 4944 if (avctx->skip_frame >= AVDISCARD_NONREF ||
yading@10 4945 buf_size >= 4 && !memcmp("Q264", buf, 4))
yading@10 4946 return buf_size;
yading@10 4947 av_log(avctx, AV_LOG_ERROR, "no frame!\n");
yading@10 4948 return -1;
yading@10 4949 }
yading@10 4950
yading@10 4951 if (!(avctx->flags2 & CODEC_FLAG2_CHUNKS) ||
yading@10 4952 (h->mb_y >= h->mb_height && h->mb_height)) {
yading@10 4953 if (avctx->flags2 & CODEC_FLAG2_CHUNKS)
yading@10 4954 decode_postinit(h, 1);
yading@10 4955
yading@10 4956 field_end(h, 0);
yading@10 4957
yading@10 4958 /* Wait for second field. */
yading@10 4959 *got_frame = 0;
yading@10 4960 if (h->next_output_pic && (h->next_output_pic->sync || h->sync>1)) {
yading@10 4961 ret = output_frame(h, pict, &h->next_output_pic->f);
yading@10 4962 if (ret < 0)
yading@10 4963 return ret;
yading@10 4964 *got_frame = 1;
yading@10 4965 if (CONFIG_MPEGVIDEO) {
yading@10 4966 ff_print_debug_info2(h->avctx, h->next_output_pic, pict, h->er.mbskip_table,
yading@10 4967 &h->low_delay,
yading@10 4968 h->mb_width, h->mb_height, h->mb_stride, 1);
yading@10 4969 }
yading@10 4970 }
yading@10 4971 }
yading@10 4972
yading@10 4973 assert(pict->data[0] || !*got_frame);
yading@10 4974
yading@10 4975 return get_consumed_bytes(buf_index, buf_size);
yading@10 4976 }
yading@10 4977
yading@10 4978 av_cold void ff_h264_free_context(H264Context *h)
yading@10 4979 {
yading@10 4980 int i;
yading@10 4981
yading@10 4982 free_tables(h, 1); // FIXME cleanup init stuff perhaps
yading@10 4983
yading@10 4984 for (i = 0; i < MAX_SPS_COUNT; i++)
yading@10 4985 av_freep(h->sps_buffers + i);
yading@10 4986
yading@10 4987 for (i = 0; i < MAX_PPS_COUNT; i++)
yading@10 4988 av_freep(h->pps_buffers + i);
yading@10 4989 }
yading@10 4990
yading@10 4991 static av_cold int h264_decode_end(AVCodecContext *avctx)
yading@10 4992 {
yading@10 4993 H264Context *h = avctx->priv_data;
yading@10 4994
yading@10 4995 ff_h264_remove_all_refs(h);
yading@10 4996 ff_h264_free_context(h);
yading@10 4997
yading@10 4998 unref_picture(h, &h->cur_pic);
yading@10 4999
yading@10 5000 return 0;
yading@10 5001 }
yading@10 5002
yading@10 5003 static const AVProfile profiles[] = {
yading@10 5004 { FF_PROFILE_H264_BASELINE, "Baseline" },
yading@10 5005 { FF_PROFILE_H264_CONSTRAINED_BASELINE, "Constrained Baseline" },
yading@10 5006 { FF_PROFILE_H264_MAIN, "Main" },
yading@10 5007 { FF_PROFILE_H264_EXTENDED, "Extended" },
yading@10 5008 { FF_PROFILE_H264_HIGH, "High" },
yading@10 5009 { FF_PROFILE_H264_HIGH_10, "High 10" },
yading@10 5010 { FF_PROFILE_H264_HIGH_10_INTRA, "High 10 Intra" },
yading@10 5011 { FF_PROFILE_H264_HIGH_422, "High 4:2:2" },
yading@10 5012 { FF_PROFILE_H264_HIGH_422_INTRA, "High 4:2:2 Intra" },
yading@10 5013 { FF_PROFILE_H264_HIGH_444, "High 4:4:4" },
yading@10 5014 { FF_PROFILE_H264_HIGH_444_PREDICTIVE, "High 4:4:4 Predictive" },
yading@10 5015 { FF_PROFILE_H264_HIGH_444_INTRA, "High 4:4:4 Intra" },
yading@10 5016 { FF_PROFILE_H264_CAVLC_444, "CAVLC 4:4:4" },
yading@10 5017 { FF_PROFILE_UNKNOWN },
yading@10 5018 };
yading@10 5019
yading@10 5020 static const AVOption h264_options[] = {
yading@10 5021 {"is_avc", "is avc", offsetof(H264Context, is_avc), FF_OPT_TYPE_INT, {.i64 = 0}, 0, 1, 0},
yading@10 5022 {"nal_length_size", "nal_length_size", offsetof(H264Context, nal_length_size), FF_OPT_TYPE_INT, {.i64 = 0}, 0, 4, 0},
yading@10 5023 {NULL}
yading@10 5024 };
yading@10 5025
yading@10 5026 static const AVClass h264_class = {
yading@10 5027 .class_name = "H264 Decoder",
yading@10 5028 .item_name = av_default_item_name,
yading@10 5029 .option = h264_options,
yading@10 5030 .version = LIBAVUTIL_VERSION_INT,
yading@10 5031 };
yading@10 5032
yading@10 5033 static const AVClass h264_vdpau_class = {
yading@10 5034 .class_name = "H264 VDPAU Decoder",
yading@10 5035 .item_name = av_default_item_name,
yading@10 5036 .option = h264_options,
yading@10 5037 .version = LIBAVUTIL_VERSION_INT,
yading@10 5038 };
yading@10 5039
yading@10 5040 AVCodec ff_h264_decoder = {
yading@10 5041 .name = "h264",
yading@10 5042 .type = AVMEDIA_TYPE_VIDEO,
yading@10 5043 .id = AV_CODEC_ID_H264,
yading@10 5044 .priv_data_size = sizeof(H264Context),
yading@10 5045 .init = ff_h264_decode_init,
yading@10 5046 .close = h264_decode_end,
yading@10 5047 .decode = decode_frame,
yading@10 5048 .capabilities = /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 |
yading@10 5049 CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS |
yading@10 5050 CODEC_CAP_FRAME_THREADS,
yading@10 5051 .flush = flush_dpb,
yading@10 5052 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
yading@10 5053 .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
yading@10 5054 .update_thread_context = ONLY_IF_THREADS_ENABLED(decode_update_thread_context),
yading@10 5055 .profiles = NULL_IF_CONFIG_SMALL(profiles),
yading@10 5056 .priv_class = &h264_class,
yading@10 5057 };
yading@10 5058
yading@10 5059 #if CONFIG_H264_VDPAU_DECODER
yading@10 5060 AVCodec ff_h264_vdpau_decoder = {
yading@10 5061 .name = "h264_vdpau",
yading@10 5062 .type = AVMEDIA_TYPE_VIDEO,
yading@10 5063 .id = AV_CODEC_ID_H264,
yading@10 5064 .priv_data_size = sizeof(H264Context),
yading@10 5065 .init = ff_h264_decode_init,
yading@10 5066 .close = h264_decode_end,
yading@10 5067 .decode = decode_frame,
yading@10 5068 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
yading@10 5069 .flush = flush_dpb,
yading@10 5070 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"),
yading@10 5071 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VDPAU_H264,
yading@10 5072 AV_PIX_FMT_NONE},
yading@10 5073 .profiles = NULL_IF_CONFIG_SMALL(profiles),
yading@10 5074 .priv_class = &h264_vdpau_class,
yading@10 5075 };
yading@10 5076 #endif