Go to the documentation of this file.
48 int nb_codes,
const uint8_t (*
tab)[2])
57 &
tab[0][1], 2, &
tab[0][0], 2, 1,
67 static VLCElem aic_mode2_table[11814];
73 if((
i % 10) == 9)
continue;
84 syms[j] = (
first << 8) | second;
86 syms[j] =
first | (second << 8);
140 int w =
r->s.width,
h =
r->s.height;
161 mb_size = ((
w + 15) >> 4) * ((
h + 15) >> 4);
179 for(
i = 0;
i < 4;
i++, dst +=
r->intra_types_stride){
180 if(!
i &&
s->first_slice_line){
182 dst[0] = (pattern >> 2) & 2;
183 dst[1] = (pattern >> 1) & 2;
184 dst[2] = pattern & 2;
185 dst[3] = (pattern << 1) & 2;
189 for(j = 0; j < 4; j++){
196 A = ptr[-
r->intra_types_stride + 1];
197 B = ptr[-
r->intra_types_stride];
199 pattern =
A +
B * (1 << 4) +
C * (1 << 8);
208 if(
B != -1 &&
C != -1)
239 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
241 if(!
r->s.mb_skip_run) {
243 if(
r->s.mb_skip_run > (
unsigned)
s->mb_num)
247 if(--
r->s.mb_skip_run)
250 if(
r->avail_cache[6-4]){
253 if(
r->avail_cache[6-1])
254 blocks[
r->mb_type[mb_pos - 1]]++;
255 blocks[
r->mb_type[mb_pos -
s->mb_stride]]++;
256 if(
r->avail_cache[6-2])
257 blocks[
r->mb_type[mb_pos -
s->mb_stride + 1]]++;
258 if(
r->avail_cache[6-5])
259 blocks[
r->mb_type[mb_pos -
s->mb_stride - 1]]++;
261 if(blocks[
i] > count){
268 }
else if (
r->avail_cache[6-1])
269 prev_type =
r->mb_type[mb_pos - 1];
296 #define MASK_CUR 0x0001
297 #define MASK_RIGHT 0x0008
298 #define MASK_BOTTOM 0x0010
299 #define MASK_TOP 0x1000
300 #define MASK_Y_TOP_ROW 0x000F
301 #define MASK_Y_LAST_ROW 0xF000
302 #define MASK_Y_LEFT_COL 0x1111
303 #define MASK_Y_RIGHT_COL 0x8888
304 #define MASK_C_TOP_ROW 0x0003
305 #define MASK_C_LAST_ROW 0x000C
306 #define MASK_C_LEFT_COL 0x0005
307 #define MASK_C_RIGHT_COL 0x000A
314 int lim_q1,
int lim_p1,
315 int alpha,
int beta,
int beta2,
316 int chroma,
int edge,
int dir)
318 int filter_p1, filter_q1;
323 edge, &filter_p1, &filter_q1);
325 lims = filter_p1 + filter_q1 + ((lim_q1 + lim_p1) >> 1) + 1;
330 }
else if (filter_p1 & filter_q1) {
332 lims, lim_q1, lim_p1);
333 }
else if (filter_p1 | filter_q1) {
335 alpha, beta, lims >> 1, lim_q1 >> 1,
349 int alpha, beta, betaY, betaC;
377 mb_pos = row *
s->mb_stride;
378 for(mb_x = 0; mb_x <
s->mb_width; mb_x++, mb_pos++){
379 int mbtype =
s->current_picture_ptr->mb_type[mb_pos];
381 r->cbp_luma [mb_pos] =
r->deblock_coefs[mb_pos] = 0xFFFF;
383 r->cbp_chroma[mb_pos] = 0xFF;
385 mb_pos = row *
s->mb_stride;
386 for(mb_x = 0; mb_x <
s->mb_width; mb_x++, mb_pos++){
387 int y_h_deblock, y_v_deblock;
388 int c_v_deblock[2], c_h_deblock[2];
391 unsigned y_to_deblock;
394 q =
s->current_picture_ptr->qscale_table[mb_pos];
397 betaY = betaC = beta * 3;
398 if(
s->width *
s->height <= 176*144)
404 avail[3] = row <
s->mb_height - 1;
405 for(
i = 0;
i < 4;
i++){
408 mvmasks[
i] =
r->deblock_coefs[
pos];
409 mbtype [
i] =
s->current_picture_ptr->mb_type[
pos];
410 cbp [
i] =
r->cbp_luma[
pos];
411 uvcbp[
i][0] =
r->cbp_chroma[
pos] & 0xF;
412 uvcbp[
i][1] =
r->cbp_chroma[
pos] >> 4;
415 mbtype [
i] = mbtype[0];
417 uvcbp[
i][0] = uvcbp[
i][1] = 0;
422 y_to_deblock = mvmasks[
POS_CUR]
430 y_h_deblock = y_to_deblock
439 y_v_deblock = y_to_deblock
451 for(
i = 0;
i < 2;
i++){
453 c_v_deblock[
i] = c_to_deblock[
i]
456 c_h_deblock[
i] = c_to_deblock[
i]
467 for(j = 0; j < 16; j += 4){
468 Y =
s->current_picture_ptr->f->data[0] + mb_x*16 + (row*16 + j) *
s->linesize;
469 for(
i = 0;
i < 4;
i++,
Y += 4){
480 clip_cur,
alpha, beta, betaY,
492 alpha, beta, betaY, 0, 0, 1);
499 alpha, beta, betaY, 0, 1, 0);
507 alpha, beta, betaY, 0, 1, 1);
511 for(k = 0; k < 2; k++){
512 for(j = 0; j < 2; j++){
513 C =
s->current_picture_ptr->f->data[k + 1] + mb_x*8 + (row*8 + j*4) *
s->uvlinesize;
514 for(
i = 0;
i < 2;
i++,
C += 4){
517 if(c_h_deblock[k] & (
MASK_CUR << (ij+2))){
522 alpha, beta, betaC, 1, 0, 0);
532 alpha, beta, betaC, 1, 0, 1);
539 alpha, beta, betaC, 1, 1, 0);
546 alpha, beta, betaC, 1, 1, 1);
AVPixelFormat
Pixel format.
int ff_vlc_init_from_lengths(VLC *vlc, 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()
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 const uint16_t table[]
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 VLC aic_mode1_vlc[AIC_MODE1_NUM]
static const int rv40_standard_heights[]
static av_cold void rv40_init_table(VLC *vlc, unsigned *offset, int nb_bits, int nb_codes, const uint8_t(*tab)[2])
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 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
#define FF_ARRAY_ELEMS(a)
av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
Initialize decoder.
static av_cold void rv40_init_tables(void)
Initialize all tables.
#define FF_CODEC_DECODE_CB(func)
static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
int(* init)(AVBSFContext *ctx)
static VLCElem vlc_buf[16716]
rv40_loop_filter_strength_func rv40_loop_filter_strength[2]
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
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
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 VLC aic_mode2_vlc[AIC_MODE2_NUM]
static const int rv40_standard_widths[]
standard widths and heights coded in RV40
void ff_mpeg_flush(AVCodecContext *avctx)
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
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
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.
#define VLC_INIT_STATIC_OVERLONG
rv40_weak_loop_filter_func rv40_weak_loop_filter[2]
static VLC btype_vlc[NUM_BTYPE_VLCS]
#define IS_SEPARATE_DC(a)
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
@ 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.
static const int16_t alpha[]
static VLC ptype_vlc[NUM_PTYPE_VLCS]
#define AIC_TOP_BITS
codes used for the first four block types
static const int neighbour_offs_x[4]
static const uint8_t rv40_aic_top_vlc_tab[AIC_TOP_SIZE][2]
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define VLC_INIT_USE_STATIC
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]