Go to the documentation of this file.
48 int nb_codes,
const uint8_t (*
tab)[2])
51 &
tab[0][1], 2, &
tab[0][0], 2, 1,
67 if((
i % 10) == 9)
continue;
79 syms[j] = (
first << 8) | second;
81 syms[j] =
first | (second << 8);
135 int w =
r->s.width,
h =
r->s.height;
156 mb_size = ((
w + 15) >> 4) * ((
h + 15) >> 4);
174 for(
i = 0;
i < 4;
i++, dst +=
r->intra_types_stride){
175 if(!
i &&
s->first_slice_line){
177 dst[0] = (pattern >> 2) & 2;
178 dst[1] = (pattern >> 1) & 2;
179 dst[2] = pattern & 2;
180 dst[3] = (pattern << 1) & 2;
184 for(j = 0; j < 4; j++){
191 A = ptr[-
r->intra_types_stride + 1];
192 B = ptr[-
r->intra_types_stride];
194 pattern =
A +
B * (1 << 4) +
C * (1 << 8);
203 if(
B != -1 &&
C != -1)
234 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
236 if(!
r->s.mb_skip_run) {
238 if(
r->s.mb_skip_run > (
unsigned)
s->mb_num)
242 if(--
r->s.mb_skip_run)
245 if(
r->avail_cache[6-4]){
248 if(
r->avail_cache[6-1])
249 blocks[
r->mb_type[mb_pos - 1]]++;
250 blocks[
r->mb_type[mb_pos -
s->mb_stride]]++;
251 if(
r->avail_cache[6-2])
252 blocks[
r->mb_type[mb_pos -
s->mb_stride + 1]]++;
253 if(
r->avail_cache[6-5])
254 blocks[
r->mb_type[mb_pos -
s->mb_stride - 1]]++;
256 if(blocks[
i] > count){
263 }
else if (
r->avail_cache[6-1])
264 prev_type =
r->mb_type[mb_pos - 1];
291 #define MASK_CUR 0x0001
292 #define MASK_RIGHT 0x0008
293 #define MASK_BOTTOM 0x0010
294 #define MASK_TOP 0x1000
295 #define MASK_Y_TOP_ROW 0x000F
296 #define MASK_Y_LAST_ROW 0xF000
297 #define MASK_Y_LEFT_COL 0x1111
298 #define MASK_Y_RIGHT_COL 0x8888
299 #define MASK_C_TOP_ROW 0x0003
300 #define MASK_C_LAST_ROW 0x000C
301 #define MASK_C_LEFT_COL 0x0005
302 #define MASK_C_RIGHT_COL 0x000A
309 int lim_q1,
int lim_p1,
310 int alpha,
int beta,
int beta2,
311 int chroma,
int edge,
int dir)
313 int filter_p1, filter_q1;
318 edge, &filter_p1, &filter_q1);
320 lims = filter_p1 + filter_q1 + ((lim_q1 + lim_p1) >> 1) + 1;
325 }
else if (filter_p1 & filter_q1) {
327 lims, lim_q1, lim_p1);
328 }
else if (filter_p1 | filter_q1) {
330 alpha, beta, lims >> 1, lim_q1 >> 1,
344 int alpha, beta, betaY, betaC;
372 mb_pos = row *
s->mb_stride;
373 for(mb_x = 0; mb_x <
s->mb_width; mb_x++, mb_pos++){
374 int mbtype =
s->current_picture_ptr->mb_type[mb_pos];
376 r->cbp_luma [mb_pos] =
r->deblock_coefs[mb_pos] = 0xFFFF;
378 r->cbp_chroma[mb_pos] = 0xFF;
380 mb_pos = row *
s->mb_stride;
381 for(mb_x = 0; mb_x <
s->mb_width; mb_x++, mb_pos++){
382 int y_h_deblock, y_v_deblock;
383 int c_v_deblock[2], c_h_deblock[2];
386 unsigned y_to_deblock;
389 q =
s->current_picture_ptr->qscale_table[mb_pos];
392 betaY = betaC = beta * 3;
393 if(
s->width *
s->height <= 176*144)
399 avail[3] = row <
s->mb_height - 1;
400 for(
i = 0;
i < 4;
i++){
403 mvmasks[
i] =
r->deblock_coefs[
pos];
404 mbtype [
i] =
s->current_picture_ptr->mb_type[
pos];
405 cbp [
i] =
r->cbp_luma[
pos];
406 uvcbp[
i][0] =
r->cbp_chroma[
pos] & 0xF;
407 uvcbp[
i][1] =
r->cbp_chroma[
pos] >> 4;
410 mbtype [
i] = mbtype[0];
412 uvcbp[
i][0] = uvcbp[
i][1] = 0;
417 y_to_deblock = mvmasks[
POS_CUR]
425 y_h_deblock = y_to_deblock
434 y_v_deblock = y_to_deblock
446 for(
i = 0;
i < 2;
i++){
448 c_v_deblock[
i] = c_to_deblock[
i]
451 c_h_deblock[
i] = c_to_deblock[
i]
462 for(j = 0; j < 16; j += 4){
463 Y =
s->current_picture_ptr->f->data[0] + mb_x*16 + (row*16 + j) *
s->linesize;
464 for(
i = 0;
i < 4;
i++,
Y += 4){
475 clip_cur,
alpha, beta, betaY,
487 alpha, beta, betaY, 0, 0, 1);
494 alpha, beta, betaY, 0, 1, 0);
502 alpha, beta, betaY, 0, 1, 1);
506 for(k = 0; k < 2; k++){
507 for(j = 0; j < 2; j++){
508 C =
s->current_picture_ptr->f->data[k + 1] + mb_x*8 + (row*8 + j*4) *
s->uvlinesize;
509 for(
i = 0;
i < 2;
i++,
C += 4){
512 if(c_h_deblock[k] & (
MASK_CUR << (ij+2))){
517 alpha, beta, betaC, 1, 0, 0);
527 alpha, beta, betaC, 1, 0, 1);
534 alpha, beta, betaC, 1, 1, 0);
541 alpha, beta, betaC, 1, 1, 1);
static const uint16_t rv40_aic_table_index[MODE2_PATTERNS_NUM]
intra types table
static int get_bits_left(GetBitContext *gb)
av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
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)
static const uint8_t aic_mode2_vlc_bits[AIC_MODE2_NUM][AIC_MODE2_SIZE]
int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
Decode starting slice position.
static unsigned get_interleaved_ue_golomb(GetBitContext *gb)
int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
static void rv40_loop_filter(RV34DecContext *r, int row)
RV40 loop filtering function.
static const uint8_t aic_mode2_vlc_syms[AIC_MODE2_NUM][AIC_MODE2_SIZE]
static const int rv40_standard_heights[]
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static av_cold int rv40_decode_init(AVCodecContext *avctx)
Initialize decoder.
AVCodec p
The public AVCodec.
#define MODE2_PATTERNS_NUM
static const VLCElem * ptype_vlc[NUM_PTYPE_VLCS]
static const struct twinvq_data tab
static double val(void *priv, double ch)
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
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AIC_MODE2_NUM
codes used for determining a pair of block types
av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
Initialize decoder.
static av_cold void rv40_init_tables(void)
Initialize all tables.
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
#define FF_CODEC_DECODE_CB(func)
static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
rv40_loop_filter_strength_func rv40_loop_filter_strength[2]
static const VLCElem * btype_vlc[NUM_BTYPE_VLCS]
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.
#define CODEC_LONG_NAME(str)
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
@ RV34_MB_SKIP
Skipped block.
int type
slice type (intra, inter)
const FFCodec ff_rv40_decoder
static unsigned int get_bits1(GetBitContext *s)
#define UPDATE_THREAD_CONTEXT(func)
#define NUM_BTYPE_VLCS
tables used for P-frame macroblock type decoding
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static int rv40_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
Decode 4x4 intra types array.
int quant
quantizer used for this slice
static const av_cold VLCElem * rv40_init_table(VLCInitState *state, int nb_bits, int nb_codes, const uint8_t(*tab)[2])
int(* init)(AVBSFContext *ctx)
int vlc_set
VLCs used for this slice.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
int ff_rv34_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_picture_ptr, AVPacket *avpkt)
static int rv40_decode_mb_info(RV34DecContext *r)
Decode macroblock information.
#define FF_CODEC_CAP_ALLOCATE_PROGRESS
static const uint8_t rv40_alpha_tab[32]
alpha parameter for RV40 loop filter - almost the same as in JVT-A003r1
static const int rv40_standard_widths[]
standard widths and heights coded in RV40
void ff_mpeg_flush(AVCodecContext *avctx)
static const uint8_t btype_vlc_tabs[NUM_BTYPE_VLCS][BTYPE_VLC_SIZE][2]
static void skip_bits1(GetBitContext *s)
#define AIC_MODE1_NUM
Codes used for determining block type.
#define NUM_PTYPE_VLCS
tables used for P-frame macroblock type decoding
static int get_dimension(GetBitContext *gb, const int *dim)
Get stored dimension from bitstream.
rv40_strong_loop_filter_func rv40_strong_loop_filter[2]
static const uint8_t rv40_filter_clip_tbl[3][32]
clip table for RV40 loop filter - the same as in JVT-A003r1
#define i(width, name, range_min, range_max)
static const uint8_t rv40_beta_tab[32]
beta parameter for RV40 loop filter - almost the same as in JVT-A003r1
static const VLCElem * aic_mode2_vlc[AIC_MODE2_NUM]
const char * name
Name of the codec implementation.
essential slice information
static const uint8_t block_num_to_btype_vlc_num[12]
static const int neighbour_offs_y[4]
main external API structure.
rv40_weak_loop_filter_func rv40_weak_loop_filter[2]
#define IS_SEPARATE_DC(a)
static VLCElem aic_top_vlc[23590]
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
const av_cold VLCElem * ff_vlc_init_tables_from_lengths(VLCInitState *state, 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)
@ AV_PICTURE_TYPE_P
Predicted.
static const uint8_t rv40_luma_dc_quant[2][32]
luma quantizer values The second table is used for inter blocks.
#define VLC_INIT_STATE(_table)
static const int16_t alpha[]
#define AIC_TOP_BITS
codes used for the first four block types
static const int neighbour_offs_x[4]
static const VLCElem * aic_mode1_vlc[AIC_MODE1_NUM]
static const uint8_t rv40_aic_top_vlc_tab[AIC_TOP_SIZE][2]
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
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...
void ff_rv40dsp_init(RV34DSPContext *c)
static const uint8_t ptype_vlc_tabs[NUM_PTYPE_VLCS][PTYPE_VLC_SIZE][2]
static const uint8_t block_num_to_ptype_vlc_num[12]
static const uint8_t aic_mode1_vlc_tabs[AIC_MODE1_NUM][AIC_MODE1_SIZE][2]
static const uint8_t dither[8][8]