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#include "libavutil/avassert.h" 29cabdff1aSopenharmony_ci#include "error_resilience.h" 30cabdff1aSopenharmony_ci#include "avcodec.h" 31cabdff1aSopenharmony_ci#include "h264dec.h" 32cabdff1aSopenharmony_ci#include "mpegutils.h" 33cabdff1aSopenharmony_ci#include "thread.h" 34cabdff1aSopenharmony_ci#include "threadframe.h" 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_civoid ff_h264_unref_picture(H264Context *h, H264Picture *pic) 37cabdff1aSopenharmony_ci{ 38cabdff1aSopenharmony_ci int off = offsetof(H264Picture, f_grain) + sizeof(pic->f_grain); 39cabdff1aSopenharmony_ci int i; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci if (!pic->f || !pic->f->buf[0]) 42cabdff1aSopenharmony_ci return; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(h->avctx, &pic->tf); 45cabdff1aSopenharmony_ci ff_thread_release_buffer(h->avctx, pic->f_grain); 46cabdff1aSopenharmony_ci av_buffer_unref(&pic->hwaccel_priv_buf); 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci av_buffer_unref(&pic->qscale_table_buf); 49cabdff1aSopenharmony_ci av_buffer_unref(&pic->mb_type_buf); 50cabdff1aSopenharmony_ci av_buffer_unref(&pic->pps_buf); 51cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 52cabdff1aSopenharmony_ci av_buffer_unref(&pic->motion_val_buf[i]); 53cabdff1aSopenharmony_ci av_buffer_unref(&pic->ref_index_buf[i]); 54cabdff1aSopenharmony_ci } 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci memset((uint8_t*)pic + off, 0, sizeof(*pic) - off); 57cabdff1aSopenharmony_ci} 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_cistatic void h264_copy_picture_params(H264Picture *dst, const H264Picture *src) 60cabdff1aSopenharmony_ci{ 61cabdff1aSopenharmony_ci dst->qscale_table = src->qscale_table; 62cabdff1aSopenharmony_ci dst->mb_type = src->mb_type; 63cabdff1aSopenharmony_ci dst->pps = src->pps; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci for (int i = 0; i < 2; i++) { 66cabdff1aSopenharmony_ci dst->motion_val[i] = src->motion_val[i]; 67cabdff1aSopenharmony_ci dst->ref_index[i] = src->ref_index[i]; 68cabdff1aSopenharmony_ci } 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci for (int i = 0; i < 2; i++) 71cabdff1aSopenharmony_ci dst->field_poc[i] = src->field_poc[i]; 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci memcpy(dst->ref_poc, src->ref_poc, sizeof(src->ref_poc)); 74cabdff1aSopenharmony_ci memcpy(dst->ref_count, src->ref_count, sizeof(src->ref_count)); 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci dst->poc = src->poc; 77cabdff1aSopenharmony_ci dst->frame_num = src->frame_num; 78cabdff1aSopenharmony_ci dst->mmco_reset = src->mmco_reset; 79cabdff1aSopenharmony_ci dst->long_ref = src->long_ref; 80cabdff1aSopenharmony_ci dst->mbaff = src->mbaff; 81cabdff1aSopenharmony_ci dst->field_picture = src->field_picture; 82cabdff1aSopenharmony_ci dst->reference = src->reference; 83cabdff1aSopenharmony_ci dst->recovered = src->recovered; 84cabdff1aSopenharmony_ci dst->invalid_gap = src->invalid_gap; 85cabdff1aSopenharmony_ci dst->sei_recovery_frame_cnt = src->sei_recovery_frame_cnt; 86cabdff1aSopenharmony_ci dst->mb_width = src->mb_width; 87cabdff1aSopenharmony_ci dst->mb_height = src->mb_height; 88cabdff1aSopenharmony_ci dst->mb_stride = src->mb_stride; 89cabdff1aSopenharmony_ci dst->needs_fg = src->needs_fg; 90cabdff1aSopenharmony_ci} 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ciint ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src) 93cabdff1aSopenharmony_ci{ 94cabdff1aSopenharmony_ci int ret, i; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci av_assert0(!dst->f->buf[0]); 97cabdff1aSopenharmony_ci av_assert0(src->f->buf[0]); 98cabdff1aSopenharmony_ci av_assert0(src->tf.f == src->f); 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci dst->tf.f = dst->f; 101cabdff1aSopenharmony_ci ret = ff_thread_ref_frame(&dst->tf, &src->tf); 102cabdff1aSopenharmony_ci if (ret < 0) 103cabdff1aSopenharmony_ci goto fail; 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci if (src->needs_fg) { 106cabdff1aSopenharmony_ci ret = av_frame_ref(dst->f_grain, src->f_grain); 107cabdff1aSopenharmony_ci if (ret < 0) 108cabdff1aSopenharmony_ci goto fail; 109cabdff1aSopenharmony_ci } 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci dst->qscale_table_buf = av_buffer_ref(src->qscale_table_buf); 112cabdff1aSopenharmony_ci dst->mb_type_buf = av_buffer_ref(src->mb_type_buf); 113cabdff1aSopenharmony_ci dst->pps_buf = av_buffer_ref(src->pps_buf); 114cabdff1aSopenharmony_ci if (!dst->qscale_table_buf || !dst->mb_type_buf || !dst->pps_buf) { 115cabdff1aSopenharmony_ci ret = AVERROR(ENOMEM); 116cabdff1aSopenharmony_ci goto fail; 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 120cabdff1aSopenharmony_ci dst->motion_val_buf[i] = av_buffer_ref(src->motion_val_buf[i]); 121cabdff1aSopenharmony_ci dst->ref_index_buf[i] = av_buffer_ref(src->ref_index_buf[i]); 122cabdff1aSopenharmony_ci if (!dst->motion_val_buf[i] || !dst->ref_index_buf[i]) { 123cabdff1aSopenharmony_ci ret = AVERROR(ENOMEM); 124cabdff1aSopenharmony_ci goto fail; 125cabdff1aSopenharmony_ci } 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci if (src->hwaccel_picture_private) { 129cabdff1aSopenharmony_ci dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf); 130cabdff1aSopenharmony_ci if (!dst->hwaccel_priv_buf) { 131cabdff1aSopenharmony_ci ret = AVERROR(ENOMEM); 132cabdff1aSopenharmony_ci goto fail; 133cabdff1aSopenharmony_ci } 134cabdff1aSopenharmony_ci dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data; 135cabdff1aSopenharmony_ci } 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci h264_copy_picture_params(dst, src); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci return 0; 140cabdff1aSopenharmony_cifail: 141cabdff1aSopenharmony_ci ff_h264_unref_picture(h, dst); 142cabdff1aSopenharmony_ci return ret; 143cabdff1aSopenharmony_ci} 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ciint ff_h264_replace_picture(H264Context *h, H264Picture *dst, const H264Picture *src) 146cabdff1aSopenharmony_ci{ 147cabdff1aSopenharmony_ci int ret, i; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci if (!src->f || !src->f->buf[0]) { 150cabdff1aSopenharmony_ci ff_h264_unref_picture(h, dst); 151cabdff1aSopenharmony_ci return 0; 152cabdff1aSopenharmony_ci } 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci av_assert0(src->tf.f == src->f); 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci dst->tf.f = dst->f; 157cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(h->avctx, &dst->tf); 158cabdff1aSopenharmony_ci ret = ff_thread_ref_frame(&dst->tf, &src->tf); 159cabdff1aSopenharmony_ci if (ret < 0) 160cabdff1aSopenharmony_ci goto fail; 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci if (src->needs_fg) { 163cabdff1aSopenharmony_ci ff_thread_release_buffer(h->avctx, dst->f_grain); 164cabdff1aSopenharmony_ci ret = av_frame_ref(dst->f_grain, src->f_grain); 165cabdff1aSopenharmony_ci if (ret < 0) 166cabdff1aSopenharmony_ci goto fail; 167cabdff1aSopenharmony_ci } 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci ret = av_buffer_replace(&dst->qscale_table_buf, src->qscale_table_buf); 170cabdff1aSopenharmony_ci ret |= av_buffer_replace(&dst->mb_type_buf, src->mb_type_buf); 171cabdff1aSopenharmony_ci ret |= av_buffer_replace(&dst->pps_buf, src->pps_buf); 172cabdff1aSopenharmony_ci if (ret < 0) 173cabdff1aSopenharmony_ci goto fail; 174cabdff1aSopenharmony_ci 175cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 176cabdff1aSopenharmony_ci ret = av_buffer_replace(&dst->motion_val_buf[i], src->motion_val_buf[i]); 177cabdff1aSopenharmony_ci ret |= av_buffer_replace(&dst->ref_index_buf[i], src->ref_index_buf[i]); 178cabdff1aSopenharmony_ci if (ret < 0) 179cabdff1aSopenharmony_ci goto fail; 180cabdff1aSopenharmony_ci } 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci ret = av_buffer_replace(&dst->hwaccel_priv_buf, src->hwaccel_priv_buf); 183cabdff1aSopenharmony_ci if (ret < 0) 184cabdff1aSopenharmony_ci goto fail; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci dst->hwaccel_picture_private = src->hwaccel_picture_private; 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_ci h264_copy_picture_params(dst, src); 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci return 0; 191cabdff1aSopenharmony_cifail: 192cabdff1aSopenharmony_ci ff_h264_unref_picture(h, dst); 193cabdff1aSopenharmony_ci return ret; 194cabdff1aSopenharmony_ci} 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_civoid ff_h264_set_erpic(ERPicture *dst, H264Picture *src) 197cabdff1aSopenharmony_ci{ 198cabdff1aSopenharmony_ci#if CONFIG_ERROR_RESILIENCE 199cabdff1aSopenharmony_ci int i; 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_ci memset(dst, 0, sizeof(*dst)); 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_ci if (!src) 204cabdff1aSopenharmony_ci return; 205cabdff1aSopenharmony_ci 206cabdff1aSopenharmony_ci dst->f = src->f; 207cabdff1aSopenharmony_ci dst->tf = &src->tf; 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 210cabdff1aSopenharmony_ci dst->motion_val[i] = src->motion_val[i]; 211cabdff1aSopenharmony_ci dst->ref_index[i] = src->ref_index[i]; 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci dst->mb_type = src->mb_type; 215cabdff1aSopenharmony_ci dst->field_picture = src->field_picture; 216cabdff1aSopenharmony_ci#endif /* CONFIG_ERROR_RESILIENCE */ 217cabdff1aSopenharmony_ci} 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ciint ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup) 220cabdff1aSopenharmony_ci{ 221cabdff1aSopenharmony_ci AVCodecContext *const avctx = h->avctx; 222cabdff1aSopenharmony_ci H264Picture *cur = h->cur_pic_ptr; 223cabdff1aSopenharmony_ci int err = 0; 224cabdff1aSopenharmony_ci h->mb_y = 0; 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci if (in_setup || !(avctx->active_thread_type & FF_THREAD_FRAME)) { 227cabdff1aSopenharmony_ci if (!h->droppable) { 228cabdff1aSopenharmony_ci err = ff_h264_execute_ref_pic_marking(h); 229cabdff1aSopenharmony_ci h->poc.prev_poc_msb = h->poc.poc_msb; 230cabdff1aSopenharmony_ci h->poc.prev_poc_lsb = h->poc.poc_lsb; 231cabdff1aSopenharmony_ci } 232cabdff1aSopenharmony_ci h->poc.prev_frame_num_offset = h->poc.frame_num_offset; 233cabdff1aSopenharmony_ci h->poc.prev_frame_num = h->poc.frame_num; 234cabdff1aSopenharmony_ci } 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci if (avctx->hwaccel) { 237cabdff1aSopenharmony_ci err = avctx->hwaccel->end_frame(avctx); 238cabdff1aSopenharmony_ci if (err < 0) 239cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 240cabdff1aSopenharmony_ci "hardware accelerator failed to decode picture\n"); 241cabdff1aSopenharmony_ci } else if (!in_setup && cur->needs_fg && (!FIELD_PICTURE(h) || !h->first_field)) { 242cabdff1aSopenharmony_ci AVFrameSideData *sd = av_frame_get_side_data(cur->f, AV_FRAME_DATA_FILM_GRAIN_PARAMS); 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 245cabdff1aSopenharmony_ci if (sd) // a decoding error may have happened before the side data could be allocated 246cabdff1aSopenharmony_ci err = ff_h274_apply_film_grain(cur->f_grain, cur->f, &h->h274db, 247cabdff1aSopenharmony_ci (AVFilmGrainParams *) sd->data); 248cabdff1aSopenharmony_ci if (err < 0) { 249cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_WARNING, "Failed synthesizing film " 250cabdff1aSopenharmony_ci "grain, ignoring: %s\n", av_err2str(err)); 251cabdff1aSopenharmony_ci cur->needs_fg = 0; 252cabdff1aSopenharmony_ci err = 0; 253cabdff1aSopenharmony_ci } 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci if (!in_setup && !h->droppable) 257cabdff1aSopenharmony_ci ff_thread_report_progress(&cur->tf, INT_MAX, 258cabdff1aSopenharmony_ci h->picture_structure == PICT_BOTTOM_FIELD); 259cabdff1aSopenharmony_ci emms_c(); 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci h->current_slice = 0; 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci return err; 264cabdff1aSopenharmony_ci} 265