51 *offset += 1 << nb_bits;
54 &
tab[0][1], 2, &
tab[0][0], 2, 1,
64 static VLC_TYPE aic_mode2_table[11814][2];
70 if((i % 10) == 9)
continue;
81 syms[j] = (first << 8) | second;
83 syms[j] = first | (second << 8);
158 mb_size = ((w + 15) >> 4) * ((
h + 15) >> 4);
179 dst[0] = (pattern >> 2) & 2;
180 dst[1] = (pattern >> 1) & 2;
181 dst[2] = pattern & 2;
182 dst[3] = (pattern << 1) & 2;
186 for(j = 0; j < 4; j++){
196 pattern = A + B * (1 << 4) + C * (1 << 8);
200 if(j < 3 && k < MODE2_PATTERNS_NUM){
205 if(B != -1 && C != -1)
251 blocks[r->
mb_type[mb_pos - 1]]++;
258 if(blocks[i] > count){
266 prev_type = r->
mb_type[mb_pos - 1];
293 #define MASK_CUR 0x0001 294 #define MASK_RIGHT 0x0008 295 #define MASK_BOTTOM 0x0010 296 #define MASK_TOP 0x1000 297 #define MASK_Y_TOP_ROW 0x000F 298 #define MASK_Y_LAST_ROW 0xF000 299 #define MASK_Y_LEFT_COL 0x1111 300 #define MASK_Y_RIGHT_COL 0x8888 301 #define MASK_C_TOP_ROW 0x0003 302 #define MASK_C_LAST_ROW 0x000C 303 #define MASK_C_LEFT_COL 0x0005 304 #define MASK_C_RIGHT_COL 0x000A 311 int lim_q1,
int lim_p1,
312 int alpha,
int beta,
int beta2,
313 int chroma,
int edge,
int dir)
315 int filter_p1, filter_q1;
320 edge, &filter_p1, &filter_q1);
322 lims = filter_p1 + filter_q1 + ((lim_q1 + lim_p1) >> 1) + 1;
327 }
else if (filter_p1 & filter_q1) {
329 lims, lim_q1, lim_p1);
330 }
else if (filter_p1 | filter_q1) {
332 alpha, beta, lims >> 1, lim_q1 >> 1,
346 int alpha, beta, betaY, betaC;
375 for(mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_pos++){
383 for(mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_pos++){
384 int y_h_deblock, y_v_deblock;
385 int c_v_deblock[2], c_h_deblock[2];
388 unsigned y_to_deblock;
394 betaY = betaC = beta * 3;
402 for(i = 0; i < 4; i++){
404 int pos = mb_pos + neighbour_offs_x[
i] + neighbour_offs_y[
i]*s->
mb_stride;
412 mbtype [
i] = mbtype[0];
414 uvcbp[
i][0] = uvcbp[
i][1] = 0;
419 y_to_deblock = mvmasks[
POS_CUR]
427 y_h_deblock = y_to_deblock
436 y_v_deblock = y_to_deblock
448 for(i = 0; i < 2; i++){
450 c_v_deblock[
i] = c_to_deblock[
i]
453 c_h_deblock[
i] = c_to_deblock[
i]
464 for(j = 0; j < 16; j += 4){
466 for(i = 0; i < 4; i++, Y += 4){
469 int dither = j ? ij : i*4;
477 clip_cur, alpha, beta, betaY,
489 alpha, beta, betaY, 0, 0, 1);
495 mvmasks[POS_TOP] & (
MASK_TOP << i) ? clip[POS_TOP] : 0,
496 alpha, beta, betaY, 0, 1, 0);
499 if(y_v_deblock & (
MASK_CUR << ij) && !i && (mb_strong[
POS_CUR] | mb_strong[POS_LEFT])){
504 alpha, beta, betaY, 0, 1, 1);
508 for(k = 0; k < 2; k++){
509 for(j = 0; j < 2; j++){
511 for(i = 0; i < 2; i++, C += 4){
514 if(c_h_deblock[k] & (
MASK_CUR << (ij+2))){
515 int clip_bot = c_to_deblock[k] & (
MASK_CUR << (ij+2)) ? clip[
POS_CUR] : 0;
519 alpha, beta, betaC, 1, 0, 0);
525 clip_left = c_to_deblock[k] & (
MASK_CUR << (ij-1)) ? clip[
POS_CUR] : 0;
529 alpha, beta, betaC, 1, 0, 1);
536 alpha, beta, betaC, 1, 1, 0);
538 if(c_v_deblock[k] & (
MASK_CUR << ij) && !i && (mb_strong[
POS_CUR] | mb_strong[POS_LEFT])){
543 alpha, beta, betaC, 1, 1, 1);
562 if(!aic_top_vlc.
bits)
int vlc_set
VLCs used for this slice.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static av_cold void rv40_init_tables(void)
Initialize all tables.
static void flush(AVCodecContext *avctx)
uint32_t avail_cache[3 *4]
8x8 block available flags (for MV prediction)
#define IS_SEPARATE_DC(a)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
rv40_loop_filter_strength_func rv40_loop_filter_strength[2]
static av_cold int init(AVCodecContext *avctx)
#define FF_ARRAY_ELEMS(a)
static const uint8_t btype_vlc_tabs[NUM_BTYPE_VLCS][BTYPE_VLC_SIZE][2]
#define MODE2_PATTERNS_NUM
static void rv40_parse_picture_size(GetBitContext *gb, int *w, int *h)
Get encoded picture size - usually this is called from rv40_parse_slice_header.
RV30 and RV40 decoder common data declarations.
int mb_num
number of MBs of a picture
const uint8_t * luma_dc_quant_p
luma subblock DC quantizer for interframes
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static const uint8_t rv40_beta_tab[32]
beta parameter for RV40 loop filter - almost the same as in JVT-A003r1
static const int neighbour_offs_x[4]
static VLC btype_vlc[NUM_BTYPE_VLCS]
static const uint8_t block_num_to_ptype_vlc_num[12]
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
uint16_t * cbp_luma
CBP values for luma subblocks.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
rv40_weak_loop_filter_func rv40_weak_loop_filter[2]
uint16_t * deblock_coefs
deblock coefficients for each macroblock
static const int rv40_standard_heights[]
static const uint8_t rv40_luma_dc_quant[2][32]
luma quantizer values The second table is used for inter blocks.
static void rv40_adaptive_loop_filter(RV34DSPContext *rdsp, uint8_t *src, int stride, int dmode, int lim_q1, int lim_p1, int alpha, int beta, int beta2, int chroma, int edge, int dir)
int mb_height
number of MBs horizontally & vertically
static const uint8_t aic_mode2_vlc_syms[AIC_MODE2_NUM][AIC_MODE2_SIZE]
static const uint16_t table[]
#define FF_CODEC_CAP_ALLOCATE_PROGRESS
static VLC aic_mode2_vlc[AIC_MODE2_NUM]
int quant
quantizer used for this slice
static int get_bits_left(GetBitContext *gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const uint8_t block_num_to_btype_vlc_num[12]
static const uint8_t rv40_filter_clip_tbl[3][32]
clip table for RV40 loop filter - the same as in JVT-A003r1
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static const uint8_t dither[8][8]
static int rv40_decode_mb_info(RV34DecContext *r)
Decode macroblock information.
const char * name
Name of the codec implementation.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
void ff_mpeg_flush(AVCodecContext *avctx)
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
int(* parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
static VLC ptype_vlc[NUM_PTYPE_VLCS]
int * mb_type
internal macroblock types
static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
#define AIC_MODE2_NUM
codes used for determining a pair of block types
Picture * current_picture_ptr
pointer to the current picture
static av_cold int rv40_decode_init(AVCodecContext *avctx)
Initialize decoder.
static const uint16_t rv40_aic_table_index[MODE2_PATTERNS_NUM]
intra types table
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
static VLC aic_mode1_vlc[AIC_MODE1_NUM]
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going which in turn will define variables for the build system and the C
int(* decode_mb_info)(struct RV34DecContext *r)
int first_slice_line
used in MPEG-4 too to handle resync markers
essential slice information
Libavcodec external API header.
static const uint8_t aic_mode1_vlc_tabs[AIC_MODE1_NUM][AIC_MODE1_SIZE][2]
ptrdiff_t linesize
line size, in bytes, may be different from width
static const int16_t alpha[]
main external API structure.
static const uint8_t ptype_vlc_tabs[NUM_PTYPE_VLCS][PTYPE_VLC_SIZE][2]
int height
picture size. must be a multiple of 16
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits1(GetBitContext *s)
static const uint8_t rv40_aic_top_vlc_tab[AIC_TOP_SIZE][2]
int ff_init_vlc_from_lengths(VLC *vlc_arg, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
Initialize decoder.
ptrdiff_t uvlinesize
line size, for chroma in bytes, may be different from width
int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_picture_ptr, AVPacket *avpkt)
int intra_types_stride
block types array stride
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
static enum AVPixelFormat pix_fmts[]
int(* decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst)
static const int rv40_standard_widths[]
standard widths and heights coded in RV40
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
struct AVCodecContext * avctx
GLint GLenum GLboolean GLsizei stride
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static int get_dimension(GetBitContext *gb, const int *dim)
Get stored dimension from bitstream.
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
static double clip(void *opaque, double val)
Clip value val in the minval - maxval range.
static av_cold void rv40_init_table(VLC *vlc, unsigned *offset, int nb_bits, int nb_codes, const uint8_t(*tab)[2])
#define INIT_VLC_USE_NEW_STATIC
rv40_strong_loop_filter_func rv40_strong_loop_filter[2]
int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
#define AIC_TOP_BITS
codes used for the first four block types
int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
Decode starting slice position.
#define NUM_BTYPE_VLCS
tables used for P-frame macroblock type decoding
RV40 VLC tables used for macroblock information decoding.
VLC_TYPE(* table)[2]
code, bits
static const uint8_t rv40_alpha_tab[32]
alpha parameter for RV40 loop filter - almost the same as in JVT-A003r1
#define AIC_MODE1_NUM
Codes used for determining block type.
static const struct twinvq_data tab
const uint8_t * luma_dc_quant_i
luma subblock DC quantizer for intraframes
static VLC_TYPE vlc_buf[16716][2]
static int rv40_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
Decode 4x4 intra types array.
#define NUM_PTYPE_VLCS
tables used for P-frame macroblock type decoding
uint32_t * mb_type
types and macros are defined in mpegutils.h
int type
slice type (intra, inter)
static unsigned get_interleaved_ue_golomb(GetBitContext *gb)
miscellaneous RV40 tables
static const int neighbour_offs_y[4]
int rv30
indicates which RV variant is currently decoded
#define INIT_VLC_STATIC_OVERLONG
AVPixelFormat
Pixel format.
static double val(void *priv, double ch)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
void(* loop_filter)(struct RV34DecContext *r, int row)
static void rv40_loop_filter(RV34DecContext *r, int row)
RV40 loop filtering function.
static const uint8_t aic_mode2_vlc_bits[AIC_MODE2_NUM][AIC_MODE2_SIZE]
uint8_t * cbp_chroma
CBP values for chroma subblocks.