FFmpeg/libavcodec/intrax8.h
Vittorio Giovara 922b7e6d86 intrax8: Use local destination buffers
These buffers are just a way to store frame pointers and be able to
modify them without touching the original ones.

The two dependent decoders (WMV2 and VC1) do not need special care for
these fields: the former does not seem to use the dest buffers, while
the latter reinits them every time to the current frame data buffers.

So only keep a local copy rather than the one from mpegvideo.
2016-03-25 15:51:50 -04:00

88 lines
2.6 KiB
C

/*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_INTRAX8_H
#define AVCODEC_INTRAX8_H
#include "get_bits.h"
#include "mpegvideo.h"
#include "intrax8dsp.h"
typedef struct IntraX8Context {
VLC *j_ac_vlc[4]; // they point to the static j_mb_vlc
VLC *j_orient_vlc;
VLC *j_dc_vlc[3];
int use_quant_matrix;
// set by ff_intrax8_common_init
uint8_t *prediction_table; // 2 * (mb_w * 2)
ScanTable scantable[3];
// set by the caller codec
MpegEncContext *s;
IntraX8DSPContext dsp;
int quant;
int dquant;
int qsum;
// calculated per frame
int quant_dc_chroma;
int divide_quant_dc_luma;
int divide_quant_dc_chroma;
uint8_t *dest[3];
// changed per block
int edges;
int flat_dc;
int predicted_dc;
int raw_orient;
int chroma_orient;
int orient;
int est_run;
} IntraX8Context;
/**
* Initialize IntraX8 frame decoder.
* Requires valid MpegEncContext with valid s->mb_width before calling.
* @param w pointer to IntraX8Context
* @param s pointer to MpegEncContext of the parent codec
* @return 0 on success, a negative AVERROR value on error
*/
int ff_intrax8_common_init(IntraX8Context *w, MpegEncContext *const s);
/**
* Destroy IntraX8 frame structure.
* @param w pointer to IntraX8Context
*/
void ff_intrax8_common_end(IntraX8Context *w);
/**
* Decode single IntraX8 frame.
* The parent codec must fill s->loopfilter and s->gb (bitstream).
* The parent codec must call ff_mpv_frame_start() before calling this function.
* The parent codec must call ff_mpv_frame_end() after calling this function.
* This function does not use ff_mpv_decode_mb().
* @param w pointer to IntraX8Context
* @param dquant doubled quantizer, it would be odd in case of VC-1 halfpq==1.
* @param quant_offset offset away from zero
*/
int ff_intrax8_decode_picture(IntraX8Context *w, int quant, int halfpq);
#endif /* AVCODEC_INTRAX8_H */