1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MPEG-4 encoder/decoder internal header. 3cabdff1aSopenharmony_ci * Copyright (c) 2000,2001 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#ifndef AVCODEC_MPEG4VIDEO_H 24cabdff1aSopenharmony_ci#define AVCODEC_MPEG4VIDEO_H 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include <stdint.h> 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "mpegvideo.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci// shapes 31cabdff1aSopenharmony_ci#define RECT_SHAPE 0 32cabdff1aSopenharmony_ci#define BIN_SHAPE 1 33cabdff1aSopenharmony_ci#define BIN_ONLY_SHAPE 2 34cabdff1aSopenharmony_ci#define GRAY_SHAPE 3 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#define SIMPLE_VO_TYPE 1 37cabdff1aSopenharmony_ci#define CORE_VO_TYPE 3 38cabdff1aSopenharmony_ci#define MAIN_VO_TYPE 4 39cabdff1aSopenharmony_ci#define NBIT_VO_TYPE 5 40cabdff1aSopenharmony_ci#define ARTS_VO_TYPE 10 41cabdff1aSopenharmony_ci#define ACE_VO_TYPE 12 42cabdff1aSopenharmony_ci#define SIMPLE_STUDIO_VO_TYPE 14 43cabdff1aSopenharmony_ci#define CORE_STUDIO_VO_TYPE 15 44cabdff1aSopenharmony_ci#define ADV_SIMPLE_VO_TYPE 17 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#define VOT_VIDEO_ID 1 47cabdff1aSopenharmony_ci#define VOT_STILL_TEXTURE_ID 2 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci// aspect_ratio_info 50cabdff1aSopenharmony_ci#define EXTENDED_PAR 15 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci//vol_sprite_usage / sprite_enable 53cabdff1aSopenharmony_ci#define STATIC_SPRITE 1 54cabdff1aSopenharmony_ci#define GMC_SPRITE 2 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci#define MOTION_MARKER 0x1F001 57cabdff1aSopenharmony_ci#define DC_MARKER 0x6B001 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci#define VOS_STARTCODE 0x1B0 60cabdff1aSopenharmony_ci#define USER_DATA_STARTCODE 0x1B2 61cabdff1aSopenharmony_ci#define GOP_STARTCODE 0x1B3 62cabdff1aSopenharmony_ci#define VISUAL_OBJ_STARTCODE 0x1B5 63cabdff1aSopenharmony_ci#define VOP_STARTCODE 0x1B6 64cabdff1aSopenharmony_ci#define SLICE_STARTCODE 0x1B7 65cabdff1aSopenharmony_ci#define EXT_STARTCODE 0x1B8 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci#define QUANT_MATRIX_EXT_ID 0x3 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci/* smaller packets likely don't contain a real frame */ 70cabdff1aSopenharmony_ci#define MAX_NVOP_SIZE 19 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_civoid ff_mpeg4_clean_buffers(MpegEncContext *s); 73cabdff1aSopenharmony_ciint ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); 74cabdff1aSopenharmony_civoid ff_mpeg4_init_direct_mv(MpegEncContext *s); 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci/** 77cabdff1aSopenharmony_ci * @return the mb_type 78cabdff1aSopenharmony_ci */ 79cabdff1aSopenharmony_ciint ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my); 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci#if 0 //3IV1 is quite rare and it slows things down a tiny bit 82cabdff1aSopenharmony_ci#define IS_3IV1 s->codec_tag == AV_RL32("3IV1") 83cabdff1aSopenharmony_ci#else 84cabdff1aSopenharmony_ci#define IS_3IV1 0 85cabdff1aSopenharmony_ci#endif 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci/** 88cabdff1aSopenharmony_ci * Predict the dc. 89cabdff1aSopenharmony_ci * encoding quantized level -> quantized diff 90cabdff1aSopenharmony_ci * decoding quantized diff -> quantized level 91cabdff1aSopenharmony_ci * @param n block index (0-3 are luma, 4-5 are chroma) 92cabdff1aSopenharmony_ci * @param dir_ptr pointer to an integer where the prediction direction will be stored 93cabdff1aSopenharmony_ci */ 94cabdff1aSopenharmony_cistatic inline int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level, 95cabdff1aSopenharmony_ci int *dir_ptr, int encoding) 96cabdff1aSopenharmony_ci{ 97cabdff1aSopenharmony_ci int a, b, c, wrap, pred, scale, ret; 98cabdff1aSopenharmony_ci int16_t *dc_val; 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci /* find prediction */ 101cabdff1aSopenharmony_ci if (n < 4) 102cabdff1aSopenharmony_ci scale = s->y_dc_scale; 103cabdff1aSopenharmony_ci else 104cabdff1aSopenharmony_ci scale = s->c_dc_scale; 105cabdff1aSopenharmony_ci if (IS_3IV1) 106cabdff1aSopenharmony_ci scale = 8; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci wrap = s->block_wrap[n]; 109cabdff1aSopenharmony_ci dc_val = s->dc_val[0] + s->block_index[n]; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci /* B C 112cabdff1aSopenharmony_ci * A X 113cabdff1aSopenharmony_ci */ 114cabdff1aSopenharmony_ci a = dc_val[-1]; 115cabdff1aSopenharmony_ci b = dc_val[-1 - wrap]; 116cabdff1aSopenharmony_ci c = dc_val[-wrap]; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci /* outside slice handling (we can't do that by memset as we need the 119cabdff1aSopenharmony_ci * dc for error resilience) */ 120cabdff1aSopenharmony_ci if (s->first_slice_line && n != 3) { 121cabdff1aSopenharmony_ci if (n != 2) 122cabdff1aSopenharmony_ci b = c = 1024; 123cabdff1aSopenharmony_ci if (n != 1 && s->mb_x == s->resync_mb_x) 124cabdff1aSopenharmony_ci b = a = 1024; 125cabdff1aSopenharmony_ci } 126cabdff1aSopenharmony_ci if (s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y + 1) { 127cabdff1aSopenharmony_ci if (n == 0 || n == 4 || n == 5) 128cabdff1aSopenharmony_ci b = 1024; 129cabdff1aSopenharmony_ci } 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci if (abs(a - b) < abs(b - c)) { 132cabdff1aSopenharmony_ci pred = c; 133cabdff1aSopenharmony_ci *dir_ptr = 1; /* top */ 134cabdff1aSopenharmony_ci } else { 135cabdff1aSopenharmony_ci pred = a; 136cabdff1aSopenharmony_ci *dir_ptr = 0; /* left */ 137cabdff1aSopenharmony_ci } 138cabdff1aSopenharmony_ci /* we assume pred is positive */ 139cabdff1aSopenharmony_ci pred = FASTDIV((pred + (scale >> 1)), scale); 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci if (encoding) { 142cabdff1aSopenharmony_ci ret = level - pred; 143cabdff1aSopenharmony_ci } else { 144cabdff1aSopenharmony_ci level += pred; 145cabdff1aSopenharmony_ci ret = level; 146cabdff1aSopenharmony_ci } 147cabdff1aSopenharmony_ci level *= scale; 148cabdff1aSopenharmony_ci if (level & (~2047)) { 149cabdff1aSopenharmony_ci if (!s->encoding && (s->avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_AGGRESSIVE))) { 150cabdff1aSopenharmony_ci if (level < 0) { 151cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 152cabdff1aSopenharmony_ci "dc<0 at %dx%d\n", s->mb_x, s->mb_y); 153cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 154cabdff1aSopenharmony_ci } 155cabdff1aSopenharmony_ci if (level > 2048 + scale) { 156cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 157cabdff1aSopenharmony_ci "dc overflow at %dx%d\n", s->mb_x, s->mb_y); 158cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 159cabdff1aSopenharmony_ci } 160cabdff1aSopenharmony_ci } 161cabdff1aSopenharmony_ci if (level < 0) 162cabdff1aSopenharmony_ci level = 0; 163cabdff1aSopenharmony_ci else if (!(s->workaround_bugs & FF_BUG_DC_CLIP)) 164cabdff1aSopenharmony_ci level = 2047; 165cabdff1aSopenharmony_ci } 166cabdff1aSopenharmony_ci dc_val[0] = level; 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci return ret; 169cabdff1aSopenharmony_ci} 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci#endif /* AVCODEC_MPEG4VIDEO_H */ 172