FFmpeg
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/intreadwrite.h"
35 #include "libavutil/mem.h"
36 
37 #include "avcodec.h"
38 #include "blockdsp.h"
39 #include "idctdsp.h"
40 #include "mathops.h"
41 #include "mpeg_er.h"
42 #include "mpegutils.h"
43 #include "mpegvideo.h"
44 #include "mpegvideodata.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 
82 {
83  if (s->codec_id == AV_CODEC_ID_MPEG4)
84  s->idsp.mpeg4_studio_profile = s->studio_profile;
85  ff_idctdsp_init(&s->idsp, s->avctx);
86 
87  /* load & permutate scantables
88  * note: only wmv uses different ones
89  */
90  if (s->alternate_scan) {
91  ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
92  ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
93  } else {
94  ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
95  ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
96  }
97 }
98 
100 {
101  const int nb_slices = s->slice_context_count;
102  const size_t slice_size = s->slice_ctx_size;
103 
104  for (int i = 1; i < nb_slices; i++) {
105  s->thread_context[i] = av_memdup(s, slice_size);
106  if (!s->thread_context[i])
107  return AVERROR(ENOMEM);
108  s->thread_context[i]->start_mb_y =
109  (s->mb_height * (i ) + nb_slices / 2) / nb_slices;
110  s->thread_context[i]->end_mb_y =
111  (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
112  }
113  s->start_mb_y = 0;
114  s->end_mb_y = nb_slices > 1 ? (s->mb_height + nb_slices / 2) / nb_slices
115  : s->mb_height;
116  return 0;
117 }
118 
120 {
121  if (!s)
122  return;
123 
124  av_freep(&s->sc.edge_emu_buffer);
125  av_freep(&s->sc.scratchpad_buf);
126  s->sc.obmc_scratchpad = NULL;
127  s->sc.linesize = 0;
128 }
129 
131 {
132  for (int i = 1; i < s->slice_context_count; i++) {
133  free_duplicate_context(s->thread_context[i]);
134  av_freep(&s->thread_context[i]);
135  }
137 }
138 
140 {
141 #define COPY(M) \
142  M(ScratchpadContext, sc) \
143  M(int, start_mb_y) \
144  M(int, end_mb_y) \
145  M(int16_t*, dc_val) \
146  M(void*, ac_val)
147 
148  int ret;
149  // FIXME copy only needed parts
150 #define BACKUP(T, member) T member = dst->member;
151  COPY(BACKUP)
152  memcpy(dst, src, sizeof(MpegEncContext));
153 #define RESTORE(T, member) dst->member = member;
154  COPY(RESTORE)
155 
156  ret = ff_mpv_framesize_alloc(dst->avctx, &dst->sc, dst->linesize);
157  if (ret < 0) {
158  av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
159  "scratch buffers.\n");
160  return ret;
161  }
162  return 0;
163 }
164 
165 /**
166  * Set the given MpegEncContext to common defaults
167  * (same for encoding and decoding).
168  * The changed fields will not depend upon the
169  * prior state of the MpegEncContext.
170  */
172 {
173  s->chroma_qscale_table = ff_default_chroma_qscale_table;
174  s->progressive_frame = 1;
175  s->progressive_sequence = 1;
176  s->picture_structure = PICT_FRAME;
177 
178  s->slice_context_count = 1;
179 }
180 
182 {
188  pools->alloc_mb_height = pools->alloc_mb_width = pools->alloc_mb_stride = 0;
189 }
190 
192 {
193  int nb_slices = (HAVE_THREADS &&
194  s->avctx->active_thread_type & FF_THREAD_SLICE) ?
195  s->avctx->thread_count : 1;
196  BufferPoolContext *const pools = &s->buffer_pools;
197  int y_size, c_size, yc_size, mb_array_size, mv_table_size, x, y;
198  int mb_height;
199 
200  if (s->encoding && s->avctx->slices)
201  nb_slices = s->avctx->slices;
202 
203  if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
204  s->mb_height = (s->height + 31) / 32 * 2;
205  else
206  s->mb_height = (s->height + 15) / 16;
207 
208  if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
209  int max_slices;
210  if (s->mb_height)
211  max_slices = FFMIN(MAX_THREADS, s->mb_height);
212  else
213  max_slices = MAX_THREADS;
214  av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
215  " reducing to %d\n", nb_slices, max_slices);
216  nb_slices = max_slices;
217  }
218 
219  s->slice_context_count = nb_slices;
220 
221  /* VC-1 can change from being progressive to interlaced on a per-frame
222  * basis. We therefore allocate certain buffers so big that they work
223  * in both instances. */
224  mb_height = s->msmpeg4_version == MSMP4_VC1 ?
225  FFALIGN(s->mb_height, 2) : s->mb_height;
226 
227  s->mb_width = (s->width + 15) / 16;
228  s->mb_stride = s->mb_width + 1;
229  s->b8_stride = s->mb_width * 2 + 1;
230  mb_array_size = mb_height * s->mb_stride;
231  mv_table_size = (mb_height + 2) * s->mb_stride + 1;
232 
233  /* set default edge pos, will be overridden
234  * in decode_header if needed */
235  s->h_edge_pos = s->mb_width * 16;
236  s->v_edge_pos = s->mb_height * 16;
237 
238  s->mb_num = s->mb_width * s->mb_height;
239 
240  s->block_wrap[0] =
241  s->block_wrap[1] =
242  s->block_wrap[2] =
243  s->block_wrap[3] = s->b8_stride;
244  s->block_wrap[4] =
245  s->block_wrap[5] = s->mb_stride;
246 
247  y_size = s->b8_stride * (2 * mb_height + 1);
248  c_size = s->mb_stride * (mb_height + 1);
249  yc_size = y_size + 2 * c_size;
250 
251  if (!FF_ALLOCZ_TYPED_ARRAY(s->mb_index2xy, s->mb_num + 1))
252  return AVERROR(ENOMEM);
253  for (y = 0; y < s->mb_height; y++)
254  for (x = 0; x < s->mb_width; x++)
255  s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
256 
257  s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
258 
259 #define ALLOC_POOL(name, size, flags) do { \
260  pools->name ##_pool = av_refstruct_pool_alloc((size), (flags)); \
261  if (!pools->name ##_pool) \
262  return AVERROR(ENOMEM); \
263 } while (0)
264 
265  if (s->codec_id == AV_CODEC_ID_MPEG4 ||
266  (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) {
267  /* interlaced direct mode decoding tables */
268  int16_t (*tmp)[2] = av_calloc(mv_table_size, 4 * sizeof(*tmp));
269  if (!tmp)
270  return AVERROR(ENOMEM);
271  s->p_field_mv_table_base = tmp;
272  tmp += s->mb_stride + 1;
273  for (int i = 0; i < 2; i++) {
274  for (int j = 0; j < 2; j++) {
275  s->p_field_mv_table[i][j] = tmp;
276  tmp += mv_table_size;
277  }
278  }
279  if (s->codec_id == AV_CODEC_ID_MPEG4) {
280  ALLOC_POOL(mbskip_table, mb_array_size + 2,
281  !s->encoding ? AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME : 0);
282  if (!s->encoding) {
283  /* cbp, pred_dir */
284  if (!(s->cbp_table = av_mallocz(mb_array_size)) ||
285  !(s->pred_dir_table = av_mallocz(mb_array_size)))
286  return AVERROR(ENOMEM);
287  }
288  }
289  }
290 
291  if (s->msmpeg4_version >= MSMP4_V3) {
292  s->coded_block_base = av_mallocz(y_size);
293  if (!s->coded_block_base)
294  return AVERROR(ENOMEM);
295  s->coded_block = s->coded_block_base + s->b8_stride + 1;
296  }
297 
298  if (s->h263_pred || s->h263_aic || !s->encoding) {
299  // When encoding, each slice (and therefore each thread)
300  // gets its own ac_val and dc_val buffers in order to avoid
301  // races.
302  size_t allslice_yc_size = yc_size * (s->encoding ? nb_slices : 1);
303  if (s->out_format == FMT_H263) {
304  /* ac values */
305  if (!FF_ALLOCZ_TYPED_ARRAY(s->ac_val_base, allslice_yc_size))
306  return AVERROR(ENOMEM);
307  s->ac_val = s->ac_val_base + s->b8_stride + 1;
308  }
309 
310  /* dc values */
311  // MN: we need these for error resilience of intra-frames
312  // Allocating them unconditionally for decoders also means
313  // that we don't need to reinitialize when e.g. h263_aic changes.
314 
315  // y_size and therefore yc_size is always odd; allocate one element
316  // more for each encoder slice in order to be able to align each slice's
317  // dc_val to four in order to use aligned stores when cleaning dc_val.
318  allslice_yc_size += s->encoding * nb_slices;
319  if (!FF_ALLOC_TYPED_ARRAY(s->dc_val_base, allslice_yc_size))
320  return AVERROR(ENOMEM);
321  s->dc_val = s->dc_val_base + s->b8_stride + 1;
322  for (size_t i = 0; i < allslice_yc_size; ++i)
323  s->dc_val_base[i] = 1024;
324  }
325 
326  // Note the + 1 is for a quicker MPEG-4 slice_end detection
327  if (!(s->mbskip_table = av_mallocz(mb_array_size + 2)) ||
328  /* which mb is an intra block, init macroblock skip table */
329  !(s->mbintra_table = av_mallocz(mb_array_size)))
330  return AVERROR(ENOMEM);
331 
332  ALLOC_POOL(qscale_table, mv_table_size, 0);
333  ALLOC_POOL(mb_type, mv_table_size * sizeof(uint32_t), 0);
334 
335  if (s->out_format == FMT_H263 || s->encoding ||
336  (s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS)) {
337  const int b8_array_size = s->b8_stride * mb_height * 2;
338  int mv_size = 2 * (b8_array_size + 4) * sizeof(int16_t);
339  int ref_index_size = 4 * mb_array_size;
340 
341  /* FIXME: The output of H.263 with OBMC depends upon
342  * the earlier content of the buffer; therefore we set
343  * the flags to always reset returned buffers here. */
345  ALLOC_POOL(ref_index, ref_index_size, 0);
346  }
347 #undef ALLOC_POOL
348  pools->alloc_mb_width = s->mb_width;
349  pools->alloc_mb_height = mb_height;
350  pools->alloc_mb_stride = s->mb_stride;
351 
352  return !CONFIG_MPEGVIDEODEC || s->encoding ? 0 : ff_mpeg_er_init(s);
353 }
354 
355 /**
356  * init common structure for both encoder and decoder.
357  * this assumes that some variables like width/height are already set
358  */
360 {
361  int ret;
362 
363  if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
364  av_log(s->avctx, AV_LOG_ERROR,
365  "decoding to AV_PIX_FMT_NONE is not supported.\n");
366  return AVERROR(EINVAL);
367  }
368 
369  if ((s->width || s->height) &&
370  av_image_check_size(s->width, s->height, 0, s->avctx))
371  return AVERROR(EINVAL);
372 
373  dsp_init(s);
374 
375  /* set chroma shifts */
376  ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
377  &s->chroma_x_shift,
378  &s->chroma_y_shift);
379  if (ret)
380  return ret;
381 
383  goto fail;
384 
385  s->context_initialized = 1;
386  s->thread_context[0] = s;
387 
388 // if (s->width && s->height) {
389  if (!s->encoding) {
391  if (ret < 0)
392  goto fail;
393  }
394 // }
395 
396  return 0;
397  fail:
399  return ret;
400 }
401 
403 {
405 
406  free_buffer_pools(&s->buffer_pools);
407  av_freep(&s->p_field_mv_table_base);
408  for (int i = 0; i < 2; i++)
409  for (int j = 0; j < 2; j++)
410  s->p_field_mv_table[i][j] = NULL;
411 
412  av_freep(&s->ac_val_base);
413  av_freep(&s->dc_val_base);
414  av_freep(&s->coded_block_base);
415  av_freep(&s->mbintra_table);
416  av_freep(&s->cbp_table);
417  av_freep(&s->pred_dir_table);
418 
419  av_freep(&s->mbskip_table);
420 
421  av_freep(&s->er.error_status_table);
422  av_freep(&s->er.er_temp_buffer);
423  av_freep(&s->mb_index2xy);
424 
425  s->linesize = s->uvlinesize = 0;
426 }
427 
429 {
431  if (s->slice_context_count > 1)
432  s->slice_context_count = 1;
433 
434  ff_mpv_unref_picture(&s->last_pic);
435  ff_mpv_unref_picture(&s->cur_pic);
436  ff_mpv_unref_picture(&s->next_pic);
437 
438  s->context_initialized = 0;
439  s->context_reinit = 0;
440  s->linesize = s->uvlinesize = 0;
441 }
442 
443 
444 /**
445  * Clean dc, ac for the current non-intra MB.
446  */
448 {
449  int wrap = s->b8_stride;
450  int xy = s->block_index[0];
451  /* chroma */
452  unsigned uxy = s->block_index[4];
453  unsigned vxy = s->block_index[5];
454  int16_t *dc_val = s->dc_val;
455 
456  AV_WN32A(dc_val + xy, 1024 << 16 | 1024);
457  AV_WN32 (dc_val + xy + wrap, 1024 << 16 | 1024);
458  dc_val[uxy] =
459  dc_val[vxy] = 1024;
460  /* ac pred */
461  int16_t (*ac_val)[16] = s->ac_val;
462  av_assume(!((uintptr_t)ac_val & 0xF));
463  // Don't reset the upper-left luma block, as it will only ever be
464  // referenced by blocks from the same macroblock.
465  memset(ac_val[xy + 1], 0, sizeof(*ac_val));
466  memset(ac_val[xy + wrap], 0, 2 * sizeof(*ac_val));
467  /* ac pred */
468  memset(ac_val[uxy], 0, sizeof(*ac_val));
469  memset(ac_val[vxy], 0, sizeof(*ac_val));
470 }
471 
472 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
473  const int linesize = s->cur_pic.linesize[0]; //not s->linesize as this would be wrong for field pics
474  const int uvlinesize = s->cur_pic.linesize[1];
475  const int width_of_mb = (4 + (s->avctx->bits_per_raw_sample > 8)) - s->avctx->lowres;
476  const int height_of_mb = 4 - s->avctx->lowres;
477 
478  s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
479  s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
480  s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
481  s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
482  s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
483  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;
484  //block_index is not used by mpeg2, so it is not affected by chroma_format
485 
486  s->dest[0] = s->cur_pic.data[0] + (int)((s->mb_x - 1U) << width_of_mb);
487  s->dest[1] = s->cur_pic.data[1] + (int)((s->mb_x - 1U) << (width_of_mb - s->chroma_x_shift));
488  s->dest[2] = s->cur_pic.data[2] + (int)((s->mb_x - 1U) << (width_of_mb - s->chroma_x_shift));
489 
490  if (s->picture_structure == PICT_FRAME) {
491  s->dest[0] += s->mb_y * linesize << height_of_mb;
492  s->dest[1] += s->mb_y * uvlinesize << (height_of_mb - s->chroma_y_shift);
493  s->dest[2] += s->mb_y * uvlinesize << (height_of_mb - s->chroma_y_shift);
494  } else {
495  s->dest[0] += (s->mb_y>>1) * linesize << height_of_mb;
496  s->dest[1] += (s->mb_y>>1) * uvlinesize << (height_of_mb - s->chroma_y_shift);
497  s->dest[2] += (s->mb_y>>1) * uvlinesize << (height_of_mb - s->chroma_y_shift);
498  av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
499  }
500 }
501 
502 /**
503  * set qscale and update qscale dependent variables.
504  */
505 void ff_set_qscale(MpegEncContext * s, int qscale)
506 {
507  if (qscale < 1)
508  qscale = 1;
509  else if (qscale > 31)
510  qscale = 31;
511 
512  s->qscale = qscale;
513  s->chroma_qscale= s->chroma_qscale_table[qscale];
514 
515  s->y_dc_scale= s->y_dc_scale_table[ qscale ];
516  s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
517 }
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:359
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:99
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:139
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:447
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:472
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
fail
#define fail()
Definition: checkasm.h:214
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
ff_init_scantable
void ff_init_scantable(const uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: mpegvideo_unquantize.c:36
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:3484
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:191
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:106
free_buffer_pools
static av_cold void free_buffer_pools(BufferPoolContext *pools)
Definition: mpegvideo.c:181
ff_blockdsp_init
av_cold void ff_blockdsp_init(BlockDSPContext *c)
Definition: blockdsp.c:58
intreadwrite.h
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)
free_duplicate_contexts
static av_cold void free_duplicate_contexts(MpegEncContext *s)
Definition: mpegvideo.c:130
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
BufferPoolContext::alloc_mb_height
int alloc_mb_height
mb_height used to allocate tables
Definition: mpegpicture.h:51
FMT_H263
@ FMT_H263
Definition: mpegvideo.h:57
ff_mpv_common_end
av_cold void ff_mpv_common_end(MpegEncContext *s)
Definition: mpegvideo.c:428
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:111
NULL
#define NULL
Definition: coverity.c:32
ff_mpv_idct_init
av_cold void ff_mpv_idct_init(MpegEncContext *s)
Definition: mpegvideo.c:81
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:171
ff_set_qscale
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
Definition: mpegvideo.c:505
mathops.h
RESTORE
#define RESTORE(T, member)
free_duplicate_context
static av_cold void free_duplicate_context(MpegEncContext *s)
Definition: mpegvideo.c:119
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
FF_THREAD_SLICE
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:1581
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:96
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_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
FF_DEBUG_NOMC
#define FF_DEBUG_NOMC
Definition: avcodec.h:1397
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
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
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:402
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:67
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
ff_hpeldsp_init
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:337