FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
mpegvideo.c
Go to the documentation of this file.
1 /*
2  * The simplest mpeg encoder (well, it was the simplest!)
3  * Copyright (c) 2000,2001 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
7  *
8  * This file is part of FFmpeg.
9  *
10  * FFmpeg is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * FFmpeg is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with FFmpeg; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 /**
26  * @file
27  * The simplest mpeg encoder (well, it was the simplest!).
28  */
29 
30 #include "libavutil/attributes.h"
31 #include "libavutil/avassert.h"
32 #include "libavutil/imgutils.h"
33 #include "libavutil/internal.h"
34 #include "libavutil/mem.h"
35 
36 #include "avcodec.h"
37 #include "blockdsp.h"
38 #include "idctdsp.h"
39 #include "mathops.h"
40 #include "mpeg_er.h"
41 #include "mpegutils.h"
42 #include "mpegvideo.h"
43 #include "mpegvideodata.h"
44 #include "mpegvideo_unquantize.h"
45 #include "libavutil/refstruct.h"
46 
47 
48 static void gray16(uint8_t *dst, const uint8_t *src, ptrdiff_t linesize, int h)
49 {
50  while(h--)
51  memset(dst + h*linesize, 128, 16);
52 }
53 
54 static void gray8(uint8_t *dst, const uint8_t *src, ptrdiff_t linesize, int h)
55 {
56  while(h--)
57  memset(dst + h*linesize, 128, 8);
58 }
59 
60 /* init common dct for both encoder and decoder */
62 {
63  ff_blockdsp_init(&s->bdsp);
64  ff_hpeldsp_init(&s->hdsp, s->avctx->flags);
65  ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample);
66 
67  if (s->avctx->debug & FF_DEBUG_NOMC) {
68  int i;
69  for (i=0; i<4; i++) {
70  s->hdsp.avg_pixels_tab[0][i] = gray16;
71  s->hdsp.put_pixels_tab[0][i] = gray16;
72  s->hdsp.put_no_rnd_pixels_tab[0][i] = gray16;
73 
74  s->hdsp.avg_pixels_tab[1][i] = gray8;
75  s->hdsp.put_pixels_tab[1][i] = gray8;
76  s->hdsp.put_no_rnd_pixels_tab[1][i] = gray8;
77  }
78  }
79 }
80 
81 av_cold void ff_init_scantable(const uint8_t *permutation, ScanTable *st,
82  const uint8_t *src_scantable)
83 {
84  st->scantable = src_scantable;
85 
86  for (int i = 0, end = -1; i < 64; i++) {
87  int j = src_scantable[i];
88  st->permutated[i] = permutation[j];
89  if (permutation[j] > end)
90  end = permutation[j];
91  st->raster_end[i] = end;
92  }
93 }
94 
96 {
97  if (s->codec_id == AV_CODEC_ID_MPEG4)
98  s->idsp.mpeg4_studio_profile = s->studio_profile;
99  ff_idctdsp_init(&s->idsp, s->avctx);
100 
101  /* load & permutate scantables
102  * note: only wmv uses different ones
103  */
104  if (s->alternate_scan) {
105  ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
106  ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
107  } else {
108  ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
109  ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
110  }
111  ff_permute_scantable(s->permutated_intra_h_scantable, ff_alternate_horizontal_scan,
112  s->idsp.idct_permutation);
113  ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan,
114  s->idsp.idct_permutation);
115 }
116 
118 {
119  if (!FF_ALLOCZ_TYPED_ARRAY(s->blocks, 1 + s->encoding))
120  return AVERROR(ENOMEM);
121  s->block = s->blocks[0];
122 
123  return 0;
124 }
125 
127 {
128  int nb_slices = s->slice_context_count, ret;
129  size_t slice_size = s->slice_ctx_size ? s->slice_ctx_size : sizeof(*s);
130 
131  /* We initialize the copies before the original so that
132  * fields allocated in init_duplicate_context are NULL after
133  * copying. This prevents double-frees upon allocation error. */
134  for (int i = 1; i < nb_slices; i++) {
135  s->thread_context[i] = av_memdup(s, slice_size);
136  if (!s->thread_context[i])
137  return AVERROR(ENOMEM);
138  if ((ret = init_duplicate_context(s->thread_context[i])) < 0)
139  return ret;
140  s->thread_context[i]->start_mb_y =
141  (s->mb_height * (i ) + nb_slices / 2) / nb_slices;
142  s->thread_context[i]->end_mb_y =
143  (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
144  }
145  s->start_mb_y = 0;
146  s->end_mb_y = nb_slices > 1 ? (s->mb_height + nb_slices / 2) / nb_slices
147  : s->mb_height;
148  return init_duplicate_context(s);
149 }
150 
152 {
153  if (!s)
154  return;
155 
156  av_freep(&s->sc.edge_emu_buffer);
157  av_freep(&s->sc.scratchpad_buf);
158  s->sc.obmc_scratchpad = NULL;
159  s->sc.linesize = 0;
160 
161  av_freep(&s->blocks);
162  s->block = NULL;
163 }
164 
166 {
167  for (int i = 1; i < s->slice_context_count; i++) {
168  free_duplicate_context(s->thread_context[i]);
169  av_freep(&s->thread_context[i]);
170  }
172 }
173 
175 {
176 #define COPY(M) \
177  M(ScratchpadContext, sc) \
178  M(void*, blocks) \
179  M(void*, block) \
180  M(int, start_mb_y) \
181  M(int, end_mb_y) \
182  M(int16_t*, dc_val) \
183  M(void*, ac_val)
184 
185  int ret;
186  // FIXME copy only needed parts
187 #define BACKUP(T, member) T member = dst->member;
188  COPY(BACKUP)
189  memcpy(dst, src, sizeof(MpegEncContext));
190 #define RESTORE(T, member) dst->member = member;
191  COPY(RESTORE)
192 
193  ret = ff_mpv_framesize_alloc(dst->avctx, &dst->sc, dst->linesize);
194  if (ret < 0) {
195  av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
196  "scratch buffers.\n");
197  return ret;
198  }
199  return 0;
200 }
201 
202 /**
203  * Set the given MpegEncContext to common defaults
204  * (same for encoding and decoding).
205  * The changed fields will not depend upon the
206  * prior state of the MpegEncContext.
207  */
209 {
210  s->chroma_qscale_table = ff_default_chroma_qscale_table;
211  s->progressive_frame = 1;
212  s->progressive_sequence = 1;
213  s->picture_structure = PICT_FRAME;
214 
215  s->picture_number = 0;
216 
217  s->slice_context_count = 1;
218 }
219 
221 {
227  pools->alloc_mb_height = pools->alloc_mb_width = pools->alloc_mb_stride = 0;
228 }
229 
231 {
232  int nb_slices = (HAVE_THREADS &&
233  s->avctx->active_thread_type & FF_THREAD_SLICE) ?
234  s->avctx->thread_count : 1;
235  BufferPoolContext *const pools = &s->buffer_pools;
236  int y_size, c_size, yc_size, mb_array_size, mv_table_size, x, y;
237  int mb_height;
238 
239  if (s->encoding && s->avctx->slices)
240  nb_slices = s->avctx->slices;
241 
242  if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
243  s->mb_height = (s->height + 31) / 32 * 2;
244  else
245  s->mb_height = (s->height + 15) / 16;
246 
247  if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
248  int max_slices;
249  if (s->mb_height)
250  max_slices = FFMIN(MAX_THREADS, s->mb_height);
251  else
252  max_slices = MAX_THREADS;
253  av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
254  " reducing to %d\n", nb_slices, max_slices);
255  nb_slices = max_slices;
256  }
257 
258  s->slice_context_count = nb_slices;
259 
260  /* VC-1 can change from being progressive to interlaced on a per-frame
261  * basis. We therefore allocate certain buffers so big that they work
262  * in both instances. */
263  mb_height = s->msmpeg4_version == MSMP4_VC1 ?
264  FFALIGN(s->mb_height, 2) : s->mb_height;
265 
266  s->mb_width = (s->width + 15) / 16;
267  s->mb_stride = s->mb_width + 1;
268  s->b8_stride = s->mb_width * 2 + 1;
269  mb_array_size = mb_height * s->mb_stride;
270  mv_table_size = (mb_height + 2) * s->mb_stride + 1;
271 
272  /* set default edge pos, will be overridden
273  * in decode_header if needed */
274  s->h_edge_pos = s->mb_width * 16;
275  s->v_edge_pos = s->mb_height * 16;
276 
277  s->mb_num = s->mb_width * s->mb_height;
278 
279  s->block_wrap[0] =
280  s->block_wrap[1] =
281  s->block_wrap[2] =
282  s->block_wrap[3] = s->b8_stride;
283  s->block_wrap[4] =
284  s->block_wrap[5] = s->mb_stride;
285 
286  y_size = s->b8_stride * (2 * mb_height + 1);
287  c_size = s->mb_stride * (mb_height + 1);
288  yc_size = y_size + 2 * c_size;
289 
290  if (!FF_ALLOCZ_TYPED_ARRAY(s->mb_index2xy, s->mb_num + 1))
291  return AVERROR(ENOMEM);
292  for (y = 0; y < s->mb_height; y++)
293  for (x = 0; x < s->mb_width; x++)
294  s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
295 
296  s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
297 
298 #define ALLOC_POOL(name, size, flags) do { \
299  pools->name ##_pool = av_refstruct_pool_alloc((size), (flags)); \
300  if (!pools->name ##_pool) \
301  return AVERROR(ENOMEM); \
302 } while (0)
303 
304  if (s->codec_id == AV_CODEC_ID_MPEG4 ||
305  (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) {
306  /* interlaced direct mode decoding tables */
307  int16_t (*tmp)[2] = av_calloc(mv_table_size, 4 * sizeof(*tmp));
308  if (!tmp)
309  return AVERROR(ENOMEM);
310  s->p_field_mv_table_base = tmp;
311  tmp += s->mb_stride + 1;
312  for (int i = 0; i < 2; i++) {
313  for (int j = 0; j < 2; j++) {
314  s->p_field_mv_table[i][j] = tmp;
315  tmp += mv_table_size;
316  }
317  }
318  if (s->codec_id == AV_CODEC_ID_MPEG4) {
319  ALLOC_POOL(mbskip_table, mb_array_size + 2,
320  !s->encoding ? AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME : 0);
321  if (!s->encoding) {
322  /* cbp, pred_dir */
323  if (!(s->cbp_table = av_mallocz(mb_array_size)) ||
324  !(s->pred_dir_table = av_mallocz(mb_array_size)))
325  return AVERROR(ENOMEM);
326  }
327  }
328  }
329 
330  if (s->msmpeg4_version >= MSMP4_V3) {
331  s->coded_block_base = av_mallocz(y_size);
332  if (!s->coded_block_base)
333  return AVERROR(ENOMEM);
334  s->coded_block = s->coded_block_base + s->b8_stride + 1;
335  }
336 
337  if (s->h263_pred || s->h263_aic || !s->encoding) {
338  // When encoding, each slice (and therefore each thread)
339  // gets its own ac_val and dc_val buffers in order to avoid
340  // races.
341  size_t allslice_yc_size = yc_size * (s->encoding ? nb_slices : 1);
342  if (s->out_format == FMT_H263) {
343  /* ac values */
344  if (!FF_ALLOCZ_TYPED_ARRAY(s->ac_val_base, allslice_yc_size))
345  return AVERROR(ENOMEM);
346  s->ac_val = s->ac_val_base + s->b8_stride + 1;
347  }
348 
349  /* dc values */
350  // MN: we need these for error resilience of intra-frames
351  // Allocating them unconditionally for decoders also means
352  // that we don't need to reinitialize when e.g. h263_aic changes.
353 
354  // y_size and therefore yc_size is always odd; allocate one element
355  // more for each encoder slice in order to be able to align each slice's
356  // dc_val to four in order to use aligned stores when cleaning dc_val.
357  allslice_yc_size += s->encoding * nb_slices;
358  if (!FF_ALLOC_TYPED_ARRAY(s->dc_val_base, allslice_yc_size))
359  return AVERROR(ENOMEM);
360  s->dc_val = s->dc_val_base + s->b8_stride + 1;
361  for (size_t i = 0; i < allslice_yc_size; ++i)
362  s->dc_val_base[i] = 1024;
363  }
364 
365  // Note the + 1 is for a quicker MPEG-4 slice_end detection
366  if (!(s->mbskip_table = av_mallocz(mb_array_size + 2)) ||
367  /* which mb is an intra block, init macroblock skip table */
368  !(s->mbintra_table = av_mallocz(mb_array_size)))
369  return AVERROR(ENOMEM);
370 
371  ALLOC_POOL(qscale_table, mv_table_size, 0);
372  ALLOC_POOL(mb_type, mv_table_size * sizeof(uint32_t), 0);
373 
374  if (s->out_format == FMT_H263 || s->encoding ||
375  (s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS)) {
376  const int b8_array_size = s->b8_stride * mb_height * 2;
377  int mv_size = 2 * (b8_array_size + 4) * sizeof(int16_t);
378  int ref_index_size = 4 * mb_array_size;
379 
380  /* FIXME: The output of H.263 with OBMC depends upon
381  * the earlier content of the buffer; therefore we set
382  * the flags to always reset returned buffers here. */
384  ALLOC_POOL(ref_index, ref_index_size, 0);
385  }
386 #undef ALLOC_POOL
387  pools->alloc_mb_width = s->mb_width;
388  pools->alloc_mb_height = mb_height;
389  pools->alloc_mb_stride = s->mb_stride;
390 
391  return !CONFIG_MPEGVIDEODEC || s->encoding ? 0 : ff_mpeg_er_init(s);
392 }
393 
394 /**
395  * init common structure for both encoder and decoder.
396  * this assumes that some variables like width/height are already set
397  */
399 {
400  int ret;
401 
402  if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
403  av_log(s->avctx, AV_LOG_ERROR,
404  "decoding to AV_PIX_FMT_NONE is not supported.\n");
405  return AVERROR(EINVAL);
406  }
407 
408  if ((s->width || s->height) &&
409  av_image_check_size(s->width, s->height, 0, s->avctx))
410  return AVERROR(EINVAL);
411 
412  dsp_init(s);
413 
414  /* set chroma shifts */
415  ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
416  &s->chroma_x_shift,
417  &s->chroma_y_shift);
418  if (ret)
419  return ret;
420 
422  goto fail;
423 
424  s->context_initialized = 1;
425  s->thread_context[0] = s;
426 
427 // if (s->width && s->height) {
428  if (!s->encoding) {
430  if (ret < 0)
431  goto fail;
432  }
433 // }
434 
435  return 0;
436  fail:
438  return ret;
439 }
440 
442 {
444 
445  free_buffer_pools(&s->buffer_pools);
446  av_freep(&s->p_field_mv_table_base);
447  for (int i = 0; i < 2; i++)
448  for (int j = 0; j < 2; j++)
449  s->p_field_mv_table[i][j] = NULL;
450 
451  av_freep(&s->ac_val_base);
452  av_freep(&s->dc_val_base);
453  av_freep(&s->coded_block_base);
454  av_freep(&s->mbintra_table);
455  av_freep(&s->cbp_table);
456  av_freep(&s->pred_dir_table);
457 
458  av_freep(&s->mbskip_table);
459 
460  av_freep(&s->er.error_status_table);
461  av_freep(&s->er.er_temp_buffer);
462  av_freep(&s->mb_index2xy);
463 
464  s->linesize = s->uvlinesize = 0;
465 }
466 
468 {
470  if (s->slice_context_count > 1)
471  s->slice_context_count = 1;
472 
473  ff_mpv_unref_picture(&s->last_pic);
474  ff_mpv_unref_picture(&s->cur_pic);
475  ff_mpv_unref_picture(&s->next_pic);
476 
477  s->context_initialized = 0;
478  s->context_reinit = 0;
479  s->linesize = s->uvlinesize = 0;
480 }
481 
482 
483 /**
484  * Clean dc, ac for the current non-intra MB.
485  */
487 {
488  int wrap = s->b8_stride;
489  int xy = s->block_index[0];
490  /* chroma */
491  unsigned uxy = s->block_index[4];
492  unsigned vxy = s->block_index[5];
493  int16_t *dc_val = s->dc_val;
494 
495  AV_WN32A(dc_val + xy, 1024 << 16 | 1024);
496  AV_WN32 (dc_val + xy + wrap, 1024 << 16 | 1024);
497  dc_val[uxy] =
498  dc_val[vxy] = 1024;
499  /* ac pred */
500  int16_t (*ac_val)[16] = s->ac_val;
501  av_assume(!((uintptr_t)ac_val & 0xF));
502  // Don't reset the upper-left luma block, as it will only ever be
503  // referenced by blocks from the same macroblock.
504  memset(ac_val[xy + 1], 0, sizeof(*ac_val));
505  memset(ac_val[xy + wrap], 0, 2 * sizeof(*ac_val));
506  /* ac pred */
507  memset(ac_val[uxy], 0, sizeof(*ac_val));
508  memset(ac_val[vxy], 0, sizeof(*ac_val));
509 }
510 
511 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
512  const int linesize = s->cur_pic.linesize[0]; //not s->linesize as this would be wrong for field pics
513  const int uvlinesize = s->cur_pic.linesize[1];
514  const int width_of_mb = (4 + (s->avctx->bits_per_raw_sample > 8)) - s->avctx->lowres;
515  const int height_of_mb = 4 - s->avctx->lowres;
516 
517  s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
518  s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
519  s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
520  s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
521  s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
522  s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
523  //block_index is not used by mpeg2, so it is not affected by chroma_format
524 
525  s->dest[0] = s->cur_pic.data[0] + (int)((s->mb_x - 1U) << width_of_mb);
526  s->dest[1] = s->cur_pic.data[1] + (int)((s->mb_x - 1U) << (width_of_mb - s->chroma_x_shift));
527  s->dest[2] = s->cur_pic.data[2] + (int)((s->mb_x - 1U) << (width_of_mb - s->chroma_x_shift));
528 
529  if (s->picture_structure == PICT_FRAME) {
530  s->dest[0] += s->mb_y * linesize << height_of_mb;
531  s->dest[1] += s->mb_y * uvlinesize << (height_of_mb - s->chroma_y_shift);
532  s->dest[2] += s->mb_y * uvlinesize << (height_of_mb - s->chroma_y_shift);
533  } else {
534  s->dest[0] += (s->mb_y>>1) * linesize << height_of_mb;
535  s->dest[1] += (s->mb_y>>1) * uvlinesize << (height_of_mb - s->chroma_y_shift);
536  s->dest[2] += (s->mb_y>>1) * uvlinesize << (height_of_mb - s->chroma_y_shift);
537  av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
538  }
539 }
540 
541 /**
542  * set qscale and update qscale dependent variables.
543  */
544 void ff_set_qscale(MpegEncContext * s, int qscale)
545 {
546  if (qscale < 1)
547  qscale = 1;
548  else if (qscale > 31)
549  qscale = 31;
550 
551  s->qscale = qscale;
552  s->chroma_qscale= s->chroma_qscale_table[qscale];
553 
554  s->y_dc_scale= s->y_dc_scale_table[ qscale ];
555  s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
556 }
FF_ALLOCZ_TYPED_ARRAY
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
Definition: internal.h:78
PICT_FRAME
#define PICT_FRAME
Definition: mpegutils.h:33
ff_mpv_common_init
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
Definition: mpegvideo.c:398
mpegvideo_unquantize.h
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
BufferPoolContext::ref_index_pool
struct AVRefStructPool * ref_index_pool
Definition: mpegpicture.h:49
blockdsp.h
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
BufferPoolContext::mbskip_table_pool
struct AVRefStructPool * mbskip_table_pool
Definition: mpegpicture.h:45
ff_mpv_init_duplicate_contexts
av_cold int ff_mpv_init_duplicate_contexts(MpegEncContext *s)
Initialize an MpegEncContext's thread contexts.
Definition: mpegvideo.c:126
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
ff_update_duplicate_context
int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src)
Definition: mpegvideo.c:174
BACKUP
#define BACKUP(T, member)
ff_clean_intra_table_entries
void ff_clean_intra_table_entries(MpegEncContext *s)
Clean dc, ac for the current non-intra MB.
Definition: mpegvideo.c:486
PICT_BOTTOM_FIELD
#define PICT_BOTTOM_FIELD
Definition: mpegutils.h:32
AV_WN32A
#define AV_WN32A(p, v)
Definition: intreadwrite.h:534
ff_init_block_index
void ff_init_block_index(MpegEncContext *s)
Definition: mpegvideo.c:511
mpegvideo.h
AV_CODEC_FLAG_INTERLACED_ME
#define AV_CODEC_FLAG_INTERLACED_ME
interlaced motion estimation
Definition: avcodec.h:331
mpegutils.h
ff_idctdsp_init
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition: idctdsp.c:228
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
ff_permute_scantable
av_cold void ff_permute_scantable(uint8_t dst[64], const uint8_t src[64], const uint8_t permutation[64])
Definition: idctdsp.c:30
fail
#define fail()
Definition: checkasm.h:196
AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME
#define AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME
If this flag is set, the entries will be zeroed before being returned to the user (after the init or ...
Definition: refstruct.h:221
wrap
#define wrap(func)
Definition: neontest.h:65
MAX_THREADS
#define MAX_THREADS
Definition: frame_thread_encoder.c:37
av_pix_fmt_get_chroma_sub_sample
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: pixdesc.c:3369
ff_videodsp_init
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition: videodsp.c:39
FF_ALLOC_TYPED_ARRAY
#define FF_ALLOC_TYPED_ARRAY(p, nelem)
Definition: internal.h:77
COPY
#define COPY(M)
refstruct.h
BufferPoolContext::alloc_mb_stride
int alloc_mb_stride
mb_stride used to allocate tables
Definition: mpegpicture.h:52
ff_mpv_init_context_frame
av_cold int ff_mpv_init_context_frame(MpegEncContext *s)
Initialize and allocates MpegEncContext fields dependent on the resolution.
Definition: mpegvideo.c:230
avassert.h
gray16
static void gray16(uint8_t *dst, const uint8_t *src, ptrdiff_t linesize, int h)
Definition: mpegvideo.c:48
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:90
free_buffer_pools
static av_cold void free_buffer_pools(BufferPoolContext *pools)
Definition: mpegvideo.c:220
ff_blockdsp_init
av_cold void ff_blockdsp_init(BlockDSPContext *c)
Definition: blockdsp.c:58
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_mpv_framesize_alloc
int ff_mpv_framesize_alloc(AVCodecContext *avctx, ScratchpadContext *sc, int linesize)
Definition: mpegpicture.c:138
BufferPoolContext::mb_type_pool
struct AVRefStructPool * mb_type_pool
Definition: mpegpicture.h:47
ALLOC_POOL
#define ALLOC_POOL(name, size, flags)
ScanTable::scantable
const uint8_t * scantable
Definition: mpegvideo.h:48
free_duplicate_contexts
static av_cold void free_duplicate_contexts(MpegEncContext *s)
Definition: mpegvideo.c:165
BufferPoolContext::alloc_mb_height
int alloc_mb_height
mb_height used to allocate tables
Definition: mpegpicture.h:51
ff_hpeldsp_init
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:337
FMT_H263
@ FMT_H263
Definition: mpegvideo.h:56
ff_mpv_common_end
av_cold void ff_mpv_common_end(MpegEncContext *s)
Definition: mpegvideo.c:467
if
if(ret)
Definition: filter_design.txt:179
ff_mpv_unref_picture
void ff_mpv_unref_picture(MPVWorkPicture *pic)
Definition: mpegpicture.c:98
av_assume
#define av_assume(cond)
Definition: avassert.h:113
NULL
#define NULL
Definition: coverity.c:32
tmp
static uint8_t tmp[20]
Definition: aes_ctr.c:47
ff_mpv_idct_init
av_cold void ff_mpv_idct_init(MpegEncContext *s)
Definition: mpegvideo.c:95
ff_mpv_common_defaults
av_cold void ff_mpv_common_defaults(MpegEncContext *s)
Set the given MpegEncContext to common defaults (same for encoding and decoding).
Definition: mpegvideo.c:208
ff_set_qscale
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
Definition: mpegvideo.c:544
mathops.h
ff_alternate_horizontal_scan
const uint8_t ff_alternate_horizontal_scan[64]
Definition: mpegvideodata.c:52
RESTORE
#define RESTORE(T, member)
free_duplicate_context
static av_cold void free_duplicate_context(MpegEncContext *s)
Definition: mpegvideo.c:151
AV_WN32
#define AV_WN32(p, v)
Definition: intreadwrite.h:372
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
init_duplicate_context
static av_cold int init_duplicate_context(MpegEncContext *s)
Definition: mpegvideo.c:117
FF_THREAD_SLICE
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:1573
BufferPoolContext::qscale_table_pool
struct AVRefStructPool * qscale_table_pool
Definition: mpegpicture.h:46
mpegvideodata.h
attributes.h
ff_mpeg_er_init
av_cold int ff_mpeg_er_init(MpegEncContext *s)
Definition: mpeg_er.c:99
ff_init_scantable
av_cold void ff_init_scantable(const uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: mpegvideo.c:81
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ff_alternate_vertical_scan
const uint8_t ff_alternate_vertical_scan[64]
Definition: mpegvideodata.c:63
dsp_init
static av_cold void dsp_init(MpegEncContext *s)
Definition: mpegvideo.c:61
internal.h
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
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
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
FF_DEBUG_NOMC
#define FF_DEBUG_NOMC
Definition: avcodec.h:1389
idctdsp.h
avcodec.h
ff_zigzag_direct
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:137
ret
ret
Definition: filter_design.txt:187
U
#define U(x)
Definition: vpx_arith.h:37
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
BufferPoolContext::motion_val_pool
struct AVRefStructPool * motion_val_pool
Definition: mpegpicture.h:48
ff_default_chroma_qscale_table
const uint8_t ff_default_chroma_qscale_table[32]
Definition: mpegvideodata.c:21
mem.h
AV_CODEC_EXPORT_DATA_MVS
#define AV_CODEC_EXPORT_DATA_MVS
Export motion vectors through frame side data.
Definition: avcodec.h:386
ScanTable
Scantable.
Definition: mpegvideo.h:47
av_refstruct_pool_uninit
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition: refstruct.h:292
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
ScanTable::permutated
uint8_t permutated[64]
Definition: mpegvideo.h:49
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
mpeg_er.h
imgutils.h
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
BufferPoolContext
Definition: mpegpicture.h:44
ff_mpv_free_context_frame
av_cold void ff_mpv_free_context_frame(MpegEncContext *s)
Frees and resets MpegEncContext fields depending on the resolution as well as the slice thread contex...
Definition: mpegvideo.c:441
h
h
Definition: vp9dsp_template.c:2070
av_image_check_size
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:318
BufferPoolContext::alloc_mb_width
int alloc_mb_width
mb_width used to allocate tables
Definition: mpegpicture.h:50
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:54
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:64
gray8
static void gray8(uint8_t *dst, const uint8_t *src, ptrdiff_t linesize, int h)
Definition: mpegvideo.c:54
src
#define src
Definition: vp8dsp.c:248
ScanTable::raster_end
uint8_t raster_end[64]
Definition: mpegvideo.h:50