1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#ifndef AVCODEC_ERROR_RESILIENCE_H 20cabdff1aSopenharmony_ci#define AVCODEC_ERROR_RESILIENCE_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include <stdint.h> 23cabdff1aSopenharmony_ci#include <stdatomic.h> 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "avcodec.h" 26cabdff1aSopenharmony_ci#include "me_cmp.h" 27cabdff1aSopenharmony_ci#include "threadframe.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci///< current MB is the first after a resync marker 30cabdff1aSopenharmony_ci#define VP_START 1 31cabdff1aSopenharmony_ci#define ER_AC_ERROR 2 32cabdff1aSopenharmony_ci#define ER_DC_ERROR 4 33cabdff1aSopenharmony_ci#define ER_MV_ERROR 8 34cabdff1aSopenharmony_ci#define ER_AC_END 16 35cabdff1aSopenharmony_ci#define ER_DC_END 32 36cabdff1aSopenharmony_ci#define ER_MV_END 64 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#define ER_MB_ERROR (ER_AC_ERROR|ER_DC_ERROR|ER_MV_ERROR) 39cabdff1aSopenharmony_ci#define ER_MB_END (ER_AC_END|ER_DC_END|ER_MV_END) 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_citypedef struct ERPicture { 42cabdff1aSopenharmony_ci AVFrame *f; 43cabdff1aSopenharmony_ci ThreadFrame *tf; 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci // it is the caller's responsibility to allocate these buffers 46cabdff1aSopenharmony_ci int16_t (*motion_val[2])[2]; 47cabdff1aSopenharmony_ci int8_t *ref_index[2]; 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci uint32_t *mb_type; 50cabdff1aSopenharmony_ci int field_picture; 51cabdff1aSopenharmony_ci} ERPicture; 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_citypedef struct ERContext { 54cabdff1aSopenharmony_ci AVCodecContext *avctx; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci me_cmp_func sad; 57cabdff1aSopenharmony_ci int mecc_inited; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci int *mb_index2xy; 60cabdff1aSopenharmony_ci int mb_num; 61cabdff1aSopenharmony_ci int mb_width, mb_height; 62cabdff1aSopenharmony_ci ptrdiff_t mb_stride; 63cabdff1aSopenharmony_ci ptrdiff_t b8_stride; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci atomic_int error_count; 66cabdff1aSopenharmony_ci int error_occurred; 67cabdff1aSopenharmony_ci uint8_t *error_status_table; 68cabdff1aSopenharmony_ci uint8_t *er_temp_buffer; 69cabdff1aSopenharmony_ci int16_t *dc_val[3]; 70cabdff1aSopenharmony_ci uint8_t *mbskip_table; 71cabdff1aSopenharmony_ci uint8_t *mbintra_table; 72cabdff1aSopenharmony_ci int mv[2][4][2]; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci ERPicture cur_pic; 75cabdff1aSopenharmony_ci ERPicture last_pic; 76cabdff1aSopenharmony_ci ERPicture next_pic; 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci AVBufferRef *ref_index_buf[2]; 79cabdff1aSopenharmony_ci AVBufferRef *motion_val_buf[2]; 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci uint16_t pp_time; 82cabdff1aSopenharmony_ci uint16_t pb_time; 83cabdff1aSopenharmony_ci int quarter_sample; 84cabdff1aSopenharmony_ci int partitioned_frame; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci void (*decode_mb)(void *opaque, int ref, int mv_dir, int mv_type, 87cabdff1aSopenharmony_ci int (*mv)[2][4][2], 88cabdff1aSopenharmony_ci int mb_x, int mb_y, int mb_intra, int mb_skipped); 89cabdff1aSopenharmony_ci void *opaque; 90cabdff1aSopenharmony_ci} ERContext; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_civoid ff_er_frame_start(ERContext *s); 93cabdff1aSopenharmony_civoid ff_er_frame_end(ERContext *s); 94cabdff1aSopenharmony_civoid ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, 95cabdff1aSopenharmony_ci int status); 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci#endif /* AVCODEC_ERROR_RESILIENCE_H */ 98