113 #define QUALITY_THRESHOLD    100   114 #define THRESHOLD_MULTIPLIER 0.6   118                         int threshold, 
int lambda, 
int intra)
   120     int count, 
y, 
x, 
i, j, 
split, best_mean, best_score, best_count;
   122     int block_sum[7] = { 0, 0, 0, 0, 0, 0 };
   123     int w            = 2 << (level + 2 >> 1);
   124     int h            = 2 << (level + 1 >> 1);
   126     int16_t block[7][256];
   127     const int8_t *codebook_sum, *codebook;
   128     const uint16_t(*mean_vlc)[2];
   129     const uint8_t(*multistage_vlc)[2];
   138         for (y = 0; y < h; y++) {
   139             for (x = 0; x < 
w; x++) {
   141                 block[0][x + w * 
y] = 
v;
   151         for (y = 0; y < h; y++) {
   152             for (x = 0; x < 
w; x++) {
   154                 block[0][x + w * 
y] = 
v;
   162     best_score -= (int)((
unsigned)block_sum[0] * block_sum[0] >> (level + 3));
   163     best_mean   = block_sum[0] + (size >> 1) >> (level + 3);
   166         for (count = 1; count < 7; count++) {
   167             int best_vector_score = INT_MAX;
   168             int best_vector_sum   = -999, best_vector_mean = -999;
   169             const int stage       = count - 1;
   170             const int8_t *vector;
   172             for (i = 0; i < 16; i++) {
   173                 int sum = codebook_sum[stage * 16 + 
i];
   174                 int sqr, 
diff, score;
   176                 vector = codebook + stage * size * 16 + i * 
size;
   178                 diff   = block_sum[stage] - sum;
   179                 score  = sqr - (diff * (int64_t)diff >> (level + 3)); 
   180                 if (score < best_vector_score) {
   181                     int mean = diff + (size >> 1) >> (level + 3);
   183                     mean               = av_clip(mean, intra ? 0 : -256, 255);
   184                     best_vector_score  = score;
   185                     best_vector[stage] = 
i;
   186                     best_vector_sum    = sum;
   187                     best_vector_mean   = mean;
   191             vector = codebook + stage * size * 16 + best_vector[stage] * 
size;
   192             for (j = 0; j < 
size; j++)
   193                 block[stage + 1][j] = block[stage][j] - vector[j];
   194             block_sum[stage + 1] = block_sum[stage] - best_vector_sum;
   195             best_vector_score   += lambda *
   197                                     multistage_vlc[1 + 
count][1]
   198                                     + mean_vlc[best_vector_mean][1]);
   200             if (best_vector_score < best_score) {
   201                 best_score = best_vector_score;
   203                 best_mean  = best_vector_mean;
   209     if (best_score > threshold && level) {
   211         int offset = level & 1 ? stride * h / 2 : w / 2;
   214         for (i = level - 1; i >= 0; i--)
   216         score += 
encode_block(s, src, ref, decoded, stride, level - 1,
   217                               threshold >> 1, lambda, intra);
   218         score += 
encode_block(s, src + offset, ref + offset, decoded + offset,
   219                               stride, level - 1, threshold >> 1, lambda, intra);
   222         if (score < best_score) {
   226             for (i = level - 1; i >= 0; i--)
   234         av_assert1(best_mean >= 0 && best_mean < 256 || !intra);
   235         av_assert1(best_mean >= -256 && best_mean < 256);
   236         av_assert1(best_count >= 0 && best_count < 7);
   241                  multistage_vlc[1 + best_count][1],
   242                  multistage_vlc[1 + best_count][0]);
   244                  mean_vlc[best_mean][0]);
   246         for (i = 0; i < best_count; i++) {
   247             av_assert2(best_vector[i] >= 0 && best_vector[i] < 16);
   251         for (y = 0; y < h; y++)
   252             for (x = 0; x < 
w; x++)
   253                 decoded[x + y * stride] = src[x + y * stride] -
   254                                           block[best_count][x + w * y] +
   262                              unsigned char *src_plane,
   263                              unsigned char *ref_plane,
   264                              unsigned char *decoded_plane,
   269     int block_width, block_height;
   278     for (level = 4; level >= 0; level--)
   281     block_width  = (width  + 15) / 16;
   282     block_height = (height + 15) / 16;
   316                                                  block_height * 2 + 2) *
   317                                                 2 * 
sizeof(int16_t));
   319                                                  (block_height + 2) + 1) *
   320                                                 2 * 
sizeof(int16_t));
   339         for (y = 0; y < block_height; y++) {
   343             for (i = 0; i < 16 && i + 16 * y < 
height; i++) {
   344                 memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
   346                 for (x = width; x < 16 * block_width; x++)
   347                     src[i * stride + x] = src[i * stride + x - 1];
   349             for (; i < 16 && i + 16 * y < 16 * block_height; i++)
   350                 memcpy(&src[i * stride], &src[(i - 1) * stride],
   353             for (x = 0; x < block_width; x++) {
   369     for (y = 0; y < block_height; y++) {
   370         for (i = 0; i < 16 && i + 16 * y < 
height; i++) {
   371             memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
   373             for (x = width; x < 16 * block_width; x++)
   374                 src[i * stride + x] = src[i * stride + x - 1];
   376         for (; i < 16 && i + 16 * y < 16 * block_height; i++)
   377             memcpy(&src[i * stride], &src[(i - 1) * stride], 16 * block_width);
   380         for (x = 0; x < block_width; x++) {
   381             uint8_t reorder_buffer[3][6][7 * 32];
   383             int offset       = y * 16 * stride + x * 16;
   386             int score[4]     = { 0, 0, 0, 0 }, best;
   402                 for (i = 0; i < 6; i++)
   408                     score[0] = vlc[1] * lambda;
   412                 for (i = 0; i < 6; i++) {
   423                 int mx, my, pred_x, pred_y, dxy;
   429                     for (i = 0; i < 6; i++)
   447                     dxy = (mx & 1) + 2 * (my & 1);
   455                                              decoded, stride, 5, 64, lambda, 0);
   456                     best      = score[1] <= score[0];
   461                     score[2] += vlc[1] * lambda;
   462                     if (score[2] < score[best] && mx == 0 && my == 0) {
   465                         for (i = 0; i < 6; i++)
   472                     for (i = 0; i < 6; i++) {
   490             for (i = 5; i >= 0; i--)
   536                              const AVFrame *pict, 
int *got_packet)
   572     for (i = 0; i < 3; i++)
   613     for (i = 0; i < 3; i++) {
 uint8_t * scratchpad
data area for the ME algo, so that the ME does not need to malloc/free 
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
void ff_init_block_index(MpegEncContext *s)
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
This structure describes decoded (raw) audio or video data. 
FIXME Range Coding of cr are ref
int16_t(* p_mv_table)[2]
MV table (1MV per MB) p-frame encoding. 
void ff_estimate_p_frame_motion(MpegEncContext *s, int mb_x, int mb_y)
uint8_t * mb_mean
Table for MB luminance. 
#define THRESHOLD_MULTIPLIER
void ff_h263_encode_init(MpegEncContext *s)
AVFrame * coded_frame
the picture in the bitstream 
static av_cold int init(AVCodecContext *avctx)
uint16_t * mb_var
Table for MB variances. 
static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref, uint8_t *decoded, int stride, int level, int threshold, int lambda, int intra)
#define CANDIDATE_MB_TYPE_INTRA
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream. 
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx. 
uint32_t * score_map
map to store the scores 
#define FF_ARRAY_ELEMS(a)
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
output residual component w
static const int8_t svq1_intra_codebook_sum[4][16 *6]
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
const uint16_t ff_svq1_frame_size_table[7][2]
#define av_assert0(cond)
assert() equivalent, that is always enabled. 
static av_cold int svq1_encode_init(AVCodecContext *avctx)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code. 
static int svq1_encode_plane(SVQ1Context *s, int plane, unsigned char *src_plane, unsigned char *ref_plane, unsigned char *decoded_plane, int width, int height, int src_stride, int stride)
const int8_t *const ff_svq1_inter_codebooks[6]
Picture current_picture
copy of the current picture structure. 
int mb_height
number of MBs horizontally & vertically 
struct SVQ1Context SVQ1Context
static void ff_update_block_index(MpegEncContext *s)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe. 
static void svq1_write_header(SVQ1Context *s, int frame_type)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
simple assert() macros that are a bit more flexible than ISO C assert(). 
#define CANDIDATE_MB_TYPE_INTER
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation. 
uint16_t * mb_type
Table for candidate MB types for encoding. 
static const uint8_t offset[127][2]
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit 
int flags
A combination of AV_PKT_FLAG values. 
Sorenson Vector Quantizer #1 (SVQ1) video codec. 
static int put_bits_count(PutBitContext *s)
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
void ff_h263_encode_motion(MpegEncContext *s, int val, int f_code)
enum AVPictureType pict_type
Picture type of the frame. 
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code. 
#define FF_MIN_BUFFER_SIZE
minimum encoding buffer size Used to avoid some checks during header writing. 
int me_method
ME algorithm. 
Picture new_picture
copy of the source picture structure for encoding. 
const uint8_t ff_svq1_block_type_vlc[4][2]
int width
picture width / height. 
int16_t(*[2] motion_val)[2]
Picture * current_picture_ptr
pointer to the current picture 
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad)) 
#define diff(a, as, b, bs)
FIXME Range Coding of cr are level
Note except for filters that can have queued request_frame does not push and as a the filter_frame method will be called and do the work Legacy the filter_frame method was split
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data. 
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
static av_cold int svq1_encode_end(AVCodecContext *avctx)
int first_slice_line
used in mpeg4 too to handle resync markers 
uint16_t * mc_mb_var
Table for motion compensated MB variances. 
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT 
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line. 
main external API structure. 
static void close(AVCodecParserContext *s)
int height
picture size. must be a multiple of 16 
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame. 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1. 
void ff_fix_long_p_mvs(MpegEncContext *s)
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) 
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
synthesis window for stochastic i
DSPContext dsp
pointers for accelerated dsp functions 
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields. 
int16_t(*[3] motion_val16)[2]
int f_code
forward MV resolution 
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ... 
int ff_init_me(MpegEncContext *s)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes. 
int16_t(*[3] motion_val8)[2]
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing 
struct AVCodecContext * avctx
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only 
PutBitContext pb
bit output 
const int8_t *const ff_svq1_intra_codebooks[6]
common internal api header. 
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers. 
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros. 
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
Picture last_picture
copy of the previous picture structure. 
Picture * last_picture_ptr
pointer to the previous picture. 
static const int8_t svq1_inter_codebook_sum[4][16 *6]
const uint16_t ff_svq1_inter_mean_vlc[512][2]
int(* ssd_int8_vs_int16)(const int8_t *pix1, const int16_t *pix2, int size)
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s. 
uint32_t * map
map to avoid duplicate evaluations 
int dia_size
ME diamond size & shape. 
int key_frame
1 -> keyframe, 0-> not 
int linesize
line size, in bytes, may be different from width 
void ff_fix_long_mvs(MpegEncContext *s, uint8_t *field_select_table, int field_select, int16_t(*mv_table)[2], int f_code, int type, int truncate)
static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
PutBitContext reorder_pb[6]
int frame_number
Frame counter, set by libavcodec. 
int flags
AVCodecContext.flags (HQ, MV4, ...) 
#define QUALITY_THRESHOLD
int me_method
Motion estimation algorithm used for video coding. 
AVPixelFormat
Pixel format. 
This structure stores compressed data. 
const uint16_t ff_svq1_intra_mean_vlc[256][2]
int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
Return the index into tab at which {a,b} match elements {[0],[1]} of tab. 
unsigned int lambda
lagrange multipler used in rate distortion