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 "put_bits.h"
42 #include "svq1.h"
43 #include "svq1encdsp.h"
44 #include "svq1enc_cb.h"
45 #include "version.h"
46 
47 #include "libavutil/avassert.h"
48 #include "libavutil/frame.h"
49 #include "libavutil/mem_internal.h"
50 
51 // Workaround for GCC bug 102513
52 #if AV_GCC_VERSION_AT_LEAST(10, 0) && AV_GCC_VERSION_AT_MOST(12, 0) \
53  && !defined(__clang__) && !defined(__INTEL_COMPILER)
54 #pragma GCC optimize ("no-ipa-cp-clone")
55 #endif
56 
57 typedef struct SVQ1EncContext {
58  /* FIXME: Needed for motion estimation, should not be used for anything
59  * else, the idea is to make the motion estimation eventually independent
60  * of MPVEncContext, so this will be removed then. */
66 
67  /* Some compression statistics */
69  int quality;
70 
71  /* why ooh why this sick breadth first order,
72  * everything is slower and more complex */
74 
77 
78  /* Y plane block dimensions */
81 
82  DECLARE_ALIGNED(16, int16_t, encoded_block_levels)[6][7][256];
83 
84  uint16_t *mb_type;
85  uint32_t *dummy;
86  int16_t (*motion_val8[3])[2];
87  int16_t (*motion_val16[3])[2];
88 
90 
91  uint8_t *scratchbuf;
92 
95 
97 {
98  int i;
99 
100  /* frame code */
101  put_bits(pb, 22, 0x20);
102 
103  /* temporal reference (sure hope this is a "don't care") */
104  put_bits(pb, 8, 0x00);
105 
106  /* frame type */
107  put_bits(pb, 2, frame_type - 1);
108 
109  if (frame_type == AV_PICTURE_TYPE_I) {
110  /* no checksum since frame code is 0x20 */
111  /* no embedded string either */
112  /* output 5 unknown bits (2 + 2 + 1) */
113  put_bits(pb, 5, 2); /* 2 needed by quicktime decoder */
114 
117  s->frame_width, s->frame_height);
118  put_bits(pb, 3, i);
119 
120  if (i == 7) {
121  put_bits(pb, 12, s->frame_width);
122  put_bits(pb, 12, s->frame_height);
123  }
124  }
125 
126  /* no checksum or extra data (next 2 bits get 0) */
127  put_bits(pb, 2, 0);
128 }
129 
130 #define QUALITY_THRESHOLD 100
131 #define THRESHOLD_MULTIPLIER 0.6
132 
133 static int encode_block(SVQ1EncContext *s, uint8_t *src, uint8_t *ref,
134  uint8_t *decoded, int stride, unsigned level,
135  int threshold, int lambda, int intra)
136 {
137  int count, y, x, i, j, split, best_mean, best_score, best_count;
138  int best_vector[6];
139  int block_sum[7] = { 0, 0, 0, 0, 0, 0 };
140  int w = 2 << (level + 2 >> 1);
141  int h = 2 << (level + 1 >> 1);
142  int size = w * h;
143  int16_t (*block)[256] = s->encoded_block_levels[level];
144  const int8_t *codebook_sum, *codebook;
145  const uint16_t(*mean_vlc)[2];
146  const uint8_t(*multistage_vlc)[2];
147 
148  best_score = 0;
149  // FIXME: Optimize, this does not need to be done multiple times.
150  if (intra) {
151  // level is 5 when encode_block is called from svq1_encode_plane
152  // and always < 4 when called recursively from this function.
153  codebook_sum = level < 4 ? svq1_intra_codebook_sum[level] : NULL;
155  mean_vlc = ff_svq1_intra_mean_vlc;
156  multistage_vlc = ff_svq1_intra_multistage_vlc[level];
157  for (y = 0; y < h; y++) {
158  for (x = 0; x < w; x++) {
159  int v = src[x + y * stride];
160  block[0][x + w * y] = v;
161  best_score += v * v;
162  block_sum[0] += v;
163  }
164  }
165  } else {
166  // level is 5 or < 4, see above for details.
167  codebook_sum = level < 4 ? svq1_inter_codebook_sum[level] : NULL;
169  mean_vlc = ff_svq1_inter_mean_vlc + 256;
170  multistage_vlc = ff_svq1_inter_multistage_vlc[level];
171  for (y = 0; y < h; y++) {
172  for (x = 0; x < w; x++) {
173  int v = src[x + y * stride] - ref[x + y * stride];
174  block[0][x + w * y] = v;
175  best_score += v * v;
176  block_sum[0] += v;
177  }
178  }
179  }
180 
181  best_count = 0;
182  best_score -= (int)((unsigned)block_sum[0] * block_sum[0] >> (level + 3));
183  best_mean = block_sum[0] + (size >> 1) >> (level + 3);
184 
185  if (level < 4) {
186  for (count = 1; count < 7; count++) {
187  int best_vector_score = INT_MAX;
188  int best_vector_sum = -999, best_vector_mean = -999;
189  const int stage = count - 1;
190  const int8_t *vector;
191 
192  for (i = 0; i < 16; i++) {
193  int sum = codebook_sum[stage * 16 + i];
194  int sqr, diff, score;
195 
196  vector = codebook + stage * size * 16 + i * size;
197  sqr = s->svq1encdsp.ssd_int8_vs_int16(vector, block[stage], size);
198  diff = block_sum[stage] - sum;
199  score = sqr - (diff * (int64_t)diff >> (level + 3)); // FIXME: 64 bits slooow
200  if (score < best_vector_score) {
201  int mean = diff + (size >> 1) >> (level + 3);
202  av_assert2(mean > -300 && mean < 300);
203  mean = av_clip(mean, intra ? 0 : -256, 255);
204  best_vector_score = score;
205  best_vector[stage] = i;
206  best_vector_sum = sum;
207  best_vector_mean = mean;
208  }
209  }
210  av_assert0(best_vector_mean != -999);
211  vector = codebook + stage * size * 16 + best_vector[stage] * size;
212  for (j = 0; j < size; j++)
213  block[stage + 1][j] = block[stage][j] - vector[j];
214  block_sum[stage + 1] = block_sum[stage] - best_vector_sum;
215  best_vector_score += lambda *
216  (+1 + 4 * count +
217  multistage_vlc[1 + count][1]
218  + mean_vlc[best_vector_mean][1]);
219 
220  if (best_vector_score < best_score) {
221  best_score = best_vector_score;
222  best_count = count;
223  best_mean = best_vector_mean;
224  }
225  }
226  }
227 
228  if (best_mean == -128)
229  best_mean = -127;
230  else if (best_mean == 128)
231  best_mean = 127;
232 
233  split = 0;
234  if (best_score > threshold && level) {
235  int score = 0;
236  int offset = level & 1 ? stride * h / 2 : w / 2;
237  PutBitContext backup[6];
238 
239  for (i = level - 1; i >= 0; i--)
240  backup[i] = s->reorder_pb[i];
241  score += encode_block(s, src, ref, decoded, stride, level - 1,
242  threshold >> 1, lambda, intra);
243  score += encode_block(s, src + offset, ref + offset, decoded + offset,
244  stride, level - 1, threshold >> 1, lambda, intra);
245  score += lambda;
246 
247  if (score < best_score) {
248  best_score = score;
249  split = 1;
250  } else {
251  for (i = level - 1; i >= 0; i--)
252  s->reorder_pb[i] = backup[i];
253  }
254  }
255  if (level > 0)
256  put_bits(&s->reorder_pb[level], 1, split);
257 
258  if (!split) {
259  av_assert1(best_mean >= 0 && best_mean < 256 || !intra);
260  av_assert1(best_mean >= -256 && best_mean < 256);
261  av_assert1(best_count >= 0 && best_count < 7);
262  av_assert1(level < 4 || best_count == 0);
263 
264  /* output the encoding */
265  put_bits(&s->reorder_pb[level],
266  multistage_vlc[1 + best_count][1],
267  multistage_vlc[1 + best_count][0]);
268  put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
269  mean_vlc[best_mean][0]);
270 
271  for (i = 0; i < best_count; i++) {
272  av_assert2(best_vector[i] >= 0 && best_vector[i] < 16);
273  put_bits(&s->reorder_pb[level], 4, best_vector[i]);
274  }
275 
276  for (y = 0; y < h; y++)
277  for (x = 0; x < w; x++)
278  decoded[x + y * stride] = src[x + y * stride] -
279  block[best_count][x + w * y] +
280  best_mean;
281  }
282 
283  return best_score;
284 }
285 
286 static void init_block_index(MpegEncContext *const s)
287 {
288  s->block_index[0]= s->b8_stride*(s->mb_y*2 ) + s->mb_x*2;
289  s->block_index[1]= s->b8_stride*(s->mb_y*2 ) + 1 + s->mb_x*2;
290  s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) + s->mb_x*2;
291  s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) + 1 + s->mb_x*2;
292 }
293 
294 static int svq1_encode_plane(SVQ1EncContext *s, int plane,
295  PutBitContext *pb,
296  const unsigned char *src_plane,
297  unsigned char *ref_plane,
298  unsigned char *decoded_plane,
299  int width, int height, int src_stride, int stride)
300 {
301  MpegEncContext *const s2 = &s->m.c;
302  int x, y;
303  int i;
304  int block_width, block_height;
305  int level;
306  int threshold[6];
307  uint8_t *src = s->scratchbuf + stride * 32;
308  const int lambda = (s->quality * s->quality) >>
309  (2 * FF_LAMBDA_SHIFT);
310 
311  /* figure out the acceptable level thresholds in advance */
312  threshold[5] = QUALITY_THRESHOLD;
313  for (level = 4; level >= 0; level--)
314  threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
315 
316  block_width = (width + 15) / 16;
317  block_height = (height + 15) / 16;
318 
319  if (s->pict_type == AV_PICTURE_TYPE_P) {
320  s2->last_pic.data[0] = ref_plane;
321  s2->linesize =
322  s2->last_pic.linesize[0] =
323  s->m.new_pic->linesize[0] =
324  s2->cur_pic.linesize[0] = stride;
325  s2->width = width;
326  s2->height = height;
327  s2->mb_width = block_width;
328  s2->mb_height = block_height;
329  s2->mb_stride = s2->mb_width + 1;
330  s2->b8_stride = 2 * s2->mb_width + 1;
331  s->m.f_code = 1;
332  s2->pict_type = s->pict_type;
333  s->m.me.scene_change_score = 0;
334  // s2->out_format = FMT_H263;
335  // s->m.me.unrestricted_mv = 1;
336  s->m.lambda = s->quality;
337  s2->qscale = s->m.lambda * 139 +
338  FF_LAMBDA_SCALE * 64 >>
339  FF_LAMBDA_SHIFT + 7;
340  s->m.lambda2 = s->m.lambda * s->m.lambda +
341  FF_LAMBDA_SCALE / 2 >>
343 
344  s->m.mb_type = s->mb_type;
345 
346  // dummies, to avoid segfaults
347  s->m.mb_mean = (uint8_t *)s->dummy;
348  s->m.mb_var = (uint16_t *)s->dummy;
349  s->m.mc_mb_var = (uint16_t *)s->dummy;
350  s2->cur_pic.mb_type = s->dummy;
351 
352  s2->cur_pic.motion_val[0] = s->motion_val8[plane] + 2;
353  s->m.p_mv_table = s->motion_val16[plane] +
354  s2->mb_stride + 1;
355  ff_me_init_pic(&s->m);
356 
357  s->m.me.dia_size = s->avctx->dia_size;
358  s2->first_slice_line = 1;
359  for (y = 0; y < block_height; y++) {
360  s->m.new_pic->data[0] = src - y * 16 * stride; // ugly
361  s2->mb_y = y;
362 
363  for (i = 0; i < 16 && i + 16 * y < height; i++) {
364  memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
365  width);
366  for (x = width; x < 16 * block_width; x++)
367  src[i * stride + x] = src[i * stride + x - 1];
368  }
369  for (; i < 16 && i + 16 * y < 16 * block_height; i++)
370  memcpy(&src[i * stride], &src[(i - 1) * stride],
371  16 * block_width);
372 
373  for (x = 0; x < block_width; x++) {
374  s2->mb_x = x;
375  init_block_index(s2);
376 
377  ff_estimate_p_frame_motion(&s->m, x, y);
378  }
379  s2->first_slice_line = 0;
380  }
381 
383  ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code,
385  }
386 
387  s2->first_slice_line = 1;
388  for (y = 0; y < block_height; y++) {
389  for (i = 0; i < 16 && i + 16 * y < height; i++) {
390  memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
391  width);
392  for (x = width; x < 16 * block_width; x++)
393  src[i * stride + x] = src[i * stride + x - 1];
394  }
395  for (; i < 16 && i + 16 * y < 16 * block_height; i++)
396  memcpy(&src[i * stride], &src[(i - 1) * stride], 16 * block_width);
397 
398  s2->mb_y = y;
399  for (x = 0; x < block_width; x++) {
400  uint8_t reorder_buffer[2][6][7 * 32];
401  int count[2][6];
402  int offset = y * 16 * stride + x * 16;
403  uint8_t *decoded = decoded_plane + offset;
404  const uint8_t *ref = ref_plane + offset;
405  int score[4] = { 0, 0, 0, 0 }, best;
406  uint8_t *temp = s->scratchbuf;
407 
408  if (put_bytes_left(pb, 0) < 3000) { // FIXME: check size
409  av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
410  return -1;
411  }
412 
413  s2->mb_x = x;
414  init_block_index(s2);
415 
416  if (s->pict_type == AV_PICTURE_TYPE_I ||
417  (s->m.mb_type[x + y * s2->mb_stride] &
419  for (i = 0; i < 6; i++)
420  init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i],
421  7 * 32);
422  if (s->pict_type == AV_PICTURE_TYPE_P) {
424  score[0] = SVQ1_BLOCK_INTRA_LEN * lambda;
425  }
426  score[0] += encode_block(s, src + 16 * x, src + 16 * x /* unused */,
427  temp, stride, 5, 64, lambda, 1);
428  for (i = 0; i < 6; i++) {
429  count[0][i] = put_bits_count(&s->reorder_pb[i]);
430  flush_put_bits(&s->reorder_pb[i]);
431  }
432  } else
433  score[0] = INT_MAX;
434 
435  best = 0;
436 
437  if (s->pict_type == AV_PICTURE_TYPE_P) {
438  int mx, my, pred_x, pred_y, dxy;
439  int16_t *motion_ptr;
440 
441  motion_ptr = ff_h263_pred_motion(s2, 0, 0, &pred_x, &pred_y);
442  if (s->m.mb_type[x + y * s2->mb_stride] &
444  for (i = 0; i < 6; i++)
445  init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i],
446  7 * 32);
447 
449 
450  mx = motion_ptr[0];
451  my = motion_ptr[1];
452  av_assert1(mx >= -32 && mx <= 31);
453  av_assert1(my >= -32 && my <= 31);
454  av_assert1(pred_x >= -32 && pred_x <= 31);
455  av_assert1(pred_y >= -32 && pred_y <= 31);
456  ff_h263_encode_motion(&s->reorder_pb[5], mx - pred_x, 1);
457  ff_h263_encode_motion(&s->reorder_pb[5], my - pred_y, 1);
458  score[1] += lambda * put_bits_count(&s->reorder_pb[5]);
459 
460  dxy = (mx & 1) + 2 * (my & 1);
461 
462  s2->hdsp.put_pixels_tab[0][dxy](temp + 16*stride,
463  ref + (mx >> 1) +
464  stride * (my >> 1),
465  stride, 16);
466 
467  score[1] += encode_block(s, src + 16 * x, temp + 16*stride,
468  decoded, stride, 5, 64, lambda, 0);
469  best = score[1] <= score[0];
470 
471  score[2] = s->mecc.sse[0](NULL, src + 16 * x, ref,
472  stride, 16);
473  score[2] += SVQ1_BLOCK_SKIP_LEN * lambda;
474  if (score[2] < score[best] && mx == 0 && my == 0) {
475  best = 2;
476  s2->hdsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
478  }
479  }
480 
481  if (best == 1) {
482  for (i = 0; i < 6; i++) {
483  count[1][i] = put_bits_count(&s->reorder_pb[i]);
484  flush_put_bits(&s->reorder_pb[i]);
485  }
486  } else {
487  motion_ptr[0] =
488  motion_ptr[1] =
489  motion_ptr[2] =
490  motion_ptr[3] =
491  motion_ptr[0 + 2 * s2->b8_stride] =
492  motion_ptr[1 + 2 * s2->b8_stride] =
493  motion_ptr[2 + 2 * s2->b8_stride] =
494  motion_ptr[3 + 2 * s2->b8_stride] = 0;
495  }
496  }
497 
498  s->rd_total += score[best];
499 
500  if (best != 2)
501  for (i = 5; i >= 0; i--)
502  ff_copy_bits(pb, reorder_buffer[best][i],
503  count[best][i]);
504  if (best == 0)
505  s2->hdsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
506  }
507  s2->first_slice_line = 0;
508  }
509  return 0;
510 }
511 
513 {
514  SVQ1EncContext *const s = avctx->priv_data;
515  int i;
516 
517  if (avctx->frame_num)
518  av_log(avctx, AV_LOG_DEBUG, "RD: %f\n",
519  s->rd_total / (double)(avctx->width * avctx->height *
520  avctx->frame_num));
521 
522  av_freep(&s->m.me.scratchpad);
523  av_freep(&s->mb_type);
524  av_freep(&s->dummy);
525  av_freep(&s->scratchbuf);
526 
527  for (i = 0; i < 3; i++) {
528  av_freep(&s->motion_val8[i]);
529  av_freep(&s->motion_val16[i]);
530  }
531 
532  av_frame_free(&s->current_picture);
533  av_frame_free(&s->last_picture);
534  av_frame_free(&s->m.new_pic);
535 
536  return 0;
537 }
538 
539 static av_cold int write_ident(AVCodecContext *avctx, const char *ident)
540 {
541  int size = strlen(ident);
542  avctx->extradata = av_malloc(size + 8);
543  if (!avctx->extradata)
544  return AVERROR(ENOMEM);
545  AV_WB32(avctx->extradata, size + 8);
546  AV_WL32(avctx->extradata + 4, MKTAG('S', 'V', 'Q', '1'));
547  memcpy(avctx->extradata + 8, ident, size);
548  avctx->extradata_size = size + 8;
549  return 0;
550 }
551 
553 {
554  SVQ1EncContext *const s = avctx->priv_data;
555  int ret;
556 
557  if (avctx->width >= 4096 || avctx->height >= 4096) {
558  av_log(avctx, AV_LOG_ERROR, "Dimensions too large, maximum is 4095x4095\n");
559  return AVERROR(EINVAL);
560  }
561 
562  ff_hpeldsp_init(&s->m.c.hdsp, avctx->flags);
563  ff_me_cmp_init(&s->mecc, avctx);
564  ret = ff_me_init(&s->m.me, avctx, &s->mecc, 0);
565  if (ret < 0)
566  return ret;
567  ff_mpegvideoencdsp_init(&s->m.mpvencdsp, avctx);
568 
569  s->current_picture = av_frame_alloc();
570  s->last_picture = av_frame_alloc();
571  if (!s->current_picture || !s->last_picture) {
572  return AVERROR(ENOMEM);
573  }
574  ret = ff_encode_alloc_frame(avctx, s->current_picture);
575  if (ret < 0)
576  return ret;
577  ret = ff_encode_alloc_frame(avctx, s->last_picture);
578  if (ret < 0)
579  return ret;
580  s->scratchbuf = av_malloc_array(s->current_picture->linesize[0], 16 * 3);
581  if (!s->scratchbuf)
582  return AVERROR(ENOMEM);
583 
584  s->frame_width = avctx->width;
585  s->frame_height = avctx->height;
586 
587  s->y_block_width = (s->frame_width + 15) / 16;
588  s->y_block_height = (s->frame_height + 15) / 16;
589 
590  s->avctx = avctx;
591  s->m.c.avctx = avctx;
592 
593  for (size_t plane = 0; plane < FF_ARRAY_ELEMS(s->motion_val16); ++plane) {
594  const int shift = plane ? 2 : 0;
595  unsigned block_height = ((s->frame_height >> shift) + 15U) / 16;
596  unsigned block_width = ((s->frame_width >> shift) + 15U) / 16;
597 
598  s->motion_val8[plane] = av_calloc((2 * block_width + 1) * block_height * 2 + 2,
599  2 * sizeof(int16_t));
600  s->motion_val16[plane] = av_calloc((block_width + 1) * (block_height + 2) + 1,
601  2 * sizeof(int16_t));
602  if (!s->motion_val8[plane] || !s->motion_val16[plane])
603  return AVERROR(ENOMEM);
604  }
605 
606  s->m.c.picture_structure = PICT_FRAME;
607  s->m.me.temp =
608  s->m.me.scratchpad = av_mallocz((avctx->width + 64) *
609  2 * 16 * 2 * sizeof(uint8_t));
610  s->mb_type = av_mallocz((s->y_block_width + 1) *
611  s->y_block_height * sizeof(int16_t));
612  s->dummy = av_mallocz((s->y_block_width + 1) *
613  s->y_block_height * sizeof(int32_t));
614  s->m.new_pic = av_frame_alloc();
615 
616  if (!s->m.me.scratchpad ||
617  !s->mb_type || !s->dummy || !s->m.new_pic)
618  return AVERROR(ENOMEM);
619 
620  ff_svq1enc_init(&s->svq1encdsp);
621 
622  s->m.me.mv_penalty = ff_h263_get_mv_penalty();
623 
624  return write_ident(avctx, s->avctx->flags & AV_CODEC_FLAG_BITEXACT ? "Lavc" : LIBAVCODEC_IDENT);
625 }
626 
628  const AVFrame *pict, int *got_packet)
629 {
630  SVQ1EncContext *const s = avctx->priv_data;
631  PutBitContext pb;
632  int i, ret;
633 
634  ret = ff_alloc_packet(avctx, pkt, s->y_block_width * s->y_block_height *
636  if (ret < 0)
637  return ret;
638 
639  FFSWAP(AVFrame*, s->current_picture, s->last_picture);
640 
641  if (avctx->gop_size && (avctx->frame_num % avctx->gop_size))
642  s->pict_type = AV_PICTURE_TYPE_P;
643  else
644  s->pict_type = AV_PICTURE_TYPE_I;
645  s->quality = pict->quality;
646 
647  ff_encode_add_stats_side_data(pkt, pict->quality, NULL, 0, s->pict_type);
648 
649  init_put_bits(&pb, pkt->data, pkt->size);
650  svq1_write_header(s, &pb, s->pict_type);
651  for (i = 0; i < 3; i++) {
652  int ret = svq1_encode_plane(s, i, &pb,
653  pict->data[i],
654  s->last_picture->data[i],
655  s->current_picture->data[i],
656  s->frame_width / (i ? 4 : 1),
657  s->frame_height / (i ? 4 : 1),
658  pict->linesize[i],
659  s->current_picture->linesize[i]);
660  emms_c();
661  if (ret < 0)
662  return ret;
663  }
664 
665  // align_put_bits(&pb);
666  while (put_bits_count(&pb) & 31)
667  put_bits(&pb, 1, 0);
668 
669  flush_put_bits(&pb);
670 
671  pkt->size = put_bytes_output(&pb);
672  if (s->pict_type == AV_PICTURE_TYPE_I)
674  *got_packet = 1;
675 
676  return 0;
677 }
678 
679 #define OFFSET(x) offsetof(struct SVQ1EncContext, x)
680 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
681 static const AVOption options[] = {
682  { "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"},
683  { "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
684  { "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
685  { "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
686 
687  { NULL },
688 };
689 
690 static const AVClass svq1enc_class = {
691  .class_name = "svq1enc",
692  .item_name = av_default_item_name,
693  .option = options,
694  .version = LIBAVUTIL_VERSION_INT,
695 };
696 
698  .p.name = "svq1",
699  CODEC_LONG_NAME("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
700  .p.type = AVMEDIA_TYPE_VIDEO,
701  .p.id = AV_CODEC_ID_SVQ1,
703  .priv_data_size = sizeof(SVQ1EncContext),
704  .p.priv_class = &svq1enc_class,
705  .init = svq1_encode_init,
707  .close = svq1_encode_end,
709  .color_ranges = AVCOL_RANGE_MPEG,
710  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
711 };
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:392
MpegEncContext::hdsp
HpelDSPContext hdsp
Definition: mpegvideo.h:165
level
uint8_t level
Definition: svq3.c:208
MpegEncContext::mb_y
int mb_y
Definition: mpegvideo.h:197
av_clip
#define av_clip
Definition: common.h:100
MPVEncContext
Definition: mpegvideoenc.h:46
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:539
options
static const AVOption options[]
Definition: svq1enc.c:681
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:57
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:814
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:627
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:64
CANDIDATE_MB_TYPE_INTER
#define CANDIDATE_MB_TYPE_INTER
Definition: mpegvideoenc.h:291
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:154
w
uint8_t w
Definition: llviddspenc.c:38
MpegEncContext::pict_type
enum AVPictureType pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:160
SVQ1EncContext::frame_width
int frame_width
Definition: svq1enc.c:75
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:588
VE
#define VE
Definition: svq1enc.c:680
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:68
SVQ1_BLOCK_SKIP_CODE
#define SVQ1_BLOCK_SKIP_CODE
Definition: svq1.h:47
MpegEncContext::b8_stride
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
Definition: mpegvideo.h:104
mpegvideo.h
sqr
static double sqr(double in)
Definition: af_afwtdn.c:872
FF_LAMBDA_SHIFT
#define FF_LAMBDA_SHIFT
Definition: avutil.h:224
mpegutils.h
SVQ1EncContext::encoded_block_levels
int16_t encoded_block_levels[6][7][256]
Definition: svq1enc.c:82
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:643
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:448
MPVWorkPicture::motion_val
int16_t(*[2] motion_val)[2]
Definition: mpegpicture.h:103
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
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
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:843
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:93
ff_me_cmp_init
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
Definition: me_cmp.c:961
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:496
ff_encode_add_stats_side_data
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
Definition: encode.c:919
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:359
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:52
SVQ1EncContext::m
MPVEncContext m
Definition: svq1enc.c:61
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:106
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:294
SVQ1EncContext::last_picture
AVFrame * last_picture
Definition: svq1enc.c:65
MpegEncContext::cur_pic
MPVWorkPicture cur_pic
copy of the current picture structure.
Definition: mpegvideo.h:138
emms_c
#define emms_c()
Definition: emms.h:63
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:523
SVQ1EncContext::y_block_height
int y_block_height
Definition: svq1enc.c:80
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:76
SVQ1_BLOCK_INTRA_LEN
#define SVQ1_BLOCK_INTRA_LEN
Definition: svq1.h:52
THRESHOLD_MULTIPLIER
#define THRESHOLD_MULTIPLIER
Definition: svq1enc.c:131
ff_svq1_encoder
const FFCodec ff_svq1_encoder
Definition: svq1enc.c:697
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
svq1_write_header
static void svq1_write_header(SVQ1EncContext *s, PutBitContext *pb, int frame_type)
Definition: svq1enc.c:96
PutBitContext
Definition: put_bits.h:50
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition: dsp.h:57
MECmpContext
Definition: me_cmp.h:50
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
MpegEncContext::qscale
int qscale
QP.
Definition: mpegvideo.h:158
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
SVQ1EncContext::current_picture
AVFrame * current_picture
Definition: svq1enc.c:64
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:241
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
options
Definition: swscale.c:43
MpegEncContext::mb_width
int mb_width
Definition: mpegvideo.h:102
ff_h263_get_mv_penalty
const uint8_t(* ff_h263_get_mv_penalty(void))[MAX_DMV *2+1]
Definition: ituh263enc.c:147
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:512
SVQ1EncContext::rd_total
int64_t rd_total
Definition: svq1enc.c:89
ff_encode_alloc_frame
int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame)
Allocate buffers for a frame.
Definition: encode.c:838
HpelDSPContext::put_pixels_tab
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
Definition: hpeldsp.h:57
MpegEncContext::last_pic
MPVWorkPicture last_pic
copy of the previous picture structure.
Definition: mpegvideo.h:126
SVQ1EncContext::dummy
uint32_t * dummy
Definition: svq1enc.c:85
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:69
AVPacket::size
int size
Definition: packet.h:589
AVCodecContext::gop_size
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:1013
height
#define height
Definition: dsp.h:89
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:104
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:549
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:103
OFFSET
#define OFFSET(x)
Definition: svq1enc.c:679
size
int size
Definition: twinvq_data.h:10344
SVQ1EncContext::reorder_pb
PutBitContext reorder_pb[6]
Definition: svq1enc.c:73
CANDIDATE_MB_TYPE_INTRA
#define CANDIDATE_MB_TYPE_INTRA
Definition: mpegvideoenc.h:290
SVQ1EncContext::mb_type
uint16_t * mb_type
Definition: svq1enc.c:84
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:594
init_block_index
static void init_block_index(MpegEncContext *const s)
Definition: svq1enc.c:286
SVQ1EncContext::avctx
AVCodecContext * avctx
Definition: svq1enc.c:62
AV_CODEC_ID_SVQ1
@ AV_CODEC_ID_SVQ1
Definition: codec_id.h:74
emms.h
QUALITY_THRESHOLD
#define QUALITY_THRESHOLD
Definition: svq1enc.c:130
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:32
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:522
SVQ1EncContext::mecc
MECmpContext mecc
Definition: svq1enc.c:63
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
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
SVQ1EncContext::motion_val8
int16_t(*[3] motion_val8)[2]
Definition: svq1enc.c:86
AVCodecContext::height
int height
Definition: avcodec.h:600
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
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
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:1886
SVQ1EncContext::y_block_width
int y_block_width
Definition: svq1enc.c:79
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
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
me_cmp.h
U
#define U(x)
Definition: vpx_arith.h:37
SVQ1EncContext::motion_val16
int16_t(*[3] motion_val16)[2]
Definition: svq1enc.c:87
AVCodecContext
main external API structure.
Definition: avcodec.h:439
FF_MPV_OPT_FLAGS
#define FF_MPV_OPT_FLAGS
Definition: mpegvideoenc.h:335
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
MpegEncContext::height
int height
picture size. must be a multiple of 16
Definition: mpegvideo.h:90
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
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
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:133
svq1enc_class
static const AVClass svq1enc_class
Definition: svq1enc.c:690
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
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:91
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
MpegEncContext::mb_x
int mb_x
Definition: mpegvideo.h:197
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:276
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
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:472
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
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
h
h
Definition: vp9dsp_template.c:2070
stride
#define stride
Definition: h264pred_template.c:536
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:156
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:67
svq1_encode_init
static av_cold int svq1_encode_init(AVCodecContext *avctx)
Definition: svq1enc.c:552
ff_alloc_packet
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition: encode.c:61
MpegEncContext::width
int width
Definition: mpegvideo.h:90
src
#define src
Definition: vp8dsp.c:248
MpegEncContext::linesize
ptrdiff_t linesize
line size, in bytes, may be different from width
Definition: mpegvideo.h:107
codebook
static const unsigned codebook[256][2]
Definition: cfhdenc.c:41
ff_hpeldsp_init
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:337
MpegEncContext::first_slice_line
int first_slice_line
used in MPEG-4 too to handle resync markers
Definition: mpegvideo.h:237
MpegEncContext::mb_height
int mb_height
number of MBs horizontally & vertically
Definition: mpegvideo.h:102
FF_ME_ZERO
#define FF_ME_ZERO
Definition: motion_est.h:42
h263.h