FFmpeg
Loading...
Searching...
No Matches
mpeg12.c
Go to the documentation of this file.
1/*
2 * MPEG-1/2 decoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23/**
24 * @file
25 * MPEG-1/2 decoder
26 */
27
28#define UNCHECKED_BITSTREAM_READER 1
29
31#include "libavutil/thread.h"
32
33#include "mpeg12data.h"
34#include "mpeg12dec.h"
35#include "mpegutils.h"
36#include "rl.h"
37
38static const uint8_t table_mb_ptype[7][2] = {
39 { 3, 5 }, // 0x01 MB_INTRA
40 { 1, 2 }, // 0x02 MB_PAT
41 { 1, 3 }, // 0x08 MB_FOR
42 { 1, 1 }, // 0x0A MB_FOR|MB_PAT
43 { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
44 { 1, 5 }, // 0x12 MB_QUANT|MB_PAT
45 { 2, 5 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
46};
47
48static const uint8_t table_mb_btype[11][2] = {
49 { 3, 5 }, // 0x01 MB_INTRA
50 { 2, 3 }, // 0x04 MB_BACK
51 { 3, 3 }, // 0x06 MB_BACK|MB_PAT
52 { 2, 4 }, // 0x08 MB_FOR
53 { 3, 4 }, // 0x0A MB_FOR|MB_PAT
54 { 2, 2 }, // 0x0C MB_FOR|MB_BACK
55 { 3, 2 }, // 0x0E MB_FOR|MB_BACK|MB_PAT
56 { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
57 { 2, 6 }, // 0x16 MB_QUANT|MB_BACK|MB_PAT
58 { 3, 6 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
59 { 2, 5 }, // 0x1E MB_QUANT|MB_FOR|MB_BACK|MB_PAT
60};
61
71
85
86av_cold void ff_init_2d_vlc_rl(const uint16_t table_vlc[][2], RL_VLC_ELEM rl_vlc[],
87 const int8_t table_run[], const uint8_t table_level[],
88 int n, unsigned static_size, int flags)
89{
90 ff_vlc_init_table_sparse(rl_vlc, static_size, TEX_VLC_BITS, n + 2,
91 &table_vlc[0][1], 4, 2, &table_vlc[0][0], 4, 2,
92 NULL, 0, 0, flags);
93
94 for (unsigned i = 0; i < static_size; i++) {
95 int idx = rl_vlc[i].sym;
96 int len = rl_vlc[i].len;
97 int level, run;
98
99 if (len == 0) { // illegal code
100 run = 65;
102 } else if (len<0) { //more bits needed
103 run = 0;
104 level = idx;
105 } else {
106 if (idx == n) { //esc
107 run = 65;
108 level = 0;
109 } else if (idx == n + 1) { //eob
110 run = 0;
111 level = 127;
112 } else {
113 run = table_run [idx] + 1;
114 level = table_level[idx];
115 }
116 }
117 rl_vlc[i].len8 = len;
118 rl_vlc[i].level = level;
119 rl_vlc[i].run = run;
120 }
121}
122
123
124/******************************************/
125/* decoding */
126
128
131
136
139
174
176{
177 static AVOnce init_static_once = AV_ONCE_INIT;
178 ff_thread_once(&init_static_once, mpeg12_init_vlcs);
179}
180
181#define MAX_INDEX (64 - 1)
182
184 const uint16_t *quant_matrix,
185 const uint8_t *scantable, int last_dc[3],
186 int16_t *block, int index, int qscale)
187{
188 int dc, diff, i = 0, component;
189
190 /* DC coefficient */
191 component = index <= 3 ? 0 : index - 4 + 1;
192
193 diff = decode_dc(gb, component);
194
195 dc = last_dc[component];
196 dc += diff;
197 last_dc[component] = dc;
198
199 block[0] = dc * quant_matrix[0];
200
201 {
202 OPEN_READER(re, gb);
203 UPDATE_CACHE(re, gb);
204 if (((int32_t)GET_CACHE(re, gb)) <= (int32_t)0xBFFFFFFF)
205 goto end;
206
207 /* now quantify & encode AC coefficients */
208 while (1) {
209 int level, run, j;
210
212 TEX_VLC_BITS, 2, 0);
213
214 if (level != 0) {
215 i += run;
216 if (i > MAX_INDEX)
217 break;
218
219 j = scantable[i];
220 level = (level * qscale * quant_matrix[j]) >> 4;
221 level = (level - 1) | 1;
222 level = (level ^ SHOW_SBITS(re, gb, 1)) -
223 SHOW_SBITS(re, gb, 1);
224 SKIP_BITS(re, gb, 1);
225 } else {
226 /* escape */
227 run = SHOW_UBITS(re, gb, 6) + 1;
228 LAST_SKIP_BITS(re, gb, 6);
229 UPDATE_CACHE(re, gb);
230 level = SHOW_SBITS(re, gb, 8);
231 SKIP_BITS(re, gb, 8);
232
233 if (level == -128) {
234 level = SHOW_UBITS(re, gb, 8) - 256;
235 SKIP_BITS(re, gb, 8);
236 } else if (level == 0) {
237 level = SHOW_UBITS(re, gb, 8);
238 SKIP_BITS(re, gb, 8);
239 }
240
241 i += run;
242 if (i > MAX_INDEX)
243 break;
244
245 j = scantable[i];
246 if (level < 0) {
247 level = -level;
248 level = (level * qscale * quant_matrix[j]) >> 4;
249 level = (level - 1) | 1;
250 level = -level;
251 } else {
252 level = (level * qscale * quant_matrix[j]) >> 4;
253 level = (level - 1) | 1;
254 }
255 }
256
257 block[j] = level;
258 if (((int32_t)GET_CACHE(re, gb)) <= (int32_t)0xBFFFFFFF)
259 break;
260
261 UPDATE_CACHE(re, gb);
262 }
263end:
264 LAST_SKIP_BITS(re, gb, 2);
265 CLOSE_READER(re, gb);
266 }
267
268 if (i > MAX_INDEX)
269 return AVERROR_INVALIDDATA;
270
271 return 0;
272}
int32_t
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define NULL
Definition coverity.c:32
static int16_t block[64]
Definition dct.c:125
#define TEX_VLC_BITS
Definition dvdec.c:146
#define GET_CACHE(name, gb)
Definition get_bits.h:251
#define CLOSE_READER(name, gb)
Definition get_bits.h:189
#define SHOW_UBITS(name, gb, num)
Definition get_bits.h:247
#define SHOW_SBITS(name, gb, num)
Definition get_bits.h:248
#define OPEN_READER(name, gb)
Definition get_bits.h:182
#define SKIP_BITS(name, gb, num)
Definition get_bits.h:229
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)
Definition get_bits.h:602
#define UPDATE_CACHE(name, gb)
Definition get_bits.h:213
#define LAST_SKIP_BITS(name, gb, num)
Definition get_bits.h:235
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
int index
Definition gxfenc.c:90
#define DC_VLC_BITS
Definition intrax8.c:41
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
static const VLCElem * rl_vlc[2]
Definition mobiclip.c:279
static av_cold void mpeg12_init_vlcs(void)
Definition mpeg12.c:140
VLCElem ff_mb_pat_vlc[512]
Definition mpeg12.c:135
static const uint8_t table_mb_btype[11][2]
Definition mpeg12.c:48
VLCElem ff_mbincr_vlc[538]
Definition mpeg12.c:132
VLCElem ff_mv_vlc[266]
Definition mpeg12.c:127
RL_VLC_ELEM ff_mpeg1_rl_vlc[680]
Definition mpeg12.c:137
static const uint8_t table_mb_ptype[7][2]
Definition mpeg12.c:38
RL_VLC_ELEM ff_mpeg2_rl_vlc[674]
Definition mpeg12.c:138
av_cold void ff_mpeg12_init_vlcs(void)
Definition mpeg12.c:175
VLCElem ff_dc_lum_vlc[512]
Definition mpeg12.c:129
static const int16_t btype2mb_type[11]
Definition mpeg12.c:72
VLCElem ff_mb_btype_vlc[64]
Definition mpeg12.c:134
static const int16_t ptype2mb_type[7]
Definition mpeg12.c:62
av_cold void ff_init_2d_vlc_rl(const uint16_t table_vlc[][2], RL_VLC_ELEM rl_vlc[], const int8_t table_run[], const uint8_t table_level[], int n, unsigned static_size, int flags)
Definition mpeg12.c:86
VLCElem ff_mb_ptype_vlc[64]
Definition mpeg12.c:133
VLCElem ff_dc_chroma_vlc[514]
Definition mpeg12.c:130
int ff_mpeg1_decode_block_intra(GetBitContext *gb, const uint16_t *quant_matrix, const uint8_t *scantable, int last_dc[3], int16_t *block, int index, int qscale)
Definition mpeg12.c:183
#define MAX_INDEX
Definition mpeg12.c:181
const uint16_t ff_mpeg12_vlc_dc_chroma_code[12]
Definition mpeg12data.c:60
const uint8_t ff_mpeg12_mbPatTable[64][2]
Definition mpeg12data.c:206
const int8_t ff_mpeg12_level[MPEG12_RL_NB_ELEMS]
Definition mpeg12data.c:133
const uint8_t ff_mpeg12_mbAddrIncrTable[36][2]
Definition mpeg12data.c:167
const uint16_t ff_mpeg12_vlc_dc_lum_code[12]
Definition mpeg12data.c:53
const int8_t ff_mpeg12_run[MPEG12_RL_NB_ELEMS]
Definition mpeg12data.c:150
const uint8_t ff_mpeg12_mbMotionVectorTable[17][2]
Definition mpeg12data.c:273
const unsigned char ff_mpeg12_vlc_dc_chroma_bits[12]
Definition mpeg12data.c:63
const uint16_t ff_mpeg1_vlc_table[MPEG12_RL_NB_ELEMS+2][2]
Definition mpeg12data.c:67
const unsigned char ff_mpeg12_vlc_dc_lum_bits[12]
Definition mpeg12data.c:56
const uint16_t ff_mpeg2_vlc_table[MPEG12_RL_NB_ELEMS+2][2]
Definition mpeg12data.c:100
MPEG-1/2 tables.
#define MB_TYPE_ZERO_MV
Definition mpeg12dec.h:28
static int decode_dc(GetBitContext *gb, int component)
Definition mpeg12dec.h:30
#define MB_BTYPE_VLC_BITS
Definition mpeg12vlc.h:40
#define MPEG12_RL_NB_ELEMS
Definition mpeg12vlc.h:52
#define MBINCR_VLC_BITS
Definition mpeg12vlc.h:37
#define MV_VLC_BITS
Definition mpeg12vlc.h:34
#define MB_PAT_VLC_BITS
Definition mpeg12vlc.h:38
#define MB_PTYPE_VLC_BITS
Definition mpeg12vlc.h:39
#define MB_TYPE_CBP
Definition mpegutils.h:47
#define MB_TYPE_QUANT
Definition mpegutils.h:48
#define MB_TYPE_BACKWARD_MV
Definition mpegutils.h:50
#define MB_TYPE_INTRA
Definition mpegutils.h:64
#define MB_TYPE_BIDIR_MV
Definition mpegutils.h:51
#define MB_TYPE_16x16
Definition mpegutils.h:41
#define MB_TYPE_FORWARD_MV
Definition mpegutils.h:49
rl header.
#define MAX_LEVEL
Definition rl.h:36
#define FF_ARRAY_ELEMS(a)
Definition vlc.h:32
uint8_t run
Definition svq3.c:207
uint8_t level
Definition svq3.c:208
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
av_cold void ff_vlc_init_table_sparse(VLCElem table[], int table_size, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Definition vlc.c:384
#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition vlc.h:278
#define VLC_INIT_STATIC_SPARSE_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, symbols, symbols_wrap, symbols_size, flags)
Definition vlc.h:266
VLCElem RL_VLC_ELEM
Definition vlc.h:48
int len