* MPEG-1/2 decoder
*/
-//#define DEBUG
+#include "libavutil/attributes.h"
#include "internal.h"
#include "avcodec.h"
-#include "dsputil.h"
#include "mpegvideo.h"
#include "error_resilience.h"
#include "mpeg12.h"
#include "mpeg12data.h"
-#include "mpeg12decdata.h"
+#include "mpegvideodata.h"
#include "bytestream.h"
-#include "vdpau_internal.h"
-#include "xvmc_internal.h"
#include "thread.h"
-//#undef NDEBUG
-//#include <assert.h>
-
uint8_t ff_mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
+static const uint8_t table_mb_ptype[7][2] = {
+ { 3, 5 }, // 0x01 MB_INTRA
+ { 1, 2 }, // 0x02 MB_PAT
+ { 1, 3 }, // 0x08 MB_FOR
+ { 1, 1 }, // 0x0A MB_FOR|MB_PAT
+ { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
+ { 1, 5 }, // 0x12 MB_QUANT|MB_PAT
+ { 2, 5 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
+};
+
+static const uint8_t table_mb_btype[11][2] = {
+ { 3, 5 }, // 0x01 MB_INTRA
+ { 2, 3 }, // 0x04 MB_BACK
+ { 3, 3 }, // 0x06 MB_BACK|MB_PAT
+ { 2, 4 }, // 0x08 MB_FOR
+ { 3, 4 }, // 0x0A MB_FOR|MB_PAT
+ { 2, 2 }, // 0x0C MB_FOR|MB_BACK
+ { 3, 2 }, // 0x0E MB_FOR|MB_BACK|MB_PAT
+ { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
+ { 2, 6 }, // 0x16 MB_QUANT|MB_BACK|MB_PAT
+ { 3, 6 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
+ { 2, 5 }, // 0x1E MB_QUANT|MB_FOR|MB_BACK|MB_PAT
+};
+
#define INIT_2D_VLC_RL(rl, static_size)\
{\
static RL_VLC_ELEM rl_vlc_table[static_size];\
init_2d_vlc_rl(&rl);\
}
-static void init_2d_vlc_rl(RLTable *rl)
+static av_cold void init_2d_vlc_rl(RLTable *rl)
{
int i;
}
}
-void ff_mpeg12_common_init(MpegEncContext *s)
+av_cold void ff_mpeg12_common_init(MpegEncContext *s)
{
s->y_dc_scale_table =
INIT_VLC_STATIC(&ff_mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
&table_mb_btype[0][1], 2, 1,
&table_mb_btype[0][0], 2, 1, 64);
- ff_init_rl(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]);
- ff_init_rl(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]);
+ ff_rl_init(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]);
+ ff_rl_init(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]);
INIT_2D_VLC_RL(ff_rl_mpeg1, 680);
INIT_2D_VLC_RL(ff_rl_mpeg2, 674);
pc->state = state;
return END_NOT_FOUND;
}
+
+#define MAX_INDEX (64 - 1)
+
+int ff_mpeg1_decode_block_intra(GetBitContext *gb,
+ const uint16_t *quant_matrix,
+ uint8_t *const scantable, int last_dc[3],
+ int16_t *block, int index, int qscale)
+{
+ int dc, diff, i = 0, component;
+ RLTable *rl = &ff_rl_mpeg1;
+
+ /* DC coefficient */
+ component = index <= 3 ? 0 : index - 4 + 1;
+
+ diff = decode_dc(gb, component);
+ if (diff >= 0xffff)
+ return AVERROR_INVALIDDATA;
+
+ dc = last_dc[component];
+ dc += diff;
+ last_dc[component] = dc;
+
+ block[0] = dc * quant_matrix[0];
+
+ {
+ OPEN_READER(re, gb);
+ /* now quantify & encode AC coefficients */
+ while (1) {
+ int level, run, j;
+
+ UPDATE_CACHE(re, gb);
+ GET_RL_VLC(level, run, re, gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
+
+ if (level == 127) {
+ break;
+ } else if (level != 0) {
+ i += run;
+ if (i > MAX_INDEX)
+ break;
+
+ j = scantable[i];
+ level = (level * qscale * quant_matrix[j]) >> 4;
+ level = (level - 1) | 1;
+ level = (level ^ SHOW_SBITS(re, gb, 1)) -
+ SHOW_SBITS(re, gb, 1);
+ LAST_SKIP_BITS(re, gb, 1);
+ } else {
+ /* escape */
+ run = SHOW_UBITS(re, gb, 6) + 1;
+ LAST_SKIP_BITS(re, gb, 6);
+ UPDATE_CACHE(re, gb);
+ level = SHOW_SBITS(re, gb, 8);
+ SKIP_BITS(re, gb, 8);
+
+ if (level == -128) {
+ level = SHOW_UBITS(re, gb, 8) - 256;
+ LAST_SKIP_BITS(re, gb, 8);
+ } else if (level == 0) {
+ level = SHOW_UBITS(re, gb, 8);
+ LAST_SKIP_BITS(re, gb, 8);
+ }
+
+ i += run;
+ if (i > MAX_INDEX)
+ break;
+
+ j = scantable[i];
+ if (level < 0) {
+ level = -level;
+ level = (level * qscale * quant_matrix[j]) >> 4;
+ level = (level - 1) | 1;
+ level = -level;
+ } else {
+ level = (level * qscale * quant_matrix[j]) >> 4;
+ level = (level - 1) | 1;
+ }
+ }
+
+ block[j] = level;
+ }
+ CLOSE_READER(re, gb);
+ }
+
+ if (i > MAX_INDEX)
+ i = AVERROR_INVALIDDATA;
+
+ return i;
+}