1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * H.264 / AVC / MPEG-4 part10 codec. 25cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#define UNCHECKED_BITSTREAM_READER 1 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "config_components.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 33cabdff1aSopenharmony_ci#include "libavutil/imgutils.h" 34cabdff1aSopenharmony_ci#include "libavutil/opt.h" 35cabdff1aSopenharmony_ci#include "libavutil/thread.h" 36cabdff1aSopenharmony_ci#include "libavutil/video_enc_params.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#include "codec_internal.h" 39cabdff1aSopenharmony_ci#include "internal.h" 40cabdff1aSopenharmony_ci#include "error_resilience.h" 41cabdff1aSopenharmony_ci#include "avcodec.h" 42cabdff1aSopenharmony_ci#include "h264.h" 43cabdff1aSopenharmony_ci#include "h264dec.h" 44cabdff1aSopenharmony_ci#include "h2645_parse.h" 45cabdff1aSopenharmony_ci#include "h264data.h" 46cabdff1aSopenharmony_ci#include "h264_ps.h" 47cabdff1aSopenharmony_ci#include "golomb.h" 48cabdff1aSopenharmony_ci#include "hwconfig.h" 49cabdff1aSopenharmony_ci#include "mpegutils.h" 50cabdff1aSopenharmony_ci#include "profiles.h" 51cabdff1aSopenharmony_ci#include "rectangle.h" 52cabdff1aSopenharmony_ci#include "thread.h" 53cabdff1aSopenharmony_ci#include "threadframe.h" 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ciconst uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 }; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ciint avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx) 58cabdff1aSopenharmony_ci{ 59cabdff1aSopenharmony_ci H264Context *h = avctx->priv_data; 60cabdff1aSopenharmony_ci return h && h->ps.sps ? h->ps.sps->num_reorder_frames : 0; 61cabdff1aSopenharmony_ci} 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistatic void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, 64cabdff1aSopenharmony_ci int (*mv)[2][4][2], 65cabdff1aSopenharmony_ci int mb_x, int mb_y, int mb_intra, int mb_skipped) 66cabdff1aSopenharmony_ci{ 67cabdff1aSopenharmony_ci H264Context *h = opaque; 68cabdff1aSopenharmony_ci H264SliceContext *sl = &h->slice_ctx[0]; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci sl->mb_x = mb_x; 71cabdff1aSopenharmony_ci sl->mb_y = mb_y; 72cabdff1aSopenharmony_ci sl->mb_xy = mb_x + mb_y * h->mb_stride; 73cabdff1aSopenharmony_ci memset(sl->non_zero_count_cache, 0, sizeof(sl->non_zero_count_cache)); 74cabdff1aSopenharmony_ci av_assert1(ref >= 0); 75cabdff1aSopenharmony_ci /* FIXME: It is possible albeit uncommon that slice references 76cabdff1aSopenharmony_ci * differ between slices. We take the easy approach and ignore 77cabdff1aSopenharmony_ci * it for now. If this turns out to have any relevance in 78cabdff1aSopenharmony_ci * practice then correct remapping should be added. */ 79cabdff1aSopenharmony_ci if (ref >= sl->ref_count[0]) 80cabdff1aSopenharmony_ci ref = 0; 81cabdff1aSopenharmony_ci if (!sl->ref_list[0][ref].data[0]) { 82cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_DEBUG, "Reference not available for error concealing\n"); 83cabdff1aSopenharmony_ci ref = 0; 84cabdff1aSopenharmony_ci } 85cabdff1aSopenharmony_ci if ((sl->ref_list[0][ref].reference&3) != 3) { 86cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_DEBUG, "Reference invalid\n"); 87cabdff1aSopenharmony_ci return; 88cabdff1aSopenharmony_ci } 89cabdff1aSopenharmony_ci fill_rectangle(&h->cur_pic.ref_index[0][4 * sl->mb_xy], 90cabdff1aSopenharmony_ci 2, 2, 2, ref, 1); 91cabdff1aSopenharmony_ci fill_rectangle(&sl->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1); 92cabdff1aSopenharmony_ci fill_rectangle(sl->mv_cache[0][scan8[0]], 4, 4, 8, 93cabdff1aSopenharmony_ci pack16to32((*mv)[0][0][0], (*mv)[0][0][1]), 4); 94cabdff1aSopenharmony_ci sl->mb_mbaff = 95cabdff1aSopenharmony_ci sl->mb_field_decoding_flag = 0; 96cabdff1aSopenharmony_ci ff_h264_hl_decode_mb(h, &h->slice_ctx[0]); 97cabdff1aSopenharmony_ci} 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_civoid ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, 100cabdff1aSopenharmony_ci int y, int height) 101cabdff1aSopenharmony_ci{ 102cabdff1aSopenharmony_ci AVCodecContext *avctx = h->avctx; 103cabdff1aSopenharmony_ci const AVFrame *src = h->cur_pic.f; 104cabdff1aSopenharmony_ci const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); 105cabdff1aSopenharmony_ci int vshift = desc->log2_chroma_h; 106cabdff1aSopenharmony_ci const int field_pic = h->picture_structure != PICT_FRAME; 107cabdff1aSopenharmony_ci if (field_pic) { 108cabdff1aSopenharmony_ci height <<= 1; 109cabdff1aSopenharmony_ci y <<= 1; 110cabdff1aSopenharmony_ci } 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci height = FFMIN(height, avctx->height - y); 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci if (field_pic && h->first_field && !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) 115cabdff1aSopenharmony_ci return; 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci if (avctx->draw_horiz_band) { 118cabdff1aSopenharmony_ci int offset[AV_NUM_DATA_POINTERS]; 119cabdff1aSopenharmony_ci int i; 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci offset[0] = y * src->linesize[0]; 122cabdff1aSopenharmony_ci offset[1] = 123cabdff1aSopenharmony_ci offset[2] = (y >> vshift) * src->linesize[1]; 124cabdff1aSopenharmony_ci for (i = 3; i < AV_NUM_DATA_POINTERS; i++) 125cabdff1aSopenharmony_ci offset[i] = 0; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci emms_c(); 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci avctx->draw_horiz_band(avctx, src, offset, 130cabdff1aSopenharmony_ci y, h->picture_structure, height); 131cabdff1aSopenharmony_ci } 132cabdff1aSopenharmony_ci} 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_civoid ff_h264_free_tables(H264Context *h) 135cabdff1aSopenharmony_ci{ 136cabdff1aSopenharmony_ci int i; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci av_freep(&h->intra4x4_pred_mode); 139cabdff1aSopenharmony_ci av_freep(&h->chroma_pred_mode_table); 140cabdff1aSopenharmony_ci av_freep(&h->cbp_table); 141cabdff1aSopenharmony_ci av_freep(&h->mvd_table[0]); 142cabdff1aSopenharmony_ci av_freep(&h->mvd_table[1]); 143cabdff1aSopenharmony_ci av_freep(&h->direct_table); 144cabdff1aSopenharmony_ci av_freep(&h->non_zero_count); 145cabdff1aSopenharmony_ci av_freep(&h->slice_table_base); 146cabdff1aSopenharmony_ci h->slice_table = NULL; 147cabdff1aSopenharmony_ci av_freep(&h->list_counts); 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci av_freep(&h->mb2b_xy); 150cabdff1aSopenharmony_ci av_freep(&h->mb2br_xy); 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci av_buffer_pool_uninit(&h->qscale_table_pool); 153cabdff1aSopenharmony_ci av_buffer_pool_uninit(&h->mb_type_pool); 154cabdff1aSopenharmony_ci av_buffer_pool_uninit(&h->motion_val_pool); 155cabdff1aSopenharmony_ci av_buffer_pool_uninit(&h->ref_index_pool); 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci#if CONFIG_ERROR_RESILIENCE 158cabdff1aSopenharmony_ci av_freep(&h->er.mb_index2xy); 159cabdff1aSopenharmony_ci av_freep(&h->er.error_status_table); 160cabdff1aSopenharmony_ci av_freep(&h->er.er_temp_buffer); 161cabdff1aSopenharmony_ci av_freep(&h->dc_val_base); 162cabdff1aSopenharmony_ci#endif 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci for (i = 0; i < h->nb_slice_ctx; i++) { 165cabdff1aSopenharmony_ci H264SliceContext *sl = &h->slice_ctx[i]; 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci av_freep(&sl->bipred_scratchpad); 168cabdff1aSopenharmony_ci av_freep(&sl->edge_emu_buffer); 169cabdff1aSopenharmony_ci av_freep(&sl->top_borders[0]); 170cabdff1aSopenharmony_ci av_freep(&sl->top_borders[1]); 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci sl->bipred_scratchpad_allocated = 0; 173cabdff1aSopenharmony_ci sl->edge_emu_buffer_allocated = 0; 174cabdff1aSopenharmony_ci sl->top_borders_allocated[0] = 0; 175cabdff1aSopenharmony_ci sl->top_borders_allocated[1] = 0; 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci} 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ciint ff_h264_alloc_tables(H264Context *h) 180cabdff1aSopenharmony_ci{ 181cabdff1aSopenharmony_ci ERContext *const er = &h->er; 182cabdff1aSopenharmony_ci const int big_mb_num = h->mb_stride * (h->mb_height + 1); 183cabdff1aSopenharmony_ci const int row_mb_num = 2*h->mb_stride*FFMAX(h->nb_slice_ctx, 1); 184cabdff1aSopenharmony_ci const int st_size = big_mb_num + h->mb_stride; 185cabdff1aSopenharmony_ci int x, y; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(h->intra4x4_pred_mode, row_mb_num * 8) || 188cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->non_zero_count, big_mb_num) || 189cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->slice_table_base, st_size) || 190cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->cbp_table, big_mb_num) || 191cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->chroma_pred_mode_table, big_mb_num) || 192cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->mvd_table[0], row_mb_num * 8) || 193cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->mvd_table[1], row_mb_num * 8) || 194cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->direct_table, big_mb_num * 4) || 195cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->list_counts, big_mb_num) || 196cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->mb2b_xy, big_mb_num) || 197cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->mb2br_xy, big_mb_num)) 198cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 199cabdff1aSopenharmony_ci h->slice_ctx[0].intra4x4_pred_mode = h->intra4x4_pred_mode; 200cabdff1aSopenharmony_ci h->slice_ctx[0].mvd_table[0] = h->mvd_table[0]; 201cabdff1aSopenharmony_ci h->slice_ctx[0].mvd_table[1] = h->mvd_table[1]; 202cabdff1aSopenharmony_ci memset(h->slice_table_base, -1, 203cabdff1aSopenharmony_ci st_size * sizeof(*h->slice_table_base)); 204cabdff1aSopenharmony_ci h->slice_table = h->slice_table_base + h->mb_stride * 2 + 1; 205cabdff1aSopenharmony_ci for (y = 0; y < h->mb_height; y++) 206cabdff1aSopenharmony_ci for (x = 0; x < h->mb_width; x++) { 207cabdff1aSopenharmony_ci const int mb_xy = x + y * h->mb_stride; 208cabdff1aSopenharmony_ci const int b_xy = 4 * x + 4 * y * h->b_stride; 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci h->mb2b_xy[mb_xy] = b_xy; 211cabdff1aSopenharmony_ci h->mb2br_xy[mb_xy] = 8 * (FMO ? mb_xy : (mb_xy % (2 * h->mb_stride))); 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci if (CONFIG_ERROR_RESILIENCE) { 215cabdff1aSopenharmony_ci const int er_size = h->mb_height * h->mb_stride * (4*sizeof(int) + 1); 216cabdff1aSopenharmony_ci int mb_array_size = h->mb_height * h->mb_stride; 217cabdff1aSopenharmony_ci int y_size = (2 * h->mb_width + 1) * (2 * h->mb_height + 1); 218cabdff1aSopenharmony_ci int yc_size = y_size + 2 * big_mb_num; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci /* init ER */ 221cabdff1aSopenharmony_ci er->avctx = h->avctx; 222cabdff1aSopenharmony_ci er->decode_mb = h264_er_decode_mb; 223cabdff1aSopenharmony_ci er->opaque = h; 224cabdff1aSopenharmony_ci er->quarter_sample = 1; 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci er->mb_num = h->mb_num; 227cabdff1aSopenharmony_ci er->mb_width = h->mb_width; 228cabdff1aSopenharmony_ci er->mb_height = h->mb_height; 229cabdff1aSopenharmony_ci er->mb_stride = h->mb_stride; 230cabdff1aSopenharmony_ci er->b8_stride = h->mb_width * 2 + 1; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci // error resilience code looks cleaner with this 233cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(er->mb_index2xy, h->mb_num + 1) || 234cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(er->error_status_table, mb_array_size) || 235cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(er->er_temp_buffer, er_size) || 236cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(h->dc_val_base, yc_size)) 237cabdff1aSopenharmony_ci return AVERROR(ENOMEM); // ff_h264_free_tables will clean up for us 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci for (y = 0; y < h->mb_height; y++) 240cabdff1aSopenharmony_ci for (x = 0; x < h->mb_width; x++) 241cabdff1aSopenharmony_ci er->mb_index2xy[x + y * h->mb_width] = x + y * h->mb_stride; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci er->mb_index2xy[h->mb_height * h->mb_width] = (h->mb_height - 1) * 244cabdff1aSopenharmony_ci h->mb_stride + h->mb_width; 245cabdff1aSopenharmony_ci er->dc_val[0] = h->dc_val_base + h->mb_width * 2 + 2; 246cabdff1aSopenharmony_ci er->dc_val[1] = h->dc_val_base + y_size + h->mb_stride + 1; 247cabdff1aSopenharmony_ci er->dc_val[2] = er->dc_val[1] + big_mb_num; 248cabdff1aSopenharmony_ci for (int i = 0; i < yc_size; i++) 249cabdff1aSopenharmony_ci h->dc_val_base[i] = 1024; 250cabdff1aSopenharmony_ci } 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci return 0; 253cabdff1aSopenharmony_ci} 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci/** 256cabdff1aSopenharmony_ci * Init slice context 257cabdff1aSopenharmony_ci */ 258cabdff1aSopenharmony_civoid ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl) 259cabdff1aSopenharmony_ci{ 260cabdff1aSopenharmony_ci sl->ref_cache[0][scan8[5] + 1] = 261cabdff1aSopenharmony_ci sl->ref_cache[0][scan8[7] + 1] = 262cabdff1aSopenharmony_ci sl->ref_cache[0][scan8[13] + 1] = 263cabdff1aSopenharmony_ci sl->ref_cache[1][scan8[5] + 1] = 264cabdff1aSopenharmony_ci sl->ref_cache[1][scan8[7] + 1] = 265cabdff1aSopenharmony_ci sl->ref_cache[1][scan8[13] + 1] = PART_NOT_AVAILABLE; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci sl->er = &h->er; 268cabdff1aSopenharmony_ci} 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_cistatic int h264_init_pic(H264Picture *pic) 271cabdff1aSopenharmony_ci{ 272cabdff1aSopenharmony_ci pic->f = av_frame_alloc(); 273cabdff1aSopenharmony_ci if (!pic->f) 274cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci pic->f_grain = av_frame_alloc(); 277cabdff1aSopenharmony_ci if (!pic->f_grain) 278cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci return 0; 281cabdff1aSopenharmony_ci} 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_cistatic int h264_init_context(AVCodecContext *avctx, H264Context *h) 284cabdff1aSopenharmony_ci{ 285cabdff1aSopenharmony_ci int i, ret; 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_ci h->avctx = avctx; 288cabdff1aSopenharmony_ci h->cur_chroma_format_idc = -1; 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci h->width_from_caller = avctx->width; 291cabdff1aSopenharmony_ci h->height_from_caller = avctx->height; 292cabdff1aSopenharmony_ci 293cabdff1aSopenharmony_ci h->workaround_bugs = avctx->workaround_bugs; 294cabdff1aSopenharmony_ci h->flags = avctx->flags; 295cabdff1aSopenharmony_ci h->poc.prev_poc_msb = 1 << 16; 296cabdff1aSopenharmony_ci h->recovery_frame = -1; 297cabdff1aSopenharmony_ci h->frame_recovered = 0; 298cabdff1aSopenharmony_ci h->poc.prev_frame_num = -1; 299cabdff1aSopenharmony_ci h->sei.frame_packing.arrangement_cancel_flag = -1; 300cabdff1aSopenharmony_ci h->sei.unregistered.x264_build = -1; 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_ci h->next_outputed_poc = INT_MIN; 303cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++) 304cabdff1aSopenharmony_ci h->last_pocs[i] = INT_MIN; 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci ff_h264_sei_uninit(&h->sei); 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? avctx->thread_count : 1; 309cabdff1aSopenharmony_ci h->slice_ctx = av_calloc(h->nb_slice_ctx, sizeof(*h->slice_ctx)); 310cabdff1aSopenharmony_ci if (!h->slice_ctx) { 311cabdff1aSopenharmony_ci h->nb_slice_ctx = 0; 312cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 313cabdff1aSopenharmony_ci } 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) { 316cabdff1aSopenharmony_ci if ((ret = h264_init_pic(&h->DPB[i])) < 0) 317cabdff1aSopenharmony_ci return ret; 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci if ((ret = h264_init_pic(&h->cur_pic)) < 0) 321cabdff1aSopenharmony_ci return ret; 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci if ((ret = h264_init_pic(&h->last_pic_for_ec)) < 0) 324cabdff1aSopenharmony_ci return ret; 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci for (i = 0; i < h->nb_slice_ctx; i++) 327cabdff1aSopenharmony_ci h->slice_ctx[i].h264 = h; 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci return 0; 330cabdff1aSopenharmony_ci} 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_cistatic void h264_free_pic(H264Context *h, H264Picture *pic) 333cabdff1aSopenharmony_ci{ 334cabdff1aSopenharmony_ci ff_h264_unref_picture(h, pic); 335cabdff1aSopenharmony_ci av_frame_free(&pic->f); 336cabdff1aSopenharmony_ci av_frame_free(&pic->f_grain); 337cabdff1aSopenharmony_ci} 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_cistatic av_cold int h264_decode_end(AVCodecContext *avctx) 340cabdff1aSopenharmony_ci{ 341cabdff1aSopenharmony_ci H264Context *h = avctx->priv_data; 342cabdff1aSopenharmony_ci int i; 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci ff_h264_remove_all_refs(h); 345cabdff1aSopenharmony_ci ff_h264_free_tables(h); 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) { 348cabdff1aSopenharmony_ci h264_free_pic(h, &h->DPB[i]); 349cabdff1aSopenharmony_ci } 350cabdff1aSopenharmony_ci memset(h->delayed_pic, 0, sizeof(h->delayed_pic)); 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci h->cur_pic_ptr = NULL; 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci av_freep(&h->slice_ctx); 355cabdff1aSopenharmony_ci h->nb_slice_ctx = 0; 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci ff_h264_sei_uninit(&h->sei); 358cabdff1aSopenharmony_ci ff_h264_ps_uninit(&h->ps); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci ff_h2645_packet_uninit(&h->pkt); 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_ci h264_free_pic(h, &h->cur_pic); 363cabdff1aSopenharmony_ci h264_free_pic(h, &h->last_pic_for_ec); 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_ci return 0; 366cabdff1aSopenharmony_ci} 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_cistatic AVOnce h264_vlc_init = AV_ONCE_INIT; 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_cistatic av_cold int h264_decode_init(AVCodecContext *avctx) 371cabdff1aSopenharmony_ci{ 372cabdff1aSopenharmony_ci H264Context *h = avctx->priv_data; 373cabdff1aSopenharmony_ci int ret; 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_ci ret = h264_init_context(avctx, h); 376cabdff1aSopenharmony_ci if (ret < 0) 377cabdff1aSopenharmony_ci return ret; 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci ret = ff_thread_once(&h264_vlc_init, ff_h264_decode_init_vlc); 380cabdff1aSopenharmony_ci if (ret != 0) { 381cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "pthread_once has failed."); 382cabdff1aSopenharmony_ci return AVERROR_UNKNOWN; 383cabdff1aSopenharmony_ci } 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci if (avctx->ticks_per_frame == 1) { 386cabdff1aSopenharmony_ci if(h->avctx->time_base.den < INT_MAX/2) { 387cabdff1aSopenharmony_ci h->avctx->time_base.den *= 2; 388cabdff1aSopenharmony_ci } else 389cabdff1aSopenharmony_ci h->avctx->time_base.num /= 2; 390cabdff1aSopenharmony_ci } 391cabdff1aSopenharmony_ci avctx->ticks_per_frame = 2; 392cabdff1aSopenharmony_ci 393cabdff1aSopenharmony_ci if (!avctx->internal->is_copy) { 394cabdff1aSopenharmony_ci if (avctx->extradata_size > 0 && avctx->extradata) { 395cabdff1aSopenharmony_ci ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, 396cabdff1aSopenharmony_ci &h->ps, &h->is_avc, &h->nal_length_size, 397cabdff1aSopenharmony_ci avctx->err_recognition, avctx); 398cabdff1aSopenharmony_ci if (ret < 0) { 399cabdff1aSopenharmony_ci int explode = avctx->err_recognition & AV_EF_EXPLODE; 400cabdff1aSopenharmony_ci av_log(avctx, explode ? AV_LOG_ERROR: AV_LOG_WARNING, 401cabdff1aSopenharmony_ci "Error decoding the extradata\n"); 402cabdff1aSopenharmony_ci if (explode) { 403cabdff1aSopenharmony_ci return ret; 404cabdff1aSopenharmony_ci } 405cabdff1aSopenharmony_ci ret = 0; 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci } 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci if (h->ps.sps && h->ps.sps->bitstream_restriction_flag && 411cabdff1aSopenharmony_ci h->avctx->has_b_frames < h->ps.sps->num_reorder_frames) { 412cabdff1aSopenharmony_ci h->avctx->has_b_frames = h->ps.sps->num_reorder_frames; 413cabdff1aSopenharmony_ci } 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci ff_h264_flush_change(h); 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci if (h->enable_er < 0 && (avctx->active_thread_type & FF_THREAD_SLICE)) 418cabdff1aSopenharmony_ci h->enable_er = 0; 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci if (h->enable_er && (avctx->active_thread_type & FF_THREAD_SLICE)) { 421cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, 422cabdff1aSopenharmony_ci "Error resilience with slice threads is enabled. It is unsafe and unsupported and may crash. " 423cabdff1aSopenharmony_ci "Use it at your own risk\n"); 424cabdff1aSopenharmony_ci } 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_ci return 0; 427cabdff1aSopenharmony_ci} 428cabdff1aSopenharmony_ci 429cabdff1aSopenharmony_ci/** 430cabdff1aSopenharmony_ci * instantaneous decoder refresh. 431cabdff1aSopenharmony_ci */ 432cabdff1aSopenharmony_cistatic void idr(H264Context *h) 433cabdff1aSopenharmony_ci{ 434cabdff1aSopenharmony_ci int i; 435cabdff1aSopenharmony_ci ff_h264_remove_all_refs(h); 436cabdff1aSopenharmony_ci h->poc.prev_frame_num = 437cabdff1aSopenharmony_ci h->poc.prev_frame_num_offset = 0; 438cabdff1aSopenharmony_ci h->poc.prev_poc_msb = 1<<16; 439cabdff1aSopenharmony_ci h->poc.prev_poc_lsb = -1; 440cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++) 441cabdff1aSopenharmony_ci h->last_pocs[i] = INT_MIN; 442cabdff1aSopenharmony_ci} 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci/* forget old pics after a seek */ 445cabdff1aSopenharmony_civoid ff_h264_flush_change(H264Context *h) 446cabdff1aSopenharmony_ci{ 447cabdff1aSopenharmony_ci int i, j; 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci h->next_outputed_poc = INT_MIN; 450cabdff1aSopenharmony_ci h->prev_interlaced_frame = 1; 451cabdff1aSopenharmony_ci idr(h); 452cabdff1aSopenharmony_ci 453cabdff1aSopenharmony_ci h->poc.prev_frame_num = -1; 454cabdff1aSopenharmony_ci if (h->cur_pic_ptr) { 455cabdff1aSopenharmony_ci h->cur_pic_ptr->reference = 0; 456cabdff1aSopenharmony_ci for (j=i=0; h->delayed_pic[i]; i++) 457cabdff1aSopenharmony_ci if (h->delayed_pic[i] != h->cur_pic_ptr) 458cabdff1aSopenharmony_ci h->delayed_pic[j++] = h->delayed_pic[i]; 459cabdff1aSopenharmony_ci h->delayed_pic[j] = NULL; 460cabdff1aSopenharmony_ci } 461cabdff1aSopenharmony_ci ff_h264_unref_picture(h, &h->last_pic_for_ec); 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci h->first_field = 0; 464cabdff1aSopenharmony_ci h->recovery_frame = -1; 465cabdff1aSopenharmony_ci h->frame_recovered = 0; 466cabdff1aSopenharmony_ci h->current_slice = 0; 467cabdff1aSopenharmony_ci h->mmco_reset = 1; 468cabdff1aSopenharmony_ci} 469cabdff1aSopenharmony_ci 470cabdff1aSopenharmony_cistatic void h264_decode_flush(AVCodecContext *avctx) 471cabdff1aSopenharmony_ci{ 472cabdff1aSopenharmony_ci H264Context *h = avctx->priv_data; 473cabdff1aSopenharmony_ci int i; 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci memset(h->delayed_pic, 0, sizeof(h->delayed_pic)); 476cabdff1aSopenharmony_ci 477cabdff1aSopenharmony_ci ff_h264_flush_change(h); 478cabdff1aSopenharmony_ci ff_h264_sei_uninit(&h->sei); 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) 481cabdff1aSopenharmony_ci ff_h264_unref_picture(h, &h->DPB[i]); 482cabdff1aSopenharmony_ci h->cur_pic_ptr = NULL; 483cabdff1aSopenharmony_ci ff_h264_unref_picture(h, &h->cur_pic); 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_ci h->mb_y = 0; 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ci ff_h264_free_tables(h); 488cabdff1aSopenharmony_ci h->context_initialized = 0; 489cabdff1aSopenharmony_ci} 490cabdff1aSopenharmony_ci 491cabdff1aSopenharmony_cistatic int get_last_needed_nal(H264Context *h) 492cabdff1aSopenharmony_ci{ 493cabdff1aSopenharmony_ci int nals_needed = 0; 494cabdff1aSopenharmony_ci int slice_type = 0; 495cabdff1aSopenharmony_ci int picture_intra_only = 1; 496cabdff1aSopenharmony_ci int first_slice = 0; 497cabdff1aSopenharmony_ci int i, ret; 498cabdff1aSopenharmony_ci 499cabdff1aSopenharmony_ci for (i = 0; i < h->pkt.nb_nals; i++) { 500cabdff1aSopenharmony_ci H2645NAL *nal = &h->pkt.nals[i]; 501cabdff1aSopenharmony_ci GetBitContext gb; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci /* packets can sometimes contain multiple PPS/SPS, 504cabdff1aSopenharmony_ci * e.g. two PAFF field pictures in one packet, or a demuxer 505cabdff1aSopenharmony_ci * which splits NALs strangely if so, when frame threading we 506cabdff1aSopenharmony_ci * can't start the next thread until we've read all of them */ 507cabdff1aSopenharmony_ci switch (nal->type) { 508cabdff1aSopenharmony_ci case H264_NAL_SPS: 509cabdff1aSopenharmony_ci case H264_NAL_PPS: 510cabdff1aSopenharmony_ci nals_needed = i; 511cabdff1aSopenharmony_ci break; 512cabdff1aSopenharmony_ci case H264_NAL_DPA: 513cabdff1aSopenharmony_ci case H264_NAL_IDR_SLICE: 514cabdff1aSopenharmony_ci case H264_NAL_SLICE: 515cabdff1aSopenharmony_ci ret = init_get_bits8(&gb, nal->data + 1, nal->size - 1); 516cabdff1aSopenharmony_ci if (ret < 0) { 517cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "Invalid zero-sized VCL NAL unit\n"); 518cabdff1aSopenharmony_ci if (h->avctx->err_recognition & AV_EF_EXPLODE) 519cabdff1aSopenharmony_ci return ret; 520cabdff1aSopenharmony_ci 521cabdff1aSopenharmony_ci break; 522cabdff1aSopenharmony_ci } 523cabdff1aSopenharmony_ci if (!get_ue_golomb_long(&gb) || // first_mb_in_slice 524cabdff1aSopenharmony_ci !first_slice || 525cabdff1aSopenharmony_ci first_slice != nal->type) 526cabdff1aSopenharmony_ci nals_needed = i; 527cabdff1aSopenharmony_ci slice_type = get_ue_golomb_31(&gb); 528cabdff1aSopenharmony_ci if (slice_type > 9) 529cabdff1aSopenharmony_ci slice_type = 0; 530cabdff1aSopenharmony_ci if (slice_type > 4) 531cabdff1aSopenharmony_ci slice_type -= 5; 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_ci slice_type = ff_h264_golomb_to_pict_type[slice_type]; 534cabdff1aSopenharmony_ci picture_intra_only &= (slice_type & 3) == AV_PICTURE_TYPE_I; 535cabdff1aSopenharmony_ci if (!first_slice) 536cabdff1aSopenharmony_ci first_slice = nal->type; 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci } 539cabdff1aSopenharmony_ci 540cabdff1aSopenharmony_ci h->picture_intra_only = picture_intra_only; 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci return nals_needed; 543cabdff1aSopenharmony_ci} 544cabdff1aSopenharmony_ci 545cabdff1aSopenharmony_cistatic void debug_green_metadata(const H264SEIGreenMetaData *gm, void *logctx) 546cabdff1aSopenharmony_ci{ 547cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, "Green Metadata Info SEI message\n"); 548cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " green_metadata_type: %d\n", gm->green_metadata_type); 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci if (gm->green_metadata_type == 0) { 551cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " green_metadata_period_type: %d\n", gm->period_type); 552cabdff1aSopenharmony_ci 553cabdff1aSopenharmony_ci if (gm->period_type == 2) 554cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " green_metadata_num_seconds: %d\n", gm->num_seconds); 555cabdff1aSopenharmony_ci else if (gm->period_type == 3) 556cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " green_metadata_num_pictures: %d\n", gm->num_pictures); 557cabdff1aSopenharmony_ci 558cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " SEI GREEN Complexity Metrics: %f %f %f %f\n", 559cabdff1aSopenharmony_ci (float)gm->percent_non_zero_macroblocks/255, 560cabdff1aSopenharmony_ci (float)gm->percent_intra_coded_macroblocks/255, 561cabdff1aSopenharmony_ci (float)gm->percent_six_tap_filtering/255, 562cabdff1aSopenharmony_ci (float)gm->percent_alpha_point_deblocking_instance/255); 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci } else if (gm->green_metadata_type == 1) { 565cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " xsd_metric_type: %d\n", gm->xsd_metric_type); 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci if (gm->xsd_metric_type == 0) 568cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_DEBUG, " xsd_metric_value: %f\n", 569cabdff1aSopenharmony_ci (float)gm->xsd_metric_value/100); 570cabdff1aSopenharmony_ci } 571cabdff1aSopenharmony_ci} 572cabdff1aSopenharmony_ci 573cabdff1aSopenharmony_cistatic int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size) 574cabdff1aSopenharmony_ci{ 575cabdff1aSopenharmony_ci AVCodecContext *const avctx = h->avctx; 576cabdff1aSopenharmony_ci int nals_needed = 0; ///< number of NALs that need decoding before the next frame thread starts 577cabdff1aSopenharmony_ci int idr_cleared=0; 578cabdff1aSopenharmony_ci int i, ret = 0; 579cabdff1aSopenharmony_ci 580cabdff1aSopenharmony_ci h->has_slice = 0; 581cabdff1aSopenharmony_ci h->nal_unit_type= 0; 582cabdff1aSopenharmony_ci 583cabdff1aSopenharmony_ci if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS)) { 584cabdff1aSopenharmony_ci h->current_slice = 0; 585cabdff1aSopenharmony_ci if (!h->first_field) { 586cabdff1aSopenharmony_ci h->cur_pic_ptr = NULL; 587cabdff1aSopenharmony_ci ff_h264_sei_uninit(&h->sei); 588cabdff1aSopenharmony_ci } 589cabdff1aSopenharmony_ci } 590cabdff1aSopenharmony_ci 591cabdff1aSopenharmony_ci if (h->nal_length_size == 4) { 592cabdff1aSopenharmony_ci if (buf_size > 8 && AV_RB32(buf) == 1 && AV_RB32(buf+5) > (unsigned)buf_size) { 593cabdff1aSopenharmony_ci h->is_avc = 0; 594cabdff1aSopenharmony_ci }else if(buf_size > 3 && AV_RB32(buf) > 1 && AV_RB32(buf) <= (unsigned)buf_size) 595cabdff1aSopenharmony_ci h->is_avc = 1; 596cabdff1aSopenharmony_ci } 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci ret = ff_h2645_packet_split(&h->pkt, buf, buf_size, avctx, h->is_avc, h->nal_length_size, 599cabdff1aSopenharmony_ci avctx->codec_id, 0, 0); 600cabdff1aSopenharmony_ci if (ret < 0) { 601cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 602cabdff1aSopenharmony_ci "Error splitting the input into NAL units.\n"); 603cabdff1aSopenharmony_ci return ret; 604cabdff1aSopenharmony_ci } 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_ci if (avctx->active_thread_type & FF_THREAD_FRAME) 607cabdff1aSopenharmony_ci nals_needed = get_last_needed_nal(h); 608cabdff1aSopenharmony_ci if (nals_needed < 0) 609cabdff1aSopenharmony_ci return nals_needed; 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci for (i = 0; i < h->pkt.nb_nals; i++) { 612cabdff1aSopenharmony_ci H2645NAL *nal = &h->pkt.nals[i]; 613cabdff1aSopenharmony_ci int max_slice_ctx, err; 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_ci if (avctx->skip_frame >= AVDISCARD_NONREF && 616cabdff1aSopenharmony_ci nal->ref_idc == 0 && nal->type != H264_NAL_SEI) 617cabdff1aSopenharmony_ci continue; 618cabdff1aSopenharmony_ci 619cabdff1aSopenharmony_ci // FIXME these should stop being context-global variables 620cabdff1aSopenharmony_ci h->nal_ref_idc = nal->ref_idc; 621cabdff1aSopenharmony_ci h->nal_unit_type = nal->type; 622cabdff1aSopenharmony_ci 623cabdff1aSopenharmony_ci err = 0; 624cabdff1aSopenharmony_ci switch (nal->type) { 625cabdff1aSopenharmony_ci case H264_NAL_IDR_SLICE: 626cabdff1aSopenharmony_ci if ((nal->data[1] & 0xFC) == 0x98) { 627cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "Invalid inter IDR frame\n"); 628cabdff1aSopenharmony_ci h->next_outputed_poc = INT_MIN; 629cabdff1aSopenharmony_ci ret = -1; 630cabdff1aSopenharmony_ci goto end; 631cabdff1aSopenharmony_ci } 632cabdff1aSopenharmony_ci if(!idr_cleared) { 633cabdff1aSopenharmony_ci idr(h); // FIXME ensure we don't lose some frames if there is reordering 634cabdff1aSopenharmony_ci } 635cabdff1aSopenharmony_ci idr_cleared = 1; 636cabdff1aSopenharmony_ci h->has_recovery_point = 1; 637cabdff1aSopenharmony_ci case H264_NAL_SLICE: 638cabdff1aSopenharmony_ci h->has_slice = 1; 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_ci if ((err = ff_h264_queue_decode_slice(h, nal))) { 641cabdff1aSopenharmony_ci H264SliceContext *sl = h->slice_ctx + h->nb_slice_ctx_queued; 642cabdff1aSopenharmony_ci sl->ref_count[0] = sl->ref_count[1] = 0; 643cabdff1aSopenharmony_ci break; 644cabdff1aSopenharmony_ci } 645cabdff1aSopenharmony_ci 646cabdff1aSopenharmony_ci if (h->current_slice == 1) { 647cabdff1aSopenharmony_ci if (avctx->active_thread_type & FF_THREAD_FRAME && 648cabdff1aSopenharmony_ci i >= nals_needed && !h->setup_finished && h->cur_pic_ptr) { 649cabdff1aSopenharmony_ci ff_thread_finish_setup(avctx); 650cabdff1aSopenharmony_ci h->setup_finished = 1; 651cabdff1aSopenharmony_ci } 652cabdff1aSopenharmony_ci 653cabdff1aSopenharmony_ci if (h->avctx->hwaccel && 654cabdff1aSopenharmony_ci (ret = h->avctx->hwaccel->start_frame(h->avctx, buf, buf_size)) < 0) 655cabdff1aSopenharmony_ci goto end; 656cabdff1aSopenharmony_ci } 657cabdff1aSopenharmony_ci 658cabdff1aSopenharmony_ci max_slice_ctx = avctx->hwaccel ? 1 : h->nb_slice_ctx; 659cabdff1aSopenharmony_ci if (h->nb_slice_ctx_queued == max_slice_ctx) { 660cabdff1aSopenharmony_ci if (h->avctx->hwaccel) { 661cabdff1aSopenharmony_ci ret = avctx->hwaccel->decode_slice(avctx, nal->raw_data, nal->raw_size); 662cabdff1aSopenharmony_ci h->nb_slice_ctx_queued = 0; 663cabdff1aSopenharmony_ci } else 664cabdff1aSopenharmony_ci ret = ff_h264_execute_decode_slices(h); 665cabdff1aSopenharmony_ci if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE)) 666cabdff1aSopenharmony_ci goto end; 667cabdff1aSopenharmony_ci } 668cabdff1aSopenharmony_ci break; 669cabdff1aSopenharmony_ci case H264_NAL_DPA: 670cabdff1aSopenharmony_ci case H264_NAL_DPB: 671cabdff1aSopenharmony_ci case H264_NAL_DPC: 672cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "data partitioning"); 673cabdff1aSopenharmony_ci break; 674cabdff1aSopenharmony_ci case H264_NAL_SEI: 675cabdff1aSopenharmony_ci if (h->setup_finished) { 676cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Late SEI"); 677cabdff1aSopenharmony_ci break; 678cabdff1aSopenharmony_ci } 679cabdff1aSopenharmony_ci ret = ff_h264_sei_decode(&h->sei, &nal->gb, &h->ps, avctx); 680cabdff1aSopenharmony_ci h->has_recovery_point = h->has_recovery_point || h->sei.recovery_point.recovery_frame_cnt != -1; 681cabdff1aSopenharmony_ci if (avctx->debug & FF_DEBUG_GREEN_MD) 682cabdff1aSopenharmony_ci debug_green_metadata(&h->sei.green_metadata, h->avctx); 683cabdff1aSopenharmony_ci if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE)) 684cabdff1aSopenharmony_ci goto end; 685cabdff1aSopenharmony_ci break; 686cabdff1aSopenharmony_ci case H264_NAL_SPS: { 687cabdff1aSopenharmony_ci GetBitContext tmp_gb = nal->gb; 688cabdff1aSopenharmony_ci if (avctx->hwaccel && avctx->hwaccel->decode_params) { 689cabdff1aSopenharmony_ci ret = avctx->hwaccel->decode_params(avctx, 690cabdff1aSopenharmony_ci nal->type, 691cabdff1aSopenharmony_ci nal->raw_data, 692cabdff1aSopenharmony_ci nal->raw_size); 693cabdff1aSopenharmony_ci if (ret < 0) 694cabdff1aSopenharmony_ci goto end; 695cabdff1aSopenharmony_ci } 696cabdff1aSopenharmony_ci if (ff_h264_decode_seq_parameter_set(&tmp_gb, avctx, &h->ps, 0) >= 0) 697cabdff1aSopenharmony_ci break; 698cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_DEBUG, 699cabdff1aSopenharmony_ci "SPS decoding failure, trying again with the complete NAL\n"); 700cabdff1aSopenharmony_ci init_get_bits8(&tmp_gb, nal->raw_data + 1, nal->raw_size - 1); 701cabdff1aSopenharmony_ci if (ff_h264_decode_seq_parameter_set(&tmp_gb, avctx, &h->ps, 0) >= 0) 702cabdff1aSopenharmony_ci break; 703cabdff1aSopenharmony_ci ff_h264_decode_seq_parameter_set(&nal->gb, avctx, &h->ps, 1); 704cabdff1aSopenharmony_ci break; 705cabdff1aSopenharmony_ci } 706cabdff1aSopenharmony_ci case H264_NAL_PPS: 707cabdff1aSopenharmony_ci if (avctx->hwaccel && avctx->hwaccel->decode_params) { 708cabdff1aSopenharmony_ci ret = avctx->hwaccel->decode_params(avctx, 709cabdff1aSopenharmony_ci nal->type, 710cabdff1aSopenharmony_ci nal->raw_data, 711cabdff1aSopenharmony_ci nal->raw_size); 712cabdff1aSopenharmony_ci if (ret < 0) 713cabdff1aSopenharmony_ci goto end; 714cabdff1aSopenharmony_ci } 715cabdff1aSopenharmony_ci ret = ff_h264_decode_picture_parameter_set(&nal->gb, avctx, &h->ps, 716cabdff1aSopenharmony_ci nal->size_bits); 717cabdff1aSopenharmony_ci if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE)) 718cabdff1aSopenharmony_ci goto end; 719cabdff1aSopenharmony_ci break; 720cabdff1aSopenharmony_ci case H264_NAL_AUD: 721cabdff1aSopenharmony_ci case H264_NAL_END_SEQUENCE: 722cabdff1aSopenharmony_ci case H264_NAL_END_STREAM: 723cabdff1aSopenharmony_ci case H264_NAL_FILLER_DATA: 724cabdff1aSopenharmony_ci case H264_NAL_SPS_EXT: 725cabdff1aSopenharmony_ci case H264_NAL_AUXILIARY_SLICE: 726cabdff1aSopenharmony_ci break; 727cabdff1aSopenharmony_ci default: 728cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n", 729cabdff1aSopenharmony_ci nal->type, nal->size_bits); 730cabdff1aSopenharmony_ci } 731cabdff1aSopenharmony_ci 732cabdff1aSopenharmony_ci if (err < 0) { 733cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "decode_slice_header error\n"); 734cabdff1aSopenharmony_ci } 735cabdff1aSopenharmony_ci } 736cabdff1aSopenharmony_ci 737cabdff1aSopenharmony_ci ret = ff_h264_execute_decode_slices(h); 738cabdff1aSopenharmony_ci if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE)) 739cabdff1aSopenharmony_ci goto end; 740cabdff1aSopenharmony_ci 741cabdff1aSopenharmony_ci // set decode_error_flags to allow users to detect concealed decoding errors 742cabdff1aSopenharmony_ci if ((ret < 0 || h->er.error_occurred) && h->cur_pic_ptr) { 743cabdff1aSopenharmony_ci h->cur_pic_ptr->f->decode_error_flags |= FF_DECODE_ERROR_DECODE_SLICES; 744cabdff1aSopenharmony_ci } 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_ci ret = 0; 747cabdff1aSopenharmony_ciend: 748cabdff1aSopenharmony_ci 749cabdff1aSopenharmony_ci#if CONFIG_ERROR_RESILIENCE 750cabdff1aSopenharmony_ci /* 751cabdff1aSopenharmony_ci * FIXME: Error handling code does not seem to support interlaced 752cabdff1aSopenharmony_ci * when slices span multiple rows 753cabdff1aSopenharmony_ci * The ff_er_add_slice calls don't work right for bottom 754cabdff1aSopenharmony_ci * fields; they cause massive erroneous error concealing 755cabdff1aSopenharmony_ci * Error marking covers both fields (top and bottom). 756cabdff1aSopenharmony_ci * This causes a mismatched s->error_count 757cabdff1aSopenharmony_ci * and a bad error table. Further, the error count goes to 758cabdff1aSopenharmony_ci * INT_MAX when called for bottom field, because mb_y is 759cabdff1aSopenharmony_ci * past end by one (callers fault) and resync_mb_y != 0 760cabdff1aSopenharmony_ci * causes problems for the first MB line, too. 761cabdff1aSopenharmony_ci */ 762cabdff1aSopenharmony_ci if (!FIELD_PICTURE(h) && h->current_slice && h->enable_er) { 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci H264SliceContext *sl = h->slice_ctx; 765cabdff1aSopenharmony_ci int use_last_pic = h->last_pic_for_ec.f->buf[0] && !sl->ref_count[0]; 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ci ff_h264_set_erpic(&h->er.cur_pic, h->cur_pic_ptr); 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_ci if (use_last_pic) { 770cabdff1aSopenharmony_ci ff_h264_set_erpic(&h->er.last_pic, &h->last_pic_for_ec); 771cabdff1aSopenharmony_ci sl->ref_list[0][0].parent = &h->last_pic_for_ec; 772cabdff1aSopenharmony_ci memcpy(sl->ref_list[0][0].data, h->last_pic_for_ec.f->data, sizeof(sl->ref_list[0][0].data)); 773cabdff1aSopenharmony_ci memcpy(sl->ref_list[0][0].linesize, h->last_pic_for_ec.f->linesize, sizeof(sl->ref_list[0][0].linesize)); 774cabdff1aSopenharmony_ci sl->ref_list[0][0].reference = h->last_pic_for_ec.reference; 775cabdff1aSopenharmony_ci } else if (sl->ref_count[0]) { 776cabdff1aSopenharmony_ci ff_h264_set_erpic(&h->er.last_pic, sl->ref_list[0][0].parent); 777cabdff1aSopenharmony_ci } else 778cabdff1aSopenharmony_ci ff_h264_set_erpic(&h->er.last_pic, NULL); 779cabdff1aSopenharmony_ci 780cabdff1aSopenharmony_ci if (sl->ref_count[1]) 781cabdff1aSopenharmony_ci ff_h264_set_erpic(&h->er.next_pic, sl->ref_list[1][0].parent); 782cabdff1aSopenharmony_ci 783cabdff1aSopenharmony_ci ff_er_frame_end(&h->er); 784cabdff1aSopenharmony_ci if (use_last_pic) 785cabdff1aSopenharmony_ci memset(&sl->ref_list[0][0], 0, sizeof(sl->ref_list[0][0])); 786cabdff1aSopenharmony_ci } 787cabdff1aSopenharmony_ci#endif /* CONFIG_ERROR_RESILIENCE */ 788cabdff1aSopenharmony_ci /* clean up */ 789cabdff1aSopenharmony_ci if (h->cur_pic_ptr && !h->droppable && h->has_slice) { 790cabdff1aSopenharmony_ci ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 791cabdff1aSopenharmony_ci h->picture_structure == PICT_BOTTOM_FIELD); 792cabdff1aSopenharmony_ci } 793cabdff1aSopenharmony_ci 794cabdff1aSopenharmony_ci return (ret < 0) ? ret : buf_size; 795cabdff1aSopenharmony_ci} 796cabdff1aSopenharmony_ci 797cabdff1aSopenharmony_ci/** 798cabdff1aSopenharmony_ci * Return the number of bytes consumed for building the current frame. 799cabdff1aSopenharmony_ci */ 800cabdff1aSopenharmony_cistatic int get_consumed_bytes(int pos, int buf_size) 801cabdff1aSopenharmony_ci{ 802cabdff1aSopenharmony_ci if (pos == 0) 803cabdff1aSopenharmony_ci pos = 1; // avoid infinite loops (I doubt that is needed but...) 804cabdff1aSopenharmony_ci if (pos + 10 > buf_size) 805cabdff1aSopenharmony_ci pos = buf_size; // oops ;) 806cabdff1aSopenharmony_ci 807cabdff1aSopenharmony_ci return pos; 808cabdff1aSopenharmony_ci} 809cabdff1aSopenharmony_ci 810cabdff1aSopenharmony_cistatic int h264_export_enc_params(AVFrame *f, H264Picture *p) 811cabdff1aSopenharmony_ci{ 812cabdff1aSopenharmony_ci AVVideoEncParams *par; 813cabdff1aSopenharmony_ci unsigned int nb_mb = p->mb_height * p->mb_width; 814cabdff1aSopenharmony_ci unsigned int x, y; 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_ci par = av_video_enc_params_create_side_data(f, AV_VIDEO_ENC_PARAMS_H264, nb_mb); 817cabdff1aSopenharmony_ci if (!par) 818cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 819cabdff1aSopenharmony_ci 820cabdff1aSopenharmony_ci par->qp = p->pps->init_qp; 821cabdff1aSopenharmony_ci 822cabdff1aSopenharmony_ci par->delta_qp[1][0] = p->pps->chroma_qp_index_offset[0]; 823cabdff1aSopenharmony_ci par->delta_qp[1][1] = p->pps->chroma_qp_index_offset[0]; 824cabdff1aSopenharmony_ci par->delta_qp[2][0] = p->pps->chroma_qp_index_offset[1]; 825cabdff1aSopenharmony_ci par->delta_qp[2][1] = p->pps->chroma_qp_index_offset[1]; 826cabdff1aSopenharmony_ci 827cabdff1aSopenharmony_ci for (y = 0; y < p->mb_height; y++) 828cabdff1aSopenharmony_ci for (x = 0; x < p->mb_width; x++) { 829cabdff1aSopenharmony_ci const unsigned int block_idx = y * p->mb_width + x; 830cabdff1aSopenharmony_ci const unsigned int mb_xy = y * p->mb_stride + x; 831cabdff1aSopenharmony_ci AVVideoBlockParams *b = av_video_enc_params_block(par, block_idx); 832cabdff1aSopenharmony_ci 833cabdff1aSopenharmony_ci b->src_x = x * 16; 834cabdff1aSopenharmony_ci b->src_y = y * 16; 835cabdff1aSopenharmony_ci b->w = 16; 836cabdff1aSopenharmony_ci b->h = 16; 837cabdff1aSopenharmony_ci 838cabdff1aSopenharmony_ci b->delta_qp = p->qscale_table[mb_xy] - par->qp; 839cabdff1aSopenharmony_ci } 840cabdff1aSopenharmony_ci 841cabdff1aSopenharmony_ci return 0; 842cabdff1aSopenharmony_ci} 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_cistatic int output_frame(H264Context *h, AVFrame *dst, H264Picture *srcp) 845cabdff1aSopenharmony_ci{ 846cabdff1aSopenharmony_ci int ret; 847cabdff1aSopenharmony_ci 848cabdff1aSopenharmony_ci ret = av_frame_ref(dst, srcp->needs_fg ? srcp->f_grain : srcp->f); 849cabdff1aSopenharmony_ci if (ret < 0) 850cabdff1aSopenharmony_ci return ret; 851cabdff1aSopenharmony_ci 852cabdff1aSopenharmony_ci if (srcp->needs_fg && (ret = av_frame_copy_props(dst, srcp->f)) < 0) 853cabdff1aSopenharmony_ci return ret; 854cabdff1aSopenharmony_ci 855cabdff1aSopenharmony_ci av_dict_set(&dst->metadata, "stereo_mode", ff_h264_sei_stereo_mode(&h->sei.frame_packing), 0); 856cabdff1aSopenharmony_ci 857cabdff1aSopenharmony_ci if (srcp->sei_recovery_frame_cnt == 0) 858cabdff1aSopenharmony_ci dst->key_frame = 1; 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_ci if (h->avctx->export_side_data & AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS) { 861cabdff1aSopenharmony_ci ret = h264_export_enc_params(dst, srcp); 862cabdff1aSopenharmony_ci if (ret < 0) 863cabdff1aSopenharmony_ci goto fail; 864cabdff1aSopenharmony_ci } 865cabdff1aSopenharmony_ci 866cabdff1aSopenharmony_ci if (!(h->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN)) 867cabdff1aSopenharmony_ci av_frame_remove_side_data(dst, AV_FRAME_DATA_FILM_GRAIN_PARAMS); 868cabdff1aSopenharmony_ci 869cabdff1aSopenharmony_ci return 0; 870cabdff1aSopenharmony_cifail: 871cabdff1aSopenharmony_ci av_frame_unref(dst); 872cabdff1aSopenharmony_ci return ret; 873cabdff1aSopenharmony_ci} 874cabdff1aSopenharmony_ci 875cabdff1aSopenharmony_cistatic int is_avcc_extradata(const uint8_t *buf, int buf_size) 876cabdff1aSopenharmony_ci{ 877cabdff1aSopenharmony_ci int cnt= buf[5]&0x1f; 878cabdff1aSopenharmony_ci const uint8_t *p= buf+6; 879cabdff1aSopenharmony_ci if (!cnt) 880cabdff1aSopenharmony_ci return 0; 881cabdff1aSopenharmony_ci while(cnt--){ 882cabdff1aSopenharmony_ci int nalsize= AV_RB16(p) + 2; 883cabdff1aSopenharmony_ci if(nalsize > buf_size - (p-buf) || (p[2] & 0x9F) != 7) 884cabdff1aSopenharmony_ci return 0; 885cabdff1aSopenharmony_ci p += nalsize; 886cabdff1aSopenharmony_ci } 887cabdff1aSopenharmony_ci cnt = *(p++); 888cabdff1aSopenharmony_ci if(!cnt) 889cabdff1aSopenharmony_ci return 0; 890cabdff1aSopenharmony_ci while(cnt--){ 891cabdff1aSopenharmony_ci int nalsize= AV_RB16(p) + 2; 892cabdff1aSopenharmony_ci if(nalsize > buf_size - (p-buf) || (p[2] & 0x9F) != 8) 893cabdff1aSopenharmony_ci return 0; 894cabdff1aSopenharmony_ci p += nalsize; 895cabdff1aSopenharmony_ci } 896cabdff1aSopenharmony_ci return 1; 897cabdff1aSopenharmony_ci} 898cabdff1aSopenharmony_ci 899cabdff1aSopenharmony_cistatic int finalize_frame(H264Context *h, AVFrame *dst, H264Picture *out, int *got_frame) 900cabdff1aSopenharmony_ci{ 901cabdff1aSopenharmony_ci int ret; 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_ci if (((h->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) || 904cabdff1aSopenharmony_ci (h->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL) || 905cabdff1aSopenharmony_ci out->recovered)) { 906cabdff1aSopenharmony_ci 907cabdff1aSopenharmony_ci if (!h->avctx->hwaccel && 908cabdff1aSopenharmony_ci (out->field_poc[0] == INT_MAX || 909cabdff1aSopenharmony_ci out->field_poc[1] == INT_MAX) 910cabdff1aSopenharmony_ci ) { 911cabdff1aSopenharmony_ci int p; 912cabdff1aSopenharmony_ci AVFrame *f = out->f; 913cabdff1aSopenharmony_ci int field = out->field_poc[0] == INT_MAX; 914cabdff1aSopenharmony_ci uint8_t *dst_data[4]; 915cabdff1aSopenharmony_ci int linesizes[4]; 916cabdff1aSopenharmony_ci const uint8_t *src_data[4]; 917cabdff1aSopenharmony_ci 918cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_DEBUG, "Duplicating field %d to fill missing\n", field); 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_ci for (p = 0; p<4; p++) { 921cabdff1aSopenharmony_ci dst_data[p] = f->data[p] + (field^1)*f->linesize[p]; 922cabdff1aSopenharmony_ci src_data[p] = f->data[p] + field *f->linesize[p]; 923cabdff1aSopenharmony_ci linesizes[p] = 2*f->linesize[p]; 924cabdff1aSopenharmony_ci } 925cabdff1aSopenharmony_ci 926cabdff1aSopenharmony_ci av_image_copy(dst_data, linesizes, src_data, linesizes, 927cabdff1aSopenharmony_ci f->format, f->width, f->height>>1); 928cabdff1aSopenharmony_ci } 929cabdff1aSopenharmony_ci 930cabdff1aSopenharmony_ci ret = output_frame(h, dst, out); 931cabdff1aSopenharmony_ci if (ret < 0) 932cabdff1aSopenharmony_ci return ret; 933cabdff1aSopenharmony_ci 934cabdff1aSopenharmony_ci *got_frame = 1; 935cabdff1aSopenharmony_ci 936cabdff1aSopenharmony_ci if (CONFIG_MPEGVIDEODEC) { 937cabdff1aSopenharmony_ci ff_print_debug_info2(h->avctx, dst, NULL, 938cabdff1aSopenharmony_ci out->mb_type, 939cabdff1aSopenharmony_ci out->qscale_table, 940cabdff1aSopenharmony_ci out->motion_val, 941cabdff1aSopenharmony_ci out->mb_width, out->mb_height, out->mb_stride, 1); 942cabdff1aSopenharmony_ci } 943cabdff1aSopenharmony_ci } 944cabdff1aSopenharmony_ci 945cabdff1aSopenharmony_ci return 0; 946cabdff1aSopenharmony_ci} 947cabdff1aSopenharmony_ci 948cabdff1aSopenharmony_cistatic int send_next_delayed_frame(H264Context *h, AVFrame *dst_frame, 949cabdff1aSopenharmony_ci int *got_frame, int buf_index) 950cabdff1aSopenharmony_ci{ 951cabdff1aSopenharmony_ci int ret, i, out_idx; 952cabdff1aSopenharmony_ci H264Picture *out = h->delayed_pic[0]; 953cabdff1aSopenharmony_ci 954cabdff1aSopenharmony_ci h->cur_pic_ptr = NULL; 955cabdff1aSopenharmony_ci h->first_field = 0; 956cabdff1aSopenharmony_ci 957cabdff1aSopenharmony_ci out_idx = 0; 958cabdff1aSopenharmony_ci for (i = 1; 959cabdff1aSopenharmony_ci h->delayed_pic[i] && 960cabdff1aSopenharmony_ci !h->delayed_pic[i]->f->key_frame && 961cabdff1aSopenharmony_ci !h->delayed_pic[i]->mmco_reset; 962cabdff1aSopenharmony_ci i++) 963cabdff1aSopenharmony_ci if (h->delayed_pic[i]->poc < out->poc) { 964cabdff1aSopenharmony_ci out = h->delayed_pic[i]; 965cabdff1aSopenharmony_ci out_idx = i; 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci 968cabdff1aSopenharmony_ci for (i = out_idx; h->delayed_pic[i]; i++) 969cabdff1aSopenharmony_ci h->delayed_pic[i] = h->delayed_pic[i + 1]; 970cabdff1aSopenharmony_ci 971cabdff1aSopenharmony_ci if (out) { 972cabdff1aSopenharmony_ci out->reference &= ~DELAYED_PIC_REF; 973cabdff1aSopenharmony_ci ret = finalize_frame(h, dst_frame, out, got_frame); 974cabdff1aSopenharmony_ci if (ret < 0) 975cabdff1aSopenharmony_ci return ret; 976cabdff1aSopenharmony_ci } 977cabdff1aSopenharmony_ci 978cabdff1aSopenharmony_ci return buf_index; 979cabdff1aSopenharmony_ci} 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_cistatic int h264_decode_frame(AVCodecContext *avctx, AVFrame *pict, 982cabdff1aSopenharmony_ci int *got_frame, AVPacket *avpkt) 983cabdff1aSopenharmony_ci{ 984cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 985cabdff1aSopenharmony_ci int buf_size = avpkt->size; 986cabdff1aSopenharmony_ci H264Context *h = avctx->priv_data; 987cabdff1aSopenharmony_ci int buf_index; 988cabdff1aSopenharmony_ci int ret; 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_ci h->flags = avctx->flags; 991cabdff1aSopenharmony_ci h->setup_finished = 0; 992cabdff1aSopenharmony_ci h->nb_slice_ctx_queued = 0; 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_ci ff_h264_unref_picture(h, &h->last_pic_for_ec); 995cabdff1aSopenharmony_ci 996cabdff1aSopenharmony_ci /* end of stream, output what is still in the buffers */ 997cabdff1aSopenharmony_ci if (buf_size == 0) 998cabdff1aSopenharmony_ci return send_next_delayed_frame(h, pict, got_frame, 0); 999cabdff1aSopenharmony_ci 1000cabdff1aSopenharmony_ci if (av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, NULL)) { 1001cabdff1aSopenharmony_ci size_t side_size; 1002cabdff1aSopenharmony_ci uint8_t *side = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); 1003cabdff1aSopenharmony_ci ff_h264_decode_extradata(side, side_size, 1004cabdff1aSopenharmony_ci &h->ps, &h->is_avc, &h->nal_length_size, 1005cabdff1aSopenharmony_ci avctx->err_recognition, avctx); 1006cabdff1aSopenharmony_ci } 1007cabdff1aSopenharmony_ci if (h->is_avc && buf_size >= 9 && buf[0]==1 && buf[2]==0 && (buf[4]&0xFC)==0xFC) { 1008cabdff1aSopenharmony_ci if (is_avcc_extradata(buf, buf_size)) 1009cabdff1aSopenharmony_ci return ff_h264_decode_extradata(buf, buf_size, 1010cabdff1aSopenharmony_ci &h->ps, &h->is_avc, &h->nal_length_size, 1011cabdff1aSopenharmony_ci avctx->err_recognition, avctx); 1012cabdff1aSopenharmony_ci } 1013cabdff1aSopenharmony_ci 1014cabdff1aSopenharmony_ci buf_index = decode_nal_units(h, buf, buf_size); 1015cabdff1aSopenharmony_ci if (buf_index < 0) 1016cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1017cabdff1aSopenharmony_ci 1018cabdff1aSopenharmony_ci if (!h->cur_pic_ptr && h->nal_unit_type == H264_NAL_END_SEQUENCE) { 1019cabdff1aSopenharmony_ci av_assert0(buf_index <= buf_size); 1020cabdff1aSopenharmony_ci return send_next_delayed_frame(h, pict, got_frame, buf_index); 1021cabdff1aSopenharmony_ci } 1022cabdff1aSopenharmony_ci 1023cabdff1aSopenharmony_ci if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS) && (!h->cur_pic_ptr || !h->has_slice)) { 1024cabdff1aSopenharmony_ci if (avctx->skip_frame >= AVDISCARD_NONREF || 1025cabdff1aSopenharmony_ci buf_size >= 4 && !memcmp("Q264", buf, 4)) 1026cabdff1aSopenharmony_ci return buf_size; 1027cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "no frame!\n"); 1028cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1029cabdff1aSopenharmony_ci } 1030cabdff1aSopenharmony_ci 1031cabdff1aSopenharmony_ci if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS) || 1032cabdff1aSopenharmony_ci (h->mb_y >= h->mb_height && h->mb_height)) { 1033cabdff1aSopenharmony_ci if ((ret = ff_h264_field_end(h, &h->slice_ctx[0], 0)) < 0) 1034cabdff1aSopenharmony_ci return ret; 1035cabdff1aSopenharmony_ci 1036cabdff1aSopenharmony_ci /* Wait for second field. */ 1037cabdff1aSopenharmony_ci if (h->next_output_pic) { 1038cabdff1aSopenharmony_ci ret = finalize_frame(h, pict, h->next_output_pic, got_frame); 1039cabdff1aSopenharmony_ci if (ret < 0) 1040cabdff1aSopenharmony_ci return ret; 1041cabdff1aSopenharmony_ci } 1042cabdff1aSopenharmony_ci } 1043cabdff1aSopenharmony_ci 1044cabdff1aSopenharmony_ci av_assert0(pict->buf[0] || !*got_frame); 1045cabdff1aSopenharmony_ci 1046cabdff1aSopenharmony_ci ff_h264_unref_picture(h, &h->last_pic_for_ec); 1047cabdff1aSopenharmony_ci 1048cabdff1aSopenharmony_ci return get_consumed_bytes(buf_index, buf_size); 1049cabdff1aSopenharmony_ci} 1050cabdff1aSopenharmony_ci 1051cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(H264Context, x) 1052cabdff1aSopenharmony_ci#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM 1053cabdff1aSopenharmony_ci#define VDX VD | AV_OPT_FLAG_EXPORT 1054cabdff1aSopenharmony_cistatic const AVOption h264_options[] = { 1055cabdff1aSopenharmony_ci { "is_avc", "is avc", OFFSET(is_avc), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VDX }, 1056cabdff1aSopenharmony_ci { "nal_length_size", "nal_length_size", OFFSET(nal_length_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 4, VDX }, 1057cabdff1aSopenharmony_ci { "enable_er", "Enable error resilience on damaged frames (unsafe)", OFFSET(enable_er), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VD }, 1058cabdff1aSopenharmony_ci { "x264_build", "Assume this x264 version if no x264 version found in any SEI", OFFSET(x264_build), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VD }, 1059cabdff1aSopenharmony_ci { NULL }, 1060cabdff1aSopenharmony_ci}; 1061cabdff1aSopenharmony_ci 1062cabdff1aSopenharmony_cistatic const AVClass h264_class = { 1063cabdff1aSopenharmony_ci .class_name = "H264 Decoder", 1064cabdff1aSopenharmony_ci .item_name = av_default_item_name, 1065cabdff1aSopenharmony_ci .option = h264_options, 1066cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 1067cabdff1aSopenharmony_ci}; 1068cabdff1aSopenharmony_ci 1069cabdff1aSopenharmony_ciconst FFCodec ff_h264_decoder = { 1070cabdff1aSopenharmony_ci .p.name = "h264", 1071cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), 1072cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 1073cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_H264, 1074cabdff1aSopenharmony_ci .priv_data_size = sizeof(H264Context), 1075cabdff1aSopenharmony_ci .init = h264_decode_init, 1076cabdff1aSopenharmony_ci .close = h264_decode_end, 1077cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(h264_decode_frame), 1078cabdff1aSopenharmony_ci .p.capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 | 1079cabdff1aSopenharmony_ci AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | 1080cabdff1aSopenharmony_ci AV_CODEC_CAP_FRAME_THREADS, 1081cabdff1aSopenharmony_ci .hw_configs = (const AVCodecHWConfigInternal *const []) { 1082cabdff1aSopenharmony_ci#if CONFIG_H264_DXVA2_HWACCEL 1083cabdff1aSopenharmony_ci HWACCEL_DXVA2(h264), 1084cabdff1aSopenharmony_ci#endif 1085cabdff1aSopenharmony_ci#if CONFIG_H264_D3D11VA_HWACCEL 1086cabdff1aSopenharmony_ci HWACCEL_D3D11VA(h264), 1087cabdff1aSopenharmony_ci#endif 1088cabdff1aSopenharmony_ci#if CONFIG_H264_D3D11VA2_HWACCEL 1089cabdff1aSopenharmony_ci HWACCEL_D3D11VA2(h264), 1090cabdff1aSopenharmony_ci#endif 1091cabdff1aSopenharmony_ci#if CONFIG_H264_NVDEC_HWACCEL 1092cabdff1aSopenharmony_ci HWACCEL_NVDEC(h264), 1093cabdff1aSopenharmony_ci#endif 1094cabdff1aSopenharmony_ci#if CONFIG_H264_VAAPI_HWACCEL 1095cabdff1aSopenharmony_ci HWACCEL_VAAPI(h264), 1096cabdff1aSopenharmony_ci#endif 1097cabdff1aSopenharmony_ci#if CONFIG_H264_VDPAU_HWACCEL 1098cabdff1aSopenharmony_ci HWACCEL_VDPAU(h264), 1099cabdff1aSopenharmony_ci#endif 1100cabdff1aSopenharmony_ci#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL 1101cabdff1aSopenharmony_ci HWACCEL_VIDEOTOOLBOX(h264), 1102cabdff1aSopenharmony_ci#endif 1103cabdff1aSopenharmony_ci NULL 1104cabdff1aSopenharmony_ci }, 1105cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING | 1106cabdff1aSopenharmony_ci FF_CODEC_CAP_ALLOCATE_PROGRESS | FF_CODEC_CAP_INIT_CLEANUP, 1107cabdff1aSopenharmony_ci .flush = h264_decode_flush, 1108cabdff1aSopenharmony_ci .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context), 1109cabdff1aSopenharmony_ci .update_thread_context_for_user = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context_for_user), 1110cabdff1aSopenharmony_ci .p.profiles = NULL_IF_CONFIG_SMALL(ff_h264_profiles), 1111cabdff1aSopenharmony_ci .p.priv_class = &h264_class, 1112cabdff1aSopenharmony_ci}; 1113