FFmpeg
svq1enc.c
Go to the documentation of this file.
1 /*
2  * SVQ1 Encoder
3  * Copyright (C) 2004 Mike Melanson <melanson@pcisys.net>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Sorenson Vector Quantizer #1 (SVQ1) video codec.
25  * For more information of the SVQ1 algorithm, visit:
26  * http://www.pcisys.net/~melanson/codecs/
27  */
28 
29 #include "libavutil/emms.h"
30 #include "libavutil/mem.h"
31 #include "avcodec.h"
32 #include "codec_internal.h"
33 #include "encode.h"
34 #include "hpeldsp.h"
35 #include "me_cmp.h"
36 #include "mpegvideo.h"
37 #include "h263.h"
38 #include "h263enc.h"
39 #include "internal.h"
40 #include "mpegutils.h"
41 #include "packet_internal.h"
42 #include "put_bits.h"
43 #include "svq1.h"
44 #include "svq1encdsp.h"
45 #include "svq1enc_cb.h"
46 #include "version.h"
47 
48 #include "libavutil/avassert.h"
49 #include "libavutil/frame.h"
50 #include "libavutil/mem_internal.h"
51 
52 // Workaround for GCC bug 102513
53 #if AV_GCC_VERSION_AT_LEAST(10, 0) && AV_GCC_VERSION_AT_MOST(12, 0) \
54  && !defined(__clang__) && !defined(__INTEL_COMPILER)
55 #pragma GCC optimize ("no-ipa-cp-clone")
56 #endif
57 
58 typedef struct SVQ1EncContext {
59  /* FIXME: Needed for motion estimation, should not be used for anything
60  * else, the idea is to make the motion estimation eventually independent
61  * of MPVEncContext, so this will be removed then. */
67 
68  /* Some compression statistics */
70  int quality;
71 
72  /* why ooh why this sick breadth first order,
73  * everything is slower and more complex */
75 
78 
79  /* Y plane block dimensions */
82 
83  DECLARE_ALIGNED(16, int16_t, encoded_block_levels)[6][7][256];
84 
85  uint16_t *mb_type;
86  uint32_t *dummy;
87  int16_t (*motion_val8[3])[2];
88  int16_t (*motion_val16[3])[2];
89 
91 
92  uint8_t *scratchbuf;
93 
96 
98 {
99  int i;
100 
101  /* frame code */
102  put_bits(pb, 22, 0x20);
103 
104  /* temporal reference (sure hope this is a "don't care") */
105  put_bits(pb, 8, 0x00);
106 
107  /* frame type */
108  put_bits(pb, 2, frame_type - 1);
109 
110  if (frame_type == AV_PICTURE_TYPE_I) {
111  /* no checksum since frame code is 0x20 */
112  /* no embedded string either */
113  /* output 5 unknown bits (2 + 2 + 1) */
114  put_bits(pb, 5, 2); /* 2 needed by quicktime decoder */
115 
118  s->frame_width, s->frame_height);
119  put_bits(pb, 3, i);
120 
121  if (i == 7) {
122  put_bits(pb, 12, s->frame_width);
123  put_bits(pb, 12, s->frame_height);
124  }
125  }
126 
127  /* no checksum or extra data (next 2 bits get 0) */
128  put_bits(pb, 2, 0);
129 }
130 
131 #define QUALITY_THRESHOLD 100
132 #define THRESHOLD_MULTIPLIER 0.6
133 
134 static int encode_block(SVQ1EncContext *s, uint8_t *src, uint8_t *ref,
135  uint8_t *decoded, int stride, unsigned level,
136  int threshold, int lambda, int intra)
137 {
138  int count, y, x, i, j, split, best_mean, best_score, best_count;
139  int best_vector[6];
140  int block_sum[7] = { 0, 0, 0, 0, 0, 0 };
141  int w = 2 << (level + 2 >> 1);
142  int h = 2 << (level + 1 >> 1);
143  int size = w * h;
144  int16_t (*block)[256] = s->encoded_block_levels[level];
145  const int8_t *codebook_sum, *codebook;
146  const uint16_t(*mean_vlc)[2];
147  const uint8_t(*multistage_vlc)[2];
148 
149  best_score = 0;
150  // FIXME: Optimize, this does not need to be done multiple times.
151  if (intra) {
152  // level is 5 when encode_block is called from svq1_encode_plane
153  // and always < 4 when called recursively from this function.
154  codebook_sum = level < 4 ? svq1_intra_codebook_sum[level] : NULL;
156  mean_vlc = ff_svq1_intra_mean_vlc;
157  multistage_vlc = ff_svq1_intra_multistage_vlc[level];
158  for (y = 0; y < h; y++) {
159  for (x = 0; x < w; x++) {
160  int v = src[x + y * stride];
161  block[0][x + w * y] = v;
162  best_score += v * v;
163  block_sum[0] += v;
164  }
165  }
166  } else {
167  // level is 5 or < 4, see above for details.
168  codebook_sum = level < 4 ? svq1_inter_codebook_sum[level] : NULL;
170  mean_vlc = ff_svq1_inter_mean_vlc + 256;
171  multistage_vlc = ff_svq1_inter_multistage_vlc[level];
172  for (y = 0; y < h; y++) {
173  for (x = 0; x < w; x++) {
174  int v = src[x + y * stride] - ref[x + y * stride];
175  block[0][x + w * y] = v;
176  best_score += v * v;
177  block_sum[0] += v;
178  }
179  }
180  }
181 
182  best_count = 0;
183  best_score -= (int)((unsigned)block_sum[0] * block_sum[0] >> (level + 3));
184  best_mean = block_sum[0] + (size >> 1) >> (level + 3);
185 
186  if (level < 4) {
187  for (count = 1; count < 7; count++) {
188  int best_vector_score = INT_MAX;
189  int best_vector_sum = -999, best_vector_mean = -999;
190  const int stage = count - 1;
191  const int8_t *vector;
192 
193  for (i = 0; i < 16; i++) {
194  int sum = codebook_sum[stage * 16 + i];
195  int sqr, diff, score;
196 
197  vector = codebook + stage * size * 16 + i * size;
198  sqr = s->svq1encdsp.ssd_int8_vs_int16(vector, block[stage], size);
199  diff = block_sum[stage] - sum;
200  score = sqr - (diff * (int64_t)diff >> (level + 3)); // FIXME: 64 bits slooow
201  if (score < best_vector_score) {
202  int mean = diff + (size >> 1) >> (level + 3);
203  av_assert2(mean > -300 && mean < 300);
204  mean = av_clip(mean, intra ? 0 : -256, 255);
205  best_vector_score = score;
206  best_vector[stage] = i;
207  best_vector_sum = sum;
208  best_vector_mean = mean;
209  }
210  }
211  av_assert0(best_vector_mean != -999);
212  vector = codebook + stage * size * 16 + best_vector[stage] * size;
213  for (j = 0; j < size; j++)
214  block[stage + 1][j] = block[stage][j] - vector[j];
215  block_sum[stage + 1] = block_sum[stage] - best_vector_sum;
216  best_vector_score += lambda *
217  (+1 + 4 * count +
218  multistage_vlc[1 + count][1]
219  + mean_vlc[best_vector_mean][1]);
220 
221  if (best_vector_score < best_score) {
222  best_score = best_vector_score;
223  best_count = count;
224  best_mean = best_vector_mean;
225  }
226  }
227  }
228 
229  if (best_mean == -128)
230  best_mean = -127;
231  else if (best_mean == 128)
232  best_mean = 127;
233 
234  split = 0;
235  if (best_score > threshold && level) {
236  int score = 0;
237  int offset = level & 1 ? stride * h / 2 : w / 2;
238  PutBitContext backup[6];
239 
240  for (i = level - 1; i >= 0; i--)
241  backup[i] = s->reorder_pb[i];
242  score += encode_block(s, src, ref, decoded, stride, level - 1,
243  threshold >> 1, lambda, intra);
244  score += encode_block(s, src + offset, ref + offset, decoded + offset,
245  stride, level - 1, threshold >> 1, lambda, intra);
246  score += lambda;
247 
248  if (score < best_score) {
249  best_score = score;
250  split = 1;
251  } else {
252  for (i = level - 1; i >= 0; i--)
253  s->reorder_pb[i] = backup[i];
254  }
255  }
256  if (level > 0)
257  put_bits(&s->reorder_pb[level], 1, split);
258 
259  if (!split) {
260  av_assert1(best_mean >= 0 && best_mean < 256 || !intra);
261  av_assert1(best_mean >= -256 && best_mean < 256);
262  av_assert1(best_count >= 0 && best_count < 7);
263  av_assert1(level < 4 || best_count == 0);
264 
265  /* output the encoding */
266  put_bits(&s->reorder_pb[level],
267  multistage_vlc[1 + best_count][1],
268  multistage_vlc[1 + best_count][0]);
269  put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
270  mean_vlc[best_mean][0]);
271 
272  for (i = 0; i < best_count; i++) {
273  av_assert2(best_vector[i] >= 0 && best_vector[i] < 16);
274  put_bits(&s->reorder_pb[level], 4, best_vector[i]);
275  }
276 
277  for (y = 0; y < h; y++)
278  for (x = 0; x < w; x++)
279  decoded[x + y * stride] = src[x + y * stride] -
280  block[best_count][x + w * y] +
281  best_mean;
282  }
283 
284  return best_score;
285 }
286 
287 static void init_block_index(MpegEncContext *const s)
288 {
289  s->block_index[0]= s->b8_stride*(s->mb_y*2 ) + s->mb_x*2;
290  s->block_index[1]= s->b8_stride*(s->mb_y*2 ) + 1 + s->mb_x*2;
291  s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) + s->mb_x*2;
292  s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) + 1 + s->mb_x*2;
293 }
294 
295 static int svq1_encode_plane(SVQ1EncContext *s, int plane,
296  PutBitContext *pb,
297  const unsigned char *src_plane,
298  unsigned char *ref_plane,
299  unsigned char *decoded_plane,
300  int width, int height, int src_stride, int stride)
301 {
302  MpegEncContext *const s2 = &s->m.c;
303  int x, y;
304  int i;
305  int block_width, block_height;
306  int level;
307  int threshold[6];
308  uint8_t *src = s->scratchbuf + stride * 32;
309  const int lambda = (s->quality * s->quality) >>
310  (2 * FF_LAMBDA_SHIFT);
311 
312  /* figure out the acceptable level thresholds in advance */
313  threshold[5] = QUALITY_THRESHOLD;
314  for (level = 4; level >= 0; level--)
315  threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
316 
317  block_width = (width + 15) / 16;
318  block_height = (height + 15) / 16;
319 
320  if (s->pict_type == AV_PICTURE_TYPE_P) {
321  s2->last_pic.data[0] = ref_plane;
322  s2->linesize =
323  s2->last_pic.linesize[0] =
324  s->m.new_pic->linesize[0] =
325  s2->cur_pic.linesize[0] = stride;
326  s2->width = width;
327  s2->height = height;
328  s2->mb_width = block_width;
329  s2->mb_height = block_height;
330  s2->mb_stride = s2->mb_width + 1;
331  s2->b8_stride = 2 * s2->mb_width + 1;
332  s->m.f_code = 1;
333  s2->pict_type = s->pict_type;
334  s->m.me.scene_change_score = 0;
335  // s2->out_format = FMT_H263;
336  // s2->unrestricted_mv = 1;
337  s->m.lambda = s->quality;
338  s2->qscale = s->m.lambda * 139 +
339  FF_LAMBDA_SCALE * 64 >>
340  FF_LAMBDA_SHIFT + 7;
341  s->m.lambda2 = s->m.lambda * s->m.lambda +
342  FF_LAMBDA_SCALE / 2 >>
344 
345  s->m.mb_type = s->mb_type;
346 
347  // dummies, to avoid segfaults
348  s->m.mb_mean = (uint8_t *)s->dummy;
349  s->m.mb_var = (uint16_t *)s->dummy;
350  s->m.mc_mb_var = (uint16_t *)s->dummy;
351  s2->cur_pic.mb_type = s->dummy;
352 
353  s2->cur_pic.motion_val[0] = s->motion_val8[plane] + 2;
354  s->m.p_mv_table = s->motion_val16[plane] +
355  s2->mb_stride + 1;
356  ff_me_init_pic(&s->m);
357 
358  s->m.me.dia_size = s->avctx->dia_size;
359  s2->first_slice_line = 1;
360  for (y = 0; y < block_height; y++) {
361  s->m.new_pic->data[0] = src - y * 16 * stride; // ugly
362  s2->mb_y = y;
363 
364  for (i = 0; i < 16 && i + 16 * y < height; i++) {
365  memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
366  width);
367  for (x = width; x < 16 * block_width; x++)
368  src[i * stride + x] = src[i * stride + x - 1];
369  }
370  for (; i < 16 && i + 16 * y < 16 * block_height; i++)
371  memcpy(&src[i * stride], &src[(i - 1) * stride],
372  16 * block_width);
373 
374  for (x = 0; x < block_width; x++) {
375  s2->mb_x = x;
376  init_block_index(s2);
377 
378  ff_estimate_p_frame_motion(&s->m, x, y);
379  }
380  s2->first_slice_line = 0;
381  }
382 
384  ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code,
386  }
387 
388  s2->first_slice_line = 1;
389  for (y = 0; y < block_height; y++) {
390  for (i = 0; i < 16 && i + 16 * y < height; i++) {
391  memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
392  width);
393  for (x = width; x < 16 * block_width; x++)
394  src[i * stride + x] = src[i * stride + x - 1];
395  }
396  for (; i < 16 && i + 16 * y < 16 * block_height; i++)
397  memcpy(&src[i * stride], &src[(i - 1) * stride], 16 * block_width);
398 
399  s2->mb_y = y;
400  for (x = 0; x < block_width; x++) {
401  uint8_t reorder_buffer[2][6][7 * 32];
402  int count[2][6];
403  int offset = y * 16 * stride + x * 16;
404  uint8_t *decoded = decoded_plane + offset;
405  const uint8_t *ref = ref_plane + offset;
406  int score[4] = { 0, 0, 0, 0 }, best;
407  uint8_t *temp = s->scratchbuf;
408 
409  if (put_bytes_left(pb, 0) < 3000) { // FIXME: check size
410  av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
411  return -1;
412  }
413 
414  s2->mb_x = x;
415  init_block_index(s2);
416 
417  if (s->pict_type == AV_PICTURE_TYPE_I ||
418  (s->m.mb_type[x + y * s2->mb_stride] &
420  for (i = 0; i < 6; i++)
421  init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i],
422  7 * 32);
423  if (s->pict_type == AV_PICTURE_TYPE_P) {
425  score[0] = SVQ1_BLOCK_INTRA_LEN * lambda;
426  }
427  score[0] += encode_block(s, src + 16 * x, src + 16 * x /* unused */,
428  temp, stride, 5, 64, lambda, 1);
429  for (i = 0; i < 6; i++) {
430  count[0][i] = put_bits_count(&s->reorder_pb[i]);
431  flush_put_bits(&s->reorder_pb[i]);
432  }
433  } else
434  score[0] = INT_MAX;
435 
436  best = 0;
437 
438  if (s->pict_type == AV_PICTURE_TYPE_P) {
439  int mx, my, pred_x, pred_y, dxy;
440  int16_t *motion_ptr;
441 
442  motion_ptr = ff_h263_pred_motion(s2, 0, 0, &pred_x, &pred_y);
443  if (s->m.mb_type[x + y * s2->mb_stride] &
445  for (i = 0; i < 6; i++)
446  init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i],
447  7 * 32);
448 
450 
451  mx = motion_ptr[0];
452  my = motion_ptr[1];
453  av_assert1(mx >= -32 && mx <= 31);
454  av_assert1(my >= -32 && my <= 31);
455  av_assert1(pred_x >= -32 && pred_x <= 31);
456  av_assert1(pred_y >= -32 && pred_y <= 31);
457  ff_h263_encode_motion(&s->reorder_pb[5], mx - pred_x, 1);
458  ff_h263_encode_motion(&s->reorder_pb[5], my - pred_y, 1);
459  score[1] += lambda * put_bits_count(&s->reorder_pb[5]);
460 
461  dxy = (mx & 1) + 2 * (my & 1);
462 
463  s2->hdsp.put_pixels_tab[0][dxy](temp + 16*stride,
464  ref + (mx >> 1) +
465  stride * (my >> 1),
466  stride, 16);
467 
468  score[1] += encode_block(s, src + 16 * x, temp + 16*stride,
469  decoded, stride, 5, 64, lambda, 0);
470  best = score[1] <= score[0];
471 
472  score[2] = s->mecc.sse[0](NULL, src + 16 * x, ref,
473  stride, 16);
474  score[2] += SVQ1_BLOCK_SKIP_LEN * lambda;
475  if (score[2] < score[best] && mx == 0 && my == 0) {
476  best = 2;
477  s2->hdsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
479  }
480  }
481 
482  if (best == 1) {
483  for (i = 0; i < 6; i++) {
484  count[1][i] = put_bits_count(&s->reorder_pb[i]);
485  flush_put_bits(&s->reorder_pb[i]);
486  }
487  } else {
488  motion_ptr[0] =
489  motion_ptr[1] =
490  motion_ptr[2] =
491  motion_ptr[3] =
492  motion_ptr[0 + 2 * s2->b8_stride] =
493  motion_ptr[1 + 2 * s2->b8_stride] =
494  motion_ptr[2 + 2 * s2->b8_stride] =
495  motion_ptr[3 + 2 * s2->b8_stride] = 0;
496  }
497  }
498 
499  s->rd_total += score[best];
500 
501  if (best != 2)
502  for (i = 5; i >= 0; i--)
503  ff_copy_bits(pb, reorder_buffer[best][i],
504  count[best][i]);
505  if (best == 0)
506  s2->hdsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
507  }
508  s2->first_slice_line = 0;
509  }
510  return 0;
511 }
512 
514 {
515  SVQ1EncContext *const s = avctx->priv_data;
516  int i;
517 
518  if (avctx->frame_num)
519  av_log(avctx, AV_LOG_DEBUG, "RD: %f\n",
520  s->rd_total / (double)(avctx->width * avctx->height *
521  avctx->frame_num));
522 
523  av_freep(&s->m.me.scratchpad);
524  av_freep(&s->mb_type);
525  av_freep(&s->dummy);
526  av_freep(&s->scratchbuf);
527 
528  for (i = 0; i < 3; i++) {
529  av_freep(&s->motion_val8[i]);
530  av_freep(&s->motion_val16[i]);
531  }
532 
533  av_frame_free(&s->current_picture);
534  av_frame_free(&s->last_picture);
535  av_frame_free(&s->m.new_pic);
536 
537  return 0;
538 }
539 
540 static av_cold int write_ident(AVCodecContext *avctx, const char *ident)
541 {
542  int size = strlen(ident);
543  avctx->extradata = av_malloc(size + 8);
544  if (!avctx->extradata)
545  return AVERROR(ENOMEM);
546  AV_WB32(avctx->extradata, size + 8);
547  AV_WL32(avctx->extradata + 4, MKTAG('S', 'V', 'Q', '1'));
548  memcpy(avctx->extradata + 8, ident, size);
549  avctx->extradata_size = size + 8;
550  return 0;
551 }
552 
554 {
555  SVQ1EncContext *const s = avctx->priv_data;
556  int ret;
557 
558  if (avctx->width >= 4096 || avctx->height >= 4096) {
559  av_log(avctx, AV_LOG_ERROR, "Dimensions too large, maximum is 4095x4095\n");
560  return AVERROR(EINVAL);
561  }
562 
563  ff_hpeldsp_init(&s->m.c.hdsp, avctx->flags);
564  ff_me_cmp_init(&s->mecc, avctx);
565  ret = ff_me_init(&s->m.me, avctx, &s->mecc, 0);
566  if (ret < 0)
567  return ret;
568  ff_mpegvideoencdsp_init(&s->m.mpvencdsp, avctx);
569 
570  s->current_picture = av_frame_alloc();
571  s->last_picture = av_frame_alloc();
572  if (!s->current_picture || !s->last_picture) {
573  return AVERROR(ENOMEM);
574  }
575  ret = ff_encode_alloc_frame(avctx, s->current_picture);
576  if (ret < 0)
577  return ret;
578  ret = ff_encode_alloc_frame(avctx, s->last_picture);
579  if (ret < 0)
580  return ret;
581  s->scratchbuf = av_malloc_array(s->current_picture->linesize[0], 16 * 3);
582  if (!s->scratchbuf)
583  return AVERROR(ENOMEM);
584 
585  s->frame_width = avctx->width;
586  s->frame_height = avctx->height;
587 
588  s->y_block_width = (s->frame_width + 15) / 16;
589  s->y_block_height = (s->frame_height + 15) / 16;
590 
591  s->avctx = avctx;
592  s->m.c.avctx = avctx;
593 
594  for (size_t plane = 0; plane < FF_ARRAY_ELEMS(s->motion_val16); ++plane) {
595  const int shift = plane ? 2 : 0;
596  unsigned block_height = ((s->frame_height >> shift) + 15U) / 16;
597  unsigned block_width = ((s->frame_width >> shift) + 15U) / 16;
598 
599  s->motion_val8[plane] = av_calloc((2 * block_width + 1) * block_height * 2 + 2,
600  2 * sizeof(int16_t));
601  s->motion_val16[plane] = av_calloc((block_width + 1) * (block_height + 2) + 1,
602  2 * sizeof(int16_t));
603  if (!s->motion_val8[plane] || !s->motion_val16[plane])
604  return AVERROR(ENOMEM);
605  }
606 
607  s->m.c.picture_structure = PICT_FRAME;
608  s->m.me.temp =
609  s->m.me.scratchpad = av_mallocz((avctx->width + 64) *
610  2 * 16 * 2 * sizeof(uint8_t));
611  s->mb_type = av_mallocz((s->y_block_width + 1) *
612  s->y_block_height * sizeof(int16_t));
613  s->dummy = av_mallocz((s->y_block_width + 1) *
614  s->y_block_height * sizeof(int32_t));
615  s->m.new_pic = av_frame_alloc();
616 
617  if (!s->m.me.scratchpad ||
618  !s->mb_type || !s->dummy || !s->m.new_pic)
619  return AVERROR(ENOMEM);
620 
621  ff_svq1enc_init(&s->svq1encdsp);
622 
623  s->m.me.mv_penalty = ff_h263_get_mv_penalty();
624 
625  return write_ident(avctx, s->avctx->flags & AV_CODEC_FLAG_BITEXACT ? "Lavc" : LIBAVCODEC_IDENT);
626 }
627 
629  const AVFrame *pict, int *got_packet)
630 {
631  SVQ1EncContext *const s = avctx->priv_data;
632  PutBitContext pb;
633  int i, ret;
634 
635  ret = ff_alloc_packet(avctx, pkt, s->y_block_width * s->y_block_height *
637  if (ret < 0)
638  return ret;
639 
640  FFSWAP(AVFrame*, s->current_picture, s->last_picture);
641 
642  if (avctx->gop_size && (avctx->frame_num % avctx->gop_size))
643  s->pict_type = AV_PICTURE_TYPE_P;
644  else
645  s->pict_type = AV_PICTURE_TYPE_I;
646  s->quality = pict->quality;
647 
648  ff_side_data_set_encoder_stats(pkt, pict->quality, NULL, 0, s->pict_type);
649 
650  init_put_bits(&pb, pkt->data, pkt->size);
651  svq1_write_header(s, &pb, s->pict_type);
652  for (i = 0; i < 3; i++) {
653  int ret = svq1_encode_plane(s, i, &pb,
654  pict->data[i],
655  s->last_picture->data[i],
656  s->current_picture->data[i],
657  s->frame_width / (i ? 4 : 1),
658  s->frame_height / (i ? 4 : 1),
659  pict->linesize[i],
660  s->current_picture->linesize[i]);
661  emms_c();
662  if (ret < 0)
663  return ret;
664  }
665 
666  // align_put_bits(&pb);
667  while (put_bits_count(&pb) & 31)
668  put_bits(&pb, 1, 0);
669 
670  flush_put_bits(&pb);
671 
672  pkt->size = put_bytes_output(&pb);
673  if (s->pict_type == AV_PICTURE_TYPE_I)
675  *got_packet = 1;
676 
677  return 0;
678 }
679 
680 #define OFFSET(x) offsetof(struct SVQ1EncContext, x)
681 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
682 static const AVOption options[] = {
683  { "motion-est", "Motion estimation algorithm", OFFSET(m.me.motion_est), AV_OPT_TYPE_INT, { .i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, VE, .unit = "motion-est"},
684  { "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
685  { "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
686  { "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
687 
688  { NULL },
689 };
690 
691 static const AVClass svq1enc_class = {
692  .class_name = "svq1enc",
693  .item_name = av_default_item_name,
694  .option = options,
695  .version = LIBAVUTIL_VERSION_INT,
696 };
697 
699  .p.name = "svq1",
700  CODEC_LONG_NAME("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
701  .p.type = AVMEDIA_TYPE_VIDEO,
702  .p.id = AV_CODEC_ID_SVQ1,
704  .priv_data_size = sizeof(SVQ1EncContext),
705  .p.priv_class = &svq1enc_class,
706  .init = svq1_encode_init,
708  .close = svq1_encode_end,
710  .color_ranges = AVCOL_RANGE_MPEG,
711  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
712 };
PICT_FRAME
#define PICT_FRAME
Definition: mpegutils.h:33
ff_fix_long_p_mvs
void ff_fix_long_p_mvs(MPVEncContext *const s, int type)
Definition: motion_est.c:1661
ff_fix_long_mvs
void ff_fix_long_mvs(MPVEncContext *const s, uint8_t *field_select_table, int field_select, int16_t(*mv_table)[2], int f_code, int type, int truncate)
Definition: motion_est.c:1710
MPVWorkPicture::linesize
ptrdiff_t linesize[MPV_MAX_PLANES]
Definition: mpegpicture.h:97
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:386
level
uint8_t level
Definition: svq3.c:208
av_clip
#define av_clip
Definition: common.h:100
MPVEncContext
Definition: mpegvideoenc.h:45
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
FF_LAMBDA_SCALE
#define FF_LAMBDA_SCALE
Definition: avutil.h:225
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
LIBAVCODEC_IDENT
#define LIBAVCODEC_IDENT
Definition: version.h:43
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
mem_internal.h
svq1enc_cb.h
ff_me_init
av_cold int ff_me_init(MotionEstContext *c, AVCodecContext *avctx, const MECmpContext *mecc, int mpvenc)
Definition: motion_est.c:309
put_bytes_output
static int put_bytes_output(const PutBitContext *s)
Definition: put_bits.h:99
FF_ME_EPZS
#define FF_ME_EPZS
Definition: motion_est.h:43
write_ident
static av_cold int write_ident(AVCodecContext *avctx, const char *ident)
Definition: svq1enc.c:540
options
static const AVOption options[]
Definition: svq1enc.c:682
SVQ1_BLOCK_INTRA_CODE
#define SVQ1_BLOCK_INTRA_CODE
Definition: svq1.h:51
ff_svq1_inter_codebooks
const FF_VISIBILITY_PUSH_HIDDEN int8_t *const ff_svq1_inter_codebooks[6]
Definition: svq1_cb.h:776
AVPictureType
AVPictureType
Definition: avutil.h:276
SVQ1EncContext
Definition: svq1enc.c:58
int64_t
long long int64_t
Definition: coverity.c:34
block_sum
static int block_sum(const uint8_t *block, int w, int h, int linesize)
Definition: mobiclip.c:813
init_put_bits
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:62
svq1_encode_frame
static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
Definition: svq1enc.c:628
ff_me_init_pic
void ff_me_init_pic(MPVEncContext *const s)
Definition: motion_est.c:371
h263enc.h
ff_svq1_intra_codebooks
const int8_t *const ff_svq1_intra_codebooks[6]
Definition: svq1_cb.h:1519
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:63
CANDIDATE_MB_TYPE_INTER
#define CANDIDATE_MB_TYPE_INTER
Definition: mpegvideoenc.h:270
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:223
w
uint8_t w
Definition: llviddspenc.c:38
SVQ1EncContext::frame_width
int frame_width
Definition: svq1enc.c:76
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:535
MpegEncContext::mb_width
int mb_width
Definition: mpegvideo.h:104
VE
#define VE
Definition: svq1enc.c:681
AVOption
AVOption.
Definition: opt.h:429
encode.h
FFCodec
Definition: codec_internal.h:127
version.h
SVQ1EncContext::pict_type
enum AVPictureType pict_type
Definition: svq1enc.c:69
SVQ1_BLOCK_SKIP_CODE
#define SVQ1_BLOCK_SKIP_CODE
Definition: svq1.h:47
mpegvideo.h
sqr
static double sqr(double in)
Definition: af_afwtdn.c:872
FF_LAMBDA_SHIFT
#define FF_LAMBDA_SHIFT
Definition: avutil.h:224
MpegEncContext::height
int height
picture size. must be a multiple of 16
Definition: mpegvideo.h:87
mpegutils.h
SVQ1EncContext::encoded_block_levels
int16_t encoded_block_levels[6][7][256]
Definition: svq1enc.c:83
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:590
svq1_inter_codebook_sum
static const int8_t svq1_inter_codebook_sum[4][16 *6]
Definition: svq1enc_cb.h:32
FF_INPUT_BUFFER_MIN_SIZE
#define FF_INPUT_BUFFER_MIN_SIZE
Used by some encoders as upper bound for the length of headers.
Definition: encode.h:33
svq1encdsp.h
MPVWorkPicture::mb_type
uint32_t * mb_type
types and macros are defined in mpegutils.h
Definition: mpegpicture.h:105
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
MPVWorkPicture::motion_val
int16_t(*[2] motion_val)[2]
Definition: mpegpicture.h:103
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
ff_svq1_intra_multistage_vlc
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
Definition: svq1_vlc.h:33
ff_copy_bits
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
Definition: bitstream.c:49
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:57
ff_svq1_inter_mean_vlc
const uint16_t ff_svq1_inter_mean_vlc[512][2]
Definition: svq1_vlc.h:136
MpegEncContext::mb_height
int mb_height
number of MBs horizontally & vertically
Definition: mpegvideo.h:104
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
MpegEncContext::pict_type
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:163
ff_match_2uint16
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.
Definition: utils.c:830
ff_h263_pred_motion
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Definition: h263.c:182
SVQ1EncContext::svq1encdsp
SVQ1EncDSPContext svq1encdsp
Definition: svq1enc.c:94
MpegEncContext::linesize
ptrdiff_t linesize
line size, in bytes, may be different from width
Definition: mpegvideo.h:109
ff_me_cmp_init
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
Definition: me_cmp.c:960
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
MpegEncContext::width
int width
Definition: mpegvideo.h:87
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
put_bytes_left
static int put_bytes_left(const PutBitContext *s, int round_up)
Definition: put_bits.h:145
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:51
SVQ1EncContext::m
MPVEncContext m
Definition: svq1enc.c:62
avassert.h
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
svq1_encode_plane
static int svq1_encode_plane(SVQ1EncContext *s, int plane, PutBitContext *pb, const unsigned char *src_plane, unsigned char *ref_plane, unsigned char *decoded_plane, int width, int height, int src_stride, int stride)
Definition: svq1enc.c:295
SVQ1EncContext::last_picture
AVFrame * last_picture
Definition: svq1enc.c:66
emms_c
#define emms_c()
Definition: emms.h:63
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:515
SVQ1EncContext::y_block_height
int y_block_height
Definition: svq1enc.c:81
MAX_MB_BYTES
#define MAX_MB_BYTES
Definition: mpegutils.h:35
SVQ1_BLOCK_SKIP_LEN
#define SVQ1_BLOCK_SKIP_LEN
Definition: svq1.h:48
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
SVQ1EncContext::frame_height
int frame_height
Definition: svq1enc.c:77
SVQ1_BLOCK_INTRA_LEN
#define SVQ1_BLOCK_INTRA_LEN
Definition: svq1.h:52
THRESHOLD_MULTIPLIER
#define THRESHOLD_MULTIPLIER
Definition: svq1enc.c:132
ff_svq1_encoder
const FFCodec ff_svq1_encoder
Definition: svq1enc.c:698
MpegEncContext::cur_pic
MPVWorkPicture cur_pic
copy of the current picture structure.
Definition: mpegvideo.h:139
svq1_write_header
static void svq1_write_header(SVQ1EncContext *s, PutBitContext *pb, int frame_type)
Definition: svq1enc.c:97
PutBitContext
Definition: put_bits.h:50
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
ff_hpeldsp_init
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:337
my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition: dsp.h:57
MpegEncContext::mb_stride
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11
Definition: mpegvideo.h:105
MECmpContext
Definition: me_cmp.h:50
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
MpegEncContext::mb_y
int mb_y
Definition: mpegvideo.h:204
SVQ1EncContext::current_picture
AVFrame * current_picture
Definition: svq1enc.c:65
MPVWorkPicture::data
uint8_t * data[MPV_MAX_PLANES]
Definition: mpegpicture.h:96
ff_svq1enc_init
static void ff_svq1enc_init(SVQ1EncDSPContext *c)
Definition: svq1encdsp.h:47
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
MpegEncContext::hdsp
HpelDSPContext hdsp
Definition: mpegvideo.h:172
options
Definition: swscale.c:43
MpegEncContext::b8_stride
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
Definition: mpegvideo.h:106
ff_h263_get_mv_penalty
const uint8_t(* ff_h263_get_mv_penalty(void))[MAX_DMV *2+1]
Definition: ituh263enc.c:157
FF_ME_XONE
#define FF_ME_XONE
Definition: motion_est.h:44
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
svq1_encode_end
static av_cold int svq1_encode_end(AVCodecContext *avctx)
Definition: svq1enc.c:513
SVQ1EncContext::rd_total
int64_t rd_total
Definition: svq1enc.c:90
ff_encode_alloc_frame
int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame)
Allocate buffers for a frame.
Definition: encode.c:818
HpelDSPContext::put_pixels_tab
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
Definition: hpeldsp.h:56
SVQ1EncContext::dummy
uint32_t * dummy
Definition: svq1enc.c:86
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
SVQ1EncContext::quality
int quality
Definition: svq1enc.c:70
AVPacket::size
int size
Definition: packet.h:536
AVCodecContext::gop_size
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:1005
MpegEncContext::qscale
int qscale
QP.
Definition: mpegvideo.h:161
height
#define height
Definition: dsp.h:89
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:104
MpegEncContext::first_slice_line
int first_slice_line
used in MPEG-4 too to handle resync markers
Definition: mpegvideo.h:267
shift
static int shift(int a, int b)
Definition: bonk.c:261
AVFrame::quality
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
Definition: frame.h:532
OFFSET
#define OFFSET(x)
Definition: svq1enc.c:680
size
int size
Definition: twinvq_data.h:10344
SVQ1EncContext::reorder_pb
PutBitContext reorder_pb[6]
Definition: svq1enc.c:74
CANDIDATE_MB_TYPE_INTRA
#define CANDIDATE_MB_TYPE_INTRA
Definition: mpegvideoenc.h:269
SVQ1EncContext::mb_type
uint16_t * mb_type
Definition: svq1enc.c:85
frame.h
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
split
static char * split(char *message, char delim)
Definition: af_channelmap.c:89
offset
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
Definition: writing_filters.txt:86
SVQ1_BLOCK_INTER_CODE
#define SVQ1_BLOCK_INTER_CODE
Definition: svq1.h:49
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:541
init_block_index
static void init_block_index(MpegEncContext *const s)
Definition: svq1enc.c:287
SVQ1EncContext::avctx
AVCodecContext * avctx
Definition: svq1enc.c:63
AV_CODEC_ID_SVQ1
@ AV_CODEC_ID_SVQ1
Definition: codec_id.h:74
emms.h
QUALITY_THRESHOLD
#define QUALITY_THRESHOLD
Definition: svq1enc.c:131
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
SVQ1_BLOCK_INTER_LEN
#define SVQ1_BLOCK_INTER_LEN
Definition: svq1.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
put_bits_count
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:90
frame_type
frame_type
Definition: jpeg2000_parser.c:31
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:514
SVQ1EncContext::mecc
MECmpContext mecc
Definition: svq1enc.c:64
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
MpegEncContext::mb_x
int mb_x
Definition: mpegvideo.h:204
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
MpegEncContext::last_pic
MPVWorkPicture last_pic
copy of the previous picture structure.
Definition: mpegvideo.h:127
SVQ1EncContext::motion_val8
int16_t(*[3] motion_val8)[2]
Definition: svq1enc.c:87
AVCodecContext::height
int height
Definition: avcodec.h:592
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
svq1_intra_codebook_sum
static const int8_t svq1_intra_codebook_sum[4][16 *6]
Definition: svq1enc_cb.h:59
avcodec.h
stride
#define stride
Definition: h264pred_template.c:536
ff_svq1_inter_multistage_vlc
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
Definition: svq1_vlc.h:50
AVCodecContext::frame_num
int64_t frame_num
Frame counter, set by libavcodec.
Definition: avcodec.h:1878
SVQ1EncContext::y_block_width
int y_block_width
Definition: svq1enc.c:80
SVQ1EncDSPContext
Definition: svq1encdsp.h:28
ret
ret
Definition: filter_design.txt:187
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
me_cmp.h
U
#define U(x)
Definition: vpx_arith.h:37
SVQ1EncContext::motion_val16
int16_t(*[3] motion_val16)[2]
Definition: svq1enc.c:88
AVCodecContext
main external API structure.
Definition: avcodec.h:431
FF_MPV_OPT_FLAGS
#define FF_MPV_OPT_FLAGS
Definition: mpegvideoenc.h:314
ff_svq1_intra_mean_vlc
const uint16_t ff_svq1_intra_mean_vlc[256][2]
Definition: svq1_vlc.h:67
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
svq1.h
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
temp
else temp
Definition: vf_mcdeint.c:271
mean
static float mean(const float *input, int size)
Definition: vf_nnedi.c:861
encode_block
static int encode_block(SVQ1EncContext *s, uint8_t *src, uint8_t *ref, uint8_t *decoded, int stride, unsigned level, int threshold, int lambda, int intra)
Definition: svq1enc.c:134
svq1enc_class
static const AVClass svq1enc_class
Definition: svq1enc.c:691
ff_estimate_p_frame_motion
void ff_estimate_p_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
Definition: motion_est.c:892
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
packet_internal.h
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:322
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:153
SVQ1EncContext::scratchbuf
uint8_t * scratchbuf
Definition: svq1enc.c:92
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
ff_mpegvideoencdsp_init
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
Definition: mpegvideoencdsp.c:253
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
int32_t
int32_t
Definition: audioconvert.c:56
hpeldsp.h
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:455
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ff_side_data_set_encoder_stats
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
Definition: packet.c:610
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
h
h
Definition: vp9dsp_template.c:2070
width
#define width
Definition: dsp.h:89
ff_h263_encode_motion
void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code)
Definition: ituh263enc.c:166
put_bits.h
ff_svq1_frame_size_table
const uint16_t ff_svq1_frame_size_table[7][2]
Definition: svq1.c:40
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:64
svq1_encode_init
static av_cold int svq1_encode_init(AVCodecContext *avctx)
Definition: svq1enc.c:553
ff_alloc_packet
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition: encode.c:62
src
#define src
Definition: vp8dsp.c:248
codebook
static const unsigned codebook[256][2]
Definition: cfhdenc.c:41
FF_ME_ZERO
#define FF_ME_ZERO
Definition: motion_est.h:42
h263.h