FFmpeg
frame.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "channel_layout.h"
20 #include "avassert.h"
21 #include "buffer.h"
22 #include "common.h"
23 #include "cpu.h"
24 #include "dict.h"
25 #include "frame.h"
26 #include "imgutils.h"
27 #include "mem.h"
28 #include "samplefmt.h"
29 #include "side_data.h"
30 #include "hwcontext.h"
31 
33 {
34  memset(frame, 0, sizeof(*frame));
35 
36  frame->pts =
37  frame->pkt_dts = AV_NOPTS_VALUE;
38  frame->best_effort_timestamp = AV_NOPTS_VALUE;
39  frame->duration = 0;
40 #if FF_API_FRAME_PKT
42  frame->pkt_pos = -1;
43  frame->pkt_size = -1;
45 #endif
46  frame->time_base = (AVRational){ 0, 1 };
47  frame->sample_aspect_ratio = (AVRational){ 0, 1 };
48  frame->format = -1; /* unknown */
49  frame->extended_data = frame->data;
50  frame->color_primaries = AVCOL_PRI_UNSPECIFIED;
51  frame->color_trc = AVCOL_TRC_UNSPECIFIED;
52  frame->colorspace = AVCOL_SPC_UNSPECIFIED;
53  frame->color_range = AVCOL_RANGE_UNSPECIFIED;
54  frame->chroma_location = AVCHROMA_LOC_UNSPECIFIED;
55  frame->flags = 0;
56 }
57 
59 {
60  AVFrame *frame = av_malloc(sizeof(*frame));
61 
62  if (!frame)
63  return NULL;
64 
66 
67  return frame;
68 }
69 
71 {
72  if (!frame || !*frame)
73  return;
74 
76  av_freep(frame);
77 }
78 
79 #define ALIGN (HAVE_SIMD_ALIGN_64 ? 64 : 32)
80 
82 {
84  int ret, padded_height;
85  int plane_padding;
86  ptrdiff_t linesizes[4];
87  size_t total_size, sizes[4];
88 
89  if (!desc)
90  return AVERROR(EINVAL);
91 
92  if ((ret = av_image_check_size(frame->width, frame->height, 0, NULL)) < 0)
93  return ret;
94 
95  if (align <= 0)
96  align = ALIGN;
97  plane_padding = FFMAX(ALIGN, align);
98 
99  if (!frame->linesize[0]) {
100  for (int i = 1; i <= align; i += i) {
101  ret = av_image_fill_linesizes(frame->linesize, frame->format,
102  FFALIGN(frame->width, i));
103  if (ret < 0)
104  return ret;
105  if (!(frame->linesize[0] & (align-1)))
106  break;
107  }
108 
109  for (int i = 0; i < 4 && frame->linesize[i]; i++)
110  frame->linesize[i] = FFALIGN(frame->linesize[i], align);
111  }
112 
113  for (int i = 0; i < 4; i++)
114  linesizes[i] = frame->linesize[i];
115 
116  padded_height = FFALIGN(frame->height, 32);
117  if ((ret = av_image_fill_plane_sizes(sizes, frame->format,
118  padded_height, linesizes)) < 0)
119  return ret;
120 
121  total_size = 4 * plane_padding + 4 * align;
122  for (int i = 0; i < 4; i++) {
123  if (sizes[i] > SIZE_MAX - total_size)
124  return AVERROR(EINVAL);
125  total_size += sizes[i];
126  }
127 
128  frame->buf[0] = av_buffer_alloc(total_size);
129  if (!frame->buf[0]) {
130  ret = AVERROR(ENOMEM);
131  goto fail;
132  }
133 
134  if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
135  frame->buf[0]->data, frame->linesize)) < 0)
136  goto fail;
137 
138  for (int i = 1; i < 4; i++) {
139  if (frame->data[i])
140  frame->data[i] += i * plane_padding;
141  frame->data[i] = (uint8_t *)FFALIGN((uintptr_t)frame->data[i], align);
142  }
143 
144  frame->extended_data = frame->data;
145 
146  return 0;
147 fail:
149  return ret;
150 }
151 
153 {
154  int planar = av_sample_fmt_is_planar(frame->format);
155  int channels, planes;
156  size_t size;
157  int ret;
158 
159  channels = frame->ch_layout.nb_channels;
160  planes = planar ? channels : 1;
161  if (!frame->linesize[0]) {
162  ret = av_samples_get_buffer_size(&frame->linesize[0], channels,
163  frame->nb_samples, frame->format,
164  align);
165  if (ret < 0)
166  return ret;
167  }
168 
169  if (align <= 0)
170  align = ALIGN;
171 
173  frame->extended_data = av_calloc(planes,
174  sizeof(*frame->extended_data));
175  frame->extended_buf = av_calloc(planes - AV_NUM_DATA_POINTERS,
176  sizeof(*frame->extended_buf));
177  if (!frame->extended_data || !frame->extended_buf) {
178  av_freep(&frame->extended_data);
179  av_freep(&frame->extended_buf);
180  return AVERROR(ENOMEM);
181  }
182  frame->nb_extended_buf = planes - AV_NUM_DATA_POINTERS;
183  } else
184  frame->extended_data = frame->data;
185 
186  if (frame->linesize[0] > SIZE_MAX - align)
187  return AVERROR(EINVAL);
188  size = frame->linesize[0] + (size_t)align;
189 
190  for (int i = 0; i < FFMIN(planes, AV_NUM_DATA_POINTERS); i++) {
191  frame->buf[i] = av_buffer_alloc(size);
192  if (!frame->buf[i]) {
194  return AVERROR(ENOMEM);
195  }
196  frame->extended_data[i] = frame->data[i] =
197  (uint8_t *)FFALIGN((uintptr_t)frame->buf[i]->data, align);
198  }
199  for (int i = 0; i < planes - AV_NUM_DATA_POINTERS; i++) {
200  frame->extended_buf[i] = av_buffer_alloc(size);
201  if (!frame->extended_buf[i]) {
203  return AVERROR(ENOMEM);
204  }
205  frame->extended_data[i + AV_NUM_DATA_POINTERS] =
206  (uint8_t *)FFALIGN((uintptr_t)frame->extended_buf[i]->data, align);
207  }
208  return 0;
209 
210 }
211 
213 {
214  if (frame->format < 0)
215  return AVERROR(EINVAL);
216 
217  if (frame->width > 0 && frame->height > 0)
218  return get_video_buffer(frame, align);
219  else if (frame->nb_samples > 0 &&
220  (av_channel_layout_check(&frame->ch_layout)))
221  return get_audio_buffer(frame, align);
222 
223  return AVERROR(EINVAL);
224 }
225 
226 static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy)
227 {
228  int ret;
229 
230 #if FF_API_FRAME_KEY
232  dst->key_frame = src->key_frame;
234 #endif
235  dst->pict_type = src->pict_type;
236  dst->sample_aspect_ratio = src->sample_aspect_ratio;
237  dst->crop_top = src->crop_top;
238  dst->crop_bottom = src->crop_bottom;
239  dst->crop_left = src->crop_left;
240  dst->crop_right = src->crop_right;
241  dst->pts = src->pts;
242  dst->duration = src->duration;
243  dst->repeat_pict = src->repeat_pict;
244 #if FF_API_INTERLACED_FRAME
246  dst->interlaced_frame = src->interlaced_frame;
247  dst->top_field_first = src->top_field_first;
249 #endif
250 #if FF_API_PALETTE_HAS_CHANGED
252  dst->palette_has_changed = src->palette_has_changed;
254 #endif
255  dst->sample_rate = src->sample_rate;
256  dst->opaque = src->opaque;
257  dst->pkt_dts = src->pkt_dts;
258 #if FF_API_FRAME_PKT
260  dst->pkt_pos = src->pkt_pos;
261  dst->pkt_size = src->pkt_size;
263 #endif
264  dst->time_base = src->time_base;
265  dst->quality = src->quality;
266  dst->best_effort_timestamp = src->best_effort_timestamp;
267  dst->flags = src->flags;
268  dst->decode_error_flags = src->decode_error_flags;
269  dst->color_primaries = src->color_primaries;
270  dst->color_trc = src->color_trc;
271  dst->colorspace = src->colorspace;
272  dst->color_range = src->color_range;
273  dst->chroma_location = src->chroma_location;
274 
275  av_dict_copy(&dst->metadata, src->metadata, 0);
276 
277  for (int i = 0; i < src->nb_side_data; i++) {
278  const AVFrameSideData *sd_src = src->side_data[i];
279  AVFrameSideData *sd_dst;
280  if ( sd_src->type == AV_FRAME_DATA_PANSCAN
281  && (src->width != dst->width || src->height != dst->height))
282  continue;
283  if (force_copy) {
284  sd_dst = av_frame_new_side_data(dst, sd_src->type,
285  sd_src->size);
286  if (!sd_dst) {
287  av_frame_side_data_free(&dst->side_data, &dst->nb_side_data);
288  return AVERROR(ENOMEM);
289  }
290  memcpy(sd_dst->data, sd_src->data, sd_src->size);
291  } else {
292  AVBufferRef *ref = av_buffer_ref(sd_src->buf);
293  sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref);
294  if (!sd_dst) {
296  av_frame_side_data_free(&dst->side_data, &dst->nb_side_data);
297  return AVERROR(ENOMEM);
298  }
299  }
300  av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
301  }
302 
303  ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref);
304  ret |= av_buffer_replace(&dst->private_ref, src->private_ref);
305  return ret;
306 }
307 
309 {
310  int ret = 0;
311 
312  av_assert1(dst->width == 0 && dst->height == 0);
313  av_assert1(dst->ch_layout.nb_channels == 0 &&
314  dst->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC);
315 
316  dst->format = src->format;
317  dst->width = src->width;
318  dst->height = src->height;
319  dst->nb_samples = src->nb_samples;
320 
321  ret = frame_copy_props(dst, src, 0);
322  if (ret < 0)
323  goto fail;
324 
325  ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
326  if (ret < 0)
327  goto fail;
328 
329  /* duplicate the frame data if it's not refcounted */
330  if (!src->buf[0]) {
332  if (ret < 0)
333  goto fail;
334 
335  ret = av_frame_copy(dst, src);
336  if (ret < 0)
337  goto fail;
338 
339  return 0;
340  }
341 
342  /* ref the buffers */
343  for (int i = 0; i < FF_ARRAY_ELEMS(src->buf); i++) {
344  if (!src->buf[i])
345  continue;
346  dst->buf[i] = av_buffer_ref(src->buf[i]);
347  if (!dst->buf[i]) {
348  ret = AVERROR(ENOMEM);
349  goto fail;
350  }
351  }
352 
353  if (src->extended_buf) {
354  dst->extended_buf = av_calloc(src->nb_extended_buf,
355  sizeof(*dst->extended_buf));
356  if (!dst->extended_buf) {
357  ret = AVERROR(ENOMEM);
358  goto fail;
359  }
360  dst->nb_extended_buf = src->nb_extended_buf;
361 
362  for (int i = 0; i < src->nb_extended_buf; i++) {
363  dst->extended_buf[i] = av_buffer_ref(src->extended_buf[i]);
364  if (!dst->extended_buf[i]) {
365  ret = AVERROR(ENOMEM);
366  goto fail;
367  }
368  }
369  }
370 
371  if (src->hw_frames_ctx) {
372  dst->hw_frames_ctx = av_buffer_ref(src->hw_frames_ctx);
373  if (!dst->hw_frames_ctx) {
374  ret = AVERROR(ENOMEM);
375  goto fail;
376  }
377  }
378 
379  /* duplicate extended data */
380  if (src->extended_data != src->data) {
381  int ch = dst->ch_layout.nb_channels;
382 
383  if (!ch) {
384  ret = AVERROR(EINVAL);
385  goto fail;
386  }
387 
388  dst->extended_data = av_malloc_array(sizeof(*dst->extended_data), ch);
389  if (!dst->extended_data) {
390  ret = AVERROR(ENOMEM);
391  goto fail;
392  }
393  memcpy(dst->extended_data, src->extended_data, sizeof(*src->extended_data) * ch);
394  } else
395  dst->extended_data = dst->data;
396 
397  memcpy(dst->data, src->data, sizeof(src->data));
398  memcpy(dst->linesize, src->linesize, sizeof(src->linesize));
399 
400  return 0;
401 
402 fail:
404  return ret;
405 }
406 
408 {
409  int ret = 0;
410 
411  if (dst == src)
412  return AVERROR(EINVAL);
413 
414  if (!src->buf[0]) {
416 
417  /* duplicate the frame data if it's not refcounted */
418  if ( src->data[0] || src->data[1]
419  || src->data[2] || src->data[3])
420  return av_frame_ref(dst, src);
421 
422  ret = frame_copy_props(dst, src, 0);
423  if (ret < 0)
424  goto fail;
425  }
426 
427  dst->format = src->format;
428  dst->width = src->width;
429  dst->height = src->height;
430  dst->nb_samples = src->nb_samples;
431 
432  ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
433  if (ret < 0)
434  goto fail;
435 
436  av_frame_side_data_free(&dst->side_data, &dst->nb_side_data);
437  av_dict_free(&dst->metadata);
438  ret = frame_copy_props(dst, src, 0);
439  if (ret < 0)
440  goto fail;
441 
442  /* replace the buffers */
443  for (int i = 0; i < FF_ARRAY_ELEMS(src->buf); i++) {
444  ret = av_buffer_replace(&dst->buf[i], src->buf[i]);
445  if (ret < 0)
446  goto fail;
447  }
448 
449  if (src->extended_buf) {
450  if (dst->nb_extended_buf != src->nb_extended_buf) {
451  int nb_extended_buf = FFMIN(dst->nb_extended_buf, src->nb_extended_buf);
452  void *tmp;
453 
454  for (int i = nb_extended_buf; i < dst->nb_extended_buf; i++)
455  av_buffer_unref(&dst->extended_buf[i]);
456 
457  tmp = av_realloc_array(dst->extended_buf, sizeof(*dst->extended_buf),
458  src->nb_extended_buf);
459  if (!tmp) {
460  ret = AVERROR(ENOMEM);
461  goto fail;
462  }
463  dst->extended_buf = tmp;
464  dst->nb_extended_buf = src->nb_extended_buf;
465 
466  memset(&dst->extended_buf[nb_extended_buf], 0,
467  (src->nb_extended_buf - nb_extended_buf) * sizeof(*dst->extended_buf));
468  }
469 
470  for (int i = 0; i < src->nb_extended_buf; i++) {
471  ret = av_buffer_replace(&dst->extended_buf[i], src->extended_buf[i]);
472  if (ret < 0)
473  goto fail;
474  }
475  } else if (dst->extended_buf) {
476  for (int i = 0; i < dst->nb_extended_buf; i++)
477  av_buffer_unref(&dst->extended_buf[i]);
478  av_freep(&dst->extended_buf);
479  }
480 
481  ret = av_buffer_replace(&dst->hw_frames_ctx, src->hw_frames_ctx);
482  if (ret < 0)
483  goto fail;
484 
485  if (dst->extended_data != dst->data)
486  av_freep(&dst->extended_data);
487 
488  if (src->extended_data != src->data) {
489  int ch = dst->ch_layout.nb_channels;
490 
491  if (!ch) {
492  ret = AVERROR(EINVAL);
493  goto fail;
494  }
495 
496  if (ch > SIZE_MAX / sizeof(*dst->extended_data))
497  goto fail;
498 
499  dst->extended_data = av_memdup(src->extended_data, sizeof(*dst->extended_data) * ch);
500  if (!dst->extended_data) {
501  ret = AVERROR(ENOMEM);
502  goto fail;
503  }
504  } else
505  dst->extended_data = dst->data;
506 
507  memcpy(dst->data, src->data, sizeof(src->data));
508  memcpy(dst->linesize, src->linesize, sizeof(src->linesize));
509 
510  return 0;
511 
512 fail:
514  return ret;
515 }
516 
518 {
520 
521  if (!ret)
522  return NULL;
523 
524  if (av_frame_ref(ret, src) < 0)
525  av_frame_free(&ret);
526 
527  return ret;
528 }
529 
531 {
532  if (!frame)
533  return;
534 
535  av_frame_side_data_free(&frame->side_data, &frame->nb_side_data);
536 
537  for (int i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
538  av_buffer_unref(&frame->buf[i]);
539  for (int i = 0; i < frame->nb_extended_buf; i++)
540  av_buffer_unref(&frame->extended_buf[i]);
541  av_freep(&frame->extended_buf);
542  av_dict_free(&frame->metadata);
543 
544  av_buffer_unref(&frame->hw_frames_ctx);
545 
546  av_buffer_unref(&frame->opaque_ref);
547  av_buffer_unref(&frame->private_ref);
548 
549  if (frame->extended_data != frame->data)
550  av_freep(&frame->extended_data);
551 
552  av_channel_layout_uninit(&frame->ch_layout);
553 
555 }
556 
558 {
559  av_assert1(dst->width == 0 && dst->height == 0);
560  av_assert1(dst->ch_layout.nb_channels == 0 &&
561  dst->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC);
562 
563  *dst = *src;
564  if (src->extended_data == src->data)
565  dst->extended_data = dst->data;
567 }
568 
570 {
571  int ret = 1;
572 
573  /* assume non-refcounted frames are not writable */
574  if (!frame->buf[0])
575  return 0;
576 
577  for (int i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
578  if (frame->buf[i])
579  ret &= !!av_buffer_is_writable(frame->buf[i]);
580  for (int i = 0; i < frame->nb_extended_buf; i++)
581  ret &= !!av_buffer_is_writable(frame->extended_buf[i]);
582 
583  return ret;
584 }
585 
587 {
588  AVFrame tmp;
589  int ret;
590 
592  return 0;
593 
594  memset(&tmp, 0, sizeof(tmp));
595  tmp.format = frame->format;
596  tmp.width = frame->width;
597  tmp.height = frame->height;
598  tmp.nb_samples = frame->nb_samples;
599  ret = av_channel_layout_copy(&tmp.ch_layout, &frame->ch_layout);
600  if (ret < 0) {
602  return ret;
603  }
604 
605  if (frame->hw_frames_ctx)
606  ret = av_hwframe_get_buffer(frame->hw_frames_ctx, &tmp, 0);
607  else
608  ret = av_frame_get_buffer(&tmp, 0);
609  if (ret < 0)
610  return ret;
611 
612  ret = av_frame_copy(&tmp, frame);
613  if (ret < 0) {
615  return ret;
616  }
617 
619  if (ret < 0) {
621  return ret;
622  }
623 
625 
626  *frame = tmp;
627  if (tmp.data == tmp.extended_data)
628  frame->extended_data = frame->data;
629 
630  return 0;
631 }
632 
634 {
635  return frame_copy_props(dst, src, 1);
636 }
637 
639 {
640  uintptr_t data;
641  int planes;
642 
643  if (frame->nb_samples) {
644  int channels = frame->ch_layout.nb_channels;
645  if (!channels)
646  return NULL;
647  planes = av_sample_fmt_is_planar(frame->format) ? channels : 1;
648  } else
649  planes = 4;
650 
651  if (plane < 0 || plane >= planes || !frame->extended_data[plane])
652  return NULL;
653  data = (uintptr_t)frame->extended_data[plane];
654 
655  for (int i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++) {
656  AVBufferRef *buf = frame->buf[i];
657  uintptr_t buf_begin = (uintptr_t)buf->data;
658 
659  if (data >= buf_begin && data < buf_begin + buf->size)
660  return buf;
661  }
662  for (int i = 0; i < frame->nb_extended_buf; i++) {
663  AVBufferRef *buf = frame->extended_buf[i];
664  uintptr_t buf_begin = (uintptr_t)buf->data;
665 
666  if (data >= buf_begin && data < buf_begin + buf->size)
667  return buf;
668  }
669  return NULL;
670 }
671 
674  AVBufferRef *buf)
675 {
676  return
678  &frame->side_data, &frame->nb_side_data, type, buf);
679 }
680 
683  size_t size)
684 {
688  if (!ret)
689  av_buffer_unref(&buf);
690  return ret;
691 }
692 
695 {
697  frame->side_data, frame->nb_side_data,
698  type
699  );
700 }
701 
702 static int frame_copy_video(AVFrame *dst, const AVFrame *src)
703 {
704  int planes;
705 
706  if (dst->width < src->width ||
707  dst->height < src->height)
708  return AVERROR(EINVAL);
709 
710  if (src->hw_frames_ctx || dst->hw_frames_ctx)
711  return av_hwframe_transfer_data(dst, src, 0);
712 
714  for (int i = 0; i < planes; i++)
715  if (!dst->data[i] || !src->data[i])
716  return AVERROR(EINVAL);
717 
718  av_image_copy2(dst->data, dst->linesize,
719  src->data, src->linesize,
720  dst->format, src->width, src->height);
721 
722  return 0;
723 }
724 
725 static int frame_copy_audio(AVFrame *dst, const AVFrame *src)
726 {
727  int planar = av_sample_fmt_is_planar(dst->format);
728  int channels = dst->ch_layout.nb_channels;
729  int planes = planar ? channels : 1;
730 
731  if (dst->nb_samples != src->nb_samples ||
732  av_channel_layout_compare(&dst->ch_layout, &src->ch_layout))
733  return AVERROR(EINVAL);
734 
735  for (int i = 0; i < planes; i++)
736  if (!dst->extended_data[i] || !src->extended_data[i])
737  return AVERROR(EINVAL);
738 
739  av_samples_copy(dst->extended_data, src->extended_data, 0, 0,
740  dst->nb_samples, channels, dst->format);
741 
742  return 0;
743 }
744 
746 {
747  if (dst->format != src->format || dst->format < 0)
748  return AVERROR(EINVAL);
749 
750  if (dst->width > 0 && dst->height > 0)
751  return frame_copy_video(dst, src);
752  else if (dst->nb_samples > 0 &&
753  (av_channel_layout_check(&dst->ch_layout)))
754  return frame_copy_audio(dst, src);
755 
756  return AVERROR(EINVAL);
757 }
758 
760 {
761  av_frame_side_data_remove(&frame->side_data, &frame->nb_side_data, type);
762 }
763 
764 static int calc_cropping_offsets(size_t offsets[4], const AVFrame *frame,
765  const AVPixFmtDescriptor *desc)
766 {
767  for (int i = 0; frame->data[i]; i++) {
769  int shift_x = (i == 1 || i == 2) ? desc->log2_chroma_w : 0;
770  int shift_y = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
771 
772  if (desc->flags & AV_PIX_FMT_FLAG_PAL && i == 1) {
773  offsets[i] = 0;
774  break;
775  }
776 
777  /* find any component descriptor for this plane */
778  for (int j = 0; j < desc->nb_components; j++) {
779  if (desc->comp[j].plane == i) {
780  comp = &desc->comp[j];
781  break;
782  }
783  }
784  if (!comp)
785  return AVERROR_BUG;
786 
787  offsets[i] = (frame->crop_top >> shift_y) * frame->linesize[i] +
788  (frame->crop_left >> shift_x) * comp->step;
789  }
790 
791  return 0;
792 }
793 
795 {
796  const AVPixFmtDescriptor *desc;
797  size_t offsets[4];
798  int ret;
799 
800  if (!(frame->width > 0 && frame->height > 0))
801  return AVERROR(EINVAL);
802 
803  if (frame->crop_left >= INT_MAX - frame->crop_right ||
804  frame->crop_top >= INT_MAX - frame->crop_bottom ||
805  (frame->crop_left + frame->crop_right) >= frame->width ||
806  (frame->crop_top + frame->crop_bottom) >= frame->height)
807  return AVERROR(ERANGE);
808 
809  desc = av_pix_fmt_desc_get(frame->format);
810  if (!desc)
811  return AVERROR_BUG;
812 
813  /* Apply just the right/bottom cropping for hwaccel formats. Bitstream
814  * formats cannot be easily handled here either (and corresponding decoders
815  * should not export any cropping anyway), so do the same for those as well.
816  * */
818  frame->width -= frame->crop_right;
819  frame->height -= frame->crop_bottom;
820  frame->crop_right = 0;
821  frame->crop_bottom = 0;
822  return 0;
823  }
824 
825  /* calculate the offsets for each plane */
827  if (ret < 0)
828  return ret;
829 
830  /* adjust the offsets to avoid breaking alignment */
831  if (!(flags & AV_FRAME_CROP_UNALIGNED)) {
832  int log2_crop_align = frame->crop_left ? ff_ctz(frame->crop_left) : INT_MAX;
833  int min_log2_align = INT_MAX;
834 
835  for (int i = 0; frame->data[i]; i++) {
836  int log2_align = offsets[i] ? ff_ctz(offsets[i]) : INT_MAX;
837  min_log2_align = FFMIN(log2_align, min_log2_align);
838  }
839 
840  /* we assume, and it should always be true, that the data alignment is
841  * related to the cropping alignment by a constant power-of-2 factor */
842  if (log2_crop_align < min_log2_align)
843  return AVERROR_BUG;
844 
845  if (min_log2_align < 5 && log2_crop_align != INT_MAX) {
846  frame->crop_left &= ~((1 << (5 + log2_crop_align - min_log2_align)) - 1);
848  if (ret < 0)
849  return ret;
850  }
851  }
852 
853  for (int i = 0; frame->data[i]; i++)
854  frame->data[i] += offsets[i];
855 
856  frame->width -= (frame->crop_left + frame->crop_right);
857  frame->height -= (frame->crop_top + frame->crop_bottom);
858  frame->crop_left = 0;
859  frame->crop_right = 0;
860  frame->crop_top = 0;
861  frame->crop_bottom = 0;
862 
863  return 0;
864 }
av_samples_copy
int av_samples_copy(uint8_t *const *dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Copy samples from src to dst.
Definition: samplefmt.c:222
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
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
get_video_buffer
static int get_video_buffer(AVFrame *frame, int align)
Definition: frame.c:81
av_frame_get_buffer
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition: frame.c:212
ff_ctz
#define ff_ctz
Definition: intmath.h:107
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:693
comp
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
Definition: eamad.c:81
av_frame_new_side_data
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, size_t size)
Add a new side data to a frame.
Definition: frame.c:681
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3313
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
planes
static const struct @475 planes[]
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:70
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
av_frame_make_writable
int av_frame_make_writable(AVFrame *frame)
Ensure that the frame data is writable, avoiding data copy if possible.
Definition: frame.c:586
AVFrameSideData::buf
AVBufferRef * buf
Definition: frame.h:270
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:643
data
const char data[16]
Definition: mxf.c:149
frame_copy_props
static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy)
Definition: frame.c:226
get_audio_buffer
static int get_audio_buffer(AVFrame *frame, int align)
Definition: frame.c:152
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
frame_copy_video
static int frame_copy_video(AVFrame *dst, const AVFrame *src)
Definition: frame.c:702
av_frame_apply_cropping
int av_frame_apply_cropping(AVFrame *frame, int flags)
Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ crop_bottom fields.
Definition: frame.c:794
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3353
ALIGN
#define ALIGN
Definition: frame.c:79
fail
#define fail()
Definition: checkasm.h:193
AV_PIX_FMT_FLAG_HWACCEL
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition: pixdesc.h:128
samplefmt.h
type
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 type
Definition: writing_filters.txt:86
av_image_fill_pointers
int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, uint8_t *ptr, const int linesizes[4])
Fill plane data pointers for an image with pixel format pix_fmt and height height.
Definition: imgutils.c:145
planar
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1<< 16)) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(UINT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out->ch+ch,(const uint8_t **) in->ch+ch, off *(out-> planar
Definition: audioconvert.c:56
AVFrameSideDataType
AVFrameSideDataType
Definition: frame.h:49
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:58
get_frame_defaults
static void get_frame_defaults(AVFrame *frame)
Definition: frame.c:32
avassert.h
AVFrameSideData::size
size_t size
Definition: frame.h:268
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AV_FRAME_CROP_UNALIGNED
@ AV_FRAME_CROP_UNALIGNED
Apply the maximum possible cropping, even if it requires setting the AVFrame.data[] entries to unalig...
Definition: frame.h:1044
av_image_fill_linesizes
int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width)
Fill plane linesizes for an image with pixel format pix_fmt and width width.
Definition: imgutils.c:89
offsets
static const int offsets[]
Definition: hevc_pel.c:34
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
av_sample_fmt_is_planar
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition: samplefmt.c:114
channels
channels
Definition: aptx.h:31
av_frame_clone
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition: frame.c:517
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:618
if
if(ret)
Definition: filter_design.txt:179
frame_copy_audio
static int frame_copy_audio(AVFrame *dst, const AVFrame *src)
Definition: frame.c:725
ff_frame_side_data_add_from_buf
AVFrameSideData * ff_frame_side_data_add_from_buf(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, AVBufferRef *buf)
Definition: side_data.c:171
NULL
#define NULL
Definition: coverity.c:32
sizes
static const int sizes[][2]
Definition: img2dec.c:60
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:633
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
AVComponentDescriptor
Definition: pixdesc.h:30
av_image_fill_plane_sizes
int av_image_fill_plane_sizes(size_t sizes[4], enum AVPixelFormat pix_fmt, int height, const ptrdiff_t linesizes[4])
Fill plane sizes for an image with pixel format pix_fmt and height height.
Definition: imgutils.c:111
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_frame_side_data_remove
void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type from an array.
Definition: side_data.c:100
av_frame_new_side_data_from_buf
AVFrameSideData * av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf)
Add a new side data to a frame from an existing AVBufferRef.
Definition: frame.c:672
av_frame_get_plane_buffer
AVBufferRef * av_frame_get_plane_buffer(const AVFrame *frame, int plane)
Get the buffer reference a given data plane is stored in.
Definition: frame.c:638
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:712
AV_FRAME_DATA_PANSCAN
@ AV_FRAME_DATA_PANSCAN
The data is the AVPanScan struct defined in libavcodec.
Definition: frame.h:53
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:308
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
av_frame_copy
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition: frame.c:745
cpu.h
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
size
int size
Definition: twinvq_data.h:10344
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:411
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AV_PIX_FMT_FLAG_BITSTREAM
#define AV_PIX_FMT_FLAG_BITSTREAM
All values of a component are bit-wise packed end to end.
Definition: pixdesc.h:124
AVFrameSideData::data
uint8_t * data
Definition: frame.h:267
av_frame_is_writable
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:569
AVCHROMA_LOC_UNSPECIFIED
@ AVCHROMA_LOC_UNSPECIFIED
Definition: pixfmt.h:766
frame.h
buffer.h
align
static const uint8_t *BS_FUNC() align(BSCTX *bc)
Skip bits to a byte boundary.
Definition: bitstream_template.h:411
av_frame_remove_side_data
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition: frame.c:759
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:223
av_buffer_alloc
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:77
av_channel_layout_compare
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
Definition: channel_layout.c:809
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
av_frame_side_data_free
void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd)
Free all side data entries and their contents, then zeroes out the values which the pointers are poin...
Definition: side_data.c:131
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
common.h
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_frame_move_ref
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:557
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:530
av_buffer_replace
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition: buffer.c:233
av_samples_get_buffer_size
int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Get the required buffer size for the given audio parameters.
Definition: samplefmt.c:121
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:672
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
av_buffer_is_writable
int av_buffer_is_writable(const AVBufferRef *buf)
Definition: buffer.c:147
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
av_channel_layout_check
int av_channel_layout_check(const AVChannelLayout *channel_layout)
Check whether a channel layout is valid, i.e.
Definition: channel_layout.c:783
side_data.h
dict.h
av_hwframe_transfer_data
int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags)
Copy data to or from a hw surface.
Definition: hwcontext.c:437
av_frame_replace
int av_frame_replace(AVFrame *dst, const AVFrame *src)
Ensure the destination frame refers to the same data described by the source frame,...
Definition: frame.c:407
channel_layout.h
av_image_copy2
static void av_image_copy2(uint8_t *const dst_data[4], const int dst_linesizes[4], uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Wrapper around av_image_copy() to workaround the limitation that the conversion from uint8_t * const ...
Definition: imgutils.h:184
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:442
AVFrameSideData::type
enum AVFrameSideDataType type
Definition: frame.h:266
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:449
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
desc
const char * desc
Definition: libsvtav1.c:79
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:265
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
calc_cropping_offsets
static int calc_cropping_offsets(size_t offsets[4], const AVFrame *frame, const AVPixFmtDescriptor *desc)
Definition: frame.c:764
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:237
av_frame_side_data_get
static const AVFrameSideData * av_frame_side_data_get(AVFrameSideData *const *sd, const int nb_sd, enum AVFrameSideDataType type)
Wrapper around av_frame_side_data_get_c() to workaround the limitation that for any type T the conver...
Definition: frame.h:1193
imgutils.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
hwcontext.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVFrameSideData::metadata
AVDictionary * metadata
Definition: frame.h:269
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
AV_PIX_FMT_FLAG_PAL
#define AV_PIX_FMT_FLAG_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition: pixdesc.h:120
av_hwframe_get_buffer
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
Definition: hwcontext.c:495
src
#define src
Definition: vp8dsp.c:248