1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MPEG-1/2 decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 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/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * MPEG-1/2 decoder 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#define UNCHECKED_BITSTREAM_READER 1 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 31cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 32cabdff1aSopenharmony_ci#include "libavutil/thread.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#include "avcodec.h" 35cabdff1aSopenharmony_ci#include "mpegvideo.h" 36cabdff1aSopenharmony_ci#include "mpeg12.h" 37cabdff1aSopenharmony_ci#include "mpeg12data.h" 38cabdff1aSopenharmony_ci#include "mpeg12dec.h" 39cabdff1aSopenharmony_ci#include "mpegvideodata.h" 40cabdff1aSopenharmony_ci#include "startcode.h" 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_cistatic const uint8_t table_mb_ptype[7][2] = { 43cabdff1aSopenharmony_ci { 3, 5 }, // 0x01 MB_INTRA 44cabdff1aSopenharmony_ci { 1, 2 }, // 0x02 MB_PAT 45cabdff1aSopenharmony_ci { 1, 3 }, // 0x08 MB_FOR 46cabdff1aSopenharmony_ci { 1, 1 }, // 0x0A MB_FOR|MB_PAT 47cabdff1aSopenharmony_ci { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA 48cabdff1aSopenharmony_ci { 1, 5 }, // 0x12 MB_QUANT|MB_PAT 49cabdff1aSopenharmony_ci { 2, 5 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT 50cabdff1aSopenharmony_ci}; 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_cistatic const uint8_t table_mb_btype[11][2] = { 53cabdff1aSopenharmony_ci { 3, 5 }, // 0x01 MB_INTRA 54cabdff1aSopenharmony_ci { 2, 3 }, // 0x04 MB_BACK 55cabdff1aSopenharmony_ci { 3, 3 }, // 0x06 MB_BACK|MB_PAT 56cabdff1aSopenharmony_ci { 2, 4 }, // 0x08 MB_FOR 57cabdff1aSopenharmony_ci { 3, 4 }, // 0x0A MB_FOR|MB_PAT 58cabdff1aSopenharmony_ci { 2, 2 }, // 0x0C MB_FOR|MB_BACK 59cabdff1aSopenharmony_ci { 3, 2 }, // 0x0E MB_FOR|MB_BACK|MB_PAT 60cabdff1aSopenharmony_ci { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA 61cabdff1aSopenharmony_ci { 2, 6 }, // 0x16 MB_QUANT|MB_BACK|MB_PAT 62cabdff1aSopenharmony_ci { 3, 6 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT 63cabdff1aSopenharmony_ci { 2, 5 }, // 0x1E MB_QUANT|MB_FOR|MB_BACK|MB_PAT 64cabdff1aSopenharmony_ci}; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ciav_cold void ff_init_2d_vlc_rl(RLTable *rl, unsigned static_size, int flags) 67cabdff1aSopenharmony_ci{ 68cabdff1aSopenharmony_ci int i; 69cabdff1aSopenharmony_ci VLCElem table[680] = { 0 }; 70cabdff1aSopenharmony_ci VLC vlc = { .table = table, .table_allocated = static_size }; 71cabdff1aSopenharmony_ci av_assert0(static_size <= FF_ARRAY_ELEMS(table)); 72cabdff1aSopenharmony_ci init_vlc(&vlc, TEX_VLC_BITS, rl->n + 2, &rl->table_vlc[0][1], 4, 2, &rl->table_vlc[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC | flags); 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci for (i = 0; i < vlc.table_size; i++) { 75cabdff1aSopenharmony_ci int code = vlc.table[i].sym; 76cabdff1aSopenharmony_ci int len = vlc.table[i].len; 77cabdff1aSopenharmony_ci int level, run; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci if (len == 0) { // illegal code 80cabdff1aSopenharmony_ci run = 65; 81cabdff1aSopenharmony_ci level = MAX_LEVEL; 82cabdff1aSopenharmony_ci } else if (len<0) { //more bits needed 83cabdff1aSopenharmony_ci run = 0; 84cabdff1aSopenharmony_ci level = code; 85cabdff1aSopenharmony_ci } else { 86cabdff1aSopenharmony_ci if (code == rl->n) { //esc 87cabdff1aSopenharmony_ci run = 65; 88cabdff1aSopenharmony_ci level = 0; 89cabdff1aSopenharmony_ci } else if (code == rl->n+1) { //eob 90cabdff1aSopenharmony_ci run = 0; 91cabdff1aSopenharmony_ci level = 127; 92cabdff1aSopenharmony_ci } else { 93cabdff1aSopenharmony_ci run = rl->table_run [code] + 1; 94cabdff1aSopenharmony_ci level = rl->table_level[code]; 95cabdff1aSopenharmony_ci } 96cabdff1aSopenharmony_ci } 97cabdff1aSopenharmony_ci rl->rl_vlc[0][i].len = len; 98cabdff1aSopenharmony_ci rl->rl_vlc[0][i].level = level; 99cabdff1aSopenharmony_ci rl->rl_vlc[0][i].run = run; 100cabdff1aSopenharmony_ci } 101cabdff1aSopenharmony_ci} 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ciav_cold void ff_mpeg12_common_init(MpegEncContext *s) 104cabdff1aSopenharmony_ci{ 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci s->y_dc_scale_table = 107cabdff1aSopenharmony_ci s->c_dc_scale_table = ff_mpeg2_dc_scale_table[s->intra_dc_precision]; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci} 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_civoid ff_mpeg1_clean_buffers(MpegEncContext *s) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci s->last_dc[0] = 1 << (7 + s->intra_dc_precision); 114cabdff1aSopenharmony_ci s->last_dc[1] = s->last_dc[0]; 115cabdff1aSopenharmony_ci s->last_dc[2] = s->last_dc[0]; 116cabdff1aSopenharmony_ci memset(s->last_mv, 0, sizeof(s->last_mv)); 117cabdff1aSopenharmony_ci} 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci/******************************************/ 121cabdff1aSopenharmony_ci/* decoding */ 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ciVLC ff_mv_vlc; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ciVLC ff_dc_lum_vlc; 126cabdff1aSopenharmony_ciVLC ff_dc_chroma_vlc; 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ciVLC ff_mbincr_vlc; 129cabdff1aSopenharmony_ciVLC ff_mb_ptype_vlc; 130cabdff1aSopenharmony_ciVLC ff_mb_btype_vlc; 131cabdff1aSopenharmony_ciVLC ff_mb_pat_vlc; 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_cistatic av_cold void mpeg12_init_vlcs(void) 134cabdff1aSopenharmony_ci{ 135cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_dc_lum_vlc, DC_VLC_BITS, 12, 136cabdff1aSopenharmony_ci ff_mpeg12_vlc_dc_lum_bits, 1, 1, 137cabdff1aSopenharmony_ci ff_mpeg12_vlc_dc_lum_code, 2, 2, 512); 138cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_dc_chroma_vlc, DC_VLC_BITS, 12, 139cabdff1aSopenharmony_ci ff_mpeg12_vlc_dc_chroma_bits, 1, 1, 140cabdff1aSopenharmony_ci ff_mpeg12_vlc_dc_chroma_code, 2, 2, 514); 141cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_mv_vlc, MV_VLC_BITS, 17, 142cabdff1aSopenharmony_ci &ff_mpeg12_mbMotionVectorTable[0][1], 2, 1, 143cabdff1aSopenharmony_ci &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 266); 144cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_mbincr_vlc, MBINCR_VLC_BITS, 36, 145cabdff1aSopenharmony_ci &ff_mpeg12_mbAddrIncrTable[0][1], 2, 1, 146cabdff1aSopenharmony_ci &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 538); 147cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_mb_pat_vlc, MB_PAT_VLC_BITS, 64, 148cabdff1aSopenharmony_ci &ff_mpeg12_mbPatTable[0][1], 2, 1, 149cabdff1aSopenharmony_ci &ff_mpeg12_mbPatTable[0][0], 2, 1, 512); 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7, 152cabdff1aSopenharmony_ci &table_mb_ptype[0][1], 2, 1, 153cabdff1aSopenharmony_ci &table_mb_ptype[0][0], 2, 1, 64); 154cabdff1aSopenharmony_ci INIT_VLC_STATIC(&ff_mb_btype_vlc, MB_BTYPE_VLC_BITS, 11, 155cabdff1aSopenharmony_ci &table_mb_btype[0][1], 2, 1, 156cabdff1aSopenharmony_ci &table_mb_btype[0][0], 2, 1, 64); 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci INIT_2D_VLC_RL(ff_rl_mpeg1, 680, 0); 159cabdff1aSopenharmony_ci INIT_2D_VLC_RL(ff_rl_mpeg2, 674, 0); 160cabdff1aSopenharmony_ci} 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ciav_cold void ff_mpeg12_init_vlcs(void) 163cabdff1aSopenharmony_ci{ 164cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 165cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, mpeg12_init_vlcs); 166cabdff1aSopenharmony_ci} 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci#if FF_API_FLAG_TRUNCATED 169cabdff1aSopenharmony_ci/** 170cabdff1aSopenharmony_ci * Find the end of the current frame in the bitstream. 171cabdff1aSopenharmony_ci * @return the position of the first byte of the next frame, or -1 172cabdff1aSopenharmony_ci */ 173cabdff1aSopenharmony_ciint ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s) 174cabdff1aSopenharmony_ci{ 175cabdff1aSopenharmony_ci int i; 176cabdff1aSopenharmony_ci uint32_t state = pc->state; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci /* EOF considered as end of frame */ 179cabdff1aSopenharmony_ci if (buf_size == 0) 180cabdff1aSopenharmony_ci return 0; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci/* 183cabdff1aSopenharmony_ci 0 frame start -> 1/4 184cabdff1aSopenharmony_ci 1 first_SEQEXT -> 0/2 185cabdff1aSopenharmony_ci 2 first field start -> 3/0 186cabdff1aSopenharmony_ci 3 second_SEQEXT -> 2/0 187cabdff1aSopenharmony_ci 4 searching end 188cabdff1aSopenharmony_ci*/ 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci for (i = 0; i < buf_size; i++) { 191cabdff1aSopenharmony_ci av_assert1(pc->frame_start_found >= 0 && pc->frame_start_found <= 4); 192cabdff1aSopenharmony_ci if (pc->frame_start_found & 1) { 193cabdff1aSopenharmony_ci if (state == EXT_START_CODE && (buf[i] & 0xF0) != 0x80) 194cabdff1aSopenharmony_ci pc->frame_start_found--; 195cabdff1aSopenharmony_ci else if (state == EXT_START_CODE + 2) { 196cabdff1aSopenharmony_ci if ((buf[i] & 3) == 3) 197cabdff1aSopenharmony_ci pc->frame_start_found = 0; 198cabdff1aSopenharmony_ci else 199cabdff1aSopenharmony_ci pc->frame_start_found = (pc->frame_start_found + 1) & 3; 200cabdff1aSopenharmony_ci } 201cabdff1aSopenharmony_ci state++; 202cabdff1aSopenharmony_ci } else { 203cabdff1aSopenharmony_ci i = avpriv_find_start_code(buf + i, buf + buf_size, &state) - buf - 1; 204cabdff1aSopenharmony_ci if (pc->frame_start_found == 0 && state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE) { 205cabdff1aSopenharmony_ci i++; 206cabdff1aSopenharmony_ci pc->frame_start_found = 4; 207cabdff1aSopenharmony_ci } 208cabdff1aSopenharmony_ci if (state == SEQ_END_CODE) { 209cabdff1aSopenharmony_ci pc->frame_start_found = 0; 210cabdff1aSopenharmony_ci pc->state=-1; 211cabdff1aSopenharmony_ci return i+1; 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci if (pc->frame_start_found == 2 && state == SEQ_START_CODE) 214cabdff1aSopenharmony_ci pc->frame_start_found = 0; 215cabdff1aSopenharmony_ci if (pc->frame_start_found < 4 && state == EXT_START_CODE) 216cabdff1aSopenharmony_ci pc->frame_start_found++; 217cabdff1aSopenharmony_ci if (pc->frame_start_found == 4 && (state & 0xFFFFFF00) == 0x100) { 218cabdff1aSopenharmony_ci if (state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE) { 219cabdff1aSopenharmony_ci pc->frame_start_found = 0; 220cabdff1aSopenharmony_ci pc->state = -1; 221cabdff1aSopenharmony_ci return i - 3; 222cabdff1aSopenharmony_ci } 223cabdff1aSopenharmony_ci } 224cabdff1aSopenharmony_ci if (pc->frame_start_found == 0 && s && state == PICTURE_START_CODE) { 225cabdff1aSopenharmony_ci ff_fetch_timestamp(s, i - 3, 1, i > 3); 226cabdff1aSopenharmony_ci } 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci } 229cabdff1aSopenharmony_ci pc->state = state; 230cabdff1aSopenharmony_ci return END_NOT_FOUND; 231cabdff1aSopenharmony_ci} 232cabdff1aSopenharmony_ci#endif 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci#define MAX_INDEX (64 - 1) 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ciint ff_mpeg1_decode_block_intra(GetBitContext *gb, 237cabdff1aSopenharmony_ci const uint16_t *quant_matrix, 238cabdff1aSopenharmony_ci const uint8_t *scantable, int last_dc[3], 239cabdff1aSopenharmony_ci int16_t *block, int index, int qscale) 240cabdff1aSopenharmony_ci{ 241cabdff1aSopenharmony_ci int dc, diff, i = 0, component; 242cabdff1aSopenharmony_ci RLTable *rl = &ff_rl_mpeg1; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci /* DC coefficient */ 245cabdff1aSopenharmony_ci component = index <= 3 ? 0 : index - 4 + 1; 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci diff = decode_dc(gb, component); 248cabdff1aSopenharmony_ci if (diff >= 0xffff) 249cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci dc = last_dc[component]; 252cabdff1aSopenharmony_ci dc += diff; 253cabdff1aSopenharmony_ci last_dc[component] = dc; 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci block[0] = dc * quant_matrix[0]; 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci { 258cabdff1aSopenharmony_ci OPEN_READER(re, gb); 259cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 260cabdff1aSopenharmony_ci if (((int32_t)GET_CACHE(re, gb)) <= (int32_t)0xBFFFFFFF) 261cabdff1aSopenharmony_ci goto end; 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci /* now quantify & encode AC coefficients */ 264cabdff1aSopenharmony_ci while (1) { 265cabdff1aSopenharmony_ci int level, run, j; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci GET_RL_VLC(level, run, re, gb, rl->rl_vlc[0], 268cabdff1aSopenharmony_ci TEX_VLC_BITS, 2, 0); 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_ci if (level != 0) { 271cabdff1aSopenharmony_ci i += run; 272cabdff1aSopenharmony_ci if (i > MAX_INDEX) 273cabdff1aSopenharmony_ci break; 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci j = scantable[i]; 276cabdff1aSopenharmony_ci level = (level * qscale * quant_matrix[j]) >> 4; 277cabdff1aSopenharmony_ci level = (level - 1) | 1; 278cabdff1aSopenharmony_ci level = (level ^ SHOW_SBITS(re, gb, 1)) - 279cabdff1aSopenharmony_ci SHOW_SBITS(re, gb, 1); 280cabdff1aSopenharmony_ci SKIP_BITS(re, gb, 1); 281cabdff1aSopenharmony_ci } else { 282cabdff1aSopenharmony_ci /* escape */ 283cabdff1aSopenharmony_ci run = SHOW_UBITS(re, gb, 6) + 1; 284cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 6); 285cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 286cabdff1aSopenharmony_ci level = SHOW_SBITS(re, gb, 8); 287cabdff1aSopenharmony_ci SKIP_BITS(re, gb, 8); 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci if (level == -128) { 290cabdff1aSopenharmony_ci level = SHOW_UBITS(re, gb, 8) - 256; 291cabdff1aSopenharmony_ci SKIP_BITS(re, gb, 8); 292cabdff1aSopenharmony_ci } else if (level == 0) { 293cabdff1aSopenharmony_ci level = SHOW_UBITS(re, gb, 8); 294cabdff1aSopenharmony_ci SKIP_BITS(re, gb, 8); 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci i += run; 298cabdff1aSopenharmony_ci if (i > MAX_INDEX) 299cabdff1aSopenharmony_ci break; 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci j = scantable[i]; 302cabdff1aSopenharmony_ci if (level < 0) { 303cabdff1aSopenharmony_ci level = -level; 304cabdff1aSopenharmony_ci level = (level * qscale * quant_matrix[j]) >> 4; 305cabdff1aSopenharmony_ci level = (level - 1) | 1; 306cabdff1aSopenharmony_ci level = -level; 307cabdff1aSopenharmony_ci } else { 308cabdff1aSopenharmony_ci level = (level * qscale * quant_matrix[j]) >> 4; 309cabdff1aSopenharmony_ci level = (level - 1) | 1; 310cabdff1aSopenharmony_ci } 311cabdff1aSopenharmony_ci } 312cabdff1aSopenharmony_ci 313cabdff1aSopenharmony_ci block[j] = level; 314cabdff1aSopenharmony_ci if (((int32_t)GET_CACHE(re, gb)) <= (int32_t)0xBFFFFFFF) 315cabdff1aSopenharmony_ci break; 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ciend: 320cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 2); 321cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 322cabdff1aSopenharmony_ci } 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_ci if (i > MAX_INDEX) 325cabdff1aSopenharmony_ci i = AVERROR_INVALIDDATA; 326cabdff1aSopenharmony_ci 327cabdff1aSopenharmony_ci return i; 328cabdff1aSopenharmony_ci} 329