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_INTRAX8_H
20cabdff1aSopenharmony_ci#define AVCODEC_INTRAX8_H
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include "blockdsp.h"
23cabdff1aSopenharmony_ci#include "get_bits.h"
24cabdff1aSopenharmony_ci#include "idctdsp.h"
25cabdff1aSopenharmony_ci#include "intrax8dsp.h"
26cabdff1aSopenharmony_ci#include "wmv2dsp.h"
27cabdff1aSopenharmony_ci#include "mpegpicture.h"
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_citypedef struct IntraX8Context {
30cabdff1aSopenharmony_ci    VLC *j_ac_vlc[4]; // they point to the static j_mb_vlc
31cabdff1aSopenharmony_ci    VLC *j_orient_vlc;
32cabdff1aSopenharmony_ci    VLC *j_dc_vlc[3];
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci    int use_quant_matrix;
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci    // set by ff_intrax8_common_init
37cabdff1aSopenharmony_ci    uint8_t *prediction_table; // 2 * (mb_w * 2)
38cabdff1aSopenharmony_ci    ScanTable scantable[3];
39cabdff1aSopenharmony_ci    WMV2DSPContext wdsp;
40cabdff1aSopenharmony_ci    uint8_t idct_permutation[64];
41cabdff1aSopenharmony_ci    AVCodecContext *avctx;
42cabdff1aSopenharmony_ci    int *block_last_index;  ///< last nonzero coefficient in block
43cabdff1aSopenharmony_ci    int16_t (*block)[64];
44cabdff1aSopenharmony_ci
45cabdff1aSopenharmony_ci    // set by the caller codec
46cabdff1aSopenharmony_ci    IntraX8DSPContext dsp;
47cabdff1aSopenharmony_ci    IDCTDSPContext idsp;
48cabdff1aSopenharmony_ci    BlockDSPContext bdsp;
49cabdff1aSopenharmony_ci    int quant;
50cabdff1aSopenharmony_ci    int dquant;
51cabdff1aSopenharmony_ci    int qsum;
52cabdff1aSopenharmony_ci    int loopfilter;
53cabdff1aSopenharmony_ci    AVFrame *frame;
54cabdff1aSopenharmony_ci    GetBitContext *gb;
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci    // calculated per frame
57cabdff1aSopenharmony_ci    int quant_dc_chroma;
58cabdff1aSopenharmony_ci    int divide_quant_dc_luma;
59cabdff1aSopenharmony_ci    int divide_quant_dc_chroma;
60cabdff1aSopenharmony_ci    uint8_t *dest[3];
61cabdff1aSopenharmony_ci    uint8_t scratchpad[42]; // size of the block is fixed (8x8 plus padding)
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci    // changed per block
64cabdff1aSopenharmony_ci    int edges;
65cabdff1aSopenharmony_ci    int flat_dc;
66cabdff1aSopenharmony_ci    int predicted_dc;
67cabdff1aSopenharmony_ci    int raw_orient;
68cabdff1aSopenharmony_ci    int chroma_orient;
69cabdff1aSopenharmony_ci    int orient;
70cabdff1aSopenharmony_ci    int est_run;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci    // block props
73cabdff1aSopenharmony_ci    int mb_x, mb_y;
74cabdff1aSopenharmony_ci    int mb_width, mb_height;
75cabdff1aSopenharmony_ci} IntraX8Context;
76cabdff1aSopenharmony_ci
77cabdff1aSopenharmony_ci/**
78cabdff1aSopenharmony_ci * Initialize IntraX8 frame decoder.
79cabdff1aSopenharmony_ci * @param avctx pointer to AVCodecContext
80cabdff1aSopenharmony_ci * @param w pointer to IntraX8Context
81cabdff1aSopenharmony_ci * @param idsp pointer to IDCTDSPContext
82cabdff1aSopenharmony_ci * @param block pointer to block array
83cabdff1aSopenharmony_ci * @param block_last_index pointer to index array
84cabdff1aSopenharmony_ci * @param mb_width macroblock width
85cabdff1aSopenharmony_ci * @param mb_height macroblock height
86cabdff1aSopenharmony_ci * @return 0 on success, a negative AVERROR value on error
87cabdff1aSopenharmony_ci */
88cabdff1aSopenharmony_ciint ff_intrax8_common_init(AVCodecContext *avctx,
89cabdff1aSopenharmony_ci                           IntraX8Context *w, IDCTDSPContext *idsp,
90cabdff1aSopenharmony_ci                           int16_t (*block)[64],
91cabdff1aSopenharmony_ci                           int block_last_index[12],
92cabdff1aSopenharmony_ci                           int mb_width, int mb_height);
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci/**
95cabdff1aSopenharmony_ci * Destroy IntraX8 frame structure.
96cabdff1aSopenharmony_ci * @param w pointer to IntraX8Context
97cabdff1aSopenharmony_ci */
98cabdff1aSopenharmony_civoid ff_intrax8_common_end(IntraX8Context *w);
99cabdff1aSopenharmony_ci
100cabdff1aSopenharmony_ci/**
101cabdff1aSopenharmony_ci * Decode single IntraX8 frame.
102cabdff1aSopenharmony_ci * lowres decoding is theoretically impossible.
103cabdff1aSopenharmony_ci * @param w pointer to IntraX8Context
104cabdff1aSopenharmony_ci * @param pict the output Picture containing an AVFrame
105cabdff1aSopenharmony_ci * @param gb open bitstream reader
106cabdff1aSopenharmony_ci * @param mb_x pointer to the x coordinate of the current macroblock
107cabdff1aSopenharmony_ci * @param mb_y pointer to the y coordinate of the current macroblock
108cabdff1aSopenharmony_ci * @param dquant doubled quantizer, it would be odd in case of VC-1 halfpq==1.
109cabdff1aSopenharmony_ci * @param quant_offset offset away from zero
110cabdff1aSopenharmony_ci * @param loopfilter enable filter after decoding a block
111cabdff1aSopenharmony_ci */
112cabdff1aSopenharmony_ciint ff_intrax8_decode_picture(IntraX8Context *w, Picture *pict,
113cabdff1aSopenharmony_ci                              GetBitContext *gb, int *mb_x, int *mb_y,
114cabdff1aSopenharmony_ci                              int quant, int halfpq,
115cabdff1aSopenharmony_ci                              int loopfilter, int lowdelay);
116cabdff1aSopenharmony_ci
117cabdff1aSopenharmony_ci#endif /* AVCODEC_INTRAX8_H */
118